From f4aeac71566c740808944d11227ecc35c76d1761 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 17 Apr 2024 19:04:29 -0500 Subject: [PATCH 001/115] Switched development branches and added swap edges algorithm --- .../algorithm/LAGraph_RichClubCoefficient.c | 280 ++++++++++++++++++ experimental/algorithm/LAGraph_SwapEdges.c | 71 +++++ 2 files changed, 351 insertions(+) create mode 100644 experimental/algorithm/LAGraph_RichClubCoefficient.c create mode 100644 experimental/algorithm/LAGraph_SwapEdges.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c new file mode 100644 index 0000000000..38517b0e56 --- /dev/null +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -0,0 +1,280 @@ +//------------------------------------------------------------------------------ +// LAGraph_RichClubCoefficient: rich club coefficients and edge randomization +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +// Get the rich club coefficient of a graph, also allows for edge randomization +// to normalize the coefficients in a graph. + +// Given a Symetric Graph with no self edges, LAGraph_RichClubCoefficient will +// first randomized edges without changing the degree pattern and will then +// calculate the rich club coefficients of the resulting graph. + +// The values will be output as a dense GrB_Vector, the rich club coefficient +// of the kth degree found at entry k. + +// References: + +// Julian J. McAuley, Luciano da Fontoura Costa, and Tibério S. Caetano, “The +// rich-club phenomenon across complex network hierarchies”, Applied Physics +// Letters Vol 91 Issue 8, August 2007. https://arxiv.org/abs/physics/0701290 + +// R. Milo, N. Kashtan, S. Itzkovitz, M. E. J. Newman, U. Alon, “Uniform +// generation of random graphs with arbitrary degree sequences”, 2006. +// https://arxiv.org/abs/cond-mat/0312028 + +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + GrB_free (&edge_degrees) ; \ + GrB_free (&D) ; \ + GrB_free (°rees) ; \ + GrB_free (&edge_gt_deg) ; \ + GrB_free (&edge_eq_deg) ; \ + GrB_free (&cumulative_deg) ; \ + GrB_free (&edges_per_deg) ; \ + GrB_free (&two_one) ; \ +} + +#define LG_FREE_ALL \ +{ \ + /* free any workspace used here */ \ + LG_FREE_WORK ; \ + /* free all the output variable(s) */ \ + GrB_free (rich_club_coefficents) ; \ + /* take any other corrective action */ \ +} + +#include "LG_internal.h" +#include "LAGraphX.h" + +//taken from LAGraph_BF_full_mxv +//Is this best way to do this? +typedef void (*LAGraph_binary_function) (void *, const void *, const void *) ; + +//TODO: Add macro for string +#define TWO_ONE_ADD \ + "void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ + "{" \ + "(*z) = 2 * (*x) + (*y) ;" \ + "}" +//I am hoping this gets done in a single leaq. +void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y) +{ + (*z) = 2 * (*x) + (*y); +} + +#define RICH_CLUB_FORMULA \ + "void rich_club_formula(double *z, const uint64_t *x, const uint64_t *y)" \ + "{" \ + "(*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ;" \ + "}" +//Look out for ones +void rich_club_formula(double *z, const uint64_t *x, const uint64_t *y) +{ + (*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ; +} + +int LAGraph_RichClubCoefficient +( + // output: + //rich_club_coefficents(i): rich club coefficents of i + GrB_Vector *rich_club_coefficents, + + // input: + LAGraph_Graph G, //input graph + char *msg +) +{ + + //-------------------------------------------------------------------------- + // Declorations + //-------------------------------------------------------------------------- + LG_CLEAR_MSG ; + //Matrix containing every edge + //With an entry cooresponding to the degree of its column + GrB_Matrix edge_degrees = NULL; + + //A matrix with diagonal entries corresponding to degrees. + GrB_Matrix D = NULL; + + //degrees of nodes. + GrB_Vector degrees = NULL; + + //contains the number of edges for which the ith node is + //the smallest degree node in the pair + GrB_Vector edge_gt_deg = NULL; + + //contains the number of edges for which the ith node is + //the same degree as the other node in the pair + //used to correct for undercounted nodes + GrB_Vector edge_eq_deg = NULL; + + //Combines edge_gt_deg and edge_eq_deg to + // account for double counting in edge_eq_deg + GrB_Vector edge_adjusted_deg = NULL; + + // the ith entry contains the number of edges whos lowest degree is i. + GrB_Vector edges_per_deg = NULL; + + //the ith entry contains the number of nodes with degree greter than i. + GrB_Vector cumulative_deg = NULL; + + //the ith entry contains the number of edges among + // nodes with degree greater than i. + GrB_Vector cumulative_edges = NULL; + + // 2x+y + GrB_BinaryOp two_one = NULL; + // 2E_K / (N_k (N_k -1)) + GrB_BinaryOp rcCalculation = NULL; + + GrB_Matrix A ; // G->A, the adjacency matrix + GrB_Index n ; + GrB_Index vi_size ; + GrB_Index vx_size ; + GrB_Index edge_vec_nvals; + GrB_Index deg_vec_size; + bool iso = false; + + //TODO: YOU STILL HAVE TO GRBFREE THIS WITH A LOOP? + //Should the arrays be initialized before fed to the function? + GrB_Index *index_edge = NULL; // does this need to be null to start with? + + //TODO: check if this is void or GrB_UINT64 + uint64_t *edge_count_per_node = NULL, *deg_arr = NULL, + *edges_per_deg_arr = NULL, *cumul_array = NULL; + + + + //TODO: YOU STILL HAVE TO GRBFREE THIS WITH A LOOP? + GrB_Index **index_degree = NULL; // does this need to be null to start with? + void **degree_array = NULL; + + + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + LG_TRY (LAGraph_CheckGraph (G, msg)) ; + LG_ASSERT (rich_club_coefficents != NULL, GrB_NULL_POINTER); + + //TODO: double check this + LG_ASSERT_MSG( + G->kind == LAGraph_ADJACENCY_UNDIRECTED, GrB_INVALID_VALUE, + "G->A must be symmetric") ; + LG_ASSERT_MSG (G->out_degree != NULL, GrB_EMPTY_OBJECT, + "G->out_degree must be defined") ; + LG_ASSERT_MSG (G->nself_edges == 0, GrB_INVALID_VALUE, + "G->nself_edges must be zero") ; + + //-------------------------------------------------------------------------- + // Initializations + //-------------------------------------------------------------------------- + A = G->A ; + GRB_TRY(GrB_Matrix_nrows (&n, A)) ; + GRB_TRY(GrB_Matrix_new(&edge_degrees, GrB_UINT64,n,n)) ; + GRB_TRY(GrB_Vector_new(°rees, GrB_UINT64, n)) ; + GRB_TRY(GrB_Vector_new(&edge_gt_deg, GrB_UINT64, n)) ; + GRB_TRY(GrB_Vector_new(&edge_eq_deg, GrB_UINT64, n)) ; + GRB_TRY(GrB_Vector_new(&cumulative_deg, GrB_UINT64, n)) ; + GRB_TRY(GrB_Vector_new(&edges_per_deg, GrB_UINT64, n)) ; + + GRB_TRY(GxB_BinaryOp_new( + &two_one, (LAGraph_binary_function) (&two_one_add), + GrB_UINT64, GrB_UINT64, GrB_UINT64, "two_one_add", TWO_ONE_ADD)) ; + GRB_TRY(GxB_BinaryOp_new( + &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), + GrB_UINT64, GrB_UINT64, GrB_UINT64, + "rich_club_formula", RICH_CLUB_FORMULA)) ; + + // code from LAGraph_MaximalIndependentSet + // degrees = G->out_degree (check if this is needed) (I think no) + GRB_TRY (GrB_assign( + degrees, NULL, NULL, G->out_degree, GrB_ALL, n, NULL)) ; + + GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; + + //Assigns each edge in the graph the value of their column node + //TODO: IDK what the descriptor is + GRB_TRY (GrB_mxm( + edge_degrees, NULL, NULL, GxB_ANY_SECOND_UINT64,A,D,GrB_DESC_T1)) ; + + //Adds up all the edges whose rows degrees are greater than their column degrees + GRB_TRY(GrB_vxm( + edge_gt_deg, NULL, NULL, GxB_PLUS_ISGT_UINT64, + degrees, edge_degrees, GrB_DESC_T1)) ; + + //Adds up all the edges whose rows degrees are greater than their column degrees + //Double check that this can return zeros and not just novals + GRB_TRY(GrB_vxm( + edge_eq_deg, NULL, NULL, GxB_PLUS_ISEQ_UINT64, + degrees, edge_degrees, GrB_DESC_T1)) ; + + // edge_eq_deg and edge_gt_deg have same non zero pattern + GRB_TRY(GrB_eWiseMult( + edge_adjusted_deg, NULL, NULL, two_one, + edge_eq_deg, edge_gt_deg, GrB_DESC_T1)); + + GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, edge_adjusted_deg)); + vi_size = (edge_vec_nvals+1)*sizeof(GrB_Index); + vx_size = (edge_vec_nvals+1)*sizeof(GrB_UINT64); + + GRB_TRY(GxB_Vector_unpack_CSC( + edge_adjusted_deg, &index_edge, (void **) &edge_count_per_node, + &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_DESC_T1)); + LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + + GRB_TRY(GxB_Vector_unpack_CSC( + degrees, &index_edge, (void **) °_arr, + &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_DESC_T1)); + + LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + //Build with degrees as indecies and handle duplicates via adition + GRB_TRY(GrB_Vector_build ( + edges_per_deg, deg_arr, edge_count_per_node, n, GrB_PLUS_INT64)) ; + GRB_TRY(GxB_Vector_unpack_CSC( + edges_per_deg, &index_edge, edges_per_deg_arr, + &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_DESC_T1)); + + //run a cummulative sum (backwards) on edges_per_deg_arr + // for loops + + for(uint64_t i = edge_vec_nvals; i > 1; i--) + { + edges_per_deg_arr[i-1]+=edges_per_deg_arr[i]; + } + + + //Construct a vector thats has edges_per_deg_arr values but repeated whenever + //index_edge has a skip and put into cumulative edges + // ie. [0,1,6,7,10] & [9,7,3,2,0] -> + // [9,7,7,7,7,7,3,2,2,2,0, . . .] + + uint64_t index = 0 ; + LAGraph_Malloc((void **) &cumul_array, n, sizeof(uint64_t), msg) ; + + for(uint64_t i = 0; i < n; i++) + { + edges_per_deg_arr[index] ; + + if(index < edge_vec_nvals && i == index_edge[index]) + index++ ; + } + + //GrB select or just do an if test + LG_FREE_WORK ; + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c new file mode 100644 index 0000000000..1a72031487 --- /dev/null +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// LAGraph_SwapEdges: Randomly Swaps edges in a graph +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + + +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + GrB_free (&W) ; \ +} + +#define LG_FREE_ALL \ +{ \ + /* free any workspace used here */ \ + LG_FREE_WORK ; \ + /* free all the output variable(s) */ \ + GrB_free (&Y) ; \ + /* take any other corrective action */ \ +} + +#include "LG_internal.h" +#include "LAGraphX.h" + +int LAGraph_HelloWorld // a simple algorithm, just for illustration +( + // output + + // input: not modified + LAGraph_Graph G, + char *msg +) +{ + //-------------------------------------------------------------------------- + // Declorations + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + + // Extract adjacency matrix to make incidence matrix - E + + // While less than nvals*swapsperedge swaps have happened + // Pair edges into M1 and M2 matricies (HOW?) + // M <-- M1 + M2 + // Get MT + // remove and entries of M with less than 3 values + // Swap interference <-- MT plus_one M + // Extract >=2 masking the diagonal + // stop any swaps with a row in Swap interference w/ degree > 1 + // do remaining swaps. (HOW?) + // update E + + + LG_FREE_WORK ; + (*Yhandle) = Y ; + return (GrB_SUCCESS) ; +} From b0db5d49aa1844d57ba432e9cc5d14c68eb6eb9b Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 16 May 2024 12:14:43 -0500 Subject: [PATCH 002/115] Modiffied RCC and added detailed pseudocode for SwapEdges --- .../algorithm/LAGraph_RichClubCoefficient.c | 111 ++++++++++++------ experimental/algorithm/LAGraph_SwapEdges.c | 74 ++++++++++-- 2 files changed, 136 insertions(+), 49 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 38517b0e56..d87a7a863f 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -43,9 +43,12 @@ GrB_free (°rees) ; \ GrB_free (&edge_gt_deg) ; \ GrB_free (&edge_eq_deg) ; \ + GrB_free (&edge_adjusted_deg) ; \ GrB_free (&cumulative_deg) ; \ GrB_free (&edges_per_deg) ; \ + GrB_free (&cumulative_edges) ; \ GrB_free (&two_one) ; \ + GrB_free (&rcCalculation) ; \ } #define LG_FREE_ALL \ @@ -61,16 +64,13 @@ #include "LAGraphX.h" //taken from LAGraph_BF_full_mxv -//Is this best way to do this? typedef void (*LAGraph_binary_function) (void *, const void *, const void *) ; -//TODO: Add macro for string #define TWO_ONE_ADD \ "void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ "{" \ "(*z) = 2 * (*x) + (*y) ;" \ "}" -//I am hoping this gets done in a single leaq. void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y) { (*z) = 2 * (*x) + (*y); @@ -98,7 +98,7 @@ int LAGraph_RichClubCoefficient char *msg ) { - + return (GrB_NOT_IMPLEMENTED) ; //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- @@ -126,18 +126,19 @@ int LAGraph_RichClubCoefficient // account for double counting in edge_eq_deg GrB_Vector edge_adjusted_deg = NULL; + //the ith entry contains the number of nodes with degree greater than i. + GrB_Vector cumulative_deg = NULL; + // the ith entry contains the number of edges whos lowest degree is i. GrB_Vector edges_per_deg = NULL; - //the ith entry contains the number of nodes with degree greter than i. - GrB_Vector cumulative_deg = NULL; - - //the ith entry contains the number of edges among + //the ith entry contains twice the number of edges among // nodes with degree greater than i. GrB_Vector cumulative_edges = NULL; // 2x+y GrB_BinaryOp two_one = NULL; + // 2E_K / (N_k (N_k -1)) GrB_BinaryOp rcCalculation = NULL; @@ -153,11 +154,9 @@ int LAGraph_RichClubCoefficient //Should the arrays be initialized before fed to the function? GrB_Index *index_edge = NULL; // does this need to be null to start with? - //TODO: check if this is void or GrB_UINT64 uint64_t *edge_count_per_node = NULL, *deg_arr = NULL, - *edges_per_deg_arr = NULL, *cumul_array = NULL; - - + *edges_per_deg_arr = NULL, *cumul_array = NULL, *ones = NULL, + *ramp = NULL; //TODO: YOU STILL HAVE TO GRBFREE THIS WITH A LOOP? GrB_Index **index_degree = NULL; // does this need to be null to start with? @@ -185,6 +184,7 @@ int LAGraph_RichClubCoefficient //-------------------------------------------------------------------------- A = G->A ; GRB_TRY(GrB_Matrix_nrows (&n, A)) ; + GRB_TRY(GrB_Matrix_new(&D, GrB_UINT64, n, n)) GRB_TRY(GrB_Matrix_new(&edge_degrees, GrB_UINT64,n,n)) ; GRB_TRY(GrB_Vector_new(°rees, GrB_UINT64, n)) ; GRB_TRY(GrB_Vector_new(&edge_gt_deg, GrB_UINT64, n)) ; @@ -200,33 +200,56 @@ int LAGraph_RichClubCoefficient GrB_UINT64, GrB_UINT64, GrB_UINT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; - // code from LAGraph_MaximalIndependentSet - // degrees = G->out_degree (check if this is needed) (I think no) + // degrees = G->out_degree GRB_TRY (GrB_assign( degrees, NULL, NULL, G->out_degree, GrB_ALL, n, NULL)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; - //Assigns each edge in the graph the value of their column node - //TODO: IDK what the descriptor is + // Each edge in the graph gets the value of the degree of its column node GRB_TRY (GrB_mxm( - edge_degrees, NULL, NULL, GxB_ANY_SECOND_UINT64,A,D,GrB_DESC_T1)) ; + edge_degrees, NULL, NULL, GxB_ANY_SECOND_UINT64,A,D, GrB_NULL)) ; - //Adds up all the edges whose rows degrees are greater than their column degrees + // QUESTION: Mentioned GxB would be slower than JIT correct? + + // Counts the edges for which its row node is the node of smallest degree. + // Simply, this edge would be removed from the graph once this node + // is of degree < k. GRB_TRY(GrB_vxm( - edge_gt_deg, NULL, NULL, GxB_PLUS_ISGT_UINT64, - degrees, edge_degrees, GrB_DESC_T1)) ; + edge_gt_deg, NULL, NULL, GxB_PLUS_ISLT_UINT64, + degrees, edge_degrees, GrB_NULL)) ; - //Adds up all the edges whose rows degrees are greater than their column degrees - //Double check that this can return zeros and not just novals + // Counts the edges for which its row node and col nodes have equal degree. + // Simply, this edge would be removed from the graph once this node + // is of degree < k. GRB_TRY(GrB_vxm( edge_eq_deg, NULL, NULL, GxB_PLUS_ISEQ_UINT64, - degrees, edge_degrees, GrB_DESC_T1)) ; + degrees, edge_degrees, GrB_NULL)) ; + + + // QUESTION: Is JIT faster or should I use accum as seen below? + + // If the nodes of an edge have different degrees, the edge is counted once. + // If they have the same degree, that edge is double counted. So, we adjust: + // edge_adjusted_deg = 2 * edge_gt_deg + edge_eq_deg - // edge_eq_deg and edge_gt_deg have same non zero pattern GRB_TRY(GrB_eWiseMult( edge_adjusted_deg, NULL, NULL, two_one, - edge_eq_deg, edge_gt_deg, GrB_DESC_T1)); + edge_gt_deg, edge_eq_deg, GrB_NULL)); + + /* + // Actually why not do this, and skip an operation? + + GRB_TRY(GrB_vxm( + edge_gt_deg, NULL, NULL, GxB_PLUS_ISLT_UINT64, + degrees, edge_degrees, GrB_NULL)) ; + GRB_TRY(GrB_vxm( + edge_gt_deg, NULL, two_one_add, GxB_PLUS_ISEQ_UINT64, + degrees, edge_degrees, GrB_NULL)) ; + + // --- Okay well at that point why not just do it all in one multiply? --- + // with this semiring [+].[(x == y) + 2 * (x < y)] + */ GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, edge_adjusted_deg)); vi_size = (edge_vec_nvals+1)*sizeof(GrB_Index); @@ -234,45 +257,57 @@ int LAGraph_RichClubCoefficient GRB_TRY(GxB_Vector_unpack_CSC( edge_adjusted_deg, &index_edge, (void **) &edge_count_per_node, - &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_DESC_T1)); + &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)); LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; GRB_TRY(GxB_Vector_unpack_CSC( degrees, &index_edge, (void **) °_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_DESC_T1)); + &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)); LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + //Build with degrees as indecies and handle duplicates via adition GRB_TRY(GrB_Vector_build ( edges_per_deg, deg_arr, edge_count_per_node, n, GrB_PLUS_INT64)) ; + + // Start ones. Do I do this by building an iso vector? or by myself? + // QUESTION: I want to do the following. I should duplicate deg_arr memory correct? + GRB_TRY(GrB_Vector_build ( + cumulative_deg, deg_arr, ones, n, GrB_PLUS_INT64)) ; GRB_TRY(GxB_Vector_unpack_CSC( - edges_per_deg, &index_edge, edges_per_deg_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_DESC_T1)); + edges_per_deg, &index_edge, &edges_per_deg_arr, + &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, GrB_NULL)); //run a cummulative sum (backwards) on edges_per_deg_arr // for loops - for(uint64_t i = edge_vec_nvals; i > 1; i--) { edges_per_deg_arr[i-1]+=edges_per_deg_arr[i]; } - - //Construct a vector thats has edges_per_deg_arr values but repeated whenever //index_edge has a skip and put into cumulative edges // ie. [0,1,6,7,10] & [9,7,3,2,0] -> - // [9,7,7,7,7,7,3,2,2,2,0, . . .] + // [9,7,7,7,7,7,3,2,2,2, . . .] - uint64_t index = 0 ; + uint64_t index = 0, i = 0; LAGraph_Malloc((void **) &cumul_array, n, sizeof(uint64_t), msg) ; - for(uint64_t i = 0; i < n; i++) + for(; i < n; i++) // seems easily parrallelizable but idk if #pragma is enough. { - edges_per_deg_arr[index] ; - - if(index < edge_vec_nvals && i == index_edge[index]) + cumul_array[i] = edges_per_deg_arr[index]; + if(i == index_edge[index]) + { index++ ; + if(index == edge_vec_nvals || edges_per_deg_arr[index] == 0) + break ; + } } + // QUESTION: should this be i - 1? Do I build ramp in the forloop above? + GRB_TRY(GrB_Vector_build( + cumulative_edges, ramp, cumul_array, i, NULL + )) ; + + //GrB select or just do an if test LG_FREE_WORK ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 1a72031487..ca3fcdd145 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -19,7 +19,6 @@ #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ - GrB_free (&W) ; \ } #define LG_FREE_ALL \ @@ -27,7 +26,6 @@ /* free any workspace used here */ \ LG_FREE_WORK ; \ /* free all the output variable(s) */ \ - GrB_free (&Y) ; \ /* take any other corrective action */ \ } @@ -43,6 +41,7 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration char *msg ) { + return (GrB_NOT_IMPLEMENTED) ; //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- @@ -54,18 +53,71 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // Extract adjacency matrix to make incidence matrix - E // While less than nvals*swapsperedge swaps have happened - // Pair edges into M1 and M2 matricies (HOW?) - // M <-- M1 + M2 - // Get MT + + // Coming into the loop I want E to be the incidence matrix of the new + // graph. W/o self edges nor parallel edges. Each row must have + // exactly one 0 and one 1. They do not have to be randomly assigned. + + // Pair edges. Take a random permutation and pair adjacent values. + // pairs wants: + // rows: [0, 0, 1, 1, 2, 2, 3, 3, . . .] (ramp / 2) + // cols: [ random permutation 1 - nvals] (LAGraph_Random_Seed + sort) + // vals: [0, 3, 0, 2, 0, 2, 0, 3, . . .] + // Start with [0, 2, 0, 2, 0, 2, . . .] + // for i from 1 to nvals by 2s: + // vals[i] += vals[i] > vals[i-1] + // CAUTION cols is likely smaller. Manage memory correctly. + + // each row of M will have 4 values [0,1,2,3] + // pairs | E | M + // 0 | 0,1 | 0,1 + // 2 | 0,1 | 2,3 + // 3 | 0,1 | 3,2 + // This gives us randomization as to which type of swap is happening. + // M = pairs * E (any_bitwisexor) + // remove and entries of M with less than 3 values - // Swap interference <-- MT plus_one M - // Extract >=2 masking the diagonal - // stop any swaps with a row in Swap interference w/ degree > 1 - // do remaining swaps. (HOW?) - // update E + + // probably worth it to put 0s on the interf diagonal to make the + // following vector dense. + // interf = MT * M (plus_one) + // reduce interf to a vector on rows + // r_interf = interf * denseVec (max_first) + // d_interf = diagonalize r_interf + + // set 3rd bit to 1 if it must be removed. + // An accumulator might work better. + // M = d_interf * M (any_[z = 4 * (x > 2) | y]) + // M = extract M (x & 4 == 0) + + // M1 = extract M (x & 2 == 0) + // M2 = extract M (x & 2 != 0) + // Check if an edge already exists in the graph. + // If a row of M1 or M2 has more than 1 vertex in common with a + // row of E, the value of that entry in the exists array will be 0. + // Otherwise, 1 or noval. + // exists = E * M1T (zero_one) + // exists += E * M2T (zero_one) (accum is one if theres an intersection) + + // 0 if intended swap already exists in the matrix, 1 or noval otherwise + // r_exists = denseVec * exists (bitwiseAnd_second) + // QUESTION: how to remove r_exists zeros from M matrix? + + // Compute S. note we could do ST if its better. + // pairs | M | S + // 0 | 0,1 | 0,1 + // 2 / 3 | 0,1 | 2,3 + // 0 | 2,3 | 2,3 + // 2 / 3 | 2,3 | 0,1 + // S = pairsT * M (any_[z = (x & 2) ^ y]) + // S = extract S (x & 2 == 0) + + // If S has a row, Remove it from E and replace with the row from S + // QUESTION + + // update E and possibly ET LG_FREE_WORK ; - (*Yhandle) = Y ; return (GrB_SUCCESS) ; } From 8ae4ff95be4d01047c71ce4d522d76f51e4467e0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 21 May 2024 17:43:01 -0500 Subject: [PATCH 003/115] Added alot of code to SwapEdges.c. Does not compile. --- .../algorithm/LAGraph_RichClubCoefficient.c | 51 ++-- experimental/algorithm/LAGraph_SwapEdges.c | 269 ++++++++++++++++-- experimental/utility/LAGraph_MaskColRow.c | 79 +++++ 3 files changed, 354 insertions(+), 45 deletions(-) create mode 100644 experimental/utility/LAGraph_MaskColRow.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index d87a7a863f..44c3ca47fa 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -76,6 +76,16 @@ void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y) (*z) = 2 * (*x) + (*y); } +#define ISEQ_2ISLT \ + "void iseq_2islt(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ + "{" \ + "(*z) = (*x < *y) + (*x <= *y) ;" \ + "}" +void iseq_2islt(uint64_t *z, const uint64_t *x, const uint64_t *y) +{ + (*z) = (uint64_t)((*x < *y) + (*x <= *y)) ; +} + #define RICH_CLUB_FORMULA \ "void rich_club_formula(double *z, const uint64_t *x, const uint64_t *y)" \ "{" \ @@ -139,6 +149,12 @@ int LAGraph_RichClubCoefficient // 2x+y GrB_BinaryOp two_one = NULL; + // 2 * (x > y) + (x == y) + GrB_BinaryOp iseq_2lt = NULL; + + // [+].[iseq_2lt] + GrB_Semiring plus_2le; + // 2E_K / (N_k (N_k -1)) GrB_BinaryOp rcCalculation = NULL; @@ -177,7 +193,7 @@ int LAGraph_RichClubCoefficient LG_ASSERT_MSG (G->out_degree != NULL, GrB_EMPTY_OBJECT, "G->out_degree must be defined") ; LG_ASSERT_MSG (G->nself_edges == 0, GrB_INVALID_VALUE, - "G->nself_edges must be zero") ; + "G->nself_edges must be zero") ; // Probably overkill //-------------------------------------------------------------------------- // Initializations @@ -195,11 +211,14 @@ int LAGraph_RichClubCoefficient GRB_TRY(GxB_BinaryOp_new( &two_one, (LAGraph_binary_function) (&two_one_add), GrB_UINT64, GrB_UINT64, GrB_UINT64, "two_one_add", TWO_ONE_ADD)) ; + GRB_TRY(GxB_BinaryOp_new( + &iseq_2lt, (LAGraph_binary_function) (&iseq_2islt), + GrB_UINT64, GrB_UINT64, GrB_UINT64, "iseq_2islt", ISEQ_2ISLT)) ; + GRB_TRY(GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_UINT64, iseq_2lt)) ; GRB_TRY(GxB_BinaryOp_new( &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), GrB_UINT64, GrB_UINT64, GrB_UINT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; - // degrees = G->out_degree GRB_TRY (GrB_assign( degrees, NULL, NULL, G->out_degree, GrB_ALL, n, NULL)) ; @@ -209,7 +228,7 @@ int LAGraph_RichClubCoefficient // Each edge in the graph gets the value of the degree of its column node GRB_TRY (GrB_mxm( edge_degrees, NULL, NULL, GxB_ANY_SECOND_UINT64,A,D, GrB_NULL)) ; - + /* // QUESTION: Mentioned GxB would be slower than JIT correct? // Counts the edges for which its row node is the node of smallest degree. @@ -236,21 +255,15 @@ int LAGraph_RichClubCoefficient GRB_TRY(GrB_eWiseMult( edge_adjusted_deg, NULL, NULL, two_one, edge_gt_deg, edge_eq_deg, GrB_NULL)); + */ - /* - // Actually why not do this, and skip an operation? - - GRB_TRY(GrB_vxm( - edge_gt_deg, NULL, NULL, GxB_PLUS_ISLT_UINT64, - degrees, edge_degrees, GrB_NULL)) ; + // If the nodes of an edge have different degrees, the edge is counted once. + // If they have the same degree, that edge is double counted. So, we adjust: + // edge_adjusted_deg = 2 * (x > y) + (x == y) GRB_TRY(GrB_vxm( - edge_gt_deg, NULL, two_one_add, GxB_PLUS_ISEQ_UINT64, + edge_gt_deg, NULL, NULL, plus_2le, degrees, edge_degrees, GrB_NULL)) ; - // --- Okay well at that point why not just do it all in one multiply? --- - // with this semiring [+].[(x == y) + 2 * (x < y)] - */ - GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, edge_adjusted_deg)); vi_size = (edge_vec_nvals+1)*sizeof(GrB_Index); vx_size = (edge_vec_nvals+1)*sizeof(GrB_UINT64); @@ -258,7 +271,7 @@ int LAGraph_RichClubCoefficient GRB_TRY(GxB_Vector_unpack_CSC( edge_adjusted_deg, &index_edge, (void **) &edge_count_per_node, &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)); - LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + LG_TRY (LAGraph_Free((void **)&index_edge, NULL)) ; GRB_TRY(GxB_Vector_unpack_CSC( degrees, &index_edge, (void **) °_arr, @@ -290,7 +303,7 @@ int LAGraph_RichClubCoefficient // [9,7,7,7,7,7,3,2,2,2, . . .] uint64_t index = 0, i = 0; - LAGraph_Malloc((void **) &cumul_array, n, sizeof(uint64_t), msg) ; + LG_TRY (LAGraph_Malloc((void **) &cumul_array, n, sizeof(uint64_t), msg)) ; for(; i < n; i++) // seems easily parrallelizable but idk if #pragma is enough. { @@ -302,9 +315,9 @@ int LAGraph_RichClubCoefficient break ; } } - // QUESTION: should this be i - 1? Do I build ramp in the forloop above? - GRB_TRY(GrB_Vector_build( - cumulative_edges, ramp, cumul_array, i, NULL + // QUESTION: + GRB_TRY(GxB_Vector_pack_Full( + cumulative_edges, cumul_array, n * sizeof(uint64_t), false, NULL )) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index ca3fcdd145..447a949298 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -35,9 +35,10 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration ( // output - + GrB_Matrix *A_new, // input: not modified LAGraph_Graph G, + GrB_Index Q, // Swaps per edge char *msg ) { @@ -45,18 +46,197 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- + GrB_Matrix A = NULL; // nxn Adjacency Matrix + GrB_Matrix E = NULL; // nxe Incidence Matrix + //GrB_Matrix E_t = NULL; // Incidence Transposed + GrB_Matrix E_selected = NULL; // E - rows to be replaced + + // Selected pairs for next batch of swaps + // Each row? contains 2 entries for the edges involved in a swap. + GrB_Matrix pairs = NULL; + + // Each row? contains 4 or less entries corresponding to the verticies + // that are involved in the swap. + GrB_Matrix M = NULL; + GrB_Matrix M_t = NULL; + GrB_Matrix M_outdiag = NULL; + + // Interference Matrix any entry is the number of verticies the swap on its + // row and column share. Any entry with 2 or more could cause interference. + GrB_Matrix interf = NULL; + + GrB_Matrix M_1 = NULL; // M_1 + M_2 = M + GrB_Matrix M_2 = NULL; // M_1 + M_2 = M + + // Diagonalized version of the reduced interference matrix + GrB_Matrix d_interf = NULL; + + // Has a 2 in a certain row if the planned swap already exists in the matrix + GrB_Matrix exists = NULL; + + // New edges after swap, positioned to replace edges in E + GrB_Matrix S = NULL; + + GrB_Index n, e, nvals; + + // Copied vars from LAGraph_Incidence_Matrix + GrB_Matrix E_half = NULL ; + GrB_Matrix A_tril = NULL ; + + // random vector + GrB_Vector random_v = NULL, r_permute = NULL, r_sorted = NULL; + + GrB_Index *row_indices = NULL ; + GrB_Index *col_indices = NULL ; + void *values = NULL ; + // This ramp will likely get recycled a few times. + GrB_Vector ramp_v = NULL; + GrB_Vector hramp_v = NULL; + GrB_Index *ramp = NULL ; + GrB_Index *half_ramp = NULL ; + + // Arrays to unpack edge permutation + GrB_Index *edge_perm = NULL ; + u_char *swap_type = NULL ; + bool iso = false; + + // Reduced Vectors + GrB_Vector M_outdeg = NULL, r_interf = NULL, r_exists = NULL; + + // x = zeros (swaps_per_loop,1) + GrB_Vector x = NULL; + + // Number of values removed in each phase + GrB_Index n_4degree, n_interf, n_exist; + //-------------------------------------------------------------------------- - // Check inputs + // Check inputs TODO //-------------------------------------------------------------------------- + + + //-------------------------------------------------------------------------- + // Initializations + //-------------------------------------------------------------------------- + + A = G->A ; + + char typename[LAGRAPH_MAX_NAME_LEN] ; + GrB_Type type ; + LG_TRY (LAGraph_Matrix_TypeName (typename, A, msg)) ; + LG_TRY (LAGraph_TypeFromName (&type, typename, msg)) ; + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; + GRB_TRY (GrB_Matrix_nvals(&nvals, A)) ; + e = nvals / 2 ; + GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, n, e)) ; + GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, n, e)) ; + GRB_TRY (GrB_Matrix_new (&A_tril, type, n, n)) ; + GRB_TRY (GrB_Matrix_new(&E_selected, GrB_UINT8, n, e)) ; + + GrB_Index num_swaps = 0, num_attempts = 0 ; + // QUESTION: Should this decrease if edges don't want to swap? + GrB_Index swaps_per_loop = e / 3 ; // 1/3 reasonable? + + GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, e, swaps_per_loop)) ; + GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, n, swaps_per_loop)) ; + + + GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, n)) ; + GRB_TRY (GrB_Vector_new (&x, GrB_INT64, swaps_per_loop)) ; + // Extract adjacency matrix to make incidence matrix - E + // get just the lower triangular entries + GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; + // Arrays to extract A into + LG_TRY (LAGraph_Malloc ((void**)(&row_indices), e, sizeof(GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void**)(&col_indices), e, sizeof(GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void**)(&values), e, sizeof(type), msg)) ; + GRB_TRY ( + GrB_Matrix_extractTuples (row_indices, col_indices, values, &e, A_tril) + ) ; + + /* LG_TRY (LAGraph_Malloc ((void**)(&ramp), e, sizeof(GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void**)(&half_ramp), e, sizeof(GrB_Index), msg)) ; + + + #pragma omp parallel for + for (GrB_Index i = 0 ; i < e ; i++) + { + ramp[i] = i ; + } + + #pragma omp parallel for + for (GrB_Index i = 0 ; i < swaps_per_loop * 2 ; i++) + { + half_ramp[i] = i / 2; + } */ + + GrB_Scalar zero8 ; + GrB_Scalar one8 ; + GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; + GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; + GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; + GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; + GRB_TRY (GxB_Matrix_build_Scalar (E_half, col_indices, ramp, zero8, e)) ; + GRB_TRY (GxB_Matrix_build_Scalar (E, row_indices, ramp, one8, e)) ; + + // I'd like to be able to pass in a NULL addition opperator and get an error + // if it has to be used + GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_INT8, E, E_half, NULL)) ; - // While less than nvals*swapsperedge swaps have happened + // Initialize random vector + /* GrB_Scalar zero64; + GRB_TRY (GrB_Scalar_new (&zero64, GrB_UINT8)) ; + + //value irrelevant + GRB_TRY (GrB_Scalar_setElement_UINT64 (zero64, 0)) ; + // QUESTION: Should this be GxB_Vector_pack?? + GRB_TRY ( + GxB_Vector_build_Scalar(random_v, ramp, zero64, e)); */ + // TODO check this + uint8_t zero_8 = 0; + + // QUESTION: diffrence? which is better? + /* GRB_TRY(GxB_Vector_pack_Full( + random_v, &zero_8, sizeof(uint8_t), true, NULL + )) ; */ + GRB_TRY (GrB_assign (x, NULL, NULL, 0, GrB_ALL, swaps_per_loop, NULL)) ; + GRB_TRY (GrB_assign (random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + GRB_TRY (GrB_Vector_apply_IndexOp_INT64 (ramp_v, NULL, NULL, + GrB_ROWINDEX_INT64, random_v, 1, NULL)) ; + GRB_TRY (GrB_Vector_apply (half_ramp, NULL, NULL, half, ramp_v, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full ( + ramp_v, ramp, e * sizeof(GrB_Index), NULL, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full ( + hramp_v, half_ramp, e * sizeof(GrB_Index), NULL, NULL)) ; + + //TODO Change seed + LG_TRY( + LAGraph_Random_Seed(random_v, 15489451345495616ul, msg)); + + while(num_swaps < e * Q && num_attempts < e * Q * 5) + { + // Coming into the loop: + // E must be the incidence matrix of the new graph. W/o self edges nor + // parallel edges. Each row must have exactly one 0 and one 1. + // They do not have to be randomly assigned. + // random_v has a radom dense vector. + GRB_TRY (GxB_Vector_sort ( + r_sorted, r_permute, GrB_LT_UINT64, random_v, GrB_NULL + )) ; + //GrB_Vector_apply(r_sorted, NULL, NULL, GrB_UnaryOp, r_sorted, GrB_DESC_R) ; + // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap + // Also + GRB_TRY (GxB_Vector_unpack_Full( + r_permute, edge_perm, e * sizeof(GrB_Index), iso, GrB_NULL + )) ; - // Coming into the loop I want E to be the incidence matrix of the new - // graph. W/o self edges nor parallel edges. Each row must have - // exactly one 0 and one 1. They do not have to be randomly assigned. // Pair edges. Take a random permutation and pair adjacent values. // pairs wants: @@ -66,7 +246,12 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // Start with [0, 2, 0, 2, 0, 2, . . .] // for i from 1 to nvals by 2s: // vals[i] += vals[i] > vals[i-1] - // CAUTION cols is likely smaller. Manage memory correctly. + // I know it will be alot less safe but is it more efficient to pack + // pairs as needed? Doubt it. + GRB_TRY (GrB_Matrix_build_UINT8( + pairs, edge_perm, half_ramp, vals, swaps_per_loop, GrB_NULL + )) ; + // each row of M will have 4 values [0,1,2,3] // pairs | E | M @@ -74,34 +259,66 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // 2 | 0,1 | 2,3 // 3 | 0,1 | 3,2 // This gives us randomization as to which type of swap is happening. - // M = pairs * E (any_bitwisexor) + // M = E * pairs (any_bxor) + GRB_TRY (GrB_mxm(M, NULL, NULL, GxB_ANY_LXOR_INT8, E, pairs, NULL)) ; + // remove any entries of M with less than 3 values + // This is taken from LAGraph_Cached_OutDegree. + + + GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_int64, + M, x, NULL)) ; + + // QUESTION: Is the following method correct? Do I need a new M with the + // correct dimension? + GRB_TRY (GrB_Vector_select_UINT8( + M_outdeg, NULL, NULL, GrB_EQ_INT8, M_outdeg, 4, NULL)) ; + GRB_TRY (GrB_Vector_nvals(&n_4degree,M_outdeg)) ; + GrB_Index *deg_keep = NULL; + void *junk = NULL; + GrB_Index junk_size; + GRB_TRY (GrB_Vector_unpack_CSC( + M_outdeg, °_keep, &junk, &n_4degree, &junk_size, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + M, NULL, NULL, M, NULL, 0, deg_keep, n_4degree, NULL)) ; - // remove and entries of M with less than 3 values - // probably worth it to put 0s on the interf diagonal to make the - // following vector dense. - // interf = MT * M (plus_one) - // reduce interf to a vector on rows - // r_interf = interf * denseVec (max_first) - // d_interf = diagonalize r_interf + // interf = M*MT(plus_one) + // Should I keep rebuilding matricies with the correct size?? + GRB_TRY (GrB_transpose(M_t, NULL, NULL, M, NULL)) ; + GRB_TRY (GrB_mxm( + interf, NULL, NULL, LAGraph_plus_one_uint8, M_t, M, GrB_DESC_R)) ; + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); + GRB_TRY (GrB_Vector_select_UINT8( + r_interf, NULL, NULL, GrB_EQ_INT8, r_interf, 2, NULL)) ; + // TODO Remove anything in r_interf with best method // set 3rd bit to 1 if it must be removed. // An accumulator might work better. // M = d_interf * M (any_[z = 4 * (x > 2) | y]) - // M = extract M (x & 4 == 0) + // M = select M (x & 4 == 0) + + // M1 = select M (x & 1 == 0) / 2 + GRB_TRY (GrB_Matrix_select_UINT8( + M_1, NULL, NULL, first_bit, M_t, 0, GrB_DESC_R)) ; + // M2 = select M (x & 1 == 1) / 2 + GRB_TRY (GrB_Matrix_select_UINT8( + M_2, NULL, NULL, first_bit, M_t, 1, GrB_DESC_R)) ; - // M1 = extract M (x & 2 == 0) - // M2 = extract M (x & 2 != 0) // Check if an edge already exists in the graph. // If a row of M1 or M2 has more than 1 vertex in common with a - // row of E, the value of that entry in the exists array will be 0. + // row of E, the value of that entry in the exists array will be 2. // Otherwise, 1 or noval. - // exists = E * M1T (zero_one) - // exists += E * M2T (zero_one) (accum is one if theres an intersection) - - // 0 if intended swap already exists in the matrix, 1 or noval otherwise - // r_exists = denseVec * exists (bitwiseAnd_second) - // QUESTION: how to remove r_exists zeros from M matrix? + // exists = M_1 * E (plus_one) + GRB_TRY (GrB_mxm( + exists, NULL, NULL, LAGraph_plus_one_uint8, M_1, E, GrB_DESC_R)) ; + // exists += M_2 * E (plus_one) (accum is one if theres an intersection) + GRB_TRY (GrB_mxm( + exists, NULL, GrB_MAX_MONOID_UINT8, + LAGraph_plus_one_uint8, M_2, E, NULL)) ; + // 2 if intended swap already exists in the matrix, 1 or noval otherwise + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_exists, NULL, NULL, GrB_MAX_MONOID_UINT8, exists, GrB_DESC_R)); // Compute S. note we could do ST if its better. // pairs | M | S @@ -116,7 +333,7 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // QUESTION // update E and possibly ET - + } LG_FREE_WORK ; return (GrB_SUCCESS) ; diff --git a/experimental/utility/LAGraph_MaskColRow.c b/experimental/utility/LAGraph_MaskColRow.c new file mode 100644 index 0000000000..bf3615a982 --- /dev/null +++ b/experimental/utility/LAGraph_MaskColRow.c @@ -0,0 +1,79 @@ +//------------------------------------------------------------------------------ +// LAGraph_MaskColRow: remove certain rows or columns from a matrix +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +// Small utility that removes the entries in a a specified row or column of a +// matrix + +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + \ +} + +#define LG_FREE_ALL \ +{ \ + /* free any workspace used here */ \ + LG_FREE_WORK ; \ + /* free all the output variable(s) */ \ + \ + /* take any other corrective action */ \ +} + +#include "LG_internal.h" +#include "LAGraphX.h" + +int LAGraph_HelloWorld // a simple algorithm, just for illustration +( + // output + GrB_Matrix *M, // A - the rows and columns requested + // input: not modified + GrB_Vector cols, // column "mask" + GrB_Matrix A, // Matrix to be pruned + GrB_Vector rows, // row "mask" + bool cols_inverted, // true if you'd like to keep entries not in cols + bool rows_inverted, // true if you'd like to keep entries not in rows + char *msg +) +{ + //-------------------------------------------------------------------------- + // Declorations + //-------------------------------------------------------------------------- + GrB_Vector cols_i = NULL; // inverse of cols + GrB_Vector rows_i = NULL; // inverse of rows + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + LG_ASSERT (A != NULL && !(cols == NULL && rows == NULL), GrB_NULL_POINTER) ; + if(cols != NULL) + { + if(cols_inverted) + { + + } + } + if(rows != NULL) + { + + } + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + LG_FREE_WORK ; + return (GrB_SUCCESS) ; +} From cb50ec2c617ff4a9e299abfa047e4aea7e20cdf0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 22 May 2024 14:57:22 -0500 Subject: [PATCH 004/115] small additions and changes to SwapEdges Psuedo code --- .../algorithm/LAGraph_RichClubCoefficient.c | 2 +- experimental/algorithm/LAGraph_SwapEdges.c | 52 +++++++++++++------ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 44c3ca47fa..1d6c90f243 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -261,7 +261,7 @@ int LAGraph_RichClubCoefficient // If they have the same degree, that edge is double counted. So, we adjust: // edge_adjusted_deg = 2 * (x > y) + (x == y) GRB_TRY(GrB_vxm( - edge_gt_deg, NULL, NULL, plus_2le, + edge_adjusted_deg, NULL, NULL, plus_2le, degrees, edge_degrees, GrB_NULL)) ; GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, edge_adjusted_deg)); diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 447a949298..354613d92b 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -32,10 +32,10 @@ #include "LG_internal.h" #include "LAGraphX.h" -int LAGraph_HelloWorld // a simple algorithm, just for illustration +int LAGraph_SwapEdges ( // output - GrB_Matrix *A_new, + GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped // input: not modified LAGraph_Graph G, GrB_Index Q, // Swaps per edge @@ -135,7 +135,7 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration GRB_TRY (GrB_Matrix_new(&E_selected, GrB_UINT8, n, e)) ; GrB_Index num_swaps = 0, num_attempts = 0 ; - // QUESTION: Should this decrease if edges don't want to swap? + // QUESTION: Should this decrease if edges are interfering alot? GrB_Index swaps_per_loop = e / 3 ; // 1/3 reasonable? GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, e, swaps_per_loop)) ; @@ -198,24 +198,26 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration GRB_TRY (GrB_Scalar_setElement_UINT64 (zero64, 0)) ; // QUESTION: Should this be GxB_Vector_pack?? GRB_TRY ( - GxB_Vector_build_Scalar(random_v, ramp, zero64, e)); */ - // TODO check this - uint8_t zero_8 = 0; + GxB_Vector_build_Scalar(random_v, ramp, zero64, e)); */ // QUESTION: diffrence? which is better? - /* GRB_TRY(GxB_Vector_pack_Full( + /* + uint8_t zero_8 = 0; + GRB_TRY(GxB_Vector_pack_Full( random_v, &zero_8, sizeof(uint8_t), true, NULL )) ; */ GRB_TRY (GrB_assign (x, NULL, NULL, 0, GrB_ALL, swaps_per_loop, NULL)) ; GRB_TRY (GrB_assign (random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - GRB_TRY (GrB_Vector_apply_IndexOp_INT64 (ramp_v, NULL, NULL, + GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, random_v, 1, NULL)) ; - GRB_TRY (GrB_Vector_apply (half_ramp, NULL, NULL, half, ramp_v, NULL)) ; + //QUESTION: Is this correct? + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + half_ramp, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full ( ramp_v, ramp, e * sizeof(GrB_Index), NULL, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full ( hramp_v, half_ramp, e * sizeof(GrB_Index), NULL, NULL)) ; - + //TODO Change seed LG_TRY( LAGraph_Random_Seed(random_v, 15489451345495616ul, msg)); @@ -259,10 +261,14 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // 2 | 0,1 | 2,3 // 3 | 0,1 | 3,2 // This gives us randomization as to which type of swap is happening. - // M = E * pairs (any_bxor) + // M = E * pairs (any_lxor) GRB_TRY (GrB_mxm(M, NULL, NULL, GxB_ANY_LXOR_INT8, E, pairs, NULL)) ; + // remove any entries of M with less than 3 values + // This is taken from LAGraph_Cached_OutDegree. + // TODO: Should there be a function that takes in A matrix and computes + // in or out degree GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_int64, @@ -298,13 +304,18 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // M = d_interf * M (any_[z = 4 * (x > 2) | y]) // M = select M (x & 4 == 0) + + // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. // M1 = select M (x & 1 == 0) / 2 + // M2 = select M (x & 1 == 1) / 2 GRB_TRY (GrB_Matrix_select_UINT8( M_1, NULL, NULL, first_bit, M_t, 0, GrB_DESC_R)) ; - // M2 = select M (x & 1 == 1) / 2 GRB_TRY (GrB_Matrix_select_UINT8( M_2, NULL, NULL, first_bit, M_t, 1, GrB_DESC_R)) ; - + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + M_1, NULL, NULL, GrB_DIV_UINT64, M_1, 2UL, NULL)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + M_2, NULL, NULL, GrB_DIV_UINT64, M_2, 2UL, NULL)) ; // Check if an edge already exists in the graph. // If a row of M1 or M2 has more than 1 vertex in common with a // row of E, the value of that entry in the exists array will be 2. @@ -319,7 +330,9 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( r_exists, NULL, NULL, GrB_MAX_MONOID_UINT8, exists, GrB_DESC_R)); + // TODO: remove r_exists + // This May not be neccesary. // Compute S. note we could do ST if its better. // pairs | M | S // 0 | 0,1 | 0,1 @@ -329,10 +342,17 @@ int LAGraph_HelloWorld // a simple algorithm, just for illustration // S = pairsT * M (any_[z = (x & 2) ^ y]) // S = extract S (x & 2 == 0) + // If I've been prunning pairs along with M, // If S has a row, Remove it from E and replace with the row from S - // QUESTION - - // update E and possibly ET + // QUESTION: the order of the edges being kept is unimportant so is it + // easier to "concatinate" a GrB_extract'ed E with M? + // AH GxB_Matrix_concat? + // Then E = Concat(E_prime, M_1, M_2) + // where E_prime contains no edges in the indegree of pairs after it is + // pruned + + //Maintain random Vector + LG_TRY (LAGraph_Random_Next(random_v, msg)) ; } LG_FREE_WORK ; From 0bee66ae8827a3cc0ad798ccfe23609a9d0b603a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 29 May 2024 14:09:36 -0500 Subject: [PATCH 005/115] Meeting notes on SwapEdges.c --- experimental/algorithm/LAGraph_SwapEdges.c | 30 +++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 354613d92b..e0b8a503cf 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -136,15 +136,22 @@ int LAGraph_SwapEdges GrB_Index num_swaps = 0, num_attempts = 0 ; // QUESTION: Should this decrease if edges are interfering alot? - GrB_Index swaps_per_loop = e / 3 ; // 1/3 reasonable? + // Bound number of swaps by E-2 * (max deg)? + // Yes might be good to decrease this if you get alot of intrf + // or increase if intrf low + // maybe a * #swaps that worked last iteration + GrB_Index swaps_per_loop = e / 3 ; // Make this a cap + // TODO: if swaps change these have to be done inside the loop GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, e, swaps_per_loop)) ; GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, n, swaps_per_loop)) ; + // TODO: double check this swaps *2 or e?? + GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; + - GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, n)) ; @@ -235,8 +242,11 @@ int LAGraph_SwapEdges //GrB_Vector_apply(r_sorted, NULL, NULL, GrB_UnaryOp, r_sorted, GrB_DESC_R) ; // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap // Also + // TODO: handle memory + GrB_Index edge_perm_size; + // TODO: try and make this more efficient GRB_TRY (GxB_Vector_unpack_Full( - r_permute, edge_perm, e * sizeof(GrB_Index), iso, GrB_NULL + r_permute, (void **)&edge_perm, &edge_perm_size, NULL, NULL )) ; @@ -250,8 +260,9 @@ int LAGraph_SwapEdges // vals[i] += vals[i] > vals[i-1] // I know it will be alot less safe but is it more efficient to pack // pairs as needed? Doubt it. + // nvals is wrong GRB_TRY (GrB_Matrix_build_UINT8( - pairs, edge_perm, half_ramp, vals, swaps_per_loop, GrB_NULL + pairs, edge_perm, half_ramp, vals, swaps_per_loop * 2, NULL )) ; @@ -274,8 +285,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_int64, M, x, NULL)) ; - // QUESTION: Is the following method correct? Do I need a new M with the - // correct dimension? + // QUESTION: Do I need a new M with the correct dimension? + // YES TODO GRB_TRY (GrB_Vector_select_UINT8( M_outdeg, NULL, NULL, GrB_EQ_INT8, M_outdeg, 4, NULL)) ; GRB_TRY (GrB_Vector_nvals(&n_4degree,M_outdeg)) ; @@ -284,8 +295,9 @@ int LAGraph_SwapEdges GrB_Index junk_size; GRB_TRY (GrB_Vector_unpack_CSC( M_outdeg, °_keep, &junk, &n_4degree, &junk_size, NULL)) ; + // TODO: replace the 0 and M with correct size GRB_TRY (GrB_Matrix_extract( - M, NULL, NULL, M, NULL, 0, deg_keep, n_4degree, NULL)) ; + M, NULL, NULL, M, GrB_ALL, 0, deg_keep, n_4degree, NULL)) ; // interf = M*MT(plus_one) From 0f810b5118971a3725c3b8f51055b3a788137c0f Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 4 Jun 2024 17:19:52 -0500 Subject: [PATCH 006/115] Code compiling; Switching Swap Edges to use Concat --- .gitignore | 1 + .../algorithm/LAGraph_RichClubCoefficient.c | 6 +- experimental/algorithm/LAGraph_SwapEdges.c | 114 ++++++++++-------- experimental/utility/LAGraph_MaskColRow.c | 79 ------------ 4 files changed, 68 insertions(+), 132 deletions(-) delete mode 100644 experimental/utility/LAGraph_MaskColRow.c diff --git a/.gitignore b/.gitignore index 682fbeee63..ca308d807a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ gmon.out cmake-build-debug* CMakeFiles* *~ +.vscode/ */build/* **/.venv/* diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 1d6c90f243..4d6528ba65 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -288,7 +288,7 @@ int LAGraph_RichClubCoefficient GRB_TRY(GrB_Vector_build ( cumulative_deg, deg_arr, ones, n, GrB_PLUS_INT64)) ; GRB_TRY(GxB_Vector_unpack_CSC( - edges_per_deg, &index_edge, &edges_per_deg_arr, + edges_per_deg, &index_edge, (void **)&edges_per_deg_arr, &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, GrB_NULL)); //run a cummulative sum (backwards) on edges_per_deg_arr @@ -315,9 +315,9 @@ int LAGraph_RichClubCoefficient break ; } } - // QUESTION: + // QUESTION: will this pack work or do I need something like a build? GRB_TRY(GxB_Vector_pack_Full( - cumulative_edges, cumul_array, n * sizeof(uint64_t), false, NULL + cumulative_edges, (void **)&cumul_array, n * sizeof(uint64_t), false, NULL )) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index e0b8a503cf..e6a1db7f97 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -32,6 +32,17 @@ #include "LG_internal.h" #include "LAGraphX.h" +void first_bit_equals + (bool *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *bit) + { + (*z) = ((*x) & 1) == bit; + } +#define FIRST_BIT_EQ \ +"void first_bit_equals" \ + "(bool *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *bit)" \ + "{" \ + "(*z) = ((*x) & 1) == bit;" \ + "}" int LAGraph_SwapEdges ( // output @@ -51,16 +62,25 @@ int LAGraph_SwapEdges //GrB_Matrix E_t = NULL; // Incidence Transposed GrB_Matrix E_selected = NULL; // E - rows to be replaced + // cmatrix [edges kept from E, M_1, M_2] + GrB_Matrix E_arranged[3] = {NULL, NULL, NULL}; + + // e x swaps // Selected pairs for next batch of swaps - // Each row? contains 2 entries for the edges involved in a swap. + // Each col contains 2 entries for the edges involved in a swap. GrB_Matrix pairs = NULL; - // Each row? contains 4 or less entries corresponding to the verticies + // n x swaps + // Each col contains 4 or less entries corresponding to the verticies // that are involved in the swap. GrB_Matrix M = NULL; + // swaps x n GrB_Matrix M_t = NULL; + + // Diagonal matrix of outdegree of M GrB_Matrix M_outdiag = NULL; + // swaps x swaps // Interference Matrix any entry is the number of verticies the swap on its // row and column share. Any entry with 2 or more could cause interference. GrB_Matrix interf = NULL; @@ -68,15 +88,9 @@ int LAGraph_SwapEdges GrB_Matrix M_1 = NULL; // M_1 + M_2 = M GrB_Matrix M_2 = NULL; // M_1 + M_2 = M - // Diagonalized version of the reduced interference matrix - GrB_Matrix d_interf = NULL; - // Has a 2 in a certain row if the planned swap already exists in the matrix GrB_Matrix exists = NULL; - // New edges after swap, positioned to replace edges in E - GrB_Matrix S = NULL; - GrB_Index n, e, nvals; // Copied vars from LAGraph_Incidence_Matrix @@ -90,6 +104,9 @@ int LAGraph_SwapEdges GrB_Index *col_indices = NULL ; void *values = NULL ; + // [0,2,0,3,0,3,0 . . .] numSwaps? + GrB_Vector swapVals; + // This ramp will likely get recycled a few times. GrB_Vector ramp_v = NULL; GrB_Vector hramp_v = NULL; @@ -109,7 +126,8 @@ int LAGraph_SwapEdges // Number of values removed in each phase GrB_Index n_4degree, n_interf, n_exist; - + + GrB_IndexUnaryOp first_bit = NULL; //-------------------------------------------------------------------------- // Check inputs TODO //-------------------------------------------------------------------------- @@ -133,7 +151,12 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, n, e)) ; GRB_TRY (GrB_Matrix_new (&A_tril, type, n, n)) ; GRB_TRY (GrB_Matrix_new(&E_selected, GrB_UINT8, n, e)) ; + + GRB_TRY (GxB_IndexUnaryOp_new ( + &first_bit, (void *) first_bit_equals, GrB_BOOL, GrB_UINT8, GrB_UINT8, + "first_bit", FIRST_BIT_EQ)); + GrB_Index num_swaps = 0, num_attempts = 0 ; // QUESTION: Should this decrease if edges are interfering alot? // Bound number of swaps by E-2 * (max deg)? @@ -142,21 +165,18 @@ int LAGraph_SwapEdges // maybe a * #swaps that worked last iteration GrB_Index swaps_per_loop = e / 3 ; // Make this a cap - // TODO: if swaps change these have to be done inside the loop - GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, e, swaps_per_loop)) ; - GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, n, swaps_per_loop)) ; + + + // This is length e to let every edge have a chance to swap. + // QUESTION: Perhaps it's better to just do random_v % e and deal with + // duplicate edges and self paired edges later. + // (inteference matrix will detect) - // TODO: double check this swaps *2 or e?? GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, n)) ; - GRB_TRY (GrB_Vector_new (&x, GrB_INT64, swaps_per_loop)) ; - // Extract adjacency matrix to make incidence matrix - E // get just the lower triangular entries GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; @@ -197,24 +217,17 @@ int LAGraph_SwapEdges // if it has to be used GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_INT8, E, E_half, NULL)) ; - // Initialize random vector - /* GrB_Scalar zero64; - GRB_TRY (GrB_Scalar_new (&zero64, GrB_UINT8)) ; - - //value irrelevant - GRB_TRY (GrB_Scalar_setElement_UINT64 (zero64, 0)) ; - // QUESTION: Should this be GxB_Vector_pack?? - GRB_TRY ( - GxB_Vector_build_Scalar(random_v, ramp, zero64, e)); */ - - // QUESTION: diffrence? which is better? - /* - uint8_t zero_8 = 0; - GRB_TRY(GxB_Vector_pack_Full( - random_v, &zero_8, sizeof(uint8_t), true, NULL - )) ; */ GRB_TRY (GrB_assign (x, NULL, NULL, 0, GrB_ALL, swaps_per_loop, NULL)) ; GRB_TRY (GrB_assign (random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + + + // QUESTION: I don't want to rebuild ramp every time, so do I just build one + // that is too large and use as needed? + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; + // TODO: + // GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, random_v, 1, NULL)) ; //QUESTION: Is this correct? @@ -225,12 +238,21 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_unpack_Full ( hramp_v, half_ramp, e * sizeof(GrB_Index), NULL, NULL)) ; - //TODO Change seed + //TODO: Change seed LG_TRY( LAGraph_Random_Seed(random_v, 15489451345495616ul, msg)); while(num_swaps < e * Q && num_attempts < e * Q * 5) { + GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, e, swaps_per_loop)) ; + GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, n, swaps_per_loop)) ; + + + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, n)) ; + GRB_TRY (GrB_Vector_new (&x, GrB_INT64, swaps_per_loop)) ; + // Coming into the loop: // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly one 0 and one 1. @@ -244,7 +266,8 @@ int LAGraph_SwapEdges // Also // TODO: handle memory GrB_Index edge_perm_size; - // TODO: try and make this more efficient + // TODO: try and make this more efficient maybe just rand % e rather + // than a permutation GRB_TRY (GxB_Vector_unpack_Full( r_permute, (void **)&edge_perm, &edge_perm_size, NULL, NULL )) ; @@ -260,10 +283,9 @@ int LAGraph_SwapEdges // vals[i] += vals[i] > vals[i-1] // I know it will be alot less safe but is it more efficient to pack // pairs as needed? Doubt it. - // nvals is wrong - GRB_TRY (GrB_Matrix_build_UINT8( + /* GRB_TRY (GrB_Matrix_build_UINT8( pairs, edge_perm, half_ramp, vals, swaps_per_loop * 2, NULL - )) ; + )) ; */ // each row of M will have 4 values [0,1,2,3] @@ -305,6 +327,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_transpose(M_t, NULL, NULL, M, NULL)) ; GRB_TRY (GrB_mxm( interf, NULL, NULL, LAGraph_plus_one_uint8, M_t, M, GrB_DESC_R)) ; + + // QUESTION: Reduce on max then select? or select then reduce on any? GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); GRB_TRY (GrB_Vector_select_UINT8( @@ -344,16 +368,6 @@ int LAGraph_SwapEdges r_exists, NULL, NULL, GrB_MAX_MONOID_UINT8, exists, GrB_DESC_R)); // TODO: remove r_exists - // This May not be neccesary. - // Compute S. note we could do ST if its better. - // pairs | M | S - // 0 | 0,1 | 0,1 - // 2 / 3 | 0,1 | 2,3 - // 0 | 2,3 | 2,3 - // 2 / 3 | 2,3 | 0,1 - // S = pairsT * M (any_[z = (x & 2) ^ y]) - // S = extract S (x & 2 == 0) - // If I've been prunning pairs along with M, // If S has a row, Remove it from E and replace with the row from S // QUESTION: the order of the edges being kept is unimportant so is it @@ -362,7 +376,7 @@ int LAGraph_SwapEdges // Then E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is // pruned - + GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; //Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; } diff --git a/experimental/utility/LAGraph_MaskColRow.c b/experimental/utility/LAGraph_MaskColRow.c deleted file mode 100644 index bf3615a982..0000000000 --- a/experimental/utility/LAGraph_MaskColRow.c +++ /dev/null @@ -1,79 +0,0 @@ -//------------------------------------------------------------------------------ -// LAGraph_MaskColRow: remove certain rows or columns from a matrix -//------------------------------------------------------------------------------ - -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. -// SPDX-License-Identifier: BSD-2-Clause -// -// For additional details (including references to third party source code and -// other files) see the LICENSE file or contact permission@sei.cmu.edu. See -// Contributors.txt for a full list of contributors. Created, in part, with -// funding and support from the U.S. Government (see Acknowledgments.txt file). -// DM22-0790 - -// Contributed by Timothy A. Davis, Texas A&M University - -//------------------------------------------------------------------------------ - -// Small utility that removes the entries in a a specified row or column of a -// matrix - -#define LG_FREE_WORK \ -{ \ - /* free any workspace used here */ \ - \ -} - -#define LG_FREE_ALL \ -{ \ - /* free any workspace used here */ \ - LG_FREE_WORK ; \ - /* free all the output variable(s) */ \ - \ - /* take any other corrective action */ \ -} - -#include "LG_internal.h" -#include "LAGraphX.h" - -int LAGraph_HelloWorld // a simple algorithm, just for illustration -( - // output - GrB_Matrix *M, // A - the rows and columns requested - // input: not modified - GrB_Vector cols, // column "mask" - GrB_Matrix A, // Matrix to be pruned - GrB_Vector rows, // row "mask" - bool cols_inverted, // true if you'd like to keep entries not in cols - bool rows_inverted, // true if you'd like to keep entries not in rows - char *msg -) -{ - //-------------------------------------------------------------------------- - // Declorations - //-------------------------------------------------------------------------- - GrB_Vector cols_i = NULL; // inverse of cols - GrB_Vector rows_i = NULL; // inverse of rows - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - LG_ASSERT (A != NULL && !(cols == NULL && rows == NULL), GrB_NULL_POINTER) ; - if(cols != NULL) - { - if(cols_inverted) - { - - } - } - if(rows != NULL) - { - - } - //-------------------------------------------------------------------------- - // free workspace and return result - //-------------------------------------------------------------------------- - - LG_FREE_WORK ; - return (GrB_SUCCESS) ; -} From d9df0d7dc7403d0b549500a2a286ebadad16d9c9 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 11 Jun 2024 03:07:31 -0500 Subject: [PATCH 007/115] Swap edges mostly done --- .vscode/settings.json | 5 - .../algorithm/LAGraph_RichClubCoefficient.c | 13 +- experimental/algorithm/LAGraph_SwapEdges.c | 345 +++++++++++++----- 3 files changed, 258 insertions(+), 105 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 26fec30dc4..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "lg_internal.h": "c" - } -} \ No newline at end of file diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 4d6528ba65..4262fa9aa1 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -285,6 +285,7 @@ int LAGraph_RichClubCoefficient // Start ones. Do I do this by building an iso vector? or by myself? // QUESTION: I want to do the following. I should duplicate deg_arr memory correct? + // This is safe. build doesn't take ur mem GRB_TRY(GrB_Vector_build ( cumulative_deg, deg_arr, ones, n, GrB_PLUS_INT64)) ; GRB_TRY(GxB_Vector_unpack_CSC( @@ -300,7 +301,7 @@ int LAGraph_RichClubCoefficient //Construct a vector thats has edges_per_deg_arr values but repeated whenever //index_edge has a skip and put into cumulative edges // ie. [0,1,6,7,10] & [9,7,3,2,0] -> - // [9,7,7,7,7,7,3,2,2,2, . . .] + // [9,7,7,7,7,7,3,2,2,2,. . . ] uint64_t index = 0, i = 0; LG_TRY (LAGraph_Malloc((void **) &cumul_array, n, sizeof(uint64_t), msg)) ; @@ -314,13 +315,13 @@ int LAGraph_RichClubCoefficient if(index == edge_vec_nvals || edges_per_deg_arr[index] == 0) break ; } - } + } // QUESTION: will this pack work or do I need something like a build? + // TODO: fix this is not full + // could make cumulative_edges smaller GRB_TRY(GxB_Vector_pack_Full( - cumulative_edges, (void **)&cumul_array, n * sizeof(uint64_t), false, NULL - )) ; - - + cumulative_edges, (void **)&cumul_array, + n * sizeof(uint64_t), false, NULL)) ; //GrB select or just do an if test LG_FREE_WORK ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index e6a1db7f97..0238ab35c4 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -19,7 +19,45 @@ #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ -} + GrB_free (&E) ; \ + GrB_free (&E_t) ; \ + GrB_free (E_arranged) ; \ + GrB_free (E_arranged + 1) ; \ + GrB_free (E_arranged + 2) ; \ + GrB_free (&pairs) ; \ + GrB_free (&pairs_4s) ; \ + GrB_free (&pairs_i) ; \ + GrB_free (&pairs_new) ; \ + GrB_free (&M) ; \ + GrB_free (&M_fours) ; \ + GrB_free (&M_i) ; \ + GrB_free (&M_t) ; \ + GrB_free (&interf) ; \ + GrB_free (&M_1) ; \ + GrB_free (&M_2) ; \ + GrB_free (&exists) ; \ + GrB_free (&E_half) ; \ + GrB_free (&A_tril) ; \ + GrB_free (&random_v) ; \ + GrB_free (&r_permute) ; \ + GrB_free (&r_sorted) ; \ + GrB_free (&swapVals) ; \ + GrB_free (&ramp_v) ; \ + GrB_free (&hramp_v) ; \ + /* row_indices) ; + col_indices) ; + void *values) ; + GrB_Index *ramp) ; + GrB_Index *half_ramp) ; + GrB_Index *edge_perm) ; + uint8_t *swap_type) ; */ \ + GrB_free (&M_outdeg) ; \ + GrB_free (&r_interf) ; \ + GrB_free (&r_exists) ; \ + GrB_free (&r_pairs) ; \ + GrB_free (&x) ; \ + GrB_free (&first_bit) ; \ + } #define LG_FREE_ALL \ { \ @@ -35,14 +73,28 @@ void first_bit_equals (bool *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *bit) { - (*z) = ((*x) & 1) == bit; + (*z) = ((*x) & 1) == (*bit); } #define FIRST_BIT_EQ \ "void first_bit_equals" \ "(bool *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *bit)" \ "{" \ - "(*z) = ((*x) & 1) == bit;" \ + "(*z) = ((*x) & 1) == (*bit);" \ + "}" + +// creates [0,3,1,2,1,3,. . .] pattern from random vector. +void swap_pattern + (uint8_t *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *y) + { + (*z) = ((i % 2) * 2) | (*x & 1); + } +#define SWAP_PAT \ +"void swap_pattern" \ + "(uint8_t *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *y)"\ + "{" \ + "(*z) = ((i \% 2) * 2) | (*x & 1);" \ "}" + int LAGraph_SwapEdges ( // output @@ -57,28 +109,30 @@ int LAGraph_SwapEdges //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- - GrB_Matrix A = NULL; // nxn Adjacency Matrix - GrB_Matrix E = NULL; // nxe Incidence Matrix - //GrB_Matrix E_t = NULL; // Incidence Transposed - GrB_Matrix E_selected = NULL; // E - rows to be replaced + GrB_Matrix A = NULL; // n x n Adjacency Matrix + GrB_Matrix E = NULL; // e x n Incidence Matrix + GrB_Matrix E_t = NULL; // n x e Incidence Transposed - // cmatrix [edges kept from E, M_1, M_2] + // cmatrix [E_selected, M_1, M_2] GrB_Matrix E_arranged[3] = {NULL, NULL, NULL}; - // e x swaps + // swaps x e // Selected pairs for next batch of swaps - // Each col contains 2 entries for the edges involved in a swap. + // Each row contains 2 entries for the edges involved in a swap. GrB_Matrix pairs = NULL; + GrB_Matrix pairs_4s = NULL; + GrB_Matrix pairs_i = NULL; + GrB_Matrix pairs_new = NULL; - // n x swaps - // Each col contains 4 or less entries corresponding to the verticies + // swaps x n + // Each row contains 4 or less entries corresponding to the verticies // that are involved in the swap. GrB_Matrix M = NULL; - // swaps x n - GrB_Matrix M_t = NULL; + GrB_Matrix M_fours = NULL; // M with exactly 4 entries + GrB_Matrix M_i = NULL; // M w/o interference - // Diagonal matrix of outdegree of M - GrB_Matrix M_outdiag = NULL; + // n x swaps + GrB_Matrix M_t = NULL; // swaps x swaps // Interference Matrix any entry is the number of verticies the swap on its @@ -115,19 +169,22 @@ int LAGraph_SwapEdges // Arrays to unpack edge permutation GrB_Index *edge_perm = NULL ; - u_char *swap_type = NULL ; + uint8_t *swap_type = NULL ; bool iso = false; // Reduced Vectors - GrB_Vector M_outdeg = NULL, r_interf = NULL, r_exists = NULL; + GrB_Vector M_outdeg = NULL, r_interf = NULL, r_exists = NULL, r_pairs; - // x = zeros (swaps_per_loop,1) + // n vector of zeroes GrB_Vector x = NULL; - // Number of values removed in each phase - GrB_Index n_4degree, n_interf, n_exist; + // Number of values kept in each phase + GrB_Index n_keep; + GrB_Index *arr_keep = NULL; + void *junk = NULL; GrB_IndexUnaryOp first_bit = NULL; + GrB_IndexUnaryOp swap_op = NULL; //-------------------------------------------------------------------------- // Check inputs TODO //-------------------------------------------------------------------------- @@ -147,18 +204,21 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY (GrB_Matrix_nvals(&nvals, A)) ; e = nvals / 2 ; - GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, n, e)) ; - GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, n, e)) ; + GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, e, n)) ; + GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, e, n)) ; + GRB_TRY (GrB_Matrix_new (&E_t, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&A_tril, type, n, n)) ; - GRB_TRY (GrB_Matrix_new(&E_selected, GrB_UINT8, n, e)) ; GRB_TRY (GxB_IndexUnaryOp_new ( &first_bit, (void *) first_bit_equals, GrB_BOOL, GrB_UINT8, GrB_UINT8, "first_bit", FIRST_BIT_EQ)); + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_op, (void *) swap_type, GrB_UINT8, GrB_UINT64, GrB_UINT64, + "swap_op", SWAP_PAT)); - GrB_Index num_swaps = 0, num_attempts = 0 ; - // QUESTION: Should this decrease if edges are interfering alot? + GrB_Index num_swaps = 0, num_attempts = 0; + // Q: Should this decrease if edges are interfering alot? // Bound number of swaps by E-2 * (max deg)? // Yes might be good to decrease this if you get alot of intrf // or increase if intrf low @@ -175,12 +235,15 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new (&x, GrB_INT64, n)) ; + GRB_TRY (GrB_Vector_new (&r_pairs, GrB_INT64, e)) ; // Extract adjacency matrix to make incidence matrix - E // get just the lower triangular entries GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; // Arrays to extract A into + // QUESTION: can't I just use an unpack and use the arrays GBLAS allocated? LG_TRY (LAGraph_Malloc ((void**)(&row_indices), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&col_indices), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&values), e, sizeof(type), msg)) ; @@ -210,15 +273,16 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; - GRB_TRY (GxB_Matrix_build_Scalar (E_half, col_indices, ramp, zero8, e)) ; - GRB_TRY (GxB_Matrix_build_Scalar (E, row_indices, ramp, one8, e)) ; + + GRB_TRY (GxB_Matrix_build_Scalar (E_half, ramp, col_indices, zero8, e)) ; + GRB_TRY (GxB_Matrix_build_Scalar (E, ramp, row_indices, one8, e)) ; // I'd like to be able to pass in a NULL addition opperator and get an error // if it has to be used - GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_INT8, E, E_half, NULL)) ; + GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_UINT8, E, E_half, NULL)) ; - GRB_TRY (GrB_assign (x, NULL, NULL, 0, GrB_ALL, swaps_per_loop, NULL)) ; - GRB_TRY (GrB_assign (random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + GRB_TRY (GrB_Vector_assign (x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_Vector_assign (random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; // QUESTION: I don't want to rebuild ramp every time, so do I just build one @@ -227,16 +291,16 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; // TODO: // GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; - + GRB_TRY (GrB_Vector_assign (ramp_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, random_v, 1, NULL)) ; //QUESTION: Is this correct? GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - half_ramp, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; + hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full ( - ramp_v, ramp, e * sizeof(GrB_Index), NULL, NULL)) ; + ramp_v, (void **)&ramp, NULL, NULL, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full ( - hramp_v, half_ramp, e * sizeof(GrB_Index), NULL, NULL)) ; + hramp_v, (void **)&half_ramp, NULL, NULL, NULL)) ; //TODO: Change seed LG_TRY( @@ -244,14 +308,11 @@ int LAGraph_SwapEdges while(num_swaps < e * Q && num_attempts < e * Q * 5) { - GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, e, swaps_per_loop)) ; - GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, n, swaps_per_loop)) ; + GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, swaps_per_loop, e)) ; + GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, swaps_per_loop, n)) ; + GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, swaps_per_loop)) ; - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, n)) ; - GRB_TRY (GrB_Vector_new (&x, GrB_INT64, swaps_per_loop)) ; // Coming into the loop: // E must be the incidence matrix of the new graph. W/o self edges nor @@ -261,15 +322,15 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_sort ( r_sorted, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - //GrB_Vector_apply(r_sorted, NULL, NULL, GrB_UnaryOp, r_sorted, GrB_DESC_R) ; + // TODO change this vect name + GrB_Vector_apply(r_sorted, NULL, NULL, swap_op, r_sorted, NULL) ; // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap // Also // TODO: handle memory - GrB_Index edge_perm_size; // TODO: try and make this more efficient maybe just rand % e rather // than a permutation GRB_TRY (GxB_Vector_unpack_Full( - r_permute, (void **)&edge_perm, &edge_perm_size, NULL, NULL + r_permute, (void **)&edge_perm, NULL, NULL, NULL )) ; @@ -277,7 +338,7 @@ int LAGraph_SwapEdges // pairs wants: // rows: [0, 0, 1, 1, 2, 2, 3, 3, . . .] (ramp / 2) // cols: [ random permutation 1 - nvals] (LAGraph_Random_Seed + sort) - // vals: [0, 3, 0, 2, 0, 2, 0, 3, . . .] + // vals: [1, 3, 0, 2, 0, 2, 0, 3, . . .] // Start with [0, 2, 0, 2, 0, 2, . . .] // for i from 1 to nvals by 2s: // vals[i] += vals[i] > vals[i-1] @@ -288,99 +349,195 @@ int LAGraph_SwapEdges )) ; */ + // each row of M will have 4 values [0,1,2,3] // pairs | E | M // 0 | 0,1 | 0,1 // 2 | 0,1 | 2,3 // 3 | 0,1 | 3,2 // This gives us randomization as to which type of swap is happening. - // M = E * pairs (any_lxor) - GRB_TRY (GrB_mxm(M, NULL, NULL, GxB_ANY_LXOR_INT8, E, pairs, NULL)) ; + // M = pairs * E (any_lxor) + GRB_TRY (GrB_mxm(M, NULL, NULL, GxB_ANY_LXOR_UINT8, pairs, E, NULL)) ; // remove any entries of M with less than 3 values - // This is taken from LAGraph_Cached_OutDegree. // TODO: Should there be a function that takes in A matrix and computes // in or out degree - - GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_int64, + GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_uint8, M, x, NULL)) ; - // QUESTION: Do I need a new M with the correct dimension? + // Q: Do I need a new M with the correct dimension? // YES TODO GRB_TRY (GrB_Vector_select_UINT8( - M_outdeg, NULL, NULL, GrB_EQ_INT8, M_outdeg, 4, NULL)) ; - GRB_TRY (GrB_Vector_nvals(&n_4degree,M_outdeg)) ; - GrB_Index *deg_keep = NULL; - void *junk = NULL; - GrB_Index junk_size; - GRB_TRY (GrB_Vector_unpack_CSC( - M_outdeg, °_keep, &junk, &n_4degree, &junk_size, NULL)) ; - // TODO: replace the 0 and M with correct size - GRB_TRY (GrB_Matrix_extract( - M, NULL, NULL, M, GrB_ALL, 0, deg_keep, n_4degree, NULL)) ; + M_outdeg, NULL, NULL, GrB_VALUEEQ_UINT8, M_outdeg, (uint8_t) 4, NULL)) ; + + // QUESTION: Can I Null size, Iso, etc? Or is that memory also my responsibility now? + bool iso; + GRB_TRY (GxB_Vector_unpack_CSC( + M_outdeg, &arr_keep, &junk, NULL, NULL, &iso, + &n_keep, NULL, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)); + + // Remove bad swaps + GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, e)) ; + GRB_TRY (GrB_Matrix_extract( + M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + pairs_4s, NULL, NULL, pairs, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); // interf = M*MT(plus_one) - // Should I keep rebuilding matricies with the correct size?? - GRB_TRY (GrB_transpose(M_t, NULL, NULL, M, NULL)) ; + GRB_TRY (GrB_Matrix_new(&M_t, GrB_UINT8, n, n_keep)) ; + GRB_TRY (GrB_transpose(M_t, NULL, NULL, M_fours, NULL)) ; + GRB_TRY(GrB_Matrix_new(&interf, GrB_UINT8, n_keep, n_keep)) ; GRB_TRY (GrB_mxm( - interf, NULL, NULL, LAGraph_plus_one_uint8, M_t, M, GrB_DESC_R)) ; + interf, NULL, NULL, LAGraph_plus_one_uint8, M_t, M, NULL)) ; // QUESTION: Reduce on max then select? or select then reduce on any? - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); - GRB_TRY (GrB_Vector_select_UINT8( - r_interf, NULL, NULL, GrB_EQ_INT8, r_interf, 2, NULL)) ; - // TODO Remove anything in r_interf with best method - // set 3rd bit to 1 if it must be removed. - // An accumulator might work better. - // M = d_interf * M (any_[z = 4 * (x > 2) | y]) - // M = select M (x & 4 == 0) + /* GRB_TRY (GrB_Matrix_reduce_Monoid( + r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); */ + GRB_TRY (GrB_Vector_select_UINT8( + r_interf, NULL, NULL, GrB_VALUEGE_UINT8, r_interf, 2, NULL)) ; + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, GrB_DESC_R)); + + // TODO: Make vars to grab these null vals + GRB_TRY (GxB_Vector_unpack_CSC( + r_interf, &arr_keep, &junk, NULL, NULL, NULL, + &n_keep, NULL, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)); + + //TODO: free all the vectors you don't need right after you stop using them. + // Remove bad swaps + GRB_TRY (GrB_Matrix_new(&M_i, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&pairs_i, GrB_UINT8, n_keep, e)) ; + // QUESTION: is it easier to extract on transpose or extract and then remake the transpose? + GRB_TRY (GrB_Matrix_extract( + M_i, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)) ; // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. // M1 = select M (x & 1 == 0) / 2 // M2 = select M (x & 1 == 1) / 2 + GRB_TRY (GrB_Matrix_new(&M_1, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&M_2, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_select_UINT8( - M_1, NULL, NULL, first_bit, M_t, 0, GrB_DESC_R)) ; + M_1, NULL, NULL, first_bit, M_i, 0, GrB_DESC_R)) ; GRB_TRY (GrB_Matrix_select_UINT8( - M_2, NULL, NULL, first_bit, M_t, 1, GrB_DESC_R)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - M_1, NULL, NULL, GrB_DIV_UINT64, M_1, 2UL, NULL)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - M_2, NULL, NULL, GrB_DIV_UINT64, M_2, 2UL, NULL)) ; + M_2, NULL, NULL, first_bit, M_i, 1, GrB_DESC_R)) ; + GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( + M_1, NULL, NULL, GrB_DIV_UINT8, M_1, 2, NULL)) ; + GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( + M_2, NULL, NULL, GrB_DIV_UINT8, M_2, 2, NULL)) ; // Check if an edge already exists in the graph. // If a row of M1 or M2 has more than 1 vertex in common with a // row of E, the value of that entry in the exists array will be 2. // Otherwise, 1 or noval. // exists = M_1 * E (plus_one) + + GRB_TRY (GrB_Matrix_new( + &exists, GrB_UINT8, n_keep, n_keep)) ; + GRB_TRY (GrB_Vector_new( + &r_exists, GrB_UINT8, n_keep)) ; + GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, NULL)) ; GRB_TRY (GrB_mxm( - exists, NULL, NULL, LAGraph_plus_one_uint8, M_1, E, GrB_DESC_R)) ; - // exists += M_2 * E (plus_one) (accum is one if theres an intersection) + exists, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; + // exists += M_2 * E (plus_one) (accum is max if theres an intersection) GRB_TRY (GrB_mxm( - exists, NULL, GrB_MAX_MONOID_UINT8, - LAGraph_plus_one_uint8, M_2, E, NULL)) ; + exists, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, + M_1, E_t, NULL)) ; + GRB_TRY (GrB_Matrix_select_UINT8( + exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, 2, NULL)) ; // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( - r_exists, NULL, NULL, GrB_MAX_MONOID_UINT8, exists, GrB_DESC_R)); - // TODO: remove r_exists - - // If I've been prunning pairs along with M, - // If S has a row, Remove it from E and replace with the row from S - // QUESTION: the order of the edges being kept is unimportant so is it - // easier to "concatinate" a GrB_extract'ed E with M? - // AH GxB_Matrix_concat? - // Then E = Concat(E_prime, M_1, M_2) + r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, exists, NULL)); + + // Get compliment vector + GRB_TRY (GrB_Vector_assign( + r_exists, r_exists, NULL, NULL, GrB_ALL, 0, GrB_DESC_SC)) ; + GRB_TRY (GxB_Vector_unpack_CSC( + r_exists, &arr_keep, &junk, NULL, NULL, NULL, &n_keep, + NULL, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)) ; + GRB_TRY (GrB_Matrix_new( + E_arranged, GrB_UINT8, e - 2 * n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; + // TODO: Check if this needs to be transposed I think it does + GRB_TRY (GrB_Matrix_extract(E_arranged[1], NULL, NULL, M_1, GrB_ALL, n, + arr_keep, n_keep, NULL)) ; + GRB_TRY (GrB_Matrix_extract(E_arranged[2], NULL, NULL, M_1, GrB_ALL, n, + arr_keep, n_keep, NULL)) ; + GRB_TRY (GrB_Matrix_extract(pairs_new, NULL, NULL, pairs_i, GrB_ALL, n, + arr_keep, n_keep, NULL)) ; + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + + GrB_Index n_old; + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs, GrB_DESC_RT0)); + GRB_TRY (GrB_Vector_assign( + r_pairs, r_pairs, NULL, NULL, GrB_ALL, 0, GrB_DESC_SC)) ; + GRB_TRY (GxB_Vector_unpack_CSC( + r_exists, &arr_keep, &junk, NULL, NULL, NULL, &n_old, + NULL, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)) ; + // Question where do I find these error msgs + LG_ASSERT(n_old == e - 2 * n_keep, 1) ; + GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, + arr_keep, n_old, GrB_ALL, n, NULL)) ; + + // E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is // pruned GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; - //Maintain random Vector + // Free Matricies that have to be rebuilt + GrB_free(&pairs) ; + GrB_free(&M) ; + + + GrB_free(&ramp_v) ; + GrB_free(&hramp_v) ; + GrB_free(&M_outdeg) ; + + GrB_free(&M_fours) ; + GrB_free(&pairs_4s) ; + + GrB_free(&M_t) ; + GrB_free(&interf) ; + + GrB_free(&M_i) ; + GrB_free(&pairs_i) ; + + GrB_free(&exists) ; + GrB_free(&r_exists) ; + GrB_free(E_arranged) ; + GrB_free(E_arranged + 1) ; + GrB_free(E_arranged + 2) ; + + num_attempts += swaps_per_loop; + num_swaps += n_keep; + // QUESTION: What should this do in the extremes? + swaps_per_loop = (n_keep * 11) / 10 ; + swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; + swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; + // Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; } - + // QUESTION: how should the values of the matrix be assigned again? + GRB_TRY (GrB_select (*A_new, NULL, NULL, GrB_DIAG, A, 0, NULL)) ; + GRB_TRY (GrB_mxm(*A_new, NULL, NULL, NULL, E, E, GrB_DESC_T0)) ; + + // GrB_PLUS_INT64 - I rather not give this a type, is that possible? + GRB_TRY (GrB_eWiseAdd( + *A_new, NULL, NULL, GxB_ANY_INT64, *A_new, *A_new, GrB_DESC_T0)) ; + //TODO: give A_new values LG_FREE_WORK ; return (GrB_SUCCESS) ; } From 33aa7b58649c7245daf618633898725a11cfde5c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 30 Sep 2024 02:31:56 -0500 Subject: [PATCH 008/115] RCC passing basic tests --- .../algorithm/LAGraph_RichClubCoefficient.c | 247 +++++++++--------- experimental/test/test_RichClubCoefficient.c | 144 ++++++++++ include/LAGraphX.h | 12 + 3 files changed, 276 insertions(+), 127 deletions(-) create mode 100644 experimental/test/test_RichClubCoefficient.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 4262fa9aa1..b8f0426826 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// LAGraph_RichClubCoefficient: rich club coefficients and edge randomization +// LAGraph_RichClubCoefficient: rich club coefficient //------------------------------------------------------------------------------ // LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. @@ -35,20 +35,22 @@ // generation of random graphs with arbitrary degree sequences”, 2006. // https://arxiv.org/abs/cond-mat/0312028 -#define LG_FREE_WORK \ -{ \ - /* free any workspace used here */ \ - GrB_free (&edge_degrees) ; \ - GrB_free (&D) ; \ - GrB_free (°rees) ; \ - GrB_free (&edge_gt_deg) ; \ - GrB_free (&edge_eq_deg) ; \ - GrB_free (&edge_adjusted_deg) ; \ - GrB_free (&cumulative_deg) ; \ - GrB_free (&edges_per_deg) ; \ - GrB_free (&cumulative_edges) ; \ - GrB_free (&two_one) ; \ - GrB_free (&rcCalculation) ; \ +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + GrB_free (&edge_degrees) ; \ + GrB_free (&D) ; \ + GrB_free (°rees) ; \ + GrB_free (&node_edges) ; \ + GrB_free (&edges_per_deg) ; \ + GrB_free (&rcCalculation) ; \ + LAGraph_Free((void **) &index_edge, NULL) ; \ + LAGraph_Free((void **) &node_edges_arr, NULL); \ + LAGraph_Free((void **) °_arr, NULL); \ + LAGraph_Free((void **) &edges_per_deg_arr, NULL); \ + LAGraph_Free((void **) &cumul_array, NULL); \ + LAGraph_Free((void **) &ones, NULL); \ + LAGraph_Free((void **) °_vertex_count, NULL); \ } #define LG_FREE_ALL \ @@ -66,7 +68,7 @@ //taken from LAGraph_BF_full_mxv typedef void (*LAGraph_binary_function) (void *, const void *, const void *) ; -#define TWO_ONE_ADD \ +/* #define TWO_ONE_ADD \ "void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ "{" \ "(*z) = 2 * (*x) + (*y) ;" \ @@ -75,7 +77,7 @@ void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y) { (*z) = 2 * (*x) + (*y); } - + */ #define ISEQ_2ISLT \ "void iseq_2islt(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ "{" \ @@ -91,10 +93,10 @@ void iseq_2islt(uint64_t *z, const uint64_t *x, const uint64_t *y) "{" \ "(*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ;" \ "}" -//Look out for ones +//TODO: Look out for ones void rich_club_formula(double *z, const uint64_t *x, const uint64_t *y) { - (*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ; + (*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)); } int LAGraph_RichClubCoefficient @@ -108,7 +110,6 @@ int LAGraph_RichClubCoefficient char *msg ) { - return (GrB_NOT_IMPLEMENTED) ; //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- @@ -123,33 +124,18 @@ int LAGraph_RichClubCoefficient //degrees of nodes. GrB_Vector degrees = NULL; - //contains the number of edges for which the ith node is - //the smallest degree node in the pair - GrB_Vector edge_gt_deg = NULL; - - //contains the number of edges for which the ith node is - //the same degree as the other node in the pair - //used to correct for undercounted nodes - GrB_Vector edge_eq_deg = NULL; - - //Combines edge_gt_deg and edge_eq_deg to - // account for double counting in edge_eq_deg - GrB_Vector edge_adjusted_deg = NULL; + // contains the number of edges for which the ith node is + // the smallest degree node * 2 + # edges w/ same degree as the other node + // to account for double counting of edges w/ same degree as the other node. + GrB_Vector node_edges = NULL; - //the ith entry contains the number of nodes with degree greater than i. - GrB_Vector cumulative_deg = NULL; - - // the ith entry contains the number of edges whos lowest degree is i. + // the ith entry contains the number of edges whose lowest degree is i. GrB_Vector edges_per_deg = NULL; - //the ith entry contains twice the number of edges among - // nodes with degree greater than i. - GrB_Vector cumulative_edges = NULL; - - // 2x+y - GrB_BinaryOp two_one = NULL; + // the ith entry contains the number of verticies whose degree is i. + GrB_Vector verts_per_deg = NULL; - // 2 * (x > y) + (x == y) + // 2 * (x < y) + (x == y) GrB_BinaryOp iseq_2lt = NULL; // [+].[iseq_2lt] @@ -166,19 +152,11 @@ int LAGraph_RichClubCoefficient GrB_Index deg_vec_size; bool iso = false; - //TODO: YOU STILL HAVE TO GRBFREE THIS WITH A LOOP? - //Should the arrays be initialized before fed to the function? - GrB_Index *index_edge = NULL; // does this need to be null to start with? + GrB_Index *index_edge = NULL; - uint64_t *edge_count_per_node = NULL, *deg_arr = NULL, + uint64_t *node_edges_arr = NULL, *deg_arr = NULL, *edges_per_deg_arr = NULL, *cumul_array = NULL, *ones = NULL, - *ramp = NULL; - - //TODO: YOU STILL HAVE TO GRBFREE THIS WITH A LOOP? - GrB_Index **index_degree = NULL; // does this need to be null to start with? - void **degree_array = NULL; - - + *deg_vertex_count = NULL; //-------------------------------------------------------------------------- // Check inputs @@ -193,7 +171,7 @@ int LAGraph_RichClubCoefficient LG_ASSERT_MSG (G->out_degree != NULL, GrB_EMPTY_OBJECT, "G->out_degree must be defined") ; LG_ASSERT_MSG (G->nself_edges == 0, GrB_INVALID_VALUE, - "G->nself_edges must be zero") ; // Probably overkill + "G->nself_edges must be zero") ; //-------------------------------------------------------------------------- // Initializations @@ -202,104 +180,130 @@ int LAGraph_RichClubCoefficient GRB_TRY(GrB_Matrix_nrows (&n, A)) ; GRB_TRY(GrB_Matrix_new(&D, GrB_UINT64, n, n)) GRB_TRY(GrB_Matrix_new(&edge_degrees, GrB_UINT64,n,n)) ; + + GRB_TRY(GrB_Vector_new(°rees, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(&edge_gt_deg, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(&edge_eq_deg, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(&cumulative_deg, GrB_UINT64, n)) ; + GRB_TRY(GrB_Vector_new(&node_edges, GrB_UINT64, n)) ; GRB_TRY(GrB_Vector_new(&edges_per_deg, GrB_UINT64, n)) ; - - GRB_TRY(GxB_BinaryOp_new( - &two_one, (LAGraph_binary_function) (&two_one_add), - GrB_UINT64, GrB_UINT64, GrB_UINT64, "two_one_add", TWO_ONE_ADD)) ; + GRB_TRY(GrB_Vector_new(&verts_per_deg, GrB_UINT64, n)) ; + GRB_TRY(GrB_Vector_new(rich_club_coefficents, GrB_FP64, n)) ; + GRB_TRY(GxB_BinaryOp_new( &iseq_2lt, (LAGraph_binary_function) (&iseq_2islt), GrB_UINT64, GrB_UINT64, GrB_UINT64, "iseq_2islt", ISEQ_2ISLT)) ; GRB_TRY(GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_UINT64, iseq_2lt)) ; GRB_TRY(GxB_BinaryOp_new( &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), - GrB_UINT64, GrB_UINT64, GrB_UINT64, + GrB_FP64, GrB_UINT64, GrB_UINT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; + // degrees = G->out_degree GRB_TRY (GrB_assign( degrees, NULL, NULL, G->out_degree, GrB_ALL, n, NULL)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; + //-------------------------------------------------------------------------- + // Calculating time + //-------------------------------------------------------------------------- + + // QUESTION: does this Mask help out GBLAS? // Each edge in the graph gets the value of the degree of its column node GRB_TRY (GrB_mxm( - edge_degrees, NULL, NULL, GxB_ANY_SECOND_UINT64,A,D, GrB_NULL)) ; - /* - // QUESTION: Mentioned GxB would be slower than JIT correct? + edge_degrees, A, NULL, GxB_ANY_FIRST_UINT64,D,A, GrB_DESC_S)) ; - // Counts the edges for which its row node is the node of smallest degree. - // Simply, this edge would be removed from the graph once this node - // is of degree < k. - GRB_TRY(GrB_vxm( - edge_gt_deg, NULL, NULL, GxB_PLUS_ISLT_UINT64, - degrees, edge_degrees, GrB_NULL)) ; - - // Counts the edges for which its row node and col nodes have equal degree. - // Simply, this edge would be removed from the graph once this node - // is of degree < k. - GRB_TRY(GrB_vxm( - edge_eq_deg, NULL, NULL, GxB_PLUS_ISEQ_UINT64, - degrees, edge_degrees, GrB_NULL)) ; - - - // QUESTION: Is JIT faster or should I use accum as seen below? + // QUESTION: Is it not more fficient to simply use min here and then count up? + GRB_TRY(GrB_mxm( + edge_degrees, NULL, NULL, plus_2le, edge_degrees, D, GrB_NULL)) ; // If the nodes of an edge have different degrees, the edge is counted once. // If they have the same degree, that edge is double counted. So, we adjust: - // edge_adjusted_deg = 2 * edge_gt_deg + edge_eq_deg + GRB_TRY(GrB_Matrix_reduce_Monoid( + node_edges, NULL, NULL, GrB_PLUS_MONOID_UINT64, edge_degrees, NULL)) ; - GRB_TRY(GrB_eWiseMult( - edge_adjusted_deg, NULL, NULL, two_one, - edge_gt_deg, edge_eq_deg, GrB_NULL)); - */ - - // If the nodes of an edge have different degrees, the edge is counted once. - // If they have the same degree, that edge is double counted. So, we adjust: - // edge_adjusted_deg = 2 * (x > y) + (x == y) - GRB_TRY(GrB_vxm( - edge_adjusted_deg, NULL, NULL, plus_2le, - degrees, edge_degrees, GrB_NULL)) ; - - GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, edge_adjusted_deg)); + // The rest of this is indexing the number of edges and number of nodes at + // each degree and then doing a cummulative sum to know the amount of edges + // and nodes at degree geq k. + GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, node_edges)); vi_size = (edge_vec_nvals+1)*sizeof(GrB_Index); vx_size = (edge_vec_nvals+1)*sizeof(GrB_UINT64); + // Grab the index and edge count arrays from GBLAS + // Jubled NULL so must return sorted. Needed because arrays with + // # of edges and # of degrees should line up. + GRB_TRY(GxB_Vector_unpack_CSC( - edge_adjusted_deg, &index_edge, (void **) &edge_count_per_node, - &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)); - LG_TRY (LAGraph_Free((void **)&index_edge, NULL)) ; + node_edges, &index_edge, (void **) &node_edges_arr, + &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)) ; + LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + //TODO: adjust degrees over by one GRB_TRY(GxB_Vector_unpack_CSC( degrees, &index_edge, (void **) °_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)); + &vi_size,&vx_size,&iso,°_vec_size,NULL, GrB_NULL)) ; LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - //Build with degrees as indecies and handle duplicates via adition + // TODO change what this throws + LG_ASSERT (edge_vec_nvals == deg_vec_size, GrB_NULL_POINTER) ; + + // Build with degrees as indecies and handle duplicates via adition GRB_TRY(GrB_Vector_build ( - edges_per_deg, deg_arr, edge_count_per_node, n, GrB_PLUS_INT64)) ; + edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, + GrB_PLUS_UINT64)) ; + // TODO: Make ones array in a better way + LG_TRY( + LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(u_int64_t), NULL)) ; + for(uint64_t i = 0; i < deg_vec_size; ++i) + ones[i] = 1; - // Start ones. Do I do this by building an iso vector? or by myself? - // QUESTION: I want to do the following. I should duplicate deg_arr memory correct? - // This is safe. build doesn't take ur mem GRB_TRY(GrB_Vector_build ( - cumulative_deg, deg_arr, ones, n, GrB_PLUS_INT64)) ; + verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_UINT64)) ; + + GrB_Index *epd_index = NULL, *vpd_index = NULL; GRB_TRY(GxB_Vector_unpack_CSC( - edges_per_deg, &index_edge, (void **)&edges_per_deg_arr, - &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, GrB_NULL)); - + edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, + &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, GrB_NULL)) ; + GRB_TRY(GxB_Vector_unpack_CSC( + verts_per_deg, &vpd_index, (void **)°_vertex_count, + &vi_size, &vx_size, &iso, °_vec_size, NULL, GrB_NULL)) ; + + //run a cummulative sum (backwards) on deg_vertex_count + for(uint64_t i = deg_vec_size - 1; i > 0; --i) + { + deg_vertex_count[i-1]+=deg_vertex_count[i]; + } + //run a cummulative sum (backwards) on edges_per_deg_arr - // for loops - for(uint64_t i = edge_vec_nvals; i > 1; i--) + for(uint64_t i = edge_vec_nvals - 1; i > 0; --i) { edges_per_deg_arr[i-1]+=edges_per_deg_arr[i]; } - //Construct a vector thats has edges_per_deg_arr values but repeated whenever - //index_edge has a skip and put into cumulative edges + + // QUESTION: can I just tell GBLAS the arrays are one smaller than they are? + // prevent division by zero by removing a possible one from the + // verts_per_deg + GrB_Index to_remove = deg_vertex_count[deg_vec_size - 1] == 1? + vpd_index[deg_vec_size - 1]: 0; + printf("Last vertex count is %ld", deg_vertex_count[deg_vec_size - 1]); + //re pack but now we're cummulative + GRB_TRY(GxB_Vector_pack_CSC( + edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, + vi_size, vx_size, false, edge_vec_nvals, NULL, GrB_NULL)); + GRB_TRY(GxB_Vector_pack_CSC( + verts_per_deg, &vpd_index, (void **)°_vertex_count, + vi_size, vx_size, false, deg_vec_size, NULL, GrB_NULL)); + //GxB_Vector_fprint (verts_per_deg, "vpd", GxB_SHORT, stdout); + if(to_remove > 0) + GRB_TRY(GrB_Vector_removeElement(verts_per_deg, to_remove)); + //GxB_Vector_fprint (verts_per_deg, "vpd", GxB_SHORT, stdout); + GRB_TRY(GrB_eWiseMult(*rich_club_coefficents, NULL, NULL, rcCalculation, + edges_per_deg, verts_per_deg, NULL)) ; + //GxB_Vector_fprint (*rich_club_coefficents, "rcc", GxB_SHORT, stdout); + /* The following is not nessesary because we can redefine the output vector + * as sparse vect + //Construct a vector thats has edges_per_deg_arr values but repeated + // whenever index_edge has a skip and put into cumulative edges // ie. [0,1,6,7,10] & [9,7,3,2,0] -> // [9,7,7,7,7,7,3,2,2,2,. . . ] @@ -308,22 +312,11 @@ int LAGraph_RichClubCoefficient for(; i < n; i++) // seems easily parrallelizable but idk if #pragma is enough. { + if(index + 1 +#include +#include +#include +#include +#include + +char msg [LAGRAPH_MSG_LEN] ; +LAGraph_Graph G = NULL ; + +#define LEN 512 +char filename [LEN+1] ; +typedef struct +{ + double *rcc ; // for unweighted matchings, the size of the matching. For weighted, sum of edge weights + uint64_t n; + const char *name ; // matrix file name +} +matrix_info ; +double rcc1[] = {0.08489795918367347, 0.09042553191489362, 0.11806543385490754, 0.15270935960591134, 0.17543859649122806, 0.18681318681318682, 0.3333333333333333, 0.3333333333333333}; +double rcc2[] = {0.048040201005025124, 0.048040201005025124, 0.04842393787117405, 0.04945054945054945, 0.05129490392648287, 0.052702702702702706, 0.05523809523809524, 0.0613164184592756, 0.06755555555555555, 0.07603960396039604, 0.08637747336377473, 0.09183673469387756, 0.09090909090909091, 0.11578947368421053, 0.15555555555555556, 0.16666666666666666, 0.0}; +double rcc3[] = {0.020418922066450775, 0.020418922066450775, 0.020418922066450775, 0.020418922066450775, 0.020683173955750592, 0.02150664338158559, 0.02150664338158559, 0.02150664338158559, 0.02150664338158559, 0.021543516982986302, 0.02175414105479627, 0.02177185436416472, 0.0218052051134787, 0.021857560922981484, 0.02201878369318151, 0.022188402920223206, 0.022804582640104137, 0.02498473901586159, 0.025249731948717845, 0.02596385205080857, 0.027247042660294644, 0.027751420992800303, 0.028748882924051613, 0.030170594138205473, 0.031102722135686933, 0.03269071555292726, 0.03991334958028703, 0.04169452474008947, 0.04259653806582863, 0.044304609453855226, 0.04526841567726286, 0.04650692548781721, 0.049532888465204955, 0.05002586270597798, 0.05063092496587295, 0.05300441583096034, 0.054629398879867785, 0.05653826181371855, 0.059291297964366496, 0.06080825884426539, 0.06422637670884515, 0.06768885564697083, 0.06889041561605802, 0.0701751819478477, 0.07607985994153141, 0.07831153079788616, 0.07894806048652203, 0.08038113301271196, 0.08207037795568796, 0.0836966039974926, 0.08430976691170078, 0.08589112981595826, 0.08725832508207827, 0.10235720633666719, 0.10276089969086451, 0.10358862936809705, 0.10741510741510742, 0.1110049401354954, 0.11278770872986284, 0.11678584477269169, 0.11817043607981033, 0.12116372726010276, 0.1218450408924313, 0.12440239209741634, 0.12798272259582463, 0.13977635782747605, 0.14573643410852713, 0.14652869744786873, 0.1486150774302895, 0.15837726930369062, 0.158866930171278, 0.16537043438184124, 0.16662279547249276, 0.1688366106970758, 0.17170333945410973, 0.17634190936398067, 0.17711727724564694, 0.17787300615583443, 0.1779243342906783, 0.17813492063492065, 0.16556371804990588, 0.16556371804990588, 0.16556371804990588, 0.16556371804990588, 0.16729064039408867, 0.1701346389228886, 0.1989280560709132, 0.20149602618045817, 0.20475808607324245, 0.16666666666666666, 0.16840882694541232, 0.17894736842105263, 0.16666666666666666, 1.0} ; +const matrix_info tests [ ] = +{ + {rcc1, sizeof(rcc1) / sizeof(rcc1[0]), "random_unweighted_general1.mtx"}, + {rcc2, sizeof(rcc2) / sizeof(rcc2[0]), "random_unweighted_general2.mtx"}, + {rcc3, sizeof(rcc3) / sizeof(rcc2[0]), "bcsstk13.mtx"}, + {NULL, 0, ""} +} ; + +void test_RichClubCoefficient (void) +{ + //-------------------------------------------------------------------------- + // start LAGraph + //-------------------------------------------------------------------------- + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL, C = NULL; + GrB_Vector rcc = NULL; + LAGraph_Graph G = NULL ; + GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + + for (int k = 0 ; ; k++) + { + //The following code take from MIS tester + // load the matrix as A + const char *aname = tests [k].name; + if (strlen (aname) == 0) break; + TEST_CASE (aname) ; + snprintf (filename, LEN, LG_DATA_DIR "%s", aname) ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + TEST_MSG ("Loading of valued matrix failed") ; + printf ("\nMatrix: %s\n", aname) ; + const double *ans = tests [k].rcc; + const uint64_t n_ans = tests [k].n; + + // C = structure of A + OK (LAGraph_Matrix_Structure (&C, A, msg)) ; + OK (GrB_free (&A)) ; + + // construct a directed graph G with adjacency matrix C + OK (LAGraph_New (&G, &C, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (C == NULL) ; + + // check if the pattern is symmetric + OK (LAGraph_Cached_IsSymmetricStructure (G, msg)) ; + + if (G->is_symmetric_structure == LAGraph_FALSE) + { + // make the adjacency matrix symmetric + OK (LAGraph_Cached_AT (G, msg)) ; + OK (GrB_eWiseAdd (G->A, NULL, NULL, GrB_LOR, G->A, G->AT, NULL)) ; + G->is_symmetric_structure = LAGraph_TRUE ; + } + G->kind = LAGraph_ADJACENCY_UNDIRECTED ; + + // check for self-edges + OK (LAGraph_Cached_NSelfEdges (G, msg)) ; + if (G->nself_edges != 0) + { + // remove self-edges + printf ("graph has %g self edges\n", (double) G->nself_edges) ; + OK (LAGraph_DeleteSelfEdges (G, msg)) ; + printf ("now has %g self edges\n", (double) G->nself_edges) ; + TEST_CHECK (G->nself_edges == 0) ; + } + + // compute the row degree + OK (LAGraph_Cached_OutDegree (G, msg)) ; + + //---------------------------------------------------------------------- + // test the algorithm + //---------------------------------------------------------------------- + OK(LAGraph_RichClubCoefficient( &rcc, G, msg)); + //---------------------------------------------------------------------- + // check results + //---------------------------------------------------------------------- + double comp_val = 0; + for(uint64_t i = 0; i < n_ans; ++i) + TEST_CHECK (GrB_Vector_extractElement(&comp_val, rcc, i+1) == GrB_NO_VALUE + || comp_val == ans[i]) ; + GxB_Vector_fprint (rcc, "rcc", GxB_SHORT, stdout); + OK (GrB_free (&rcc)) ; + OK (LAGraph_Delete (&G, msg)) ; + } + + //-------------------------------------------------------------------------- + // free everything and finalize LAGraph + //-------------------------------------------------------------------------- + + + + LAGraph_Finalize (msg) ; +} + +//---------------------------------------------------------------------------- +// the make program is created by acutest, and it runs a list of tests: +//---------------------------------------------------------------------------- + +TEST_LIST = +{ + {"RichClubCoefficient", test_RichClubCoefficient}, + {NULL, NULL} +} ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 9ad988c166..bc47c74446 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -290,6 +290,18 @@ int LAGraph_Incidence_Matrix char *msg ) ; +//------------------------------------------------------------------------------ +// LAGraph_RichClubCoefficient: Compute Rich Club Coefficient of Graph +//------------------------------------------------------------------------------ + +LAGRAPHX_PUBLIC +int LAGraph_RichClubCoefficient +( + GrB_Vector *rich_club_coefficents, //output + LAGraph_Graph G, //input graph + char *msg +) ; + //**************************************************************************** // Algorithms //**************************************************************************** From e6cf5fed1626217d8ccf99ee5bdcd905e788a6f4 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 3 Oct 2024 12:53:44 -0500 Subject: [PATCH 009/115] More testing of RCC and setting up cumsum --- .../algorithm/LAGraph_RichClubCoefficient.c | 48 ++++++++++++----- experimental/test/test_RichClubCoefficient.c | 8 +-- experimental/utility/LAGraph_cumsum.c | 52 +++++++++++++++++++ 3 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 experimental/utility/LAGraph_cumsum.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index b8f0426826..ea21756541 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -151,12 +151,11 @@ int LAGraph_RichClubCoefficient GrB_Index edge_vec_nvals; GrB_Index deg_vec_size; bool iso = false; - - GrB_Index *index_edge = NULL; uint64_t *node_edges_arr = NULL, *deg_arr = NULL, *edges_per_deg_arr = NULL, *cumul_array = NULL, *ones = NULL, *deg_vertex_count = NULL; + GrB_Index *index_edge = NULL; //-------------------------------------------------------------------------- // Check inputs @@ -212,7 +211,7 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_mxm( edge_degrees, A, NULL, GxB_ANY_FIRST_UINT64,D,A, GrB_DESC_S)) ; - // QUESTION: Is it not more fficient to simply use min here and then count up? + // QUESTION: Is it not more efficient to simply use min here and then count up? GRB_TRY(GrB_mxm( edge_degrees, NULL, NULL, plus_2le, edge_degrees, D, GrB_NULL)) ; @@ -227,22 +226,43 @@ int LAGraph_RichClubCoefficient GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, node_edges)); vi_size = (edge_vec_nvals+1)*sizeof(GrB_Index); vx_size = (edge_vec_nvals+1)*sizeof(GrB_UINT64); +/* + // Grab the index and edge count arrays from GBLASn with a bitmap incase + // there are empties + //QUESTION: is it worth it to just fill these vectors? + GRB_TRY(GxB_Vector_unpack_Bitmap( + node_edges, &index_edge, (void **) &node_edges_arr, + &vi_size,&vx_size,&iso,&edge_vec_nvals, GrB_NULL)) ; + LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + + //QUESTION: iso edge case + LG_ASSERT (!iso, GrB_NOT_IMPLEMENTED) ; + + GRB_TRY(GxB_Vector_unpack_Bitmap( + degrees, &index_edge, (void **) °_arr, + &vi_size,&vx_size,&iso,°_vec_size, GrB_NULL)) ; + LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + LG_ASSERT (!iso, GrB_NOT_IMPLEMENTED) ; + */ + //CSC unpack QUESTION // Grab the index and edge count arrays from GBLAS - // Jubled NULL so must return sorted. Needed because arrays with + // Jumbled NULL so must return sorted. Needed because arrays with // # of edges and # of degrees should line up. - GRB_TRY(GxB_Vector_unpack_CSC( + GRB_TRY(GxB_Vector_unpack_CSC( node_edges, &index_edge, (void **) &node_edges_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals,NULL, GrB_NULL)) ; + &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - - //TODO: adjust degrees over by one + //QUESTION: better way to adjust degrees over by one? + + GRB_TRY(GrB_assign (degrees, degrees, GrB_MINUS_UINT64, 1, GrB_ALL, 0, GrB_DESC_S)); GRB_TRY(GxB_Vector_unpack_CSC( degrees, &index_edge, (void **) °_arr, - &vi_size,&vx_size,&iso,°_vec_size,NULL, GrB_NULL)) ; + &vi_size,&vx_size,&iso,°_vec_size, NULL, NULL)) ; LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; + // TODO change what this throws LG_ASSERT (edge_vec_nvals == deg_vec_size, GrB_NULL_POINTER) ; @@ -251,6 +271,7 @@ int LAGraph_RichClubCoefficient GRB_TRY(GrB_Vector_build ( edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, GrB_PLUS_UINT64)) ; + // TODO: Make ones array in a better way LG_TRY( LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(u_int64_t), NULL)) ; @@ -263,10 +284,10 @@ int LAGraph_RichClubCoefficient GrB_Index *epd_index = NULL, *vpd_index = NULL; GRB_TRY(GxB_Vector_unpack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, - &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, GrB_NULL)) ; + &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, NULL)) ; GRB_TRY(GxB_Vector_unpack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, - &vi_size, &vx_size, &iso, °_vec_size, NULL, GrB_NULL)) ; + &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL)) ; //run a cummulative sum (backwards) on deg_vertex_count for(uint64_t i = deg_vec_size - 1; i > 0; --i) @@ -281,6 +302,7 @@ int LAGraph_RichClubCoefficient } // QUESTION: can I just tell GBLAS the arrays are one smaller than they are? + // Feels unsafe but it will just deallocate with a delete[] no? // prevent division by zero by removing a possible one from the // verts_per_deg GrB_Index to_remove = deg_vertex_count[deg_vec_size - 1] == 1? @@ -289,10 +311,10 @@ int LAGraph_RichClubCoefficient //re pack but now we're cummulative GRB_TRY(GxB_Vector_pack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, - vi_size, vx_size, false, edge_vec_nvals, NULL, GrB_NULL)); + vi_size, vx_size, false, edge_vec_nvals, NULL, NULL)); GRB_TRY(GxB_Vector_pack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, - vi_size, vx_size, false, deg_vec_size, NULL, GrB_NULL)); + vi_size, vx_size, false, deg_vec_size, NULL, NULL)); //GxB_Vector_fprint (verts_per_deg, "vpd", GxB_SHORT, stdout); if(to_remove > 0) GRB_TRY(GrB_Vector_removeElement(verts_per_deg, to_remove)); diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index bb65b57cfc..f857308e1e 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -116,9 +116,11 @@ void test_RichClubCoefficient (void) // check results //---------------------------------------------------------------------- double comp_val = 0; - for(uint64_t i = 0; i < n_ans; ++i) - TEST_CHECK (GrB_Vector_extractElement(&comp_val, rcc, i+1) == GrB_NO_VALUE - || comp_val == ans[i]) ; + for(int64_t i = n_ans - 1; i >= 0; --i) + { + GrB_Vector_extractElement(&comp_val, rcc, i) ; + TEST_CHECK (comp_val == ans[i]) ; + } GxB_Vector_fprint (rcc, "rcc", GxB_SHORT, stdout); OK (GrB_free (&rcc)) ; OK (LAGraph_Delete (&G, msg)) ; diff --git a/experimental/utility/LAGraph_cumsum.c b/experimental/utility/LAGraph_cumsum.c new file mode 100644 index 0000000000..2245107202 --- /dev/null +++ b/experimental/utility/LAGraph_cumsum.c @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// LAGraph_cumsum: check two vectors for exact equality +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A. Davis, Texas A&M University + +//------------------------------------------------------------------------------ + + +//TODO +#define LG_FREE_WORK ; + +#include "LAGraphX.h" +#include "LG_internal.h" + +int LAGraph_cumsum +( + // output: + GrB_Vector A, // Vector to run cumsum on + // input: + bool invert, // if true invert the sum + char *msg +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + LG_CLEAR_MSG ; + LG_ASSERT (A != NULL, GrB_NULL_POINTER) ; + //-------------------------------------------------------------------------- + // check for NULL and aliased vectors + //-------------------------------------------------------------------------- + + + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + LG_FREE_WORK ; + return (GrB_SUCCESS) ; +} From f9ed6f17a489f47d3b353ea290ea00d84a432001 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 3 Oct 2024 13:01:30 -0500 Subject: [PATCH 010/115] Comment changes to RCC --- experimental/algorithm/LAGraph_RichClubCoefficient.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index ea21756541..498513a213 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -19,11 +19,10 @@ // to normalize the coefficients in a graph. // Given a Symetric Graph with no self edges, LAGraph_RichClubCoefficient will -// first randomized edges without changing the degree pattern and will then -// calculate the rich club coefficients of the resulting graph. +// calculate the rich club coefficients of the graph. -// The values will be output as a dense GrB_Vector, the rich club coefficient -// of the kth degree found at entry k. +// The values will be output as a sparse GrB_Vector, the rich club coefficient +// of k will be found at the closeste entry at or above k. // References: @@ -255,7 +254,7 @@ int LAGraph_RichClubCoefficient &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; //QUESTION: better way to adjust degrees over by one? - + GRB_TRY(GrB_assign (degrees, degrees, GrB_MINUS_UINT64, 1, GrB_ALL, 0, GrB_DESC_S)); GRB_TRY(GxB_Vector_unpack_CSC( degrees, &index_edge, (void **) °_arr, From 02d9cbacb1850df01d45935562a878b5e421cb49 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 3 Oct 2024 16:15:00 -0500 Subject: [PATCH 011/115] minor updates to burble --- .../algorithm/LAGraph_RichClubCoefficient.c | 4 +- experimental/test/test_RichClubCoefficient.c | 55 +++++++++++++++++-- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 498513a213..7b45ed896b 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -208,7 +208,7 @@ int LAGraph_RichClubCoefficient // QUESTION: does this Mask help out GBLAS? // Each edge in the graph gets the value of the degree of its column node GRB_TRY (GrB_mxm( - edge_degrees, A, NULL, GxB_ANY_FIRST_UINT64,D,A, GrB_DESC_S)) ; + edge_degrees, NULL, NULL, GxB_ANY_FIRST_UINT64,D,A, NULL)) ; // QUESTION: Is it not more efficient to simply use min here and then count up? GRB_TRY(GrB_mxm( @@ -340,4 +340,4 @@ int LAGraph_RichClubCoefficient */ LG_FREE_WORK ; return (GrB_SUCCESS) ; -} \ No newline at end of file +} diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index f857308e1e..5b3da866b4 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -35,9 +35,51 @@ typedef struct const char *name ; // matrix file name } matrix_info ; -double rcc1[] = {0.08489795918367347, 0.09042553191489362, 0.11806543385490754, 0.15270935960591134, 0.17543859649122806, 0.18681318681318682, 0.3333333333333333, 0.3333333333333333}; -double rcc2[] = {0.048040201005025124, 0.048040201005025124, 0.04842393787117405, 0.04945054945054945, 0.05129490392648287, 0.052702702702702706, 0.05523809523809524, 0.0613164184592756, 0.06755555555555555, 0.07603960396039604, 0.08637747336377473, 0.09183673469387756, 0.09090909090909091, 0.11578947368421053, 0.15555555555555556, 0.16666666666666666, 0.0}; -double rcc3[] = {0.020418922066450775, 0.020418922066450775, 0.020418922066450775, 0.020418922066450775, 0.020683173955750592, 0.02150664338158559, 0.02150664338158559, 0.02150664338158559, 0.02150664338158559, 0.021543516982986302, 0.02175414105479627, 0.02177185436416472, 0.0218052051134787, 0.021857560922981484, 0.02201878369318151, 0.022188402920223206, 0.022804582640104137, 0.02498473901586159, 0.025249731948717845, 0.02596385205080857, 0.027247042660294644, 0.027751420992800303, 0.028748882924051613, 0.030170594138205473, 0.031102722135686933, 0.03269071555292726, 0.03991334958028703, 0.04169452474008947, 0.04259653806582863, 0.044304609453855226, 0.04526841567726286, 0.04650692548781721, 0.049532888465204955, 0.05002586270597798, 0.05063092496587295, 0.05300441583096034, 0.054629398879867785, 0.05653826181371855, 0.059291297964366496, 0.06080825884426539, 0.06422637670884515, 0.06768885564697083, 0.06889041561605802, 0.0701751819478477, 0.07607985994153141, 0.07831153079788616, 0.07894806048652203, 0.08038113301271196, 0.08207037795568796, 0.0836966039974926, 0.08430976691170078, 0.08589112981595826, 0.08725832508207827, 0.10235720633666719, 0.10276089969086451, 0.10358862936809705, 0.10741510741510742, 0.1110049401354954, 0.11278770872986284, 0.11678584477269169, 0.11817043607981033, 0.12116372726010276, 0.1218450408924313, 0.12440239209741634, 0.12798272259582463, 0.13977635782747605, 0.14573643410852713, 0.14652869744786873, 0.1486150774302895, 0.15837726930369062, 0.158866930171278, 0.16537043438184124, 0.16662279547249276, 0.1688366106970758, 0.17170333945410973, 0.17634190936398067, 0.17711727724564694, 0.17787300615583443, 0.1779243342906783, 0.17813492063492065, 0.16556371804990588, 0.16556371804990588, 0.16556371804990588, 0.16556371804990588, 0.16729064039408867, 0.1701346389228886, 0.1989280560709132, 0.20149602618045817, 0.20475808607324245, 0.16666666666666666, 0.16840882694541232, 0.17894736842105263, 0.16666666666666666, 1.0} ; + +double rcc1[] = {0.08489795918367347, 0.09042553191489362, 0.11806543385490754, +0.15270935960591134, 0.17543859649122806, 0.18681318681318682, +0.3333333333333333, 0.3333333333333333}; + +double rcc2[] = {0.048040201005025124, 0.048040201005025124, +0.04842393787117405, 0.04945054945054945, 0.05129490392648287, +0.052702702702702706, 0.05523809523809524, 0.0613164184592756, +0.06755555555555555, 0.07603960396039604, 0.08637747336377473, +0.09183673469387756, 0.09090909090909091, 0.11578947368421053, +0.15555555555555556, 0.16666666666666666, 0.0}; + +double rcc3[] = {0.020418922066450775, 0.020418922066450775, +0.020418922066450775, 0.020418922066450775, 0.020683173955750592, +0.02150664338158559, 0.02150664338158559, 0.02150664338158559, +0.02150664338158559, 0.021543516982986302, 0.02175414105479627, +0.02177185436416472, 0.0218052051134787, 0.021857560922981484, +0.02201878369318151, 0.022188402920223206, 0.022804582640104137, +0.02498473901586159, 0.025249731948717845, 0.02596385205080857, +0.027247042660294644, 0.027751420992800303, 0.028748882924051613, +0.030170594138205473, 0.031102722135686933, 0.03269071555292726, +0.03991334958028703, 0.04169452474008947, 0.04259653806582863, +0.044304609453855226, 0.04526841567726286, 0.04650692548781721, +0.049532888465204955, 0.05002586270597798, 0.05063092496587295, +0.05300441583096034, 0.054629398879867785, 0.05653826181371855, +0.059291297964366496, 0.06080825884426539, 0.06422637670884515, +0.06768885564697083, 0.06889041561605802, 0.0701751819478477, +0.07607985994153141, 0.07831153079788616, 0.07894806048652203, +0.08038113301271196, 0.08207037795568796, 0.0836966039974926, +0.08430976691170078, 0.08589112981595826, 0.08725832508207827, +0.10235720633666719, 0.10276089969086451, 0.10358862936809705, +0.10741510741510742, 0.1110049401354954, 0.11278770872986284, +0.11678584477269169, 0.11817043607981033, 0.12116372726010276, +0.1218450408924313, 0.12440239209741634, 0.12798272259582463, +0.13977635782747605, 0.14573643410852713, 0.14652869744786873, +0.1486150774302895, 0.15837726930369062, 0.158866930171278, +0.16537043438184124, 0.16662279547249276, 0.1688366106970758, +0.17170333945410973, 0.17634190936398067, 0.17711727724564694, +0.17787300615583443, 0.1779243342906783, 0.17813492063492065, +0.16556371804990588, 0.16556371804990588, 0.16556371804990588, +0.16556371804990588, 0.16729064039408867, 0.1701346389228886, +0.1989280560709132, 0.20149602618045817, 0.20475808607324245, +0.16666666666666666, 0.16840882694541232, 0.17894736842105263, +0.16666666666666666, 1.0} ; + const matrix_info tests [ ] = { {rcc1, sizeof(rcc1) / sizeof(rcc1[0]), "random_unweighted_general1.mtx"}, @@ -55,7 +97,6 @@ void test_RichClubCoefficient (void) GrB_Matrix A = NULL, C = NULL; GrB_Vector rcc = NULL; LAGraph_Graph G = NULL ; - GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; for (int k = 0 ; ; k++) { @@ -111,7 +152,13 @@ void test_RichClubCoefficient (void) //---------------------------------------------------------------------- // test the algorithm //---------------------------------------------------------------------- + + printf ("RCC computation begins:\n") ; + GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; OK(LAGraph_RichClubCoefficient( &rcc, G, msg)); + GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + printf ("RCC computation ends:\n") ; + //---------------------------------------------------------------------- // check results //---------------------------------------------------------------------- From be452a8a6de7ca3430aed692c80837a858264968 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 10 Oct 2024 13:57:31 -0500 Subject: [PATCH 012/115] Preliminary testing for SwapEdges --- experimental/algorithm/LAGraph_SwapEdges.c | 279 +++++++++++-------- experimental/benchmark/rcc_demo[WIP].c | 117 ++++++++ experimental/test/test_RichClubCoefficient.c | 2 +- experimental/test/test_SwapEdges.c | 130 +++++++++ include/LAGraphX.h | 14 + 5 files changed, 423 insertions(+), 119 deletions(-) create mode 100644 experimental/benchmark/rcc_demo[WIP].c create mode 100644 experimental/test/test_SwapEdges.c diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 0238ab35c4..1bd28b2ee2 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -15,48 +15,46 @@ //------------------------------------------------------------------------------ - -#define LG_FREE_WORK \ -{ \ - /* free any workspace used here */ \ - GrB_free (&E) ; \ - GrB_free (&E_t) ; \ - GrB_free (E_arranged) ; \ - GrB_free (E_arranged + 1) ; \ - GrB_free (E_arranged + 2) ; \ - GrB_free (&pairs) ; \ - GrB_free (&pairs_4s) ; \ - GrB_free (&pairs_i) ; \ - GrB_free (&pairs_new) ; \ - GrB_free (&M) ; \ - GrB_free (&M_fours) ; \ - GrB_free (&M_i) ; \ - GrB_free (&M_t) ; \ - GrB_free (&interf) ; \ - GrB_free (&M_1) ; \ - GrB_free (&M_2) ; \ - GrB_free (&exists) ; \ - GrB_free (&E_half) ; \ - GrB_free (&A_tril) ; \ - GrB_free (&random_v) ; \ - GrB_free (&r_permute) ; \ - GrB_free (&r_sorted) ; \ - GrB_free (&swapVals) ; \ - GrB_free (&ramp_v) ; \ - GrB_free (&hramp_v) ; \ - /* row_indices) ; - col_indices) ; - void *values) ; - GrB_Index *ramp) ; - GrB_Index *half_ramp) ; - GrB_Index *edge_perm) ; - uint8_t *swap_type) ; */ \ - GrB_free (&M_outdeg) ; \ - GrB_free (&r_interf) ; \ - GrB_free (&r_exists) ; \ - GrB_free (&r_pairs) ; \ - GrB_free (&x) ; \ - GrB_free (&first_bit) ; \ +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + GrB_free (&E) ; \ + GrB_free (&E_t) ; \ + GrB_free (E_arranged) ; \ + GrB_free (E_arranged + 1) ; \ + GrB_free (E_arranged + 2) ; \ + GrB_free (&pairs) ; \ + GrB_free (&pairs_4s) ; \ + GrB_free (&pairs_i) ; \ + GrB_free (&pairs_new) ; \ + GrB_free (&M) ; \ + GrB_free (&M_fours) ; \ + GrB_free (&M_i) ; \ + GrB_free (&M_t) ; \ + GrB_free (&interf) ; \ + GrB_free (&M_1) ; \ + GrB_free (&M_2) ; \ + GrB_free (&exists) ; \ + GrB_free (&E_half) ; \ + GrB_free (&A_tril) ; \ + GrB_free (&random_v) ; \ + GrB_free (&r_permute) ; \ + GrB_free (&r_sorted) ; \ + GrB_free (&swapVals) ; \ + GrB_free (&ramp_v) ; \ + GrB_free (&hramp_v) ; \ + LAGraph_Free((void**)&row_indices, msg) ; \ + LAGraph_Free((void**)&values, msg) ; \ + LAGraph_Free((void**)&ramp, msg) ; \ + LAGraph_Free((void**)&half_ramp, msg) ; \ + LAGraph_Free((void**)&edge_perm, msg) ; \ + LAGraph_Free((void**)&swap_type, msg) ; \ + GrB_free (&M_outdeg) ; \ + GrB_free (&r_interf) ; \ + GrB_free (&r_exists) ; \ + GrB_free (&r_pairs) ; \ + GrB_free (&x) ; \ + GrB_free (&first_bit) ; \ } #define LG_FREE_ALL \ @@ -64,6 +62,7 @@ /* free any workspace used here */ \ LG_FREE_WORK ; \ /* free all the output variable(s) */ \ + GrB_free(A_new) ; \ /* take any other corrective action */ \ } @@ -71,28 +70,28 @@ #include "LAGraphX.h" void first_bit_equals - (bool *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *bit) + (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit) { (*z) = ((*x) & 1) == (*bit); } #define FIRST_BIT_EQ \ "void first_bit_equals" \ - "(bool *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *bit)" \ + "(uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit)" \ "{" \ "(*z) = ((*x) & 1) == (*bit);" \ "}" // creates [0,3,1,2,1,3,. . .] pattern from random vector. void swap_pattern - (uint8_t *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *y) + (uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y) { (*z) = ((i % 2) * 2) | (*x & 1); } #define SWAP_PAT \ "void swap_pattern" \ - "(uint8_t *z, const uint8_t *x, GrB_Index i, GrB_Index j, const uint8_t *y)"\ + "(uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y)"\ "{" \ - "(*z) = ((i \% 2) * 2) | (*x & 1);" \ + "(*z) = ((i % 2) * 2) | (*x & 1);" \ "}" int LAGraph_SwapEdges @@ -105,7 +104,6 @@ int LAGraph_SwapEdges char *msg ) { - return (GrB_NOT_IMPLEMENTED) ; //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- @@ -119,9 +117,7 @@ int LAGraph_SwapEdges // swaps x e // Selected pairs for next batch of swaps // Each row contains 2 entries for the edges involved in a swap. - GrB_Matrix pairs = NULL; - GrB_Matrix pairs_4s = NULL; - GrB_Matrix pairs_i = NULL; + GrB_Matrix pairs = NULL, pairs_4s = NULL, pairs_i = NULL; GrB_Matrix pairs_new = NULL; // swaps x n @@ -185,36 +181,42 @@ int LAGraph_SwapEdges GrB_IndexUnaryOp first_bit = NULL; GrB_IndexUnaryOp swap_op = NULL; + //GrB_Type_Code type; + A = G->A ; //-------------------------------------------------------------------------- // Check inputs TODO //-------------------------------------------------------------------------- - - + LG_ASSERT_MSG ( + G->kind == LAGraph_ADJACENCY_UNDIRECTED, + LAGRAPH_INVALID_GRAPH, + "G must be undirected" + ) ; + + LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, + "G->nself_edges must be zero") ; + /* GRB_TRY (GrB_get(A, (void*)&type, GrB_EL_TYPE_CODE)) ; + LG_ASSERT_MSG (type == GrB_BOOL_CODE, LAGRAPH_INVALID_GRAPH, + "A must be type boolean") ; */ //-------------------------------------------------------------------------- // Initializations //-------------------------------------------------------------------------- - - A = G->A ; - - char typename[LAGRAPH_MAX_NAME_LEN] ; - GrB_Type type ; - LG_TRY (LAGraph_Matrix_TypeName (typename, A, msg)) ; - LG_TRY (LAGraph_TypeFromName (&type, typename, msg)) ; - + LAGRAPH_TRY(LAGraph_Random_Init(msg)) ; + + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY (GrB_Matrix_nvals(&nvals, A)) ; e = nvals / 2 ; GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&E_t, GrB_UINT8, e, n)) ; - GRB_TRY (GrB_Matrix_new (&A_tril, type, n, n)) ; + GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; GRB_TRY (GxB_IndexUnaryOp_new ( - &first_bit, (void *) first_bit_equals, GrB_BOOL, GrB_UINT8, GrB_UINT8, + &first_bit, (void *) first_bit_equals, GrB_UINT8, GrB_UINT8, GrB_BOOL, "first_bit", FIRST_BIT_EQ)); GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_op, (void *) swap_type, GrB_UINT8, GrB_UINT64, GrB_UINT64, + &swap_op, (void *) swap_pattern, GrB_UINT8, GrB_UINT64, GrB_UINT8, "swap_op", SWAP_PAT)); GrB_Index num_swaps = 0, num_attempts = 0; @@ -235,7 +237,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new (&x, GrB_INT64, n)) ; + GRB_TRY (GrB_Vector_new (&x, GrB_UINT8, n)) ; GRB_TRY (GrB_Vector_new (&r_pairs, GrB_INT64, e)) ; @@ -246,11 +248,11 @@ int LAGraph_SwapEdges // QUESTION: can't I just use an unpack and use the arrays GBLAS allocated? LG_TRY (LAGraph_Malloc ((void**)(&row_indices), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&col_indices), e, sizeof(GrB_Index), msg)) ; - LG_TRY (LAGraph_Malloc ((void**)(&values), e, sizeof(type), msg)) ; + LG_TRY (LAGraph_Malloc ((void**)(&values), e, sizeof(bool), msg)) ; GRB_TRY ( - GrB_Matrix_extractTuples (row_indices, col_indices, values, &e, A_tril) + GrB_Matrix_extractTuples_BOOL (row_indices, col_indices, values, &e, A_tril) ) ; - + printf ("Extracted\n") ; /* LG_TRY (LAGraph_Malloc ((void**)(&ramp), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&half_ramp), e, sizeof(GrB_Index), msg)) ; @@ -266,6 +268,28 @@ int LAGraph_SwapEdges { half_ramp[i] = i / 2; } */ + //Make Ramps + // QUESTION: I don't want to rebuild ramp every time, so do I just build one + // that is too large and use as needed? + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT8, e)) ; + GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + //This gives back 1 index; + GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, + GrB_ROWINDEX_INT64, ramp_v, 1, NULL)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + ramp_v, NULL, NULL, GrB_MINUS_UINT64, ramp_v, 1UL, NULL)) ; + + //QUESTION: Is this correct? + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; + + GrB_Index ramp_size; + GRB_TRY (GxB_Vector_unpack_Full ( + ramp_v, (void **)&ramp, &ramp_size, &iso, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full ( + hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; GrB_Scalar zero8 ; GrB_Scalar one8 ; @@ -281,31 +305,19 @@ int LAGraph_SwapEdges // if it has to be used GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_UINT8, E, E_half, NULL)) ; - GRB_TRY (GrB_Vector_assign (x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; - GRB_TRY (GrB_Vector_assign (random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + GRB_TRY (GrB_Vector_assign_UINT8 ( + x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_Vector_assign_UINT64 ( + random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + - // QUESTION: I don't want to rebuild ramp every time, so do I just build one - // that is too large and use as needed? - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; - // TODO: - // GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_assign (ramp_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, - GrB_ROWINDEX_INT64, random_v, 1, NULL)) ; - //QUESTION: Is this correct? - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - ramp_v, (void **)&ramp, NULL, NULL, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - hramp_v, (void **)&half_ramp, NULL, NULL, NULL)) ; //TODO: Change seed LG_TRY( - LAGraph_Random_Seed(random_v, 15489451345495616ul, msg)); + LAGraph_Random_Seed(random_v, 1548945616ul, msg)); + printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, swaps_per_loop, e)) ; @@ -323,15 +335,24 @@ int LAGraph_SwapEdges r_sorted, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; // TODO change this vect name - GrB_Vector_apply(r_sorted, NULL, NULL, swap_op, r_sorted, NULL) ; + GRB_TRY(GrB_Vector_apply_IndexOp_UINT8(swapVals, NULL, NULL, swap_op, + r_sorted, (uint8_t) 0, NULL)) ; // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap // Also // TODO: handle memory // TODO: try and make this more efficient maybe just rand % e rather // than a permutation + + GrB_Index perm_size, swap_size; + GRB_TRY (GxB_Vector_unpack_Full( + r_permute, (void **)&edge_perm, &perm_size, &iso, NULL + )) ; + uint8_t *swaps = NULL; + LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); GRB_TRY (GxB_Vector_unpack_Full( - r_permute, (void **)&edge_perm, NULL, NULL, NULL + swapVals, (void **)&swaps, &swap_size, NULL, NULL )) ; + LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); // Pair edges. Take a random permutation and pair adjacent values. @@ -344,11 +365,19 @@ int LAGraph_SwapEdges // vals[i] += vals[i] > vals[i-1] // I know it will be alot less safe but is it more efficient to pack // pairs as needed? Doubt it. - /* GRB_TRY (GrB_Matrix_build_UINT8( - pairs, edge_perm, half_ramp, vals, swaps_per_loop * 2, NULL - )) ; */ - + GRB_TRY (GrB_Matrix_build_UINT8( + pairs, edge_perm, half_ramp, swaps, swaps_per_loop * 2, NULL + )); + // QUESTION: do I repack just to throw away? + GRB_TRY (GxB_Vector_pack_Full( + r_permute, (void **)&edge_perm, perm_size, false, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full( + swapVals, (void **)&swaps, swap_size, false, NULL + )) ; + GRB_TRY (GrB_free(&r_permute)); + GRB_TRY (GrB_free(&swapVals)); // each row of M will have 4 values [0,1,2,3] // pairs | E | M @@ -358,7 +387,7 @@ int LAGraph_SwapEdges // This gives us randomization as to which type of swap is happening. // M = pairs * E (any_lxor) GRB_TRY (GrB_mxm(M, NULL, NULL, GxB_ANY_LXOR_UINT8, pairs, E, NULL)) ; - + // remove any entries of M with less than 3 values // This is taken from LAGraph_Cached_OutDegree. // TODO: Should there be a function that takes in A matrix and computes @@ -368,15 +397,17 @@ int LAGraph_SwapEdges M, x, NULL)) ; // Q: Do I need a new M with the correct dimension? - // YES TODO + // TODO: if full skip next steps, GRB_TRY (GrB_Vector_select_UINT8( M_outdeg, NULL, NULL, GrB_VALUEEQ_UINT8, M_outdeg, (uint8_t) 4, NULL)) ; - // QUESTION: Can I Null size, Iso, etc? Or is that memory also my responsibility now? - bool iso; + + GrB_Index arr_size, junk_size; GRB_TRY (GxB_Vector_unpack_CSC( - M_outdeg, &arr_keep, &junk, NULL, NULL, &iso, + M_outdeg, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, NULL, NULL)) ; + LG_ASSERT_MSG(iso, GrB_NOT_IMPLEMENTED, "GraphBLAS unexpectedly gave me" + " a matrix that is not iso"); LG_TRY (LAGraph_Free(&junk, msg)); // Remove bad swaps @@ -384,9 +415,12 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, e)) ; GRB_TRY (GrB_Matrix_extract( - M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + M_fours, NULL, NULL, M, arr_keep, arr_size, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_extract( - pairs_4s, NULL, NULL, pairs, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + pairs_4s, NULL, NULL, pairs, arr_keep, arr_size, GrB_ALL, 0, NULL)) ; + + //GRB_TRY (GrB_free(&M)); + //GRB_TRY (GrB_free(&pairs)); LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); // interf = M*MT(plus_one) @@ -400,24 +434,22 @@ int LAGraph_SwapEdges /* GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); */ - GRB_TRY (GrB_Vector_select_UINT8( - r_interf, NULL, NULL, GrB_VALUEGE_UINT8, r_interf, 2, NULL)) ; + GRB_TRY (GrB_Matrix_select_UINT8( + interf, NULL, NULL, GrB_VALUEGE_UINT8, interf, 2, NULL)) ; GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, GrB_DESC_R)); - // TODO: Make vars to grab these null vals GRB_TRY (GxB_Vector_unpack_CSC( - r_interf, &arr_keep, &junk, NULL, NULL, NULL, + r_interf, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, NULL, NULL)) ; LG_TRY (LAGraph_Free(&junk, msg)); - //TODO: free all the vectors you don't need right after you stop using them. // Remove bad swaps GRB_TRY (GrB_Matrix_new(&M_i, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(&pairs_i, GrB_UINT8, n_keep, e)) ; // QUESTION: is it easier to extract on transpose or extract and then remake the transpose? GRB_TRY (GrB_Matrix_extract( - M_i, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + M_i, NULL, NULL, M_fours, arr_keep, arr_size, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_extract( pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; @@ -428,9 +460,9 @@ int LAGraph_SwapEdges // M2 = select M (x & 1 == 1) / 2 GRB_TRY (GrB_Matrix_new(&M_1, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(&M_2, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_select_UINT8( + GRB_TRY (GrB_select( M_1, NULL, NULL, first_bit, M_i, 0, GrB_DESC_R)) ; - GRB_TRY (GrB_Matrix_select_UINT8( + GRB_TRY (GrB_select( M_2, NULL, NULL, first_bit, M_i, 1, GrB_DESC_R)) ; GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( M_1, NULL, NULL, GrB_DIV_UINT8, M_1, 2, NULL)) ; @@ -463,41 +495,47 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign( r_exists, r_exists, NULL, NULL, GrB_ALL, 0, GrB_DESC_SC)) ; GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, NULL, NULL, NULL, &n_keep, + r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, NULL, NULL)) ; LG_TRY (LAGraph_Free(&junk, msg)) ; GRB_TRY (GrB_Matrix_new( E_arranged, GrB_UINT8, e - 2 * n_keep, n)) ; GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; + // TODO: Check if this needs to be transposed I think it does GRB_TRY (GrB_Matrix_extract(E_arranged[1], NULL, NULL, M_1, GrB_ALL, n, - arr_keep, n_keep, NULL)) ; + arr_keep, arr_size, NULL)) ; GRB_TRY (GrB_Matrix_extract(E_arranged[2], NULL, NULL, M_1, GrB_ALL, n, - arr_keep, n_keep, NULL)) ; + arr_keep, arr_size, NULL)) ; GRB_TRY (GrB_Matrix_extract(pairs_new, NULL, NULL, pairs_i, GrB_ALL, n, - arr_keep, n_keep, NULL)) ; + arr_keep, arr_size, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); GrB_Index n_old; GRB_TRY (GrB_Matrix_reduce_Monoid( r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs, GrB_DESC_RT0)); + + //QUESTION: Best way to make these all zero?? GRB_TRY (GrB_Vector_assign( r_pairs, r_pairs, NULL, NULL, GrB_ALL, 0, GrB_DESC_SC)) ; GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, NULL, NULL, NULL, &n_old, + r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_old, NULL, NULL)) ; LG_TRY (LAGraph_Free(&junk, msg)) ; - // Question where do I find these error msgs - LG_ASSERT(n_old == e - 2 * n_keep, 1) ; + + LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, - arr_keep, n_old, GrB_ALL, n, NULL)) ; + arr_keep, arr_size, GrB_ALL, n, NULL)) ; + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); // E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is // pruned GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; + // Free Matricies that have to be rebuilt + // TODO: free all the vectors you don't need right after you stop using them. GrB_free(&pairs) ; GrB_free(&M) ; @@ -530,9 +568,14 @@ int LAGraph_SwapEdges // Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; } + //GrB_free(&random_v); + //LAGraph_Free((void **)&half_ramp, msg); + // QUESTION: how should the values of the matrix be assigned again? - GRB_TRY (GrB_select (*A_new, NULL, NULL, GrB_DIAG, A, 0, NULL)) ; - GRB_TRY (GrB_mxm(*A_new, NULL, NULL, NULL, E, E, GrB_DESC_T0)) ; + //GRB_TRY (GrB_select (*A_new, NULL, NULL, GrB_DIAG, A, 0, NULL)) ; + GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; + GRB_TRY (GrB_mxm( + *A_new, NULL, NULL, LAGraph_any_one_uint8, E, E, GrB_DESC_T0)) ; // GrB_PLUS_INT64 - I rather not give this a type, is that possible? GRB_TRY (GrB_eWiseAdd( diff --git a/experimental/benchmark/rcc_demo[WIP].c b/experimental/benchmark/rcc_demo[WIP].c new file mode 100644 index 0000000000..d8a5c75302 --- /dev/null +++ b/experimental/benchmark/rcc_demo[WIP].c @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/benchmark/rcc_demo.c: a demo for RichClubCoefficient +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +// ./experimental/benchmark/rcc_demo ../data/west0067.mtx +// ./experimental/benchmark/rcc_demo < ../data/west0067.mtx +// ./experimental/benchmark/rcc_demo ../data/karate.mtx +// + +#include "../../src/benchmark/LAGraph_demo.h" +#include "LAGraphX.h" +#include "LG_internal.h" + +// LG_FREE_ALL is required by LG_TRY +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + GrB_free (&Y) ; \ + LAGraph_Delete (&G, msg) ; \ +} + +int main (int argc, char **argv) +{ + + //-------------------------------------------------------------------------- + // startup LAGraph and GraphBLAS + //-------------------------------------------------------------------------- + + char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph + LAGraph_Graph G = NULL ; + GrB_Matrix Y = NULL ; + + // start GraphBLAS and LAGraph + bool burble = false ; // set true for diagnostic outputs + demo_init (burble) ; + LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; + + //-------------------------------------------------------------------------- + // read in the graph: this method is defined in LAGraph_demo.h + //-------------------------------------------------------------------------- + + // readproblem can read in a file in Matrix Market format, or in a binary + // format created by binwrite (see LAGraph_demo.h, or the main program, + // mtx2bin_demo). + + double t = LAGraph_WallClockTime ( ) ; + char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; + LG_TRY (readproblem ( + &G, // the graph that is read from stdin or a file + NULL, // source nodes (none, if NULL) + true, // make the graph undirected, if true + false, // remove self-edges, if true + false, // return G->A as structural, if true, + NULL, // prefered GrB_Type of G->A; null if no preference + false, // ensure all entries are positive, if true + argc, argv)) ; // input to this main program + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to read the graph: %g sec\n", t) ; + + printf ("\n==========================The input graph matrix G:\n") ; + LG_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // try the LAGraph_HelloWorld "algorithm" + //-------------------------------------------------------------------------- + + t = LAGraph_WallClockTime ( ) ; + LG_TRY (LAGraph_HelloWorld (&Y, G, msg)) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for LAGraph_HelloWorld: %g sec\n", t) ; + + //-------------------------------------------------------------------------- + // check the results (make sure Y is a copy of G->A) + //-------------------------------------------------------------------------- + + bool isequal ; + t = LAGraph_WallClockTime ( ) ; + LG_TRY (LAGraph_Matrix_IsEqual (&isequal, Y, G->A, msg)) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to check results: %g sec\n", t) ; + if (isequal) + { + printf ("Test passed.\n") ; + } + else + { + printf ("Test failure!\n") ; + } + + //-------------------------------------------------------------------------- + // print the results (Y is just a copy of G->A) + //-------------------------------------------------------------------------- + + printf ("\n===============================The result matrix Y:\n") ; + LG_TRY (LAGraph_Matrix_Print (Y, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // free everyting and finish + //-------------------------------------------------------------------------- + + LG_FREE_ALL ; + LG_TRY (LAGraph_Finalize (msg)) ; + return (GrB_SUCCESS) ; +} diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 5b3da866b4..20d2252085 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -100,7 +100,7 @@ void test_RichClubCoefficient (void) for (int k = 0 ; ; k++) { - //The following code take from MIS tester + //The following code taken from MIS tester // load the matrix as A const char *aname = tests [k].name; if (strlen (aname) == 0) break; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c new file mode 100644 index 0000000000..fec431df36 --- /dev/null +++ b/experimental/test/test_SwapEdges.c @@ -0,0 +1,130 @@ +//---------------------------------------------------------------------------- +// LAGraph/src/test/test_SwapEdges.c: test cases for LAGraph_HelloWorld +//---------------------------------------------------------------------------- + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +//----------------------------------------------------------------------------- + + + +#include +#include +#include +#include +#include +#include + +char msg [LAGRAPH_MSG_LEN] ; +LAGraph_Graph G = NULL ; + +#define LEN 512 +char filename [LEN+1] ; + +const char* tests [ ] = +{ + "random_unweighted_general1.mtx", + //"random_unweighted_general2.mtx", + //"bcsstk13.mtx", + "" +} ; +void test_SwapEdges (void) +{ + //-------------------------------------------------------------------------- + // start LAGraph + //-------------------------------------------------------------------------- + OK (LAGraph_Init (msg)) ; + GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; + LAGraph_Graph G = NULL ; + + for (int k = 0 ; ; k++) + { + //The following code taken from MIS tester + // load the matrix as A + const char *aname = tests [k]; + if (strlen (aname) == 0) break; + TEST_CASE (aname) ; + snprintf (filename, LEN, LG_DATA_DIR "%s", aname) ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + TEST_MSG ("Loading of valued matrix failed") ; + printf ("\nMatrix: %s\n", aname) ; + + // C = structure of A + OK (LAGraph_Matrix_Structure (&C, A, msg)) ; + OK (GrB_free (&A)) ; + + // construct a directed graph G with adjacency matrix C + OK (LAGraph_New (&G, &C, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (C == NULL) ; + + // check if the pattern is symmetric + OK (LAGraph_Cached_IsSymmetricStructure (G, msg)) ; + + if (G->is_symmetric_structure == LAGraph_FALSE) + { + // make the adjacency matrix symmetric + OK (LAGraph_Cached_AT (G, msg)) ; + OK (GrB_eWiseAdd (G->A, NULL, NULL, GrB_LOR, G->A, G->AT, NULL)) ; + G->is_symmetric_structure = LAGraph_TRUE ; + } + G->kind = LAGraph_ADJACENCY_UNDIRECTED ; + + // check for self-edges + OK (LAGraph_Cached_NSelfEdges (G, msg)) ; + if (G->nself_edges != 0) + { + // remove self-edges + printf ("graph has %g self edges\n", (double) G->nself_edges) ; + OK (LAGraph_DeleteSelfEdges (G, msg)) ; + printf ("now has %g self edges\n", (double) G->nself_edges) ; + TEST_CHECK (G->nself_edges == 0) ; + } + + // compute the row degree + OK (LAGraph_Cached_OutDegree (G, msg)) ; + + //---------------------------------------------------------------------- + // test the algorithm + //---------------------------------------------------------------------- + + printf ("No Swap Basic Test:\n") ; + GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 0, msg)); + GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + printf ("Test ends:\n") ; + + //---------------------------------------------------------------------- + // check results + //---------------------------------------------------------------------- + //bool isEq = false; + //LAGraph_Matrix_IsEqual(&isEq, C, A_new, msg); + OK (GrB_free (&A_new)) ; + //OK (GrB_free (&C_new)) ; + OK (LAGraph_Delete (&G, msg)) ; + } + + //-------------------------------------------------------------------------- + // free everything and finalize LAGraph + //-------------------------------------------------------------------------- + LAGraph_Finalize (msg) ; +} + +//---------------------------------------------------------------------------- +// the make program is created by acutest, and it runs a list of tests: +//---------------------------------------------------------------------------- + +TEST_LIST = +{ + {"SwapEdges", test_SwapEdges}, + {NULL, NULL} +} ; \ No newline at end of file diff --git a/include/LAGraphX.h b/include/LAGraphX.h index bc47c74446..d1c2b995b9 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -302,6 +302,20 @@ int LAGraph_RichClubCoefficient char *msg ) ; +//------------------------------------------------------------------------------ +// LAGraph_SwapEdges: Randomize Graph while maintaining degree sequence. +//------------------------------------------------------------------------------ +LAGRAPHX_PUBLIC +int LAGraph_SwapEdges +( + // output + GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped + // input: not modified + LAGraph_Graph G, + GrB_Index Q, // Swaps per edge + char *msg +); + //**************************************************************************** // Algorithms //**************************************************************************** From 4f8a8f5ecfb919f5538bd87175f1ed7699e48763 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 14 Oct 2024 17:10:54 -0500 Subject: [PATCH 013/115] Swap Edges Tests Passing. Singleton Graphs not working. --- experimental/algorithm/LAGraph_SwapEdges.c | 163 ++++++++++----------- experimental/test/test_SwapEdges.c | 46 ++++-- 2 files changed, 113 insertions(+), 96 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 1bd28b2ee2..ea87e548fa 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -55,6 +55,7 @@ GrB_free (&r_pairs) ; \ GrB_free (&x) ; \ GrB_free (&first_bit) ; \ + GrB_free (&swap_op) ; \ } #define LG_FREE_ALL \ @@ -72,26 +73,26 @@ void first_bit_equals (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit) { - (*z) = ((*x) & 1) == (*bit); + (*z) = (uint8_t) (((*x) & 1) == (*bit)); } #define FIRST_BIT_EQ \ -"void first_bit_equals" \ - "(uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit)" \ - "{" \ - "(*z) = ((*x) & 1) == (*bit);" \ - "}" +"void first_bit_equals \n"\ +" (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit)\n"\ +" { \n"\ +" (*z) = (uint8_t) (((*x) & 1) == (*bit)); \n"\ +" }" // creates [0,3,1,2,1,3,. . .] pattern from random vector. void swap_pattern (uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y) { - (*z) = ((i % 2) * 2) | (*x & 1); + (*z) = (uint8_t) (((i % 2) * 2) | (*x & 1)); } #define SWAP_PAT \ "void swap_pattern" \ - "(uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y)"\ + "(uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y)" \ "{" \ - "(*z) = ((i % 2) * 2) | (*x & 1);" \ + "(*z) = (uint8_t) (((i % 2) * 2) | (*x & 1));" \ "}" int LAGraph_SwapEdges @@ -181,6 +182,8 @@ int LAGraph_SwapEdges GrB_IndexUnaryOp first_bit = NULL; GrB_IndexUnaryOp swap_op = NULL; + + GrB_Semiring any_bxor = NULL; //GrB_Type_Code type; A = G->A ; //-------------------------------------------------------------------------- @@ -208,16 +211,25 @@ int LAGraph_SwapEdges e = nvals / 2 ; GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, e, n)) ; - GRB_TRY (GrB_Matrix_new (&E_t, GrB_UINT8, e, n)) ; + GRB_TRY (GrB_Matrix_new (&E_t, GrB_UINT8, n, e)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &first_bit, (void *) first_bit_equals, GrB_UINT8, GrB_UINT8, GrB_BOOL, - "first_bit", FIRST_BIT_EQ)); - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_op, (void *) swap_pattern, GrB_UINT8, GrB_UINT64, GrB_UINT8, - "swap_op", SWAP_PAT)); + // GRB_TRY (GxB_IndexUnaryOp_new ( + // &first_bit, (void *) first_bit_equals, GrB_UINT8, GrB_UINT8, GrB_BOOL, + // "first_bit", FIRST_BIT_EQ)); + GRB_TRY(GrB_IndexUnaryOp_new( + &first_bit, (void *) first_bit_equals, GrB_UINT8, GrB_UINT8, GrB_BOOL + )); + //GRB_TRY (GxB_IndexUnaryOp_new ( + // &swap_op, (void *) swap_pattern, GrB_UINT8, GrB_UINT64, GrB_UINT8, + // "swap_op", SWAP_PAT)); + GRB_TRY(GrB_IndexUnaryOp_new( + &swap_op, (void *) swap_pattern, GrB_UINT8, GrB_UINT64, GrB_UINT8 + )); + GRB_TRY(GrB_Semiring_new( + &any_bxor, GxB_ANY_UINT8_MONOID ,GrB_BXOR_UINT8 + )); GrB_Index num_swaps = 0, num_attempts = 0; // Q: Should this decrease if edges are interfering alot? @@ -243,6 +255,7 @@ int LAGraph_SwapEdges // Extract adjacency matrix to make incidence matrix - E // get just the lower triangular entries + //TODO: should I remove the diagonal? change the 0 if so GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; // Arrays to extract A into // QUESTION: can't I just use an unpack and use the arrays GBLAS allocated? @@ -252,36 +265,17 @@ int LAGraph_SwapEdges GRB_TRY ( GrB_Matrix_extractTuples_BOOL (row_indices, col_indices, values, &e, A_tril) ) ; - printf ("Extracted\n") ; - /* LG_TRY (LAGraph_Malloc ((void**)(&ramp), e, sizeof(GrB_Index), msg)) ; - LG_TRY (LAGraph_Malloc ((void**)(&half_ramp), e, sizeof(GrB_Index), msg)) ; - - #pragma omp parallel for - for (GrB_Index i = 0 ; i < e ; i++) - { - ramp[i] = i ; - } - #pragma omp parallel for - for (GrB_Index i = 0 ; i < swaps_per_loop * 2 ; i++) - { - half_ramp[i] = i / 2; - } */ - //Make Ramps // QUESTION: I don't want to rebuild ramp every time, so do I just build one // that is too large and use as needed? GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT8, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - //This gives back 1 index; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, - GrB_ROWINDEX_INT64, ramp_v, 1, NULL)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - ramp_v, NULL, NULL, GrB_MINUS_UINT64, ramp_v, 1UL, NULL)) ; - - //QUESTION: Is this correct? + GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + // [0,0,1,1,2,2,...] GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; @@ -305,14 +299,12 @@ int LAGraph_SwapEdges // if it has to be used GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_UINT8, E, E_half, NULL)) ; + GRB_TRY (GrB_Vector_assign_UINT8 ( x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - - - //TODO: Change seed LG_TRY( LAGraph_Random_Seed(random_v, 1548945616ul, msg)); @@ -320,21 +312,20 @@ int LAGraph_SwapEdges printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { - GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, swaps_per_loop, e)) ; - GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, swaps_per_loop, n)) ; - - GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_INT64, swaps_per_loop)) ; - - // Coming into the loop: // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly one 0 and one 1. // They do not have to be randomly assigned. // random_v has a radom dense vector. + + GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, swaps_per_loop, e)) ; + GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, swaps_per_loop, n)) ; + GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_UINT8, swaps_per_loop)) ; + + GRB_TRY (GxB_Vector_sort ( r_sorted, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - // TODO change this vect name GRB_TRY(GrB_Vector_apply_IndexOp_UINT8(swapVals, NULL, NULL, swap_op, r_sorted, (uint8_t) 0, NULL)) ; // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap @@ -342,7 +333,6 @@ int LAGraph_SwapEdges // TODO: handle memory // TODO: try and make this more efficient maybe just rand % e rather // than a permutation - GrB_Index perm_size, swap_size; GRB_TRY (GxB_Vector_unpack_Full( r_permute, (void **)&edge_perm, &perm_size, &iso, NULL @@ -357,8 +347,8 @@ int LAGraph_SwapEdges // Pair edges. Take a random permutation and pair adjacent values. // pairs wants: - // rows: [0, 0, 1, 1, 2, 2, 3, 3, . . .] (ramp / 2) - // cols: [ random permutation 1 - nvals] (LAGraph_Random_Seed + sort) + // cols: [0, 0, 1, 1, 2, 2, 3, 3, . . .] (ramp / 2) + // rows: [ random permutation 1 - nvals] (LAGraph_Random_Seed + sort) // vals: [1, 3, 0, 2, 0, 2, 0, 3, . . .] // Start with [0, 2, 0, 2, 0, 2, . . .] // for i from 1 to nvals by 2s: @@ -366,7 +356,7 @@ int LAGraph_SwapEdges // I know it will be alot less safe but is it more efficient to pack // pairs as needed? Doubt it. GRB_TRY (GrB_Matrix_build_UINT8( - pairs, edge_perm, half_ramp, swaps, swaps_per_loop * 2, NULL + pairs, half_ramp, edge_perm, swaps, swaps_per_loop * 2, NULL )); // QUESTION: do I repack just to throw away? @@ -376,8 +366,6 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_pack_Full( swapVals, (void **)&swaps, swap_size, false, NULL )) ; - GRB_TRY (GrB_free(&r_permute)); - GRB_TRY (GrB_free(&swapVals)); // each row of M will have 4 values [0,1,2,3] // pairs | E | M @@ -386,7 +374,7 @@ int LAGraph_SwapEdges // 3 | 0,1 | 3,2 // This gives us randomization as to which type of swap is happening. // M = pairs * E (any_lxor) - GRB_TRY (GrB_mxm(M, NULL, NULL, GxB_ANY_LXOR_UINT8, pairs, E, NULL)) ; + GRB_TRY (GrB_mxm(M, NULL, NULL, any_bxor, pairs, E, NULL)) ; // remove any entries of M with less than 3 values // This is taken from LAGraph_Cached_OutDegree. @@ -395,8 +383,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_uint8, M, x, NULL)) ; - - // Q: Do I need a new M with the correct dimension? // TODO: if full skip next steps, GRB_TRY (GrB_Vector_select_UINT8( M_outdeg, NULL, NULL, GrB_VALUEEQ_UINT8, M_outdeg, (uint8_t) 4, NULL)) ; @@ -411,14 +397,14 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Free(&junk, msg)); // Remove bad swaps + GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, e)) ; GRB_TRY (GrB_Matrix_extract( - M_fours, NULL, NULL, M, arr_keep, arr_size, GrB_ALL, 0, NULL)) ; + M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_extract( - pairs_4s, NULL, NULL, pairs, arr_keep, arr_size, GrB_ALL, 0, NULL)) ; - + pairs_4s, NULL, NULL, pairs, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; //GRB_TRY (GrB_free(&M)); //GRB_TRY (GrB_free(&pairs)); @@ -426,18 +412,22 @@ int LAGraph_SwapEdges // interf = M*MT(plus_one) GRB_TRY (GrB_Matrix_new(&M_t, GrB_UINT8, n, n_keep)) ; GRB_TRY (GrB_transpose(M_t, NULL, NULL, M_fours, NULL)) ; + GRB_TRY(GrB_Matrix_new(&interf, GrB_UINT8, n_keep, n_keep)) ; + GRB_TRY(GrB_Vector_new(&r_interf, GrB_UINT8, n_keep)); GRB_TRY (GrB_mxm( - interf, NULL, NULL, LAGraph_plus_one_uint8, M_t, M, NULL)) ; + interf, NULL, NULL, LAGraph_plus_one_uint8, M_fours, M_t, NULL)) ; // QUESTION: Reduce on max then select? or select then reduce on any? /* GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); */ + GRB_TRY (GrB_Matrix_select_UINT8( + interf, NULL, NULL, GrB_OFFDIAG, interf, 2, NULL)) ; GRB_TRY (GrB_Matrix_select_UINT8( interf, NULL, NULL, GrB_VALUEGE_UINT8, interf, 2, NULL)) ; GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, GrB_DESC_R)); + r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, NULL)); GRB_TRY (GxB_Vector_unpack_CSC( r_interf, &arr_keep, &junk, &arr_size, &junk_size, &iso, @@ -449,10 +439,10 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new(&pairs_i, GrB_UINT8, n_keep, e)) ; // QUESTION: is it easier to extract on transpose or extract and then remake the transpose? GRB_TRY (GrB_Matrix_extract( - M_i, NULL, NULL, M_fours, arr_keep, arr_size, GrB_ALL, 0, NULL)) ; + M_i, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_extract( - pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - + pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL + )) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)) ; // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. @@ -461,9 +451,9 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new(&M_1, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(&M_2, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_select( - M_1, NULL, NULL, first_bit, M_i, 0, GrB_DESC_R)) ; + M_1, NULL, NULL, first_bit, M_i, 0, NULL)) ; GRB_TRY (GrB_select( - M_2, NULL, NULL, first_bit, M_i, 1, GrB_DESC_R)) ; + M_2, NULL, NULL, first_bit, M_i, 1, NULL)) ; GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( M_1, NULL, NULL, GrB_DIV_UINT8, M_1, 2, NULL)) ; GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( @@ -475,10 +465,10 @@ int LAGraph_SwapEdges // exists = M_1 * E (plus_one) GRB_TRY (GrB_Matrix_new( - &exists, GrB_UINT8, n_keep, n_keep)) ; + &exists, GrB_UINT8, n_keep, e)) ; GRB_TRY (GrB_Vector_new( &r_exists, GrB_UINT8, n_keep)) ; - GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, NULL)) ; + GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, GrB_DESC_R)) ; GRB_TRY (GrB_mxm( exists, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; // exists += M_2 * E (plus_one) (accum is max if theres an intersection) @@ -492,41 +482,43 @@ int LAGraph_SwapEdges r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, exists, NULL)); // Get compliment vector - GRB_TRY (GrB_Vector_assign( - r_exists, r_exists, NULL, NULL, GrB_ALL, 0, GrB_DESC_SC)) ; + GRB_TRY (GrB_Vector_assign_UINT8( + r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; GRB_TRY (GxB_Vector_unpack_CSC( r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, NULL, NULL)) ; LG_TRY (LAGraph_Free(&junk, msg)) ; GRB_TRY (GrB_Matrix_new( E_arranged, GrB_UINT8, e - 2 * n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&E_arranged[1], GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&E_arranged[2], GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; // TODO: Check if this needs to be transposed I think it does - GRB_TRY (GrB_Matrix_extract(E_arranged[1], NULL, NULL, M_1, GrB_ALL, n, - arr_keep, arr_size, NULL)) ; - GRB_TRY (GrB_Matrix_extract(E_arranged[2], NULL, NULL, M_1, GrB_ALL, n, - arr_keep, arr_size, NULL)) ; - GRB_TRY (GrB_Matrix_extract(pairs_new, NULL, NULL, pairs_i, GrB_ALL, n, - arr_keep, arr_size, NULL)) ; + GRB_TRY (GrB_Matrix_extract(E_arranged[1], NULL, NULL, M_1, arr_keep, + n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract(E_arranged[2], NULL, NULL, M_2, arr_keep, + n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract(pairs_new, NULL, NULL, pairs_i, arr_keep, + n_keep, GrB_ALL, 0, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); GrB_Index n_old; GRB_TRY (GrB_Matrix_reduce_Monoid( - r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs, GrB_DESC_RT0)); + r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs_new, GrB_DESC_RT0)); //QUESTION: Best way to make these all zero?? - GRB_TRY (GrB_Vector_assign( - r_pairs, r_pairs, NULL, NULL, GrB_ALL, 0, GrB_DESC_SC)) ; + GRB_TRY (GrB_Vector_assign_UINT8( + r_pairs, r_pairs, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_old, + r_pairs, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_old, NULL, NULL)) ; LG_TRY (LAGraph_Free(&junk, msg)) ; LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, - arr_keep, arr_size, GrB_ALL, n, NULL)) ; + arr_keep, n_old, GrB_ALL, n, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); // E = Concat(E_prime, M_1, M_2) @@ -562,14 +554,13 @@ int LAGraph_SwapEdges num_attempts += swaps_per_loop; num_swaps += n_keep; // QUESTION: What should this do in the extremes? - swaps_per_loop = (n_keep * 11) / 10 ; + swaps_per_loop = (n_keep * 3) / 2; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; // Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; + //printf("Successful loop. Made %ld swaps. Total %ld out of %ld. Attempting %ld.\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } - //GrB_free(&random_v); - //LAGraph_Free((void **)&half_ramp, msg); // QUESTION: how should the values of the matrix be assigned again? //GRB_TRY (GrB_select (*A_new, NULL, NULL, GrB_DIAG, A, 0, NULL)) ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index fec431df36..240d439956 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -31,7 +31,7 @@ char filename [LEN+1] ; const char* tests [ ] = { "random_unweighted_general1.mtx", - //"random_unweighted_general2.mtx", + "random_unweighted_general2.mtx", //"bcsstk13.mtx", "" } ; @@ -42,7 +42,8 @@ void test_SwapEdges (void) //-------------------------------------------------------------------------- OK (LAGraph_Init (msg)) ; GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; - LAGraph_Graph G = NULL ; + LAGraph_Graph G = NULL, G_new = NULL; + GrB_Vector deg_seq = NULL, deg_seq_new = NULL, perm = NULL, perm_new = NULL; for (int k = 0 ; ; k++) { @@ -91,26 +92,51 @@ void test_SwapEdges (void) } // compute the row degree + GrB_Index n = 0; OK (LAGraph_Cached_OutDegree (G, msg)) ; - + OK (GrB_Matrix_nrows(&n, G->A)); + OK (GrB_Vector_new(°_seq, GrB_INT64, n)); + OK (GrB_Vector_new(°_seq_new, GrB_INT64, n)); + OK (GrB_Vector_new(&perm, GrB_INT64, n)); + OK (GrB_Vector_new(&perm_new, GrB_INT64, n)); + OK (GxB_Vector_sort ( + deg_seq, perm, GrB_LT_INT64, G->out_degree, GrB_NULL + )) ; //---------------------------------------------------------------------- // test the algorithm //---------------------------------------------------------------------- printf ("No Swap Basic Test:\n") ; - GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 0, msg)); - GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + //GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); + //GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("Test ends:\n") ; //---------------------------------------------------------------------- // check results //---------------------------------------------------------------------- - //bool isEq = false; - //LAGraph_Matrix_IsEqual(&isEq, C, A_new, msg); - OK (GrB_free (&A_new)) ; - //OK (GrB_free (&C_new)) ; + bool ok = false; + //Basic: make sure we got a symetric back out: + OK (LAGraph_New (&G_new, &A_new, LAGraph_ADJACENCY_DIRECTED, msg)) ; + OK (LAGraph_Cached_AT (G, msg)) ; + OK (LAGraph_Matrix_IsEqual (&ok, G->AT, G->A, msg)) ; + TEST_CHECK (ok) ; + + //next: check degrees stay the same. + OK (LAGraph_Cached_OutDegree (G_new, msg)) ; + OK (GxB_Vector_sort ( + deg_seq_new, perm_new, GrB_LT_INT64, G_new->out_degree, GrB_NULL + )) ; + GxB_Vector_fprint (deg_seq, "degree sequence", GxB_SHORT, stdout); + OK (LAGraph_Vector_IsEqual (&ok, deg_seq, deg_seq_new, msg)) ; + + OK (LAGraph_Delete (&G, msg)) ; + OK (LAGraph_Delete (&G_new, msg)) ; + GrB_free(°_seq) ; + GrB_free(°_seq_new) ; + GrB_free(&perm) ; + GrB_free(&perm_new) ; } //-------------------------------------------------------------------------- From ec130e354ba3b7d49b778c2a0454d0fd76152f60 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 14 Oct 2024 19:04:25 -0500 Subject: [PATCH 014/115] Fixed Tests and Self Edges and Parallel Edges being Generated --- experimental/algorithm/LAGraph_SwapEdges.c | 19 +++++++++-------- experimental/test/test_SwapEdges.c | 24 ++++++++++++++++------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index ea87e548fa..d6700046ed 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -423,12 +423,14 @@ int LAGraph_SwapEdges /* GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); */ GRB_TRY (GrB_Matrix_select_UINT8( - interf, NULL, NULL, GrB_OFFDIAG, interf, 2, NULL)) ; + interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; GRB_TRY (GrB_Matrix_select_UINT8( interf, NULL, NULL, GrB_VALUEGE_UINT8, interf, 2, NULL)) ; GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, NULL)); - + GRB_TRY (GrB_Vector_assign_UINT8( + r_interf, r_interf, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + GRB_TRY (GxB_Vector_unpack_CSC( r_interf, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, NULL, NULL)) ; @@ -474,9 +476,9 @@ int LAGraph_SwapEdges // exists += M_2 * E (plus_one) (accum is max if theres an intersection) GRB_TRY (GrB_mxm( exists, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, - M_1, E_t, NULL)) ; + M_2, E_t, NULL)) ; GRB_TRY (GrB_Matrix_select_UINT8( - exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, 2, NULL)) ; + exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 2, NULL)) ; // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, exists, NULL)); @@ -520,7 +522,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, arr_keep, n_old, GrB_ALL, n, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - + //GxB_Matrix_fprint (E_arranged[1], "new edges", GxB_SHORT, stdout); // E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is // pruned @@ -567,10 +569,11 @@ int LAGraph_SwapEdges GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; GRB_TRY (GrB_mxm( *A_new, NULL, NULL, LAGraph_any_one_uint8, E, E, GrB_DESC_T0)) ; - + GRB_TRY(GrB_Matrix_select_UINT8( + *A_new, NULL, NULL, GrB_OFFDIAG, *A_new, (uint8_t) 0, NULL)) ; // GrB_PLUS_INT64 - I rather not give this a type, is that possible? - GRB_TRY (GrB_eWiseAdd( - *A_new, NULL, NULL, GxB_ANY_INT64, *A_new, *A_new, GrB_DESC_T0)) ; + //GRB_TRY (GrB_eWiseAdd( + // *A_new, NULL, NULL, GxB_ANY_UINT8, *A_new, *A_new, GrB_DESC_T0)) ; //TODO: give A_new values LG_FREE_WORK ; return (GrB_SUCCESS) ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 240d439956..6971e9ea50 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -106,7 +106,6 @@ void test_SwapEdges (void) // test the algorithm //---------------------------------------------------------------------- - printf ("No Swap Basic Test:\n") ; //GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); //GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; @@ -116,20 +115,33 @@ void test_SwapEdges (void) // check results //---------------------------------------------------------------------- bool ok = false; - //Basic: make sure we got a symetric back out: + //Make sure we got a symetric back out: OK (LAGraph_New (&G_new, &A_new, LAGraph_ADJACENCY_DIRECTED, msg)) ; - OK (LAGraph_Cached_AT (G, msg)) ; - OK (LAGraph_Matrix_IsEqual (&ok, G->AT, G->A, msg)) ; + OK (LAGraph_Cached_AT (G_new, msg)) ; + OK (LAGraph_Matrix_IsEqual (&ok, G_new->AT, G_new->A, msg)) ; TEST_CHECK (ok) ; + //Make sure no self edges created. + OK (LAGraph_Cached_NSelfEdges (G_new, msg)) ; + TEST_CHECK (G_new->nself_edges == 0); + + // Check nvals stay the same. + GrB_Index edge_count, new_edge_count; + OK (GrB_Matrix_nvals(&edge_count, G->A)) ; + OK (GrB_Matrix_nvals(&new_edge_count, G_new->A)) ; + printf("old: %ld, new: %ld", edge_count,new_edge_count); + TEST_CHECK(edge_count == new_edge_count); //next: check degrees stay the same. OK (LAGraph_Cached_OutDegree (G_new, msg)) ; OK (GxB_Vector_sort ( deg_seq_new, perm_new, GrB_LT_INT64, G_new->out_degree, GrB_NULL )) ; - GxB_Vector_fprint (deg_seq, "degree sequence", GxB_SHORT, stdout); - OK (LAGraph_Vector_IsEqual (&ok, deg_seq, deg_seq_new, msg)) ; + + //GxB_Vector_fprint (deg_seq, "degree sequence", GxB_SHORT, stdout); + //GxB_Vector_fprint (deg_seq_new, "new degree sequence", GxB_SHORT, stdout); + OK (LAGraph_Vector_IsEqual (&ok, deg_seq, deg_seq_new, msg)) ; + TEST_CHECK (ok) ; OK (LAGraph_Delete (&G, msg)) ; OK (LAGraph_Delete (&G_new, msg)) ; From f4aa90191c26e1e54fc98d1495e159537549610c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 17 Oct 2024 13:55:59 -0500 Subject: [PATCH 015/115] Added demos, small optimizations --- .../algorithm/LAGraph_RichClubCoefficient.c | 21 +- experimental/algorithm/LAGraph_SwapEdges.c | 260 +++++++++--------- .../{rcc_demo[WIP].c => edgeSwap_demo.c} | 24 +- experimental/benchmark/rcc_demo.c | 109 ++++++++ experimental/test/test_SwapEdges.c | 10 +- 5 files changed, 268 insertions(+), 156 deletions(-) rename experimental/benchmark/{rcc_demo[WIP].c => edgeSwap_demo.c} (89%) create mode 100644 experimental/benchmark/rcc_demo.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 7b45ed896b..7d676a4577 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -37,14 +37,17 @@ #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ - GrB_free (&edge_degrees) ; \ - GrB_free (&D) ; \ - GrB_free (°rees) ; \ - GrB_free (&node_edges) ; \ - GrB_free (&edges_per_deg) ; \ - GrB_free (&rcCalculation) ; \ + GrB_free(&D) ; \ + GrB_free(&edge_degrees) ; \ + GrB_free(°rees) ; \ + GrB_free(&node_edges) ; \ + GrB_free(&edges_per_deg) ; \ + GrB_free(&verts_per_deg) ; \ + GrB_free(&iseq_2lt) ; \ + GrB_free(&plus_2le) ; \ + GrB_free(&rcCalculation) ; \ LAGraph_Free((void **) &index_edge, NULL) ; \ - LAGraph_Free((void **) &node_edges_arr, NULL); \ + LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ LAGraph_Free((void **) &edges_per_deg_arr, NULL); \ LAGraph_Free((void **) &cumul_array, NULL); \ @@ -52,6 +55,7 @@ LAGraph_Free((void **) °_vertex_count, NULL); \ } + #define LG_FREE_ALL \ { \ /* free any workspace used here */ \ @@ -253,16 +257,13 @@ int LAGraph_RichClubCoefficient node_edges, &index_edge, (void **) &node_edges_arr, &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - //QUESTION: better way to adjust degrees over by one? GRB_TRY(GrB_assign (degrees, degrees, GrB_MINUS_UINT64, 1, GrB_ALL, 0, GrB_DESC_S)); GRB_TRY(GxB_Vector_unpack_CSC( degrees, &index_edge, (void **) °_arr, &vi_size,&vx_size,&iso,°_vec_size, NULL, NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - // TODO change what this throws LG_ASSERT (edge_vec_nvals == deg_vec_size, GrB_NULL_POINTER) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index d6700046ed..478c8b3b29 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -15,48 +15,55 @@ //------------------------------------------------------------------------------ -#define LG_FREE_WORK \ +#define FREE_LOOP \ { \ - /* free any workspace used here */ \ - GrB_free (&E) ; \ - GrB_free (&E_t) ; \ - GrB_free (E_arranged) ; \ - GrB_free (E_arranged + 1) ; \ - GrB_free (E_arranged + 2) ; \ GrB_free (&pairs) ; \ - GrB_free (&pairs_4s) ; \ - GrB_free (&pairs_i) ; \ - GrB_free (&pairs_new) ; \ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ - GrB_free (&M_i) ; \ + GrB_free (&pairs_4s) ; \ GrB_free (&M_t) ; \ GrB_free (&interf) ; \ + GrB_free (&M_i) ; \ + GrB_free (&pairs_i) ; \ GrB_free (&M_1) ; \ GrB_free (&M_2) ; \ GrB_free (&exists) ; \ + GrB_free (E_arranged) ; \ + GrB_free (&E_arranged[1]) ; \ + GrB_free (&E_arranged[2]) ; \ + GrB_free (&pairs_new) ; \ + GrB_free (&M_outdeg) ; \ + GrB_free (&r_interf) ; \ + GrB_free (&r_exists) ; \ +} + +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + GrB_free (&E) ; \ GrB_free (&E_half) ; \ + GrB_free (&E_t) ; \ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ GrB_free (&r_sorted) ; \ - GrB_free (&swapVals) ; \ + GrB_free (&x) ; \ + GrB_free (&r_pairs) ; \ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ + GrB_free (&swapVals) ; \ + GrB_free (&first_bit) ; \ + GrB_free (&swap_op) ; \ + GrB_free (&any_bxor) ; \ LAGraph_Free((void**)&row_indices, msg) ; \ + LAGraph_Free((void**)&col_indices, msg) ; \ LAGraph_Free((void**)&values, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ LAGraph_Free((void**)&edge_perm, msg) ; \ LAGraph_Free((void**)&swap_type, msg) ; \ - GrB_free (&M_outdeg) ; \ - GrB_free (&r_interf) ; \ - GrB_free (&r_exists) ; \ - GrB_free (&r_pairs) ; \ - GrB_free (&x) ; \ - GrB_free (&first_bit) ; \ - GrB_free (&swap_op) ; \ - } + FREE_LOOP ; \ +} #define LG_FREE_ALL \ { \ @@ -184,7 +191,7 @@ int LAGraph_SwapEdges GrB_IndexUnaryOp swap_op = NULL; GrB_Semiring any_bxor = NULL; - //GrB_Type_Code type; + A = G->A ; //-------------------------------------------------------------------------- // Check inputs TODO @@ -299,6 +306,9 @@ int LAGraph_SwapEdges // if it has to be used GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_UINT8, E, E_half, NULL)) ; + LG_TRY (LAGraph_Free((void**)(&row_indices), msg)); + LG_TRY (LAGraph_Free((void**)(&col_indices), msg)); + LG_TRY (LAGraph_Free((void**)(&values), msg)); GRB_TRY (GrB_Vector_assign_UINT8 ( x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; @@ -376,39 +386,43 @@ int LAGraph_SwapEdges // M = pairs * E (any_lxor) GRB_TRY (GrB_mxm(M, NULL, NULL, any_bxor, pairs, E, NULL)) ; - // remove any entries of M with less than 3 values - // This is taken from LAGraph_Cached_OutDegree. // TODO: Should there be a function that takes in A matrix and computes // in or out degree + // Remove rows with less than 3 entries GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_uint8, M, x, NULL)) ; - // TODO: if full skip next steps, GRB_TRY (GrB_Vector_select_UINT8( M_outdeg, NULL, NULL, GrB_VALUEEQ_UINT8, M_outdeg, (uint8_t) 4, NULL)) ; - + GRB_TRY (GrB_Vector_nvals(&n_keep, M_outdeg)); GrB_Index arr_size, junk_size; - GRB_TRY (GxB_Vector_unpack_CSC( - M_outdeg, &arr_keep, &junk, &arr_size, &junk_size, &iso, - &n_keep, NULL, NULL)) ; - LG_ASSERT_MSG(iso, GrB_NOT_IMPLEMENTED, "GraphBLAS unexpectedly gave me" - " a matrix that is not iso"); - LG_TRY (LAGraph_Free(&junk, msg)); + if(n_keep == swaps_per_loop) + { + M_fours = M; + pairs_4s = pairs; + } + else // Remove bad swaps + { + GRB_TRY (GxB_Vector_unpack_CSC( + M_outdeg, &arr_keep, &junk, &arr_size, &junk_size, &iso, + &n_keep, NULL, NULL)) ; + LG_ASSERT_MSG(iso, GrB_NOT_IMPLEMENTED, "GraphBLAS unexpectedly gave me" + " a matrix that is not iso"); + LG_TRY (LAGraph_Free(&junk, msg)); + + GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, e)) ; + + GRB_TRY (GrB_Matrix_extract( + M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + pairs_4s, NULL, NULL, pairs, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_free(&M)); + GRB_TRY (GrB_free(&pairs)); + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + } - // Remove bad swaps - - GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, e)) ; - - GRB_TRY (GrB_Matrix_extract( - M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract( - pairs_4s, NULL, NULL, pairs, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - //GRB_TRY (GrB_free(&M)); - //GRB_TRY (GrB_free(&pairs)); - - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); // interf = M*MT(plus_one) GRB_TRY (GrB_Matrix_new(&M_t, GrB_UINT8, n, n_keep)) ; GRB_TRY (GrB_transpose(M_t, NULL, NULL, M_fours, NULL)) ; @@ -419,33 +433,52 @@ int LAGraph_SwapEdges interf, NULL, NULL, LAGraph_plus_one_uint8, M_fours, M_t, NULL)) ; // QUESTION: Reduce on max then select? or select then reduce on any? - - /* GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); */ GRB_TRY (GrB_Matrix_select_UINT8( interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; + /* GRB_TRY (GrB_Matrix_select_UINT8( interf, NULL, NULL, GrB_VALUEGE_UINT8, interf, 2, NULL)) ; GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, NULL)); - GRB_TRY (GrB_Vector_assign_UINT8( - r_interf, r_interf, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, NULL)); + */ + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); - GRB_TRY (GxB_Vector_unpack_CSC( - r_interf, &arr_keep, &junk, &arr_size, &junk_size, &iso, - &n_keep, NULL, NULL)) ; - LG_TRY (LAGraph_Free(&junk, msg)); - - // Remove bad swaps - GRB_TRY (GrB_Matrix_new(&M_i, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&pairs_i, GrB_UINT8, n_keep, e)) ; - // QUESTION: is it easier to extract on transpose or extract and then remake the transpose? - GRB_TRY (GrB_Matrix_extract( - M_i, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract( - pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL - )) ; - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)) ; + GRB_TRY (GrB_Vector_select_UINT8( + r_interf, NULL, NULL, GrB_VALUEGE_UINT8, r_interf, 2, NULL)) ; + GrB_Index badcount; + GRB_TRY (GrB_Vector_nvals(&badcount, r_interf)) ; + if(badcount == 0) + { + M_i = M_fours; + pairs_i = pairs_4s; + } + else //delete any interf + { + GRB_TRY (GrB_Vector_assign_UINT8( + r_interf, r_interf, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC + )) ; + + GRB_TRY (GxB_Vector_unpack_CSC( + r_interf, &arr_keep, &junk, &arr_size, &junk_size, &iso, + &n_keep, NULL, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)); + + // Remove bad swaps + GRB_TRY (GrB_Matrix_new(&M_i, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&pairs_i, GrB_UINT8, n_keep, e)) ; + // QUESTION: is it easier to extract on transpose or extract and then remake the transpose? + GRB_TRY (GrB_Matrix_extract( + M_i, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL + )) ; + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)) ; + GRB_TRY(GrB_free(&M_fours)); + } + //TODO decide if M_T is still useful + + // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. // M1 = select M (x & 1 == 0) / 2 @@ -460,16 +493,14 @@ int LAGraph_SwapEdges M_1, NULL, NULL, GrB_DIV_UINT8, M_1, 2, NULL)) ; GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( M_2, NULL, NULL, GrB_DIV_UINT8, M_2, 2, NULL)) ; + // Check if an edge already exists in the graph. // If a row of M1 or M2 has more than 1 vertex in common with a // row of E, the value of that entry in the exists array will be 2. // Otherwise, 1 or noval. // exists = M_1 * E (plus_one) - - GRB_TRY (GrB_Matrix_new( - &exists, GrB_UINT8, n_keep, e)) ; - GRB_TRY (GrB_Vector_new( - &r_exists, GrB_UINT8, n_keep)) ; + GRB_TRY (GrB_Matrix_new (&exists, GrB_UINT8, n_keep, e)) ; + GRB_TRY (GrB_Vector_new (&r_exists, GrB_UINT8, n_keep)) ; GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, GrB_DESC_R)) ; GRB_TRY (GrB_mxm( exists, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; @@ -482,34 +513,44 @@ int LAGraph_SwapEdges // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, exists, NULL)); - - // Get compliment vector - GRB_TRY (GrB_Vector_assign_UINT8( - r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; - GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, - NULL, NULL)) ; - LG_TRY (LAGraph_Free(&junk, msg)) ; - GRB_TRY (GrB_Matrix_new( - E_arranged, GrB_UINT8, e - 2 * n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&E_arranged[1], GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&E_arranged[2], GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; - - // TODO: Check if this needs to be transposed I think it does - GRB_TRY (GrB_Matrix_extract(E_arranged[1], NULL, NULL, M_1, arr_keep, - n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract(E_arranged[2], NULL, NULL, M_2, arr_keep, - n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract(pairs_new, NULL, NULL, pairs_i, arr_keep, - n_keep, GrB_ALL, 0, NULL)) ; - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + GRB_TRY (GrB_Vector_nvals(&badcount, r_exists)) ; + if(badcount == 0) + { + E_arranged[1] = M_1; + E_arranged[2] = M_2; + pairs_new = pairs_i; + } + else + { + // Get compliment vector + GRB_TRY (GrB_Vector_assign_UINT8( + r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + GRB_TRY (GxB_Vector_unpack_CSC( + r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, + NULL, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)) ; + + GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; + + // TODO: Check if this needs to be transposed I think it does + GRB_TRY (GrB_Matrix_extract( + E_arranged[1], NULL, NULL, M_1, arr_keep, n_keep, + GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + E_arranged[2], NULL, NULL, M_2, arr_keep, n_keep, + GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_extract( + pairs_new, NULL, NULL, pairs_i, arr_keep, n_keep, + GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + } GrB_Index n_old; GRB_TRY (GrB_Matrix_reduce_Monoid( r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs_new, GrB_DESC_RT0)); - //QUESTION: Best way to make these all zero?? GRB_TRY (GrB_Vector_assign_UINT8( r_pairs, r_pairs, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; @@ -519,6 +560,7 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Free(&junk, msg)) ; LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; + GRB_TRY (GrB_Matrix_new(E_arranged, GrB_UINT8, n_old, n)) ; GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, arr_keep, n_old, GrB_ALL, n, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); @@ -529,33 +571,10 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; // Free Matricies that have to be rebuilt - // TODO: free all the vectors you don't need right after you stop using them. - GrB_free(&pairs) ; - GrB_free(&M) ; - - - GrB_free(&ramp_v) ; - GrB_free(&hramp_v) ; - GrB_free(&M_outdeg) ; - - GrB_free(&M_fours) ; - GrB_free(&pairs_4s) ; - - GrB_free(&M_t) ; - GrB_free(&interf) ; - - GrB_free(&M_i) ; - GrB_free(&pairs_i) ; - - GrB_free(&exists) ; - GrB_free(&r_exists) ; - GrB_free(E_arranged) ; - GrB_free(E_arranged + 1) ; - GrB_free(E_arranged + 2) ; + FREE_LOOP ; num_attempts += swaps_per_loop; num_swaps += n_keep; - // QUESTION: What should this do in the extremes? swaps_per_loop = (n_keep * 3) / 2; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; @@ -564,17 +583,12 @@ int LAGraph_SwapEdges //printf("Successful loop. Made %ld swaps. Total %ld out of %ld. Attempting %ld.\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } - // QUESTION: how should the values of the matrix be assigned again? - //GRB_TRY (GrB_select (*A_new, NULL, NULL, GrB_DIAG, A, 0, NULL)) ; GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; GRB_TRY (GrB_mxm( *A_new, NULL, NULL, LAGraph_any_one_uint8, E, E, GrB_DESC_T0)) ; GRB_TRY(GrB_Matrix_select_UINT8( *A_new, NULL, NULL, GrB_OFFDIAG, *A_new, (uint8_t) 0, NULL)) ; - // GrB_PLUS_INT64 - I rather not give this a type, is that possible? - //GRB_TRY (GrB_eWiseAdd( - // *A_new, NULL, NULL, GxB_ANY_UINT8, *A_new, *A_new, GrB_DESC_T0)) ; - //TODO: give A_new values + LG_FREE_WORK ; return (GrB_SUCCESS) ; } diff --git a/experimental/benchmark/rcc_demo[WIP].c b/experimental/benchmark/edgeSwap_demo.c similarity index 89% rename from experimental/benchmark/rcc_demo[WIP].c rename to experimental/benchmark/edgeSwap_demo.c index d8a5c75302..2801b15035 100644 --- a/experimental/benchmark/rcc_demo[WIP].c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -62,9 +62,9 @@ int main (int argc, char **argv) &G, // the graph that is read from stdin or a file NULL, // source nodes (none, if NULL) true, // make the graph undirected, if true - false, // remove self-edges, if true - false, // return G->A as structural, if true, - NULL, // prefered GrB_Type of G->A; null if no preference + true, // remove self-edges, if true + true, // return G->A as structural, if true, + GrB_BOOL, // prefered GrB_Type of G->A; null if no preference false, // ensure all entries are positive, if true argc, argv)) ; // input to this main program t = LAGraph_WallClockTime ( ) - t ; @@ -74,31 +74,23 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; //-------------------------------------------------------------------------- - // try the LAGraph_HelloWorld "algorithm" + // try the LAGraph_EdgeSwap algorithm //-------------------------------------------------------------------------- + LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_HelloWorld (&Y, G, msg)) ; + LG_TRY (LAGraph_SwapEdges (&Y, G, (GrB_Index) 100, msg)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_HelloWorld: %g sec\n", t) ; - + //-------------------------------------------------------------------------- // check the results (make sure Y is a copy of G->A) //-------------------------------------------------------------------------- - bool isequal ; t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_Matrix_IsEqual (&isequal, Y, G->A, msg)) ; + //TODO t = LAGraph_WallClockTime ( ) - t ; printf ("Time to check results: %g sec\n", t) ; - if (isequal) - { - printf ("Test passed.\n") ; - } - else - { - printf ("Test failure!\n") ; - } //-------------------------------------------------------------------------- // print the results (Y is just a copy of G->A) diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c new file mode 100644 index 0000000000..7ae392510b --- /dev/null +++ b/experimental/benchmark/rcc_demo.c @@ -0,0 +1,109 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/benchmark/rcc_demo.c: a demo for RichClubCoefficient +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +// ./experimental/benchmark/rcc_demo ../data/west0067.mtx +// ./experimental/benchmark/rcc_demo < ../data/west0067.mtx +// ./experimental/benchmark/rcc_demo ../data/karate.mtx +// + +#include "../../src/benchmark/LAGraph_demo.h" +#include "LAGraphX.h" +#include "LG_internal.h" + +// LG_FREE_ALL is required by LG_TRY +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + GrB_free (&Y) ; \ + LAGraph_Delete (&G, msg) ; \ +} + +int main (int argc, char **argv) +{ + + //-------------------------------------------------------------------------- + // startup LAGraph and GraphBLAS + //-------------------------------------------------------------------------- + + char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph + LAGraph_Graph G = NULL ; + GrB_Vector Y = NULL ; + + // start GraphBLAS and LAGraph + bool burble = false ; // set true for diagnostic outputs + demo_init (burble) ; + LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; + + //-------------------------------------------------------------------------- + // read in the graph: this method is defined in LAGraph_demo.h + //-------------------------------------------------------------------------- + + // readproblem can read in a file in Matrix Market format, or in a binary + // format created by binwrite (see LAGraph_demo.h, or the main program, + // mtx2bin_demo). + + double t = LAGraph_WallClockTime ( ) ; + char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; + LG_TRY (readproblem ( + &G, // the graph that is read from stdin or a file + NULL, // source nodes (none, if NULL) + true, // make the graph undirected, if true + true, // remove self-edges, if true + true, // return G->A as structural, if true, + GrB_BOOL, // prefered GrB_Type of G->A; null if no preference + false, // ensure all entries are positive, if true + argc, argv)) ; // input to this main program + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to read the graph: %g sec\n", t) ; + + printf ("\n==========================The input graph matrix G:\n") ; + LG_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // try the LAGraph_RCC algorithm + //-------------------------------------------------------------------------- + + LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; + t = LAGraph_WallClockTime ( ) ; + LG_TRY (LAGraph_RichClubCoefficient (&Y, G, msg)) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for LAGraph_HelloWorld: %g sec\n", t) ; + + //-------------------------------------------------------------------------- + // check the results (make sure Y is a copy of G->A) + //-------------------------------------------------------------------------- + + t = LAGraph_WallClockTime ( ) ; + //TODO + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to check results: %g sec\n", t) ; + + //-------------------------------------------------------------------------- + // print the results (Y is just a copy of G->A) + //-------------------------------------------------------------------------- + + printf ("\n===============================The result matrix Y:\n") ; + GRB_TRY (GxB_Vector_fprint (Y, "rcc", GxB_SHORT, stdout)); + + //-------------------------------------------------------------------------- + // free everyting and finish + //-------------------------------------------------------------------------- + + LG_FREE_ALL ; + LG_TRY (LAGraph_Finalize (msg)) ; + return (GrB_SUCCESS) ; +} diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 6971e9ea50..ecdc733be7 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -43,7 +43,7 @@ void test_SwapEdges (void) OK (LAGraph_Init (msg)) ; GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; LAGraph_Graph G = NULL, G_new = NULL; - GrB_Vector deg_seq = NULL, deg_seq_new = NULL, perm = NULL, perm_new = NULL; + GrB_Vector deg_seq = NULL, deg_seq_new = NULL; for (int k = 0 ; ; k++) { @@ -97,10 +97,8 @@ void test_SwapEdges (void) OK (GrB_Matrix_nrows(&n, G->A)); OK (GrB_Vector_new(°_seq, GrB_INT64, n)); OK (GrB_Vector_new(°_seq_new, GrB_INT64, n)); - OK (GrB_Vector_new(&perm, GrB_INT64, n)); - OK (GrB_Vector_new(&perm_new, GrB_INT64, n)); OK (GxB_Vector_sort ( - deg_seq, perm, GrB_LT_INT64, G->out_degree, GrB_NULL + deg_seq, NULL, GrB_LT_INT64, G->out_degree, GrB_NULL )) ; //---------------------------------------------------------------------- // test the algorithm @@ -134,7 +132,7 @@ void test_SwapEdges (void) //next: check degrees stay the same. OK (LAGraph_Cached_OutDegree (G_new, msg)) ; OK (GxB_Vector_sort ( - deg_seq_new, perm_new, GrB_LT_INT64, G_new->out_degree, GrB_NULL + deg_seq_new, NULL, GrB_LT_INT64, G_new->out_degree, GrB_NULL )) ; //GxB_Vector_fprint (deg_seq, "degree sequence", GxB_SHORT, stdout); @@ -147,8 +145,6 @@ void test_SwapEdges (void) OK (LAGraph_Delete (&G_new, msg)) ; GrB_free(°_seq) ; GrB_free(°_seq_new) ; - GrB_free(&perm) ; - GrB_free(&perm_new) ; } //-------------------------------------------------------------------------- From c0a771cde7959b833afc5367dd2789db7cfdac2c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 18 Oct 2024 23:22:48 -0500 Subject: [PATCH 016/115] Edge Swap optimizations --- .../algorithm/LAGraph_RichClubCoefficient.c | 64 ++++++++----------- experimental/algorithm/LAGraph_SwapEdges.c | 52 +++++++++------ experimental/benchmark/edgeSwap_demo.c | 7 +- experimental/benchmark/rcc_demo.c | 2 +- experimental/test/test_SwapEdges.c | 23 ++----- 5 files changed, 70 insertions(+), 78 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 7d676a4577..03bfaf0c65 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -214,9 +214,10 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_mxm( edge_degrees, NULL, NULL, GxB_ANY_FIRST_UINT64,D,A, NULL)) ; + GRB_TRY (GrB_transpose(edge_degrees, NULL, NULL, edge_degrees, NULL)) ; // QUESTION: Is it not more efficient to simply use min here and then count up? GRB_TRY(GrB_mxm( - edge_degrees, NULL, NULL, plus_2le, edge_degrees, D, GrB_NULL)) ; + edge_degrees, NULL, NULL, plus_2le, D, edge_degrees, NULL)) ; // If the nodes of an edge have different degrees, the edge is counted once. // If they have the same degree, that edge is double counted. So, we adjust: @@ -226,46 +227,35 @@ int LAGraph_RichClubCoefficient // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. - GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, node_edges)); - vi_size = (edge_vec_nvals+1)*sizeof(GrB_Index); - vx_size = (edge_vec_nvals+1)*sizeof(GrB_UINT64); -/* - // Grab the index and edge count arrays from GBLASn with a bitmap incase - // there are empties - //QUESTION: is it worth it to just fill these vectors? - GRB_TRY(GxB_Vector_unpack_Bitmap( - node_edges, &index_edge, (void **) &node_edges_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals, GrB_NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - - //QUESTION: iso edge case - LG_ASSERT (!iso, GrB_NOT_IMPLEMENTED) ; - - - GRB_TRY(GxB_Vector_unpack_Bitmap( - degrees, &index_edge, (void **) °_arr, - &vi_size,&vx_size,&iso,°_vec_size, GrB_NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - LG_ASSERT (!iso, GrB_NOT_IMPLEMENTED) ; - */ - //CSC unpack QUESTION + GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; + + GRB_TRY(GrB_assign ( + degrees, degrees, GrB_MINUS_UINT64, 1, GrB_ALL, 0, GrB_DESC_S)); + // Grab the index and edge count arrays from GBLAS // Jumbled NULL so must return sorted. Needed because arrays with // # of edges and # of degrees should line up. + if(n == edge_vec_nvals) + { + GRB_TRY (GxB_Vector_unpack_Full ( + node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full ( + degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; - GRB_TRY(GxB_Vector_unpack_CSC( - node_edges, &index_edge, (void **) &node_edges_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - - GRB_TRY(GrB_assign (degrees, degrees, GrB_MINUS_UINT64, 1, GrB_ALL, 0, GrB_DESC_S)); - GRB_TRY(GxB_Vector_unpack_CSC( - degrees, &index_edge, (void **) °_arr, - &vi_size,&vx_size,&iso,°_vec_size, NULL, NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, NULL)) ; - - // TODO change what this throws - LG_ASSERT (edge_vec_nvals == deg_vec_size, GrB_NULL_POINTER) ; + deg_vec_size = n; + } + else + { + GRB_TRY(GxB_Vector_unpack_CSC( + node_edges, &index_edge, (void **) &node_edges_arr, + &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; + LG_TRY(LAGraph_Free((void **)&index_edge, msg)) ; + + GRB_TRY(GxB_Vector_unpack_CSC( + degrees, &index_edge, (void **) °_arr, + &vi_size,&vx_size,&iso,°_vec_size, NULL, NULL)) ; + LG_TRY(LAGraph_Free((void **)&index_edge, msg)) ; + } // Build with degrees as indecies and handle duplicates via adition GRB_TRY(GrB_Vector_build ( diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 478c8b3b29..a5152afebb 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -27,10 +27,11 @@ GrB_free (&pairs_i) ; \ GrB_free (&M_1) ; \ GrB_free (&M_2) ; \ - GrB_free (&exists) ; \ + GrB_free (&exists_1) ; \ + GrB_free (&exists_2) ; \ GrB_free (E_arranged) ; \ - GrB_free (&E_arranged[1]) ; \ - GrB_free (&E_arranged[2]) ; \ + GrB_free (E_arranged + 1) ; \ + GrB_free (E_arranged + 2) ; \ GrB_free (&pairs_new) ; \ GrB_free (&M_outdeg) ; \ GrB_free (&r_interf) ; \ @@ -147,7 +148,7 @@ int LAGraph_SwapEdges GrB_Matrix M_2 = NULL; // M_1 + M_2 = M // Has a 2 in a certain row if the planned swap already exists in the matrix - GrB_Matrix exists = NULL; + GrB_Matrix exists_1 = NULL, exists_2 = NULL; GrB_Index n, e, nvals; @@ -428,13 +429,20 @@ int LAGraph_SwapEdges GRB_TRY (GrB_transpose(M_t, NULL, NULL, M_fours, NULL)) ; GRB_TRY(GrB_Matrix_new(&interf, GrB_UINT8, n_keep, n_keep)) ; - GRB_TRY(GrB_Vector_new(&r_interf, GrB_UINT8, n_keep)); + GRB_TRY(GrB_Vector_new(&r_interf, GrB_UINT8, n_keep)) ; + + //Scuffed way to deal with diagonal. TODO. + // GRB_TRY(GrB_Vector_assign_UINT8(r_interf, NULL, NULL, (uint8_t) 0, + // GrB_ALL, 0, NULL)); + // GRB_TRY(GrB_Matrix_diag(&interf, r_interf, 0)); + + GRB_TRY (GrB_mxm( interf, NULL, NULL, LAGraph_plus_one_uint8, M_fours, M_t, NULL)) ; - - // QUESTION: Reduce on max then select? or select then reduce on any? + // QUESTION: This select is taking forever. + // Can I do this with a mask instead?? GRB_TRY (GrB_Matrix_select_UINT8( - interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; + interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; /* GRB_TRY (GrB_Matrix_select_UINT8( interf, NULL, NULL, GrB_VALUEGE_UINT8, interf, 2, NULL)) ; @@ -478,8 +486,6 @@ int LAGraph_SwapEdges } //TODO decide if M_T is still useful - - // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. // M1 = select M (x & 1 == 0) / 2 // M2 = select M (x & 1 == 1) / 2 @@ -499,20 +505,27 @@ int LAGraph_SwapEdges // row of E, the value of that entry in the exists array will be 2. // Otherwise, 1 or noval. // exists = M_1 * E (plus_one) - GRB_TRY (GrB_Matrix_new (&exists, GrB_UINT8, n_keep, e)) ; + GRB_TRY (GrB_Matrix_new (&exists_1, GrB_UINT8, n_keep, e)) ; + GRB_TRY (GrB_Matrix_new (&exists_2, GrB_UINT8, n_keep, e)) ; GRB_TRY (GrB_Vector_new (&r_exists, GrB_UINT8, n_keep)) ; GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, GrB_DESC_R)) ; GRB_TRY (GrB_mxm( - exists, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; + exists_1, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; // exists += M_2 * E (plus_one) (accum is max if theres an intersection) GRB_TRY (GrB_mxm( - exists, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, - M_2, E_t, NULL)) ; - GRB_TRY (GrB_Matrix_select_UINT8( - exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 2, NULL)) ; + exists_2, NULL, NULL, LAGraph_plus_one_uint8, M_2, E_t, NULL)) ; + //GRB_TRY (GrB_Matrix_select_UINT8( + // exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 2, NULL)) ; // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( - r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, exists, NULL)); + r_exists, NULL, NULL, GrB_MAX_MONOID_UINT8, exists_1, NULL)); + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_exists, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, + exists_2, NULL)); + GRB_TRY (GrB_Vector_select_UINT8( + r_exists, NULL, NULL, GrB_VALUEEQ_UINT8, r_exists, (uint8_t) 2, NULL + )) ; + GRB_TRY (GrB_Vector_nvals(&badcount, r_exists)) ; if(badcount == 0) { @@ -564,7 +577,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, arr_keep, n_old, GrB_ALL, n, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - //GxB_Matrix_fprint (E_arranged[1], "new edges", GxB_SHORT, stdout); + + // E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is // pruned @@ -580,7 +594,7 @@ int LAGraph_SwapEdges swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; // Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; - //printf("Successful loop. Made %ld swaps. Total %ld out of %ld. Attempting %ld.\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); + printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c index 2801b15035..bf9dc3a524 100644 --- a/experimental/benchmark/edgeSwap_demo.c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -44,7 +44,7 @@ int main (int argc, char **argv) GrB_Matrix Y = NULL ; // start GraphBLAS and LAGraph - bool burble = false ; // set true for diagnostic outputs + bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; @@ -78,10 +78,11 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; + printf("Time To Swap #################################################") ; t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_SwapEdges (&Y, G, (GrB_Index) 100, msg)) ; + LG_TRY (LAGraph_SwapEdges (&Y, G, (GrB_Index) 10, msg)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for LAGraph_HelloWorld: %g sec\n", t) ; + printf ("Time for LAGraph_SwapEdges: %g sec\n", t) ; //-------------------------------------------------------------------------- // check the results (make sure Y is a copy of G->A) diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index 7ae392510b..e977c937be 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -44,7 +44,7 @@ int main (int argc, char **argv) GrB_Vector Y = NULL ; // start GraphBLAS and LAGraph - bool burble = false ; // set true for diagnostic outputs + bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index ecdc733be7..f444cbdfbb 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -43,7 +43,6 @@ void test_SwapEdges (void) OK (LAGraph_Init (msg)) ; GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; LAGraph_Graph G = NULL, G_new = NULL; - GrB_Vector deg_seq = NULL, deg_seq_new = NULL; for (int k = 0 ; ; k++) { @@ -95,18 +94,13 @@ void test_SwapEdges (void) GrB_Index n = 0; OK (LAGraph_Cached_OutDegree (G, msg)) ; OK (GrB_Matrix_nrows(&n, G->A)); - OK (GrB_Vector_new(°_seq, GrB_INT64, n)); - OK (GrB_Vector_new(°_seq_new, GrB_INT64, n)); - OK (GxB_Vector_sort ( - deg_seq, NULL, GrB_LT_INT64, G->out_degree, GrB_NULL - )) ; //---------------------------------------------------------------------- // test the algorithm //---------------------------------------------------------------------- - //GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); - //GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("Test ends:\n") ; //---------------------------------------------------------------------- @@ -131,20 +125,13 @@ void test_SwapEdges (void) TEST_CHECK(edge_count == new_edge_count); //next: check degrees stay the same. OK (LAGraph_Cached_OutDegree (G_new, msg)) ; - OK (GxB_Vector_sort ( - deg_seq_new, NULL, GrB_LT_INT64, G_new->out_degree, GrB_NULL - )) ; - - //GxB_Vector_fprint (deg_seq, "degree sequence", GxB_SHORT, stdout); - //GxB_Vector_fprint (deg_seq_new, "new degree sequence", GxB_SHORT, stdout); - - OK (LAGraph_Vector_IsEqual (&ok, deg_seq, deg_seq_new, msg)) ; + + OK (LAGraph_Vector_IsEqual ( + &ok, G->out_degree, G_new->out_degree, msg)) ; TEST_CHECK (ok) ; OK (LAGraph_Delete (&G, msg)) ; OK (LAGraph_Delete (&G_new, msg)) ; - GrB_free(°_seq) ; - GrB_free(°_seq_new) ; } //-------------------------------------------------------------------------- From fa449645ccc110b54caf19651b14646873a00da2 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 21 Oct 2024 17:42:17 -0500 Subject: [PATCH 017/115] speed up RCC 4x by using row and col scale --- .../algorithm/LAGraph_RichClubCoefficient.c | 112 +++++++----------- experimental/benchmark/rcc_demo.c | 4 +- 2 files changed, 46 insertions(+), 70 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 03bfaf0c65..1be1ffd6c4 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -50,7 +50,6 @@ LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ LAGraph_Free((void **) &edges_per_deg_arr, NULL); \ - LAGraph_Free((void **) &cumul_array, NULL); \ LAGraph_Free((void **) &ones, NULL); \ LAGraph_Free((void **) °_vertex_count, NULL); \ } @@ -72,32 +71,31 @@ typedef void (*LAGraph_binary_function) (void *, const void *, const void *) ; /* #define TWO_ONE_ADD \ - "void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ + "void two_one_add(int64_t *z, const int64_t *x, const int64_t *y)" \ "{" \ "(*z) = 2 * (*x) + (*y) ;" \ "}" -void two_one_add(uint64_t *z, const uint64_t *x, const uint64_t *y) +void two_one_add(int64_t *z, const int64_t *x, const int64_t *y) { (*z) = 2 * (*x) + (*y); } */ #define ISEQ_2ISLT \ - "void iseq_2islt(uint64_t *z, const uint64_t *x, const uint64_t *y)" \ + "void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y)" \ "{" \ - "(*z) = (*x < *y) + (*x <= *y) ;" \ + "(*z) = (int64_t)((*x < *y) + (*x <= *y)) ;" \ "}" -void iseq_2islt(uint64_t *z, const uint64_t *x, const uint64_t *y) +void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y) { - (*z) = (uint64_t)((*x < *y) + (*x <= *y)) ; + (*z) = (int64_t)((*x < *y) + (*x <= *y)) ; } #define RICH_CLUB_FORMULA \ - "void rich_club_formula(double *z, const uint64_t *x, const uint64_t *y)" \ + "void rich_club_formula(double *z, const int64_t *x, const int64_t *y)" \ "{" \ "(*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ;" \ "}" -//TODO: Look out for ones -void rich_club_formula(double *z, const uint64_t *x, const uint64_t *y) +void rich_club_formula(double *z, const int64_t *x, const int64_t *y) { (*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)); } @@ -155,8 +153,8 @@ int LAGraph_RichClubCoefficient GrB_Index deg_vec_size; bool iso = false; - uint64_t *node_edges_arr = NULL, *deg_arr = NULL, - *edges_per_deg_arr = NULL, *cumul_array = NULL, *ones = NULL, + int64_t *node_edges_arr = NULL, *deg_arr = NULL, + *edges_per_deg_arr = NULL, *ones = NULL, *deg_vertex_count = NULL; GrB_Index *index_edge = NULL; @@ -180,58 +178,61 @@ int LAGraph_RichClubCoefficient //-------------------------------------------------------------------------- A = G->A ; GRB_TRY(GrB_Matrix_nrows (&n, A)) ; - GRB_TRY(GrB_Matrix_new(&D, GrB_UINT64, n, n)) - GRB_TRY(GrB_Matrix_new(&edge_degrees, GrB_UINT64,n,n)) ; + GRB_TRY(GrB_Matrix_new(&edge_degrees, GrB_INT64,n,n)) ; - GRB_TRY(GrB_Vector_new(°rees, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(&node_edges, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(&edges_per_deg, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(&verts_per_deg, GrB_UINT64, n)) ; - GRB_TRY(GrB_Vector_new(rich_club_coefficents, GrB_FP64, n)) ; + GRB_TRY(GrB_Vector_new(°rees, GrB_INT64, n)) ; + GRB_TRY(GrB_Vector_new(&node_edges, GrB_INT64, n)) ; GRB_TRY(GxB_BinaryOp_new( &iseq_2lt, (LAGraph_binary_function) (&iseq_2islt), - GrB_UINT64, GrB_UINT64, GrB_UINT64, "iseq_2islt", ISEQ_2ISLT)) ; - GRB_TRY(GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_UINT64, iseq_2lt)) ; + GrB_INT64, GrB_INT64, GrB_INT64, "iseq_2islt", ISEQ_2ISLT)) ; + GRB_TRY(GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_INT64, iseq_2lt)) ; GRB_TRY(GxB_BinaryOp_new( &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), - GrB_FP64, GrB_UINT64, GrB_UINT64, + GrB_FP64, GrB_INT64, GrB_INT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; // degrees = G->out_degree - GRB_TRY (GrB_assign( - degrees, NULL, NULL, G->out_degree, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; + + // Fill out degree vector, to activate col_scale and row_scale on graphs + // with singletons, scalar irrelevant + GRB_TRY (GrB_Vector_assign_INT64( + degrees, degrees, NULL, (int64_t) -1, GrB_ALL, 0, GrB_DESC_SC)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; - + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, GrB_DESC_R)) ; + int64_t max_deg; + GRB_TRY(GrB_Vector_reduce_INT64( + &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; + GRB_TRY(GrB_Vector_new(&edges_per_deg, GrB_INT64, max_deg)) ; + GRB_TRY(GrB_Vector_new(&verts_per_deg, GrB_INT64, max_deg)) ; + GRB_TRY(GrB_Vector_new(rich_club_coefficents, GrB_FP64, max_deg)) ; //-------------------------------------------------------------------------- // Calculating time //-------------------------------------------------------------------------- - // QUESTION: does this Mask help out GBLAS? // Each edge in the graph gets the value of the degree of its column node GRB_TRY (GrB_mxm( - edge_degrees, NULL, NULL, GxB_ANY_FIRST_UINT64,D,A, NULL)) ; + edge_degrees, NULL, NULL, GxB_ANY_SECOND_INT64, A, D, NULL)) ; - GRB_TRY (GrB_transpose(edge_degrees, NULL, NULL, edge_degrees, NULL)) ; - // QUESTION: Is it not more efficient to simply use min here and then count up? + // If the nodes of an edge have different degrees, the edge is counted once. + // If they have the same degree, that edge is double counted. So, we adjust: GRB_TRY(GrB_mxm( edge_degrees, NULL, NULL, plus_2le, D, edge_degrees, NULL)) ; - // If the nodes of an edge have different degrees, the edge is counted once. - // If they have the same degree, that edge is double counted. So, we adjust: + // Sum up the number of edges each node is "responsible" for. GRB_TRY(GrB_Matrix_reduce_Monoid( - node_edges, NULL, NULL, GrB_PLUS_MONOID_UINT64, edge_degrees, NULL)) ; + node_edges, NULL, NULL, GrB_PLUS_MONOID_INT64, edge_degrees, NULL)) ; // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; - GRB_TRY(GrB_assign ( - degrees, degrees, GrB_MINUS_UINT64, 1, GrB_ALL, 0, GrB_DESC_S)); - // Grab the index and edge count arrays from GBLAS // Jumbled NULL so must return sorted. Needed because arrays with // # of edges and # of degrees should line up. @@ -260,16 +261,15 @@ int LAGraph_RichClubCoefficient // Build with degrees as indecies and handle duplicates via adition GRB_TRY(GrB_Vector_build ( edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, - GrB_PLUS_UINT64)) ; - + GrB_PLUS_INT64)) ; // TODO: Make ones array in a better way LG_TRY( - LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(u_int64_t), NULL)) ; + LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; for(uint64_t i = 0; i < deg_vec_size; ++i) ones[i] = 1; GRB_TRY(GrB_Vector_build ( - verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_UINT64)) ; + verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; GrB_Index *epd_index = NULL, *vpd_index = NULL; GRB_TRY(GxB_Vector_unpack_CSC( @@ -279,6 +279,7 @@ int LAGraph_RichClubCoefficient verts_per_deg, &vpd_index, (void **)°_vertex_count, &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL)) ; + //TODO: parralelize these sums: //run a cummulative sum (backwards) on deg_vertex_count for(uint64_t i = deg_vec_size - 1; i > 0; --i) { @@ -291,44 +292,17 @@ int LAGraph_RichClubCoefficient edges_per_deg_arr[i-1]+=edges_per_deg_arr[i]; } - // QUESTION: can I just tell GBLAS the arrays are one smaller than they are? - // Feels unsafe but it will just deallocate with a delete[] no? - // prevent division by zero by removing a possible one from the - // verts_per_deg - GrB_Index to_remove = deg_vertex_count[deg_vec_size - 1] == 1? - vpd_index[deg_vec_size - 1]: 0; - printf("Last vertex count is %ld", deg_vertex_count[deg_vec_size - 1]); - //re pack but now we're cummulative GRB_TRY(GxB_Vector_pack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, vi_size, vx_size, false, edge_vec_nvals, NULL, NULL)); GRB_TRY(GxB_Vector_pack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, vi_size, vx_size, false, deg_vec_size, NULL, NULL)); - //GxB_Vector_fprint (verts_per_deg, "vpd", GxB_SHORT, stdout); - if(to_remove > 0) - GRB_TRY(GrB_Vector_removeElement(verts_per_deg, to_remove)); - //GxB_Vector_fprint (verts_per_deg, "vpd", GxB_SHORT, stdout); + + //Computes the RCC of a matrix GRB_TRY(GrB_eWiseMult(*rich_club_coefficents, NULL, NULL, rcCalculation, edges_per_deg, verts_per_deg, NULL)) ; - //GxB_Vector_fprint (*rich_club_coefficents, "rcc", GxB_SHORT, stdout); - /* The following is not nessesary because we can redefine the output vector - * as sparse vect - //Construct a vector thats has edges_per_deg_arr values but repeated - // whenever index_edge has a skip and put into cumulative edges - // ie. [0,1,6,7,10] & [9,7,3,2,0] -> - // [9,7,7,7,7,7,3,2,2,2,. . . ] - - uint64_t index = 0, i = 0; - LG_TRY (LAGraph_Malloc((void **) &cumul_array, n, sizeof(uint64_t), msg)) ; - - for(; i < n; i++) // seems easily parrallelizable but idk if #pragma is enough. - { - if(index + 1 A) @@ -89,6 +90,7 @@ int main (int argc, char **argv) t = LAGraph_WallClockTime ( ) ; //TODO + t = LAGraph_WallClockTime ( ) - t ; printf ("Time to check results: %g sec\n", t) ; From b02b68ac7b337158ae571d8f8180fcec7c42905a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 24 Oct 2024 00:32:33 -0500 Subject: [PATCH 018/115] sped up Swap Edges by reducing interf search --- experimental/algorithm/LAGraph_SwapEdges.c | 96 +++++++--------------- 1 file changed, 29 insertions(+), 67 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index a5152afebb..2261d267ae 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -423,69 +423,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_free(&pairs)); LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); } - - // interf = M*MT(plus_one) - GRB_TRY (GrB_Matrix_new(&M_t, GrB_UINT8, n, n_keep)) ; - GRB_TRY (GrB_transpose(M_t, NULL, NULL, M_fours, NULL)) ; - - GRB_TRY(GrB_Matrix_new(&interf, GrB_UINT8, n_keep, n_keep)) ; - GRB_TRY(GrB_Vector_new(&r_interf, GrB_UINT8, n_keep)) ; - - //Scuffed way to deal with diagonal. TODO. - // GRB_TRY(GrB_Vector_assign_UINT8(r_interf, NULL, NULL, (uint8_t) 0, - // GrB_ALL, 0, NULL)); - // GRB_TRY(GrB_Matrix_diag(&interf, r_interf, 0)); - - - GRB_TRY (GrB_mxm( - interf, NULL, NULL, LAGraph_plus_one_uint8, M_fours, M_t, NULL)) ; - // QUESTION: This select is taking forever. - // Can I do this with a mask instead?? - GRB_TRY (GrB_Matrix_select_UINT8( - interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; - /* - GRB_TRY (GrB_Matrix_select_UINT8( - interf, NULL, NULL, GrB_VALUEGE_UINT8, interf, 2, NULL)) ; - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GxB_ANY_UINT8_MONOID, interf, NULL)); - */ - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, GrB_DESC_R)); - - GRB_TRY (GrB_Vector_select_UINT8( - r_interf, NULL, NULL, GrB_VALUEGE_UINT8, r_interf, 2, NULL)) ; - GrB_Index badcount; - GRB_TRY (GrB_Vector_nvals(&badcount, r_interf)) ; - if(badcount == 0) - { - M_i = M_fours; - pairs_i = pairs_4s; - } - else //delete any interf - { - GRB_TRY (GrB_Vector_assign_UINT8( - r_interf, r_interf, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC - )) ; - - GRB_TRY (GxB_Vector_unpack_CSC( - r_interf, &arr_keep, &junk, &arr_size, &junk_size, &iso, - &n_keep, NULL, NULL)) ; - LG_TRY (LAGraph_Free(&junk, msg)); - - // Remove bad swaps - GRB_TRY (GrB_Matrix_new(&M_i, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&pairs_i, GrB_UINT8, n_keep, e)) ; - // QUESTION: is it easier to extract on transpose or extract and then remake the transpose? - GRB_TRY (GrB_Matrix_extract( - M_i, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract( - pairs_i, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL - )) ; - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)) ; - GRB_TRY(GrB_free(&M_fours)); - } - //TODO decide if M_T is still useful - + M_i = M_fours; + pairs_i = pairs_4s; // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. // M1 = select M (x & 1 == 0) / 2 // M2 = select M (x & 1 == 1) / 2 @@ -507,25 +446,48 @@ int LAGraph_SwapEdges // exists = M_1 * E (plus_one) GRB_TRY (GrB_Matrix_new (&exists_1, GrB_UINT8, n_keep, e)) ; GRB_TRY (GrB_Matrix_new (&exists_2, GrB_UINT8, n_keep, e)) ; - GRB_TRY (GrB_Vector_new (&r_exists, GrB_UINT8, n_keep)) ; + //GRB_TRY (GrB_Vector_new (&r_exists, GrB_UINT8, n_keep)) ; + GRB_TRY (GrB_Matrix_new(&interf, GrB_UINT8, n_keep, n_keep)); + GRB_TRY (GrB_Vector_new(&r_interf, GrB_UINT8, n_keep)) ; GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, GrB_DESC_R)) ; + + //Check if edges were anywhere in old graph: GRB_TRY (GrB_mxm( exists_1, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; - // exists += M_2 * E (plus_one) (accum is max if theres an intersection) GRB_TRY (GrB_mxm( exists_2, NULL, NULL, LAGraph_plus_one_uint8, M_2, E_t, NULL)) ; + + GRB_TRY (GrB_mxm( + interf, NULL, NULL, LAGraph_plus_one_uint8, M_1, M_1, GrB_DESC_T1 + )) ; + GRB_TRY (GrB_mxm( + interf, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, M_2, M_2, GrB_DESC_T1 + )) ; + GRB_TRY (GrB_Matrix_select_UINT8( + interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; + GRB_TRY (GrB_mxm( + interf, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, M_1, M_2, GrB_DESC_T1 + )) ; + GRB_TRY (GrB_mxm( + interf, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, M_2, M_1, GrB_DESC_T1 + )) ; + GRB_TRY (GrB_Matrix_reduce_Monoid( + r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, + interf, NULL)); + r_exists = r_interf; //GRB_TRY (GrB_Matrix_select_UINT8( // exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 2, NULL)) ; // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( - r_exists, NULL, NULL, GrB_MAX_MONOID_UINT8, exists_1, NULL)); + r_exists, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, + exists_1, NULL)); GRB_TRY (GrB_Matrix_reduce_Monoid( r_exists, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, exists_2, NULL)); GRB_TRY (GrB_Vector_select_UINT8( r_exists, NULL, NULL, GrB_VALUEEQ_UINT8, r_exists, (uint8_t) 2, NULL )) ; - + GrB_Index badcount; GRB_TRY (GrB_Vector_nvals(&badcount, r_exists)) ; if(badcount == 0) { From 94157fe50b62999f19b82f6ddb2cd24776a693b5 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 24 Oct 2024 13:17:17 -0500 Subject: [PATCH 019/115] Modified demos --- experimental/algorithm/LAGraph_SwapEdges.c | 60 +++++++++++++--------- experimental/benchmark/edgeSwap_demo.c | 9 +++- experimental/benchmark/rcc_demo.c | 5 +- 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 2261d267ae..50f21b2062 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -36,6 +36,7 @@ GrB_free (&M_outdeg) ; \ GrB_free (&r_interf) ; \ GrB_free (&r_exists) ; \ + GrB_free (&new_edges) ; \ } #define LG_FREE_WORK \ @@ -156,6 +157,12 @@ int LAGraph_SwapEdges GrB_Matrix E_half = NULL ; GrB_Matrix A_tril = NULL ; + // concat [M_1,M_2] + GrB_Matrix new_edges = NULL; + + // [a,b] = r_interf + GrB_Vector r_interf_arr[2] = {NULL,NULL}; + // random vector GrB_Vector random_v = NULL, r_permute = NULL, r_sorted = NULL; @@ -430,65 +437,57 @@ int LAGraph_SwapEdges // M2 = select M (x & 1 == 1) / 2 GRB_TRY (GrB_Matrix_new(&M_1, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(&M_2, GrB_UINT8, n_keep, n)) ; + GRB_TRY (GrB_Matrix_new(&new_edges, GrB_UINT8, 2*n_keep, n)) ; + // LG_TRY (LAGraph_Matrix_Print (M_i, LAGraph_SHORT, stdout, msg)) ; GRB_TRY (GrB_select( M_1, NULL, NULL, first_bit, M_i, 0, NULL)) ; + // LG_TRY (LAGraph_Matrix_Print (M_1, LAGraph_SHORT, stdout, msg)) ; GRB_TRY (GrB_select( M_2, NULL, NULL, first_bit, M_i, 1, NULL)) ; + GrB_Matrix M_long[2] = {M_1,M_2}; + GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( M_1, NULL, NULL, GrB_DIV_UINT8, M_1, 2, NULL)) ; GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( M_2, NULL, NULL, GrB_DIV_UINT8, M_2, 2, NULL)) ; + GRB_TRY (GxB_Matrix_concat(new_edges, M_long, 2, 1, NULL)) ; + // LG_TRY (LAGraph_Matrix_Print (new_edges, LAGraph_SHORT, stdout, msg)) ; // Check if an edge already exists in the graph. // If a row of M1 or M2 has more than 1 vertex in common with a // row of E, the value of that entry in the exists array will be 2. // Otherwise, 1 or noval. // exists = M_1 * E (plus_one) - GRB_TRY (GrB_Matrix_new (&exists_1, GrB_UINT8, n_keep, e)) ; - GRB_TRY (GrB_Matrix_new (&exists_2, GrB_UINT8, n_keep, e)) ; + GRB_TRY (GrB_Matrix_new (&exists_1, GrB_UINT8, 2 * n_keep, e)) ; + GRB_TRY (GrB_Matrix_new (&exists_2, GrB_UINT8, 2 * n_keep, e)) ; //GRB_TRY (GrB_Vector_new (&r_exists, GrB_UINT8, n_keep)) ; - GRB_TRY (GrB_Matrix_new(&interf, GrB_UINT8, n_keep, n_keep)); - GRB_TRY (GrB_Vector_new(&r_interf, GrB_UINT8, n_keep)) ; + GRB_TRY (GrB_Matrix_new(&interf, GrB_UINT8, 2 * n_keep, 2 * n_keep)); + GRB_TRY (GrB_Vector_new(&r_interf, GrB_UINT8, 2 * n_keep)) ; GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, GrB_DESC_R)) ; //Check if edges were anywhere in old graph: GRB_TRY (GrB_mxm( - exists_1, NULL, NULL, LAGraph_plus_one_uint8, M_1, E_t, NULL)) ; - GRB_TRY (GrB_mxm( - exists_2, NULL, NULL, LAGraph_plus_one_uint8, M_2, E_t, NULL)) ; + exists_1, NULL, NULL, LAGraph_plus_one_uint8, new_edges, E_t, NULL)) ; GRB_TRY (GrB_mxm( - interf, NULL, NULL, LAGraph_plus_one_uint8, M_1, M_1, GrB_DESC_T1 - )) ; - GRB_TRY (GrB_mxm( - interf, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, M_2, M_2, GrB_DESC_T1 + interf, NULL, NULL, LAGraph_plus_one_uint8, new_edges, new_edges, GrB_DESC_T1 )) ; GRB_TRY (GrB_Matrix_select_UINT8( interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; - GRB_TRY (GrB_mxm( - interf, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, M_1, M_2, GrB_DESC_T1 - )) ; - GRB_TRY (GrB_mxm( - interf, NULL, GrB_MAX_UINT8, LAGraph_plus_one_uint8, M_2, M_1, GrB_DESC_T1 - )) ; GRB_TRY (GrB_Matrix_reduce_Monoid( r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, interf, NULL)); - r_exists = r_interf; //GRB_TRY (GrB_Matrix_select_UINT8( // exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 2, NULL)) ; // 2 if intended swap already exists in the matrix, 1 or noval otherwise GRB_TRY (GrB_Matrix_reduce_Monoid( - r_exists, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, + r_interf, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, exists_1, NULL)); - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_exists, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, - exists_2, NULL)); GRB_TRY (GrB_Vector_select_UINT8( - r_exists, NULL, NULL, GrB_VALUEEQ_UINT8, r_exists, (uint8_t) 2, NULL + r_interf, NULL, NULL, GrB_VALUEEQ_UINT8, r_interf, (uint8_t) 2, NULL )) ; GrB_Index badcount; - GRB_TRY (GrB_Vector_nvals(&badcount, r_exists)) ; + GRB_TRY (GrB_Vector_nvals(&badcount, r_interf)) ; if(badcount == 0) { E_arranged[1] = M_1; @@ -497,6 +496,19 @@ int LAGraph_SwapEdges } else { + GRB_TRY (GrB_Vector_new(r_interf_arr, GrB_UINT8, n_keep)) ; + GRB_TRY (GrB_Vector_new(r_interf_arr + 1, GrB_UINT8, n_keep)) ; + GRB_TRY (GrB_Vector_new(&r_exists, GrB_UINT8, n_keep)) ; + + GrB_Index rows[2] = {n_keep,n_keep}; + GrB_Index cols[1] = {1}; + GRB_TRY(GxB_Matrix_split((GrB_Matrix *)r_interf_arr, 2, 1, rows, + cols, (GrB_Matrix) r_interf, NULL)); + GRB_TRY(GrB_eWiseAdd(r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, + r_interf_arr[0], r_interf_arr[1], NULL)); + + LG_TRY (LAGraph_Vector_Print (r_exists, LAGraph_SHORT, stdout, msg)) ; + // Get compliment vector GRB_TRY (GrB_Vector_assign_UINT8( r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c index bf9dc3a524..26ebbcb0dd 100644 --- a/experimental/benchmark/edgeSwap_demo.c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -30,6 +30,7 @@ { \ GrB_free (&Y) ; \ LAGraph_Delete (&G, msg) ; \ + LAGraph_Delete (&G_new, msg) ; \ } int main (int argc, char **argv) @@ -40,7 +41,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph - LAGraph_Graph G = NULL ; + LAGraph_Graph G = NULL, G_new = NULL; GrB_Matrix Y = NULL ; // start GraphBLAS and LAGraph @@ -89,7 +90,11 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- t = LAGraph_WallClockTime ( ) ; - //TODO + bool result = false; + LG_TRY(LAGraph_New(&G_new, &Y, LAGraph_ADJACENCY_UNDIRECTED, msg)); + LG_TRY (LAGraph_Cached_OutDegree (G_new, msg)) ; + LG_TRY (LAGraph_Vector_IsEqual( + &result, G->out_degree, G_new->out_degree, msg)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time to check results: %g sec\n", t) ; diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index 2dca877a2f..ca689ac2a4 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -78,7 +78,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; - printf ("\n========================== Calculate RCC:\n") ; + printf ("\n========================== Start RCC ==========================\n") ; t = LAGraph_WallClockTime ( ) ; LG_TRY (LAGraph_RichClubCoefficient (&Y, G, msg)) ; t = LAGraph_WallClockTime ( ) - t ; @@ -89,8 +89,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- t = LAGraph_WallClockTime ( ) ; - //TODO - + //TODO We can't really check this very well t = LAGraph_WallClockTime ( ) - t ; printf ("Time to check results: %g sec\n", t) ; From 45b8aecf66c108e9a1a8391a64b1a42626c7860c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 3 Nov 2024 17:54:21 -0600 Subject: [PATCH 020/115] Swap_Edges hash --- .../algorithm/LAGraph_RichClubCoefficient.c | 1 - experimental/algorithm/LAGraph_SwapEdges.c | 360 +++++++++++------- experimental/test/test_SwapEdges.c | 1 + 3 files changed, 219 insertions(+), 143 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 1be1ffd6c4..442171539c 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -67,7 +67,6 @@ #include "LG_internal.h" #include "LAGraphX.h" -//taken from LAGraph_BF_full_mxv typedef void (*LAGraph_binary_function) (void *, const void *, const void *) ; /* #define TWO_ONE_ADD \ diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 50f21b2062..000340ab47 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -21,22 +21,20 @@ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ GrB_free (&pairs_4s) ; \ - GrB_free (&M_t) ; \ - GrB_free (&interf) ; \ - GrB_free (&M_i) ; \ - GrB_free (&pairs_i) ; \ GrB_free (&M_1) ; \ GrB_free (&M_2) ; \ - GrB_free (&exists_1) ; \ - GrB_free (&exists_2) ; \ GrB_free (E_arranged) ; \ GrB_free (E_arranged + 1) ; \ GrB_free (E_arranged + 2) ; \ GrB_free (&pairs_new) ; \ GrB_free (&M_outdeg) ; \ - GrB_free (&r_interf) ; \ GrB_free (&r_exists) ; \ - GrB_free (&new_edges) ; \ + GrB_free(&new_hashed_edges); \ + GrB_free(&buckets); \ + GrB_free(&hashed_edges); \ + GrB_free(&exists); \ + LAGraph_Free((void **) &hash_vals_new, NULL);\ + LAGraph_Free((void **) &hash_vals, NULL); \ } #define LG_FREE_WORK \ @@ -82,28 +80,65 @@ void first_bit_equals (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit) { - (*z) = (uint8_t) (((*x) & 1) == (*bit)); + (*z) = (uint8_t) (((*x) & 1) ^ (*bit)); } #define FIRST_BIT_EQ \ "void first_bit_equals \n"\ " (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit)\n"\ " { \n"\ -" (*z) = (uint8_t) (((*x) & 1) == (*bit)); \n"\ +" (*z) = (uint8_t) (((*x) & 1) ^ (*bit)); \n"\ " }" // creates [0,3,1,2,1,3,. . .] pattern from random vector. void swap_pattern (uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y) { - (*z) = (uint8_t) (((i % 2) * 2) | (*x & 1)); + (*z) = (uint8_t) (((i & 1) * 2) | (*x & 1)); } #define SWAP_PAT \ "void swap_pattern" \ "(uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y)" \ "{" \ - "(*z) = (uint8_t) (((i % 2) * 2) | (*x & 1));" \ + "(*z) = (uint8_t) (((i & 1) * 2) | (*x & 1));" \ "}" +//Hashes any node with a simple Multiply-shift from +// https://arxiv.org/pdf/1504.06804 +// QUESTION: this hash is a bit simple but I doubt it will result in a ton of +// collisions unless the input graph is very specifically constucted + +void hash_node + (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, + const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int32_t *nbits) +{ + (*z) = ((*y) * j_x) >> (64 - *nbits); +} +#define HASH_ONE \ +"void hash_node \n"\ +" (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, \n"\ +" const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int *nbits) \n"\ +"{ \n"\ +" (*z) = ((*y) * j_x) >> (64 - *nbits); \n"\ +"}" + +//hash that places the values for the pair of nodes corresponding to one edge in +//one part of an array +void hash_pair + (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, + const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int *nbits) +{ + (*z) = (((*x) & 1) ^ j_y) * ((*y) * j_x) >> (64 - *nbits); +} +#define HASH_TWO \ +"void hash_pair \n"\ +" (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, \n"\ +" const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int *nbits) \n"\ +"{ \n"\ +" (*z) = (((*x) & 1) ^ j_y) * ((*y) * j_x) >> (64 - *nbits); \n"\ +"}" + + + int LAGraph_SwapEdges ( // output @@ -127,7 +162,7 @@ int LAGraph_SwapEdges // swaps x e // Selected pairs for next batch of swaps // Each row contains 2 entries for the edges involved in a swap. - GrB_Matrix pairs = NULL, pairs_4s = NULL, pairs_i = NULL; + GrB_Matrix pairs = NULL, pairs_4s = NULL; GrB_Matrix pairs_new = NULL; // swaps x n @@ -135,15 +170,6 @@ int LAGraph_SwapEdges // that are involved in the swap. GrB_Matrix M = NULL; GrB_Matrix M_fours = NULL; // M with exactly 4 entries - GrB_Matrix M_i = NULL; // M w/o interference - - // n x swaps - GrB_Matrix M_t = NULL; - - // swaps x swaps - // Interference Matrix any entry is the number of verticies the swap on its - // row and column share. Any entry with 2 or more could cause interference. - GrB_Matrix interf = NULL; GrB_Matrix M_1 = NULL; // M_1 + M_2 = M GrB_Matrix M_2 = NULL; // M_1 + M_2 = M @@ -151,18 +177,12 @@ int LAGraph_SwapEdges // Has a 2 in a certain row if the planned swap already exists in the matrix GrB_Matrix exists_1 = NULL, exists_2 = NULL; - GrB_Index n, e, nvals; + GrB_Index n = 0, e = 0, nvals = 0; // Copied vars from LAGraph_Incidence_Matrix GrB_Matrix E_half = NULL ; GrB_Matrix A_tril = NULL ; - // concat [M_1,M_2] - GrB_Matrix new_edges = NULL; - - // [a,b] = r_interf - GrB_Vector r_interf_arr[2] = {NULL,NULL}; - // random vector GrB_Vector random_v = NULL, r_permute = NULL, r_sorted = NULL; @@ -171,7 +191,7 @@ int LAGraph_SwapEdges void *values = NULL ; // [0,2,0,3,0,3,0 . . .] numSwaps? - GrB_Vector swapVals; + GrB_Vector swapVals = NULL; // This ramp will likely get recycled a few times. GrB_Vector ramp_v = NULL; @@ -185,7 +205,7 @@ int LAGraph_SwapEdges bool iso = false; // Reduced Vectors - GrB_Vector M_outdeg = NULL, r_interf = NULL, r_exists = NULL, r_pairs; + GrB_Vector M_outdeg = NULL, r_exists = NULL, r_pairs; // n vector of zeroes GrB_Vector x = NULL; @@ -195,8 +215,16 @@ int LAGraph_SwapEdges GrB_Index *arr_keep = NULL; void *junk = NULL; + GrB_Matrix dense2_hash = NULL, new_hashed_edges = NULL, buckets = NULL; + GrB_Vector dense_hash = NULL, hashed_edges = NULL, exists = NULL; + GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; + GrB_IndexUnaryOp first_bit = NULL; GrB_IndexUnaryOp swap_op = NULL; + GzB_IndexBinaryOp hash_one = NULL, hash_two = NULL; + GrB_BinaryOp bhash_one = NULL, bhash_two = NULL; + GrB_Semiring hash_edges = NULL, hash_edges2 = NULL; + GrB_Monoid one_monoid = NULL; GrB_Semiring any_bxor = NULL; @@ -212,40 +240,64 @@ int LAGraph_SwapEdges LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, "G->nself_edges must be zero") ; - /* GRB_TRY (GrB_get(A, (void*)&type, GrB_EL_TYPE_CODE)) ; - LG_ASSERT_MSG (type == GrB_BOOL_CODE, LAGRAPH_INVALID_GRAPH, - "A must be type boolean") ; */ + // GRB_TRY (GrB_get(A, (void*)&type, GrB_EL_TYPE_CODE)) ; + // LG_ASSERT_MSG (type == GrB_BOOL_CODE, LAGRAPH_INVALID_GRAPH, + // "A must be type boolean") ; //-------------------------------------------------------------------------- // Initializations //-------------------------------------------------------------------------- LAGRAPH_TRY(LAGraph_Random_Init(msg)) ; - GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY (GrB_Matrix_nvals(&nvals, A)) ; - e = nvals / 2 ; + GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; + + // Extract lower triangular edges. + GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; + GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; + GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; + GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&E_t, GrB_UINT8, n, e)) ; - GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; - - - // GRB_TRY (GxB_IndexUnaryOp_new ( - // &first_bit, (void *) first_bit_equals, GrB_UINT8, GrB_UINT8, GrB_BOOL, - // "first_bit", FIRST_BIT_EQ)); - GRB_TRY(GrB_IndexUnaryOp_new( - &first_bit, (void *) first_bit_equals, GrB_UINT8, GrB_UINT8, GrB_BOOL - )); - //GRB_TRY (GxB_IndexUnaryOp_new ( - // &swap_op, (void *) swap_pattern, GrB_UINT8, GrB_UINT64, GrB_UINT8, - // "swap_op", SWAP_PAT)); - GRB_TRY(GrB_IndexUnaryOp_new( - &swap_op, (void *) swap_pattern, GrB_UINT8, GrB_UINT64, GrB_UINT8 - )); + + GRB_TRY (GxB_IndexUnaryOp_new ( + &first_bit, (GxB_index_unary_function) (&first_bit_equals), + GrB_UINT8, GrB_UINT8, GrB_UINT8, "first_bit_equals", FIRST_BIT_EQ + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_op, (GxB_index_unary_function) (&swap_pattern), + GrB_UINT8, GrB_UINT64, GrB_UINT8, "swap_pattern", SWAP_PAT + )) ; + + GRB_TRY(GzB_IndexBinaryOp_new( + &hash_one, (GzB_index_binary_function) (&hash_node), + GrB_UINT64, GrB_UINT8, GrB_UINT64, GrB_INT32, "hash_node", HASH_ONE + )) ; + GRB_TRY(GzB_IndexBinaryOp_new( + &hash_two, (GzB_index_binary_function) (&hash_pair), + GrB_UINT64, GrB_UINT8, GrB_UINT64, GrB_INT32, "hash_pair", HASH_TWO + )) ; + + GrB_Scalar sizeTheta ; // hash size + GrB_Scalar_new (&sizeTheta, GrB_INT32) ; + GrB_Scalar_setElement_INT32 (sizeTheta, 60); + GRB_TRY(GzB_BinaryOp_new_IndexOp(&bhash_one, hash_one, sizeTheta)); + GRB_TRY(GzB_BinaryOp_new_IndexOp(&bhash_two, hash_two, sizeTheta)); + + // I use a bit wise xor to combine the hashes since the same column number + // will no appear twice in my multiplication and I want combination to be + // commutative. + GRB_TRY(GrB_Semiring_new( + &hash_edges, GxB_BXOR_UINT64_MONOID, bhash_one + )) ; + GRB_TRY(GrB_Semiring_new( + &hash_edges2, GxB_BXOR_UINT64_MONOID, bhash_two + )) ; GRB_TRY(GrB_Semiring_new( &any_bxor, GxB_ANY_UINT8_MONOID ,GrB_BXOR_UINT8 - )); - + )) ; + GRB_TRY(GxB_Monoid_terminal_new( + &one_monoid, GrB_ONEB_UINT8, (uint8_t) 255, (uint8_t) 1)); GrB_Index num_swaps = 0, num_attempts = 0; // Q: Should this decrease if edges are interfering alot? // Bound number of swaps by E-2 * (max deg)? @@ -253,7 +305,7 @@ int LAGraph_SwapEdges // or increase if intrf low // maybe a * #swaps that worked last iteration GrB_Index swaps_per_loop = e / 3 ; // Make this a cap - + // This is length e to let every edge have a chance to swap. @@ -271,19 +323,17 @@ int LAGraph_SwapEdges // Extract adjacency matrix to make incidence matrix - E // get just the lower triangular entries //TODO: should I remove the diagonal? change the 0 if so - GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; // Arrays to extract A into // QUESTION: can't I just use an unpack and use the arrays GBLAS allocated? LG_TRY (LAGraph_Malloc ((void**)(&row_indices), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&col_indices), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&values), e, sizeof(bool), msg)) ; + GRB_TRY ( GrB_Matrix_extractTuples_BOOL (row_indices, col_indices, values, &e, A_tril) ) ; - - // QUESTION: I don't want to rebuild ramp every time, so do I just build one - // that is too large and use as needed? + //Build large ramp GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT8, e)) ; @@ -330,6 +380,19 @@ int LAGraph_SwapEdges printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { + // GRB_TRY (GrB_mxm( + // *A_new, NULL, NULL, LAGraph_plus_one_uint8, E, E, GrB_DESC_RT0)) ; + // GRB_TRY(GrB_Matrix_select_UINT8( + // *A_new, NULL, NULL, GrB_OFFDIAG, *A_new, (uint8_t) 0, NULL)) ; + // GRB_TRY(GrB_Matrix_select_UINT8( + // *A_new, NULL, NULL, GrB_VALUEEQ_UINT8, *A_new, (uint8_t) 2, NULL)) ; + // GRB_TRY(GrB_Matrix_nvals(&nvals, *A_new)); + // if(nvals) + // { + // printf("SELF EDGE MADE \n\n"); + // GxB_Matrix_fprint(*A_new,"Hashes",GxB_COMPLETE, stdout); + // GRB_TRY(-1); + // } // Coming into the loop: // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly one 0 and one 1. @@ -391,7 +454,7 @@ int LAGraph_SwapEdges // 2 | 0,1 | 2,3 // 3 | 0,1 | 3,2 // This gives us randomization as to which type of swap is happening. - // M = pairs * E (any_lxor) + // M = pairs * E (any_bxor) GRB_TRY (GrB_mxm(M, NULL, NULL, any_bxor, pairs, E, NULL)) ; // TODO: Should there be a function that takes in A matrix and computes @@ -430,87 +493,88 @@ int LAGraph_SwapEdges GRB_TRY (GrB_free(&pairs)); LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); } - M_i = M_fours; - pairs_i = pairs_4s; - // M_1 has 2 and 0 M_2 has 1 and 3. Divide by 2 to get 0 and 1 on both. - // M1 = select M (x & 1 == 0) / 2 - // M2 = select M (x & 1 == 1) / 2 - GRB_TRY (GrB_Matrix_new(&M_1, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&M_2, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&new_edges, GrB_UINT8, 2*n_keep, n)) ; - // LG_TRY (LAGraph_Matrix_Print (M_i, LAGraph_SHORT, stdout, msg)) ; - GRB_TRY (GrB_select( - M_1, NULL, NULL, first_bit, M_i, 0, NULL)) ; - // LG_TRY (LAGraph_Matrix_Print (M_1, LAGraph_SHORT, stdout, msg)) ; - GRB_TRY (GrB_select( - M_2, NULL, NULL, first_bit, M_i, 1, NULL)) ; - GrB_Matrix M_long[2] = {M_1,M_2}; - GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( - M_1, NULL, NULL, GrB_DIV_UINT8, M_1, 2, NULL)) ; - GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( - M_2, NULL, NULL, GrB_DIV_UINT8, M_2, 2, NULL)) ; - GRB_TRY (GxB_Matrix_concat(new_edges, M_long, 2, 1, NULL)) ; - - // LG_TRY (LAGraph_Matrix_Print (new_edges, LAGraph_SHORT, stdout, msg)) ; - // Check if an edge already exists in the graph. - // If a row of M1 or M2 has more than 1 vertex in common with a - // row of E, the value of that entry in the exists array will be 2. - // Otherwise, 1 or noval. - // exists = M_1 * E (plus_one) - GRB_TRY (GrB_Matrix_new (&exists_1, GrB_UINT8, 2 * n_keep, e)) ; - GRB_TRY (GrB_Matrix_new (&exists_2, GrB_UINT8, 2 * n_keep, e)) ; - //GRB_TRY (GrB_Vector_new (&r_exists, GrB_UINT8, n_keep)) ; - GRB_TRY (GrB_Matrix_new(&interf, GrB_UINT8, 2 * n_keep, 2 * n_keep)); - GRB_TRY (GrB_Vector_new(&r_interf, GrB_UINT8, 2 * n_keep)) ; - GRB_TRY (GrB_transpose(E_t, NULL, NULL, E, GrB_DESC_R)) ; - - //Check if edges were anywhere in old graph: - GRB_TRY (GrB_mxm( - exists_1, NULL, NULL, LAGraph_plus_one_uint8, new_edges, E_t, NULL)) ; - - GRB_TRY (GrB_mxm( - interf, NULL, NULL, LAGraph_plus_one_uint8, new_edges, new_edges, GrB_DESC_T1 + + GRB_TRY (GrB_Matrix_new(&dense2_hash, GrB_UINT64, n, 2)) ; + GRB_TRY (GrB_Vector_new(&dense_hash, GrB_UINT64, n)) ; + GRB_TRY (GrB_Matrix_new(&new_hashed_edges, GrB_UINT64, n_keep, 2)) ; + GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; + + //This Scalar is used in the hash funtion and should be something near + // 2^60 and odd. + GRB_TRY (GrB_Matrix_assign_UINT64( + dense2_hash, NULL, NULL, 0xFB21C651E98DF25ULL, + GrB_ALL, 0, GrB_ALL, 0, NULL )) ; - GRB_TRY (GrB_Matrix_select_UINT8( - interf, NULL, NULL, GrB_OFFDIAG, interf, 0, NULL)) ; - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, NULL, GrB_MAX_MONOID_UINT8, - interf, NULL)); - //GRB_TRY (GrB_Matrix_select_UINT8( - // exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 2, NULL)) ; - // 2 if intended swap already exists in the matrix, 1 or noval otherwise - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_interf, NULL, GrB_MAX_UINT8, GrB_MAX_MONOID_UINT8, - exists_1, NULL)); - GRB_TRY (GrB_Vector_select_UINT8( - r_interf, NULL, NULL, GrB_VALUEEQ_UINT8, r_interf, (uint8_t) 2, NULL - )) ; + GRB_TRY (GrB_Vector_assign_UINT64( + dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL + )) ; + + // Hashing new edges into a swaps*2 x 2 matrix and existing into e x 1 + // vector + GRB_TRY(GrB_mxm( + new_hashed_edges, NULL, NULL, hash_edges2, + M_fours, dense2_hash, NULL + )); + GRB_TRY(GrB_mxv( + hashed_edges, NULL, NULL, hash_edges, + E, dense_hash, NULL + )); + // GxB_Vector_fprint(hashed_edges,"Hashes",GxB_SHORT, stdout); + // GxB_Matrix_fprint(M_fours,"M",GxB_COMPLETE, stdout); + // GxB_Matrix_fprint(new_hashed_edges,"Hashes",GxB_COMPLETE, stdout); + + + // I will unpack and then reconstruct with hash as index. + GRB_TRY(GxB_Matrix_unpack_FullR( + new_hashed_edges, (void **) &hash_vals_new, &junk_size, &iso, NULL + )) ; + GRB_TRY(GxB_Vector_unpack_Full( + hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL + )) ; + + GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, 1ULL << 60)) ; + GRB_TRY (GrB_Matrix_new( + &buckets, GrB_UINT8, 1ULL << 60, n_keep)) ; + // Build hash buckets + + GRB_TRY(GxB_Vector_build_Scalar( + exists, hash_vals, one8, e + )) ; + // GxB_Vector_fprint(exists,"exists",GxB_SHORT, stdout); + GRB_TRY(GxB_Matrix_build_Scalar( + buckets, hash_vals_new, half_ramp, one8, n_keep * 2 + )) ; + + + // Any collisions will use the monoid and will be marked by a 1 in the + // vector + GRB_TRY(GrB_Matrix_reduce_Monoid( + exists, NULL, GrB_PLUS_UINT8, GrB_PLUS_MONOID_UINT8, buckets, GrB_DESC_R + )) ; + //TODO: fix, this can overflow. + GRB_TRY(GrB_Vector_select_UINT8( + exists, NULL, NULL, GrB_VALUEGT_UINT8, exists, (uint8_t)1, GrB_DESC_R + )) ; + GrB_Index badcount; - GRB_TRY (GrB_Vector_nvals(&badcount, r_interf)) ; + GRB_TRY (GrB_Vector_nvals(&badcount, exists)) ; if(badcount == 0) { - E_arranged[1] = M_1; - E_arranged[2] = M_2; - pairs_new = pairs_i; + E_arranged[1] = M_fours; + pairs_new = pairs_4s; + GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; } else { - GRB_TRY (GrB_Vector_new(r_interf_arr, GrB_UINT8, n_keep)) ; - GRB_TRY (GrB_Vector_new(r_interf_arr + 1, GrB_UINT8, n_keep)) ; - GRB_TRY (GrB_Vector_new(&r_exists, GrB_UINT8, n_keep)) ; - - GrB_Index rows[2] = {n_keep,n_keep}; - GrB_Index cols[1] = {1}; - GRB_TRY(GxB_Matrix_split((GrB_Matrix *)r_interf_arr, 2, 1, rows, - cols, (GrB_Matrix) r_interf, NULL)); - GRB_TRY(GrB_eWiseAdd(r_exists, NULL, NULL, GxB_ANY_UINT8_MONOID, - r_interf_arr[0], r_interf_arr[1], NULL)); - - LG_TRY (LAGraph_Vector_Print (r_exists, LAGraph_SHORT, stdout, msg)) ; + GRB_TRY(GrB_Vector_new(&r_exists, GrB_UINT8, n_keep)) ; + // Search through array for bad swaps. + GRB_TRY(GrB_vxm( + r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL + )) ; // Get compliment vector - GRB_TRY (GrB_Vector_assign_UINT8( + GRB_TRY (GrB_Vector_assign_INT64( r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; GRB_TRY (GxB_Vector_unpack_CSC( r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, @@ -521,19 +585,33 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; - // TODO: Check if this needs to be transposed I think it does GRB_TRY (GrB_Matrix_extract( - E_arranged[1], NULL, NULL, M_1, arr_keep, n_keep, + E_arranged[1], NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_extract( - E_arranged[2], NULL, NULL, M_2, arr_keep, n_keep, - GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract( - pairs_new, NULL, NULL, pairs_i, arr_keep, n_keep, + pairs_new, NULL, NULL, pairs_4s, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); } + //Split the swapped edges into their correct places. + GRB_TRY (GrB_select( + E_arranged[2], NULL, NULL, first_bit, + E_arranged[1], (uint8_t) 0, NULL + )) ; + GRB_TRY (GrB_select( + E_arranged[1], NULL, NULL, first_bit, + E_arranged[1], (uint8_t) 1, GrB_DESC_R + )) ; + + GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( + E_arranged[1], NULL, NULL, GrB_DIV_UINT8, E_arranged[1], 2, NULL + )) ; + GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( + E_arranged[2], NULL, NULL, GrB_DIV_UINT8, E_arranged[2], 2, NULL + )) ; + // GxB_Matrix_fprint(E_arranged[1],"news",GxB_COMPLETE, stdout); + // GxB_Matrix_fprint(E_arranged[2],"news",GxB_COMPLETE, stdout); GrB_Index n_old; GRB_TRY (GrB_Matrix_reduce_Monoid( r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs_new, GrB_DESC_RT0)); @@ -547,11 +625,12 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Free(&junk, msg)) ; LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; + + // old edges that are being kept. GRB_TRY (GrB_Matrix_new(E_arranged, GrB_UINT8, n_old, n)) ; GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, arr_keep, n_old, GrB_ALL, n, NULL)) ; LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - // E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is @@ -570,13 +649,10 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Random_Next(random_v, msg)) ; printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } - - GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; GRB_TRY (GrB_mxm( - *A_new, NULL, NULL, LAGraph_any_one_uint8, E, E, GrB_DESC_T0)) ; + *A_new, NULL, NULL, LAGraph_plus_one_uint8, E, E, GrB_DESC_T0)) ; GRB_TRY(GrB_Matrix_select_UINT8( *A_new, NULL, NULL, GrB_OFFDIAG, *A_new, (uint8_t) 0, NULL)) ; - LG_FREE_WORK ; return (GrB_SUCCESS) ; } diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index f444cbdfbb..1b177e66a9 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -94,6 +94,7 @@ void test_SwapEdges (void) GrB_Index n = 0; OK (LAGraph_Cached_OutDegree (G, msg)) ; OK (GrB_Matrix_nrows(&n, G->A)); + //---------------------------------------------------------------------- // test the algorithm //---------------------------------------------------------------------- From 2971ab177b38b215d6f5de847781300d19e0dd1a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 4 Nov 2024 00:05:02 -0600 Subject: [PATCH 021/115] Cleaned up demo and Swap variables --- experimental/algorithm/LAGraph_SwapEdges.c | 44 +++++++++------------- experimental/benchmark/edgeSwap_demo.c | 11 +++--- 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 000340ab47..0845465744 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -21,8 +21,6 @@ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ GrB_free (&pairs_4s) ; \ - GrB_free (&M_1) ; \ - GrB_free (&M_2) ; \ GrB_free (E_arranged) ; \ GrB_free (E_arranged + 1) ; \ GrB_free (E_arranged + 2) ; \ @@ -33,6 +31,8 @@ GrB_free(&buckets); \ GrB_free(&hashed_edges); \ GrB_free(&exists); \ + GrB_free(&dense2_hash); \ + GrB_free(&dense_hash); \ LAGraph_Free((void **) &hash_vals_new, NULL);\ LAGraph_Free((void **) &hash_vals, NULL); \ } @@ -42,7 +42,6 @@ /* free any workspace used here */ \ GrB_free (&E) ; \ GrB_free (&E_half) ; \ - GrB_free (&E_t) ; \ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ @@ -55,13 +54,19 @@ GrB_free (&first_bit) ; \ GrB_free (&swap_op) ; \ GrB_free (&any_bxor) ; \ + GrB_free (&hash_one) ; \ + GrB_free (&hash_two) ; \ + GrB_free (&bhash_one) ; \ + GrB_free (&bhash_two) ; \ + GrB_free (&hash_edges) ; \ + GrB_free (&hash_edges2) ; \ LAGraph_Free((void**)&row_indices, msg) ; \ LAGraph_Free((void**)&col_indices, msg) ; \ - LAGraph_Free((void**)&values, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ - LAGraph_Free((void**)&edge_perm, msg) ; \ LAGraph_Free((void**)&swap_type, msg) ; \ + LAGraph_Free((void**)&edge_perm, msg) ; \ + LAGraph_Free((void**)&swaps, msg) ; \ FREE_LOOP ; \ } @@ -154,7 +159,6 @@ int LAGraph_SwapEdges //-------------------------------------------------------------------------- GrB_Matrix A = NULL; // n x n Adjacency Matrix GrB_Matrix E = NULL; // e x n Incidence Matrix - GrB_Matrix E_t = NULL; // n x e Incidence Transposed // cmatrix [E_selected, M_1, M_2] GrB_Matrix E_arranged[3] = {NULL, NULL, NULL}; @@ -171,13 +175,7 @@ int LAGraph_SwapEdges GrB_Matrix M = NULL; GrB_Matrix M_fours = NULL; // M with exactly 4 entries - GrB_Matrix M_1 = NULL; // M_1 + M_2 = M - GrB_Matrix M_2 = NULL; // M_1 + M_2 = M - - // Has a 2 in a certain row if the planned swap already exists in the matrix - GrB_Matrix exists_1 = NULL, exists_2 = NULL; - - GrB_Index n = 0, e = 0, nvals = 0; + GrB_Index n = 0, e = 0; // Copied vars from LAGraph_Incidence_Matrix GrB_Matrix E_half = NULL ; @@ -186,9 +184,8 @@ int LAGraph_SwapEdges // random vector GrB_Vector random_v = NULL, r_permute = NULL, r_sorted = NULL; - GrB_Index *row_indices = NULL ; - GrB_Index *col_indices = NULL ; - void *values = NULL ; + //indicies for A + GrB_Index *row_indices = NULL, *col_indices = NULL ; // [0,2,0,3,0,3,0 . . .] numSwaps? GrB_Vector swapVals = NULL; @@ -218,13 +215,14 @@ int LAGraph_SwapEdges GrB_Matrix dense2_hash = NULL, new_hashed_edges = NULL, buckets = NULL; GrB_Vector dense_hash = NULL, hashed_edges = NULL, exists = NULL; GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; + uint8_t *swaps = NULL; + GrB_IndexUnaryOp first_bit = NULL; GrB_IndexUnaryOp swap_op = NULL; GzB_IndexBinaryOp hash_one = NULL, hash_two = NULL; GrB_BinaryOp bhash_one = NULL, bhash_two = NULL; GrB_Semiring hash_edges = NULL, hash_edges2 = NULL; - GrB_Monoid one_monoid = NULL; GrB_Semiring any_bxor = NULL; @@ -258,7 +256,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, e, n)) ; GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, e, n)) ; - GRB_TRY (GrB_Matrix_new (&E_t, GrB_UINT8, n, e)) ; GRB_TRY (GxB_IndexUnaryOp_new ( &first_bit, (GxB_index_unary_function) (&first_bit_equals), @@ -296,8 +293,7 @@ int LAGraph_SwapEdges GRB_TRY(GrB_Semiring_new( &any_bxor, GxB_ANY_UINT8_MONOID ,GrB_BXOR_UINT8 )) ; - GRB_TRY(GxB_Monoid_terminal_new( - &one_monoid, GrB_ONEB_UINT8, (uint8_t) 255, (uint8_t) 1)); + GrB_Index num_swaps = 0, num_attempts = 0; // Q: Should this decrease if edges are interfering alot? // Bound number of swaps by E-2 * (max deg)? @@ -327,10 +323,8 @@ int LAGraph_SwapEdges // QUESTION: can't I just use an unpack and use the arrays GBLAS allocated? LG_TRY (LAGraph_Malloc ((void**)(&row_indices), e, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&col_indices), e, sizeof(GrB_Index), msg)) ; - LG_TRY (LAGraph_Malloc ((void**)(&values), e, sizeof(bool), msg)) ; - GRB_TRY ( - GrB_Matrix_extractTuples_BOOL (row_indices, col_indices, values, &e, A_tril) + GrB_Matrix_extractTuples_BOOL (row_indices, col_indices, NULL, &e, A_tril) ) ; //Build large ramp @@ -366,7 +360,6 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Free((void**)(&row_indices), msg)); LG_TRY (LAGraph_Free((void**)(&col_indices), msg)); - LG_TRY (LAGraph_Free((void**)(&values), msg)); GRB_TRY (GrB_Vector_assign_UINT8 ( x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; @@ -411,21 +404,18 @@ int LAGraph_SwapEdges r_sorted, (uint8_t) 0, NULL)) ; // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap // Also - // TODO: handle memory // TODO: try and make this more efficient maybe just rand % e rather // than a permutation GrB_Index perm_size, swap_size; GRB_TRY (GxB_Vector_unpack_Full( r_permute, (void **)&edge_perm, &perm_size, &iso, NULL )) ; - uint8_t *swaps = NULL; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); GRB_TRY (GxB_Vector_unpack_Full( swapVals, (void **)&swaps, &swap_size, NULL, NULL )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - // Pair edges. Take a random permutation and pair adjacent values. // pairs wants: // cols: [0, 0, 1, 1, 2, 2, 3, 3, . . .] (ramp / 2) diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c index 26ebbcb0dd..a181f9d689 100644 --- a/experimental/benchmark/edgeSwap_demo.c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -58,6 +58,7 @@ int main (int argc, char **argv) // mtx2bin_demo). double t = LAGraph_WallClockTime ( ) ; + GrB_Index swaps = (argc > 2) ? atoi(argv [2]): 100; char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; LG_TRY (readproblem ( &G, // the graph that is read from stdin or a file @@ -81,12 +82,12 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf("Time To Swap #################################################") ; t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_SwapEdges (&Y, G, (GrB_Index) 10, msg)) ; + LG_TRY (LAGraph_SwapEdges (&Y, G, swaps, msg)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for LAGraph_SwapEdges: %g sec\n", t) ; + printf ("===============================TLAGraph_SwapEdges took: %g sec\n", t) ; //-------------------------------------------------------------------------- - // check the results (make sure Y is a copy of G->A) + // check the results //-------------------------------------------------------------------------- t = LAGraph_WallClockTime ( ) ; @@ -102,8 +103,8 @@ int main (int argc, char **argv) // print the results (Y is just a copy of G->A) //-------------------------------------------------------------------------- - printf ("\n===============================The result matrix Y:\n") ; - LG_TRY (LAGraph_Matrix_Print (Y, LAGraph_SHORT, stdout, msg)) ; + printf ("\n===============================The result matrix:\n") ; + LG_TRY (LAGraph_Matrix_Print (G_new -> A, LAGraph_SHORT, stdout, msg)) ; //-------------------------------------------------------------------------- // free everyting and finish From e5a3c6c0439e99096a41dc67c3eaaead010953b6 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 5 Nov 2024 16:01:06 -0600 Subject: [PATCH 022/115] Simplified RCC Calculation --- .../algorithm/LAGraph_RichClubCoefficient.c | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 442171539c..d69f338808 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -41,13 +41,14 @@ GrB_free(&edge_degrees) ; \ GrB_free(°rees) ; \ GrB_free(&node_edges) ; \ + GrB_free(&ones_v) ; \ GrB_free(&edges_per_deg) ; \ GrB_free(&verts_per_deg) ; \ GrB_free(&iseq_2lt) ; \ GrB_free(&plus_2le) ; \ GrB_free(&rcCalculation) ; \ LAGraph_Free((void **) &index_edge, NULL) ; \ - LAGraph_Free((void **) &node_edges_arr, NULL); \ + LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ LAGraph_Free((void **) &edges_per_deg_arr, NULL); \ LAGraph_Free((void **) &ones, NULL); \ @@ -135,6 +136,9 @@ int LAGraph_RichClubCoefficient // the ith entry contains the number of verticies whose degree is i. GrB_Vector verts_per_deg = NULL; + //Vector of ones + GrB_Vector ones_v = NULL; + // 2 * (x < y) + (x == y) GrB_BinaryOp iseq_2lt = NULL; @@ -202,8 +206,7 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_assign_INT64( degrees, degrees, NULL, (int64_t) -1, GrB_ALL, 0, GrB_DESC_SC)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( - degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, GrB_DESC_R)) ; + int64_t max_deg; GRB_TRY(GrB_Vector_reduce_INT64( &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; @@ -216,17 +219,19 @@ int LAGraph_RichClubCoefficient // Each edge in the graph gets the value of the degree of its column node GRB_TRY (GrB_mxm( - edge_degrees, NULL, NULL, GxB_ANY_SECOND_INT64, A, D, NULL)) ; + edge_degrees, NULL, NULL, GxB_ANY_FIRST_INT64, D, A, NULL)) ; - // If the nodes of an edge have different degrees, the edge is counted once. - // If they have the same degree, that edge is double counted. So, we adjust: - GRB_TRY(GrB_mxm( - edge_degrees, NULL, NULL, plus_2le, D, edge_degrees, NULL)) ; + // // If the nodes of an edge have different degrees, the edge is counted once. + // // If they have the same degree, that edge is double counted. So, we adjust: + // GRB_TRY(GrB_mxm( + // edge_degrees, NULL, NULL, plus_2le, D, edge_degrees, NULL)) ; + // // Sum up the number of edges each node is "responsible" for. + // GRB_TRY(GrB_Matrix_reduce_Monoid( + // node_edges, NULL, NULL, GrB_PLUS_MONOID_INT64, edge_degrees, NULL)) ; - // Sum up the number of edges each node is "responsible" for. - GRB_TRY(GrB_Matrix_reduce_Monoid( - node_edges, NULL, NULL, GrB_PLUS_MONOID_INT64, edge_degrees, NULL)) ; + GRB_TRY (GrB_mxv( + node_edges, NULL, NULL, plus_2le, edge_degrees, degrees, NULL)) ; // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. @@ -246,6 +251,9 @@ int LAGraph_RichClubCoefficient } else { + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, GrB_DESC_R)) ; + GRB_TRY(GxB_Vector_unpack_CSC( node_edges, &index_edge, (void **) &node_edges_arr, &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; @@ -261,11 +269,14 @@ int LAGraph_RichClubCoefficient GRB_TRY(GrB_Vector_build ( edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, GrB_PLUS_INT64)) ; - // TODO: Make ones array in a better way + + //Hack to make an array of ones LG_TRY( LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; - for(uint64_t i = 0; i < deg_vec_size; ++i) - ones[i] = 1; + GRB_TRY(GrB_Vector_new(&ones_v, GrB_INT64, deg_vec_size)); + GRB_TRY(GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY(GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; GRB_TRY(GrB_Vector_build ( verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; From b5e06883fdc556943339e61d54b04de68b88b777 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 7 Nov 2024 14:00:06 -0600 Subject: [PATCH 023/115] fixes to swap edges --- .../algorithm/LAGraph_RichClubCoefficient.c | 13 +++------- experimental/algorithm/LAGraph_SwapEdges.c | 24 +++++++++---------- experimental/benchmark/edgeSwap_demo.c | 11 ++++++++- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index d69f338808..8080927c93 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -196,7 +196,7 @@ int LAGraph_RichClubCoefficient GrB_FP64, GrB_INT64, GrB_INT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; - // degrees = G->out_degree + // degrees = G->out_degree - 1 GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; @@ -221,17 +221,10 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_mxm( edge_degrees, NULL, NULL, GxB_ANY_FIRST_INT64, D, A, NULL)) ; - // // If the nodes of an edge have different degrees, the edge is counted once. - // // If they have the same degree, that edge is double counted. So, we adjust: - // GRB_TRY(GrB_mxm( - // edge_degrees, NULL, NULL, plus_2le, D, edge_degrees, NULL)) ; - // // Sum up the number of edges each node is "responsible" for. - // GRB_TRY(GrB_Matrix_reduce_Monoid( - // node_edges, NULL, NULL, GrB_PLUS_MONOID_INT64, edge_degrees, NULL)) ; - - + // Sum up the number of edges each node is "responsible" for. GRB_TRY (GrB_mxv( node_edges, NULL, NULL, plus_2le, edge_degrees, degrees, NULL)) ; + // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 0845465744..2ae0483c62 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -344,12 +344,13 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_unpack_Full ( hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; - GrB_Scalar zero8 ; - GrB_Scalar one8 ; + GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; + GRB_TRY (GrB_Scalar_new (&one64, GrB_UINT64)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; + GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; GRB_TRY (GxB_Matrix_build_Scalar (E_half, ramp, col_indices, zero8, e)) ; GRB_TRY (GxB_Matrix_build_Scalar (E, ramp, row_indices, one8, e)) ; @@ -523,29 +524,28 @@ int LAGraph_SwapEdges hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, 1ULL << 60)) ; + GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; GRB_TRY (GrB_Matrix_new( - &buckets, GrB_UINT8, 1ULL << 60, n_keep)) ; - // Build hash buckets + &buckets, GrB_UINT64, 1ULL << 60, n_keep)) ; + // Build hash buckets GRB_TRY(GxB_Vector_build_Scalar( - exists, hash_vals, one8, e + exists, hash_vals, one64, e )) ; // GxB_Vector_fprint(exists,"exists",GxB_SHORT, stdout); GRB_TRY(GxB_Matrix_build_Scalar( - buckets, hash_vals_new, half_ramp, one8, n_keep * 2 + buckets, hash_vals_new, half_ramp, one64, n_keep * 2 )) ; - // Any collisions will use the monoid and will be marked by a 1 in the // vector GRB_TRY(GrB_Matrix_reduce_Monoid( - exists, NULL, GrB_PLUS_UINT8, GrB_PLUS_MONOID_UINT8, buckets, GrB_DESC_R + exists, NULL, GrB_PLUS_UINT64, GrB_PLUS_MONOID_UINT64, buckets, NULL )) ; - //TODO: fix, this can overflow. - GRB_TRY(GrB_Vector_select_UINT8( - exists, NULL, NULL, GrB_VALUEGT_UINT8, exists, (uint8_t)1, GrB_DESC_R + GRB_TRY(GrB_Vector_select_UINT64( + exists, NULL, NULL, GrB_VALUEGT_UINT64, exists, 1ull, GrB_DESC_R )) ; + // GxB_Vector_fprint(exists,"exists",GxB_SHORT, stdout); GrB_Index badcount; GRB_TRY (GrB_Vector_nvals(&badcount, exists)) ; diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c index a181f9d689..50d50fdcf9 100644 --- a/experimental/benchmark/edgeSwap_demo.c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -84,7 +84,7 @@ int main (int argc, char **argv) t = LAGraph_WallClockTime ( ) ; LG_TRY (LAGraph_SwapEdges (&Y, G, swaps, msg)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("===============================TLAGraph_SwapEdges took: %g sec\n", t) ; + printf ("===============================LAGraph_SwapEdges took: %g sec\n", t) ; //-------------------------------------------------------------------------- // check the results @@ -96,6 +96,15 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G_new, msg)) ; LG_TRY (LAGraph_Vector_IsEqual( &result, G->out_degree, G_new->out_degree, msg)) ; + if (result) + { + printf ("Test passed.\n") ; + } + else + { + printf ("Test failure!\n") ; + } + t = LAGraph_WallClockTime ( ) - t ; printf ("Time to check results: %g sec\n", t) ; From 37a9d4113234f317fd9806f6ec09d55f5fed6da7 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 8 Nov 2024 19:27:00 -0600 Subject: [PATCH 024/115] Changed from using incidence matrix --- experimental/algorithm/LAGraph_SwapEdges.c | 459 ++++++++++++--------- 1 file changed, 255 insertions(+), 204 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 2ae0483c62..5869847ebb 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -17,7 +17,7 @@ #define FREE_LOOP \ { \ - GrB_free (&pairs) ; \ + GrB_free (&P) ; \ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ GrB_free (&pairs_4s) ; \ @@ -31,8 +31,6 @@ GrB_free(&buckets); \ GrB_free(&hashed_edges); \ GrB_free(&exists); \ - GrB_free(&dense2_hash); \ - GrB_free(&dense_hash); \ LAGraph_Free((void **) &hash_vals_new, NULL);\ LAGraph_Free((void **) &hash_vals, NULL); \ } @@ -41,7 +39,6 @@ { \ /* free any workspace used here */ \ GrB_free (&E) ; \ - GrB_free (&E_half) ; \ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ @@ -51,12 +48,15 @@ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ + GrB_free(&dense_hash); \ + GrB_free (&swap_p) ; \ GrB_free (&first_bit) ; \ GrB_free (&swap_op) ; \ - GrB_free (&any_bxor) ; \ + GrB_free (&bxor_first) ; \ + GrB_free(&hash_s); \ GrB_free (&hash_one) ; \ GrB_free (&hash_two) ; \ - GrB_free (&bhash_one) ; \ + GrB_free (&hash_seed) ; \ GrB_free (&bhash_two) ; \ GrB_free (&hash_edges) ; \ GrB_free (&hash_edges2) ; \ @@ -83,15 +83,15 @@ #include "LAGraphX.h" void first_bit_equals - (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit) + (bool *z, const uint64_t *x) { - (*z) = (uint8_t) (((*x) & 1) ^ (*bit)); + (*z) = (bool) ((*x) & 1); } #define FIRST_BIT_EQ \ "void first_bit_equals \n"\ -" (uint8_t *z, const uint8_t *x, int64_t i, int64_t j, const uint8_t *bit)\n"\ +" (bool *z, const uint64_t *x) \n"\ " { \n"\ -" (*z) = (uint8_t) (((*x) & 1) ^ (*bit)); \n"\ +" (*z) = (bool) ((*x) & 1); \n"\ " }" // creates [0,3,1,2,1,3,. . .] pattern from random vector. @@ -113,17 +113,15 @@ void swap_pattern // collisions unless the input graph is very specifically constucted void hash_node - (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, - const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int32_t *nbits) + (uint64_t *z, const uint64_t *x, const uint64_t *y) { - (*z) = ((*y) * j_x) >> (64 - *nbits); + (*z) = ((*y) * (*x)) >> (4); } #define HASH_ONE \ "void hash_node \n"\ -" (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, \n"\ -" const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int *nbits) \n"\ +" (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ "{ \n"\ -" (*z) = ((*y) * j_x) >> (64 - *nbits); \n"\ +" (*z) = ((*y) * (*x)) >> (4); \n"\ "}" //hash that places the values for the pair of nodes corresponding to one edge in @@ -158,7 +156,9 @@ int LAGraph_SwapEdges // Declorations //-------------------------------------------------------------------------- GrB_Matrix A = NULL; // n x n Adjacency Matrix - GrB_Matrix E = NULL; // e x n Incidence Matrix + + // e x 2 with entries corresponding to verticies of an edge + GrB_Matrix E = NULL; // cmatrix [E_selected, M_1, M_2] GrB_Matrix E_arranged[3] = {NULL, NULL, NULL}; @@ -166,19 +166,19 @@ int LAGraph_SwapEdges // swaps x e // Selected pairs for next batch of swaps // Each row contains 2 entries for the edges involved in a swap. - GrB_Matrix pairs = NULL, pairs_4s = NULL; + GrB_Matrix P = NULL, pairs_4s = NULL; GrB_Matrix pairs_new = NULL; - // swaps x n - // Each row contains 4 or less entries corresponding to the verticies + // swaps x 4 + // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. GrB_Matrix M = NULL; + GrB_Matrix M_xor = NULL; // swaps x 2 with a zero in self edges. GrB_Matrix M_fours = NULL; // M with exactly 4 entries GrB_Index n = 0, e = 0; // Copied vars from LAGraph_Incidence_Matrix - GrB_Matrix E_half = NULL ; GrB_Matrix A_tril = NULL ; // random vector @@ -190,9 +190,17 @@ int LAGraph_SwapEdges // [0,2,0,3,0,3,0 . . .] numSwaps? GrB_Vector swapVals = NULL; + // e x 2 Matrix that picks the edges for which we will swap values. + GrB_Matrix swapMask = NULL; + + + GrB_Matrix swap_p = NULL; + // This ramp will likely get recycled a few times. GrB_Vector ramp_v = NULL; GrB_Vector hramp_v = NULL; + + // C array [0, ... , e-1] GrB_Index *ramp = NULL ; GrB_Index *half_ramp = NULL ; @@ -203,8 +211,9 @@ int LAGraph_SwapEdges // Reduced Vectors GrB_Vector M_outdeg = NULL, r_exists = NULL, r_pairs; + GrB_Matrix existMask = NULL; - // n vector of zeroes + // 4 x 1 full vector GrB_Vector x = NULL; // Number of values kept in each phase @@ -212,19 +221,21 @@ int LAGraph_SwapEdges GrB_Index *arr_keep = NULL; void *junk = NULL; - GrB_Matrix dense2_hash = NULL, new_hashed_edges = NULL, buckets = NULL; + // 4 x 2 Matrix Hashes cols 0,2 and 1,3 + GrB_Matrix hash_s = NULL; + GrB_Matrix new_hashed_edges = NULL, buckets = NULL; GrB_Vector dense_hash = NULL, hashed_edges = NULL, exists = NULL; GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; uint8_t *swaps = NULL; - GrB_IndexUnaryOp first_bit = NULL; + GrB_UnaryOp first_bit = NULL; GrB_IndexUnaryOp swap_op = NULL; GzB_IndexBinaryOp hash_one = NULL, hash_two = NULL; - GrB_BinaryOp bhash_one = NULL, bhash_two = NULL; + GrB_BinaryOp bhash_two = NULL, hash_seed = NULL; GrB_Semiring hash_edges = NULL, hash_edges2 = NULL; - GrB_Semiring any_bxor = NULL; + GrB_Semiring bxor_first = NULL; A = G->A ; //-------------------------------------------------------------------------- @@ -254,22 +265,22 @@ int LAGraph_SwapEdges GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - GRB_TRY (GrB_Matrix_new(&E, GrB_UINT8, e, n)) ; - GRB_TRY (GrB_Matrix_new (&E_half, GrB_UINT8, e, n)) ; + GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &first_bit, (GxB_index_unary_function) (&first_bit_equals), - GrB_UINT8, GrB_UINT8, GrB_UINT8, "first_bit_equals", FIRST_BIT_EQ + + GRB_TRY (GxB_UnaryOp_new ( + &first_bit, (GxB_unary_function) (&first_bit_equals), + GrB_BOOL, GrB_UINT64, "first_bit_equals", FIRST_BIT_EQ )) ; GRB_TRY (GxB_IndexUnaryOp_new ( &swap_op, (GxB_index_unary_function) (&swap_pattern), GrB_UINT8, GrB_UINT64, GrB_UINT8, "swap_pattern", SWAP_PAT )) ; - - GRB_TRY(GzB_IndexBinaryOp_new( - &hash_one, (GzB_index_binary_function) (&hash_node), - GrB_UINT64, GrB_UINT8, GrB_UINT64, GrB_INT32, "hash_node", HASH_ONE + GRB_TRY(GxB_BinaryOp_new( + &hash_seed, (GxB_binary_function) (&hash_node), + GrB_UINT64, GrB_UINT64, GrB_UINT64, "hash_node", HASH_ONE )) ; + GRB_TRY(GzB_IndexBinaryOp_new( &hash_two, (GzB_index_binary_function) (&hash_pair), GrB_UINT64, GrB_UINT8, GrB_UINT64, GrB_INT32, "hash_pair", HASH_TWO @@ -278,20 +289,19 @@ int LAGraph_SwapEdges GrB_Scalar sizeTheta ; // hash size GrB_Scalar_new (&sizeTheta, GrB_INT32) ; GrB_Scalar_setElement_INT32 (sizeTheta, 60); - GRB_TRY(GzB_BinaryOp_new_IndexOp(&bhash_one, hash_one, sizeTheta)); GRB_TRY(GzB_BinaryOp_new_IndexOp(&bhash_two, hash_two, sizeTheta)); // I use a bit wise xor to combine the hashes since the same column number - // will no appear twice in my multiplication and I want combination to be + // will not appear twice in my multiplication and I want combination to be // commutative. GRB_TRY(GrB_Semiring_new( - &hash_edges, GxB_BXOR_UINT64_MONOID, bhash_one + &hash_edges, GxB_BXOR_UINT64_MONOID, hash_seed )) ; GRB_TRY(GrB_Semiring_new( &hash_edges2, GxB_BXOR_UINT64_MONOID, bhash_two )) ; GRB_TRY(GrB_Semiring_new( - &any_bxor, GxB_ANY_UINT8_MONOID ,GrB_BXOR_UINT8 + &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; GrB_Index num_swaps = 0, num_attempts = 0; @@ -309,28 +319,36 @@ int LAGraph_SwapEdges // duplicate edges and self paired edges later. // (inteference matrix will detect) + GrB_Matrix y; GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new (&x, GrB_UINT8, n)) ; + GRB_TRY (GrB_Vector_new (&dense_hash, GrB_UINT64, 2)) ; + GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; + GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; + GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; GRB_TRY (GrB_Vector_new (&r_pairs, GrB_INT64, e)) ; + GRB_TRY (GrB_Vector_new (&x, GrB_INT8, 4)) ; + // Extract adjacency matrix to make incidence matrix - E // get just the lower triangular entries //TODO: should I remove the diagonal? change the 0 if so // Arrays to extract A into - // QUESTION: can't I just use an unpack and use the arrays GBLAS allocated? - LG_TRY (LAGraph_Malloc ((void**)(&row_indices), e, sizeof(GrB_Index), msg)) ; - LG_TRY (LAGraph_Malloc ((void**)(&col_indices), e, sizeof(GrB_Index), msg)) ; + + LG_TRY (LAGraph_Malloc ((void**)(&row_indices), 2 * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( - GrB_Matrix_extractTuples_BOOL (row_indices, col_indices, NULL, &e, A_tril) + GrB_Matrix_extractTuples_BOOL (row_indices, row_indices + e, NULL, &e, A_tril) ) ; + GRB_TRY (GxB_Matrix_pack_FullC ( + E, (void **)&row_indices, 2 * e * sizeof(GrB_Index), false, NULL + )) ; //Build large ramp GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT8, e)) ; + GRB_TRY (GrB_Vector_new(&swapVals, GrB_BOOL, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; @@ -352,18 +370,24 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - GRB_TRY (GxB_Matrix_build_Scalar (E_half, ramp, col_indices, zero8, e)) ; - GRB_TRY (GxB_Matrix_build_Scalar (E, ramp, row_indices, one8, e)) ; - - // I'd like to be able to pass in a NULL addition opperator and get an error - // if it has to be used - GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_UINT8, E, E_half, NULL)) ; - - LG_TRY (LAGraph_Free((void**)(&row_indices), msg)); - LG_TRY (LAGraph_Free((void**)(&col_indices), msg)); GRB_TRY (GrB_Vector_assign_UINT8 ( - x, NULL, NULL, 0, GrB_ALL, n, NULL)) ; + dense_hash, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Matrix_assign_UINT8 ( + y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign_UINT8 ( + x, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY(GrB_Matrix_select_UINT64(y, NULL, NULL, GrB_OFFDIAG, y, 0, NULL)) ; + + GrB_Index hcols[] = {0, 0, 1, 1}; + GrB_Index srows[] = {0, 1, 2, 3}; + GrB_Index scols[] = {0, 2, 1, 3}; + GRB_TRY(GxB_Matrix_build_Scalar( + hash_s, scols, hcols, one64, 4 + )) ; + GRB_TRY(GxB_Matrix_build_Scalar( + swap_p, srows, scols, one64, 4 + )) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; @@ -393,29 +417,25 @@ int LAGraph_SwapEdges // They do not have to be randomly assigned. // random_v has a radom dense vector. - GRB_TRY (GrB_Matrix_new(&pairs, GrB_UINT8, swaps_per_loop, e)) ; - GRB_TRY (GrB_Matrix_new(&M, GrB_UINT8, swaps_per_loop, n)) ; + GRB_TRY (GrB_Matrix_new(&P, GrB_UINT8, e, e)) ; + GRB_TRY (GrB_Matrix_new (&M_xor, GrB_UINT8, swaps_per_loop, 2)) ; + GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_UINT8, swaps_per_loop)) ; GRB_TRY (GxB_Vector_sort ( r_sorted, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - GRB_TRY(GrB_Vector_apply_IndexOp_UINT8(swapVals, NULL, NULL, swap_op, - r_sorted, (uint8_t) 0, NULL)) ; - // NOTE: Small typo on 6.11.6. Refers to vb even though its not a bitmap - // Also + GRB_TRY(GrB_Vector_apply(swapVals, NULL, NULL, first_bit, + r_sorted, NULL)) ; + // TODO: try and make this more efficient maybe just rand % e rather // than a permutation - GrB_Index perm_size, swap_size; + GrB_Index perm_size; GRB_TRY (GxB_Vector_unpack_Full( r_permute, (void **)&edge_perm, &perm_size, &iso, NULL )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - GRB_TRY (GxB_Vector_unpack_Full( - swapVals, (void **)&swaps, &swap_size, NULL, NULL - )) ; - LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); // Pair edges. Take a random permutation and pair adjacent values. // pairs wants: @@ -427,85 +447,87 @@ int LAGraph_SwapEdges // vals[i] += vals[i] > vals[i-1] // I know it will be alot less safe but is it more efficient to pack // pairs as needed? Doubt it. - GRB_TRY (GrB_Matrix_build_UINT8( - pairs, half_ramp, edge_perm, swaps, swaps_per_loop * 2, NULL - )); - // QUESTION: do I repack just to throw away? - GRB_TRY (GxB_Vector_pack_Full( - r_permute, (void **)&edge_perm, perm_size, false, NULL - )) ; - GRB_TRY (GxB_Vector_pack_Full( - swapVals, (void **)&swaps, swap_size, false, NULL - )) ; - - // each row of M will have 4 values [0,1,2,3] - // pairs | E | M - // 0 | 0,1 | 0,1 - // 2 | 0,1 | 2,3 - // 3 | 0,1 | 3,2 - // This gives us randomization as to which type of swap is happening. - // M = pairs * E (any_bxor) - GRB_TRY (GrB_mxm(M, NULL, NULL, any_bxor, pairs, E, NULL)) ; - + // uint64_t *val_of_P = NULL; + // LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(GrB_Index), msg)) ; + // val_of_P[0] = 1; + // GRB_TRY (GxB_Matrix_pack_CSR( + // P, &ramp, &edge_perm, (void**) &val_of_P, (e + 1) * sizeof(GrB_Index), + // perm_size, sizeof(GrB_Index) , true, false, NULL + // )); // TODO: Should there be a function that takes in A matrix and computes // in or out degree - - // Remove rows with less than 3 entries - GRB_TRY (GrB_mxv (M_outdeg, NULL, NULL, LAGraph_plus_one_uint8, - M, x, NULL)) ; - GRB_TRY (GrB_Vector_select_UINT8( - M_outdeg, NULL, NULL, GrB_VALUEEQ_UINT8, M_outdeg, (uint8_t) 4, NULL)) ; - GRB_TRY (GrB_Vector_nvals(&n_keep, M_outdeg)); + GRB_TRY (GxB_Matrix_build_Scalar( + P, ramp, edge_perm, one8, e + )); + //Permute the edges + GRB_TRY (GrB_mxm(E, NULL, NULL, GxB_ANY_SECOND_UINT64, P, E, NULL)) ; + + + //increase width of sorted so it can be used as a mask. + GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, + (GrB_Matrix) swapVals, (GrB_Matrix) dense_hash, GrB_DESC_T1)) ; + //swap vertexes in E randomly. + GRB_TRY (GrB_mxm( + E, swapMask, NULL, GxB_ANY_FIRST_UINT64, E, y, NULL)) ; + GRB_TRY (GrB_Matrix_dup(&M,E)); + GRB_TRY (GrB_Matrix_resize(M, swaps_per_loop * 2, 2)); + GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop, 4, NULL)) ; + // GxB_Matrix_fprint(M, "M", GxB_SHORT, stdout); + + // // Remove rows with less than 3 entries + // GRB_TRY (GrB_mxm ( + // M_xor, NULL, NULL, bxor_first, M, hash_vals, NULL + // )) ; + // GRB_TRY (GrB_Matrix_reduce_Monoid(M_outdeg, NULL, NULL, + // GrB_MIN_MONOID_UINT64, M_xor, NULL)) ; + // GRB_TRY (GrB_Vector_select_UINT8( + // M_outdeg, NULL, NULL, GrB_VALUENE_UINT8, M_outdeg, (uint8_t) 0, NULL + // )) ; + // GRB_TRY (GrB_Vector_nvals(&n_keep, M_outdeg)); GrB_Index arr_size, junk_size; - if(n_keep == swaps_per_loop) - { - M_fours = M; - pairs_4s = pairs; - } - else // Remove bad swaps - { - GRB_TRY (GxB_Vector_unpack_CSC( - M_outdeg, &arr_keep, &junk, &arr_size, &junk_size, &iso, - &n_keep, NULL, NULL)) ; - LG_ASSERT_MSG(iso, GrB_NOT_IMPLEMENTED, "GraphBLAS unexpectedly gave me" - " a matrix that is not iso"); - LG_TRY (LAGraph_Free(&junk, msg)); + // if(n_keep == swaps_per_loop) + // { + // M_fours = M; + // pairs_4s = P; + // } + // else // Remove bad swaps + // { + // GRB_TRY (GxB_Vector_unpack_CSC( + // M_outdeg, &arr_keep, &junk, &arr_size, &junk_size, &iso, + // &n_keep, NULL, NULL)) ; + // LG_TRY (LAGraph_Free(&junk, msg)); - GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, e)) ; - - GRB_TRY (GrB_Matrix_extract( - M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract( - pairs_4s, NULL, NULL, pairs, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_free(&M)); - GRB_TRY (GrB_free(&pairs)); - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - } - - - GRB_TRY (GrB_Matrix_new(&dense2_hash, GrB_UINT64, n, 2)) ; - GRB_TRY (GrB_Vector_new(&dense_hash, GrB_UINT64, n)) ; - GRB_TRY (GrB_Matrix_new(&new_hashed_edges, GrB_UINT64, n_keep, 2)) ; + // GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, 2)) ; + // GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, 2)) ; + + // GRB_TRY (GrB_Matrix_extract( + // M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + // GRB_TRY (GrB_Matrix_extract( + // pairs_4s, NULL, NULL, P, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + // GRB_TRY (GrB_free(&M)); + // GRB_TRY (GrB_free(&P)); + // LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + // } + + + GRB_TRY (GrB_Matrix_new(&new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; //This Scalar is used in the hash funtion and should be something near // 2^60 and odd. GRB_TRY (GrB_Matrix_assign_UINT64( - dense2_hash, NULL, NULL, 0xFB21C651E98DF25ULL, - GrB_ALL, 0, GrB_ALL, 0, NULL + hash_s, hash_s, NULL, 0xFB21C651E98DF25ULL, + GrB_ALL, 0, GrB_ALL, 0, GrB_DESC_S )) ; GRB_TRY (GrB_Vector_assign_UINT64( dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL )) ; - - // Hashing new edges into a swaps*2 x 2 matrix and existing into e x 1 - // vector + GxB_Matrix_fprint(hash_s, "hash_s", GxB_SHORT, stdout); GRB_TRY(GrB_mxm( - new_hashed_edges, NULL, NULL, hash_edges2, - M_fours, dense2_hash, NULL + new_hashed_edges, NULL, NULL, hash_edges, + M, hash_s, NULL )); GRB_TRY(GrB_mxv( hashed_edges, NULL, NULL, hash_edges, @@ -526,7 +548,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; GRB_TRY (GrB_Matrix_new( - &buckets, GrB_UINT64, 1ULL << 60, n_keep)) ; + &buckets, GrB_UINT64, 1ULL << 60, swaps_per_loop)) ; // Build hash buckets GRB_TRY(GxB_Vector_build_Scalar( @@ -534,98 +556,125 @@ int LAGraph_SwapEdges )) ; // GxB_Vector_fprint(exists,"exists",GxB_SHORT, stdout); GRB_TRY(GxB_Matrix_build_Scalar( - buckets, hash_vals_new, half_ramp, one64, n_keep * 2 + buckets, hash_vals_new, half_ramp, one64, swaps_per_loop * 2 )) ; - // Any collisions will use the monoid and will be marked by a 1 in the - // vector GRB_TRY(GrB_Matrix_reduce_Monoid( exists, NULL, GrB_PLUS_UINT64, GrB_PLUS_MONOID_UINT64, buckets, NULL )) ; GRB_TRY(GrB_Vector_select_UINT64( exists, NULL, NULL, GrB_VALUEGT_UINT64, exists, 1ull, GrB_DESC_R )) ; - // GxB_Vector_fprint(exists,"exists",GxB_SHORT, stdout); - - GrB_Index badcount; - GRB_TRY (GrB_Vector_nvals(&badcount, exists)) ; - if(badcount == 0) - { - E_arranged[1] = M_fours; - pairs_new = pairs_4s; - GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; - } - else - { - GRB_TRY(GrB_Vector_new(&r_exists, GrB_UINT8, n_keep)) ; - // Search through array for bad swaps. - GRB_TRY(GrB_vxm( - r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL - )) ; + GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ll, (GrB_Index)0)) ; + GRB_TRY(GrB_Vector_new(&r_exists, GrB_UINT8, swaps_per_loop)) ; + + // Search through array for bad swaps. + GRB_TRY(GrB_vxm( + r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL + )) ; + + GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); + GRB_TRY (GrB_Vector_assign_INT8( + r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + GRB_TRY (GxB_Vector_unpack_CSC( + r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, + NULL,NULL)); + GRB_TRY(GrB_Matrix_new(&M_fours, GrB_UINT64, n_keep, 4)) ; + //increase width so it can be used as a mask. + GRB_TRY (GrB_Matrix_extract( + M_fours, NULL, NULL, M, arr_keep, n_keep, + GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_Free(&junk, msg)) ; + GRB_TRY (GrB_mxm(M_fours, NULL, NULL, GxB_ANY_FIRST_UINT64, M_fours, swap_p, NULL)) ; + GRB_TRY (GrB_assign(M, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop * 2, 2, NULL)); + + GrB_Index I_range [3] ; + I_range [GxB_BEGIN] = 0 ; + I_range [GxB_END ] = swaps_per_loop * 2 - 1 ; + GRB_TRY (GrB_assign( + E, NULL, NULL, M, I_range, GxB_RANGE, GrB_ALL, 0, NULL + )) ; + GxB_Matrix_fprint(M, "M", GxB_SHORT, stdout); + GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); + + // if(badcount == 0) + // { + // E_arranged[1] = M_fours; + // pairs_new = pairs_4s; + // GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, 2)) ; + // } + // else + // { + // GRB_TRY(GrB_Vector_new(&r_exists, GrB_UINT8, n_keep)) ; + // // Search through array for bad swaps. + // GRB_TRY(GrB_vxm( + // r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL + // )) ; - // Get compliment vector - GRB_TRY (GrB_Vector_assign_INT64( - r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; - GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, - NULL, NULL)) ; - LG_TRY (LAGraph_Free(&junk, msg)) ; + // // Get compliment vector + // GRB_TRY (GrB_Vector_assign_INT64( + // r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + // GRB_TRY (GxB_Vector_unpack_CSC( + // r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, + // NULL, NULL)) ; + // LG_TRY (LAGraph_Free(&junk, msg)) ; - GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, n)) ; - GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; - - GRB_TRY (GrB_Matrix_extract( - E_arranged[1], NULL, NULL, M_fours, arr_keep, n_keep, - GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Matrix_extract( - pairs_new, NULL, NULL, pairs_4s, arr_keep, n_keep, - GrB_ALL, 0, NULL)) ; - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - } + // GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, 2)) ; + // GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, 2)) ; + // GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; + + // GRB_TRY (GrB_Matrix_extract( + // E_arranged[1], NULL, NULL, M_fours, arr_keep, n_keep, + // GrB_ALL, 0, NULL)) ; + // GRB_TRY (GrB_Matrix_extract( + // pairs_new, NULL, NULL, pairs_4s, arr_keep, n_keep, + // GrB_ALL, 0, NULL)) ; + // LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + // } //Split the swapped edges into their correct places. - GRB_TRY (GrB_select( - E_arranged[2], NULL, NULL, first_bit, - E_arranged[1], (uint8_t) 0, NULL - )) ; - GRB_TRY (GrB_select( - E_arranged[1], NULL, NULL, first_bit, - E_arranged[1], (uint8_t) 1, GrB_DESC_R - )) ; - - GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( - E_arranged[1], NULL, NULL, GrB_DIV_UINT8, E_arranged[1], 2, NULL - )) ; - GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( - E_arranged[2], NULL, NULL, GrB_DIV_UINT8, E_arranged[2], 2, NULL - )) ; + // GRB_TRY (GrB_select( + // E_arranged[2], NULL, NULL, first_bit, + // E_arranged[1], (uint8_t) 0, NULL + // )) ; + // GRB_TRY (GrB_select( + // E_arranged[1], NULL, NULL, first_bit, + // E_arranged[1], (uint8_t) 1, GrB_DESC_R + // )) ; + + // GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( + // E_arranged[1], NULL, NULL, GrB_DIV_UINT8, E_arranged[1], 2, NULL + // )) ; + // GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( + // E_arranged[2], NULL, NULL, GrB_DIV_UINT8, E_arranged[2], 2, NULL + // )) ; // GxB_Matrix_fprint(E_arranged[1],"news",GxB_COMPLETE, stdout); // GxB_Matrix_fprint(E_arranged[2],"news",GxB_COMPLETE, stdout); - GrB_Index n_old; - GRB_TRY (GrB_Matrix_reduce_Monoid( - r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs_new, GrB_DESC_RT0)); + // GrB_Index n_old; + // GRB_TRY (GrB_Matrix_reduce_Monoid( + // r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs_new, GrB_DESC_RT0)); - GRB_TRY (GrB_Vector_assign_UINT8( - r_pairs, r_pairs, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; + // GRB_TRY (GrB_Vector_assign_UINT8( + // r_pairs, r_pairs, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; - GRB_TRY (GxB_Vector_unpack_CSC( - r_pairs, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_old, - NULL, NULL)) ; - LG_TRY (LAGraph_Free(&junk, msg)) ; + // GRB_TRY (GxB_Vector_unpack_CSC( + // r_pairs, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_old, + // NULL, NULL)) ; + // LG_TRY (LAGraph_Free(&junk, msg)) ; - LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; + // LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; - // old edges that are being kept. - GRB_TRY (GrB_Matrix_new(E_arranged, GrB_UINT8, n_old, n)) ; - GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, - arr_keep, n_old, GrB_ALL, n, NULL)) ; - LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); + // // old edges that are being kept. + // GRB_TRY (GrB_Matrix_new(E_arranged, GrB_UINT8, n_old, n)) ; + // GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, + // arr_keep, n_old, GrB_ALL, n, NULL)) ; + // LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); // E = Concat(E_prime, M_1, M_2) // where E_prime contains no edges in the indegree of pairs after it is // pruned - GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; + // GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; // Free Matricies that have to be rebuilt FREE_LOOP ; @@ -639,10 +688,12 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Random_Next(random_v, msg)) ; printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } - GRB_TRY (GrB_mxm( - *A_new, NULL, NULL, LAGraph_plus_one_uint8, E, E, GrB_DESC_T0)) ; - GRB_TRY(GrB_Matrix_select_UINT8( - *A_new, NULL, NULL, GrB_OFFDIAG, *A_new, (uint8_t) 0, NULL)) ; + GrB_Index ind_size = 0; + GRB_TRY (GxB_Matrix_unpack_FullC( + E, (void **)&row_indices, &ind_size, &iso, NULL)) ; + GRB_TRY (GxB_Matrix_build_Scalar(*A_new, row_indices, row_indices + e, one8, e)); + GRB_TRY (GrB_eWiseAdd(*A_new, NULL, NULL, GrB_PLUS_UINT8, *A_new,*A_new, GrB_DESC_T0)) ; + GxB_Matrix_fprint(*A_new,"A_new",GxB_SHORT, stdout); LG_FREE_WORK ; return (GrB_SUCCESS) ; } From 4bb29b90f4abdb31515f3e175549a61cd447d49a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 8 Nov 2024 20:58:42 -0600 Subject: [PATCH 025/115] Cleaned up old variables and clarified names --- experimental/algorithm/LAGraph_SwapEdges.c | 404 ++++++--------------- 1 file changed, 111 insertions(+), 293 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 5869847ebb..b406258ab7 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -17,14 +17,9 @@ #define FREE_LOOP \ { \ - GrB_free (&P) ; \ + GrB_free (&P) ; \ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ - GrB_free (&pairs_4s) ; \ - GrB_free (E_arranged) ; \ - GrB_free (E_arranged + 1) ; \ - GrB_free (E_arranged + 2) ; \ - GrB_free (&pairs_new) ; \ GrB_free (&M_outdeg) ; \ GrB_free (&r_exists) ; \ GrB_free(&new_hashed_edges); \ @@ -43,30 +38,23 @@ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ GrB_free (&r_sorted) ; \ - GrB_free (&x) ; \ GrB_free (&r_pairs) ; \ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ - GrB_free(&dense_hash); \ - GrB_free (&swap_p) ; \ + GrB_free(&dense_hash); \ + GrB_free (&swap_p) ; \ GrB_free (&first_bit) ; \ - GrB_free (&swap_op) ; \ - GrB_free (&bxor_first) ; \ - GrB_free(&hash_s); \ - GrB_free (&hash_one) ; \ - GrB_free (&hash_two) ; \ + GrB_free (&bxor_first) ; \ + GrB_free(&hash_s); \ GrB_free (&hash_seed) ; \ - GrB_free (&bhash_two) ; \ - GrB_free (&hash_edges) ; \ - GrB_free (&hash_edges2) ; \ - LAGraph_Free((void**)&row_indices, msg) ; \ - LAGraph_Free((void**)&col_indices, msg) ; \ + GrB_free (&bxor_hash) ; \ + LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ LAGraph_Free((void**)&swap_type, msg) ; \ LAGraph_Free((void**)&edge_perm, msg) ; \ - LAGraph_Free((void**)&swaps, msg) ; \ + LAGraph_Free((void**) &val_of_P, msg); \ FREE_LOOP ; \ } @@ -124,23 +112,6 @@ void hash_node " (*z) = ((*y) * (*x)) >> (4); \n"\ "}" -//hash that places the values for the pair of nodes corresponding to one edge in -//one part of an array -void hash_pair - (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, - const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int *nbits) -{ - (*z) = (((*x) & 1) ^ j_y) * ((*y) * j_x) >> (64 - *nbits); -} -#define HASH_TWO \ -"void hash_pair \n"\ -" (uint64_t *z, const uint8_t *x, GrB_Index i_x, GrB_Index j_x, \n"\ -" const uint64_t *y, GrB_Index i_y, GrB_Index j_y, const int *nbits) \n"\ -"{ \n"\ -" (*z) = (((*x) & 1) ^ j_y) * ((*y) * j_x) >> (64 - *nbits); \n"\ -"}" - - int LAGraph_SwapEdges ( @@ -160,32 +131,31 @@ int LAGraph_SwapEdges // e x 2 with entries corresponding to verticies of an edge GrB_Matrix E = NULL; - // cmatrix [E_selected, M_1, M_2] - GrB_Matrix E_arranged[3] = {NULL, NULL, NULL}; + // e entries. E_split[0] has those which are planning to swap. + GrB_Matrix E_split[2] = {NULL, NULL}; // swaps x e // Selected pairs for next batch of swaps // Each row contains 2 entries for the edges involved in a swap. - GrB_Matrix P = NULL, pairs_4s = NULL; - GrB_Matrix pairs_new = NULL; + GrB_Matrix P = NULL; // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. GrB_Matrix M = NULL; - GrB_Matrix M_xor = NULL; // swaps x 2 with a zero in self edges. GrB_Matrix M_fours = NULL; // M with exactly 4 entries GrB_Index n = 0, e = 0; - // Copied vars from LAGraph_Incidence_Matrix + // n x n + // Lower triangle of adjacency matrix GrB_Matrix A_tril = NULL ; - // random vector + // e x 1 random vectors GrB_Vector random_v = NULL, r_permute = NULL, r_sorted = NULL; //indicies for A - GrB_Index *row_indices = NULL, *col_indices = NULL ; + GrB_Index *indices = NULL; // [0,2,0,3,0,3,0 . . .] numSwaps? GrB_Vector swapVals = NULL; @@ -213,31 +183,51 @@ int LAGraph_SwapEdges GrB_Vector M_outdeg = NULL, r_exists = NULL, r_pairs; GrB_Matrix existMask = NULL; - // 4 x 1 full vector - GrB_Vector x = NULL; // Number of values kept in each phase GrB_Index n_keep; GrB_Index *arr_keep = NULL; void *junk = NULL; - // 4 x 2 Matrix Hashes cols 0,2 and 1,3 - GrB_Matrix hash_s = NULL; - GrB_Matrix new_hashed_edges = NULL, buckets = NULL; - GrB_Vector dense_hash = NULL, hashed_edges = NULL, exists = NULL; - GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; - uint8_t *swaps = NULL; + // swaps x 2 matrix which holds the hashes of each planned edge. + GrB_Matrix new_hashed_edges = NULL; + + // 2^60 x swaps holds the swaps in hash buckets + GrB_Matrix buckets = NULL; + + // e holds hashes of old edges + GrB_Vector hashed_edges = NULL; + // 2^60 holds the buckets in which hashes collided. + GrB_Vector exists = NULL; + GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; + GrB_UnaryOp first_bit = NULL; - GrB_IndexUnaryOp swap_op = NULL; - GzB_IndexBinaryOp hash_one = NULL, hash_two = NULL; - GrB_BinaryOp bhash_two = NULL, hash_seed = NULL; - GrB_Semiring hash_edges = NULL, hash_edges2 = NULL; + + // z = h_y(x) + GrB_BinaryOp hash_seed = NULL; + + // [^],[h_y(x)] + GrB_Semiring bxor_hash = NULL; GrB_Semiring bxor_first = NULL; - A = G->A ; + // Constants --------------------------------------------------------------- + + uint64_t *val_of_P = NULL; + + // 4 x 2 Matrix Hashes cols 0,2 and 1,3 + GrB_Matrix hash_s = NULL; + + // 2 x 2 Used to shuffle edges [[0 1],[1 0]] + GrB_Matrix y = NULL; + + // 2 x 1 with hash seed as value. + GrB_Vector dense_hash = NULL; + + GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; + //-------------------------------------------------------------------------- // Check inputs TODO //-------------------------------------------------------------------------- @@ -252,11 +242,11 @@ int LAGraph_SwapEdges // GRB_TRY (GrB_get(A, (void*)&type, GrB_EL_TYPE_CODE)) ; // LG_ASSERT_MSG (type == GrB_BOOL_CODE, LAGRAPH_INVALID_GRAPH, // "A must be type boolean") ; + //-------------------------------------------------------------------------- // Initializations //-------------------------------------------------------------------------- - LAGRAPH_TRY(LAGraph_Random_Init(msg)) ; - + A = G->A ; GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; @@ -264,92 +254,50 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; - + //----------------------------------------------------------- Init Operators GRB_TRY (GxB_UnaryOp_new ( &first_bit, (GxB_unary_function) (&first_bit_equals), GrB_BOOL, GrB_UINT64, "first_bit_equals", FIRST_BIT_EQ )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_op, (GxB_index_unary_function) (&swap_pattern), - GrB_UINT8, GrB_UINT64, GrB_UINT8, "swap_pattern", SWAP_PAT - )) ; + GRB_TRY(GxB_BinaryOp_new( &hash_seed, (GxB_binary_function) (&hash_node), GrB_UINT64, GrB_UINT64, GrB_UINT64, "hash_node", HASH_ONE )) ; - - GRB_TRY(GzB_IndexBinaryOp_new( - &hash_two, (GzB_index_binary_function) (&hash_pair), - GrB_UINT64, GrB_UINT8, GrB_UINT64, GrB_INT32, "hash_pair", HASH_TWO - )) ; - - GrB_Scalar sizeTheta ; // hash size - GrB_Scalar_new (&sizeTheta, GrB_INT32) ; - GrB_Scalar_setElement_INT32 (sizeTheta, 60); - GRB_TRY(GzB_BinaryOp_new_IndexOp(&bhash_two, hash_two, sizeTheta)); // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be // commutative. GRB_TRY(GrB_Semiring_new( - &hash_edges, GxB_BXOR_UINT64_MONOID, hash_seed - )) ; - GRB_TRY(GrB_Semiring_new( - &hash_edges2, GxB_BXOR_UINT64_MONOID, bhash_two + &bxor_hash, GxB_BXOR_UINT64_MONOID, hash_seed )) ; GRB_TRY(GrB_Semiring_new( &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; - GrB_Index num_swaps = 0, num_attempts = 0; - // Q: Should this decrease if edges are interfering alot? - // Bound number of swaps by E-2 * (max deg)? - // Yes might be good to decrease this if you get alot of intrf - // or increase if intrf low - // maybe a * #swaps that worked last iteration - GrB_Index swaps_per_loop = e / 3 ; // Make this a cap + // count swaps + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - - - // This is length e to let every edge have a chance to swap. - // QUESTION: Perhaps it's better to just do random_v % e and deal with - // duplicate edges and self paired edges later. - // (inteference matrix will detect) - - GrB_Matrix y; - GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new (&dense_hash, GrB_UINT64, 2)) ; - GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; - GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; - GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; - GRB_TRY (GrB_Vector_new (&r_pairs, GrB_INT64, e)) ; - GRB_TRY (GrB_Vector_new (&x, GrB_INT8, 4)) ; - - - // Extract adjacency matrix to make incidence matrix - E // get just the lower triangular entries //TODO: should I remove the diagonal? change the 0 if so // Arrays to extract A into - LG_TRY (LAGraph_Malloc ((void**)(&row_indices), 2 * e, sizeof(GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void**)(&indices), 2 * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( - GrB_Matrix_extractTuples_BOOL (row_indices, row_indices + e, NULL, &e, A_tril) + GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) ) ; GRB_TRY (GxB_Matrix_pack_FullC ( - E, (void **)&row_indices, 2 * e * sizeof(GrB_Index), false, NULL + E, (void **)&indices, 2 * e * sizeof(GrB_Index), false, NULL )) ; - //Build large ramp - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e)) ; + // Init Ramps -------------------------------------------------------------- + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; + GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_new(&swapVals, GrB_BOOL, e)) ; - GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; // [0,0,1,1,2,2,...] @@ -362,7 +310,7 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_unpack_Full ( hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; - GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; + // Init Constants ---------------------------------------------------------- GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_new (&one64, GrB_UINT64)) ; @@ -370,15 +318,21 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; + GRB_TRY (GrB_Vector_new (&dense_hash, GrB_UINT64, 2)) ; + GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; + GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; + GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; + GRB_TRY (GrB_Vector_new (&r_pairs, GrB_INT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT8 ( dense_hash, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_assign_UINT8 ( y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_assign_UINT8 ( - x, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_Matrix_select_UINT64(y, NULL, NULL, GrB_OFFDIAG, y, 0, NULL)) ; + LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(GrB_Index), msg)) ; + val_of_P[0] = 1; + GrB_Index hcols[] = {0, 0, 1, 1}; GrB_Index srows[] = {0, 1, 2, 3}; GrB_Index scols[] = {0, 2, 1, 3}; @@ -388,9 +342,14 @@ int LAGraph_SwapEdges GRB_TRY(GxB_Matrix_build_Scalar( swap_p, srows, scols, one64, 4 )) ; + + // Init Random ------------------------------------------------------------- + GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; + LAGRAPH_TRY(LAGraph_Random_Init(msg)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - //TODO: Change seed LG_TRY( LAGraph_Random_Seed(random_v, 1548945616ul, msg)); @@ -398,27 +357,12 @@ int LAGraph_SwapEdges printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { - // GRB_TRY (GrB_mxm( - // *A_new, NULL, NULL, LAGraph_plus_one_uint8, E, E, GrB_DESC_RT0)) ; - // GRB_TRY(GrB_Matrix_select_UINT8( - // *A_new, NULL, NULL, GrB_OFFDIAG, *A_new, (uint8_t) 0, NULL)) ; - // GRB_TRY(GrB_Matrix_select_UINT8( - // *A_new, NULL, NULL, GrB_VALUEEQ_UINT8, *A_new, (uint8_t) 2, NULL)) ; - // GRB_TRY(GrB_Matrix_nvals(&nvals, *A_new)); - // if(nvals) - // { - // printf("SELF EDGE MADE \n\n"); - // GxB_Matrix_fprint(*A_new,"Hashes",GxB_COMPLETE, stdout); - // GRB_TRY(-1); - // } // Coming into the loop: // E must be the incidence matrix of the new graph. W/o self edges nor - // parallel edges. Each row must have exactly one 0 and one 1. - // They do not have to be randomly assigned. + // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. GRB_TRY (GrB_Matrix_new(&P, GrB_UINT8, e, e)) ; - GRB_TRY (GrB_Matrix_new (&M_xor, GrB_UINT8, swaps_per_loop, 2)) ; GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_UINT8, swaps_per_loop)) ; @@ -437,33 +381,26 @@ int LAGraph_SwapEdges )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - // Pair edges. Take a random permutation and pair adjacent values. - // pairs wants: - // cols: [0, 0, 1, 1, 2, 2, 3, 3, . . .] (ramp / 2) - // rows: [ random permutation 1 - nvals] (LAGraph_Random_Seed + sort) - // vals: [1, 3, 0, 2, 0, 2, 0, 3, . . .] - // Start with [0, 2, 0, 2, 0, 2, . . .] - // for i from 1 to nvals by 2s: - // vals[i] += vals[i] > vals[i-1] - // I know it will be alot less safe but is it more efficient to pack - // pairs as needed? Doubt it. - - // uint64_t *val_of_P = NULL; - // LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(GrB_Index), msg)) ; - // val_of_P[0] = 1; - // GRB_TRY (GxB_Matrix_pack_CSR( - // P, &ramp, &edge_perm, (void**) &val_of_P, (e + 1) * sizeof(GrB_Index), - // perm_size, sizeof(GrB_Index) , true, false, NULL - // )); + // TODO: Should there be a function that takes in A matrix and computes // in or out degree - GRB_TRY (GxB_Matrix_build_Scalar( - P, ramp, edge_perm, one8, e + // GRB_TRY (GxB_Matrix_build_Scalar( + // P, ramp, edge_perm, one8, e + // )); + + GRB_TRY (GxB_Matrix_pack_CSR( + P, &ramp, &edge_perm, (void**) &val_of_P, (e + 1) * sizeof(GrB_Index), + perm_size, sizeof(GrB_Index) , true, false, NULL )); - //Permute the edges + // Pair edges. Take a random permutation and pair adjacent values. GRB_TRY (GrB_mxm(E, NULL, NULL, GxB_ANY_SECOND_UINT64, P, E, NULL)) ; - + + GrB_Index arr_size, junk_size; + GRB_TRY (GxB_Matrix_unpack_CSR( + P, &ramp, &edge_perm, (void**) &val_of_P, &arr_size, + &perm_size, &junk_size, &iso, false, NULL + )); //increase width of sorted so it can be used as a mask. GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, @@ -471,46 +408,16 @@ int LAGraph_SwapEdges //swap vertexes in E randomly. GRB_TRY (GrB_mxm( E, swapMask, NULL, GxB_ANY_FIRST_UINT64, E, y, NULL)) ; - GRB_TRY (GrB_Matrix_dup(&M,E)); - GRB_TRY (GrB_Matrix_resize(M, swaps_per_loop * 2, 2)); + + GrB_Index E_bounds[3] = {swaps_per_loop * 2, e - swaps_per_loop * 2, 2}; + GRB_TRY (GrB_Matrix_new(E_split, GrB_UINT64, E_bounds[0], 2)); + GRB_TRY (GrB_Matrix_new(E_split + 1, GrB_UINT64, E_bounds[1], 2)); + GRB_TRY (GxB_Matrix_split( + E_split, 2, 1, E_bounds, E_bounds + 2, E, NULL)); + // GRB_TRY (GrB_Matrix_dup(&M,E)); + // GRB_TRY (GrB_Matrix_resize(M, swaps_per_loop * 2, 2)); + M = E_split[0]; GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop, 4, NULL)) ; - // GxB_Matrix_fprint(M, "M", GxB_SHORT, stdout); - - // // Remove rows with less than 3 entries - // GRB_TRY (GrB_mxm ( - // M_xor, NULL, NULL, bxor_first, M, hash_vals, NULL - // )) ; - // GRB_TRY (GrB_Matrix_reduce_Monoid(M_outdeg, NULL, NULL, - // GrB_MIN_MONOID_UINT64, M_xor, NULL)) ; - // GRB_TRY (GrB_Vector_select_UINT8( - // M_outdeg, NULL, NULL, GrB_VALUENE_UINT8, M_outdeg, (uint8_t) 0, NULL - // )) ; - // GRB_TRY (GrB_Vector_nvals(&n_keep, M_outdeg)); - GrB_Index arr_size, junk_size; - // if(n_keep == swaps_per_loop) - // { - // M_fours = M; - // pairs_4s = P; - // } - // else // Remove bad swaps - // { - // GRB_TRY (GxB_Vector_unpack_CSC( - // M_outdeg, &arr_keep, &junk, &arr_size, &junk_size, &iso, - // &n_keep, NULL, NULL)) ; - // LG_TRY (LAGraph_Free(&junk, msg)); - - // GRB_TRY (GrB_Matrix_new(&M_fours, GrB_UINT8, n_keep, 2)) ; - // GRB_TRY (GrB_Matrix_new(&pairs_4s, GrB_UINT8, n_keep, 2)) ; - - // GRB_TRY (GrB_Matrix_extract( - // M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - // GRB_TRY (GrB_Matrix_extract( - // pairs_4s, NULL, NULL, P, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; - // GRB_TRY (GrB_free(&M)); - // GRB_TRY (GrB_free(&P)); - // LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - // } - GRB_TRY (GrB_Matrix_new(&new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; @@ -524,19 +431,15 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_UINT64( dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL )) ; - GxB_Matrix_fprint(hash_s, "hash_s", GxB_SHORT, stdout); + // GxB_Matrix_fprint(hash_s, "hash_s", GxB_SHORT, stdout); GRB_TRY(GrB_mxm( - new_hashed_edges, NULL, NULL, hash_edges, + new_hashed_edges, NULL, NULL, bxor_hash, M, hash_s, NULL )); GRB_TRY(GrB_mxv( - hashed_edges, NULL, NULL, hash_edges, + hashed_edges, NULL, NULL, bxor_hash, E, dense_hash, NULL )); - // GxB_Vector_fprint(hashed_edges,"Hashes",GxB_SHORT, stdout); - // GxB_Matrix_fprint(M_fours,"M",GxB_COMPLETE, stdout); - // GxB_Matrix_fprint(new_hashed_edges,"Hashes",GxB_COMPLETE, stdout); - // I will unpack and then reconstruct with hash as index. GRB_TRY(GxB_Matrix_unpack_FullR( @@ -554,7 +457,6 @@ int LAGraph_SwapEdges GRB_TRY(GxB_Vector_build_Scalar( exists, hash_vals, one64, e )) ; - // GxB_Vector_fprint(exists,"exists",GxB_SHORT, stdout); GRB_TRY(GxB_Matrix_build_Scalar( buckets, hash_vals_new, half_ramp, one64, swaps_per_loop * 2 )) ; @@ -573,14 +475,14 @@ int LAGraph_SwapEdges r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL )) ; - GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); + // GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); GRB_TRY (GrB_Vector_assign_INT8( r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; GRB_TRY (GxB_Vector_unpack_CSC( r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, NULL,NULL)); GRB_TRY(GrB_Matrix_new(&M_fours, GrB_UINT64, n_keep, 4)) ; - //increase width so it can be used as a mask. + GRB_TRY (GrB_Matrix_extract( M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; @@ -589,93 +491,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_assign(M, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop * 2, 2, NULL)); - GrB_Index I_range [3] ; - I_range [GxB_BEGIN] = 0 ; - I_range [GxB_END ] = swaps_per_loop * 2 - 1 ; - GRB_TRY (GrB_assign( - E, NULL, NULL, M, I_range, GxB_RANGE, GrB_ALL, 0, NULL - )) ; - GxB_Matrix_fprint(M, "M", GxB_SHORT, stdout); - GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); - - // if(badcount == 0) - // { - // E_arranged[1] = M_fours; - // pairs_new = pairs_4s; - // GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, 2)) ; - // } - // else - // { - // GRB_TRY(GrB_Vector_new(&r_exists, GrB_UINT8, n_keep)) ; - // // Search through array for bad swaps. - // GRB_TRY(GrB_vxm( - // r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL - // )) ; - - // // Get compliment vector - // GRB_TRY (GrB_Vector_assign_INT64( - // r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; - // GRB_TRY (GxB_Vector_unpack_CSC( - // r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, - // NULL, NULL)) ; - // LG_TRY (LAGraph_Free(&junk, msg)) ; - - // GRB_TRY (GrB_Matrix_new(E_arranged + 1, GrB_UINT8, n_keep, 2)) ; - // GRB_TRY (GrB_Matrix_new(E_arranged + 2, GrB_UINT8, n_keep, 2)) ; - // GRB_TRY (GrB_Matrix_new(&pairs_new, GrB_UINT8, n_keep, e)) ; - - // GRB_TRY (GrB_Matrix_extract( - // E_arranged[1], NULL, NULL, M_fours, arr_keep, n_keep, - // GrB_ALL, 0, NULL)) ; - // GRB_TRY (GrB_Matrix_extract( - // pairs_new, NULL, NULL, pairs_4s, arr_keep, n_keep, - // GrB_ALL, 0, NULL)) ; - // LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - // } - - //Split the swapped edges into their correct places. - // GRB_TRY (GrB_select( - // E_arranged[2], NULL, NULL, first_bit, - // E_arranged[1], (uint8_t) 0, NULL - // )) ; - // GRB_TRY (GrB_select( - // E_arranged[1], NULL, NULL, first_bit, - // E_arranged[1], (uint8_t) 1, GrB_DESC_R - // )) ; - - // GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( - // E_arranged[1], NULL, NULL, GrB_DIV_UINT8, E_arranged[1], 2, NULL - // )) ; - // GRB_TRY (GrB_Matrix_apply_BinaryOp2nd_UINT8( - // E_arranged[2], NULL, NULL, GrB_DIV_UINT8, E_arranged[2], 2, NULL - // )) ; - // GxB_Matrix_fprint(E_arranged[1],"news",GxB_COMPLETE, stdout); - // GxB_Matrix_fprint(E_arranged[2],"news",GxB_COMPLETE, stdout); - // GrB_Index n_old; - // GRB_TRY (GrB_Matrix_reduce_Monoid( - // r_pairs, NULL, NULL, GxB_ANY_UINT8_MONOID, pairs_new, GrB_DESC_RT0)); - - // GRB_TRY (GrB_Vector_assign_UINT8( - // r_pairs, r_pairs, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; - - // GRB_TRY (GxB_Vector_unpack_CSC( - // r_pairs, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_old, - // NULL, NULL)) ; - // LG_TRY (LAGraph_Free(&junk, msg)) ; - - // LG_ASSERT(n_old == e - 2 * n_keep, GrB_NOT_IMPLEMENTED) ; + GRB_TRY(GxB_Matrix_concat(E, E_split, 2, 1, NULL)); - // // old edges that are being kept. - // GRB_TRY (GrB_Matrix_new(E_arranged, GrB_UINT8, n_old, n)) ; - // GRB_TRY (GrB_Matrix_extract(E_arranged[0], NULL, NULL, E, - // arr_keep, n_old, GrB_ALL, n, NULL)) ; - // LG_TRY (LAGraph_Free((void **)&arr_keep, msg)); - - // E = Concat(E_prime, M_1, M_2) - // where E_prime contains no edges in the indegree of pairs after it is - // pruned - // GRB_TRY (GxB_Matrix_concat(E, E_arranged, 3, 1, NULL)) ; - // Free Matricies that have to be rebuilt FREE_LOOP ; @@ -684,14 +501,15 @@ int LAGraph_SwapEdges swaps_per_loop = (n_keep * 3) / 2; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; + // Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } GrB_Index ind_size = 0; GRB_TRY (GxB_Matrix_unpack_FullC( - E, (void **)&row_indices, &ind_size, &iso, NULL)) ; - GRB_TRY (GxB_Matrix_build_Scalar(*A_new, row_indices, row_indices + e, one8, e)); + E, (void **)&indices, &ind_size, &iso, NULL)) ; + GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); GRB_TRY (GrB_eWiseAdd(*A_new, NULL, NULL, GrB_PLUS_UINT8, *A_new,*A_new, GrB_DESC_T0)) ; GxB_Matrix_fprint(*A_new,"A_new",GxB_SHORT, stdout); LG_FREE_WORK ; From 4235cd0e4c402e43a00abfdfb48fe329201abf0e Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 9 Nov 2024 11:24:39 -0600 Subject: [PATCH 026/115] Modified E to Row Full --- experimental/algorithm/LAGraph_SwapEdges.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index b406258ab7..d24c572e25 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -129,7 +129,7 @@ int LAGraph_SwapEdges GrB_Matrix A = NULL; // n x n Adjacency Matrix // e x 2 with entries corresponding to verticies of an edge - GrB_Matrix E = NULL; + GrB_Matrix E = NULL, E_t = NULL; // e entries. E_split[0] has those which are planning to swap. GrB_Matrix E_split[2] = {NULL, NULL}; @@ -255,6 +255,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; + GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; //----------------------------------------------------------- Init Operators GRB_TRY (GxB_UnaryOp_new ( @@ -290,9 +291,10 @@ int LAGraph_SwapEdges GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) ) ; GRB_TRY (GxB_Matrix_pack_FullC ( - E, (void **)&indices, 2 * e * sizeof(GrB_Index), false, NULL + E_t, (void **)&indices, 2 * e * sizeof(GrB_Index), false, NULL )) ; - + GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); + GrB_free(&E_t); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; From b70d9439f30251d93314e90140db7bc9662b11fd Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 10 Nov 2024 15:00:31 -0600 Subject: [PATCH 027/115] Random init fixed --- experimental/algorithm/LAGraph_SwapEdges.c | 41 ++++++++++++-------- experimental/benchmark/edgeSwap_demo.c | 1 + experimental/test/test_RichClubCoefficient.c | 1 - experimental/test/test_SwapEdges.c | 2 + 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index d24c572e25..db8a9ee2a6 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -25,7 +25,6 @@ GrB_free(&new_hashed_edges); \ GrB_free(&buckets); \ GrB_free(&hashed_edges); \ - GrB_free(&exists); \ LAGraph_Free((void **) &hash_vals_new, NULL);\ LAGraph_Free((void **) &hash_vals, NULL); \ } @@ -37,7 +36,6 @@ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ - GrB_free (&r_sorted) ; \ GrB_free (&r_pairs) ; \ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ @@ -48,6 +46,8 @@ GrB_free (&bxor_first) ; \ GrB_free(&hash_s); \ GrB_free (&hash_seed) ; \ + GrB_free (&r_60) ; \ + GrB_free(&exists); \ GrB_free (&bxor_hash) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ @@ -152,7 +152,7 @@ int LAGraph_SwapEdges GrB_Matrix A_tril = NULL ; // e x 1 random vectors - GrB_Vector random_v = NULL, r_permute = NULL, r_sorted = NULL; + GrB_Vector random_v = NULL, r_permute = NULL; //indicies for A GrB_Index *indices = NULL; @@ -170,8 +170,9 @@ int LAGraph_SwapEdges GrB_Vector ramp_v = NULL; GrB_Vector hramp_v = NULL; - // C array [0, ... , e-1] + // [0, ... , e] GrB_Index *ramp = NULL ; + // [0,0,1,1,2,2,...] GrB_Index *half_ramp = NULL ; // Arrays to unpack edge permutation @@ -213,6 +214,9 @@ int LAGraph_SwapEdges GrB_Semiring bxor_first = NULL; + GrB_Vector sort_h = NULL; + GrB_Vector r_60; + // Constants --------------------------------------------------------------- uint64_t *val_of_P = NULL; @@ -286,6 +290,7 @@ int LAGraph_SwapEdges //TODO: should I remove the diagonal? change the 0 if so // Arrays to extract A into + // Make E Matrix ----------------------------------------------------------- LG_TRY (LAGraph_Malloc ((void**)(&indices), 2 * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) @@ -295,6 +300,9 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); GrB_free(&E_t); + GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; + // GRB_TRY (GrB_set(exists, GxB_HYPERSPARSE, GxB_SPARSITY_CONTROL)) ; + // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; @@ -302,7 +310,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - // [0,0,1,1,2,2,...] GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; @@ -345,11 +352,10 @@ int LAGraph_SwapEdges swap_p, srows, scols, one64, 4 )) ; - // Init Random ------------------------------------------------------------- + // Make Random ------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_sorted, GrB_UINT64, e)) ; - LAGRAPH_TRY(LAGraph_Random_Init(msg)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; //TODO: Change seed @@ -363,18 +369,20 @@ int LAGraph_SwapEdges // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. - GRB_TRY (GrB_Matrix_new(&P, GrB_UINT8, e, e)) ; GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_UINT8, swaps_per_loop)) ; - + GRB_TRY (GxB_Vector_sort ( - r_sorted, r_permute, GrB_LT_UINT64, random_v, GrB_NULL + NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - GRB_TRY(GrB_Vector_apply(swapVals, NULL, NULL, first_bit, - r_sorted, NULL)) ; + GrB_Index *rand_arr, rand_size; + GRB_TRY(GrB_Vector_apply( + swapVals, NULL, NULL, first_bit, random_v, NULL + )) ; + // TODO: try and make this more efficient maybe just rand % e rather // than a permutation GrB_Index perm_size; @@ -414,6 +422,7 @@ int LAGraph_SwapEdges GrB_Index E_bounds[3] = {swaps_per_loop * 2, e - swaps_per_loop * 2, 2}; GRB_TRY (GrB_Matrix_new(E_split, GrB_UINT64, E_bounds[0], 2)); GRB_TRY (GrB_Matrix_new(E_split + 1, GrB_UINT64, E_bounds[1], 2)); + GRB_TRY (GxB_Matrix_split( E_split, 2, 1, E_bounds, E_bounds + 2, E, NULL)); // GRB_TRY (GrB_Matrix_dup(&M,E)); @@ -451,10 +460,10 @@ int LAGraph_SwapEdges hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; + GRB_TRY (GrB_Matrix_new( &buckets, GrB_UINT64, 1ULL << 60, swaps_per_loop)) ; - + // GRB_TRY (GrB_set(buckets, GxB_HYPERSPARSE, GxB_SPARSITY_CONTROL)) ; // Build hash buckets GRB_TRY(GxB_Vector_build_Scalar( exists, hash_vals, one64, e @@ -476,7 +485,7 @@ int LAGraph_SwapEdges GRB_TRY(GrB_vxm( r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL )) ; - + GRB_TRY (GrB_Vector_clear(exists)) ; // GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); GRB_TRY (GrB_Vector_assign_INT8( r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c index 50d50fdcf9..b5244c3716 100644 --- a/experimental/benchmark/edgeSwap_demo.c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -120,6 +120,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- LG_FREE_ALL ; + LG_TRY (LAGraph_Random_Finalize (msg)) ; LG_TRY (LAGraph_Finalize (msg)) ; return (GrB_SUCCESS) ; } diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 20d2252085..29b938d243 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -178,7 +178,6 @@ void test_RichClubCoefficient (void) //-------------------------------------------------------------------------- - LAGraph_Finalize (msg) ; } diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 1b177e66a9..fbe8922ffe 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -41,6 +41,7 @@ void test_SwapEdges (void) // start LAGraph //-------------------------------------------------------------------------- OK (LAGraph_Init (msg)) ; + OK (LAGraph_Random_Init(msg)) ; GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; LAGraph_Graph G = NULL, G_new = NULL; @@ -138,6 +139,7 @@ void test_SwapEdges (void) //-------------------------------------------------------------------------- // free everything and finalize LAGraph //-------------------------------------------------------------------------- + LAGraph_Random_Finalize(msg); LAGraph_Finalize (msg) ; } From ab94b881b4e42aef223aff9232d98f56a942e4a5 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 10 Nov 2024 17:44:36 -0600 Subject: [PATCH 028/115] Reduce bug fix --- experimental/algorithm/LAGraph_SwapEdges.c | 44 +++++++++++++++------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index db8a9ee2a6..2a527b7585 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -20,11 +20,11 @@ GrB_free (&P) ; \ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ - GrB_free (&M_outdeg) ; \ GrB_free (&r_exists) ; \ GrB_free(&new_hashed_edges); \ GrB_free(&buckets); \ GrB_free(&hashed_edges); \ + GrB_free (&big_dense) ; \ LAGraph_Free((void **) &hash_vals_new, NULL);\ LAGraph_Free((void **) &hash_vals, NULL); \ } @@ -163,7 +163,7 @@ int LAGraph_SwapEdges // e x 2 Matrix that picks the edges for which we will swap values. GrB_Matrix swapMask = NULL; - + // Swaps 0,3 and 2,1 GrB_Matrix swap_p = NULL; // This ramp will likely get recycled a few times. @@ -181,7 +181,7 @@ int LAGraph_SwapEdges bool iso = false; // Reduced Vectors - GrB_Vector M_outdeg = NULL, r_exists = NULL, r_pairs; + GrB_Vector r_exists = NULL, r_pairs; GrB_Matrix existMask = NULL; @@ -197,6 +197,11 @@ int LAGraph_SwapEdges // 2^60 x swaps holds the swaps in hash buckets GrB_Matrix buckets = NULL; + GrB_Matrix p_buckets = NULL; + + // swaps used for "outdegree" + GrB_Vector big_dense; + // e holds hashes of old edges GrB_Vector hashed_edges = NULL; @@ -301,7 +306,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); GrB_free(&E_t); GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; - // GRB_TRY (GrB_set(exists, GxB_HYPERSPARSE, GxB_SPARSITY_CONTROL)) ; // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; @@ -371,20 +375,27 @@ int LAGraph_SwapEdges // random_v has a radom dense vector. GRB_TRY (GrB_Matrix_new(&P, GrB_UINT8, e, e)) ; GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; - GRB_TRY (GrB_Vector_new (&M_outdeg, GrB_UINT8, swaps_per_loop)) ; + // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, e, 2)) ; + - GRB_TRY (GxB_Vector_sort ( NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - GrB_Index *rand_arr, rand_size; + // GrB_Index *rand_arr, rand_size; + // GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( + // r_60, NULL, NULL, GrB_BAND_UINT64, (uint64_t) 0xFFFFFFFFFFFFFFF, random_v, NULL + // )) ; + // GRB_TRY (GxB_Vector_unpack_Full( + // r_60, (void **)&rand_arr, &rand_size, &iso, NULL + // )) ; + + GRB_TRY(GrB_Vector_apply( swapVals, NULL, NULL, first_bit, random_v, NULL )) ; - // TODO: try and make this more efficient maybe just rand % e rather - // than a permutation + GrB_Index perm_size; GRB_TRY (GxB_Vector_unpack_Full( r_permute, (void **)&edge_perm, &perm_size, &iso, NULL @@ -425,13 +436,13 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Matrix_split( E_split, 2, 1, E_bounds, E_bounds + 2, E, NULL)); - // GRB_TRY (GrB_Matrix_dup(&M,E)); - // GRB_TRY (GrB_Matrix_resize(M, swaps_per_loop * 2, 2)); + M = E_split[0]; GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop, 4, NULL)) ; GRB_TRY (GrB_Matrix_new(&new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&big_dense, GrB_UINT64, swaps_per_loop)) ; //This Scalar is used in the hash funtion and should be something near // 2^60 and odd. @@ -442,6 +453,9 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_UINT64( dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL )) ; + GRB_TRY (GrB_Vector_assign_UINT64( + big_dense, NULL, NULL, (uint64_t) 0, GrB_ALL, 0, NULL + )) ; // GxB_Matrix_fprint(hash_s, "hash_s", GxB_SHORT, stdout); GRB_TRY(GrB_mxm( new_hashed_edges, NULL, NULL, bxor_hash, @@ -463,7 +477,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new( &buckets, GrB_UINT64, 1ULL << 60, swaps_per_loop)) ; - // GRB_TRY (GrB_set(buckets, GxB_HYPERSPARSE, GxB_SPARSITY_CONTROL)) ; // Build hash buckets GRB_TRY(GxB_Vector_build_Scalar( exists, hash_vals, one64, e @@ -472,9 +485,11 @@ int LAGraph_SwapEdges buckets, hash_vals_new, half_ramp, one64, swaps_per_loop * 2 )) ; - GRB_TRY(GrB_Matrix_reduce_Monoid( - exists, NULL, GrB_PLUS_UINT64, GrB_PLUS_MONOID_UINT64, buckets, NULL + GRB_TRY (GrB_mxv( + exists, NULL, GrB_PLUS_UINT64, LAGraph_plus_one_uint64, buckets, + big_dense, NULL )) ; + GRB_TRY(GrB_Vector_select_UINT64( exists, NULL, NULL, GrB_VALUEGT_UINT64, exists, 1ull, GrB_DESC_R )) ; @@ -485,6 +500,7 @@ int LAGraph_SwapEdges GRB_TRY(GrB_vxm( r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL )) ; + GRB_TRY (GrB_Vector_clear(exists)) ; // GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); GRB_TRY (GrB_Vector_assign_INT8( From aac33c35aa4c345102747382215bda97a2d62af4 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 13 Nov 2024 09:55:16 -0600 Subject: [PATCH 029/115] Fixed column full pack --- experimental/algorithm/LAGraph_SwapEdges.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 2a527b7585..7246db9016 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -296,17 +296,17 @@ int LAGraph_SwapEdges // Arrays to extract A into // Make E Matrix ----------------------------------------------------------- - LG_TRY (LAGraph_Malloc ((void**)(&indices), 2 * e, sizeof(GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) ) ; - GRB_TRY (GxB_Matrix_pack_FullC ( - E_t, (void **)&indices, 2 * e * sizeof(GrB_Index), false, NULL + GRB_TRY (GxB_Matrix_pack_FullR ( + E_t, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL )) ; GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); GrB_free(&E_t); GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; - + GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; @@ -474,7 +474,6 @@ int LAGraph_SwapEdges hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - GRB_TRY (GrB_Matrix_new( &buckets, GrB_UINT64, 1ULL << 60, swaps_per_loop)) ; // Build hash buckets @@ -502,12 +501,14 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GrB_Vector_clear(exists)) ; + // GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); GRB_TRY (GrB_Vector_assign_INT8( r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, - NULL,NULL)); + r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, + NULL, NULL + )); GRB_TRY(GrB_Matrix_new(&M_fours, GrB_UINT64, n_keep, 4)) ; GRB_TRY (GrB_Matrix_extract( From 0a22c3b7cb5418e129a1d45978761d6372bf14cc Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 14 Nov 2024 22:47:40 -0600 Subject: [PATCH 030/115] Changed how I find duplicate edges --- experimental/algorithm/LAGraph_SwapEdges.c | 183 ++++++++++++--------- 1 file changed, 106 insertions(+), 77 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 7246db9016..9b4547d5e1 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -20,9 +20,7 @@ GrB_free (&P) ; \ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ - GrB_free (&r_exists) ; \ GrB_free(&new_hashed_edges); \ - GrB_free(&buckets); \ GrB_free(&hashed_edges); \ GrB_free (&big_dense) ; \ LAGraph_Free((void **) &hash_vals_new, NULL);\ @@ -36,7 +34,6 @@ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ - GrB_free (&r_pairs) ; \ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ @@ -49,10 +46,10 @@ GrB_free (&r_60) ; \ GrB_free(&exists); \ GrB_free (&bxor_hash) ; \ + LAGraph_Free((void**)&dup_swaps, msg) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ - LAGraph_Free((void**)&swap_type, msg) ; \ LAGraph_Free((void**)&edge_perm, msg) ; \ LAGraph_Free((void**) &val_of_P, msg); \ FREE_LOOP ; \ @@ -112,7 +109,19 @@ void hash_node " (*z) = ((*y) * (*x)) >> (4); \n"\ "}" - +void log_duplicate + (uint64_t *z, const uint64_t *x, const uint64_t *y) +{ + **((int8_t **)y) = (int8_t) 0; + *z = *x; +} +#define LOG_DUPLICATE \ +"void log_duplicate \n"\ +" (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ +"{ \n"\ +" **((int8_t **)y) = (int8_t) 0; \n"\ +" *z = *x; \n"\ +"}" int LAGraph_SwapEdges ( // output @@ -145,6 +154,7 @@ int LAGraph_SwapEdges GrB_Matrix M = NULL; GrB_Matrix M_fours = NULL; // M with exactly 4 entries + // n = |V| e = |E| GrB_Index n = 0, e = 0; // n x n @@ -154,19 +164,18 @@ int LAGraph_SwapEdges // e x 1 random vectors GrB_Vector random_v = NULL, r_permute = NULL; - //indicies for A + // indicies for A GrB_Index *indices = NULL; - // [0,2,0,3,0,3,0 . . .] numSwaps? + // IDK GrB_Vector swapVals = NULL; // e x 2 Matrix that picks the edges for which we will swap values. GrB_Matrix swapMask = NULL; - // Swaps 0,3 and 2,1 + // Swaps 2,1 GrB_Matrix swap_p = NULL; - // This ramp will likely get recycled a few times. GrB_Vector ramp_v = NULL; GrB_Vector hramp_v = NULL; @@ -177,14 +186,8 @@ int LAGraph_SwapEdges // Arrays to unpack edge permutation GrB_Index *edge_perm = NULL ; - uint8_t *swap_type = NULL ; bool iso = false; - // Reduced Vectors - GrB_Vector r_exists = NULL, r_pairs; - GrB_Matrix existMask = NULL; - - // Number of values kept in each phase GrB_Index n_keep; GrB_Index *arr_keep = NULL; @@ -194,10 +197,7 @@ int LAGraph_SwapEdges // swaps x 2 matrix which holds the hashes of each planned edge. GrB_Matrix new_hashed_edges = NULL; - // 2^60 x swaps holds the swaps in hash buckets - GrB_Matrix buckets = NULL; - - GrB_Matrix p_buckets = NULL; + // GrB_Matrix p_buckets = NULL; // swaps used for "outdegree" GrB_Vector big_dense; @@ -207,6 +207,7 @@ int LAGraph_SwapEdges // 2^60 holds the buckets in which hashes collided. GrB_Vector exists = NULL; + GrB_Vector new_edges_h = NULL; GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; GrB_UnaryOp first_bit = NULL; @@ -219,8 +220,15 @@ int LAGraph_SwapEdges GrB_Semiring bxor_first = NULL; + GrB_BinaryOp duplicate = NULL; + + int8_t *dup_swaps = NULL; + GrB_Vector dup_swaps_v = NULL; + GrB_Vector not_pointers = NULL; + uint64_t *not_ptrs = NULL; + GrB_Vector sort_h = NULL; - GrB_Vector r_60; + GrB_Vector r_60 = NULL; // Constants --------------------------------------------------------------- @@ -266,7 +274,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; - //----------------------------------------------------------- Init Operators + //Init Operators ----------------------------------------------------------- GRB_TRY (GxB_UnaryOp_new ( &first_bit, (GxB_unary_function) (&first_bit_equals), GrB_BOOL, GrB_UINT64, "first_bit_equals", FIRST_BIT_EQ @@ -276,7 +284,10 @@ int LAGraph_SwapEdges &hash_seed, (GxB_binary_function) (&hash_node), GrB_UINT64, GrB_UINT64, GrB_UINT64, "hash_node", HASH_ONE )) ; - + GRB_TRY(GxB_BinaryOp_new( + &duplicate, (GxB_binary_function) (&log_duplicate), + GrB_UINT64, GrB_UINT64, GrB_UINT64, "log_duplicate", LOG_DUPLICATE + )) ; // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be // commutative. @@ -286,14 +297,8 @@ int LAGraph_SwapEdges GRB_TRY(GrB_Semiring_new( &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; - // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - - // Extract adjacency matrix to make incidence matrix - E - // get just the lower triangular entries - //TODO: should I remove the diagonal? change the 0 if so - // Arrays to extract A into // Make E Matrix ----------------------------------------------------------- LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; @@ -316,7 +321,7 @@ int LAGraph_SwapEdges GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; - + GRB_TRY(GrB_Vector_dup(¬_pointers, hramp_v)) ; GrB_Index ramp_size; GRB_TRY (GxB_Vector_unpack_Full ( ramp_v, (void **)&ramp, &ramp_size, &iso, NULL)) ; @@ -335,7 +340,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; - GRB_TRY (GrB_Vector_new (&r_pairs, GrB_INT64, e)) ; + GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; GRB_TRY (GrB_Vector_assign_UINT8 ( dense_hash, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; @@ -388,6 +393,8 @@ int LAGraph_SwapEdges // GRB_TRY (GxB_Vector_unpack_Full( // r_60, (void **)&rand_arr, &rand_size, &iso, NULL // )) ; + // Hash (rand_arr) + // Matrix_Build (rand_arr, ramp, ramp, ) @@ -396,9 +403,10 @@ int LAGraph_SwapEdges )) ; - GrB_Index perm_size; - GRB_TRY (GxB_Vector_unpack_Full( - r_permute, (void **)&edge_perm, &perm_size, &iso, NULL + GrB_Index perm_size, arr_size, junk_size; + GRB_TRY (GxB_Vector_unpack_Bitmap( + r_permute, (int8_t **)&dup_swaps, (void **)&edge_perm, &junk_size, + &perm_size, &iso, &arr_size, NULL )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); @@ -417,7 +425,7 @@ int LAGraph_SwapEdges // Pair edges. Take a random permutation and pair adjacent values. GRB_TRY (GrB_mxm(E, NULL, NULL, GxB_ANY_SECOND_UINT64, P, E, NULL)) ; - GrB_Index arr_size, junk_size; + GRB_TRY (GxB_Matrix_unpack_CSR( P, &ramp, &edge_perm, (void**) &val_of_P, &arr_size, &perm_size, &junk_size, &iso, false, NULL @@ -440,7 +448,9 @@ int LAGraph_SwapEdges M = E_split[0]; GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop, 4, NULL)) ; - GRB_TRY (GrB_Matrix_new(&new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; + // Hash Edges ---------------------------------------------------------- + GRB_TRY (GrB_Matrix_new( + &new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&big_dense, GrB_UINT64, swaps_per_loop)) ; @@ -456,90 +466,109 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_UINT64( big_dense, NULL, NULL, (uint64_t) 0, GrB_ALL, 0, NULL )) ; - // GxB_Matrix_fprint(hash_s, "hash_s", GxB_SHORT, stdout); GRB_TRY(GrB_mxm( new_hashed_edges, NULL, NULL, bxor_hash, M, hash_s, NULL - )); + )) ; GRB_TRY(GrB_mxv( hashed_edges, NULL, NULL, bxor_hash, E, dense_hash, NULL )); // I will unpack and then reconstruct with hash as index. - GRB_TRY(GxB_Matrix_unpack_FullR( - new_hashed_edges, (void **) &hash_vals_new, &junk_size, &iso, NULL + GRB_TRY(GxB_Matrix_unpack_BitmapR( + new_hashed_edges, &dup_swaps, (void **) &hash_vals_new, + &junk_size, &junk_size, &iso, &junk_size, NULL )) ; GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - - GRB_TRY (GrB_Matrix_new( - &buckets, GrB_UINT64, 1ULL << 60, swaps_per_loop)) ; - // Build hash buckets - GRB_TRY(GxB_Vector_build_Scalar( - exists, hash_vals, one64, e + GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( + not_pointers, NULL,NULL, GrB_PLUS_UINT64, (uint64_t) dup_swaps, + not_pointers, NULL )) ; - GRB_TRY(GxB_Matrix_build_Scalar( - buckets, hash_vals_new, half_ramp, one64, swaps_per_loop * 2 + GRB_TRY(GxB_Vector_unpack_Full( + not_pointers, (void **) ¬_ptrs, &arr_size, &iso, NULL )) ; - GRB_TRY (GrB_mxv( - exists, NULL, GrB_PLUS_UINT64, LAGraph_plus_one_uint64, buckets, - big_dense, NULL + // Build Hash Buckets -------------------------------------------------- + GRB_TRY(GrB_Vector_build_UINT64( + new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate )) ; + GRB_TRY(GxB_Vector_build_Scalar( + exists, hash_vals, one64, e + )) ; + GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ull, (GrB_Index)0)) ; + GRB_TRY(GrB_Vector_eWiseMult_BinaryOp( + new_edges_h, NULL, NULL, duplicate, exists, new_edges_h, NULL + )); - GRB_TRY(GrB_Vector_select_UINT64( - exists, NULL, NULL, GrB_VALUEGT_UINT64, exists, 1ull, GrB_DESC_R + // TODO: not sure I need this + GRB_TRY(GrB_wait(new_edges_h, GrB_COMPLETE)) ; + // GRB_TRY(GrB_Vector_new( + // &dup_swaps_v, GrB_BOOL, swaps_per_loop * 2 + // )) ; + GRB_TRY(GxB_Vector_pack_Full( + not_pointers, (void **) ¬_ptrs, arr_size, iso, NULL )) ; - GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ll, (GrB_Index)0)) ; - GRB_TRY(GrB_Vector_new(&r_exists, GrB_UINT8, swaps_per_loop)) ; - - // Search through array for bad swaps. - GRB_TRY(GrB_vxm( - r_exists, NULL, NULL, LAGraph_any_one_uint8, exists, buckets, NULL + GRB_TRY(GrB_Vector_apply_BinaryOp2nd_UINT64( + not_pointers, NULL,NULL, GrB_MINUS_UINT64, not_pointers, + (uint64_t) dup_swaps, NULL )) ; - + LG_TRY(LAGraph_Malloc( + (void **) &arr_keep, swaps_per_loop, sizeof(uint64_t), msg) ;) + n_keep = 0; + for (int64_t i = 0; i < swaps_per_loop; i++) + if(dup_swaps[i]) + arr_keep[n_keep++] = i; GRB_TRY (GrB_Vector_clear(exists)) ; + GRB_TRY (GrB_Vector_clear(new_edges_h)) ; + // bool *iso_dup_value = NULL; + // LAGraph_Malloc((void **) &iso_dup_value, 1, 1, msg) ; + // iso_dup_value[0] = true; + // GRB_TRY(GxB_Vector_pack_Bitmap( + // dup_swaps_v, &dup_swaps, (void **)&iso_dup_value, + // swaps_per_loop * 2, 1, true, swaps_per_loop * 2, NULL + // )); + // GxB_Vector_fprint(dup_swaps_v, "Dups", GxB_SHORT, stdout) ; + // Search through array for bad swaps. - // GxB_Vector_fprint(r_exists,"r_exists",GxB_SHORT, stdout); - GRB_TRY (GrB_Vector_assign_INT8( - r_exists, r_exists, NULL, (uint8_t) 0, GrB_ALL, 0, GrB_DESC_RSC)) ; - GRB_TRY (GxB_Vector_unpack_CSC( - r_exists, &arr_keep, &junk, &arr_size, &junk_size, &iso, &n_keep, - NULL, NULL - )); + // Swap Good Edges ----------------------------------------------------- GRB_TRY(GrB_Matrix_new(&M_fours, GrB_UINT64, n_keep, 4)) ; GRB_TRY (GrB_Matrix_extract( - M_fours, NULL, NULL, M, arr_keep, n_keep, - GrB_ALL, 0, NULL)) ; - LG_TRY (LAGraph_Free(&junk, msg)) ; - GRB_TRY (GrB_mxm(M_fours, NULL, NULL, GxB_ANY_FIRST_UINT64, M_fours, swap_p, NULL)) ; - GRB_TRY (GrB_assign(M, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL)) ; + M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL + )) ; + GRB_TRY (GrB_mxm( + M_fours, NULL, NULL, GxB_ANY_FIRST_UINT64, M_fours, swap_p, NULL + )) ; + GRB_TRY (GrB_assign( + M, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL + )) ; GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop * 2, 2, NULL)); - GRB_TRY(GxB_Matrix_concat(E, E_split, 2, 1, NULL)); - // Free Matricies that have to be rebuilt - FREE_LOOP ; + + FREE_LOOP ; // Free Matricies that have to be rebuilt + // Adjust number of swaps to do next. num_attempts += swaps_per_loop; num_swaps += n_keep; swaps_per_loop = (n_keep * 3) / 2; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; - // Maintain random Vector LG_TRY (LAGraph_Random_Next(random_v, msg)) ; printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } + // Build Output Matrix GrB_Index ind_size = 0; GRB_TRY (GxB_Matrix_unpack_FullC( E, (void **)&indices, &ind_size, &iso, NULL)) ; GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); - GRB_TRY (GrB_eWiseAdd(*A_new, NULL, NULL, GrB_PLUS_UINT8, *A_new,*A_new, GrB_DESC_T0)) ; - GxB_Matrix_fprint(*A_new,"A_new",GxB_SHORT, stdout); + GRB_TRY (GrB_eWiseAdd( + *A_new, NULL, NULL, GrB_PLUS_UINT8, *A_new,*A_new, GrB_DESC_T0 + )) ; LG_FREE_WORK ; return (GrB_SUCCESS) ; } From 8cf6e3fdc044ce5dc47f37f86f5077ae000033d5 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 14 Nov 2024 23:21:36 -0600 Subject: [PATCH 031/115] Fixed memory leak --- experimental/algorithm/LAGraph_SwapEdges.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 9b4547d5e1..7a45a517f9 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -404,9 +404,8 @@ int LAGraph_SwapEdges GrB_Index perm_size, arr_size, junk_size; - GRB_TRY (GxB_Vector_unpack_Bitmap( - r_permute, (int8_t **)&dup_swaps, (void **)&edge_perm, &junk_size, - &perm_size, &iso, &arr_size, NULL + GRB_TRY (GxB_Vector_unpack_Full( + r_permute, (void **)&edge_perm, &perm_size, &iso, NULL )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); From 377fbbd97b5d6bbc9fe43e77468c76bf945aa08c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 15 Nov 2024 00:25:52 -0600 Subject: [PATCH 032/115] Removed permutation matrix --- experimental/algorithm/LAGraph_SwapEdges.c | 29 +++------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 7a45a517f9..e0c7a1d6b6 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -17,7 +17,6 @@ #define FREE_LOOP \ { \ - GrB_free (&P) ; \ GrB_free (&M) ; \ GrB_free (&M_fours) ; \ GrB_free(&new_hashed_edges); \ @@ -143,11 +142,6 @@ int LAGraph_SwapEdges // e entries. E_split[0] has those which are planning to swap. GrB_Matrix E_split[2] = {NULL, NULL}; - // swaps x e - // Selected pairs for next batch of swaps - // Each row contains 2 entries for the edges involved in a swap. - GrB_Matrix P = NULL; - // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. @@ -311,7 +305,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); GrB_free(&E_t); GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; - GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); + // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; @@ -378,7 +372,6 @@ int LAGraph_SwapEdges // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. - GRB_TRY (GrB_Matrix_new(&P, GrB_UINT8, e, e)) ; GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, e, 2)) ; @@ -412,23 +405,9 @@ int LAGraph_SwapEdges // TODO: Should there be a function that takes in A matrix and computes // in or out degree - // GRB_TRY (GxB_Matrix_build_Scalar( - // P, ramp, edge_perm, one8, e - // )); - - GRB_TRY (GxB_Matrix_pack_CSR( - P, &ramp, &edge_perm, (void**) &val_of_P, (e + 1) * sizeof(GrB_Index), - perm_size, sizeof(GrB_Index) , true, false, NULL - )); - - // Pair edges. Take a random permutation and pair adjacent values. - GRB_TRY (GrB_mxm(E, NULL, NULL, GxB_ANY_SECOND_UINT64, P, E, NULL)) ; - - - GRB_TRY (GxB_Matrix_unpack_CSR( - P, &ramp, &edge_perm, (void**) &val_of_P, &arr_size, - &perm_size, &junk_size, &iso, false, NULL - )); + GRB_TRY (GrB_Matrix_extract( + E, NULL, NULL, E, edge_perm, e, GrB_ALL, 0, NULL + )) ; //increase width of sorted so it can be used as a mask. GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, From 250b2629312a9d6bda50166a3fff2ccfe124bdcf Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 15 Nov 2024 21:03:12 -0600 Subject: [PATCH 033/115] Buckets for hashes --- experimental/algorithm/LAGraph_SwapEdges.c | 89 +++++++++++++++------- 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index e0c7a1d6b6..37fea78fc4 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -21,9 +21,10 @@ GrB_free (&M_fours) ; \ GrB_free(&new_hashed_edges); \ GrB_free(&hashed_edges); \ - GrB_free (&big_dense) ; \ LAGraph_Free((void **) &hash_vals_new, NULL);\ LAGraph_Free((void **) &hash_vals, NULL); \ + LAGraph_Free((void **) &buc_hash1, NULL); \ + LAGraph_Free((void **) &buc_hash2, NULL); \ } #define LG_FREE_WORK \ @@ -190,18 +191,22 @@ int LAGraph_SwapEdges // swaps x 2 matrix which holds the hashes of each planned edge. GrB_Matrix new_hashed_edges = NULL; + GrB_Matrix new_hash_parts = NULL; + // GrB_Matrix p_buckets = NULL; - - // swaps used for "outdegree" - GrB_Vector big_dense; // e holds hashes of old edges GrB_Vector hashed_edges = NULL; + GrB_Vector hash_parts = NULL; + GrB_Index *buc_hash1 = NULL, *buc_hash2 = NULL; + + // GrB_Matrix p_buckets = NULL; + // 2^60 holds the buckets in which hashes collided. - GrB_Vector exists = NULL; - GrB_Vector new_edges_h = NULL; + GrB_Matrix exists = NULL; + GrB_Matrix new_edges_h = NULL; GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; GrB_UnaryOp first_bit = NULL; @@ -292,8 +297,8 @@ int LAGraph_SwapEdges &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3; + int log_buc = LAGRAPH_MIN(64 - __builtin_clzll (e) - 2, 60); // Make E Matrix ----------------------------------------------------------- LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( @@ -304,7 +309,13 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); GrB_free(&E_t); - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; + + // GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; + // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; + GRB_TRY (GrB_Matrix_new( + &exists, GrB_UINT64, 1ULL << log_buc, 1ULL << (60))) ; + GRB_TRY (GrB_Matrix_new( + &new_edges_h, GrB_UINT64, 1ULL << log_buc, 1ULL << (60))) ; // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; @@ -334,7 +345,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; - GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; GRB_TRY (GrB_Vector_assign_UINT8 ( dense_hash, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; @@ -373,7 +383,7 @@ int LAGraph_SwapEdges // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; - // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, e, 2)) ; + // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, 1ull <<16, e)) ; GRB_TRY (GxB_Vector_sort ( @@ -381,11 +391,14 @@ int LAGraph_SwapEdges )) ; // GrB_Index *rand_arr, rand_size; // GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( - // r_60, NULL, NULL, GrB_BAND_UINT64, (uint64_t) 0xFFFFFFFFFFFFFFF, random_v, NULL + // r_60, NULL, NULL, GrB_BAND_UINT64, (uint64_t) 0xFFFF, random_v, NULL // )) ; // GRB_TRY (GxB_Vector_unpack_Full( // r_60, (void **)&rand_arr, &rand_size, &iso, NULL // )) ; + // GRB_TRY (GxB_Matrix_build_Scalar(p_buckets, rand_arr, ramp, one8, e)) ; + // GxB_Matrix_fprint(p_buckets, "p_buckets", GxB_SHORT, stdout) ; + // Hash (rand_arr) // Matrix_Build (rand_arr, ramp, ramp, ) @@ -402,9 +415,6 @@ int LAGraph_SwapEdges )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - - // TODO: Should there be a function that takes in A matrix and computes - // in or out degree GRB_TRY (GrB_Matrix_extract( E, NULL, NULL, E, edge_perm, e, GrB_ALL, 0, NULL )) ; @@ -429,9 +439,10 @@ int LAGraph_SwapEdges // Hash Edges ---------------------------------------------------------- GRB_TRY (GrB_Matrix_new( &new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; + GRB_TRY (GrB_Matrix_new( + &new_hash_parts, GrB_UINT64, swaps_per_loop, 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&big_dense, GrB_UINT64, swaps_per_loop)) ; - + GRB_TRY (GrB_Vector_new(&hash_parts, GrB_UINT64, e)) ; //This Scalar is used in the hash funtion and should be something near // 2^60 and odd. GRB_TRY (GrB_Matrix_assign_UINT64( @@ -441,9 +452,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_UINT64( dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL )) ; - GRB_TRY (GrB_Vector_assign_UINT64( - big_dense, NULL, NULL, (uint64_t) 0, GrB_ALL, 0, NULL - )) ; GRB_TRY(GrB_mxm( new_hashed_edges, NULL, NULL, bxor_hash, M, hash_s, NULL @@ -452,15 +460,33 @@ int LAGraph_SwapEdges hashed_edges, NULL, NULL, bxor_hash, E, dense_hash, NULL )); + GRB_TRY(GrB_Vector_apply_BinaryOp2nd_INT64( + hash_parts, NULL, NULL, GrB_DIV_UINT64, hashed_edges, 1ull << (60 - log_buc), + NULL + )) ; + GRB_TRY(GrB_Matrix_apply_BinaryOp2nd_INT64( + new_hash_parts, NULL, NULL, GrB_DIV_UINT64, new_hashed_edges, 1ull << (60 - log_buc), + NULL + )) ; + GxB_Vector_fprint(hash_parts, "hash_parts", GxB_SHORT, stdout) ; + GxB_Vector_fprint(hashed_edges, "hashed_edges", GxB_SHORT, stdout) ; + GxB_Matrix_fprint(exists, "exists", GxB_SHORT, stdout) ; + // I will unpack and then reconstruct with hash as index. GRB_TRY(GxB_Matrix_unpack_BitmapR( new_hashed_edges, &dup_swaps, (void **) &hash_vals_new, &junk_size, &junk_size, &iso, &junk_size, NULL )) ; + GRB_TRY(GxB_Matrix_unpack_FullR( + new_hash_parts, (void **) &buc_hash2, &junk_size, &iso, NULL + )) ; GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; + GRB_TRY(GxB_Vector_unpack_Full( + hash_parts, (void **) &buc_hash1, &junk_size, &iso, NULL + )) ; GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( not_pointers, NULL,NULL, GrB_PLUS_UINT64, (uint64_t) dup_swaps, not_pointers, NULL @@ -470,14 +496,21 @@ int LAGraph_SwapEdges )) ; // Build Hash Buckets -------------------------------------------------- - GRB_TRY(GrB_Vector_build_UINT64( - new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate + // GRB_TRY(GrB_Vector_build_UINT64( + // new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate + // )) ; + // GRB_TRY(GxB_Vector_build_Scalar( + // exists, hash_vals, one64, e + // )) ; + GRB_TRY(GxB_Matrix_build_Scalar( + exists, buc_hash1, hash_vals, one64, e )) ; - GRB_TRY(GxB_Vector_build_Scalar( - exists, hash_vals, one64, e + GxB_Matrix_fprint(exists, "exists", GxB_SHORT, stdout) ; + GRB_TRY(GrB_Matrix_build_UINT64( + new_edges_h, buc_hash2, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate )) ; - GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ull, (GrB_Index)0)) ; - GRB_TRY(GrB_Vector_eWiseMult_BinaryOp( + GRB_TRY(GrB_Matrix_setElement_UINT64(exists, 1ull, (GrB_Index)0, (GrB_Index)0)) ; + GRB_TRY(GrB_eWiseMult( new_edges_h, NULL, NULL, duplicate, exists, new_edges_h, NULL )); @@ -499,8 +532,8 @@ int LAGraph_SwapEdges for (int64_t i = 0; i < swaps_per_loop; i++) if(dup_swaps[i]) arr_keep[n_keep++] = i; - GRB_TRY (GrB_Vector_clear(exists)) ; - GRB_TRY (GrB_Vector_clear(new_edges_h)) ; + GRB_TRY (GrB_Matrix_clear(exists)) ; + GRB_TRY (GrB_Matrix_clear(new_edges_h)) ; // bool *iso_dup_value = NULL; // LAGraph_Malloc((void **) &iso_dup_value, 1, 1, msg) ; // iso_dup_value[0] = true; From a046147cbd53a0af6d7a7c65ac254ee356de0792 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 15 Nov 2024 22:04:28 -0600 Subject: [PATCH 034/115] Revert "Buckets for hashes" This reverts commit 250b2629312a9d6bda50166a3fff2ccfe124bdcf. --- experimental/algorithm/LAGraph_SwapEdges.c | 89 +++++++--------------- 1 file changed, 28 insertions(+), 61 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 37fea78fc4..e0c7a1d6b6 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -21,10 +21,9 @@ GrB_free (&M_fours) ; \ GrB_free(&new_hashed_edges); \ GrB_free(&hashed_edges); \ + GrB_free (&big_dense) ; \ LAGraph_Free((void **) &hash_vals_new, NULL);\ LAGraph_Free((void **) &hash_vals, NULL); \ - LAGraph_Free((void **) &buc_hash1, NULL); \ - LAGraph_Free((void **) &buc_hash2, NULL); \ } #define LG_FREE_WORK \ @@ -191,22 +190,18 @@ int LAGraph_SwapEdges // swaps x 2 matrix which holds the hashes of each planned edge. GrB_Matrix new_hashed_edges = NULL; - GrB_Matrix new_hash_parts = NULL; - // GrB_Matrix p_buckets = NULL; + + // swaps used for "outdegree" + GrB_Vector big_dense; // e holds hashes of old edges GrB_Vector hashed_edges = NULL; - GrB_Vector hash_parts = NULL; - GrB_Index *buc_hash1 = NULL, *buc_hash2 = NULL; - - // GrB_Matrix p_buckets = NULL; - // 2^60 holds the buckets in which hashes collided. - GrB_Matrix exists = NULL; - GrB_Matrix new_edges_h = NULL; + GrB_Vector exists = NULL; + GrB_Vector new_edges_h = NULL; GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; GrB_UnaryOp first_bit = NULL; @@ -297,8 +292,8 @@ int LAGraph_SwapEdges &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3; - int log_buc = LAGRAPH_MIN(64 - __builtin_clzll (e) - 2, 60); + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; + // Make E Matrix ----------------------------------------------------------- LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( @@ -309,13 +304,7 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); GrB_free(&E_t); - - // GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; - // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; - GRB_TRY (GrB_Matrix_new( - &exists, GrB_UINT64, 1ULL << log_buc, 1ULL << (60))) ; - GRB_TRY (GrB_Matrix_new( - &new_edges_h, GrB_UINT64, 1ULL << log_buc, 1ULL << (60))) ; + GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; @@ -345,6 +334,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; + GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; GRB_TRY (GrB_Vector_assign_UINT8 ( dense_hash, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; @@ -383,7 +373,7 @@ int LAGraph_SwapEdges // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; - // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, 1ull <<16, e)) ; + // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, e, 2)) ; GRB_TRY (GxB_Vector_sort ( @@ -391,14 +381,11 @@ int LAGraph_SwapEdges )) ; // GrB_Index *rand_arr, rand_size; // GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( - // r_60, NULL, NULL, GrB_BAND_UINT64, (uint64_t) 0xFFFF, random_v, NULL + // r_60, NULL, NULL, GrB_BAND_UINT64, (uint64_t) 0xFFFFFFFFFFFFFFF, random_v, NULL // )) ; // GRB_TRY (GxB_Vector_unpack_Full( // r_60, (void **)&rand_arr, &rand_size, &iso, NULL // )) ; - // GRB_TRY (GxB_Matrix_build_Scalar(p_buckets, rand_arr, ramp, one8, e)) ; - // GxB_Matrix_fprint(p_buckets, "p_buckets", GxB_SHORT, stdout) ; - // Hash (rand_arr) // Matrix_Build (rand_arr, ramp, ramp, ) @@ -415,6 +402,9 @@ int LAGraph_SwapEdges )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); + + // TODO: Should there be a function that takes in A matrix and computes + // in or out degree GRB_TRY (GrB_Matrix_extract( E, NULL, NULL, E, edge_perm, e, GrB_ALL, 0, NULL )) ; @@ -439,10 +429,9 @@ int LAGraph_SwapEdges // Hash Edges ---------------------------------------------------------- GRB_TRY (GrB_Matrix_new( &new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; - GRB_TRY (GrB_Matrix_new( - &new_hash_parts, GrB_UINT64, swaps_per_loop, 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&hash_parts, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&big_dense, GrB_UINT64, swaps_per_loop)) ; + //This Scalar is used in the hash funtion and should be something near // 2^60 and odd. GRB_TRY (GrB_Matrix_assign_UINT64( @@ -452,6 +441,9 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_UINT64( dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL )) ; + GRB_TRY (GrB_Vector_assign_UINT64( + big_dense, NULL, NULL, (uint64_t) 0, GrB_ALL, 0, NULL + )) ; GRB_TRY(GrB_mxm( new_hashed_edges, NULL, NULL, bxor_hash, M, hash_s, NULL @@ -460,33 +452,15 @@ int LAGraph_SwapEdges hashed_edges, NULL, NULL, bxor_hash, E, dense_hash, NULL )); - GRB_TRY(GrB_Vector_apply_BinaryOp2nd_INT64( - hash_parts, NULL, NULL, GrB_DIV_UINT64, hashed_edges, 1ull << (60 - log_buc), - NULL - )) ; - GRB_TRY(GrB_Matrix_apply_BinaryOp2nd_INT64( - new_hash_parts, NULL, NULL, GrB_DIV_UINT64, new_hashed_edges, 1ull << (60 - log_buc), - NULL - )) ; - GxB_Vector_fprint(hash_parts, "hash_parts", GxB_SHORT, stdout) ; - GxB_Vector_fprint(hashed_edges, "hashed_edges", GxB_SHORT, stdout) ; - GxB_Matrix_fprint(exists, "exists", GxB_SHORT, stdout) ; - // I will unpack and then reconstruct with hash as index. GRB_TRY(GxB_Matrix_unpack_BitmapR( new_hashed_edges, &dup_swaps, (void **) &hash_vals_new, &junk_size, &junk_size, &iso, &junk_size, NULL )) ; - GRB_TRY(GxB_Matrix_unpack_FullR( - new_hash_parts, (void **) &buc_hash2, &junk_size, &iso, NULL - )) ; GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - GRB_TRY(GxB_Vector_unpack_Full( - hash_parts, (void **) &buc_hash1, &junk_size, &iso, NULL - )) ; GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( not_pointers, NULL,NULL, GrB_PLUS_UINT64, (uint64_t) dup_swaps, not_pointers, NULL @@ -496,21 +470,14 @@ int LAGraph_SwapEdges )) ; // Build Hash Buckets -------------------------------------------------- - // GRB_TRY(GrB_Vector_build_UINT64( - // new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate - // )) ; - // GRB_TRY(GxB_Vector_build_Scalar( - // exists, hash_vals, one64, e - // )) ; - GRB_TRY(GxB_Matrix_build_Scalar( - exists, buc_hash1, hash_vals, one64, e + GRB_TRY(GrB_Vector_build_UINT64( + new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate )) ; - GxB_Matrix_fprint(exists, "exists", GxB_SHORT, stdout) ; - GRB_TRY(GrB_Matrix_build_UINT64( - new_edges_h, buc_hash2, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate + GRB_TRY(GxB_Vector_build_Scalar( + exists, hash_vals, one64, e )) ; - GRB_TRY(GrB_Matrix_setElement_UINT64(exists, 1ull, (GrB_Index)0, (GrB_Index)0)) ; - GRB_TRY(GrB_eWiseMult( + GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ull, (GrB_Index)0)) ; + GRB_TRY(GrB_Vector_eWiseMult_BinaryOp( new_edges_h, NULL, NULL, duplicate, exists, new_edges_h, NULL )); @@ -532,8 +499,8 @@ int LAGraph_SwapEdges for (int64_t i = 0; i < swaps_per_loop; i++) if(dup_swaps[i]) arr_keep[n_keep++] = i; - GRB_TRY (GrB_Matrix_clear(exists)) ; - GRB_TRY (GrB_Matrix_clear(new_edges_h)) ; + GRB_TRY (GrB_Vector_clear(exists)) ; + GRB_TRY (GrB_Vector_clear(new_edges_h)) ; // bool *iso_dup_value = NULL; // LAGraph_Malloc((void **) &iso_dup_value, 1, 1, msg) ; // iso_dup_value[0] = true; From 51ab705e73f758855b0399c21777eab5057da6e3 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 15 Nov 2024 22:48:09 -0600 Subject: [PATCH 035/115] switching verticies of edges pre swap --- experimental/algorithm/LAGraph_SwapEdges.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index e0c7a1d6b6..82a0104a84 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -309,7 +309,7 @@ int LAGraph_SwapEdges // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&swapVals, GrB_BOOL, e)) ; + GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; @@ -402,19 +402,21 @@ int LAGraph_SwapEdges )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - - // TODO: Should there be a function that takes in A matrix and computes - // in or out degree GRB_TRY (GrB_Matrix_extract( E, NULL, NULL, E, edge_perm, e, GrB_ALL, 0, NULL )) ; - + GRB_TRY (GrB_Matrix_reduce_Monoid( + swapVals, swapVals, NULL, GxB_BXOR_UINT64_MONOID, E, NULL)); + GrB_Matrix xor_diag = NULL; + GRB_TRY (GrB_Matrix_diag(&xor_diag, swapVals, 0)); + GRB_TRY (GrB_mxm( + E, NULL, NULL, GxB_BXOR_BXOR_UINT64, xor_diag, E, NULL)) ; //increase width of sorted so it can be used as a mask. - GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, - (GrB_Matrix) swapVals, (GrB_Matrix) dense_hash, GrB_DESC_T1)) ; + // GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, + // (GrB_Matrix) swapVals, (GrB_Matrix) dense_hash, GrB_DESC_T1)) ; //swap vertexes in E randomly. - GRB_TRY (GrB_mxm( - E, swapMask, NULL, GxB_ANY_FIRST_UINT64, E, y, NULL)) ; + // GRB_TRY (GrB_mxm( + // E, swapMask, NULL, GxB_ANY_FIRST_UINT64, E, y, NULL)) ; GrB_Index E_bounds[3] = {swaps_per_loop * 2, e - swaps_per_loop * 2, 2}; GRB_TRY (GrB_Matrix_new(E_split, GrB_UINT64, E_bounds[0], 2)); From d596a62d062ee585948083fdcbbaf9fe5b5c69a0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 16 Nov 2024 16:44:54 -0600 Subject: [PATCH 036/115] vectorise edges --- experimental/algorithm/LAGraph_SwapEdges.c | 37 ++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index e0c7a1d6b6..27fc7b2048 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -121,6 +121,25 @@ void log_duplicate " **((int8_t **)y) = (int8_t) 0; \n"\ " *z = *x; \n"\ "}" + +typedef struct { + uint64_t a; + uint64_t b; +} edge_type; +#define EDGE_TYPE \ +"typedef struct { uint64_t a; uint64_t b; } edge_type;" + +void swap_ab (edge_type *z, const edge_type *x) +{ + z->a = x->b; + z->b = x->a; +} +#define SWAP_AB \ +"void swap_ab (uint64_t *z, const uint64_t *x) \n"\ +"{ \n"\ +" z[0] = x[1]; \n"\ +" z[1] = x[0]; \n"\ +"}" int LAGraph_SwapEdges ( // output @@ -137,7 +156,8 @@ int LAGraph_SwapEdges GrB_Matrix A = NULL; // n x n Adjacency Matrix // e x 2 with entries corresponding to verticies of an edge - GrB_Matrix E = NULL, E_t = NULL; + GrB_Matrix E = NULL, E_t = NULL; + GrB_Matrix E_vec = NULL; // e entries. E_split[0] has those which are planning to swap. GrB_Matrix E_split[2] = {NULL, NULL}; @@ -206,6 +226,8 @@ int LAGraph_SwapEdges GrB_UnaryOp first_bit = NULL; + GrB_UnaryOp swap_verts = NULL; + // z = h_y(x) GrB_BinaryOp hash_seed = NULL; @@ -216,6 +238,8 @@ int LAGraph_SwapEdges GrB_BinaryOp duplicate = NULL; + GrB_Type lg_edge = NULL; + int8_t *dup_swaps = NULL; GrB_Vector dup_swaps_v = NULL; GrB_Vector not_pointers = NULL; @@ -265,9 +289,14 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; + + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; - + GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; + + //Init Operators ----------------------------------------------------------- GRB_TRY (GxB_UnaryOp_new ( &first_bit, (GxB_unary_function) (&first_bit_equals), @@ -282,6 +311,10 @@ int LAGraph_SwapEdges &duplicate, (GxB_binary_function) (&log_duplicate), GrB_UINT64, GrB_UINT64, GrB_UINT64, "log_duplicate", LOG_DUPLICATE )) ; + GRB_TRY (GxB_UnaryOp_new ( + &swap_verts, (GxB_unary_function) (&swap_ab), + lg_edge, lg_edge, "swap_ab", SWAP_AB + )) ; // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be // commutative. From d61805ab0d4f0755c559b119caaa617ac26c3a06 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 16 Nov 2024 17:02:53 -0600 Subject: [PATCH 037/115] inplace swapping using E vector --- experimental/algorithm/LAGraph_SwapEdges.c | 42 +++++++++++++++------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 1fe0c57838..9559c7e0e9 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -45,6 +45,7 @@ GrB_free (&r_60) ; \ GrB_free(&exists); \ GrB_free (&bxor_hash) ; \ + GrB_free (&E_vec) ; \ LAGraph_Free((void**)&dup_swaps, msg) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ @@ -129,16 +130,19 @@ typedef struct { #define EDGE_TYPE \ "typedef struct { uint64_t a; uint64_t b; } edge_type;" +// TO BE USED AS AN INPLACE OP void swap_ab (edge_type *z, const edge_type *x) { - z->a = x->b; - z->b = x->a; + z->a ^= x->b; + z->b ^= x->a; + z->a ^= x->b; } #define SWAP_AB \ "void swap_ab (uint64_t *z, const uint64_t *x) \n"\ "{ \n"\ -" z[0] = x[1]; \n"\ -" z[1] = x[0]; \n"\ +" z[0] ^= x[1]; \n"\ +" z[1] ^= x[0]; \n"\ +" z[0] ^= x[1]; \n"\ "}" int LAGraph_SwapEdges ( @@ -157,7 +161,7 @@ int LAGraph_SwapEdges // e x 2 with entries corresponding to verticies of an edge GrB_Matrix E = NULL, E_t = NULL; - GrB_Matrix E_vec = NULL; + GrB_Vector E_vec = NULL; // e entries. E_split[0] has those which are planning to swap. GrB_Matrix E_split[2] = {NULL, NULL}; @@ -262,6 +266,8 @@ int LAGraph_SwapEdges GrB_Vector dense_hash = NULL; GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; + + GrB_Index ind_size = 0; //-------------------------------------------------------------------------- // Check inputs TODO @@ -438,13 +444,24 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_extract( E, NULL, NULL, E, edge_perm, e, GrB_ALL, 0, NULL )) ; - GRB_TRY (GrB_Matrix_reduce_Monoid( - swapVals, swapVals, NULL, GxB_BXOR_UINT64_MONOID, E, NULL)); - GrB_Matrix xor_diag = NULL; - GRB_TRY (GrB_Matrix_diag(&xor_diag, swapVals, 0)); - GRB_TRY (GrB_mxm( - E, NULL, NULL, GxB_BXOR_BXOR_UINT64, xor_diag, E, NULL)) ; - //increase width of sorted so it can be used as a mask. + // GRB_TRY (GrB_Matrix_reduce_Monoid( + // swapVals, swapVals, NULL, GxB_BXOR_UINT64_MONOID, E, NULL)); + // GrB_Matrix xor_diag = NULL; + // GRB_TRY (GrB_Matrix_diag(&xor_diag, swapVals, 0)); + // GRB_TRY (GrB_mxm( + // E, NULL, NULL, GxB_BXOR_BXOR_UINT64, xor_diag, E, NULL)) ; + GRB_TRY (GxB_Matrix_unpack_FullR( + E, (void **) &indices, &ind_size, &iso, NULL)); + GRB_TRY (GxB_Vector_pack_Full( + E_vec, (void **) &indices, ind_size, iso, NULL)); + GRB_TRY(GrB_Vector_apply(E_vec, NULL, NULL, swap_verts, E_vec, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full( + E_vec, (void **) &indices, &ind_size, &iso, NULL)); + GRB_TRY (GxB_Matrix_pack_FullR( + E, (void **) &indices, ind_size, iso, NULL)); + // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout) ; + + // increase width of sorted so it can be used as a mask. // GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, // (GrB_Matrix) swapVals, (GrB_Matrix) dense_hash, GrB_DESC_T1)) ; //swap vertexes in E randomly. @@ -575,7 +592,6 @@ int LAGraph_SwapEdges printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } // Build Output Matrix - GrB_Index ind_size = 0; GRB_TRY (GxB_Matrix_unpack_FullC( E, (void **)&indices, &ind_size, &iso, NULL)) ; GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); From 0e37a78063ba1d8250e95098c7c3833308af4359 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 16 Nov 2024 17:45:35 -0600 Subject: [PATCH 038/115] fixed randomized swapping --- experimental/algorithm/LAGraph_SwapEdges.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 9559c7e0e9..7f5684db3c 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -133,16 +133,14 @@ typedef struct { // TO BE USED AS AN INPLACE OP void swap_ab (edge_type *z, const edge_type *x) { - z->a ^= x->b; - z->b ^= x->a; - z->a ^= x->b; + z->a = x->b; + z->b = x->a; } #define SWAP_AB \ "void swap_ab (uint64_t *z, const uint64_t *x) \n"\ "{ \n"\ -" z[0] ^= x[1]; \n"\ -" z[1] ^= x[0]; \n"\ -" z[0] ^= x[1]; \n"\ +" z[0] = x[1]; \n"\ +" z[1] = x[0]; \n"\ "}" int LAGraph_SwapEdges ( @@ -454,7 +452,7 @@ int LAGraph_SwapEdges E, (void **) &indices, &ind_size, &iso, NULL)); GRB_TRY (GxB_Vector_pack_Full( E_vec, (void **) &indices, ind_size, iso, NULL)); - GRB_TRY(GrB_Vector_apply(E_vec, NULL, NULL, swap_verts, E_vec, NULL)) ; + GRB_TRY(GrB_Vector_apply(E_vec, swapVals, NULL, swap_verts, E_vec, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full( E_vec, (void **) &indices, &ind_size, &iso, NULL)); GRB_TRY (GxB_Matrix_pack_FullR( From b9bfc4bed5835633be7bc9d4bfbf743494e372b6 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 19 Nov 2024 14:37:38 -0600 Subject: [PATCH 039/115] Simplified initial permute --- experimental/algorithm/LAGraph_SwapEdges.c | 35 ++++++++-------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 7f5684db3c..ee70e2fd8f 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -18,7 +18,6 @@ #define FREE_LOOP \ { \ GrB_free (&M) ; \ - GrB_free (&M_fours) ; \ GrB_free(&new_hashed_edges); \ GrB_free(&hashed_edges); \ GrB_free (&big_dense) ; \ @@ -168,7 +167,6 @@ int LAGraph_SwapEdges // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. GrB_Matrix M = NULL; - GrB_Matrix M_fours = NULL; // M with exactly 4 entries // n = |V| e = |E| GrB_Index n = 0, e = 0; @@ -183,7 +181,7 @@ int LAGraph_SwapEdges // indicies for A GrB_Index *indices = NULL; - // IDK + // [0,1,1,. . ., 0] swap a given edge. Boolean GrB_Vector swapVals = NULL; // e x 2 Matrix that picks the edges for which we will swap values. @@ -439,19 +437,13 @@ int LAGraph_SwapEdges )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - GRB_TRY (GrB_Matrix_extract( - E, NULL, NULL, E, edge_perm, e, GrB_ALL, 0, NULL - )) ; - // GRB_TRY (GrB_Matrix_reduce_Monoid( - // swapVals, swapVals, NULL, GxB_BXOR_UINT64_MONOID, E, NULL)); - // GrB_Matrix xor_diag = NULL; - // GRB_TRY (GrB_Matrix_diag(&xor_diag, swapVals, 0)); - // GRB_TRY (GrB_mxm( - // E, NULL, NULL, GxB_BXOR_BXOR_UINT64, xor_diag, E, NULL)) ; GRB_TRY (GxB_Matrix_unpack_FullR( E, (void **) &indices, &ind_size, &iso, NULL)); GRB_TRY (GxB_Vector_pack_Full( E_vec, (void **) &indices, ind_size, iso, NULL)); + GRB_TRY (GrB_Vector_extract( + E_vec, NULL, NULL, E_vec, edge_perm, e, NULL + )) ; GRB_TRY(GrB_Vector_apply(E_vec, swapVals, NULL, swap_verts, E_vec, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full( E_vec, (void **) &indices, &ind_size, &iso, NULL)); @@ -473,8 +465,8 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Matrix_split( E_split, 2, 1, E_bounds, E_bounds + 2, E, NULL)); - M = E_split[0]; - GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop, 4, NULL)) ; + GRB_TRY (GxB_Matrix_reshape( + E_split[0], false, swaps_per_loop, 4, NULL)) ; // Hash Edges ---------------------------------------------------------- GRB_TRY (GrB_Matrix_new( @@ -496,7 +488,7 @@ int LAGraph_SwapEdges )) ; GRB_TRY(GrB_mxm( new_hashed_edges, NULL, NULL, bxor_hash, - M, hash_s, NULL + E_split[0], hash_s, NULL )) ; GRB_TRY(GrB_mxv( hashed_edges, NULL, NULL, bxor_hash, @@ -562,21 +554,20 @@ int LAGraph_SwapEdges // Search through array for bad swaps. // Swap Good Edges ----------------------------------------------------- - GRB_TRY(GrB_Matrix_new(&M_fours, GrB_UINT64, n_keep, 4)) ; + GRB_TRY(GrB_Matrix_new(&M, GrB_UINT64, n_keep, 4)) ; GRB_TRY (GrB_Matrix_extract( - M_fours, NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL + M, NULL, NULL, E_split[0], arr_keep, n_keep, GrB_ALL, 0, NULL )) ; GRB_TRY (GrB_mxm( - M_fours, NULL, NULL, GxB_ANY_FIRST_UINT64, M_fours, swap_p, NULL + M, NULL, NULL, GxB_ANY_FIRST_UINT64, M, swap_p, NULL )) ; GRB_TRY (GrB_assign( - M, NULL, NULL, M_fours, arr_keep, n_keep, GrB_ALL, 0, NULL + E_split[0], NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL )) ; - GRB_TRY (GxB_Matrix_reshape(M, false, swaps_per_loop * 2, 2, NULL)); + GRB_TRY (GxB_Matrix_reshape( + E_split[0], false, swaps_per_loop * 2, 2, NULL)); GRB_TRY(GxB_Matrix_concat(E, E_split, 2, 1, NULL)); - - FREE_LOOP ; // Free Matricies that have to be rebuilt // Adjust number of swaps to do next. From 1fb51c82f1ae060fabac84e67ec945c0bef4e88b Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 24 Nov 2024 15:52:00 -0600 Subject: [PATCH 040/115] faster unary ops for swaps --- experimental/algorithm/LAGraph_SwapEdges.c | 141 +++++++++++++-------- 1 file changed, 90 insertions(+), 51 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index ee70e2fd8f..0b99e3658b 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -22,6 +22,7 @@ GrB_free(&hashed_edges); \ GrB_free (&big_dense) ; \ LAGraph_Free((void **) &hash_vals_new, NULL);\ + LAGraph_Free((void**)&dup_swaps, msg) ; \ LAGraph_Free((void **) &hash_vals, NULL); \ } @@ -45,7 +46,6 @@ GrB_free(&exists); \ GrB_free (&bxor_hash) ; \ GrB_free (&E_vec) ; \ - LAGraph_Free((void**)&dup_swaps, msg) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ @@ -129,7 +129,18 @@ typedef struct { #define EDGE_TYPE \ "typedef struct { uint64_t a; uint64_t b; } edge_type;" -// TO BE USED AS AN INPLACE OP +typedef struct { + uint64_t a; + uint64_t b; + uint64_t c; + uint64_t d; +} swap_type; +#define SWAP_TYPE \ +"typedef struct { \n"\ + "uint64_t a1; uint64_t b1; uint64_t a2; uint64_t b2; \n" \ +"}swap_type;" + +// TODO make inplace void swap_ab (edge_type *z, const edge_type *x) { z->a = x->b; @@ -141,6 +152,23 @@ void swap_ab (edge_type *z, const edge_type *x) " z[0] = x[1]; \n"\ " z[1] = x[0]; \n"\ "}" +void swap_bc (swap_type *z, const swap_type *x) +{ + z->a = x->a; + z->d = x->d; + z->b ^= x->c; + z->c ^= x->b; + z->b ^= x->c; +} +#define SWAP_BC \ +"void swap_bc (uint64_t *z, const uint64_t *x) \n"\ +"{ \n"\ +" z[0] = x[0]; \n"\ +" z[3] = x[3]; \n"\ +" z[1] ^= x[2]; \n"\ +" z[2] ^= x[1]; \n"\ +" z[1] ^= x[2]; \n"\ +"}" int LAGraph_SwapEdges ( // output @@ -166,7 +194,7 @@ int LAGraph_SwapEdges // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. - GrB_Matrix M = NULL; + GrB_Vector M = NULL; // n = |V| e = |E| GrB_Index n = 0, e = 0; @@ -226,7 +254,10 @@ int LAGraph_SwapEdges GrB_UnaryOp first_bit = NULL; + // a <---> b GrB_UnaryOp swap_verts = NULL; + // b1 <---> a2 + GrB_UnaryOp swap_pair = NULL; // z = h_y(x) GrB_BinaryOp hash_seed = NULL; @@ -238,7 +269,8 @@ int LAGraph_SwapEdges GrB_BinaryOp duplicate = NULL; - GrB_Type lg_edge = NULL; + // Toople types + GrB_Type lg_edge = NULL, lg_swap = NULL; int8_t *dup_swaps = NULL; GrB_Vector dup_swaps_v = NULL; @@ -248,6 +280,7 @@ int LAGraph_SwapEdges GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; + // Constants --------------------------------------------------------------- uint64_t *val_of_P = NULL; @@ -283,21 +316,27 @@ int LAGraph_SwapEdges //-------------------------------------------------------------------------- // Initializations //-------------------------------------------------------------------------- - A = G->A ; + A = G->A ; + + // Types + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; + GRB_TRY (GxB_Type_new( + &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; + GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; + // Extract lower triangular edges. - GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; + GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; - //Init Operators ----------------------------------------------------------- GRB_TRY (GxB_UnaryOp_new ( @@ -317,6 +356,10 @@ int LAGraph_SwapEdges &swap_verts, (GxB_unary_function) (&swap_ab), lg_edge, lg_edge, "swap_ab", SWAP_AB )) ; + GRB_TRY (GxB_UnaryOp_new ( + &swap_pair, (GxB_unary_function) (&swap_bc), + lg_swap, lg_swap, "swap_bc", SWAP_BC + )) ; // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be // commutative. @@ -449,14 +492,6 @@ int LAGraph_SwapEdges E_vec, (void **) &indices, &ind_size, &iso, NULL)); GRB_TRY (GxB_Matrix_pack_FullR( E, (void **) &indices, ind_size, iso, NULL)); - // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout) ; - - // increase width of sorted so it can be used as a mask. - // GRB_TRY (GrB_mxm (swapMask, NULL, NULL, GxB_ANY_FIRST_BOOL, - // (GrB_Matrix) swapVals, (GrB_Matrix) dense_hash, GrB_DESC_T1)) ; - //swap vertexes in E randomly. - // GRB_TRY (GrB_mxm( - // E, swapMask, NULL, GxB_ANY_FIRST_UINT64, E, y, NULL)) ; GrB_Index E_bounds[3] = {swaps_per_loop * 2, e - swaps_per_loop * 2, 2}; GRB_TRY (GrB_Matrix_new(E_split, GrB_UINT64, E_bounds[0], 2)); @@ -495,10 +530,11 @@ int LAGraph_SwapEdges E, dense_hash, NULL )); + GrB_Index dup_arr_size; // I will unpack and then reconstruct with hash as index. GRB_TRY(GxB_Matrix_unpack_BitmapR( new_hashed_edges, &dup_swaps, (void **) &hash_vals_new, - &junk_size, &junk_size, &iso, &junk_size, NULL + &dup_arr_size, &junk_size, &iso, &junk_size, NULL )) ; GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL @@ -512,22 +548,26 @@ int LAGraph_SwapEdges )) ; // Build Hash Buckets -------------------------------------------------- - GRB_TRY(GrB_Vector_build_UINT64( - new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate - )) ; GRB_TRY(GxB_Vector_build_Scalar( exists, hash_vals, one64, e )) ; GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ull, (GrB_Index)0)) ; - GRB_TRY(GrB_Vector_eWiseMult_BinaryOp( + + // THIS HAS SIDE EFFECTS - it writes bad edges to dup_swaps array + GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; + GRB_TRY(GrB_Vector_build_UINT64( + new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate + )) ; + GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; + GRB_TRY (GrB_Vector_eWiseMult_BinaryOp( new_edges_h, NULL, NULL, duplicate, exists, new_edges_h, NULL )); - - // TODO: not sure I need this - GRB_TRY(GrB_wait(new_edges_h, GrB_COMPLETE)) ; - // GRB_TRY(GrB_Vector_new( - // &dup_swaps_v, GrB_BOOL, swaps_per_loop * 2 - // )) ; + GRB_TRY(GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; + n_keep = 0; + for(int64_t i = 0; i < swaps_per_loop; ++i) + { + n_keep += dup_swaps[i]; + } GRB_TRY(GxB_Vector_pack_Full( not_pointers, (void **) ¬_ptrs, arr_size, iso, NULL )) ; @@ -535,36 +575,35 @@ int LAGraph_SwapEdges not_pointers, NULL,NULL, GrB_MINUS_UINT64, not_pointers, (uint64_t) dup_swaps, NULL )) ; - LG_TRY(LAGraph_Malloc( - (void **) &arr_keep, swaps_per_loop, sizeof(uint64_t), msg) ;) - n_keep = 0; - for (int64_t i = 0; i < swaps_per_loop; i++) - if(dup_swaps[i]) - arr_keep[n_keep++] = i; GRB_TRY (GrB_Vector_clear(exists)) ; GRB_TRY (GrB_Vector_clear(new_edges_h)) ; - // bool *iso_dup_value = NULL; - // LAGraph_Malloc((void **) &iso_dup_value, 1, 1, msg) ; - // iso_dup_value[0] = true; - // GRB_TRY(GxB_Vector_pack_Bitmap( - // dup_swaps_v, &dup_swaps, (void **)&iso_dup_value, - // swaps_per_loop * 2, 1, true, swaps_per_loop * 2, NULL - // )); - // GxB_Vector_fprint(dup_swaps_v, "Dups", GxB_SHORT, stdout) ; - // Search through array for bad swaps. // Swap Good Edges ----------------------------------------------------- - GRB_TRY(GrB_Matrix_new(&M, GrB_UINT64, n_keep, 4)) ; - - GRB_TRY (GrB_Matrix_extract( - M, NULL, NULL, E_split[0], arr_keep, n_keep, GrB_ALL, 0, NULL + GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; + GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_BOOL, swaps_per_loop)) ; + // GxB_Matrix_fprint(E_split[0], "E", GxB_SHORT, stdout); + GRB_TRY (GxB_Matrix_unpack_FullR( + E_split[0], (void **) &indices, &ind_size, &iso, NULL )) ; - GRB_TRY (GrB_mxm( - M, NULL, NULL, GxB_ANY_FIRST_UINT64, M, swap_p, NULL + GRB_TRY (GxB_Vector_pack_Bitmap( + M, &dup_swaps, (void **) &indices, swaps_per_loop , ind_size, iso, n_keep, NULL )) ; - GRB_TRY (GrB_assign( - E_split[0], NULL, NULL, M, arr_keep, n_keep, GrB_ALL, 0, NULL + // GRB_TRY (GxB_Vector_pack_Full( + // M, (void **) &indices, ind_size, iso, NULL + // )) ; + // GRB_TRY (GxB_Vector_pack_Full( + // dup_swaps_v, (void **) &dup_swaps, swaps_per_loop, false, NULL + // )) ; + GRB_TRY (GrB_Vector_apply(M, NULL, NULL, swap_pair, M, NULL)) ; + // GxB_Vector_fprint(M, "M", GxB_SHORT, stdout); + + GRB_TRY (GxB_Vector_unpack_Bitmap( + M, &dup_swaps, (void **) &indices, &swaps_per_loop , &ind_size, &iso, &n_keep, NULL + )) ; + GRB_TRY (GxB_Matrix_pack_FullR( + E_split[0], (void **) &indices, ind_size, iso, NULL )) ; + // GxB_Matrix_fprint(E_split[0], "E", GxB_SHORT, stdout); GRB_TRY (GxB_Matrix_reshape( E_split[0], false, swaps_per_loop * 2, 2, NULL)); GRB_TRY(GxB_Matrix_concat(E, E_split, 2, 1, NULL)); From 8c9022de6951c7727e16b0b5d585099ec1032437 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 3 Dec 2024 14:44:21 -0600 Subject: [PATCH 041/115] Vectorised most thin matricies --- experimental/algorithm/LAGraph_SwapEdges.c | 267 ++++++++++----------- 1 file changed, 132 insertions(+), 135 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 0b99e3658b..8b0a223595 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -18,12 +18,10 @@ #define FREE_LOOP \ { \ GrB_free (&M) ; \ + GrB_free (&M_thin) ; \ + GrB_free(&dup_swaps_v); \ GrB_free(&new_hashed_edges); \ GrB_free(&hashed_edges); \ - GrB_free (&big_dense) ; \ - LAGraph_Free((void **) &hash_vals_new, NULL);\ - LAGraph_Free((void**)&dup_swaps, msg) ; \ - LAGraph_Free((void **) &hash_vals, NULL); \ } #define LG_FREE_WORK \ @@ -51,6 +49,9 @@ LAGraph_Free((void**)&half_ramp, msg) ; \ LAGraph_Free((void**)&edge_perm, msg) ; \ LAGraph_Free((void**) &val_of_P, msg); \ + LAGraph_Free((void **) &dup_swaps, NULL);\ + LAGraph_Free((void **) &hash_vals_new, NULL);\ + LAGraph_Free((void **) &hash_vals, NULL); \ FREE_LOOP ; \ } @@ -99,26 +100,25 @@ void swap_pattern void hash_node (uint64_t *z, const uint64_t *x, const uint64_t *y) { - (*z) = ((*y) * (*x)) >> (4); + (*z) = ((*y) * (*x)) & 0xFFFFFFFFFFFFFFF; } #define HASH_ONE \ "void hash_node \n"\ -" (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ +" (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ "{ \n"\ -" (*z) = ((*y) * (*x)) >> (4); \n"\ +" (*z) = ((*y) * (*x)) & 0xFFFFFFFFFFFFFFF; \n"\ "}" - void log_duplicate (uint64_t *z, const uint64_t *x, const uint64_t *y) { - **((int8_t **)y) = (int8_t) 0; + **((int16_t **)y) = (int16_t) 0; *z = *x; } #define LOG_DUPLICATE \ "void log_duplicate \n"\ " (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ "{ \n"\ -" **((int8_t **)y) = (int8_t) 0; \n"\ +" **((int16_t **)y) = (int16_t) 0; \n"\ " *z = *x; \n"\ "}" @@ -137,37 +137,58 @@ typedef struct { } swap_type; #define SWAP_TYPE \ "typedef struct { \n"\ - "uint64_t a1; uint64_t b1; uint64_t a2; uint64_t b2; \n" \ +" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n" \ "}swap_type;" -// TODO make inplace -void swap_ab (edge_type *z, const edge_type *x) +void swap_ab +(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) { - z->a = x->b; - z->b = x->a; + if(I < *y) + { + z->a ^= x->b; + z->b ^= x->a; + z->a ^= x->b; + } } #define SWAP_AB \ -"void swap_ab (uint64_t *z, const uint64_t *x) \n"\ -"{ \n"\ -" z[0] = x[1]; \n"\ -" z[1] = x[0]; \n"\ +"void swap_ab \n"\ +"(uint64_t *z, const uint64_t *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"{ \n"\ +" if (I & 1) \n"\ +" { \n"\ +" z[0] ^= x[1]; \n"\ +" z[1] ^= x[0]; \n"\ +" z[0] ^= x[1]; \n"\ +" } \n"\ "}" -void swap_bc (swap_type *z, const swap_type *x) +void swap_bc +(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) { - z->a = x->a; - z->d = x->d; - z->b ^= x->c; - z->c ^= x->b; - z->b ^= x->c; + z->b ^= z->c; + z->c ^= z->b; + z->b ^= z->c; } #define SWAP_BC \ -"void swap_bc (uint64_t *z, const uint64_t *x) \n"\ +"void swap_bc \n"\ +"(uint64_t *z, const uint64_t *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"{ \n"\ +" z[1] ^= z[2]; \n"\ +" z[2] ^= z[1]; \n"\ +" z[1] ^= z[2]; \n"\ +"}" + +void hash_edge +(uint64_t *z, const edge_type *x, const uint64_t *seed) +{ + (*z) = ((*seed) * x->a) & 0xFFFFFFFFFFFFFFF; + (*z) ^= ((*seed) * x->b) & 0xFFFFFFFFFFFFFFF; +} +#define HASH_EDGE \ +"void hash_edge \n"\ +"(uint64_t *z, const uint64_t *x, const uint64_t *seed) \n"\ "{ \n"\ -" z[0] = x[0]; \n"\ -" z[3] = x[3]; \n"\ -" z[1] ^= x[2]; \n"\ -" z[2] ^= x[1]; \n"\ -" z[1] ^= x[2]; \n"\ +" (*z) = ((*seed) * x[0]) & 0xFFFFFFFFFFFFFFF; \n"\ +" (*z) ^= ((*seed) * x[1]) & 0xFFFFFFFFFFFFFFF; \n"\ "}" int LAGraph_SwapEdges ( @@ -188,13 +209,10 @@ int LAGraph_SwapEdges GrB_Matrix E = NULL, E_t = NULL; GrB_Vector E_vec = NULL; - // e entries. E_split[0] has those which are planning to swap. - GrB_Matrix E_split[2] = {NULL, NULL}; - // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. - GrB_Vector M = NULL; + GrB_Vector M = NULL, M_thin = NULL; // n = |V| e = |E| GrB_Index n = 0, e = 0; @@ -237,7 +255,7 @@ int LAGraph_SwapEdges // swaps x 2 matrix which holds the hashes of each planned edge. - GrB_Matrix new_hashed_edges = NULL; + GrB_Vector new_hashed_edges = NULL; // GrB_Matrix p_buckets = NULL; @@ -254,13 +272,16 @@ int LAGraph_SwapEdges GrB_UnaryOp first_bit = NULL; - // a <---> b - GrB_UnaryOp swap_verts = NULL; - // b1 <---> a2 - GrB_UnaryOp swap_pair = NULL; + // b1 <---> a2 or b1 <---> b2 + GrB_IndexUnaryOp swap_pair = NULL; + + GrB_IndexUnaryOp swap_verts = NULL; + + // z = h_y(x) GrB_BinaryOp hash_seed = NULL; + GrB_BinaryOp hash_seed_e = NULL; // [^],[h_y(x)] GrB_Semiring bxor_hash = NULL; @@ -272,7 +293,7 @@ int LAGraph_SwapEdges // Toople types GrB_Type lg_edge = NULL, lg_swap = NULL; - int8_t *dup_swaps = NULL; + int16_t *dup_swaps = NULL; GrB_Vector dup_swaps_v = NULL; GrB_Vector not_pointers = NULL; uint64_t *not_ptrs = NULL; @@ -323,7 +344,6 @@ int LAGraph_SwapEdges &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; GRB_TRY (GxB_Type_new( &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; - GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; @@ -348,17 +368,21 @@ int LAGraph_SwapEdges &hash_seed, (GxB_binary_function) (&hash_node), GrB_UINT64, GrB_UINT64, GrB_UINT64, "hash_node", HASH_ONE )) ; + GRB_TRY(GxB_BinaryOp_new( + &hash_seed_e, (GxB_binary_function) (&hash_edge), + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + )) ; GRB_TRY(GxB_BinaryOp_new( &duplicate, (GxB_binary_function) (&log_duplicate), GrB_UINT64, GrB_UINT64, GrB_UINT64, "log_duplicate", LOG_DUPLICATE )) ; - GRB_TRY (GxB_UnaryOp_new ( - &swap_verts, (GxB_unary_function) (&swap_ab), - lg_edge, lg_edge, "swap_ab", SWAP_AB + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_verts, (GxB_index_unary_function) (&swap_ab), + lg_edge, lg_edge, GrB_BOOL, "swap_ab", SWAP_AB )) ; - GRB_TRY (GxB_UnaryOp_new ( - &swap_pair, (GxB_unary_function) (&swap_bc), - lg_swap, lg_swap, "swap_bc", SWAP_BC + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_pair, (GxB_index_unary_function) (&swap_bc), + lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC )) ; // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be @@ -394,6 +418,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; GRB_TRY(GrB_Vector_dup(¬_pointers, hramp_v)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + not_pointers, NULL, NULL, GrB_TIMES_UINT64, not_pointers, 2UL, NULL)) ; GrB_Index ramp_size; GRB_TRY (GxB_Vector_unpack_Full ( ramp_v, (void **)&ramp, &ramp_size, &iso, NULL)) ; @@ -442,7 +468,10 @@ int LAGraph_SwapEdges //TODO: Change seed LG_TRY( LAGraph_Random_Seed(random_v, 1548945616ul, msg)); - + GRB_TRY (GxB_Matrix_unpack_FullR( + E, (void **) &indices, &ind_size, &iso, NULL)); + GRB_TRY (GxB_Vector_pack_Full( + E_vec, (void **) &indices, ind_size, iso, NULL)); printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { @@ -451,90 +480,62 @@ int LAGraph_SwapEdges // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; - // GRB_TRY (GrB_Matrix_new (&p_buckets, GrB_UINT8, e, 2)) ; - GRB_TRY (GxB_Vector_sort ( NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - // GrB_Index *rand_arr, rand_size; - // GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( - // r_60, NULL, NULL, GrB_BAND_UINT64, (uint64_t) 0xFFFFFFFFFFFFFFF, random_v, NULL - // )) ; - // GRB_TRY (GxB_Vector_unpack_Full( - // r_60, (void **)&rand_arr, &rand_size, &iso, NULL - // )) ; - // Hash (rand_arr) - // Matrix_Build (rand_arr, ramp, ramp, ) - - - - GRB_TRY(GrB_Vector_apply( - swapVals, NULL, NULL, first_bit, random_v, NULL - )) ; - - GrB_Index perm_size, arr_size, junk_size; GRB_TRY (GxB_Vector_unpack_Full( r_permute, (void **)&edge_perm, &perm_size, &iso, NULL )) ; LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - GRB_TRY (GxB_Matrix_unpack_FullR( - E, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Vector_pack_Full( - E_vec, (void **) &indices, ind_size, iso, NULL)); + + // GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( + // E_vec, NULL, NULL, swap_verts, E_vec, false, NULL + // )) ; GRB_TRY (GrB_Vector_extract( E_vec, NULL, NULL, E_vec, edge_perm, e, NULL )) ; - GRB_TRY(GrB_Vector_apply(E_vec, swapVals, NULL, swap_verts, E_vec, NULL)) ; + GRB_TRY (GrB_Vector_dup(&M_thin, E_vec)); + GRB_TRY (GrB_Vector_resize(M_thin, swaps_per_loop * 2)); + GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; + GrB_Index dup_arr_size = 0; + GRB_TRY (GxB_Vector_unpack_Bitmap( + M_thin, (int8_t **) &dup_swaps, (void **) &indices, &dup_arr_size, + &ind_size, &iso, &junk_size, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full( + M, (void **) &indices, ind_size, iso, NULL + )) ; + GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( + M, NULL, NULL, swap_pair, M, false, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full( - E_vec, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Matrix_pack_FullR( - E, (void **) &indices, ind_size, iso, NULL)); - - GrB_Index E_bounds[3] = {swaps_per_loop * 2, e - swaps_per_loop * 2, 2}; - GRB_TRY (GrB_Matrix_new(E_split, GrB_UINT64, E_bounds[0], 2)); - GRB_TRY (GrB_Matrix_new(E_split + 1, GrB_UINT64, E_bounds[1], 2)); - - GRB_TRY (GxB_Matrix_split( - E_split, 2, 1, E_bounds, E_bounds + 2, E, NULL)); - - GRB_TRY (GxB_Matrix_reshape( - E_split[0], false, swaps_per_loop, 4, NULL)) ; + M, (void **) &indices, &ind_size, &iso, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full( + M_thin, (void **) &indices, ind_size, iso, NULL + )) ; // Hash Edges ---------------------------------------------------------- - GRB_TRY (GrB_Matrix_new( - &new_hashed_edges, GrB_UINT64, swaps_per_loop, 2)) ; + GRB_TRY (GrB_Vector_new( + &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&big_dense, GrB_UINT64, swaps_per_loop)) ; //This Scalar is used in the hash funtion and should be something near // 2^60 and odd. - GRB_TRY (GrB_Matrix_assign_UINT64( - hash_s, hash_s, NULL, 0xFB21C651E98DF25ULL, - GrB_ALL, 0, GrB_ALL, 0, GrB_DESC_S - )) ; - GRB_TRY (GrB_Vector_assign_UINT64( - dense_hash, NULL, NULL, 0xFB21C651E98DF25ULL, GrB_ALL, 0, NULL + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, + 0xFB21C651E98DF25ULL, NULL )) ; - GRB_TRY (GrB_Vector_assign_UINT64( - big_dense, NULL, NULL, (uint64_t) 0, GrB_ALL, 0, NULL + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + hashed_edges, NULL, NULL, hash_seed_e, E_vec, + 0xFB21C651E98DF25ULL, NULL )) ; - GRB_TRY(GrB_mxm( - new_hashed_edges, NULL, NULL, bxor_hash, - E_split[0], hash_s, NULL - )) ; - GRB_TRY(GrB_mxv( - hashed_edges, NULL, NULL, bxor_hash, - E, dense_hash, NULL - )); - - GrB_Index dup_arr_size; // I will unpack and then reconstruct with hash as index. - GRB_TRY(GxB_Matrix_unpack_BitmapR( - new_hashed_edges, &dup_swaps, (void **) &hash_vals_new, - &dup_arr_size, &junk_size, &iso, &junk_size, NULL + GRB_TRY(GxB_Vector_unpack_Full( + new_hashed_edges, (void **) &hash_vals_new, + &junk_size, &iso, NULL )) ; GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL @@ -566,7 +567,7 @@ int LAGraph_SwapEdges n_keep = 0; for(int64_t i = 0; i < swaps_per_loop; ++i) { - n_keep += dup_swaps[i]; + n_keep += dup_swaps[i] & 1; } GRB_TRY(GxB_Vector_pack_Full( not_pointers, (void **) ¬_ptrs, arr_size, iso, NULL @@ -577,36 +578,28 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GrB_Vector_clear(exists)) ; GRB_TRY (GrB_Vector_clear(new_edges_h)) ; + GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop*2)) // Swap Good Edges ----------------------------------------------------- - GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; - GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_BOOL, swaps_per_loop)) ; - // GxB_Matrix_fprint(E_split[0], "E", GxB_SHORT, stdout); - GRB_TRY (GxB_Matrix_unpack_FullR( - E_split[0], (void **) &indices, &ind_size, &iso, NULL + GRB_TRY (GxB_Vector_pack_Full( + dup_swaps_v, (void **)&dup_swaps, dup_arr_size, iso, NULL )) ; - GRB_TRY (GxB_Vector_pack_Bitmap( - M, &dup_swaps, (void **) &indices, swaps_per_loop , ind_size, iso, n_keep, NULL + GxB_fprint(dup_swaps_v, GxB_SUMMARY, stdout); + GxB_fprint(M_thin, GxB_SUMMARY, stdout); + + GRB_TRY(GxB_Vector_subassign( + E_vec, dup_swaps_v, NULL, M_thin, ramp, swaps_per_loop * 2, NULL )) ; + // GRB_TRY (GxB_Vector_unpack_Full( + // E_vec, (void **) &indices, &ind_size, &iso, NULL)); + // GRB_TRY (GxB_Matrix_pack_FullR( + // E, (void **) &indices, ind_size, iso, NULL)); + // GxB_fprint(E, GxB_COMPLETE, stdout); + // GRB_TRY (GxB_Matrix_unpack_FullR( + // E, (void **) &indices, &ind_size, &iso, NULL)); // GRB_TRY (GxB_Vector_pack_Full( - // M, (void **) &indices, ind_size, iso, NULL - // )) ; - // GRB_TRY (GxB_Vector_pack_Full( - // dup_swaps_v, (void **) &dup_swaps, swaps_per_loop, false, NULL - // )) ; - GRB_TRY (GrB_Vector_apply(M, NULL, NULL, swap_pair, M, NULL)) ; - // GxB_Vector_fprint(M, "M", GxB_SHORT, stdout); + // E_vec, (void **) &indices, ind_size, iso, NULL)); - GRB_TRY (GxB_Vector_unpack_Bitmap( - M, &dup_swaps, (void **) &indices, &swaps_per_loop , &ind_size, &iso, &n_keep, NULL - )) ; - GRB_TRY (GxB_Matrix_pack_FullR( - E_split[0], (void **) &indices, ind_size, iso, NULL - )) ; - // GxB_Matrix_fprint(E_split[0], "E", GxB_SHORT, stdout); - GRB_TRY (GxB_Matrix_reshape( - E_split[0], false, swaps_per_loop * 2, 2, NULL)); - GRB_TRY(GxB_Matrix_concat(E, E_split, 2, 1, NULL)); FREE_LOOP ; // Free Matricies that have to be rebuilt // Adjust number of swaps to do next. @@ -619,6 +612,10 @@ int LAGraph_SwapEdges LG_TRY (LAGraph_Random_Next(random_v, msg)) ; printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); } + GRB_TRY (GxB_Vector_unpack_Full( + E_vec, (void **) &indices, &ind_size, &iso, NULL)); + GRB_TRY (GxB_Matrix_pack_FullR( + E, (void **) &indices, ind_size, iso, NULL)); // Build Output Matrix GRB_TRY (GxB_Matrix_unpack_FullC( E, (void **)&indices, &ind_size, &iso, NULL)) ; From d4fb00d70d605a43baf69e68f0c88a83d6b0caeb Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 3 Dec 2024 17:18:01 -0600 Subject: [PATCH 042/115] Cleaning up prints and testing permutes --- experimental/algorithm/LAGraph_SwapEdges.c | 85 +++++++++++----------- 1 file changed, 41 insertions(+), 44 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 8b0a223595..b1df903453 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -34,11 +34,9 @@ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ - GrB_free(&dense_hash); \ GrB_free (&swap_p) ; \ GrB_free (&first_bit) ; \ GrB_free (&bxor_first) ; \ - GrB_free(&hash_s); \ GrB_free (&hash_seed) ; \ GrB_free (&r_60) ; \ GrB_free(&exists); \ @@ -164,17 +162,26 @@ void swap_ab void swap_bc (swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) { - z->b ^= z->c; - z->c ^= z->b; - z->b ^= z->c; + if(I & 1) + { + z->b ^= z->c; + z->c ^= z->b; + z->b ^= z->c; + } + else + { + z->b ^= z->d; + z->d ^= z->b; + z->b ^= z->d; + } } #define SWAP_BC \ "void swap_bc \n"\ "(uint64_t *z, const uint64_t *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ -" z[1] ^= z[2]; \n"\ -" z[2] ^= z[1]; \n"\ -" z[1] ^= z[2]; \n"\ +" z[1] ^= z[2 | (I & 1)]; \n"\ +" z[2 | (I & 1)] ^= z[1]; \n"\ +" z[1] ^= z[2 | (I & 1)]; \n"\ "}" void hash_edge @@ -306,15 +313,9 @@ int LAGraph_SwapEdges uint64_t *val_of_P = NULL; - // 4 x 2 Matrix Hashes cols 0,2 and 1,3 - GrB_Matrix hash_s = NULL; - // 2 x 2 Used to shuffle edges [[0 1],[1 0]] GrB_Matrix y = NULL; - // 2 x 1 with hash seed as value. - GrB_Vector dense_hash = NULL; - GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; GrB_Index ind_size = 0; @@ -401,12 +402,12 @@ int LAGraph_SwapEdges GRB_TRY ( GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) ) ; - GRB_TRY (GxB_Matrix_pack_FullR ( - E_t, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL + GRB_TRY (GxB_Matrix_pack_FullC ( + E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL )) ; - GRB_TRY (GrB_transpose(E, NULL, NULL, E_t, NULL)); - GrB_free(&E_t); + GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; + int shift_e = __builtin_clzl(e); // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; @@ -426,6 +427,12 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_unpack_Full ( hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; + // Remake Ramp + GRB_TRY (GrB_Vector_resize(ramp_v, e)) + GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, + GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + // Init Constants ---------------------------------------------------------- GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; @@ -434,14 +441,10 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - GRB_TRY (GrB_Vector_new (&dense_hash, GrB_UINT64, 2)) ; GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; - GRB_TRY (GrB_Matrix_new (&hash_s, GrB_UINT64, 4, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; - GRB_TRY (GrB_Vector_assign_UINT8 ( - dense_hash, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_assign_UINT8 ( y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_Matrix_select_UINT64(y, NULL, NULL, GrB_OFFDIAG, y, 0, NULL)) ; @@ -452,9 +455,6 @@ int LAGraph_SwapEdges GrB_Index hcols[] = {0, 0, 1, 1}; GrB_Index srows[] = {0, 1, 2, 3}; GrB_Index scols[] = {0, 2, 1, 3}; - GRB_TRY(GxB_Matrix_build_Scalar( - hash_s, scols, hcols, one64, 4 - )) ; GRB_TRY(GxB_Matrix_build_Scalar( swap_p, srows, scols, one64, 4 )) ; @@ -462,6 +462,7 @@ int LAGraph_SwapEdges // Make Random ------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; + // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; @@ -475,6 +476,7 @@ int LAGraph_SwapEdges printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { + GrB_Index perm_size, arr_size, junk_size; // Coming into the loop: // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly two distinct values. @@ -484,16 +486,22 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_sort ( NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL )) ; - GrB_Index perm_size, arr_size, junk_size; + // GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + // r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL + // )) ; + // GxB_fprint(r_60, GxB_SHORT, stdout); + // GxB_fprint(r_permute, GxB_SHORT, stdout); + // GxB_Vector_fprint(r_60, "r_60", GxB_SHORT, stdout); GRB_TRY (GxB_Vector_unpack_Full( - r_permute, (void **)&edge_perm, &perm_size, &iso, NULL + r_permute, (void **) &edge_perm, &perm_size, &iso, NULL )) ; + // GRB_TRY (GrB_set(r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)); + // GRB_TRY (GrB_Vector_assign( + // r_permute, NULL, NULL, ramp_v, edge_perm, e, NULL + // )); + // printf("HELLO"); + // GxB_fprint(r_permute, GxB_SHORT, stdout); LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); - - - // GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( - // E_vec, NULL, NULL, swap_verts, E_vec, false, NULL - // )) ; GRB_TRY (GrB_Vector_extract( E_vec, NULL, NULL, E_vec, edge_perm, e, NULL )) ; @@ -522,7 +530,7 @@ int LAGraph_SwapEdges &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - //This Scalar is used in the hash funtion and should be something near + //This Scalar is used in the hash function and should be something near // 2^60 and odd. GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, @@ -584,21 +592,10 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_pack_Full( dup_swaps_v, (void **)&dup_swaps, dup_arr_size, iso, NULL )) ; - GxB_fprint(dup_swaps_v, GxB_SUMMARY, stdout); - GxB_fprint(M_thin, GxB_SUMMARY, stdout); GRB_TRY(GxB_Vector_subassign( E_vec, dup_swaps_v, NULL, M_thin, ramp, swaps_per_loop * 2, NULL )) ; - // GRB_TRY (GxB_Vector_unpack_Full( - // E_vec, (void **) &indices, &ind_size, &iso, NULL)); - // GRB_TRY (GxB_Matrix_pack_FullR( - // E, (void **) &indices, ind_size, iso, NULL)); - // GxB_fprint(E, GxB_COMPLETE, stdout); - // GRB_TRY (GxB_Matrix_unpack_FullR( - // E, (void **) &indices, &ind_size, &iso, NULL)); - // GRB_TRY (GxB_Vector_pack_Full( - // E_vec, (void **) &indices, ind_size, iso, NULL)); FREE_LOOP ; // Free Matricies that have to be rebuilt From 09cbbaa5591a2ce4b8eb5643006937fcbebacddb Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 3 Dec 2024 21:25:30 -0600 Subject: [PATCH 043/115] Changed method for perm --- experimental/algorithm/LAGraph_SwapEdges.c | 59 ++++++++++++++-------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index b1df903453..3490fcfd60 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -216,6 +216,8 @@ int LAGraph_SwapEdges GrB_Matrix E = NULL, E_t = NULL; GrB_Vector E_vec = NULL; + GrB_Matrix P = NULL; + // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. @@ -427,12 +429,6 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_unpack_Full ( hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; - // Remake Ramp - GRB_TRY (GrB_Vector_resize(ramp_v, e)) - GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, - GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - // Init Constants ---------------------------------------------------------- GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; @@ -443,6 +439,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; + GRB_TRY (GrB_Matrix_new(&P, GrB_UINT64, e, 1ull << (64-shift_e))) ; GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; GRB_TRY (GrB_Matrix_assign_UINT8 ( @@ -462,8 +459,8 @@ int LAGraph_SwapEdges // Make Random ------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; - // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; - GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; + // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; //TODO: Change seed @@ -483,30 +480,48 @@ int LAGraph_SwapEdges // random_v has a radom dense vector. GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; - GRB_TRY (GxB_Vector_sort ( - NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL - )) ; - // GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - // r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL + // GRB_TRY (GxB_Vector_sort ( + // NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL // )) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL + )) ; + GRB_TRY (GxB_Vector_unpack_Full( + r_60, (void **) &edge_perm, &perm_size, &iso, NULL + )) ; + GRB_TRY (GxB_Matrix_pack_CSR( + P, &ramp, &edge_perm, (void**) &val_of_P, ramp_size, + perm_size, sizeof(GrB_Index), true, false, NULL + )); + GRB_TRY (GrB_vxm( + r_permute, NULL, NULL, GxB_ANY_SECONDI_INT64, random_v, P, NULL + )); + GRB_TRY (GxB_Matrix_unpack_CSR( + P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, + &perm_size, &junk_size, &iso, NULL, NULL + )); + LAGraph_Free((void **) &edge_perm, msg); + + GrB_Index edges_permed = 0; + GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)); + LAGraph_Malloc((void **) &edge_perm, edges_permed, 8,msg); + GRB_TRY (GrB_Vector_extractTuples_UINT64( + NULL, edge_perm, &edges_permed, r_permute + )) ; + swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, edges_permed / 2) ; // GxB_fprint(r_60, GxB_SHORT, stdout); // GxB_fprint(r_permute, GxB_SHORT, stdout); // GxB_Vector_fprint(r_60, "r_60", GxB_SHORT, stdout); - GRB_TRY (GxB_Vector_unpack_Full( - r_permute, (void **) &edge_perm, &perm_size, &iso, NULL - )) ; // GRB_TRY (GrB_set(r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)); // GRB_TRY (GrB_Vector_assign( // r_permute, NULL, NULL, ramp_v, edge_perm, e, NULL // )); - // printf("HELLO"); + // GxB_fprint(r_permute, GxB_SHORT, stdout); - LG_ASSERT(!iso, GrB_NOT_IMPLEMENTED); + GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)); GRB_TRY (GrB_Vector_extract( - E_vec, NULL, NULL, E_vec, edge_perm, e, NULL + M_thin, NULL, NULL, E_vec, edge_perm, swaps_per_loop * 2, NULL )) ; - GRB_TRY (GrB_Vector_dup(&M_thin, E_vec)); - GRB_TRY (GrB_Vector_resize(M_thin, swaps_per_loop * 2)); GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; GrB_Index dup_arr_size = 0; GRB_TRY (GxB_Vector_unpack_Bitmap( @@ -594,7 +609,7 @@ int LAGraph_SwapEdges )) ; GRB_TRY(GxB_Vector_subassign( - E_vec, dup_swaps_v, NULL, M_thin, ramp, swaps_per_loop * 2, NULL + E_vec, dup_swaps_v, NULL, M_thin, edge_perm, swaps_per_loop * 2, NULL )) ; FREE_LOOP ; // Free Matricies that have to be rebuilt From bafe70e195aa9fec739305fbe22c5317e6f6c210 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 7 Dec 2024 13:15:19 -0600 Subject: [PATCH 044/115] Hash set testing --- experimental/benchmark/speed_hash_demo.c | 143 +++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 experimental/benchmark/speed_hash_demo.c diff --git a/experimental/benchmark/speed_hash_demo.c b/experimental/benchmark/speed_hash_demo.c new file mode 100644 index 0000000000..91d55e0742 --- /dev/null +++ b/experimental/benchmark/speed_hash_demo.c @@ -0,0 +1,143 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/benchmark/speed_hash_demo.c: a simple demo +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A Davis, Texas A&M University + +//------------------------------------------------------------------------------ + + +#include "../../src/benchmark/LAGraph_demo.h" +#include "LAGraphX.h" +#include "LG_internal.h" + +// LG_FREE_ALL is required by LG_TRY +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + GrB_free (&rand_v) ; \ + GrB_free (&sort_r) ; \ + GrB_free (&set_v) ; \ +} + +int main (int argc, char **argv) +{ + + //-------------------------------------------------------------------------- + // startup LAGraph and GraphBLAS + //-------------------------------------------------------------------------- + + char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph + // start GraphBLAS and LAGraph + bool burble = true ; // set true for diagnostic outputs + demo_init (burble) ; + + GrB_Vector rand_v = NULL, sort_r = NULL, set_v = NULL; + GrB_Index *rand_a = NULL, *set_a = NULL; + GrB_Index r_size = 0; + bool iso = false; + LG_TRY (LAGraph_Random_Init (msg)) ; + //-------------------------------------------------------------------------- + // read in the graph: this method is defined in LAGraph_demo.h + //-------------------------------------------------------------------------- + + // readproblem can read in a file in Matrix Market format, or in a binary + // format created by binwrite (see LAGraph_demo.h, or the main program, + // mtx2bin_demo). + + double t = LAGraph_WallClockTime ( ) ; + GrB_Index size = (argc > 1) ? atoll(argv [1]) : 1000 ; + int shift_e = __builtin_clzl(size); + GrB_Index size_p2 = (1ull << (64-shift_e)); + GrB_Index bit_mask = size_p2 - 1; + GRB_TRY (GrB_Vector_new(&rand_v, GrB_UINT64, size)) ; + GRB_TRY (GrB_Vector_new(&sort_r, GrB_UINT64, size)) ; + GRB_TRY (GrB_Vector_new(&set_v, GrB_BOOL, size_p2)) ; + + + GRB_TRY (GrB_Vector_assign_UINT64( + rand_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_Random_Seed(rand_v, 1548945616ul, msg)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( + rand_v, NULL, NULL, GrB_BAND_UINT64, bit_mask, rand_v, NULL)) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to read the graph: %g sec\n", t) ; + + printf ("\n==========================The input graph matrix G:\n") ; + // LG_TRY (LAGraph_Vector_Print (rand_v, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // try the LAGraph_HelloWorld "algorithm" + //-------------------------------------------------------------------------- + + t = LAGraph_WallClockTime ( ) ; + GRB_TRY (GxB_Vector_sort (sort_r, NULL, GrB_LT_UINT64, rand_v, NULL)) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for GrB_Sort: %g sec\n", t) ; + t = LAGraph_WallClockTime ( ) ; + GRB_TRY (GxB_Vector_unpack_Full ( + rand_v, (void **)&rand_a, &r_size, &iso, NULL + )) ; + LAGraph_Calloc((void **)&set_a, size_p2, sizeof(bool), msg); + + // #pragma omp parallel for schedule(static) num_threads(omp_get_max_threads()) + for(int64_t i = 0; i < size; ++i) + { + set_a[rand_a[i]] = (bool) 1; + } + + // #pragma omp parallel num_threads(omp_get_max_threads()) + // { + // int64_t bounds[2] = {omp_get_thread_num() * size_p2 / omp_get_max_threads(), size_p2 / omp_get_max_threads()}; + // bounds[1] += bounds[0]; + // if(omp_get_thread_num() - 1 == omp_get_max_threads()) + // bounds[1] = size_p2; + + // #pragma omp for + // for(int64_t i = 0; i < size; ++i) + // { + // int64_t rx = rand_a[i]; + // if (bounds[0] <= rx && rx < bounds[1]) + // set_a[rx] = (bool) 1; + // } + // } + + GRB_TRY (GxB_Vector_pack_Full ( + rand_v, (void **)&rand_a, r_size, iso, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full ( + set_v, (void **)&set_a, 1ull << (64-shift_e), false, NULL + )) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for Single Thread Unpack: %g sec\n", t) ; + + //-------------------------------------------------------------------------- + // check the results (make sure Y is a copy of G->A) + //-------------------------------------------------------------------------- + + printf("RESULTS UNTESTED\n"); + + //-------------------------------------------------------------------------- + // print the results (Y is just a copy of G->A) + //-------------------------------------------------------------------------- + + printf ("\n===============================The result set vector:\n") ; + GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; + //-------------------------------------------------------------------------- + // free everyting and finish + //-------------------------------------------------------------------------- + + LG_FREE_ALL ; + LG_TRY (LAGraph_Finalize (msg)) ; + LG_TRY (LAGraph_Random_Finalize (msg)) ; + return (GrB_SUCCESS) ; +} From d564cc3260bcc972628284e4a6cabd0a1db7bf76 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 7 Dec 2024 16:25:34 -0600 Subject: [PATCH 045/115] modifying hash set functions --- experimental/algorithm/LAGraph_SwapEdges.c | 27 +++++++++- experimental/benchmark/speed_hash_demo.c | 62 +++++++++++++--------- 2 files changed, 62 insertions(+), 27 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 3490fcfd60..b10113e53e 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -41,6 +41,7 @@ GrB_free (&r_60) ; \ GrB_free(&exists); \ GrB_free (&bxor_hash) ; \ + GrB_free (&selected) ; \ GrB_free (&E_vec) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ @@ -310,6 +311,9 @@ int LAGraph_SwapEdges GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; + GrB_Matrix selected_m = NULL; + GrB_Vector selected = NULL; + // Constants --------------------------------------------------------------- @@ -441,6 +445,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; GRB_TRY (GrB_Matrix_new(&P, GrB_UINT64, e, 1ull << (64-shift_e))) ; GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; + GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, 1ull << (64-shift_e))); + GRB_TRY (GrB_Matrix_assign_UINT8 ( y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; @@ -522,6 +528,25 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_extract( M_thin, NULL, NULL, E_vec, edge_perm, swaps_per_loop * 2, NULL )) ; + // GRB_TRY (GrB_Vector_assign_BOOL( + // selected, NULL, NULL, true, GrB_ALL, swaps_per_loop * 2, NULL + // )); + // GRB_TRY (GrB_Vector_assign_BOOL( + // selected, NULL, GxB_LAND_BOOL, false, edge_perm, swaps_per_loop * 2, NULL + // )); + // GxB_fprint(selected, GxB_SHORT, stdout); + // GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, swaps_per_loop * 2, e)); + // GRB_TRY (GxB_Matrix_pack_CSR( + // selected_m, &ramp, &edge_perm, (void**) &val_of_P, + // swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL + // )); + // GRB_TRY (GrB_Matrix_reduce_Monoid( + // selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, GrB_DESC_T0 + // )); + // GRB_TRY (GxB_Matrix_unpack_CSR( + // P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, + // &perm_size, &junk_size, &iso, NULL, NULL + // )); GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; GrB_Index dup_arr_size = 0; GRB_TRY (GxB_Vector_unpack_Bitmap( @@ -575,6 +600,7 @@ int LAGraph_SwapEdges GRB_TRY(GxB_Vector_build_Scalar( exists, hash_vals, one64, e )) ; + GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ull, (GrB_Index)0)) ; // THIS HAS SIDE EFFECTS - it writes bad edges to dup_swaps array @@ -607,7 +633,6 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_pack_Full( dup_swaps_v, (void **)&dup_swaps, dup_arr_size, iso, NULL )) ; - GRB_TRY(GxB_Vector_subassign( E_vec, dup_swaps_v, NULL, M_thin, edge_perm, swaps_per_loop * 2, NULL )) ; diff --git a/experimental/benchmark/speed_hash_demo.c b/experimental/benchmark/speed_hash_demo.c index 91d55e0742..7151885a63 100644 --- a/experimental/benchmark/speed_hash_demo.c +++ b/experimental/benchmark/speed_hash_demo.c @@ -27,6 +27,7 @@ GrB_free (&rand_v) ; \ GrB_free (&sort_r) ; \ GrB_free (&set_v) ; \ + GrB_free (&assign_s) ; \ } int main (int argc, char **argv) @@ -41,8 +42,9 @@ int main (int argc, char **argv) bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; - GrB_Vector rand_v = NULL, sort_r = NULL, set_v = NULL; - GrB_Index *rand_a = NULL, *set_a = NULL; + GrB_Vector rand_v = NULL, sort_r = NULL, set_v = NULL, assign_s = NULL; + GrB_Index *rand_a = NULL; + bool *set_a = NULL; GrB_Index r_size = 0; bool iso = false; LG_TRY (LAGraph_Random_Init (msg)) ; @@ -62,10 +64,14 @@ int main (int argc, char **argv) GRB_TRY (GrB_Vector_new(&rand_v, GrB_UINT64, size)) ; GRB_TRY (GrB_Vector_new(&sort_r, GrB_UINT64, size)) ; GRB_TRY (GrB_Vector_new(&set_v, GrB_BOOL, size_p2)) ; + GRB_TRY (GrB_Vector_new(&assign_s, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Vector_assign_UINT64( rand_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; + // GRB_TRY (GrB_Vector_assign_BOOL( + // assign_s, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY(GrB_set (assign_s, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) LG_TRY (LAGraph_Random_Seed(rand_v, 1548945616ul, msg)) ; GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( rand_v, NULL, NULL, GrB_BAND_UINT64, bit_mask, rand_v, NULL)) ; @@ -89,49 +95,53 @@ int main (int argc, char **argv) )) ; LAGraph_Calloc((void **)&set_a, size_p2, sizeof(bool), msg); - // #pragma omp parallel for schedule(static) num_threads(omp_get_max_threads()) + int nthreads, nthreads_outer, nthreads_inner ; + LG_TRY (LAGraph_GetNumThreads (&nthreads_outer, &nthreads_inner, msg)) ; + nthreads = nthreads_outer * nthreads_inner ; + printf("%d", nthreads); + // #pragma omp parallel for num_threads(nthreads) schedule(static) for(int64_t i = 0; i < size; ++i) { set_a[rand_a[i]] = (bool) 1; } + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for Single Thread Unpack: %g sec\n", t) ; - // #pragma omp parallel num_threads(omp_get_max_threads()) - // { - // int64_t bounds[2] = {omp_get_thread_num() * size_p2 / omp_get_max_threads(), size_p2 / omp_get_max_threads()}; - // bounds[1] += bounds[0]; - // if(omp_get_thread_num() - 1 == omp_get_max_threads()) - // bounds[1] = size_p2; - - // #pragma omp for - // for(int64_t i = 0; i < size; ++i) - // { - // int64_t rx = rand_a[i]; - // if (bounds[0] <= rx && rx < bounds[1]) - // set_a[rx] = (bool) 1; - // } - // } - - GRB_TRY (GxB_Vector_pack_Full ( - rand_v, (void **)&rand_a, r_size, iso, NULL - )) ; GRB_TRY (GxB_Vector_pack_Full ( set_v, (void **)&set_a, 1ull << (64-shift_e), false, NULL )) ; + + + + + t = LAGraph_WallClockTime ( ) ; + GRB_TRY (GrB_Vector_assign_BOOL( + assign_s, NULL, NULL, 1, rand_a, size, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for Single Thread Unpack: %g sec\n", t) ; + printf ("Time for Assign: %g sec\n", t) ; + GRB_TRY (GxB_Vector_pack_Full ( + rand_v, (void **)&rand_a, r_size, iso, NULL + )) ; //-------------------------------------------------------------------------- // check the results (make sure Y is a copy of G->A) //-------------------------------------------------------------------------- - - printf("RESULTS UNTESTED\n"); + bool isEq = 0; + GRB_TRY (GrB_Vector_assign_BOOL( + assign_s, assign_s, NULL, 0, GrB_ALL, 0, GrB_DESC_SC)) ; + LG_TRY (LAGraph_Vector_IsEqual(&isEq, assign_s, set_v, msg)); + if(isEq) + printf("TEST PASSED\n"); + else + printf("TEST FAILED\n"); //-------------------------------------------------------------------------- // print the results (Y is just a copy of G->A) //-------------------------------------------------------------------------- printf ("\n===============================The result set vector:\n") ; - GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; + // GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; + // GRB_TRY (GxB_fprint(assign_s, GxB_SHORT, stdout)) ; //-------------------------------------------------------------------------- // free everyting and finish //-------------------------------------------------------------------------- From e5a8108b424a5c9486586dc771941c5f18c4cfa4 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 7 Dec 2024 17:11:22 -0600 Subject: [PATCH 046/115] Added CSC magic to testing --- experimental/benchmark/speed_hash_demo.c | 41 +++++++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/experimental/benchmark/speed_hash_demo.c b/experimental/benchmark/speed_hash_demo.c index 7151885a63..c8bba1f935 100644 --- a/experimental/benchmark/speed_hash_demo.c +++ b/experimental/benchmark/speed_hash_demo.c @@ -41,11 +41,12 @@ int main (int argc, char **argv) // start GraphBLAS and LAGraph bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; - - GrB_Vector rand_v = NULL, sort_r = NULL, set_v = NULL, assign_s = NULL; - GrB_Index *rand_a = NULL; + GrB_Matrix P = NULL; + GrB_Vector rand_v = NULL, sort_r = NULL, set_v = NULL, assign_s = NULL, + ramp_v = NULL; + GrB_Index *rand_a = NULL, *ramp = NULL; bool *set_a = NULL; - GrB_Index r_size = 0; + GrB_Index r_size = 0, ramp_size = 0, junk_size = 0; bool iso = false; LG_TRY (LAGraph_Random_Init (msg)) ; //-------------------------------------------------------------------------- @@ -55,20 +56,32 @@ int main (int argc, char **argv) // readproblem can read in a file in Matrix Market format, or in a binary // format created by binwrite (see LAGraph_demo.h, or the main program, // mtx2bin_demo). - + bool *val_of_P = NULL; double t = LAGraph_WallClockTime ( ) ; GrB_Index size = (argc > 1) ? atoll(argv [1]) : 1000 ; int shift_e = __builtin_clzl(size); GrB_Index size_p2 = (1ull << (64-shift_e)); GrB_Index bit_mask = size_p2 - 1; GRB_TRY (GrB_Vector_new(&rand_v, GrB_UINT64, size)) ; + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, size + 1)) ; GRB_TRY (GrB_Vector_new(&sort_r, GrB_UINT64, size)) ; GRB_TRY (GrB_Vector_new(&set_v, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Vector_new(&assign_s, GrB_BOOL, size_p2)) ; + GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, size_p2, size)) ; + + LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; + val_of_P[0] = 1; GRB_TRY (GrB_Vector_assign_UINT64( rand_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign_UINT64( + ramp_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_apply_IndexOp_INT64( + ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full( + ramp_v, (void **)&ramp, &ramp_size, &iso, NULL + )) ; // GRB_TRY (GrB_Vector_assign_BOOL( // assign_s, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_set (assign_s, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) @@ -119,10 +132,28 @@ int main (int argc, char **argv) assign_s, NULL, NULL, 1, rand_a, size, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for Assign: %g sec\n", t) ; + GRB_TRY (GrB_Vector_clear(assign_s)) ; + t = LAGraph_WallClockTime ( ) ; + GRB_TRY (GxB_Matrix_pack_CSC( + P, &ramp, &rand_a, (void**) &val_of_P, ramp_size, + r_size, sizeof(bool), true, false, NULL + )); + GRB_TRY (GrB_Matrix_reduce_Monoid( + assign_s, NULL, NULL, GxB_ANY_BOOL_MONOID, P, NULL + )); + GRB_TRY (GxB_Matrix_unpack_CSC( + P, &ramp, &rand_a, (void**) &val_of_P, &ramp_size, + &r_size, &junk_size, &iso, NULL, NULL + )); + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for CSR Magic: %g sec\n", t) ; GRB_TRY (GxB_Vector_pack_Full ( rand_v, (void **)&rand_a, r_size, iso, NULL )) ; + GRB_TRY (GxB_Vector_pack_Full ( + ramp_v, (void **)&ramp, ramp_size, iso, NULL + )) ; //-------------------------------------------------------------------------- // check the results (make sure Y is a copy of G->A) //-------------------------------------------------------------------------- From 642340ad917ddf7156894b612bd35ff82023d15a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 8 Dec 2024 15:00:48 -0600 Subject: [PATCH 047/115] Changed subassign to matrix concat --- experimental/algorithm/LAGraph_SwapEdges.c | 96 ++++++++++++++-------- 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index b10113e53e..cbfe008464 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -19,9 +19,13 @@ { \ GrB_free (&M) ; \ GrB_free (&M_thin) ; \ + GrB_free (E_split) ; \ + GrB_free (E_split + 1) ; \ GrB_free(&dup_swaps_v); \ GrB_free(&new_hashed_edges); \ + GrB_free(&selected_m); \ GrB_free(&hashed_edges); \ + LAGraph_Free((void**)&leftover_e, msg) ; \ } #define LG_FREE_WORK \ @@ -180,23 +184,26 @@ void swap_bc "void swap_bc \n"\ "(uint64_t *z, const uint64_t *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ +" if(z[1] == z[2] || z[1] == z[3] || z[0] == z[2] || z[0] == z[3] ) return; \n"\ " z[1] ^= z[2 | (I & 1)]; \n"\ " z[2 | (I & 1)] ^= z[1]; \n"\ " z[1] ^= z[2 | (I & 1)]; \n"\ "}" + +//Simply making a cantor pairing then masking. void hash_edge -(uint64_t *z, const edge_type *x, const uint64_t *seed) +(uint64_t *z, const edge_type *x, const uint64_t *mask) { - (*z) = ((*seed) * x->a) & 0xFFFFFFFFFFFFFFF; - (*z) ^= ((*seed) * x->b) & 0xFFFFFFFFFFFFFFF; + (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; + (*z) += (x->a < x->b)? x->a: x->b; } #define HASH_EDGE \ -"void hash_edge \n"\ -"(uint64_t *z, const uint64_t *x, const uint64_t *seed) \n"\ -"{ \n"\ -" (*z) = ((*seed) * x[0]) & 0xFFFFFFFFFFFFFFF; \n"\ -" (*z) ^= ((*seed) * x[1]) & 0xFFFFFFFFFFFFFFF; \n"\ +"void hash_edge \n"\ +"(uint64_t *z, const uint64_t *x, const uint64_t *mask) \n"\ +"{ \n"\ +" (*z) = ((x[0] + x[1] + 1) * (x[0] + x[1])) / 2; \n"\ +" (*z) += x[x[0] > x[1]]; \n"\ "}" int LAGraph_SwapEdges ( @@ -216,6 +223,7 @@ int LAGraph_SwapEdges // e x 2 with entries corresponding to verticies of an edge GrB_Matrix E = NULL, E_t = NULL; GrB_Vector E_vec = NULL; + GrB_Vector E_split[2] = {NULL, NULL}; GrB_Matrix P = NULL; @@ -255,7 +263,7 @@ int LAGraph_SwapEdges GrB_Index *half_ramp = NULL ; // Arrays to unpack edge permutation - GrB_Index *edge_perm = NULL ; + GrB_Index *edge_perm = NULL, *leftover_e = NULL; bool iso = false; // Number of values kept in each phase @@ -443,17 +451,17 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; - GRB_TRY (GrB_Matrix_new(&P, GrB_UINT64, e, 1ull << (64-shift_e))) ; + GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, e, 1ull << (64-shift_e))) ; GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; - GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, 1ull << (64-shift_e))); + GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); GRB_TRY (GrB_Matrix_assign_UINT8 ( y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_Matrix_select_UINT64(y, NULL, NULL, GrB_OFFDIAG, y, 0, NULL)) ; - LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(GrB_Index), msg)) ; - val_of_P[0] = 1; + LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; + val_of_P[0] = (bool) 1; GrB_Index hcols[] = {0, 0, 1, 1}; GrB_Index srows[] = {0, 1, 2, 3}; @@ -466,6 +474,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; + GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; @@ -497,7 +506,7 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GxB_Matrix_pack_CSR( P, &ramp, &edge_perm, (void**) &val_of_P, ramp_size, - perm_size, sizeof(GrB_Index), true, false, NULL + perm_size, sizeof(bool), true, false, NULL )); GRB_TRY (GrB_vxm( r_permute, NULL, NULL, GxB_ANY_SECONDI_INT64, random_v, P, NULL @@ -528,6 +537,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_extract( M_thin, NULL, NULL, E_vec, edge_perm, swaps_per_loop * 2, NULL )) ; + // GRB_TRY (GrB_Vector_assign_BOOL( // selected, NULL, NULL, true, GrB_ALL, swaps_per_loop * 2, NULL // )); @@ -535,18 +545,35 @@ int LAGraph_SwapEdges // selected, NULL, GxB_LAND_BOOL, false, edge_perm, swaps_per_loop * 2, NULL // )); // GxB_fprint(selected, GxB_SHORT, stdout); - // GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, swaps_per_loop * 2, e)); - // GRB_TRY (GxB_Matrix_pack_CSR( - // selected_m, &ramp, &edge_perm, (void**) &val_of_P, - // swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL - // )); - // GRB_TRY (GrB_Matrix_reduce_Monoid( - // selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, GrB_DESC_T0 - // )); - // GRB_TRY (GxB_Matrix_unpack_CSR( - // P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, - // &perm_size, &junk_size, &iso, NULL, NULL - // )); + + + // Using a CSC pack/unpack strategy to pick out edges involved in the swap + GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, e, swaps_per_loop * 2)); + GRB_TRY (GxB_Matrix_pack_CSC( + selected_m, &ramp, &edge_perm, (void**) &val_of_P, + swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL + )); + GRB_TRY (GrB_Matrix_reduce_Monoid( + selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, NULL + )); + GRB_TRY (GxB_Matrix_unpack_CSC( + selected_m, &ramp, &edge_perm, (void**) &val_of_P, &junk_size, + &junk_size, &junk_size, &iso, NULL, NULL + )); + GRB_TRY (GrB_Vector_assign_BOOL( + selected, selected, NULL, 1, GrB_ALL, 0, GrB_DESC_RSC + )); + LG_TRY (LAGraph_Malloc( + (void **)&leftover_e, e - swaps_per_loop * 2, sizeof(GrB_Index), msg + )); + GRB_TRY (GrB_Vector_extractTuples_BOOL( + leftover_e, NULL, &edges_permed, selected + )) + GRB_TRY (GrB_Vector_new(&E_split[1], lg_edge, edges_permed)); + GRB_TRY (GrB_Vector_extract( + E_split[1], NULL, NULL, E_vec, leftover_e, edges_permed, NULL)); + GRB_TRY (GrB_Vector_dup(E_split, M_thin)) ; + GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; GrB_Index dup_arr_size = 0; GRB_TRY (GxB_Vector_unpack_Bitmap( @@ -570,16 +597,15 @@ int LAGraph_SwapEdges &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - //This Scalar is used in the hash function and should be something near - // 2^60 and odd. GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, - 0xFB21C651E98DF25ULL, NULL - )) ; + (1ull << (68-shift_e)) - 1, NULL + )) ;//0xFB21C651E98DF25ULL GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hashed_edges, NULL, NULL, hash_seed_e, E_vec, - 0xFB21C651E98DF25ULL, NULL + (1ull << (68-shift_e)) - 1, NULL )) ; + // GxB_Vector_fprint(hashed_edges, "Hashed", GxB_SHORT, stdout); // I will unpack and then reconstruct with hash as index. GRB_TRY(GxB_Vector_unpack_Full( new_hashed_edges, (void **) &hash_vals_new, @@ -633,16 +659,18 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_pack_Full( dup_swaps_v, (void **)&dup_swaps, dup_arr_size, iso, NULL )) ; - GRB_TRY(GxB_Vector_subassign( - E_vec, dup_swaps_v, NULL, M_thin, edge_perm, swaps_per_loop * 2, NULL + GRB_TRY(GrB_Vector_assign( + E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL )) ; + GRB_TRY (GxB_Matrix_concat( + (GrB_Matrix) E_vec, (GrB_Matrix *)E_split, 2, 1, NULL)); FREE_LOOP ; // Free Matricies that have to be rebuilt // Adjust number of swaps to do next. num_attempts += swaps_per_loop; num_swaps += n_keep; - swaps_per_loop = (n_keep * 3) / 2; + swaps_per_loop = n_keep * 2; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; From 4d3fe9499e291511081517d7ed122bf2580d8294 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 17 Dec 2024 17:02:22 -0600 Subject: [PATCH 048/115] Changed method for hashing edges --- experimental/algorithm/LAGraph_SwapEdges.c | 91 +++++++++++++++------- experimental/benchmark/speed_hash_demo.c | 2 +- 2 files changed, 62 insertions(+), 31 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index cbfe008464..47b0ecf550 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -25,13 +25,19 @@ GrB_free(&new_hashed_edges); \ GrB_free(&selected_m); \ GrB_free(&hashed_edges); \ + GrB_free(&swapMask); \ LAGraph_Free((void**)&leftover_e, msg) ; \ + LAGraph_Free((void**)&hash_vals, msg) ; \ + LAGraph_Free((void**)&hash_vals_new, msg) ; \ + LAGraph_Free((void**)&edge_perm, msg) ; \ } #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ GrB_free (&E) ; \ + GrB_free (&P) ; \ + GrB_free (&hash_m) ; \ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ @@ -47,14 +53,17 @@ GrB_free (&bxor_hash) ; \ GrB_free (&selected) ; \ GrB_free (&E_vec) ; \ + GrB_free (&swap_pair) ; \ + GrB_free (&swap_verts) ; \ + GrB_free (&hash_seed_e) ; \ + GrB_free (&duplicate) ; \ + GrB_free (¬_pointers) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ - LAGraph_Free((void**)&edge_perm, msg) ; \ LAGraph_Free((void**) &val_of_P, msg); \ LAGraph_Free((void **) &dup_swaps, NULL);\ - LAGraph_Free((void **) &hash_vals_new, NULL);\ - LAGraph_Free((void **) &hash_vals, NULL); \ + LAGraph_Free((void **) ¬_ptrs, NULL);\ FREE_LOOP ; \ } @@ -197,13 +206,15 @@ void hash_edge { (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; (*z) += (x->a < x->b)? x->a: x->b; + (*z) &= (*mask); } #define HASH_EDGE \ "void hash_edge \n"\ "(uint64_t *z, const uint64_t *x, const uint64_t *mask) \n"\ "{ \n"\ -" (*z) = ((x[0] + x[1] + 1) * (x[0] + x[1])) / 2; \n"\ -" (*z) += x[x[0] > x[1]]; \n"\ +" (*z) = ((x[0] + x[1] + 1) * (x[0] + x[1])) / 2 & (*mask) ; \n"\ +" (*z) += x[x[0] > x[1]]; \n"\ +" (*z) &= (*mask); \n"\ "}" int LAGraph_SwapEdges ( @@ -287,6 +298,7 @@ int LAGraph_SwapEdges GrB_Vector exists = NULL; GrB_Vector new_edges_h = NULL; GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; + GrB_Matrix hash_m = NULL; GrB_UnaryOp first_bit = NULL; @@ -420,8 +432,10 @@ int LAGraph_SwapEdges E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL )) ; GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT64, 1ULL << 60)) ; int shift_e = __builtin_clzl(e); + uint64_t ehash_size = (1ull << (68-shift_e)); + GRB_TRY (GrB_Vector_new(&exists, GrB_BOOL, ehash_size)) ; + // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; @@ -451,11 +465,15 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; - GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, e, 1ull << (64-shift_e))) ; - GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, 1ull << 60)) ; + + GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, 1ull << (64-shift_e), e)) ; + GRB_TRY (GrB_Matrix_new(&hash_m, GrB_BOOL, ehash_size, e)) ; + + GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, ehash_size)) ; GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); + GRB_TRY (GrB_Matrix_assign_UINT8 ( y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_Matrix_select_UINT64(y, NULL, NULL, GrB_OFFDIAG, y, 0, NULL)) ; @@ -504,14 +522,14 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Vector_unpack_Full( r_60, (void **) &edge_perm, &perm_size, &iso, NULL )) ; - GRB_TRY (GxB_Matrix_pack_CSR( + GRB_TRY (GxB_Matrix_pack_CSC( P, &ramp, &edge_perm, (void**) &val_of_P, ramp_size, perm_size, sizeof(bool), true, false, NULL )); - GRB_TRY (GrB_vxm( - r_permute, NULL, NULL, GxB_ANY_SECONDI_INT64, random_v, P, NULL + GRB_TRY (GrB_mxv( + r_permute, NULL, NULL, GxB_ANY_FIRSTJ_INT64, P, random_v, NULL )); - GRB_TRY (GxB_Matrix_unpack_CSR( + GRB_TRY (GxB_Matrix_unpack_CSC( P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL )); @@ -563,6 +581,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_BOOL( selected, selected, NULL, 1, GrB_ALL, 0, GrB_DESC_RSC )); + LG_TRY (LAGraph_Malloc( (void **)&leftover_e, e - swaps_per_loop * 2, sizeof(GrB_Index), msg )); @@ -599,11 +618,11 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, - (1ull << (68-shift_e)) - 1, NULL + ehash_size - 1, NULL )) ;//0xFB21C651E98DF25ULL GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hashed_edges, NULL, NULL, hash_seed_e, E_vec, - (1ull << (68-shift_e)) - 1, NULL + ehash_size - 1ll, NULL )) ; // GxB_Vector_fprint(hashed_edges, "Hashed", GxB_SHORT, stdout); // I will unpack and then reconstruct with hash as index. @@ -622,46 +641,58 @@ int LAGraph_SwapEdges not_pointers, (void **) ¬_ptrs, &arr_size, &iso, NULL )) ; - // Build Hash Buckets -------------------------------------------------- - GRB_TRY(GxB_Vector_build_Scalar( - exists, hash_vals, one64, e - )) ; + //---------------------------------------------------------------------- + // Build Hash Buckets + //---------------------------------------------------------------------- - GRB_TRY(GrB_Vector_setElement_UINT64(exists, 1ull, (GrB_Index)0)) ; + // Making the hash set for existing edges via a pack CSC trick. + GRB_TRY (GxB_Matrix_pack_CSC( + hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, + perm_size, sizeof(bool), true, false, NULL + )); + GRB_TRY (GrB_reduce( + exists, NULL, NULL, GxB_ANY_BOOL_MONOID, hash_m, NULL)); + GRB_TRY (GxB_Matrix_unpack_CSC( + hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, + &perm_size, &junk_size, &iso, NULL, NULL + )); // THIS HAS SIDE EFFECTS - it writes bad edges to dup_swaps array + GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; GRB_TRY(GrB_Vector_build_UINT64( new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate )) ; - GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; - GRB_TRY (GrB_Vector_eWiseMult_BinaryOp( - new_edges_h, NULL, NULL, duplicate, exists, new_edges_h, NULL - )); GRB_TRY(GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; - n_keep = 0; - for(int64_t i = 0; i < swaps_per_loop; ++i) - { - n_keep += dup_swaps[i] & 1; - } GRB_TRY(GxB_Vector_pack_Full( - not_pointers, (void **) ¬_ptrs, arr_size, iso, NULL + not_pointers, (void **) ¬_ptrs, arr_size, false, NULL )) ; GRB_TRY(GrB_Vector_apply_BinaryOp2nd_UINT64( not_pointers, NULL,NULL, GrB_MINUS_UINT64, not_pointers, (uint64_t) dup_swaps, NULL )) ; + GRB_TRY (GrB_Vector_assign( + new_edges_h, exists, NULL, new_edges_h, GrB_ALL, 0, GrB_DESC_RS)); + GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( + new_edges_h, NULL, NULL, duplicate, (uint64_t) 0, new_edges_h, GrB_DESC_S + )); + GRB_TRY(GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; GRB_TRY (GrB_Vector_clear(exists)) ; GRB_TRY (GrB_Vector_clear(new_edges_h)) ; GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop*2)) // Swap Good Edges ----------------------------------------------------- GRB_TRY (GxB_Vector_pack_Full( - dup_swaps_v, (void **)&dup_swaps, dup_arr_size, iso, NULL + dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL )) ; GRB_TRY(GrB_Vector_assign( E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL )) ; + GRB_TRY(GrB_Vector_assign_BOOL( + dup_swaps_v, dup_swaps_v, NULL, true, GrB_ALL, 0, GrB_DESC_R)); + GRB_TRY(GrB_Vector_nvals(&n_keep, dup_swaps_v)); + n_keep /= 2; GRB_TRY (GxB_Matrix_concat( (GrB_Matrix) E_vec, (GrB_Matrix *)E_split, 2, 1, NULL)); diff --git a/experimental/benchmark/speed_hash_demo.c b/experimental/benchmark/speed_hash_demo.c index c8bba1f935..8cdb1c321c 100644 --- a/experimental/benchmark/speed_hash_demo.c +++ b/experimental/benchmark/speed_hash_demo.c @@ -146,7 +146,7 @@ int main (int argc, char **argv) &r_size, &junk_size, &iso, NULL, NULL )); t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for CSR Magic: %g sec\n", t) ; + printf ("Time for CSC Magic: %g sec\n", t) ; GRB_TRY (GxB_Vector_pack_Full ( rand_v, (void **)&rand_a, r_size, iso, NULL From 3d4e39342465442eefd0698200237c74910e2652 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 18 Dec 2024 01:35:37 -0600 Subject: [PATCH 049/115] Modified duplication finding. Not passing tests --- experimental/algorithm/LAGraph_SwapEdges.c | 146 +++++++++++++-------- 1 file changed, 90 insertions(+), 56 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 47b0ecf550..aa894a84d7 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -22,6 +22,7 @@ GrB_free (E_split) ; \ GrB_free (E_split + 1) ; \ GrB_free(&dup_swaps_v); \ + GrB_free(&bad_swaps); \ GrB_free(&new_hashed_edges); \ GrB_free(&selected_m); \ GrB_free(&hashed_edges); \ @@ -45,7 +46,6 @@ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ GrB_free (&swap_p) ; \ - GrB_free (&first_bit) ; \ GrB_free (&bxor_first) ; \ GrB_free (&hash_seed) ; \ GrB_free (&r_60) ; \ @@ -79,16 +79,18 @@ #include "LG_internal.h" #include "LAGraphX.h" -void first_bit_equals - (bool *z, const uint64_t *x) +void shift_and + (uint16_t *z, const uint16_t *x) { - (*z) = (bool) ((*x) & 1); + (*z) = (*x) & ((*x) << 8); + (*z) |= (*z) >> 8; } #define FIRST_BIT_EQ \ -"void first_bit_equals \n"\ -" (bool *z, const uint64_t *x) \n"\ +"void shift_and \n"\ +" (uint16_t *z, const uint16_t *x) \n"\ " { \n"\ -" (*z) = (bool) ((*x) & 1); \n"\ +" (*z) = (*x) & ((*x) << 8); \n"\ +" (*z) |= (*z) >> 8; \n"\ " }" // creates [0,3,1,2,1,3,. . .] pattern from random vector. @@ -300,7 +302,7 @@ int LAGraph_SwapEdges GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; GrB_Matrix hash_m = NULL; - GrB_UnaryOp first_bit = NULL; + GrB_UnaryOp lg_shiftland = NULL; // b1 <---> a2 or b1 <---> b2 GrB_IndexUnaryOp swap_pair = NULL; @@ -325,6 +327,8 @@ int LAGraph_SwapEdges int16_t *dup_swaps = NULL; GrB_Vector dup_swaps_v = NULL; + // BOOL swaps * 2 vector that holds false if an edge in the swap did not "work" + GrB_Vector bad_swaps = NULL; GrB_Vector not_pointers = NULL; uint64_t *not_ptrs = NULL; @@ -339,8 +343,7 @@ int LAGraph_SwapEdges uint64_t *val_of_P = NULL; - // 2 x 2 Used to shuffle edges [[0 1],[1 0]] - GrB_Matrix y = NULL; + GrB_Vector x = NULL; GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; @@ -372,7 +375,7 @@ int LAGraph_SwapEdges GRB_TRY (GxB_Type_new( &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY(GrB_Matrix_new(A_new, GrB_UINT8, n, n)) ; + GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; @@ -387,8 +390,8 @@ int LAGraph_SwapEdges //Init Operators ----------------------------------------------------------- GRB_TRY (GxB_UnaryOp_new ( - &first_bit, (GxB_unary_function) (&first_bit_equals), - GrB_BOOL, GrB_UINT64, "first_bit_equals", FIRST_BIT_EQ + &lg_shiftland, (GxB_unary_function) (&shift_and), + GrB_UINT16, GrB_UINT16, "shift_and", FIRST_BIT_EQ )) ; GRB_TRY(GxB_BinaryOp_new( @@ -433,7 +436,7 @@ int LAGraph_SwapEdges )) ; GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); int shift_e = __builtin_clzl(e); - uint64_t ehash_size = (1ull << (68-shift_e)); + uint64_t ehash_size = (1ull << (67-shift_e)); GRB_TRY (GrB_Vector_new(&exists, GrB_BOOL, ehash_size)) ; // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); @@ -463,7 +466,6 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - GRB_TRY (GrB_Matrix_new (&y, GrB_UINT8, 2, 2)) ; GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, 1ull << (64-shift_e), e)) ; @@ -471,12 +473,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, ehash_size)) ; GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); - - - - GRB_TRY (GrB_Matrix_assign_UINT8 ( - y, NULL, NULL, 0, GrB_ALL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY(GrB_Matrix_select_UINT64(y, NULL, NULL, GrB_OFFDIAG, y, 0, NULL)) ; + GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; val_of_P[0] = (bool) 1; @@ -492,7 +489,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; - GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) + GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; @@ -526,13 +524,17 @@ int LAGraph_SwapEdges P, &ramp, &edge_perm, (void**) &val_of_P, ramp_size, perm_size, sizeof(bool), true, false, NULL )); + GRB_TRY (GrB_Vector_resize(x, e)); + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_mxv( - r_permute, NULL, NULL, GxB_ANY_FIRSTJ_INT64, P, random_v, NULL + r_permute, NULL, NULL, GxB_ANY_FIRSTJ_INT64, P, x, NULL )); GRB_TRY (GxB_Matrix_unpack_CSC( P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL )); + GRB_TRY (GrB_Vector_clear(x)); LAGraph_Free((void **) &edge_perm, msg); GrB_Index edges_permed = 0; @@ -626,26 +628,28 @@ int LAGraph_SwapEdges )) ; // GxB_Vector_fprint(hashed_edges, "Hashed", GxB_SHORT, stdout); // I will unpack and then reconstruct with hash as index. + GrB_Index hvn_size; GRB_TRY(GxB_Vector_unpack_Full( new_hashed_edges, (void **) &hash_vals_new, - &junk_size, &iso, NULL + &hvn_size, &iso, NULL )) ; GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( - not_pointers, NULL,NULL, GrB_PLUS_UINT64, (uint64_t) dup_swaps, - not_pointers, NULL - )) ; - GRB_TRY(GxB_Vector_unpack_Full( - not_pointers, (void **) ¬_ptrs, &arr_size, &iso, NULL - )) ; + // GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( + // not_pointers, NULL,NULL, GrB_PLUS_UINT64, (uint64_t) dup_swaps, + // not_pointers, NULL + // )) ; + // GRB_TRY(GxB_Vector_unpack_Full( + // not_pointers, (void **) ¬_ptrs, &arr_size, &iso, NULL + // )) ; //---------------------------------------------------------------------- // Build Hash Buckets //---------------------------------------------------------------------- // Making the hash set for existing edges via a pack CSC trick. + GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, e)) ; GRB_TRY (GxB_Matrix_pack_CSC( hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, perm_size, sizeof(bool), true, false, NULL @@ -656,36 +660,66 @@ int LAGraph_SwapEdges hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL )); - - // THIS HAS SIDE EFFECTS - it writes bad edges to dup_swaps array - + GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, swaps_per_loop * 2)) ; + // Making the hash map for new edges via a pack CSC trick. GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; - GRB_TRY(GrB_Vector_build_UINT64( - new_edges_h, hash_vals_new, not_ptrs, swaps_per_loop * 2, duplicate - )) ; - GRB_TRY(GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; - GRB_TRY(GxB_Vector_pack_Full( - not_pointers, (void **) ¬_ptrs, arr_size, false, NULL - )) ; - GRB_TRY(GrB_Vector_apply_BinaryOp2nd_UINT64( - not_pointers, NULL,NULL, GrB_MINUS_UINT64, not_pointers, - (uint64_t) dup_swaps, NULL - )) ; + GRB_TRY (GxB_Matrix_pack_CSC( + hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, + hvn_size + 8, hvn_size, sizeof(bool), true, false, NULL + )); + GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_mxv( + new_edges_h, NULL, NULL, GxB_ANY_FIRSTJ_INT64, hash_m, x, NULL + )); + GRB_TRY (GxB_Matrix_unpack_CSC( + hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, + &hvn_size, &junk_size, &iso, NULL, NULL + )); + GRB_TRY (GrB_Vector_clear(x)); GRB_TRY (GrB_Vector_assign( - new_edges_h, exists, NULL, new_edges_h, GrB_ALL, 0, GrB_DESC_RS)); - GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( - new_edges_h, NULL, NULL, duplicate, (uint64_t) 0, new_edges_h, GrB_DESC_S + new_edges_h, exists, NULL, new_edges_h, GrB_ALL, 0, GrB_DESC_RSC)); + + // Use yet another hash set to find bad swaps + GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) + GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_extractTuples( + NULL, hash_vals_new, &hvn_size, new_edges_h)) ; + GRB_TRY (GrB_Matrix_resize( + hash_m, swaps_per_loop * 2, hvn_size)) ; + GRB_TRY (GxB_Matrix_pack_CSC( + hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, + (hvn_size + 1) * sizeof(GrB_Index), hvn_size * sizeof(GrB_Index), + sizeof(bool), true, false, NULL + )); + GRB_TRY (GrB_reduce( + dup_swaps_v, NULL, NULL, GxB_ANY_BOOL_MONOID, hash_m, NULL)); + GRB_TRY (GxB_Matrix_unpack_CSC( + hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, + &hvn_size, &junk_size, &iso, NULL, NULL + )); + int8_t *dup_val = NULL; + GRB_TRY (GxB_Vector_unpack_Bitmap( + dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, + &dup_arr_size, &junk_size, &iso, &n_keep, NULL + )); + LAGraph_Free((void **) &dup_val, msg); + GRB_TRY (GxB_Vector_pack_Full( + bad_swaps, (void **) &dup_swaps, dup_arr_size, false, NULL + )); + GRB_TRY (GrB_apply( + bad_swaps, NULL, NULL, lg_shiftland, bad_swaps, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full( + bad_swaps, (void **) &dup_swaps, &dup_arr_size, &iso, NULL )); - GRB_TRY(GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; - GRB_TRY (GrB_Vector_clear(exists)) ; - GRB_TRY (GrB_Vector_clear(new_edges_h)) ; - GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop*2)) - - // Swap Good Edges ----------------------------------------------------- GRB_TRY (GxB_Vector_pack_Full( dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL )) ; + GRB_TRY (GrB_Vector_clear(exists)) ; + GRB_TRY (GrB_Vector_clear(new_edges_h)) ; + // Swap Good Edges ----------------------------------------------------- + GRB_TRY(GrB_Vector_assign( E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL )) ; @@ -717,7 +751,7 @@ int LAGraph_SwapEdges E, (void **)&indices, &ind_size, &iso, NULL)) ; GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); GRB_TRY (GrB_eWiseAdd( - *A_new, NULL, NULL, GrB_PLUS_UINT8, *A_new,*A_new, GrB_DESC_T0 + *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 )) ; LG_FREE_WORK ; return (GrB_SUCCESS) ; From b5bc2d297565993021ad8c9b09ab6d08116b5b90 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 18 Dec 2024 11:44:34 -0600 Subject: [PATCH 050/115] new hashing method --- experimental/algorithm/LAGraph_SwapEdges.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index aa894a84d7..9b4332c443 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -597,9 +597,8 @@ int LAGraph_SwapEdges GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; GrB_Index dup_arr_size = 0; - GRB_TRY (GxB_Vector_unpack_Bitmap( - M_thin, (int8_t **) &dup_swaps, (void **) &indices, &dup_arr_size, - &ind_size, &iso, &junk_size, NULL + GRB_TRY (GxB_Vector_unpack_Full( + M_thin, (void **) &indices, &ind_size, &iso, NULL )) ; GRB_TRY (GxB_Vector_pack_Full( M, (void **) &indices, ind_size, iso, NULL From a56361e36cc3e9e54772c16dbe8e1d44af371b58 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 29 Jan 2025 10:14:46 -0600 Subject: [PATCH 051/115] Cleaned up RCC code --- .../algorithm/LAGraph_RichClubCoefficient.c | 161 +++++++++++------- experimental/algorithm/LAGraph_SwapEdges.c | 90 +++++----- 2 files changed, 148 insertions(+), 103 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 8080927c93..95316ff3b6 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -38,6 +38,7 @@ { \ /* free any workspace used here */ \ GrB_free(&D) ; \ + GrB_free(&P) ; \ GrB_free(&edge_degrees) ; \ GrB_free(°rees) ; \ GrB_free(&node_edges) ; \ @@ -53,6 +54,8 @@ LAGraph_Free((void **) &edges_per_deg_arr, NULL); \ LAGraph_Free((void **) &ones, NULL); \ LAGraph_Free((void **) °_vertex_count, NULL); \ + LAGraph_Free((void **) &epd_index, NULL); \ + LAGraph_Free((void **) &vpd_index, NULL); \ } @@ -81,9 +84,9 @@ void two_one_add(int64_t *z, const int64_t *x, const int64_t *y) } */ #define ISEQ_2ISLT \ - "void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y)" \ - "{" \ - "(*z) = (int64_t)((*x < *y) + (*x <= *y)) ;" \ + "void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y) \n"\ + "{ \n"\ + "(*z) = (int64_t)((*x < *y) + (*x <= *y)) ; \n"\ "}" void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y) { @@ -91,9 +94,9 @@ void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y) } #define RICH_CLUB_FORMULA \ - "void rich_club_formula(double *z, const int64_t *x, const int64_t *y)" \ - "{" \ - "(*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ;" \ + "void rich_club_formula(double *z, const int64_t *x, const int64_t *y) \n"\ + "{ \n"\ + " (*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)) ; \n"\ "}" void rich_club_formula(double *z, const int64_t *x, const int64_t *y) { @@ -115,28 +118,34 @@ int LAGraph_RichClubCoefficient // Declorations //-------------------------------------------------------------------------- LG_CLEAR_MSG ; - //Matrix containing every edge - //With an entry cooresponding to the degree of its column + + // n x n Adjacency Matrix + // With values cooresponding to the degree of its column GrB_Matrix edge_degrees = NULL; - //A matrix with diagonal entries corresponding to degrees. + // n x n Diagonal Matrix + // entries corresponding to degrees. GrB_Matrix D = NULL; - //degrees of nodes. + // n degrees vector GrB_Vector degrees = NULL; + // n x 1 // contains the number of edges for which the ith node is // the smallest degree node * 2 + # edges w/ same degree as the other node // to account for double counting of edges w/ same degree as the other node. GrB_Vector node_edges = NULL; + // max_degree x 1 // the ith entry contains the number of edges whose lowest degree is i. GrB_Vector edges_per_deg = NULL; + // max_degree x 1 // the ith entry contains the number of verticies whose degree is i. GrB_Vector verts_per_deg = NULL; - //Vector of ones + // + // Vector of ones GrB_Vector ones_v = NULL; // 2 * (x < y) + (x == y) @@ -149,16 +158,26 @@ int LAGraph_RichClubCoefficient GrB_BinaryOp rcCalculation = NULL; GrB_Matrix A ; // G->A, the adjacency matrix + + // Matrix used for row reduction + GrB_Matrix P = NULL; + GrB_Index n ; GrB_Index vi_size ; GrB_Index vx_size ; GrB_Index edge_vec_nvals; GrB_Index deg_vec_size; + GrB_Index max_deg; bool iso = false; int64_t *node_edges_arr = NULL, *deg_arr = NULL, *edges_per_deg_arr = NULL, *ones = NULL, *deg_vertex_count = NULL; + + + GrB_Index *epd_index = NULL, *vpd_index = NULL; + + int64_t *ramp = NULL; GrB_Index *index_edge = NULL; //-------------------------------------------------------------------------- @@ -167,7 +186,6 @@ int LAGraph_RichClubCoefficient LG_TRY (LAGraph_CheckGraph (G, msg)) ; LG_ASSERT (rich_club_coefficents != NULL, GrB_NULL_POINTER); - //TODO: double check this LG_ASSERT_MSG( G->kind == LAGraph_ADJACENCY_UNDIRECTED, GrB_INVALID_VALUE, "G->A must be symmetric") ; @@ -180,59 +198,54 @@ int LAGraph_RichClubCoefficient // Initializations //-------------------------------------------------------------------------- A = G->A ; - GRB_TRY(GrB_Matrix_nrows (&n, A)) ; - GRB_TRY(GrB_Matrix_new(&edge_degrees, GrB_INT64,n,n)) ; + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; + GRB_TRY (GrB_Matrix_new(&edge_degrees, GrB_INT64,n,n)) ; + GRB_TRY (GrB_Vector_new(°rees, GrB_INT64, n)) ; + GRB_TRY (GrB_Vector_new(&node_edges, GrB_INT64, n)) ; - GRB_TRY(GrB_Vector_new(°rees, GrB_INT64, n)) ; - GRB_TRY(GrB_Vector_new(&node_edges, GrB_INT64, n)) ; - - GRB_TRY(GxB_BinaryOp_new( + GRB_TRY (GxB_BinaryOp_new( &iseq_2lt, (LAGraph_binary_function) (&iseq_2islt), GrB_INT64, GrB_INT64, GrB_INT64, "iseq_2islt", ISEQ_2ISLT)) ; - GRB_TRY(GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_INT64, iseq_2lt)) ; - GRB_TRY(GxB_BinaryOp_new( + GRB_TRY (GxB_BinaryOp_new( &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), GrB_FP64, GrB_INT64, GrB_INT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; + GRB_TRY (GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_INT64, iseq_2lt)) ; + + GRB_TRY (GrB_Vector_reduce_INT64( + &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; + GRB_TRY (GrB_Vector_new(&edges_per_deg, GrB_INT64, max_deg)) ; + GRB_TRY (GrB_Vector_new(&verts_per_deg, GrB_INT64, max_deg)) ; + GRB_TRY (GrB_Vector_new(rich_club_coefficents, GrB_FP64, max_deg)) ; + + //-------------------------------------------------------------------------- + // Calculations + //-------------------------------------------------------------------------- + // degrees = G->out_degree - 1 GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; - - // Fill out degree vector, to activate col_scale and row_scale on graphs - // with singletons, scalar irrelevant + // Fill out degree vector, to target col_scale mxm on graphs + // with singletons, scalar value irrelevant. GRB_TRY (GrB_Vector_assign_INT64( degrees, degrees, NULL, (int64_t) -1, GrB_ALL, 0, GrB_DESC_SC)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; - int64_t max_deg; - GRB_TRY(GrB_Vector_reduce_INT64( - &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; - GRB_TRY(GrB_Vector_new(&edges_per_deg, GrB_INT64, max_deg)) ; - GRB_TRY(GrB_Vector_new(&verts_per_deg, GrB_INT64, max_deg)) ; - GRB_TRY(GrB_Vector_new(rich_club_coefficents, GrB_FP64, max_deg)) ; - //-------------------------------------------------------------------------- - // Calculating time - //-------------------------------------------------------------------------- - - // Each edge in the graph gets the value of the degree of its column node + // Each edge in the graph gets the value of the degree of its row node GRB_TRY (GrB_mxm( edge_degrees, NULL, NULL, GxB_ANY_FIRST_INT64, D, A, NULL)) ; - - // Sum up the number of edges each node is "responsible" for. + // Sum the number of edges each node is "responsible" for. GRB_TRY (GrB_mxv( node_edges, NULL, NULL, plus_2le, edge_degrees, degrees, NULL)) ; + // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. - GRB_TRY(GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; - - // Grab the index and edge count arrays from GBLAS - // Jumbled NULL so must return sorted. Needed because arrays with - // # of edges and # of degrees should line up. + GRB_TRY (GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; if(n == edge_vec_nvals) { GRB_TRY (GxB_Vector_unpack_Full ( @@ -245,44 +258,64 @@ int LAGraph_RichClubCoefficient else { GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( - degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, GrB_DESC_R)) ; - - GRB_TRY(GxB_Vector_unpack_CSC( - node_edges, &index_edge, (void **) &node_edges_arr, - &vi_size,&vx_size,&iso,&edge_vec_nvals, NULL, NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, msg)) ; - - GRB_TRY(GxB_Vector_unpack_CSC( - degrees, &index_edge, (void **) °_arr, - &vi_size,&vx_size,&iso,°_vec_size, NULL, NULL)) ; - LG_TRY(LAGraph_Free((void **)&index_edge, msg)) ; + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; + LG_TRY(LAGraph_Malloc( + (void **) °_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; + LG_TRY(LAGraph_Malloc( + (void **) °_vec_size, edge_vec_nvals, sizeof(int64_t), NULL)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, deg_arr, °_vec_size, degrees + )) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, node_edges_arr, &edge_vec_nvals, node_edges + )) ; } + #if LAGRAPH_SUITESPARSE + LG_TRY (LAGraph_Malloc( + (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); + GRB_TRY (GrB_Matrix_new (&P, GrB_INT64, max_deg, edge_vec_nvals)); + GRB_TRY (GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + ramp, NULL, &edge_vec_nvals, ones_v)) ; + ramp[edge_vec_nvals] = edge_vec_nvals; + GRB_TRY (GxB_Matrix_pack_CSC( + P, (GrB_Index **)&ramp, (GrB_Index **)°_arr, + (void **) &node_edges_arr, (edge_vec_nvals + 1) * sizeof(int64_t), + vx_size, vx_size, false, false, NULL + )); + GRB_TRY (GrB_mxv( + edges_per_deg, NULL, NULL, GxB_PLUS_FIRST_INT64, P, ones_v, NULL)) ; + GRB_TRY (GrB_mxv( + verts_per_deg, NULL, NULL, GxB_PLUS_PAIR_INT64, P, ones_v, NULL)) ; + #else // Build with degrees as indecies and handle duplicates via adition - GRB_TRY(GrB_Vector_build ( + GRB_TRY (GrB_Vector_build ( edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, GrB_PLUS_INT64)) ; //Hack to make an array of ones - LG_TRY( + LG_TRY ( LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; - GRB_TRY(GrB_Vector_new(&ones_v, GrB_INT64, deg_vec_size)); - GRB_TRY(GrB_Vector_assign_INT64( + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, deg_vec_size)); + GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY(GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; - GRB_TRY(GrB_Vector_build ( + GRB_TRY (GrB_Vector_build ( verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; + #endif - GrB_Index *epd_index = NULL, *vpd_index = NULL; - GRB_TRY(GxB_Vector_unpack_CSC( + // Cumulative sum (TODO: should be a GBLAS method!) + GRB_TRY (GxB_Vector_unpack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, NULL)) ; - GRB_TRY(GxB_Vector_unpack_CSC( + GRB_TRY (GxB_Vector_unpack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL)) ; - //TODO: parralelize these sums: //run a cummulative sum (backwards) on deg_vertex_count for(uint64_t i = deg_vec_size - 1; i > 0; --i) { @@ -295,10 +328,10 @@ int LAGraph_RichClubCoefficient edges_per_deg_arr[i-1]+=edges_per_deg_arr[i]; } - GRB_TRY(GxB_Vector_pack_CSC( + GRB_TRY (GxB_Vector_pack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, vi_size, vx_size, false, edge_vec_nvals, NULL, NULL)); - GRB_TRY(GxB_Vector_pack_CSC( + GRB_TRY (GxB_Vector_pack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, vi_size, vx_size, false, deg_vec_size, NULL, NULL)); diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 9b4332c443..9b61c07e47 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -45,7 +45,6 @@ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ - GrB_free (&swap_p) ; \ GrB_free (&bxor_first) ; \ GrB_free (&hash_seed) ; \ GrB_free (&r_60) ; \ @@ -218,6 +217,17 @@ void hash_edge " (*z) += x[x[0] > x[1]]; \n"\ " (*z) &= (*mask); \n"\ "}" +void zero_function + (bool *z, const bool *x, const bool *y) +{ + (*z) = (*z) != (*z); +} +#define ZERO_FUNC \ +"void zero_function \n"\ +"(bool *z, const bool *x, const bool *y) \n"\ +"{ \n"\ +" (*z) = (*z) != (*z); \n"\ +"}" int LAGraph_SwapEdges ( // output @@ -264,9 +274,6 @@ int LAGraph_SwapEdges // e x 2 Matrix that picks the edges for which we will swap values. GrB_Matrix swapMask = NULL; - // Swaps 2,1 - GrB_Matrix swap_p = NULL; - GrB_Vector ramp_v = NULL; GrB_Vector hramp_v = NULL; @@ -437,7 +444,8 @@ int LAGraph_SwapEdges GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); int shift_e = __builtin_clzl(e); uint64_t ehash_size = (1ull << (67-shift_e)); - GRB_TRY (GrB_Vector_new(&exists, GrB_BOOL, ehash_size)) ; + printf("Hash Size: %ld", ehash_size); + GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- @@ -466,31 +474,24 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - GRB_TRY (GrB_Matrix_new (&swap_p, GrB_UINT8, 4, 4)) ; GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, 1ull << (64-shift_e), e)) ; GRB_TRY (GrB_Matrix_new(&hash_m, GrB_BOOL, ehash_size, e)) ; - GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_UINT64, ehash_size)) ; + // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_INT8, ehash_size)) ; GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; val_of_P[0] = (bool) 1; - GrB_Index hcols[] = {0, 0, 1, 1}; - GrB_Index srows[] = {0, 1, 2, 3}; - GrB_Index scols[] = {0, 2, 1, 3}; - GRB_TRY(GxB_Matrix_build_Scalar( - swap_p, srows, scols, one64, 4 - )) ; - // Make Random ------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY(GrB_set (exists, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + // GRB_TRY(GrB_set (new_edges_h, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; @@ -647,21 +648,25 @@ int LAGraph_SwapEdges // Build Hash Buckets //---------------------------------------------------------------------- + // TODO: probably faster to make a single array to force a bitmap saxpy + // We're gonna need a bigger ramp. // Making the hash set for existing edges via a pack CSC trick. + GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; + GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, e)) ; GRB_TRY (GxB_Matrix_pack_CSC( hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, perm_size, sizeof(bool), true, false, NULL )); GRB_TRY (GrB_reduce( - exists, NULL, NULL, GxB_ANY_BOOL_MONOID, hash_m, NULL)); + exists, NULL, NULL, GxB_ANY_INT8_MONOID, hash_m, NULL)); GRB_TRY (GxB_Matrix_unpack_CSC( hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL )); GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, swaps_per_loop * 2)) ; // Making the hash map for new edges via a pack CSC trick. - GRB_TRY (GrB_wait(new_edges_h, GrB_MATERIALIZE)) ; GRB_TRY (GxB_Matrix_pack_CSC( hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, hvn_size + 8, hvn_size, sizeof(bool), true, false, NULL @@ -669,35 +674,42 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + //TODO: fix overflow! GRB_TRY (GrB_mxv( - new_edges_h, NULL, NULL, GxB_ANY_FIRSTJ_INT64, hash_m, x, NULL + exists, NULL, GrB_PLUS_INT8, GxB_PLUS_PAIR_INT8, hash_m, x, NULL )); - GRB_TRY (GxB_Matrix_unpack_CSC( - hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, - &hvn_size, &junk_size, &iso, NULL, NULL + GRB_TRY (GrB_Vector_select_INT8( + exists, NULL, NULL, GrB_VALUEEQ_INT8, exists, (int8_t) 1, + NULL )); - GRB_TRY (GrB_Vector_clear(x)); - GRB_TRY (GrB_Vector_assign( - new_edges_h, exists, NULL, new_edges_h, GrB_ALL, 0, GrB_DESC_RSC)); - - // Use yet another hash set to find bad swaps - GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) - GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_extractTuples( - NULL, hash_vals_new, &hvn_size, new_edges_h)) ; - GRB_TRY (GrB_Matrix_resize( - hash_m, swaps_per_loop * 2, hvn_size)) ; - GRB_TRY (GxB_Matrix_pack_CSC( - hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, - (hvn_size + 1) * sizeof(GrB_Index), hvn_size * sizeof(GrB_Index), - sizeof(bool), true, false, NULL + GRB_TRY (GrB_vxm( + dup_swaps_v, NULL, NULL, GxB_ANY_PAIR_INT8, + exists, hash_m, NULL )); - GRB_TRY (GrB_reduce( - dup_swaps_v, NULL, NULL, GxB_ANY_BOOL_MONOID, hash_m, NULL)); GRB_TRY (GxB_Matrix_unpack_CSC( hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, &hvn_size, &junk_size, &iso, NULL, NULL )); + GRB_TRY (GrB_Vector_clear(x)); + // GRB_TRY (GrB_Vector_assign( + // new_edges_h, exists, NULL, new_edges_h, GrB_ALL, 0, GrB_DESC_RSC)); + // GxB_fprint(new_edges_h, GxB_SHORT, stdout); + // Use yet another hash set to find bad swaps + // GRB_TRY (GrB_Vector_extractTuples( + // NULL, hash_vals_new, &hvn_size, new_edges_h)) ; + // GRB_TRY (GrB_Matrix_resize( + // hash_m, swaps_per_loop * 2, hvn_size)) ; + // GRB_TRY (GxB_Matrix_pack_CSC( + // hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, + // (hvn_size + 1) * sizeof(GrB_Index), hvn_size * sizeof(GrB_Index), + // sizeof(bool), true, false, NULL + // )); + // GRB_TRY (GrB_reduce( + // dup_swaps_v, NULL, NULL, GrB_PLUS_INT8, hash_m, NULL)); + // GRB_TRY (GxB_Matrix_unpack_CSC( + // hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, + // &hvn_size, &junk_size, &iso, NULL, NULL + // )); int8_t *dup_val = NULL; GRB_TRY (GxB_Vector_unpack_Bitmap( dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, @@ -716,7 +728,7 @@ int LAGraph_SwapEdges dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL )) ; GRB_TRY (GrB_Vector_clear(exists)) ; - GRB_TRY (GrB_Vector_clear(new_edges_h)) ; + // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; // Swap Good Edges ----------------------------------------------------- GRB_TRY(GrB_Vector_assign( @@ -734,7 +746,7 @@ int LAGraph_SwapEdges // Adjust number of swaps to do next. num_attempts += swaps_per_loop; num_swaps += n_keep; - swaps_per_loop = n_keep * 2; + swaps_per_loop = n_keep * 3; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; From cf75705e4842488d65bc2f8a28c8a0f01882364f Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 6 Feb 2025 16:51:19 -0600 Subject: [PATCH 052/115] added add_term, not yet in use --- .../algorithm/LAGraph_RichClubCoefficient.c | 36 +++++---- experimental/algorithm/LAGraph_SwapEdges.c | 75 ++++++++++++------- experimental/test/test_RichClubCoefficient.c | 8 +- experimental/test/test_SwapEdges.c | 2 +- 4 files changed, 71 insertions(+), 50 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 95316ff3b6..f5aed02006 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// LAGraph_RichClubCoefficient: rich club coefficient +// LAGraph_RichClubCoefficient: rich club coefficient of a graph //------------------------------------------------------------------------------ // LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. @@ -15,14 +15,15 @@ //------------------------------------------------------------------------------ -// Get the rich club coefficient of a graph, also allows for edge randomization -// to normalize the coefficients in a graph. +// Get the rich club coefficient of a graph. // Given a Symetric Graph with no self edges, LAGraph_RichClubCoefficient will // calculate the rich club coefficients of the graph. // The values will be output as a sparse GrB_Vector, the rich club coefficient -// of k will be found at the closeste entry at or above k. +// of k will be found at the closest entry at or above k. + +// The G->out_degree cached property must be defined for this method. // References: @@ -73,16 +74,6 @@ typedef void (*LAGraph_binary_function) (void *, const void *, const void *) ; -/* #define TWO_ONE_ADD \ - "void two_one_add(int64_t *z, const int64_t *x, const int64_t *y)" \ - "{" \ - "(*z) = 2 * (*x) + (*y) ;" \ - "}" -void two_one_add(int64_t *z, const int64_t *x, const int64_t *y) -{ - (*z) = 2 * (*x) + (*y); -} - */ #define ISEQ_2ISLT \ "void iseq_2islt(int64_t *z, const int64_t *x, const int64_t *y) \n"\ "{ \n"\ @@ -106,7 +97,7 @@ void rich_club_formula(double *z, const int64_t *x, const int64_t *y) int LAGraph_RichClubCoefficient ( // output: - //rich_club_coefficents(i): rich club coefficents of i + //rich_club_coefficents(i): rich club coefficent of i GrB_Vector *rich_club_coefficents, // input: @@ -144,7 +135,7 @@ int LAGraph_RichClubCoefficient // the ith entry contains the number of verticies whose degree is i. GrB_Vector verts_per_deg = NULL; - // + // edge_vec_nvals x 1 // Vector of ones GrB_Vector ones_v = NULL; @@ -309,6 +300,19 @@ int LAGraph_RichClubCoefficient #endif // Cumulative sum (TODO: should be a GBLAS method!) + + /** + * GrB_cumsum(GrB_Matrix C, const GrB_Matrix mask, const GrB_BinaryOp accum, + * const GrB_Monoid monoid, GrB_Matrix A, const GrB_Descriptor desc) + * + * By default sums rows. Returns a nearly full matrix: + * [., ., 1, 1, 1, 1, ., ., 1] --> [., ., 1, 2, 3, 4, 4, 4, 5] + * Mask can be A, then returns a matrix with the same pattern. + * [., ., 1, 1, 1, 1, ., ., 1] --> [., ., 1, 2, 3, 4, ., ., 5] + * + * Should we be able to sum in the opposite direction? + * If Monoid is not comutative, this method should still work. + */ GRB_TRY (GxB_Vector_unpack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, NULL)) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 9b61c07e47..907cafa507 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// LAGraph_SwapEdges: Randomly Swaps edges in a graph +// LAGraph_SwapEdges: randomly swaps edges in a graph //------------------------------------------------------------------------------ // LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. @@ -105,7 +105,7 @@ void swap_pattern "(*z) = (uint8_t) (((i & 1) * 2) | (*x & 1));" \ "}" -//Hashes any node with a simple Multiply-shift from +// Hashes any node with a simple Multiply-shift from // https://arxiv.org/pdf/1504.06804 // QUESTION: this hash is a bit simple but I doubt it will result in a ton of // collisions unless the input graph is very specifically constucted @@ -228,6 +228,21 @@ void zero_function "{ \n"\ " (*z) = (*z) != (*z); \n"\ "}" + +void add_term + (uint8_t *z, const uint8_t *x, const uint8_t *y) +{ + uint8_t temp = (*x) + (*y); + (*z) = (temp > 2)? 2: temp; +} +#define ADD_TERM \ +"void add_term \n"\ +"(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ +"{ \n"\ +" uint8_t temp = (*x) + (*y); \n"\ +" (*z) = (temp > 2)? 2: temp; \n"\ +"}" + int LAGraph_SwapEdges ( // output @@ -322,6 +337,12 @@ int LAGraph_SwapEdges GrB_BinaryOp hash_seed = NULL; GrB_BinaryOp hash_seed_e = NULL; + // z = min(2,x+y) + GrB_BinaryOp add_term_biop = NULL; + GrB_Monoid add_term_monoid = NULL; + GrB_Semiring plus_term_one = NULL; + + // [^],[h_y(x)] GrB_Semiring bxor_hash = NULL; @@ -421,6 +442,16 @@ int LAGraph_SwapEdges &swap_pair, (GxB_index_unary_function) (&swap_bc), lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC )) ; + GRB_TRY(GxB_BinaryOp_new( + &add_term_biop, (GxB_binary_function) (&add_term), + GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM + )); + // GRB_TRY (GrB_Monoid_new_UINT8( + // &add_term_monoid, add_term_biop, (uint8_t) 0 + // )) + GRB_TRY (GxB_Monoid_terminal_new_UINT8( + &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 + )); // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be // commutative. @@ -430,6 +461,10 @@ int LAGraph_SwapEdges GRB_TRY(GrB_Semiring_new( &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; + // TODO: get this working with the right monoid + GRB_TRY(GrB_Semiring_new( + &plus_term_one, GxB_PLUS_UINT8_MONOID, GrB_ONEB_UINT8 + ));// add_term_monoid // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; @@ -444,8 +479,9 @@ int LAGraph_SwapEdges GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); int shift_e = __builtin_clzl(e); uint64_t ehash_size = (1ull << (67-shift_e)); + // if(ehash_size > 6*e) ehash_size/=2; printf("Hash Size: %ld", ehash_size); - GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; + GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, ehash_size)) ; // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- @@ -620,7 +656,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, - ehash_size - 1, NULL + ehash_size - 1ll, NULL )) ;//0xFB21C651E98DF25ULL GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hashed_edges, NULL, NULL, hash_seed_e, E_vec, @@ -648,8 +684,6 @@ int LAGraph_SwapEdges // Build Hash Buckets //---------------------------------------------------------------------- - // TODO: probably faster to make a single array to force a bitmap saxpy - // We're gonna need a bigger ramp. // Making the hash set for existing edges via a pack CSC trick. GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; @@ -660,7 +694,7 @@ int LAGraph_SwapEdges perm_size, sizeof(bool), true, false, NULL )); GRB_TRY (GrB_reduce( - exists, NULL, NULL, GxB_ANY_INT8_MONOID, hash_m, NULL)); + exists, NULL, NULL, GxB_ANY_UINT8_MONOID, hash_m, NULL)); GRB_TRY (GxB_Matrix_unpack_CSC( hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL @@ -674,12 +708,13 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + //TODO: fix overflow! GRB_TRY (GrB_mxv( - exists, NULL, GrB_PLUS_INT8, GxB_PLUS_PAIR_INT8, hash_m, x, NULL + exists, NULL, add_term_biop, plus_term_one, hash_m, x, NULL )); - GRB_TRY (GrB_Vector_select_INT8( - exists, NULL, NULL, GrB_VALUEEQ_INT8, exists, (int8_t) 1, + GRB_TRY (GrB_Vector_select_UINT8( + exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 1, NULL )); GRB_TRY (GrB_vxm( @@ -691,25 +726,7 @@ int LAGraph_SwapEdges &hvn_size, &junk_size, &iso, NULL, NULL )); GRB_TRY (GrB_Vector_clear(x)); - // GRB_TRY (GrB_Vector_assign( - // new_edges_h, exists, NULL, new_edges_h, GrB_ALL, 0, GrB_DESC_RSC)); - // GxB_fprint(new_edges_h, GxB_SHORT, stdout); - // Use yet another hash set to find bad swaps - // GRB_TRY (GrB_Vector_extractTuples( - // NULL, hash_vals_new, &hvn_size, new_edges_h)) ; - // GRB_TRY (GrB_Matrix_resize( - // hash_m, swaps_per_loop * 2, hvn_size)) ; - // GRB_TRY (GxB_Matrix_pack_CSC( - // hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, - // (hvn_size + 1) * sizeof(GrB_Index), hvn_size * sizeof(GrB_Index), - // sizeof(bool), true, false, NULL - // )); - // GRB_TRY (GrB_reduce( - // dup_swaps_v, NULL, NULL, GrB_PLUS_INT8, hash_m, NULL)); - // GRB_TRY (GxB_Matrix_unpack_CSC( - // hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, - // &hvn_size, &junk_size, &iso, NULL, NULL - // )); + int8_t *dup_val = NULL; GRB_TRY (GxB_Vector_unpack_Bitmap( dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 29b938d243..e81f5e1726 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -1,5 +1,6 @@ //---------------------------------------------------------------------------- -// LAGraph/src/test/test_HelloWorld.c: test cases for LAGraph_HelloWorld +// LAGraph/src/test/test_RichClubCoefficient.c: test cases for +// LAGraph_RichClubCoefficient //---------------------------------------------------------------------------- // LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. @@ -13,8 +14,7 @@ //----------------------------------------------------------------------------- -// This is a very simple "hello world" example of a test program for an -// algorithm in the experimental/algorithm folder. +// This program tests Rich Club Coefficient by comparing it to know values. #include #include @@ -84,7 +84,7 @@ const matrix_info tests [ ] = { {rcc1, sizeof(rcc1) / sizeof(rcc1[0]), "random_unweighted_general1.mtx"}, {rcc2, sizeof(rcc2) / sizeof(rcc2[0]), "random_unweighted_general2.mtx"}, - {rcc3, sizeof(rcc3) / sizeof(rcc2[0]), "bcsstk13.mtx"}, + {rcc3, sizeof(rcc3) / sizeof(rcc3[0]), "bcsstk13.mtx"}, {NULL, 0, ""} } ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index fbe8922ffe..6a0b1226f4 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -32,7 +32,7 @@ const char* tests [ ] = { "random_unweighted_general1.mtx", "random_unweighted_general2.mtx", - //"bcsstk13.mtx", + "bcsstk13.mtx", "" } ; void test_SwapEdges (void) From af1068517e5371074b1701d9c3c97ca287c71387 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 10 Feb 2025 15:03:38 -0600 Subject: [PATCH 053/115] Fixed counter overflow --- experimental/algorithm/LAGraph_SwapEdges.c | 39 ++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 907cafa507..df6c602449 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -232,15 +232,24 @@ void zero_function void add_term (uint8_t *z, const uint8_t *x, const uint8_t *y) { - uint8_t temp = (*x) + (*y); - (*z) = (temp > 2)? 2: temp; + (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); } #define ADD_TERM \ "void add_term \n"\ "(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ "{ \n"\ -" uint8_t temp = (*x) + (*y); \n"\ -" (*z) = (temp > 2)? 2: temp; \n"\ +" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); \n"\ +"}" + +void makeOne (uint8_t *z, const void *x, const void *y) +{ + (*z) = (uint8_t) 1; +} +#define MAKE_ONE \ +"void makeOne \n"\ +"(uint8_t *z, const void *x, const void *y) \n"\ +"{ \n"\ +" (*z) = (uint8_t) 1; \n"\ "}" int LAGraph_SwapEdges @@ -341,7 +350,7 @@ int LAGraph_SwapEdges GrB_BinaryOp add_term_biop = NULL; GrB_Monoid add_term_monoid = NULL; GrB_Semiring plus_term_one = NULL; - + GrB_BinaryOp lg_one_uint8 = NULL; // [^],[h_y(x)] GrB_Semiring bxor_hash = NULL; @@ -446,12 +455,16 @@ int LAGraph_SwapEdges &add_term_biop, (GxB_binary_function) (&add_term), GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM )); - // GRB_TRY (GrB_Monoid_new_UINT8( - // &add_term_monoid, add_term_biop, (uint8_t) 0 - // )) - GRB_TRY (GxB_Monoid_terminal_new_UINT8( - &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 + GRB_TRY (GrB_Monoid_new_UINT8( + &add_term_monoid, add_term_biop, (uint8_t) 0 + )) + GRB_TRY (GxB_BinaryOp_new( + &lg_one_uint8, (GxB_binary_function) (&makeOne), + GrB_UINT8, GrB_UINT8, GrB_UINT8, "makeOne", MAKE_ONE )); + // GRB_TRY (GxB_Monoid_terminal_new_UINT8( + // &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 + // )); // I use a bit wise xor to combine the hashes since the same column number // will not appear twice in my multiplication and I want combination to be // commutative. @@ -461,10 +474,10 @@ int LAGraph_SwapEdges GRB_TRY(GrB_Semiring_new( &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 )) ; - // TODO: get this working with the right monoid + // TODO: get this working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( - &plus_term_one, GxB_PLUS_UINT8_MONOID, GrB_ONEB_UINT8 - ));// add_term_monoid + &plus_term_one, add_term_monoid, lg_one_uint8 + )); // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; From f36df0431df45399d2f48f570296b0f459aa83ac Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 12 Feb 2025 13:32:43 -0600 Subject: [PATCH 054/115] trigger JIT bug in GraphBLAS --- experimental/algorithm/LAGraph_SwapEdges.c | 6 +++++- experimental/test/test_SwapEdges.c | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index df6c602449..ef89066155 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -476,7 +476,10 @@ int LAGraph_SwapEdges )) ; // TODO: get this working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( - &plus_term_one, add_term_monoid, lg_one_uint8 + &plus_term_one, add_term_monoid, +// lg_one_uint8 /* OK */ +// evil:broken, but should work: + GrB_ONEB_UINT8 )); // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; @@ -723,6 +726,7 @@ int LAGraph_SwapEdges x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; //TODO: fix overflow! +// JIT dies here GRB_TRY (GrB_mxv( exists, NULL, add_term_biop, plus_term_one, hash_m, x, NULL )); diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 6a0b1226f4..aee3ad0ba7 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -31,8 +31,9 @@ char filename [LEN+1] ; const char* tests [ ] = { "random_unweighted_general1.mtx", - "random_unweighted_general2.mtx", - "bcsstk13.mtx", +// HACK +// "random_unweighted_general2.mtx", +// "bcsstk13.mtx", "" } ; void test_SwapEdges (void) @@ -151,4 +152,4 @@ TEST_LIST = { {"SwapEdges", test_SwapEdges}, {NULL, NULL} -} ; \ No newline at end of file +} ; From 285f9452d6856c3c4af8d8651e3d68e960587f0f Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 19 Feb 2025 08:50:52 -0600 Subject: [PATCH 055/115] targeting saxpy4 and ONEB now working --- experimental/algorithm/LAGraph_SwapEdges.c | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index ef89066155..df8d01a75c 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -542,7 +542,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; // GRB_TRY(GrB_set (new_edges_h, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( @@ -587,7 +587,6 @@ int LAGraph_SwapEdges P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL )); - GRB_TRY (GrB_Vector_clear(x)); LAGraph_Free((void **) &edge_perm, msg); GrB_Index edges_permed = 0; @@ -688,13 +687,6 @@ int LAGraph_SwapEdges GRB_TRY(GxB_Vector_unpack_Full( hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL )) ; - // GRB_TRY(GrB_Vector_apply_BinaryOp1st_UINT64( - // not_pointers, NULL,NULL, GrB_PLUS_UINT64, (uint64_t) dup_swaps, - // not_pointers, NULL - // )) ; - // GRB_TRY(GxB_Vector_unpack_Full( - // not_pointers, (void **) ¬_ptrs, &arr_size, &iso, NULL - // )) ; //---------------------------------------------------------------------- // Build Hash Buckets @@ -709,8 +701,8 @@ int LAGraph_SwapEdges hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, perm_size, sizeof(bool), true, false, NULL )); - GRB_TRY (GrB_reduce( - exists, NULL, NULL, GxB_ANY_UINT8_MONOID, hash_m, NULL)); + GRB_TRY (GrB_mxv( + exists, NULL, NULL, GxB_ANY_PAIR_UINT8, hash_m, x, NULL)); GRB_TRY (GxB_Matrix_unpack_CSC( hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL @@ -725,8 +717,17 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - //TODO: fix overflow! -// JIT dies here + // Want to make exists full. But assign takes too long. + // Exists cannot possibly be full at this point. + int8_t *exists_bitmap = NULL; + uint64_t exists_bsize; + GRB_TRY (GxB_Vector_unpack_Bitmap( + exists, &exists_bitmap, &junk, &exists_bsize, &junk_size, &iso, + &junk_size, NULL + )); + GRB_TRY (GxB_Vector_pack_Full( + exists, (void **)&exists_bitmap, exists_bsize, false, NULL + )); GRB_TRY (GrB_mxv( exists, NULL, add_term_biop, plus_term_one, hash_m, x, NULL )); From e27baefa0f1700ed8ec79956b8df2c761dd98236 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 20 Feb 2025 19:06:17 -0600 Subject: [PATCH 056/115] Added the FastBuild method using load/unload --- .../algorithm/LAGraph_RichClubCoefficient.c | 68 +++++---- experimental/algorithm/LAGraph_SwapEdges.c | 138 +++--------------- experimental/utility/LAGraph_FastBuild.c | 93 ++++++++++++ experimental/utility/LAGraph_cumsum.c | 52 ------- include/LAGraphX.h | 52 ++++--- 5 files changed, 188 insertions(+), 215 deletions(-) create mode 100755 experimental/utility/LAGraph_FastBuild.c delete mode 100644 experimental/utility/LAGraph_cumsum.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index f5aed02006..5245b6ee0e 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -66,7 +66,6 @@ LG_FREE_WORK ; \ /* free all the output variable(s) */ \ GrB_free (rich_club_coefficents) ; \ - /* take any other corrective action */ \ } #include "LG_internal.h" @@ -119,13 +118,13 @@ int LAGraph_RichClubCoefficient GrB_Matrix D = NULL; // n degrees vector - GrB_Vector degrees = NULL; + GrB_Vector degrees = NULL, deg_x = NULL; // n x 1 // contains the number of edges for which the ith node is // the smallest degree node * 2 + # edges w/ same degree as the other node // to account for double counting of edges w/ same degree as the other node. - GrB_Vector node_edges = NULL; + GrB_Vector node_edges = NULL, node_edges_x = NULL; // max_degree x 1 // the ith entry contains the number of edges whose lowest degree is i. @@ -239,17 +238,19 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; if(n == edge_vec_nvals) { - GRB_TRY (GxB_Vector_unpack_Full ( - node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; - + // GRB_TRY (GxB_Vector_unpack_Full ( + // node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; + // GRB_TRY (GxB_Vector_unpack_Full ( + // degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; + deg_x = degrees; + node_edges_x = node_edges; deg_vec_size = n; } else { GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) LG_TRY(LAGraph_Malloc( (void **) °_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; LG_TRY(LAGraph_Malloc( @@ -260,9 +261,24 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; + #else + GRB_TRY (GxB_Vector_extractTuples_Vector( + NULL, deg_x, degrees, NULL + )) ; + GRB_TRY (GxB_Vector_extractTuples_Vector( + NULL, node_edges_x, node_edges, NULL + )) ; + #endif } - - #if LAGRAPH_SUITESPARSE + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + LG_TRY (LAGraph_Fast_Build ( + edges_per_deg, deg_x, node_edges_x, GxB_PLUS_UINT64_MONOID, msg)) ; + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); + GRB_TRY (GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (LAGraph_Fast_Build ( + verts_per_deg, deg_x, ones_v, GxB_PLUS_UINT64_MONOID, msg)) ; + #elif LAGRAPH_SUITESPARSE LG_TRY (LAGraph_Malloc( (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); @@ -299,9 +315,9 @@ int LAGraph_RichClubCoefficient verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; #endif - // Cumulative sum (TODO: should be a GBLAS method!) - /** + * Cumulative sum (TODO: should be a GBLAS method!) + * * GrB_cumsum(GrB_Matrix C, const GrB_Matrix mask, const GrB_BinaryOp accum, * const GrB_Monoid monoid, GrB_Matrix A, const GrB_Descriptor desc) * @@ -315,33 +331,35 @@ int LAGraph_RichClubCoefficient */ GRB_TRY (GxB_Vector_unpack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, - &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, NULL)) ; + &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, NULL + )) ; GRB_TRY (GxB_Vector_unpack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, - &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL)) ; + &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL + )) ; + LG_ASSERT(deg_vec_size == deg_vec_size, GrB_DIMENSION_MISMATCH); //run a cummulative sum (backwards) on deg_vertex_count for(uint64_t i = deg_vec_size - 1; i > 0; --i) { - deg_vertex_count[i-1]+=deg_vertex_count[i]; - } - - //run a cummulative sum (backwards) on edges_per_deg_arr - for(uint64_t i = edge_vec_nvals - 1; i > 0; --i) - { - edges_per_deg_arr[i-1]+=edges_per_deg_arr[i]; + deg_vertex_count[i-1] += deg_vertex_count[i]; + edges_per_deg_arr[i-1] += edges_per_deg_arr[i]; } GRB_TRY (GxB_Vector_pack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, - vi_size, vx_size, false, edge_vec_nvals, NULL, NULL)); + vi_size, vx_size, false, edge_vec_nvals, NULL, NULL + )); GRB_TRY (GxB_Vector_pack_CSC( verts_per_deg, &vpd_index, (void **)°_vertex_count, - vi_size, vx_size, false, deg_vec_size, NULL, NULL)); + vi_size, vx_size, false, deg_vec_size, NULL, NULL + )); //Computes the RCC of a matrix - GRB_TRY(GrB_eWiseMult(*rich_club_coefficents, NULL, NULL, rcCalculation, - edges_per_deg, verts_per_deg, NULL)) ; + GRB_TRY(GrB_eWiseMult( + *rich_club_coefficents, NULL, NULL, rcCalculation, + edges_per_deg, verts_per_deg, NULL + )) ; LG_FREE_WORK ; return (GrB_SUCCESS) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index df8d01a75c..7e8f171861 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -20,16 +20,16 @@ GrB_free (&M) ; \ GrB_free (&M_thin) ; \ GrB_free (E_split) ; \ - GrB_free (E_split + 1) ; \ + GrB_free (E_split + 1) ; \ GrB_free(&dup_swaps_v); \ - GrB_free(&bad_swaps); \ + GrB_free(&bad_swaps); \ GrB_free(&new_hashed_edges); \ - GrB_free(&selected_m); \ + GrB_free(&selected_m); \ GrB_free(&hashed_edges); \ - GrB_free(&swapMask); \ - LAGraph_Free((void**)&leftover_e, msg) ; \ - LAGraph_Free((void**)&hash_vals, msg) ; \ - LAGraph_Free((void**)&hash_vals_new, msg) ; \ + GrB_free(&swapMask); \ + LAGraph_Free((void**)&leftover_e, msg) ; \ + LAGraph_Free((void**)&hash_vals, msg) ; \ + LAGraph_Free((void**)&hash_vals_new, msg) ; \ LAGraph_Free((void**)&edge_perm, msg) ; \ } @@ -38,31 +38,28 @@ /* free any workspace used here */ \ GrB_free (&E) ; \ GrB_free (&P) ; \ - GrB_free (&hash_m) ; \ + GrB_free (&hash_m) ; \ GrB_free (&A_tril) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ - GrB_free (&bxor_first) ; \ - GrB_free (&hash_seed) ; \ - GrB_free (&r_60) ; \ + GrB_free (&r_60) ; \ GrB_free(&exists); \ - GrB_free (&bxor_hash) ; \ - GrB_free (&selected) ; \ - GrB_free (&E_vec) ; \ + GrB_free (&selected) ; \ + GrB_free (&E_vec) ; \ GrB_free (&swap_pair) ; \ - GrB_free (&swap_verts) ; \ - GrB_free (&hash_seed_e) ; \ + GrB_free (&swap_verts) ; \ + GrB_free (&hash_seed_e) ; \ GrB_free (&duplicate) ; \ - GrB_free (¬_pointers) ; \ + GrB_free (¬_pointers) ; \ LAGraph_Free((void**)&indices, msg) ; \ LAGraph_Free((void**)&ramp, msg) ; \ LAGraph_Free((void**)&half_ramp, msg) ; \ LAGraph_Free((void**) &val_of_P, msg); \ - LAGraph_Free((void **) &dup_swaps, NULL);\ - LAGraph_Free((void **) ¬_ptrs, NULL);\ + LAGraph_Free((void **) &dup_swaps, NULL); \ + LAGraph_Free((void **) ¬_ptrs, NULL); \ FREE_LOOP ; \ } @@ -84,7 +81,7 @@ void shift_and (*z) = (*x) & ((*x) << 8); (*z) |= (*z) >> 8; } -#define FIRST_BIT_EQ \ +#define SHIFT_AND \ "void shift_and \n"\ " (uint16_t *z, const uint16_t *x) \n"\ " { \n"\ @@ -92,49 +89,6 @@ void shift_and " (*z) |= (*z) >> 8; \n"\ " }" -// creates [0,3,1,2,1,3,. . .] pattern from random vector. -void swap_pattern - (uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y) - { - (*z) = (uint8_t) (((i & 1) * 2) | (*x & 1)); - } -#define SWAP_PAT \ -"void swap_pattern" \ - "(uint8_t *z, const uint64_t *x, int64_t i, int64_t j, const uint8_t *y)" \ - "{" \ - "(*z) = (uint8_t) (((i & 1) * 2) | (*x & 1));" \ - "}" - -// Hashes any node with a simple Multiply-shift from -// https://arxiv.org/pdf/1504.06804 -// QUESTION: this hash is a bit simple but I doubt it will result in a ton of -// collisions unless the input graph is very specifically constucted - -void hash_node - (uint64_t *z, const uint64_t *x, const uint64_t *y) -{ - (*z) = ((*y) * (*x)) & 0xFFFFFFFFFFFFFFF; -} -#define HASH_ONE \ -"void hash_node \n"\ -" (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ -"{ \n"\ -" (*z) = ((*y) * (*x)) & 0xFFFFFFFFFFFFFFF; \n"\ -"}" -void log_duplicate - (uint64_t *z, const uint64_t *x, const uint64_t *y) -{ - **((int16_t **)y) = (int16_t) 0; - *z = *x; -} -#define LOG_DUPLICATE \ -"void log_duplicate \n"\ -" (uint64_t *z, const uint64_t *x, const uint64_t *y) \n"\ -"{ \n"\ -" **((int16_t **)y) = (int16_t) 0; \n"\ -" *z = *x; \n"\ -"}" - typedef struct { uint64_t a; uint64_t b; @@ -174,6 +128,7 @@ void swap_ab " z[0] ^= x[1]; \n"\ " } \n"\ "}" + void swap_bc (swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) { @@ -217,17 +172,6 @@ void hash_edge " (*z) += x[x[0] > x[1]]; \n"\ " (*z) &= (*mask); \n"\ "}" -void zero_function - (bool *z, const bool *x, const bool *y) -{ - (*z) = (*z) != (*z); -} -#define ZERO_FUNC \ -"void zero_function \n"\ -"(bool *z, const bool *x, const bool *y) \n"\ -"{ \n"\ -" (*z) = (*z) != (*z); \n"\ -"}" void add_term (uint8_t *z, const uint8_t *x, const uint8_t *y) @@ -241,17 +185,6 @@ void add_term " (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); \n"\ "}" -void makeOne (uint8_t *z, const void *x, const void *y) -{ - (*z) = (uint8_t) 1; -} -#define MAKE_ONE \ -"void makeOne \n"\ -"(uint8_t *z, const void *x, const void *y) \n"\ -"{ \n"\ -" (*z) = (uint8_t) 1; \n"\ -"}" - int LAGraph_SwapEdges ( // output @@ -343,7 +276,6 @@ int LAGraph_SwapEdges // z = h_y(x) - GrB_BinaryOp hash_seed = NULL; GrB_BinaryOp hash_seed_e = NULL; // z = min(2,x+y) @@ -353,9 +285,6 @@ int LAGraph_SwapEdges GrB_BinaryOp lg_one_uint8 = NULL; // [^],[h_y(x)] - GrB_Semiring bxor_hash = NULL; - - GrB_Semiring bxor_first = NULL; GrB_BinaryOp duplicate = NULL; @@ -428,21 +357,12 @@ int LAGraph_SwapEdges //Init Operators ----------------------------------------------------------- GRB_TRY (GxB_UnaryOp_new ( &lg_shiftland, (GxB_unary_function) (&shift_and), - GrB_UINT16, GrB_UINT16, "shift_and", FIRST_BIT_EQ - )) ; - - GRB_TRY(GxB_BinaryOp_new( - &hash_seed, (GxB_binary_function) (&hash_node), - GrB_UINT64, GrB_UINT64, GrB_UINT64, "hash_node", HASH_ONE + GrB_UINT16, GrB_UINT16, "shift_and", SHIFT_AND )) ; GRB_TRY(GxB_BinaryOp_new( &hash_seed_e, (GxB_binary_function) (&hash_edge), GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE )) ; - GRB_TRY(GxB_BinaryOp_new( - &duplicate, (GxB_binary_function) (&log_duplicate), - GrB_UINT64, GrB_UINT64, GrB_UINT64, "log_duplicate", LOG_DUPLICATE - )) ; GRB_TRY (GxB_IndexUnaryOp_new ( &swap_verts, (GxB_index_unary_function) (&swap_ab), lg_edge, lg_edge, GrB_BOOL, "swap_ab", SWAP_AB @@ -458,28 +378,12 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Monoid_new_UINT8( &add_term_monoid, add_term_biop, (uint8_t) 0 )) - GRB_TRY (GxB_BinaryOp_new( - &lg_one_uint8, (GxB_binary_function) (&makeOne), - GrB_UINT8, GrB_UINT8, GrB_UINT8, "makeOne", MAKE_ONE - )); // GRB_TRY (GxB_Monoid_terminal_new_UINT8( // &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 // )); - // I use a bit wise xor to combine the hashes since the same column number - // will not appear twice in my multiplication and I want combination to be - // commutative. - GRB_TRY(GrB_Semiring_new( - &bxor_hash, GxB_BXOR_UINT64_MONOID, hash_seed - )) ; - GRB_TRY(GrB_Semiring_new( - &bxor_first, GxB_BXOR_UINT64_MONOID , GrB_FIRST_UINT64 - )) ; - // TODO: get this working with the built-in ONEB binary op + // Now working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( - &plus_term_one, add_term_monoid, -// lg_one_uint8 /* OK */ -// evil:broken, but should work: - GrB_ONEB_UINT8 + &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 )); // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; diff --git a/experimental/utility/LAGraph_FastBuild.c b/experimental/utility/LAGraph_FastBuild.c new file mode 100755 index 0000000000..f406b30d3f --- /dev/null +++ b/experimental/utility/LAGraph_FastBuild.c @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// LAGraph_Fast_Build: Uses saxpy methods for faster builds, especially powerful +// when output is bitmap. +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 +// See additional acknowledgments in the LICENSE file, +// or contact permission@sei.cmu.edu for the full terms. + + +#include "LG_internal.h" +#include "LAGraphX.h" + +#include +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + GrB_free(&P); \ + GrB_free(&ramp); \ +} + +int LAGraph_Fast_Build +( + GrB_Vector c, // Vector to be built: initialized with correct dimensions. + GrB_Vector i, // Indecies + GrB_Vector x, // Values + // GrB_Vector ramp, // Optional (makes P load O(1)) + GrB_Monoid dup, // Applied to duplicates + char *msg +) +{ + GrB_Vector ramp; + GrB_Matrix P; + int64_t n, nrows; + bool iso; + //TODO: allow user to input a ramp for faster times + //TODO: assert inputs are full etc + LG_ASSERT (c != NULL, GrB_NULL_POINTER); + LG_ASSERT (i != NULL, GrB_NULL_POINTER); + LG_ASSERT (x != NULL, GrB_NULL_POINTER); + + GRB_TRY (GrB_Vector_size(&n, i)); + GRB_TRY (GrB_Vector_size(&nrows, c)); + GRB_TRY (GrB_Vector_get_INT32(x, (int32_t *) &iso, GxB_ISO)); + + GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; + GrB_Type x_type; + char typename[LAGRAPH_MAX_NAME_LEN]; + LG_TRY (LAGraph_Vector_TypeName(typename, x, msg)); + LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; + + GrB_IndexUnaryOp idxnum = (n <= INT32_MAX)? + GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; + GRB_TRY (GrB_Vector_new(&ramp, ramp_type, n + 1)); + GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); + GRB_TRY (GrB_assign (ramp, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply (ramp, NULL, NULL, idxnum, ramp, 0, NULL)) ; + // GxB_fprint(ramp, GxB_COMPLETE, stdout); + GxB_Container con; + GRB_TRY (GxB_Container_new(&con)); + GrB_Vector temp; + temp = con->p; + con->p = ramp; + ramp = temp; + temp = con->i; + con->i = i; + i = temp; + temp = con->x; + con->x = x; + x = temp; + con->format = GxB_SPARSE; + con->orientation = GrB_COLMAJOR; + con->nrows = nrows; + con->ncols = n; + con->iso = iso; + con->nvals = n; + con->jumbled = false; + GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); + GRB_TRY (GrB_reduce( + c, NULL, NULL, dup, P, NULL)) ; + GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); + temp = con->p; + con->p = ramp; + ramp = temp; + temp = con->i; + con->i = i; + i = temp; + temp = con->x; + con->x = x; + x = temp; + GrB_free(&con); +} diff --git a/experimental/utility/LAGraph_cumsum.c b/experimental/utility/LAGraph_cumsum.c deleted file mode 100644 index 2245107202..0000000000 --- a/experimental/utility/LAGraph_cumsum.c +++ /dev/null @@ -1,52 +0,0 @@ -//------------------------------------------------------------------------------ -// LAGraph_cumsum: check two vectors for exact equality -//------------------------------------------------------------------------------ - -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. -// SPDX-License-Identifier: BSD-2-Clause -// -// For additional details (including references to third party source code and -// other files) see the LICENSE file or contact permission@sei.cmu.edu. See -// Contributors.txt for a full list of contributors. Created, in part, with -// funding and support from the U.S. Government (see Acknowledgments.txt file). -// DM22-0790 - -// Contributed by Timothy A. Davis, Texas A&M University - -//------------------------------------------------------------------------------ - - -//TODO -#define LG_FREE_WORK ; - -#include "LAGraphX.h" -#include "LG_internal.h" - -int LAGraph_cumsum -( - // output: - GrB_Vector A, // Vector to run cumsum on - // input: - bool invert, // if true invert the sum - char *msg -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - LG_CLEAR_MSG ; - LG_ASSERT (A != NULL, GrB_NULL_POINTER) ; - //-------------------------------------------------------------------------- - // check for NULL and aliased vectors - //-------------------------------------------------------------------------- - - - //-------------------------------------------------------------------------- - // free workspace and return result - //-------------------------------------------------------------------------- - - LG_FREE_WORK ; - return (GrB_SUCCESS) ; -} diff --git a/include/LAGraphX.h b/include/LAGraphX.h index b5996ee48d..88f1de69fa 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -293,29 +293,14 @@ int LAGraph_Incidence_Matrix char *msg ) ; -//------------------------------------------------------------------------------ -// LAGraph_RichClubCoefficient: Compute Rich Club Coefficient of Graph -//------------------------------------------------------------------------------ - LAGRAPHX_PUBLIC -int LAGraph_RichClubCoefficient +int LAGraph_Fast_Build ( - GrB_Vector *rich_club_coefficents, //output - LAGraph_Graph G, //input graph - char *msg -) ; - -//------------------------------------------------------------------------------ -// LAGraph_SwapEdges: Randomize Graph while maintaining degree sequence. -//------------------------------------------------------------------------------ -LAGRAPHX_PUBLIC -int LAGraph_SwapEdges -( - // output - GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped - // input: not modified - LAGraph_Graph G, - GrB_Index Q, // Swaps per edge + GrB_Vector c, // Vector to be built: initialized with correct dimensions. + GrB_Vector i, // Indecies + GrB_Vector x, // Values + // GrB_Vector ramp, // Optional (makes P load O(1)) + GrB_Monoid dup, // Applied to duplicates char *msg ); @@ -1260,6 +1245,31 @@ int LAGraph_argminmax char *msg ); +//------------------------------------------------------------------------------ +// LAGraph_RichClubCoefficient: Compute Rich Club Coefficient of Graph +//------------------------------------------------------------------------------ + +LAGRAPHX_PUBLIC +int LAGraph_RichClubCoefficient +( + GrB_Vector *rich_club_coefficents, //output + LAGraph_Graph G, //input graph + char *msg +) ; + +//------------------------------------------------------------------------------ +// LAGraph_SwapEdges: Randomize Graph while maintaining degree sequence. +//------------------------------------------------------------------------------ +LAGRAPHX_PUBLIC +int LAGraph_SwapEdges +( + // output + GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped + // input: not modified + LAGraph_Graph G, + GrB_Index Q, // Swaps per edge + char *msg +); #if defined ( __cplusplus ) } From e9049362c32d928e9cb79f6a858edfe6c0dfc836 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 20 Feb 2025 19:46:16 -0600 Subject: [PATCH 057/115] singleton bug fix and test added --- experimental/algorithm/LAGraph_RichClubCoefficient.c | 3 +++ experimental/test/test_RichClubCoefficient.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 5245b6ee0e..a24e792323 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -262,6 +262,9 @@ int LAGraph_RichClubCoefficient NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; #else + //dimensions should get adjusted in theory. + GRB_TRY (GrB_Vector_new(°_x, GrB_BOOL, 0)) ; + GRB_TRY (GrB_Vector_new(&node_edges_x, GrB_BOOL, 0)) ; GRB_TRY (GxB_Vector_extractTuples_Vector( NULL, deg_x, degrees, NULL )) ; diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index e81f5e1726..f62178d598 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -79,12 +79,15 @@ double rcc3[] = {0.020418922066450775, 0.020418922066450775, 0.1989280560709132, 0.20149602618045817, 0.20475808607324245, 0.16666666666666666, 0.16840882694541232, 0.17894736842105263, 0.16666666666666666, 1.0} ; - +double rcc4[] = {0.0016506547800326698, 0.0017226315730560155, + 0.0034201182512489416, 0.0037033309852068028, 0.05405405405405406}; +// TODO: add singleton test const matrix_info tests [ ] = { {rcc1, sizeof(rcc1) / sizeof(rcc1[0]), "random_unweighted_general1.mtx"}, {rcc2, sizeof(rcc2) / sizeof(rcc2[0]), "random_unweighted_general2.mtx"}, {rcc3, sizeof(rcc3) / sizeof(rcc3[0]), "bcsstk13.mtx"}, + {rcc4, sizeof(rcc4) / sizeof(rcc4[0]), "test_FW_2500.mtx"}, {NULL, 0, ""} } ; From 381ef587a139f4189a22cef3b1e9cf40eb47e6ca Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 20 Feb 2025 23:57:52 -0600 Subject: [PATCH 058/115] Incidence Matrix general type --- .../benchmark/Incidence_Matrix_demo.c | 135 ++++++++++++++++++ .../utility/LAGraph_Incidence_Matrix.c | 41 +++++- 2 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 experimental/benchmark/Incidence_Matrix_demo.c diff --git a/experimental/benchmark/Incidence_Matrix_demo.c b/experimental/benchmark/Incidence_Matrix_demo.c new file mode 100644 index 0000000000..451e99de74 --- /dev/null +++ b/experimental/benchmark/Incidence_Matrix_demo.c @@ -0,0 +1,135 @@ +//------------------------------------------------------------------------------ +// LAGraph/experimental/benchmark/Incidence_Matrix_demo.c: a demo to check the +// speed of Incidence Matrix building +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Timothy A Davis, Texas A&M University + +//------------------------------------------------------------------------------ + +#include "../../src/benchmark/LAGraph_demo.h" +#include "LAGraphX.h" +#include "LG_internal.h" + +// LG_FREE_ALL is required by LG_TRY +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + GrB_free (&Y) ; \ + LAGraph_Delete (&G, msg) ; \ +} + +int main (int argc, char **argv) +{ + + //-------------------------------------------------------------------------- + // startup LAGraph and GraphBLAS + //-------------------------------------------------------------------------- + + char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph + LAGraph_Graph G = NULL ; + GrB_Matrix Y = NULL ; + GrB_Matrix E = NULL ; + GrB_Type atype = NULL; + GrB_Semiring op = NULL; + GrB_Index nrows, ncols; + + // start GraphBLAS and LAGraph + bool burble = true ; // set true for diagnostic outputs + demo_init (burble) ; + + //-------------------------------------------------------------------------- + // read in the graph: this method is defined in LAGraph_demo.h + //-------------------------------------------------------------------------- + + // readproblem can read in a file in Matrix Market format, or in a binary + // format created by binwrite (see LAGraph_demo.h, or the main program, + // mtx2bin_demo). + + double t = LAGraph_WallClockTime ( ) ; + char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; + LG_TRY (readproblem ( + &G, // the graph that is read from stdin or a file + NULL, // source nodes (none, if NULL) + true, // make the graph undirected, if true + true, // remove self-edges, if true + false, // return G->A as structural, if true, + NULL, // prefered GrB_Type of G->A; null if no preference + false, // ensure all entries are positive, if true + argc, argv)) ; // input to this main program + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to read the graph: %g sec\n", t) ; + + printf ("\n==========================The input graph matrix G:\n") ; + LG_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // try the LAGraph_Incidence_Matrix "algorithm" + //-------------------------------------------------------------------------- + + t = LAGraph_WallClockTime ( ) ; + LG_TRY (LAGraph_Incidence_Matrix (&E, G, msg)) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for LAGraph_Incidence_Matrix: %g sec\n", t) ; + + //-------------------------------------------------------------------------- + // check the results (make sure Y is a copy of G->A) + //-------------------------------------------------------------------------- + + bool isequal ; + t = LAGraph_WallClockTime ( ) ; + //unnessesary work but gets me dimensions and type quickly. + GRB_TRY (GxB_Matrix_type(&atype, G->A)) ; + GRB_TRY (GrB_Matrix_nrows(&nrows, G->A)) ; + GRB_TRY (GrB_Matrix_nrows(&ncols, G->A)) ; + GRB_TRY (GrB_Matrix_new(&Y, atype, nrows, ncols)) ; + if (atype == GrB_BOOL ) op = GxB_ANY_FIRST_BOOL ; + else if (atype == GrB_INT8 ) op = GxB_ANY_FIRST_INT8 ; + else if (atype == GrB_INT16 ) op = GxB_ANY_FIRST_INT16 ; + else if (atype == GrB_INT32 ) op = GxB_ANY_FIRST_INT32 ; + else if (atype == GrB_INT64 ) op = GxB_ANY_FIRST_INT64 ; + else if (atype == GrB_UINT8 ) op = GxB_ANY_FIRST_UINT8 ; + else if (atype == GrB_UINT16) op = GxB_ANY_FIRST_UINT16 ; + else if (atype == GrB_UINT32) op = GxB_ANY_FIRST_UINT32 ; + else if (atype == GrB_UINT64) op = GxB_ANY_FIRST_UINT64 ; + else if (atype == GrB_FP32 ) op = GxB_ANY_FIRST_FP32 ; + else if (atype == GrB_FP64 ) op = GxB_ANY_FIRST_FP64 ; + GRB_TRY (GrB_mxm (Y, NULL, NULL, op, E, E, GrB_DESC_T1)); + GRB_TRY (GrB_select (Y, NULL, NULL, GrB_OFFDIAG, Y, 0, NULL)) + LG_TRY (LAGraph_Matrix_IsEqual (&isequal, Y, G->A, msg)); + + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time to check results: %g sec\n", t) ; + if (isequal) + { + printf ("Test passed.\n") ; + } + else + { + printf ("Test failure!\n") ; + } + + //-------------------------------------------------------------------------- + // print the results (Y is just a copy of G->A) + //-------------------------------------------------------------------------- + + printf ("\n===============================The result matrix Y:\n") ; + LG_TRY (LAGraph_Matrix_Print (Y, LAGraph_SHORT, stdout, msg)) ; + + //-------------------------------------------------------------------------- + // free everyting and finish + //-------------------------------------------------------------------------- + + LG_FREE_ALL ; + LG_TRY (LAGraph_Finalize (msg)) ; + return (GrB_SUCCESS) ; +} diff --git a/experimental/utility/LAGraph_Incidence_Matrix.c b/experimental/utility/LAGraph_Incidence_Matrix.c index 0d7130c673..d4292449c5 100755 --- a/experimental/utility/LAGraph_Incidence_Matrix.c +++ b/experimental/utility/LAGraph_Incidence_Matrix.c @@ -12,6 +12,8 @@ // FIXME: not ready for src; should handle all builtin types, with option to // typecast to INT64, UINT64, or FP64 as is currently done. +// Working with Suitesparse:GraphBLAS v10! + // FIXME: this method is required for MaximalMatching and CoarsenMatching // Given an undirected graph G, construct the incidence matrix E. @@ -35,7 +37,7 @@ Note that complex types are NOT supported. #include -// #define dbg +//#define dbg #undef LG_FREE_ALL #define LG_FREE_ALL \ @@ -46,6 +48,11 @@ Note that complex types are NOT supported. LAGraph_Free ((void**)(&ramp), msg) ; \ GrB_free (&E_half) ; \ GrB_free (&A_tril) ; \ + GrB_free (&x); \ + GrB_free (&i); \ + GrB_free (&j); \ + GrB_free (&fullx); \ + GrB_free(&build_desc); \ } \ int LAGraph_Incidence_Matrix @@ -59,7 +66,8 @@ int LAGraph_Incidence_Matrix GrB_Matrix E = NULL ; GrB_Matrix E_half = NULL ; GrB_Matrix A_tril = NULL ; - + GrB_Vector i = NULL, j = NULL, x = NULL, fullx = NULL; + GrB_Descriptor build_desc = NULL; GrB_Index *row_indices = NULL ; GrB_Index *col_indices = NULL ; void *values = NULL ; @@ -78,8 +86,13 @@ int LAGraph_Incidence_Matrix char typename[LAGRAPH_MAX_NAME_LEN] ; GrB_Type type ; + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) LG_TRY (LAGraph_Matrix_TypeName (typename, A, msg)) ; LG_TRY (LAGraph_TypeFromName (&type, typename, msg)) ; + #else + // No longer historical + GRB_TRY (GxB_Matrix_type(&type, A)); + #endif GrB_Index nvals ; GrB_Index num_nodes, num_edges ; @@ -92,6 +105,10 @@ int LAGraph_Incidence_Matrix GRB_TRY (GrB_Matrix_new (&E, type, num_nodes, num_edges)) ; GRB_TRY (GrB_Matrix_new (&E_half, type, num_nodes, num_edges)) ; + // get just the lower triangular entries + GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; + + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) bool is_uint64 = (type == GrB_UINT64) ; bool is_float = ((type == GrB_FP32) || (type == GrB_FP64)) ; @@ -107,9 +124,6 @@ int LAGraph_Incidence_Matrix // (*result) = E ; // return (GrB_SUCCESS) ; - // get just the lower triangular entries - GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; - // Arrays to extract A into LG_TRY (LAGraph_Malloc ((void**)(&row_indices), num_edges, sizeof(GrB_Index), msg)) ; LG_TRY (LAGraph_Malloc ((void**)(&col_indices), num_edges, sizeof(GrB_Index), msg)) ; @@ -157,6 +171,21 @@ int LAGraph_Incidence_Matrix GRB_TRY (GrB_Matrix_build_INT64 (E, row_indices, ramp, values, num_edges, NULL)) ; break; } + #else + // The vector types and sizes get overriden by extract. + GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, 0)); + GRB_TRY (GrB_Vector_new(&i, GrB_BOOL, 0)); + GRB_TRY (GrB_Vector_new(&j, GrB_BOOL, 0)); + GRB_TRY (GrB_Vector_new(&fullx, GrB_BOOL, num_edges)); + GRB_TRY (GrB_Descriptor_new(&build_desc)); + GRB_TRY (GrB_set(build_desc, GxB_USE_INDICES, GxB_COLINDEX_LIST)); + GRB_TRY (GrB_Vector_assign_BOOL( + fullx, NULL, NULL, (bool) 1, GrB_ALL, 0, NULL)); + + GRB_TRY (GxB_Matrix_extractTuples_Vector(i, j, x, A_tril, NULL)); + GRB_TRY (GxB_Matrix_build_Vector(E_half, j, fullx, x, NULL, build_desc)); + GRB_TRY (GxB_Matrix_build_Vector(E, i, fullx, x, NULL, build_desc)); + #endif GRB_TRY (GrB_eWiseAdd (E, NULL, NULL, GrB_PLUS_FP64, E, E_half, NULL)) ; @@ -166,4 +195,4 @@ int LAGraph_Incidence_Matrix (*result) = E ; return (GrB_SUCCESS) ; -} +} \ No newline at end of file From f822e4d89fc1ad59dce6e8d7cd2ec959303d5267 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 22 Feb 2025 16:30:20 -0600 Subject: [PATCH 059/115] FastBuild -> FastAssign --- .../algorithm/LAGraph_RichClubCoefficient.c | 17 ++-- experimental/algorithm/LAGraph_SwapEdges.c | 84 ++++++++++--------- ...Graph_FastBuild.c => LAGraph_FastAssign.c} | 30 +++++-- include/LAGraphX.h | 10 ++- 4 files changed, 82 insertions(+), 59 deletions(-) rename experimental/utility/{LAGraph_FastBuild.c => LAGraph_FastAssign.c} (74%) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index a24e792323..99ab73495a 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -42,7 +42,9 @@ GrB_free(&P) ; \ GrB_free(&edge_degrees) ; \ GrB_free(°rees) ; \ + GrB_free(°_x) ; \ GrB_free(&node_edges) ; \ + GrB_free(&node_edges_x) ; \ GrB_free(&ones_v) ; \ GrB_free(&edges_per_deg) ; \ GrB_free(&verts_per_deg) ; \ @@ -262,7 +264,6 @@ int LAGraph_RichClubCoefficient NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; #else - //dimensions should get adjusted in theory. GRB_TRY (GrB_Vector_new(°_x, GrB_BOOL, 0)) ; GRB_TRY (GrB_Vector_new(&node_edges_x, GrB_BOOL, 0)) ; GRB_TRY (GxB_Vector_extractTuples_Vector( @@ -273,18 +274,19 @@ int LAGraph_RichClubCoefficient )) ; #endif } - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - LG_TRY (LAGraph_Fast_Build ( - edges_per_deg, deg_x, node_edges_x, GxB_PLUS_UINT64_MONOID, msg)) ; GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + LG_TRY (LAGraph_FastAssign ( + edges_per_deg, NULL, NULL, deg_x, node_edges_x, + GxB_PLUS_UINT64_MONOID, msg + )) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (LAGraph_Fast_Build ( - verts_per_deg, deg_x, ones_v, GxB_PLUS_UINT64_MONOID, msg)) ; + GRB_TRY (LAGraph_FastAssign ( + verts_per_deg, NULL, NULL, deg_x, ones_v, GxB_PLUS_UINT64_MONOID, msg)) ; #elif LAGRAPH_SUITESPARSE LG_TRY (LAGraph_Malloc( (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); GRB_TRY (GrB_Matrix_new (&P, GrB_INT64, max_deg, edge_vec_nvals)); GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; @@ -309,7 +311,6 @@ int LAGraph_RichClubCoefficient //Hack to make an array of ones LG_TRY ( LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, deg_vec_size)); GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 7e8f171861..bbda5d4dca 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -26,7 +26,6 @@ GrB_free(&new_hashed_edges); \ GrB_free(&selected_m); \ GrB_free(&hashed_edges); \ - GrB_free(&swapMask); \ LAGraph_Free((void**)&leftover_e, msg) ; \ LAGraph_Free((void**)&hash_vals, msg) ; \ LAGraph_Free((void**)&hash_vals_new, msg) ; \ @@ -110,49 +109,61 @@ typedef struct { void swap_ab (edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) { - if(I < *y) + if(I & 1) { - z->a ^= x->b; - z->b ^= x->a; - z->a ^= x->b; + uint64_t temp = x->a; + z->a = x->b; + z->b = temp; } } #define SWAP_AB \ "void swap_ab \n"\ -"(uint64_t *z, const uint64_t *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ " if (I & 1) \n"\ " { \n"\ -" z[0] ^= x[1]; \n"\ -" z[1] ^= x[0]; \n"\ -" z[0] ^= x[1]; \n"\ +" uint64_t temp = x->a; \n"\ +" z->a = x->b; \n"\ +" z->b = temp; \n"\ " } \n"\ "}" void swap_bc (swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) { + memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. + if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; if(I & 1) { - z->b ^= z->c; - z->c ^= z->b; - z->b ^= z->c; + uint64_t temp = z->d; + z->d = z->b; + z->b = temp; } else { - z->b ^= z->d; - z->d ^= z->b; - z->b ^= z->d; + uint64_t temp = z->c; + z->c = z->b; + z->b = temp; } } #define SWAP_BC \ "void swap_bc \n"\ -"(uint64_t *z, const uint64_t *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ -" if(z[1] == z[2] || z[1] == z[3] || z[0] == z[2] || z[0] == z[3] ) return; \n"\ -" z[1] ^= z[2 | (I & 1)]; \n"\ -" z[2 | (I & 1)] ^= z[1]; \n"\ -" z[1] ^= z[2 | (I & 1)]; \n"\ +" memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. \n"\ +" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ +"if(I & 1) \n"\ +" { \n"\ +" uint64_t temp = z->d; \n"\ +" z->d = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +" else \n"\ +" { \n"\ +" uint64_t temp = z->c; \n"\ +" z->c = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ "}" @@ -166,10 +177,10 @@ void hash_edge } #define HASH_EDGE \ "void hash_edge \n"\ -"(uint64_t *z, const uint64_t *x, const uint64_t *mask) \n"\ +"(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ "{ \n"\ -" (*z) = ((x[0] + x[1] + 1) * (x[0] + x[1])) / 2 & (*mask) ; \n"\ -" (*z) += x[x[0] > x[1]]; \n"\ +" (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; \n"\ +" (*z) += (x->a < x->b)? x->a: x->b; \n"\ " (*z) &= (*mask); \n"\ "}" @@ -228,9 +239,6 @@ int LAGraph_SwapEdges // [0,1,1,. . ., 0] swap a given edge. Boolean GrB_Vector swapVals = NULL; - // e x 2 Matrix that picks the edges for which we will swap values. - GrB_Matrix swapMask = NULL; - GrB_Vector ramp_v = NULL; GrB_Vector hramp_v = NULL; @@ -323,12 +331,12 @@ int LAGraph_SwapEdges LAGRAPH_INVALID_GRAPH, "G must be undirected" ) ; - + // char type[LAGRAPH_MAX_NAME_LEN]; LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, "G->nself_edges must be zero") ; - // GRB_TRY (GrB_get(A, (void*)&type, GrB_EL_TYPE_CODE)) ; - // LG_ASSERT_MSG (type == GrB_BOOL_CODE, LAGRAPH_INVALID_GRAPH, - // "A must be type boolean") ; + // GRB_TRY (GrB_get(A, type, GrB_EL_TYPE_STRING)) ; + // LG_ASSERT_MSG (MATCHNAME(type, "GrB_BOOL") || MATCHNAME(type, "bool"), LAGRAPH_INVALID_GRAPH, + // "A must be structural") ; //-------------------------------------------------------------------------- // Initializations @@ -375,12 +383,14 @@ int LAGraph_SwapEdges &add_term_biop, (GxB_binary_function) (&add_term), GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM )); - GRB_TRY (GrB_Monoid_new_UINT8( - &add_term_monoid, add_term_biop, (uint8_t) 0 - )) - // GRB_TRY (GxB_Monoid_terminal_new_UINT8( - // &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 - // )); + + // This monoid has only been designed for inputs in {0,1,2}, other behavior + // is undefined. + // (0,x) -> x, (1,1) -> 2, (2,x) -> 2 (and commutative) + // Aka (x,y) -> min(2, x + y) + GRB_TRY (GxB_Monoid_terminal_new_UINT8( + &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 + )); // Now working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 @@ -466,8 +476,6 @@ int LAGraph_SwapEdges // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. - GRB_TRY (GrB_Matrix_new (&swapMask, GrB_BOOL, e, 2)) ; - // GRB_TRY (GxB_Vector_sort ( // NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL // )) ; diff --git a/experimental/utility/LAGraph_FastBuild.c b/experimental/utility/LAGraph_FastAssign.c similarity index 74% rename from experimental/utility/LAGraph_FastBuild.c rename to experimental/utility/LAGraph_FastAssign.c index f406b30d3f..17b462002e 100755 --- a/experimental/utility/LAGraph_FastBuild.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -1,17 +1,26 @@ + //------------------------------------------------------------------------------ // LAGraph_Fast_Build: Uses saxpy methods for faster builds, especially powerful // when output is bitmap. //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -// See additional acknowledgments in the LICENSE file, -// or contact permission@sei.cmu.edu for the full terms. +// LAGraph, (c) 2019-2024 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Gabriel Gomez, Texas A&M University + +//------------------------------------------------------------------------------ #include "LG_internal.h" #include "LAGraphX.h" - +#if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) #include #undef LG_FREE_ALL #define LG_FREE_ALL \ @@ -20,10 +29,12 @@ GrB_free(&ramp); \ } -int LAGraph_Fast_Build +int LAGraph_FastAssign ( - GrB_Vector c, // Vector to be built: initialized with correct dimensions. - GrB_Vector i, // Indecies + GrB_Vector c, // Vector to be built (or assigned): initialized with correct dimensions. + GrB_Vector mask, + GrB_BinaryOp accum, + GrB_Vector i, // Indecies (duplicates allowed) GrB_Vector x, // Values // GrB_Vector ramp, // Optional (makes P load O(1)) GrB_Monoid dup, // Applied to duplicates @@ -78,7 +89,7 @@ int LAGraph_Fast_Build con->jumbled = false; GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); GRB_TRY (GrB_reduce( - c, NULL, NULL, dup, P, NULL)) ; + c, mask, accum, dup, P, NULL)) ; GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); temp = con->p; con->p = ramp; @@ -91,3 +102,4 @@ int LAGraph_Fast_Build x = temp; GrB_free(&con); } +#endif diff --git a/include/LAGraphX.h b/include/LAGraphX.h index ff79c79ff5..05fe7df31d 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -294,15 +294,17 @@ int LAGraph_Incidence_Matrix ) ; LAGRAPHX_PUBLIC -int LAGraph_Fast_Build +int LAGraph_FastAssign ( - GrB_Vector c, // Vector to be built: initialized with correct dimensions. - GrB_Vector i, // Indecies + GrB_Vector c, // Vector to be built (or assigned): initialized with correct dimensions. + GrB_Vector mask, + GrB_BinaryOp accum, + GrB_Vector i, // Indecies (duplicates allowed) GrB_Vector x, // Values // GrB_Vector ramp, // Optional (makes P load O(1)) GrB_Monoid dup, // Applied to duplicates char *msg -); +) ; //**************************************************************************** // Algorithms From 5c0edbc9e25b536c5544485dd905393f503a6c94 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 23 Feb 2025 14:10:12 -0600 Subject: [PATCH 060/115] added FastAssign demo --- .../{speed_hash_demo.c => FastAssign_demo.c} | 97 ++++++++----------- experimental/utility/LAGraph_FastAssign.c | 15 +-- 2 files changed, 50 insertions(+), 62 deletions(-) rename experimental/benchmark/{speed_hash_demo.c => FastAssign_demo.c} (66%) diff --git a/experimental/benchmark/speed_hash_demo.c b/experimental/benchmark/FastAssign_demo.c similarity index 66% rename from experimental/benchmark/speed_hash_demo.c rename to experimental/benchmark/FastAssign_demo.c index 8cdb1c321c..e52537a6df 100644 --- a/experimental/benchmark/speed_hash_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -25,9 +25,12 @@ #define LG_FREE_ALL \ { \ GrB_free (&rand_v) ; \ - GrB_free (&sort_r) ; \ + GrB_free (&build_v) ; \ GrB_free (&set_v) ; \ GrB_free (&assign_s) ; \ + GrB_free (&x) ; \ + GrB_free (&bool1) ; \ + LAGraph_Free ((void **)&rand_a, msg); \ } int main (int argc, char **argv) @@ -41,21 +44,15 @@ int main (int argc, char **argv) // start GraphBLAS and LAGraph bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; - GrB_Matrix P = NULL; - GrB_Vector rand_v = NULL, sort_r = NULL, set_v = NULL, assign_s = NULL, - ramp_v = NULL; - GrB_Index *rand_a = NULL, *ramp = NULL; + GrB_Vector rand_v = NULL, build_v = NULL, set_v = NULL, assign_s = NULL, + x = NULL; + GrB_Index *rand_a = NULL; + GrB_Scalar bool1 = NULL; bool *set_a = NULL; GrB_Index r_size = 0, ramp_size = 0, junk_size = 0; bool iso = false; LG_TRY (LAGraph_Random_Init (msg)) ; - //-------------------------------------------------------------------------- - // read in the graph: this method is defined in LAGraph_demo.h - //-------------------------------------------------------------------------- - // readproblem can read in a file in Matrix Market format, or in a binary - // format created by binwrite (see LAGraph_demo.h, or the main program, - // mtx2bin_demo). bool *val_of_P = NULL; double t = LAGraph_WallClockTime ( ) ; GrB_Index size = (argc > 1) ? atoll(argv [1]) : 1000 ; @@ -63,11 +60,11 @@ int main (int argc, char **argv) GrB_Index size_p2 = (1ull << (64-shift_e)); GrB_Index bit_mask = size_p2 - 1; GRB_TRY (GrB_Vector_new(&rand_v, GrB_UINT64, size)) ; - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, size + 1)) ; - GRB_TRY (GrB_Vector_new(&sort_r, GrB_UINT64, size)) ; + GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, size)) ; + GRB_TRY (GrB_Vector_new(&build_v, GrB_UINT64, size_p2)) ; GRB_TRY (GrB_Vector_new(&set_v, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Vector_new(&assign_s, GrB_BOOL, size_p2)) ; - GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, size_p2, size)) ; + GRB_TRY (GrB_Scalar_new(&bool1, GrB_BOOL)); LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; @@ -75,13 +72,10 @@ int main (int argc, char **argv) GRB_TRY (GrB_Vector_assign_UINT64( rand_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_assign_UINT64( - ramp_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_IndexOp_INT64( - ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - ramp_v, (void **)&ramp, &ramp_size, &iso, NULL - )) ; + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, (bool) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Scalar_setElement_BOOL(bool1, (bool) 1)); + // GRB_TRY (GrB_Vector_assign_BOOL( // assign_s, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_set (assign_s, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) @@ -89,73 +83,64 @@ int main (int argc, char **argv) GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( rand_v, NULL, NULL, GrB_BAND_UINT64, bit_mask, rand_v, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("Time to read the graph: %g sec\n", t) ; + printf ("Time to create random vector: %g sec\n", t) ; - printf ("\n==========================The input graph matrix G:\n") ; - // LG_TRY (LAGraph_Vector_Print (rand_v, LAGraph_SHORT, stdout, msg)) ; + printf ("\n==========================The input vector:\n") ; + LG_TRY (LAGraph_Vector_Print (rand_v, LAGraph_SHORT, stdout, msg)) ; //-------------------------------------------------------------------------- - // try the LAGraph_HelloWorld "algorithm" + // try Methods of building a "set" //-------------------------------------------------------------------------- + + // Baseline: Build t = LAGraph_WallClockTime ( ) ; - GRB_TRY (GxB_Vector_sort (sort_r, NULL, GrB_LT_UINT64, rand_v, NULL)) ; + GRB_TRY (GxB_Vector_build_Scalar_Vector ( + build_v, rand_v, bool1, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for GrB_Sort: %g sec\n", t) ; + printf ("Time for Build: %g sec\n", t) ; t = LAGraph_WallClockTime ( ) ; + + + // Baseline: Single Threaded random access insert GRB_TRY (GxB_Vector_unpack_Full ( rand_v, (void **)&rand_a, &r_size, &iso, NULL )) ; LAGraph_Calloc((void **)&set_a, size_p2, sizeof(bool), msg); - - int nthreads, nthreads_outer, nthreads_inner ; - LG_TRY (LAGraph_GetNumThreads (&nthreads_outer, &nthreads_inner, msg)) ; - nthreads = nthreads_outer * nthreads_inner ; - printf("%d", nthreads); - // #pragma omp parallel for num_threads(nthreads) schedule(static) for(int64_t i = 0; i < size; ++i) { set_a[rand_a[i]] = (bool) 1; } t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for Single Thread Unpack: %g sec\n", t) ; - GRB_TRY (GxB_Vector_pack_Full ( set_v, (void **)&set_a, 1ull << (64-shift_e), false, NULL )) ; + printf ("Time for Single Thread Unpack: %g sec\n", t) ; + // Baseline: GrB_assign t = LAGraph_WallClockTime ( ) ; GRB_TRY (GrB_Vector_assign_BOOL( assign_s, NULL, NULL, 1, rand_a, size, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for Assign: %g sec\n", t) ; + printf ("Time for GraphBLAS Assign: %g sec\n", t) ; + GRB_TRY (GxB_Vector_pack_Full ( + rand_v, (void **)&rand_a, r_size, iso, NULL + )) ; + + // FastAssign time! GRB_TRY (GrB_Vector_clear(assign_s)) ; t = LAGraph_WallClockTime ( ) ; - GRB_TRY (GxB_Matrix_pack_CSC( - P, &ramp, &rand_a, (void**) &val_of_P, ramp_size, - r_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_Matrix_reduce_Monoid( - assign_s, NULL, NULL, GxB_ANY_BOOL_MONOID, P, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - P, &ramp, &rand_a, (void**) &val_of_P, &ramp_size, - &r_size, &junk_size, &iso, NULL, NULL + LG_TRY (LAGraph_FastAssign( + assign_s, NULL, NULL, rand_v, x, GxB_ANY_BOOL_MONOID, msg )); t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for CSC Magic: %g sec\n", t) ; + printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; - GRB_TRY (GxB_Vector_pack_Full ( - rand_v, (void **)&rand_a, r_size, iso, NULL - )) ; - GRB_TRY (GxB_Vector_pack_Full ( - ramp_v, (void **)&ramp, ramp_size, iso, NULL - )) ; //-------------------------------------------------------------------------- - // check the results (make sure Y is a copy of G->A) + // check the results (Make sure that assign == build == FastAssign ) //-------------------------------------------------------------------------- bool isEq = 0; GRB_TRY (GrB_Vector_assign_BOOL( @@ -167,11 +152,11 @@ int main (int argc, char **argv) printf("TEST FAILED\n"); //-------------------------------------------------------------------------- - // print the results (Y is just a copy of G->A) + // print the results //-------------------------------------------------------------------------- printf ("\n===============================The result set vector:\n") ; - // GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; + GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; // GRB_TRY (GxB_fprint(assign_s, GxB_SHORT, stdout)) ; //-------------------------------------------------------------------------- // free everyting and finish diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 17b462002e..aaa2484b12 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -27,6 +27,8 @@ { \ GrB_free(&P); \ GrB_free(&ramp); \ + GrB_free(&con); \ + GrB_free(&temp); \ } int LAGraph_FastAssign @@ -41,9 +43,12 @@ int LAGraph_FastAssign char *msg ) { - GrB_Vector ramp; - GrB_Matrix P; + GrB_Vector ramp = NULL; + GrB_Matrix P = NULL; int64_t n, nrows; + GxB_Container con = NULL; + GrB_Vector temp = NULL; + bool iso; //TODO: allow user to input a ramp for faster times //TODO: assert inputs are full etc @@ -56,7 +61,7 @@ int LAGraph_FastAssign GRB_TRY (GrB_Vector_get_INT32(x, (int32_t *) &iso, GxB_ISO)); GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; - GrB_Type x_type; + GrB_Type x_type = NULL; char typename[LAGRAPH_MAX_NAME_LEN]; LG_TRY (LAGraph_Vector_TypeName(typename, x, msg)); LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; @@ -68,9 +73,7 @@ int LAGraph_FastAssign GRB_TRY (GrB_assign (ramp, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_apply (ramp, NULL, NULL, idxnum, ramp, 0, NULL)) ; // GxB_fprint(ramp, GxB_COMPLETE, stdout); - GxB_Container con; GRB_TRY (GxB_Container_new(&con)); - GrB_Vector temp; temp = con->p; con->p = ramp; ramp = temp; @@ -100,6 +103,6 @@ int LAGraph_FastAssign temp = con->x; con->x = x; x = temp; - GrB_free(&con); + LG_FREE_ALL; } #endif From cad23863dc2c24c0505e36cdc75768e04f7dfac8 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 23 Feb 2025 18:00:09 -0600 Subject: [PATCH 061/115] FastAssign fixes. Now implemented into FastSV6 --- .../algorithm/LAGraph_RichClubCoefficient.c | 55 +- experimental/algorithm/LAGraph_SwapEdges.c | 17 +- .../algorithm/LG_CC_FastSV6_SSGrB10.c | 643 ++++++++++++++++++ experimental/benchmark/FastAssign_demo.c | 9 +- experimental/test/test_RichClubCoefficient.c | 1 + experimental/utility/LAGraph_FastAssign.c | 98 ++- include/LAGraphX.h | 28 +- src/algorithm/LAGr_ConnectedComponents.c | 4 +- src/test/test_ConnectedComponents.c | 18 + 9 files changed, 796 insertions(+), 77 deletions(-) create mode 100644 experimental/algorithm/LG_CC_FastSV6_SSGrB10.c diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 99ab73495a..b1f98d6ac6 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -51,6 +51,7 @@ GrB_free(&iseq_2lt) ; \ GrB_free(&plus_2le) ; \ GrB_free(&rcCalculation) ; \ + GrB_free(&ramp_v) ; \ LAGraph_Free((void **) &index_edge, NULL) ; \ LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ @@ -140,16 +141,19 @@ int LAGraph_RichClubCoefficient // Vector of ones GrB_Vector ones_v = NULL; + // Ramp vector + GrB_Vector ramp_v = NULL; + // 2 * (x < y) + (x == y) GrB_BinaryOp iseq_2lt = NULL; // [+].[iseq_2lt] - GrB_Semiring plus_2le; + GrB_Semiring plus_2le = NULL; // 2E_K / (N_k (N_k -1)) GrB_BinaryOp rcCalculation = NULL; - GrB_Matrix A ; // G->A, the adjacency matrix + GrB_Matrix A = NULL; // G->A, the adjacency matrix // Matrix used for row reduction GrB_Matrix P = NULL; @@ -238,32 +242,40 @@ int LAGraph_RichClubCoefficient // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. GRB_TRY (GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) if(n == edge_vec_nvals) { - // GRB_TRY (GxB_Vector_unpack_Full ( - // node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; - // GRB_TRY (GxB_Vector_unpack_Full ( - // degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; - deg_x = degrees; - node_edges_x = node_edges; - deg_vec_size = n; + GRB_TRY (GxB_Vector_unpack_Full ( + node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full ( + degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; } else { GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; - #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) LG_TRY(LAGraph_Malloc( (void **) °_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; LG_TRY(LAGraph_Malloc( - (void **) °_vec_size, edge_vec_nvals, sizeof(int64_t), NULL)) ; + (void **) &node_edges_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, deg_arr, °_vec_size, degrees )) ; GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; - #else + } + #else + if(n == edge_vec_nvals) + { + deg_x = degrees; + node_edges_x = node_edges; + deg_vec_size = n; + } + else + { + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; GRB_TRY (GrB_Vector_new(°_x, GrB_BOOL, 0)) ; GRB_TRY (GrB_Vector_new(&node_edges_x, GrB_BOOL, 0)) ; GRB_TRY (GxB_Vector_extractTuples_Vector( @@ -272,18 +284,26 @@ int LAGraph_RichClubCoefficient GRB_TRY (GxB_Vector_extractTuples_Vector( NULL, node_edges_x, node_edges, NULL )) ; - #endif } + #endif + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; + GRB_TRY (GrB_Vector_assign_INT64( + ramp_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply ( + ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( - edges_per_deg, NULL, NULL, deg_x, node_edges_x, + edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, GxB_PLUS_UINT64_MONOID, msg )) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (LAGraph_FastAssign ( - verts_per_deg, NULL, NULL, deg_x, ones_v, GxB_PLUS_UINT64_MONOID, msg)) ; + verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, + GxB_PLUS_UINT64_MONOID, msg + )) ; #elif LAGRAPH_SUITESPARSE LG_TRY (LAGraph_Malloc( (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; @@ -323,7 +343,7 @@ int LAGraph_RichClubCoefficient * Cumulative sum (TODO: should be a GBLAS method!) * * GrB_cumsum(GrB_Matrix C, const GrB_Matrix mask, const GrB_BinaryOp accum, - * const GrB_Monoid monoid, GrB_Matrix A, const GrB_Descriptor desc) + * const GrB_BinaryOp plus, GrB_Matrix A, const GrB_Descriptor desc) * * By default sums rows. Returns a nearly full matrix: * [., ., 1, 1, 1, 1, ., ., 1] --> [., ., 1, 2, 3, 4, 4, 4, 5] @@ -331,7 +351,8 @@ int LAGraph_RichClubCoefficient * [., ., 1, 1, 1, 1, ., ., 1] --> [., ., 1, 2, 3, 4, ., ., 5] * * Should we be able to sum in the opposite direction? - * If Monoid is not comutative, this method should still work. + * + * If plus biop is not a monoid, this method should still work? */ GRB_TRY (GxB_Vector_unpack_CSC( edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index bbda5d4dca..1a2dc54d9f 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -591,14 +591,7 @@ int LAGraph_SwapEdges )) ; // GxB_Vector_fprint(hashed_edges, "Hashed", GxB_SHORT, stdout); // I will unpack and then reconstruct with hash as index. - GrB_Index hvn_size; - GRB_TRY(GxB_Vector_unpack_Full( - new_hashed_edges, (void **) &hash_vals_new, - &hvn_size, &iso, NULL - )) ; - GRB_TRY(GxB_Vector_unpack_Full( - hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL - )) ; + //---------------------------------------------------------------------- // Build Hash Buckets @@ -609,6 +602,14 @@ int LAGraph_SwapEdges GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, e)) ; + GrB_Index hvn_size; + GRB_TRY(GxB_Vector_unpack_Full( + new_hashed_edges, (void **) &hash_vals_new, + &hvn_size, &iso, NULL + )) ; + GRB_TRY(GxB_Vector_unpack_Full( + hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL + )) ; GRB_TRY (GxB_Matrix_pack_CSC( hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, perm_size, sizeof(bool), true, false, NULL diff --git a/experimental/algorithm/LG_CC_FastSV6_SSGrB10.c b/experimental/algorithm/LG_CC_FastSV6_SSGrB10.c new file mode 100644 index 0000000000..69aa2cb0b9 --- /dev/null +++ b/experimental/algorithm/LG_CC_FastSV6_SSGrB10.c @@ -0,0 +1,643 @@ +//------------------------------------------------------------------------------ +// LG_CC_FastSV6_SSGrB10: connected components +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Yongzhe Zhang, modified by Timothy A. Davis, Texas A&M +// University, and Gabriel Gomez, Texas A&M University. + +//------------------------------------------------------------------------------ + +// This is an Advanced algorithm (G->is_symmetric_structure must be known), +// but it is not user-callable (see LAGr_ConnectedComponents instead). + +// Code is based on the algorithm described in the following paper: +// Zhang, Azad, Hu. FastSV: A Distributed-Memory Connected Component +// Algorithm with Fast Convergence (SIAM PP20) + +// A subsequent update to the algorithm is here (which might not be reflected +// in this code): +// Yongzhe Zhang, Ariful Azad, Aydin Buluc: Parallel algorithms for finding +// connected components using linear algebra. J. Parallel Distributed Comput. +// 144: 14-27 (2020). + +// Modified by Tim Davis, Texas A&M University: revised Reduce_assign to use +// purely GrB* and GxB* methods and the matrix C. Added warmup phase. Changed +// to use GxB pack/unpack instead of GxB import/export. Converted to use the +// LAGraph_Graph object. Exploiting iso status for the temporary matrices +// C and T. + +// Modified by Gabriel Gomez, Texas A&M University: revised Reduce_assign to use +// GrB and GxB and LAGraph methods, with opaque GrB_Vector inputs. + +// The input graph G must be undirected, or directed and with an adjacency +// matrix that has a symmetric structure. Self-edges (diagonal entries) are +// OK, and are ignored. The values and type of A are ignored; just its +// structure is accessed. + +// NOTE: This function must not be called by multiple user threads at the same +// time on the same graph G, since it unpacks G->A and then packs it back when +// done. G->A is unchanged when the function returns, but during execution +// G->A is empty. This will be fixed once the todos are finished below, and +// G->A will then become a truly read-only object (assuming GrB_wait (G->A) +// has been done first). + +#define __STDC_WANT_LIB_EXT1__ 1 +#include + +#define LG_FREE_ALL ; +#include "LG_internal.h" +#include "LAGraphX.h" + +#if LAGRAPH_SUITESPARSE && GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + +//============================================================================== +// fastsv: find the components of a graph +//============================================================================== + +static inline GrB_Info fastsv +( + GrB_Matrix A, // adjacency matrix, G->A or a subset of G->A + GrB_Vector parent, // parent vector + GrB_Vector mngp, // min neighbor grandparent + GrB_Vector *gp, // grandparent + GrB_Vector *gp_new, // new grandparent (swapped with gp) + GrB_Vector t, // workspace + GrB_Vector ramp, // ramp = [0:n] size n + 1 + GrB_BinaryOp eq, // GrB_EQ_(integer type) + GrB_BinaryOp min, // GrB_MIN_(integer type) + GrB_Semiring min_2nd, // GrB_MIN_SECOND_(integer type) + GrB_Monoid min_m, // GrB_MIN_MONOID_(integer type) + char *msg +) +{ + bool done = false; + while (true) + { + + //---------------------------------------------------------------------- + // hooking & shortcutting + //---------------------------------------------------------------------- + + // mngp = min (mngp, A*gp) using the MIN_SECOND semiring + GRB_TRY (GrB_mxv (mngp, NULL, min, min_2nd, A, *gp, NULL)) ; + + //---------------------------------------------------------------------- + // parent = min (parent, C*mngp) where C(i,j) is present if i=parent(j) + //---------------------------------------------------------------------- + + // This function computes the following, which is done explicitly in the + // Reduce_assign function in LG_CC_Boruvka: + // + // for (j = 0 ; j < n ; j++) + // { + // uint64_t i = Px [j] ; + // parent [i] = min (parent [i], mngp [j]) ; + // } + // + // If C(i,j) is present where i == Px [j], then this can be written as: + // + // parent = min (parent, C*mngp) + + LG_TRY (LAGraph_FastAssign( + parent, NULL, min, parent, mngp, ramp, min_m, msg)) ; + + //---------------------------------------------------------------------- + // parent = min (parent, mngp, gp) + //---------------------------------------------------------------------- + + GRB_TRY (GrB_eWiseAdd (parent, NULL, min, min, mngp, *gp, NULL)) ; + + //---------------------------------------------------------------------- + // calculate grandparent: gp_new = parent (parent) + //---------------------------------------------------------------------- + GRB_TRY (GrB_extract (*gp_new, NULL, NULL, parent, parent, NULL)) ; + + //---------------------------------------------------------------------- + // terminate if gp and gp_new are the same + //---------------------------------------------------------------------- + + GRB_TRY (GrB_eWiseMult (t, NULL, NULL, eq, *gp_new, *gp, NULL)) ; + GRB_TRY (GrB_reduce (&done, NULL, GrB_LAND_MONOID_BOOL, t, NULL)) ; + if (done) break ; + + // swap gp and gp_new + GrB_Vector s = (*gp) ; (*gp) = (*gp_new) ; (*gp_new) = s ; + } + return (GrB_SUCCESS) ; +} + +//============================================================================== +// LG_CC_FastSV6 +//============================================================================== + +// The output of LG_CC_FastSV* is a vector component, where component(i)=r if +// node i is in the connected compononent whose representative is node r. If r +// is a representative, then component(r)=r. The number of connected +// components in the graph G is the number of representatives. + +#undef LG_FREE_WORK +#define LG_FREE_WORK \ +{ \ + LAGraph_Free ((void **) &Tp, NULL) ; \ + LAGraph_Free ((void **) &Tj, NULL) ; \ + LAGraph_Free ((void **) &Tx, NULL) ; \ + LAGraph_Free ((void **) &Px, NULL) ; \ + LAGraph_Free ((void **) &ht_key, NULL) ; \ + LAGraph_Free ((void **) &ht_count, NULL) ; \ + LAGraph_Free ((void **) &count, NULL) ; \ + LAGraph_Free ((void **) &range, NULL) ; \ + GrB_free (&T) ; \ + GrB_free (&t) ; \ + GrB_free (&y) ; \ + GrB_free (&gp) ; \ + GrB_free (&mngp) ; \ + GrB_free (&gp_new) ; \ + GrB_free (&ramp_v) ; \ +} + +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + LG_FREE_WORK ; \ + GrB_free (&parent) ; \ +} + +#endif + +int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions +( + // output: + GrB_Vector *component, // component(i)=r if node is in the component r + // input: + LAGraph_Graph G, // input graph (modified then restored) + char *msg +) +{ + +#if !LAGRAPH_SUITESPARSE || GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) + LG_ASSERT (false, GrB_NOT_IMPLEMENTED) ; +#else + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + LG_CLEAR_MSG ; + + int64_t *range = NULL ; + GrB_Index n, nvals, *ht_key = NULL, *Px = NULL, + *count = NULL, *Tp = NULL, *Tj = NULL ; + GrB_Vector parent = NULL, gp_new = NULL, mngp = NULL, gp = NULL, t = NULL, + y = NULL, ramp_v = NULL; + GrB_Matrix T = NULL; + void *Tx = NULL; + int *ht_count = NULL ; + + LG_TRY (LAGraph_CheckGraph (G, msg)) ; + LG_ASSERT (component != NULL, GrB_NULL_POINTER) ; + (*component) = NULL ; + + LG_ASSERT_MSG ((G->kind == LAGraph_ADJACENCY_UNDIRECTED || + (G->kind == LAGraph_ADJACENCY_DIRECTED && + G->is_symmetric_structure == LAGraph_TRUE)), + LAGRAPH_SYMMETRIC_STRUCTURE_REQUIRED, + "G->A must be known to be symmetric") ; + + //-------------------------------------------------------------------------- + // initializations + //-------------------------------------------------------------------------- + + GrB_Matrix A = G->A ; + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; + GRB_TRY (GrB_Matrix_nvals (&nvals, A)) ; + + // determine the integer type, operators, and semirings to use + GrB_Type Uint, Int ; + GrB_IndexUnaryOp ramp ; + GrB_Semiring min_2nd, min_2ndi ; + GrB_BinaryOp min, eq, imin ; + GrB_Monoid min_m; + #ifdef COVERAGE + // Just for test coverage, use 64-bit ints for n > 100. Do not use this + // rule in production! + #define NBIG 100 + #else + // For production use: 64-bit integers if n > 2^31 + #define NBIG INT32_MAX + #endif + if (n > NBIG) + { + // use 64-bit integers throughout + Uint = GrB_UINT64 ; + Int = GrB_INT64 ; + ramp = GrB_ROWINDEX_INT64 ; + min = GrB_MIN_UINT64 ; + min_m = GrB_MIN_MONOID_UINT64; + imin = GrB_MIN_INT64 ; + eq = GrB_EQ_UINT64 ; + min_2nd = GrB_MIN_SECOND_SEMIRING_UINT64 ; + min_2ndi = GxB_MIN_SECONDI_INT64 ; + } + else + { + // use 32-bit integers, except for Px and for constructing the matrix C + Uint = GrB_UINT32 ; + Int = GrB_INT32 ; + ramp = GrB_ROWINDEX_INT32 ; + min = GrB_MIN_UINT32 ; + min_m = GrB_MIN_MONOID_UINT32; + imin = GrB_MIN_INT32 ; + eq = GrB_EQ_UINT32 ; + min_2nd = GrB_MIN_SECOND_SEMIRING_UINT32 ; + min_2ndi = GxB_MIN_SECONDI_INT32 ; + } + + // FASTSV_SAMPLES: number of samples to take from each row A(i,:). + // Sampling is used if the average degree is > 8 and if n > 1024. + #define FASTSV_SAMPLES 4 + bool sampling = (nvals > n * FASTSV_SAMPLES * 2 && n > 1024) ; + +// [ todo: nthreads will not be needed once GxB_select with a GxB_RankUnaryOp +// and a new GxB_extract are added to SuiteSparse:GraphBLAS. + // determine # of threads to use + int nthreads, nthreads_outer, nthreads_inner ; + LG_TRY (LAGraph_GetNumThreads (&nthreads_outer, &nthreads_inner, msg)) ; + nthreads = nthreads_outer * nthreads_inner ; + nthreads = LAGRAPH_MIN (nthreads, n / 16) ; + nthreads = LAGRAPH_MAX (nthreads, 1) ; +// ] + + LG_TRY (LAGraph_Malloc ((void **) &Px, n, sizeof (GrB_Index), msg)) ; + + // create Cp = 0:n (always 64-bit) and the empty C matrix + GRB_TRY (GrB_Vector_new (&ramp_v, GrB_INT64, n+1)) ; + GRB_TRY (GrB_assign (ramp_v, NULL, NULL, 0, GrB_ALL, n+1, NULL)) ; + GRB_TRY (GrB_apply ( + ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + + //-------------------------------------------------------------------------- + // warmup: parent = min (0:n-1, A*1) using the MIN_SECONDI semiring + //-------------------------------------------------------------------------- + + // y (i) = min (i, j) for all entries A(i,j). This warmup phase takes only + // O(n) time, because of how the MIN_SECONDI semiring is implemented in + // SuiteSparse:GraphBLAS. A is held by row, and the first entry in A(i,:) + // is the minimum index j, so only the first entry in A(i,:) needs to be + // considered for each row i. + + GRB_TRY (GrB_Vector_new (&t, Int, n)) ; + GRB_TRY (GrB_Vector_new (&y, Int, n)) ; + GRB_TRY (GrB_assign (t, NULL, NULL, 0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_assign (y, NULL, NULL, 0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_apply (y, NULL, NULL, ramp, y, 0, NULL)) ; + GRB_TRY (GrB_mxv (y, NULL, imin, min_2ndi, A, t, NULL)) ; + GRB_TRY (GrB_free (&t)) ; + + // The typecast from Int to Uint is required because the ROWINDEX operator + // and MIN_SECONDI do not work in the UINT* domains, as built-in operators. + // parent = (Uint) y + GRB_TRY (GrB_Vector_new (&parent, Uint, n)) ; + GRB_TRY (GrB_assign (parent, NULL, NULL, y, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_free (&y)) ; + + // copy parent into gp, mngp, and Px. Px is a non-opaque 64-bit copy of the + // parent GrB_Vector. The Px array is always of type GrB_Index since it + // must be used as the input array for extractTuples and as Ci for pack_CSR. + // If parent is uint32, GraphBLAS typecasts it to the uint64 Px array. + GRB_TRY (GrB_Vector_dup (&gp, parent)) ; + GRB_TRY (GrB_Vector_dup (&mngp, parent)) ; + GRB_TRY (GrB_Vector_new (&gp_new, Uint, n)) ; + GRB_TRY (GrB_Vector_new (&t, GrB_BOOL, n)) ; + + //-------------------------------------------------------------------------- + // sample phase + //-------------------------------------------------------------------------- + + if (sampling) + { + +// [ todo: GxB_select, using a new operator: GxB_RankUnaryOp, will do all this, +// with GxB_Matrix_select_RankOp_Scalar with operator GxB_LEASTRANK and a +// GrB_Scalar input equal to FASTSV_SAMPLES. Built-in operators will be, +// (where y is INT64): +// +// GxB_LEASTRANK (aij, i, j, k, d, y): select if aij has rank k <= y +// GxB_NLEASTRANK: select if aij has rank k > y +// GxB_GREATESTRANK (...) select if aij has rank k >= (d-y) where +// d = # of entries in A(i,:). +// GxB_NGREATESTRANK (...): select if aij has rank k < (d-y) +// and perhaps other operators such as: +// GxB_LEASTRELRANK (...): select aij if rank k <= y*d where y is double +// GxB_GREATESTRELRANK (...): select aij rank k > y*d where y is double +// +// By default, the rank of aij is its relative position as the kth entry in its +// row (from "left" to "right"). If a new GxB setting in the descriptor is +// set, then k is the relative position of aij as the kth entry in its column. +// The default would be that the rank is the position of aij in its row A(i,:). + +// Other: +// give me 3 random items from the row (y = 3) +// give me the 4 biggest *values* in each row (y = 4) + +// mxv: +// C = A*diag(D) + + //---------------------------------------------------------------------- + // unpack A in CSR format + //---------------------------------------------------------------------- + + void *Ax ; + GrB_Index *Ap, *Aj, Ap_size, Aj_size, Ax_size ; + bool A_jumbled, A_iso ; + GRB_TRY (GxB_Matrix_unpack_CSR (A, &Ap, &Aj, &Ax, + &Ap_size, &Aj_size, &Ax_size, &A_iso, &A_jumbled, NULL)) ; + + //---------------------------------------------------------------------- + // allocate workspace, including space to construct T + //---------------------------------------------------------------------- + + GrB_Index Tp_size = (n+1) * sizeof (GrB_Index) ; + GrB_Index Tj_size = nvals * sizeof (GrB_Index) ; + GrB_Index Tx_size = sizeof (bool) ; + LG_TRY (LAGraph_Malloc ((void **) &Tp, n+1, sizeof (GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void **) &Tj, nvals, sizeof (GrB_Index), + msg)) ; + LG_TRY (LAGraph_Calloc ((void **) &Tx, 1, sizeof (bool), msg)) ; + LG_TRY (LAGraph_Malloc ((void **) &range, nthreads + 1, + sizeof (int64_t), msg)) ; + LG_TRY (LAGraph_Calloc ((void **) &count, nthreads + 1, + sizeof (GrB_Index), msg)) ; + + //---------------------------------------------------------------------- + // define parallel tasks to construct T + //---------------------------------------------------------------------- + + // thread tid works on rows range[tid]:range[tid+1]-1 of A and T + int tid; + for (tid = 0 ; tid <= nthreads ; tid++) + { + range [tid] = (n * tid + nthreads - 1) / nthreads ; + } + + //---------------------------------------------------------------------- + // determine the number entries to be constructed in T for each thread + //---------------------------------------------------------------------- + + #pragma omp parallel for num_threads(nthreads) schedule(static) + for (tid = 0 ; tid < nthreads ; tid++) + { + for (int64_t i = range [tid] ; i < range [tid+1] ; i++) + { + int64_t deg = Ap [i + 1] - Ap [i] ; + count [tid + 1] += LAGRAPH_MIN (FASTSV_SAMPLES, deg) ; + } + } + + //---------------------------------------------------------------------- + // count = cumsum (count) + //---------------------------------------------------------------------- + + for (tid = 0 ; tid < nthreads ; tid++) + { + count [tid + 1] += count [tid] ; + } + + //---------------------------------------------------------------------- + // construct T + //---------------------------------------------------------------------- + + // T (i,:) consists of the first FASTSV_SAMPLES of A (i,:). + + #pragma omp parallel for num_threads(nthreads) schedule(static) + for (tid = 0 ; tid < nthreads ; tid++) + { + GrB_Index p = count [tid] ; + Tp [range [tid]] = p ; + for (int64_t i = range [tid] ; i < range [tid+1] ; i++) + { + // construct T (i,:) from the first entries in A (i,:) + for (int64_t j = 0 ; + j < FASTSV_SAMPLES && Ap [i] + j < Ap [i + 1] ; j++) + { + Tj [p++] = Aj [Ap [i] + j] ; + } + Tp [i + 1] = p ; + } + } + + //---------------------------------------------------------------------- + // import the result into the GrB_Matrix T + //---------------------------------------------------------------------- + + GRB_TRY (GrB_Matrix_new (&T, GrB_BOOL, n, n)) ; + GRB_TRY (GxB_Matrix_pack_CSR (T, &Tp, &Tj, &Tx, Tp_size, Tj_size, + Tx_size, /* T is iso: */ true, A_jumbled, NULL)) ; + +// ] todo: the above will all be done as a single call to GxB_select. + + //---------------------------------------------------------------------- + // find the connected components of T + //---------------------------------------------------------------------- + + LG_TRY (fastsv (T, parent, mngp, &gp, &gp_new, t, ramp_v, eq, min, + min_2nd, min_m, msg)) ; + // update Px + GRB_TRY (GrB_Vector_extractTuples (NULL, Px, &n, parent)) ; + + //---------------------------------------------------------------------- + // use sampling to estimate the largest connected component in T + //---------------------------------------------------------------------- + + // The sampling below computes an estimate of the mode of the parent + // vector, the contents of which are currently in the non-opaque Px + // array. + + // hash table size must be a power of 2 + #define HASH_SIZE 1024 + // number of samples to insert into the hash table + #define HASH_SAMPLES 864 + #define HASH(x) (((x << 4) + x) & (HASH_SIZE-1)) + #define NEXT(x) ((x + 23) & (HASH_SIZE-1)) + + // allocate and initialize the hash table + LG_TRY (LAGraph_Malloc ((void **) &ht_key, HASH_SIZE, + sizeof (GrB_Index), msg)) ; + LG_TRY (LAGraph_Calloc ((void **) &ht_count, HASH_SIZE, + sizeof (int), msg)) ; + for (int k = 0 ; k < HASH_SIZE ; k++) + { + ht_key [k] = UINT64_MAX ; + } + + // hash the samples and find the most frequent entry + uint64_t seed = n ; // random number seed + int64_t key = -1 ; // most frequent entry + int max_count = 0 ; // frequency of most frequent entry + for (int64_t k = 0 ; k < HASH_SAMPLES ; k++) + { + // select an entry from Px at random + GrB_Index x = Px [LG_Random60 (&seed) % n] ; + // find x in the hash table + GrB_Index h = HASH (x) ; + while (ht_key [h] != UINT64_MAX && ht_key [h] != x) h = NEXT (h) ; + // add x to the hash table + ht_key [h] = x ; + ht_count [h]++ ; + // keep track of the most frequent value + if (ht_count [h] > max_count) + { + key = ht_key [h] ; + max_count = ht_count [h] ; + } + } + + //---------------------------------------------------------------------- + // compact the largest connected component in A + //---------------------------------------------------------------------- + + // Construct a new matrix T from the input matrix A (the matrix A is + // not changed). The key node is the representative of the (estimated) + // largest component. T is constructed as a copy of A, except: + // (1) all edges A(i,:) for nodes i in the key component deleted, and + // (2) for nodes i not in the key component, A(i,j) is deleted if + // j is in the key component. + // (3) If A(i,:) has any deletions from (2), T(i,key) is added to T. + +// [ todo: replace this with GxB_extract with GrB_Vector index arrays. +// See https://github.com/GraphBLAS/graphblas-api-c/issues/67 . +// This method will not insert the new entries T(i,key) for rows i that have +// had entries deleted. That can be done with GrB_assign, with an n-by-1 mask +// M computed from the before-and-after row degrees of A and T: +// M = (parent != key) && (out_degree(T) < out_degree(A)) +// J [0] = key. +// GxB_Matrix_subassign_BOOL (T, M, NULL, true, GrB_ALL, n, J, 1, NULL) +// or with +// GrB_Col_assign (T, M, NULL, t, GrB_ALL, j, NULL) with an all-true +// vector t. + + // unpack T to reuse the space (all content is overwritten below) + bool T_jumbled, T_iso ; + GRB_TRY (GxB_Matrix_unpack_CSR (T, &Tp, &Tj, &Tx, &Tp_size, &Tj_size, + &Tx_size, &T_iso, &T_jumbled, NULL)) ; + #pragma omp parallel for num_threads(nthreads) schedule(static) + for (tid = 0 ; tid < nthreads ; tid++) + { + GrB_Index p = Ap [range [tid]] ; + // thread tid scans A (range [tid]:range [tid+1]-1,:), + // and constructs T(i,:) for all rows in this range. + for (int64_t i = range [tid] ; i < range [tid+1] ; i++) + { + int64_t pi = Px [i] ; // pi = parent (i) + Tp [i] = p ; // start the construction of T(i,:) + // T(i,:) is empty if pi == key + if (pi != key) + { + // scan A(i,:) + for (GrB_Index pS = Ap [i] ; pS < Ap [i+1] ; pS++) + { + // get A(i,j) + int64_t j = Aj [pS] ; + if (Px [j] != key) + { + // add the entry T(i,j) to T, but skip it if + // Px [j] is equal to key + Tj [p++] = j ; + } + } + // Add the entry T(i,key) if there is room for it in T(i,:); + // if and only if node i is adjacent to a node j in the + // largest component. The only way there can be space if + // at least one T(i,j) appears with Px [j] equal to the key + // (that is, node j is in the largest connected component, + // key == Px [j]. One of these j's can then be replaced + // with the key. If node i is not adjacent to any node in + // the largest component, then there is no space in T(i,:) + // and no new edge to the largest component is added. + if (p - Tp [i] < Ap [i+1] - Ap [i]) + { + Tj [p++] = key ; + } + } + } + // count the number of entries inserted into T by this thread + count [tid] = p - Tp [range [tid]] ; + } + + // Compact empty space out of Tj not filled in from the above phase. + nvals = 0 ; + for (tid = 0 ; tid < nthreads ; tid++) + { + memmove (Tj + nvals, + Tj + Tp [range [tid]], sizeof (GrB_Index) * count [tid]) ; + nvals += count [tid] ; + count [tid] = nvals - count [tid] ; + } + + // Compact empty space out of Tp + #pragma omp parallel for num_threads(nthreads) schedule(static) + for (tid = 0 ; tid < nthreads ; tid++) + { + GrB_Index p = Tp [range [tid]] ; + for (int64_t i = range [tid] ; i < range [tid+1] ; i++) + { + Tp [i] -= p - count [tid] ; + } + } + + // finalize T + Tp [n] = nvals ; + + // pack T for the final phase + GRB_TRY (GxB_Matrix_pack_CSR (T, &Tp, &Tj, &Tx, Tp_size, Tj_size, + Tx_size, T_iso, /* T is now jumbled */ true, NULL)) ; + + // pack A (unchanged since last unpack); this is the original G->A. + GRB_TRY (GxB_Matrix_pack_CSR (A, &Ap, &Aj, &Ax, Ap_size, Aj_size, + Ax_size, A_iso, A_jumbled, NULL)) ; + +// ]. The unpack/pack of A into Ap, Aj, Ax will not be needed, and G->A +// will become truly a read-only matrix. + + // final phase uses the pruned matrix T + A = T ; + } + + //-------------------------------------------------------------------------- + // check for quick return + //-------------------------------------------------------------------------- + + // The sample phase may have already found that G->A has a single component, + // in which case the matrix A is now empty. + + if (nvals == 0) + { + (*component) = parent ; + LG_FREE_WORK ; + return (GrB_SUCCESS) ; + } + + //-------------------------------------------------------------------------- + // final phase + //-------------------------------------------------------------------------- + + LG_TRY (fastsv (A, parent, mngp, &gp, &gp_new, t, ramp_v, eq, min, min_2nd, + min_m, msg)) ; + + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + (*component) = parent ; + LG_FREE_WORK ; + return (GrB_SUCCESS) ; +#endif +} diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index e52537a6df..be72dbc259 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -19,7 +19,7 @@ #include "../../src/benchmark/LAGraph_demo.h" #include "LAGraphX.h" #include "LG_internal.h" - +#if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) // LG_FREE_ALL is required by LG_TRY #undef LG_FREE_ALL #define LG_FREE_ALL \ @@ -76,8 +76,6 @@ int main (int argc, char **argv) x, NULL, NULL, (bool) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Scalar_setElement_BOOL(bool1, (bool) 1)); - // GRB_TRY (GrB_Vector_assign_BOOL( - // assign_s, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY(GrB_set (assign_s, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) LG_TRY (LAGraph_Random_Seed(rand_v, 1548945616ul, msg)) ; GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( @@ -130,11 +128,11 @@ int main (int argc, char **argv) rand_v, (void **)&rand_a, r_size, iso, NULL )) ; - // FastAssign time! + // FastAssign! GRB_TRY (GrB_Vector_clear(assign_s)) ; t = LAGraph_WallClockTime ( ) ; LG_TRY (LAGraph_FastAssign( - assign_s, NULL, NULL, rand_v, x, GxB_ANY_BOOL_MONOID, msg + assign_s, NULL, NULL, rand_v, x, NULL, GxB_ANY_BOOL_MONOID, msg )); t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; @@ -167,3 +165,4 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Random_Finalize (msg)) ; return (GrB_SUCCESS) ; } +#endif diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index f62178d598..1cd139d0e7 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -159,6 +159,7 @@ void test_RichClubCoefficient (void) printf ("RCC computation begins:\n") ; GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; OK(LAGraph_RichClubCoefficient( &rcc, G, msg)); + printf("%s\n", msg); GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("RCC computation ends:\n") ; diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index aaa2484b12..972eec3996 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -26,63 +26,86 @@ #define LG_FREE_ALL \ { \ GrB_free(&P); \ - GrB_free(&ramp); \ + GrB_free(&ramp_loc); \ GrB_free(&con); \ - GrB_free(&temp); \ + LAGraph_Free(&ramp_a, msg); \ } int LAGraph_FastAssign ( - GrB_Vector c, // Vector to be built (or assigned): initialized with correct dimensions. - GrB_Vector mask, - GrB_BinaryOp accum, - GrB_Vector i, // Indecies (duplicates allowed) - GrB_Vector x, // Values - // GrB_Vector ramp, // Optional (makes P load O(1)) - GrB_Monoid dup, // Applied to duplicates + // output + // Vector to be built (or assigned): initialized with correct dimensions. + GrB_Vector c, + // inputs + const GrB_Vector mask, + const GrB_BinaryOp accum, + const GrB_Vector i, // Indecies (duplicates allowed) + const GrB_Vector x, // Values + // Optional (Give me a ramp with size > x.size for faster calculations) + const GrB_Vector ramp, + const GrB_Monoid dup, // Applied to duplicates char *msg ) { - GrB_Vector ramp = NULL; + // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector + // to be sure it remains completely unchanged? + GrB_Vector ramp_loc = NULL; GrB_Matrix P = NULL; int64_t n, nrows; GxB_Container con = NULL; - GrB_Vector temp = NULL; + void *ramp_a = NULL; + int ramp_h = 0; + int64_t ramp_n = 0, ramp_size = 0; - bool iso; - //TODO: allow user to input a ramp for faster times - //TODO: assert inputs are full etc + bool iso = false; + //TODO: assert inputs are full etc. LG_ASSERT (c != NULL, GrB_NULL_POINTER); LG_ASSERT (i != NULL, GrB_NULL_POINTER); LG_ASSERT (x != NULL, GrB_NULL_POINTER); + LG_ASSERT_MSG (c != x, GrB_NOT_IMPLEMENTED, "c cannot be aliased with x."); GRB_TRY (GrB_Vector_size(&n, i)); GRB_TRY (GrB_Vector_size(&nrows, c)); GRB_TRY (GrB_Vector_get_INT32(x, (int32_t *) &iso, GxB_ISO)); - GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; GrB_Type x_type = NULL; char typename[LAGRAPH_MAX_NAME_LEN]; LG_TRY (LAGraph_Vector_TypeName(typename, x, msg)); LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; + GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; GrB_IndexUnaryOp idxnum = (n <= INT32_MAX)? - GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; - GRB_TRY (GrB_Vector_new(&ramp, ramp_type, n + 1)); + GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; + GRB_TRY (GrB_Vector_new(&ramp_loc, ramp_type, n + 1)); + if(ramp == NULL) + { + + GRB_TRY (GrB_assign (ramp_loc, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply (ramp_loc, NULL, NULL, idxnum, ramp_loc, 0, NULL)) ; + } + else + { + GRB_TRY (GxB_Vector_unload( + ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; + LG_ASSERT (ramp_n > n, GrB_DIMENSION_MISMATCH); + GRB_TRY (GxB_Vector_load( + ramp_loc, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), + GxB_IS_READONLY, NULL)) ; + } GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); - GRB_TRY (GrB_assign (ramp, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_apply (ramp, NULL, NULL, idxnum, ramp, 0, NULL)) ; - // GxB_fprint(ramp, GxB_COMPLETE, stdout); + // GxB_fprint(ramp_loc, GxB_COMPLETE, stdout); GRB_TRY (GxB_Container_new(&con)); - temp = con->p; - con->p = ramp; - ramp = temp; - temp = con->i; - con->i = i; - i = temp; - temp = con->x; + GRB_TRY (GrB_free(&con->p)) ; + GRB_TRY (GrB_free(&con->i)) ; + GRB_TRY (GrB_free(&con->x)) ; + con->p = ramp_loc; + if (c == i) + { + GRB_TRY (GrB_Vector_dup(&con->i, i)) ; + } + else + con->i = i; con->x = x; - x = temp; con->format = GxB_SPARSE; con->orientation = GrB_COLMAJOR; con->nrows = nrows; @@ -94,15 +117,16 @@ int LAGraph_FastAssign GRB_TRY (GrB_reduce( c, mask, accum, dup, P, NULL)) ; GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); - temp = con->p; - con->p = ramp; - ramp = temp; - temp = con->i; - con->i = i; - i = temp; - temp = con->x; - con->x = x; - x = temp; + // Don't let inputs get freed + con->p = NULL; + if (c != i) + con->i = NULL; + con->x = NULL; + if (ramp) + { + GRB_TRY (GxB_Vector_load( + ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; + } LG_FREE_ALL; } #endif diff --git a/include/LAGraphX.h b/include/LAGraphX.h index d2d4bed69a..f0f66ceda4 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -296,16 +296,19 @@ int LAGraph_Incidence_Matrix LAGRAPHX_PUBLIC int LAGraph_FastAssign ( - GrB_Vector c, // Vector to be built (or assigned): initialized with correct dimensions. - GrB_Vector mask, - GrB_BinaryOp accum, - GrB_Vector i, // Indecies (duplicates allowed) - GrB_Vector x, // Values - // GrB_Vector ramp, // Optional (makes P load O(1)) - GrB_Monoid dup, // Applied to duplicates + // output + // Vector to be built (or assigned): initialized with correct dimensions. + GrB_Vector c, + // inputs + const GrB_Vector mask, + const GrB_BinaryOp accum, + const GrB_Vector i, // Indecies (duplicates allowed) + const GrB_Vector x, // Values + // Optional (Give me a ramp with size > x.size for faster calculations) + const GrB_Vector ramp, + const GrB_Monoid dup, // Applied to duplicates char *msg ) ; - //**************************************************************************** // Algorithms //**************************************************************************** @@ -1392,6 +1395,15 @@ int LAGraph_SwapEdges LAGraph_Graph G, GrB_Index Q, // Swaps per edge char *msg +) ; + +int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions +( + // output: + GrB_Vector *component, // component(i)=r if node is in the component r + // input: + LAGraph_Graph G, // input graph (modified then restored) + char *msg ); #if defined ( __cplusplus ) diff --git a/src/algorithm/LAGr_ConnectedComponents.c b/src/algorithm/LAGr_ConnectedComponents.c index ee0b875d1c..b86f88b3c8 100644 --- a/src/algorithm/LAGr_ConnectedComponents.c +++ b/src/algorithm/LAGr_ConnectedComponents.c @@ -32,8 +32,8 @@ int LAGr_ConnectedComponents char *msg ) { - - #if LAGRAPH_SUITESPARSE + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + #elif LAGRAPH_SUITESPARSE return (LG_CC_FastSV6 (component, G, msg)) ; #else return (LG_CC_Boruvka (component, G, msg)) ; diff --git a/src/test/test_ConnectedComponents.c b/src/test/test_ConnectedComponents.c index 73bceff3d6..a4a88d1ae1 100644 --- a/src/test/test_ConnectedComponents.c +++ b/src/test/test_ConnectedComponents.c @@ -132,6 +132,14 @@ void test_cc_matrices (void) TEST_CHECK (ncomponents == ncomp) ; OK (LG_check_cc (C2, G, msg)) ; OK (GrB_free (&C2)) ; + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + printf ("\n------ CC_FastSV6_SSGrB_v10:\n") ; + OK (LG_CC_FastSV6_SSGrB10 (&C2, G, msg)) ; + ncomponents = count_connected_components (C2) ; + TEST_CHECK (ncomponents == ncomp) ; + OK (LG_check_cc (C2, G, msg)) ; + OK (GrB_free (&C2)) ; + #endif #endif // find the connected components with LG_CC_Boruvka @@ -189,7 +197,12 @@ void test_cc_errors (void) #if LAGRAPH_SUITESPARSE result = LG_CC_FastSV6 (NULL, NULL, msg) ; TEST_CHECK (result == GrB_NULL_POINTER) ; + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + result = LG_CC_FastSV6_SSGrB10 (NULL, NULL, msg) ; + TEST_CHECK (result == GrB_NULL_POINTER) ; #endif + #endif + // load a valid matrix FILE *f = fopen (LG_DATA_DIR "LFAT5_two.mtx", "r") ; @@ -208,6 +221,11 @@ void test_cc_errors (void) result = LG_CC_FastSV6 (&C, G, msg) ; TEST_CHECK (result == -1001) ; printf ("result expected: %d msg:\n%s\n", result, msg) ; + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + result = LG_CC_FastSV6_SSGrB10 (&C, G, msg) ; + TEST_CHECK (result == -1001) ; + printf ("result expected: %d msg:\n%s\n", result, msg) ; + #endif #endif OK (LAGraph_Finalize (msg)) ; From 9e5f73666dec647cd7adb9adaee214c25806971a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 23 Feb 2025 19:05:38 -0600 Subject: [PATCH 062/115] Fixed #if's --- experimental/benchmark/FastAssign_demo.c | 18 +++++++++--------- src/algorithm/LAGr_ConnectedComponents.c | 3 +-- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index be72dbc259..fcfe294645 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -19,7 +19,6 @@ #include "../../src/benchmark/LAGraph_demo.h" #include "LAGraphX.h" #include "LG_internal.h" -#if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) // LG_FREE_ALL is required by LG_TRY #undef LG_FREE_ALL #define LG_FREE_ALL \ @@ -90,20 +89,19 @@ int main (int argc, char **argv) // try Methods of building a "set" //-------------------------------------------------------------------------- - + GRB_TRY (GxB_Vector_unpack_Full ( + rand_v, (void **)&rand_a, &r_size, &iso, NULL + )) ; // Baseline: Build t = LAGraph_WallClockTime ( ) ; - GRB_TRY (GxB_Vector_build_Scalar_Vector ( - build_v, rand_v, bool1, NULL)) ; + GRB_TRY (GxB_Vector_build_Scalar ( + build_v, rand_a, bool1, r_size)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for Build: %g sec\n", t) ; t = LAGraph_WallClockTime ( ) ; // Baseline: Single Threaded random access insert - GRB_TRY (GxB_Vector_unpack_Full ( - rand_v, (void **)&rand_a, &r_size, &iso, NULL - )) ; LAGraph_Calloc((void **)&set_a, size_p2, sizeof(bool), msg); for(int64_t i = 0; i < size; ++i) { @@ -127,7 +125,9 @@ int main (int argc, char **argv) GRB_TRY (GxB_Vector_pack_Full ( rand_v, (void **)&rand_a, r_size, iso, NULL )) ; - + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) + printf ("GraphBLAS version too low to test LAGraph_FastAssign\n") ; + #else // FastAssign! GRB_TRY (GrB_Vector_clear(assign_s)) ; t = LAGraph_WallClockTime ( ) ; @@ -136,6 +136,7 @@ int main (int argc, char **argv) )); t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; + #endif //-------------------------------------------------------------------------- // check the results (Make sure that assign == build == FastAssign ) @@ -165,4 +166,3 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Random_Finalize (msg)) ; return (GrB_SUCCESS) ; } -#endif diff --git a/src/algorithm/LAGr_ConnectedComponents.c b/src/algorithm/LAGr_ConnectedComponents.c index b86f88b3c8..dbe786fbc1 100644 --- a/src/algorithm/LAGr_ConnectedComponents.c +++ b/src/algorithm/LAGr_ConnectedComponents.c @@ -32,8 +32,7 @@ int LAGr_ConnectedComponents char *msg ) { - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - #elif LAGRAPH_SUITESPARSE + #if LAGRAPH_SUITESPARSE return (LG_CC_FastSV6 (component, G, msg)) ; #else return (LG_CC_Boruvka (component, G, msg)) ; From 0f20326baf813f37d3230f4ac2e42b55f4d77c98 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 23 Feb 2025 21:27:01 -0600 Subject: [PATCH 063/115] Added FastSV6_SSGrBv10 to benchmark --- .../algorithm/LAGraph_RichClubCoefficient.c | 4 +-- experimental/algorithm/LAGraph_SwapEdges.c | 2 +- experimental/test/test_RichClubCoefficient.c | 3 +- src/algorithm/LAGr_ConnectedComponents.c | 1 + src/benchmark/cc_demo.c | 34 ++++++++++++++++++- 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index b1f98d6ac6..bfb13e6102 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -11,7 +11,7 @@ // funding and support from the U.S. Government (see Acknowledgments.txt file). // DM22-0790 -// Contributed by Timothy A. Davis, Texas A&M University +// Contributed by Gabriel Gomez, Texas A&M University //------------------------------------------------------------------------------ @@ -363,7 +363,7 @@ int LAGraph_RichClubCoefficient &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL )) ; - LG_ASSERT(deg_vec_size == deg_vec_size, GrB_DIMENSION_MISMATCH); + LG_ASSERT(deg_vec_size == edge_vec_nvals, GrB_DIMENSION_MISMATCH); //run a cummulative sum (backwards) on deg_vertex_count for(uint64_t i = deg_vec_size - 1; i > 0; --i) { diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 1a2dc54d9f..12257acd96 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -11,7 +11,7 @@ // funding and support from the U.S. Government (see Acknowledgments.txt file). // DM22-0790 -// Contributed by Timothy A. Davis, Texas A&M University +// Contributed by Gabriel Gomez, Texas A&M University //------------------------------------------------------------------------------ diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 1cd139d0e7..7307727743 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -170,7 +170,8 @@ void test_RichClubCoefficient (void) for(int64_t i = n_ans - 1; i >= 0; --i) { GrB_Vector_extractElement(&comp_val, rcc, i) ; - TEST_CHECK (comp_val == ans[i]) ; + TEST_CHECK ( + comp_val - ans[i] <= 1e-10 && ans[i] - comp_val <= 1e-10) ; } GxB_Vector_fprint (rcc, "rcc", GxB_SHORT, stdout); OK (GrB_free (&rcc)) ; diff --git a/src/algorithm/LAGr_ConnectedComponents.c b/src/algorithm/LAGr_ConnectedComponents.c index dbe786fbc1..32939cdbf2 100644 --- a/src/algorithm/LAGr_ConnectedComponents.c +++ b/src/algorithm/LAGr_ConnectedComponents.c @@ -32,6 +32,7 @@ int LAGr_ConnectedComponents char *msg ) { + #if LAGRAPH_SUITESPARSE return (LG_CC_FastSV6 (component, G, msg)) ; #else diff --git a/src/benchmark/cc_demo.c b/src/benchmark/cc_demo.c index 9205d3f017..7837fc106e 100755 --- a/src/benchmark/cc_demo.c +++ b/src/benchmark/cc_demo.c @@ -258,7 +258,7 @@ int main (int argc, char **argv) // LG_CC_Boruvka //-------------------------------------------------------------------------- -#if 0 +#if 1 for (int trial = 1 ; trial <= nt ; trial++) { int nthreads = Nthreads [trial] ; @@ -322,6 +322,38 @@ int main (int argc, char **argv) } #endif + //-------------------------------------------------------------------------- + // LG_CC_FastSV6_SSGrB10 + //-------------------------------------------------------------------------- +#if 1 + for (int trial = 1 ; trial <= nt ; trial++) + { + int nthreads = Nthreads [trial] ; + if (nthreads > nthreads_max) continue ; + LAGRAPH_TRY (LAGraph_SetNumThreads (1, nthreads, NULL)) ; + double ttt = 0 ; + int ntrials = NTRIALS ; + for (int k = 0 ; k < ntrials ; k++) + { + GrB_free (&components2) ; + double ttrial = LAGraph_WallClockTime ( ) ; + LAGRAPH_TRY (LG_CC_FastSV6_SSGrB10 (&components2, G, msg)) ; + ttrial = LAGraph_WallClockTime ( ) - ttrial ; + ttt += ttrial ; + printf ("SV6_v10: nthreads: %2d trial: %2d time: %10.4f sec\n", + nthreads, k, ttrial) ; + GrB_Index nCC2 = countCC (components2, n) ; + if (nCC != nCC2) printf ("failure! %g %g diff %g\n", + (double) nCC, (double) nCC2, (double) (nCC-nCC2)) ; + } + ttt = ttt / ntrials ; + printf ("SV6_v10: nthreads: %2d Avg: time: %10.4f sec ntrials %d\n\n", + nthreads, ttt, ntrials) ; + fprintf (stderr, + "SV6_v10: nthreads: %2d Avg: time: %10.4f sec ntrials %d\n", + nthreads, ttt, ntrials) ; + } +#endif //-------------------------------------------------------------------------- // free all workspace and finish //-------------------------------------------------------------------------- From 965c2046849f48f77f26e497f41a5b62dacf2bc3 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 24 Feb 2025 10:34:45 -0600 Subject: [PATCH 064/115] added some TODO's --- experimental/algorithm/LAGraph_SwapEdges.c | 1 + experimental/utility/LAGraph_FastAssign.c | 9 ++++++++- src/benchmark/cc_demo.c | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 12257acd96..a7ecfb81b0 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -499,6 +499,7 @@ int LAGraph_SwapEdges P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, &perm_size, &junk_size, &iso, NULL, NULL )); + LAGraph_Free((void **) &edge_perm, msg); GrB_Index edges_permed = 0; diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 972eec3996..032e2eb766 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -49,6 +49,10 @@ int LAGraph_FastAssign { // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector // to be sure it remains completely unchanged? + // TODO: take a descriptor for the mask and also to get i by value or + // by index. Ditto for x. + // TODO: take in a semiring instead of dup? less intuitive but faster and + // more flexible. GrB_Vector ramp_loc = NULL; GrB_Matrix P = NULL; int64_t n, nrows; @@ -58,7 +62,7 @@ int LAGraph_FastAssign int64_t ramp_n = 0, ramp_size = 0; bool iso = false; - //TODO: assert inputs are full etc. + //TODO: assert inputs are full or desc say to use by value or by index. LG_ASSERT (c != NULL, GrB_NULL_POINTER); LG_ASSERT (i != NULL, GrB_NULL_POINTER); LG_ASSERT (x != NULL, GrB_NULL_POINTER); @@ -104,7 +108,9 @@ int LAGraph_FastAssign GRB_TRY (GrB_Vector_dup(&con->i, i)) ; } else + { con->i = i; + } con->x = x; con->format = GxB_SPARSE; con->orientation = GrB_COLMAJOR; @@ -114,6 +120,7 @@ int LAGraph_FastAssign con->nvals = n; con->jumbled = false; GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); + // TODO: check if it's faster to make P iso and multiply by x with/SECOND GRB_TRY (GrB_reduce( c, mask, accum, dup, P, NULL)) ; GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); diff --git a/src/benchmark/cc_demo.c b/src/benchmark/cc_demo.c index 7837fc106e..2c82224c4a 100755 --- a/src/benchmark/cc_demo.c +++ b/src/benchmark/cc_demo.c @@ -258,7 +258,7 @@ int main (int argc, char **argv) // LG_CC_Boruvka //-------------------------------------------------------------------------- -#if 1 +#if 0 for (int trial = 1 ; trial <= nt ; trial++) { int nthreads = Nthreads [trial] ; @@ -325,7 +325,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- // LG_CC_FastSV6_SSGrB10 //-------------------------------------------------------------------------- -#if 1 +#if 0 for (int trial = 1 ; trial <= nt ; trial++) { int nthreads = Nthreads [trial] ; From 9a11d2901d9a7d88101fa7b2192d2d02296699d2 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 27 Feb 2025 23:11:52 -0600 Subject: [PATCH 065/115] Fast Assign Semiring and FastSV7_FA --- ...C_FastSV6_SSGrB10.c => LG_CC_FastSV7_FA.c} | 529 +++++++++++++----- experimental/utility/LAGraph_FastAssign.c | 147 ++++- include/LAGraphX.h | 31 +- src/benchmark/cc_demo.c | 4 +- src/test/test_ConnectedComponents.c | 8 +- 5 files changed, 558 insertions(+), 161 deletions(-) rename experimental/algorithm/{LG_CC_FastSV6_SSGrB10.c => LG_CC_FastSV7_FA.c} (54%) diff --git a/experimental/algorithm/LG_CC_FastSV6_SSGrB10.c b/experimental/algorithm/LG_CC_FastSV7_FA.c similarity index 54% rename from experimental/algorithm/LG_CC_FastSV6_SSGrB10.c rename to experimental/algorithm/LG_CC_FastSV7_FA.c index 69aa2cb0b9..a1a5708bda 100644 --- a/experimental/algorithm/LG_CC_FastSV6_SSGrB10.c +++ b/experimental/algorithm/LG_CC_FastSV7_FA.c @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// LG_CC_FastSV6_SSGrB10: connected components +// LG_CC_FastSV7: connected components //------------------------------------------------------------------------------ -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// LAGraph, (c) 2019-2025 by The LAGraph Contributors, All Rights Reserved. // SPDX-License-Identifier: BSD-2-Clause // // For additional details (including references to third party source code and @@ -12,7 +12,7 @@ // DM22-0790 // Contributed by Yongzhe Zhang, modified by Timothy A. Davis, Texas A&M -// University, and Gabriel Gomez, Texas A&M University. +// University //------------------------------------------------------------------------------ @@ -30,13 +30,9 @@ // 144: 14-27 (2020). // Modified by Tim Davis, Texas A&M University: revised Reduce_assign to use -// purely GrB* and GxB* methods and the matrix C. Added warmup phase. Changed -// to use GxB pack/unpack instead of GxB import/export. Converted to use the -// LAGraph_Graph object. Exploiting iso status for the temporary matrices -// C and T. - -// Modified by Gabriel Gomez, Texas A&M University: revised Reduce_assign to use -// GrB and GxB and LAGraph methods, with opaque GrB_Vector inputs. +// purely GrB* and GxB* methods and the matrix Parent. Added warmup phase. +// Changed to use GxB load/unload. Converted to use the LAGraph_Graph object. +// Exploiting iso status for the temporary matrices Parent and T. // The input graph G must be undirected, or directed and with an adjacency // matrix that has a symmetric structure. Self-edges (diagonal entries) are @@ -44,12 +40,14 @@ // structure is accessed. // NOTE: This function must not be called by multiple user threads at the same -// time on the same graph G, since it unpacks G->A and then packs it back when +// time on the same graph G, since it unloads G->A and loads it back when // done. G->A is unchanged when the function returns, but during execution // G->A is empty. This will be fixed once the todos are finished below, and // G->A will then become a truly read-only object (assuming GrB_wait (G->A) // has been done first). +// #define TIMINGS + #define __STDC_WANT_LIB_EXT1__ 1 #include @@ -57,7 +55,17 @@ #include "LG_internal.h" #include "LAGraphX.h" -#if LAGRAPH_SUITESPARSE && GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) +double timings [16] ; + +#define USING_GRAPHBLAS_V10 0 +#if LAGRAPH_SUITESPARSE + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + #undef USING_GRAPHBLAS_V10 + #define USING_GRAPHBLAS_V10 1 + #endif +#endif + +#if USING_GRAPHBLAS_V10 //============================================================================== // fastsv: find the components of a graph @@ -66,22 +74,30 @@ static inline GrB_Info fastsv ( GrB_Matrix A, // adjacency matrix, G->A or a subset of G->A - GrB_Vector parent, // parent vector + GrB_Vector parent2, // workspace GrB_Vector mngp, // min neighbor grandparent GrB_Vector *gp, // grandparent GrB_Vector *gp_new, // new grandparent (swapped with gp) GrB_Vector t, // workspace - GrB_Vector ramp, // ramp = [0:n] size n + 1 GrB_BinaryOp eq, // GrB_EQ_(integer type) GrB_BinaryOp min, // GrB_MIN_(integer type) GrB_Semiring min_2nd, // GrB_MIN_SECOND_(integer type) - GrB_Monoid min_m, // GrB_MIN_MONOID_(integer type) + GrB_Vector parent, // parent + GrB_Vector ramp, // [0:n] use to speed up FastAssign char *msg ) { - bool done = false; + bool done = false ; +// #ifdef TIMINGS +// int pass = 0 ; +// #endif + while (true) { +// #ifdef TIMINGS +// printf ("\n-------------------------------------------fastsv: %d\n", +// ++pass) ; +// #endif //---------------------------------------------------------------------- // hooking & shortcutting @@ -91,40 +107,60 @@ static inline GrB_Info fastsv GRB_TRY (GrB_mxv (mngp, NULL, min, min_2nd, A, *gp, NULL)) ; //---------------------------------------------------------------------- - // parent = min (parent, C*mngp) where C(i,j) is present if i=parent(j) + // parent2 = min (mngp, gp) + //---------------------------------------------------------------------- + + // The parent vector is Parent_Container->i, and thus no longer exists + // when the Parent matrix exists. So the accumulation is done in a + // workspace vector, parent2. + + GRB_TRY (GrB_eWiseAdd (parent2, NULL, NULL, min, mngp, *gp, NULL)) ; + + //---------------------------------------------------------------------- + // parent2 = min (parent2, Parent*mngp) using the MIN_SECOND semiring //---------------------------------------------------------------------- - // This function computes the following, which is done explicitly in the - // Reduce_assign function in LG_CC_Boruvka: + // Reduce_assign: This function computes the following, which + // is done explicitly in the Reduce_assign function in LG_CC_Boruvka: // // for (j = 0 ; j < n ; j++) // { - // uint64_t i = Px [j] ; - // parent [i] = min (parent [i], mngp [j]) ; + // uint64_t i = parent [j] ; + // parent2 [i] = min (parent2 [i], mngp [j]) ; // } // - // If C(i,j) is present where i == Px [j], then this can be written as: + // If Parent(i,j) is present where i == parent (j), then this can be + // written as: // - // parent = min (parent, C*mngp) - + // parent2 = min (parent2, Parent*mngp) + // + // when using the min_2nd semiring. This can be done efficiently + // because Parent can be constructed in O(1) time and O(1) additional + // space when using the SuiteSparse load/unload move constructors. The + // min_2nd semiring ignores the values of Parent and operates only on + // the structure, so its values are not relevant. Parent_Container->x + // is thus chosen as a GrB_BOOL array of size 1 where x [0] = false, so + // all entries present in Parent are equal to false. + + // load the parent vector into its matrix form, Parent LG_TRY (LAGraph_FastAssign( - parent, NULL, min, parent, mngp, ramp, min_m, msg)) ; + parent2, NULL, min, parent, mngp, ramp, min_2nd, msg)); //---------------------------------------------------------------------- - // parent = min (parent, mngp, gp) + // parent = min (parent, parent2) //---------------------------------------------------------------------- - GRB_TRY (GrB_eWiseAdd (parent, NULL, min, min, mngp, *gp, NULL)) ; + GRB_TRY (GrB_assign (parent, NULL, min, parent2, GrB_ALL, 0, NULL)) ; //---------------------------------------------------------------------- // calculate grandparent: gp_new = parent (parent) //---------------------------------------------------------------------- + GRB_TRY (GrB_extract (*gp_new, NULL, NULL, parent, parent, NULL)) ; //---------------------------------------------------------------------- // terminate if gp and gp_new are the same //---------------------------------------------------------------------- - GRB_TRY (GrB_eWiseMult (t, NULL, NULL, eq, *gp_new, *gp, NULL)) ; GRB_TRY (GrB_reduce (&done, NULL, GrB_LAND_MONOID_BOOL, t, NULL)) ; if (done) break ; @@ -136,7 +172,7 @@ static inline GrB_Info fastsv } //============================================================================== -// LG_CC_FastSV6 +// LG_CC_FastSV7 //============================================================================== // The output of LG_CC_FastSV* is a vector component, where component(i)=r if @@ -150,30 +186,55 @@ static inline GrB_Info fastsv LAGraph_Free ((void **) &Tp, NULL) ; \ LAGraph_Free ((void **) &Tj, NULL) ; \ LAGraph_Free ((void **) &Tx, NULL) ; \ - LAGraph_Free ((void **) &Px, NULL) ; \ LAGraph_Free ((void **) &ht_key, NULL) ; \ LAGraph_Free ((void **) &ht_count, NULL) ; \ LAGraph_Free ((void **) &count, NULL) ; \ LAGraph_Free ((void **) &range, NULL) ; \ + LAGraph_Free ((void **) &Px, NULL) ; \ GrB_free (&T) ; \ GrB_free (&t) ; \ - GrB_free (&y) ; \ GrB_free (&gp) ; \ GrB_free (&mngp) ; \ GrB_free (&gp_new) ; \ - GrB_free (&ramp_v) ; \ + GrB_free (&parent2) ; \ + GrB_free (&ramp_v) ; \ + GrB_free (&A_Container) ; \ + GrB_free (&T_Container) ; \ } #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ LG_FREE_WORK ; \ - GrB_free (&parent) ; \ } #endif -int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions +// get/set macros for 32/64 bit arrays: +#define AP(k) (Ap32 ? Ap32 [k] : Ap64 [k]) +#define AJ(k) (Aj32 ? Aj32 [k] : Aj64 [k]) +#define PARENT(i) (Px32 ? Px32 [i] : Px64 [i]) +#define TP(k) (Tp32 ? Tp32 [k] : Tp64 [k]) +#define TJ(k) (Tj32 ? Tj32 [k] : Tj64 [k]) +#define SET_TP(k,p) { if (Tp32) { Tp32 [k] = p ; } else { Tp64 [k] = p ; }} +#define SET_TJ(k,i) { if (Tj32) { Tj32 [k] = i ; } else { Tj64 [k] = i ; }} + +#ifdef TIMINGS +static void print_timings (double timings [16]) +{ + double total = timings [0] + timings [1] + timings [2] ; + printf ("SV7 %12.6f (%4.1f%%) init\n", timings [0], 100. * timings [0] / total) ; + printf ("SV7 %12.6f (%4.1f%%) total sampling:\n", timings [1], 100. * timings [1] / total) ; + printf ("SV7 %12.6f (%4.1f%%) setup T\n", timings [3], 100. * timings [3] / total) ; + printf ("SV7 %12.6f (%4.1f%%) create T\n", timings [4], 100. * timings [4] / total) ; + printf ("SV7 %12.6f (%4.1f%%) fastsv sample\n", timings [5], 100 * timings [5] / total) ; + printf ("SV7 %12.6f (%4.1f%%) hash\n", timings [6], 100. * timings [6] / total) ; + printf ("SV7 %12.6f (%4.1f%%) prune\n", timings [7], 100. * timings [7] / total) ; + printf ("SV7 %12.6f (%4.1f%%) total final\n", timings [2], 100. * timings [2] / total) ; +} +#endif + +int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GraphBLAS v10 ( // output: GrB_Vector *component, // component(i)=r if node is in the component r @@ -183,9 +244,7 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions ) { -#if !LAGRAPH_SUITESPARSE || GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) - LG_ASSERT (false, GrB_NOT_IMPLEMENTED) ; -#else +#if USING_GRAPHBLAS_V10 //-------------------------------------------------------------------------- // check inputs @@ -193,14 +252,24 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions LG_CLEAR_MSG ; + #ifdef TIMINGS + double timings [16] ; + for (int kk = 0 ; kk < 16 ; kk++) timings [kk] = 0 ; + double tic = LAGraph_WallClockTime ( ) ; + LG_SET_BURBLE (false) ; + #endif + int64_t *range = NULL ; - GrB_Index n, nvals, *ht_key = NULL, *Px = NULL, - *count = NULL, *Tp = NULL, *Tj = NULL ; + void *Px = NULL ; + uint64_t Px_size = 0 ; + GrB_Index n, nvals, *ht_key = NULL, *count = NULL ; + void *Tp = NULL, *Tj = NULL ; GrB_Vector parent = NULL, gp_new = NULL, mngp = NULL, gp = NULL, t = NULL, - y = NULL, ramp_v = NULL; - GrB_Matrix T = NULL; - void *Tx = NULL; + parent2 = NULL, ramp_v = NULL ; + GrB_Matrix T = NULL ; + void *Tx = NULL ; int *ht_count = NULL ; + GxB_Container A_Container = NULL, T_Container = NULL ; LG_TRY (LAGraph_CheckGraph (G, msg)) ; LG_ASSERT (component != NULL, GrB_NULL_POINTER) ; @@ -225,7 +294,6 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions GrB_IndexUnaryOp ramp ; GrB_Semiring min_2nd, min_2ndi ; GrB_BinaryOp min, eq, imin ; - GrB_Monoid min_m; #ifdef COVERAGE // Just for test coverage, use 64-bit ints for n > 100. Do not use this // rule in production! @@ -236,28 +304,26 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions #endif if (n > NBIG) { - // use 64-bit integers throughout + // use 64-bit integers Uint = GrB_UINT64 ; Int = GrB_INT64 ; ramp = GrB_ROWINDEX_INT64 ; - min = GrB_MIN_UINT64 ; - min_m = GrB_MIN_MONOID_UINT64; + min = GrB_MIN_INT64 ; imin = GrB_MIN_INT64 ; - eq = GrB_EQ_UINT64 ; - min_2nd = GrB_MIN_SECOND_SEMIRING_UINT64 ; + eq = GrB_EQ_INT64 ; + min_2nd = GrB_MIN_SECOND_SEMIRING_INT64 ; min_2ndi = GxB_MIN_SECONDI_INT64 ; } else { - // use 32-bit integers, except for Px and for constructing the matrix C + // use 32-bit integers Uint = GrB_UINT32 ; Int = GrB_INT32 ; ramp = GrB_ROWINDEX_INT32 ; - min = GrB_MIN_UINT32 ; - min_m = GrB_MIN_MONOID_UINT32; + min = GrB_MIN_INT32 ; imin = GrB_MIN_INT32 ; - eq = GrB_EQ_UINT32 ; - min_2nd = GrB_MIN_SECOND_SEMIRING_UINT32 ; + eq = GrB_EQ_INT32 ; + min_2nd = GrB_MIN_SECOND_SEMIRING_INT32 ; min_2ndi = GxB_MIN_SECONDI_INT32 ; } @@ -266,6 +332,13 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions #define FASTSV_SAMPLES 4 bool sampling = (nvals > n * FASTSV_SAMPLES * 2 && n > 1024) ; + //-------------------------------------------------------------------------- + // make ramp needed for FastAssign speedup + //-------------------------------------------------------------------------- + GRB_TRY (GrB_Vector_new (&(ramp_v), Uint, n+1)) ; + GRB_TRY (GrB_assign (ramp_v, NULL, NULL, 0, GrB_ALL, n+1, + NULL)) ; + GRB_TRY (GrB_apply (ramp_v, NULL, NULL, ramp, ramp_v, 0, NULL)) ; // [ todo: nthreads will not be needed once GxB_select with a GxB_RankUnaryOp // and a new GxB_extract are added to SuiteSparse:GraphBLAS. // determine # of threads to use @@ -276,47 +349,41 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions nthreads = LAGRAPH_MAX (nthreads, 1) ; // ] - LG_TRY (LAGraph_Malloc ((void **) &Px, n, sizeof (GrB_Index), msg)) ; - - // create Cp = 0:n (always 64-bit) and the empty C matrix - GRB_TRY (GrB_Vector_new (&ramp_v, GrB_INT64, n+1)) ; - GRB_TRY (GrB_assign (ramp_v, NULL, NULL, 0, GrB_ALL, n+1, NULL)) ; - GRB_TRY (GrB_apply ( - ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + GRB_TRY (GxB_Container_new (&A_Container)) ; + GRB_TRY (GxB_Container_new (&T_Container)) ; //-------------------------------------------------------------------------- // warmup: parent = min (0:n-1, A*1) using the MIN_SECONDI semiring //-------------------------------------------------------------------------- - // y (i) = min (i, j) for all entries A(i,j). This warmup phase takes only + // parent (i) = min (i, j) for all entries A(i,j). This warmup phase takes only // O(n) time, because of how the MIN_SECONDI semiring is implemented in // SuiteSparse:GraphBLAS. A is held by row, and the first entry in A(i,:) // is the minimum index j, so only the first entry in A(i,:) needs to be // considered for each row i. - GRB_TRY (GrB_Vector_new (&t, Int, n)) ; - GRB_TRY (GrB_Vector_new (&y, Int, n)) ; + GRB_TRY (GrB_Vector_new (&t, GrB_BOOL, n)) ; + GRB_TRY (GrB_Vector_new (&parent, Int, n)) ; GRB_TRY (GrB_assign (t, NULL, NULL, 0, GrB_ALL, n, NULL)) ; - GRB_TRY (GrB_assign (y, NULL, NULL, 0, GrB_ALL, n, NULL)) ; - GRB_TRY (GrB_apply (y, NULL, NULL, ramp, y, 0, NULL)) ; - GRB_TRY (GrB_mxv (y, NULL, imin, min_2ndi, A, t, NULL)) ; + GRB_TRY (GrB_assign (parent, NULL, NULL, 0, GrB_ALL, n, NULL)) ; + GRB_TRY (GrB_apply (parent, NULL, NULL, ramp, parent, 0, NULL)) ; + GRB_TRY (GrB_mxv (parent, NULL, imin, min_2ndi, A, t, NULL)) ; GRB_TRY (GrB_free (&t)) ; - // The typecast from Int to Uint is required because the ROWINDEX operator - // and MIN_SECONDI do not work in the UINT* domains, as built-in operators. - // parent = (Uint) y - GRB_TRY (GrB_Vector_new (&parent, Uint, n)) ; - GRB_TRY (GrB_assign (parent, NULL, NULL, y, GrB_ALL, n, NULL)) ; - GRB_TRY (GrB_free (&y)) ; - - // copy parent into gp, mngp, and Px. Px is a non-opaque 64-bit copy of the - // parent GrB_Vector. The Px array is always of type GrB_Index since it - // must be used as the input array for extractTuples and as Ci for pack_CSR. - // If parent is uint32, GraphBLAS typecasts it to the uint64 Px array. + // copy parent into gp and mngp. GRB_TRY (GrB_Vector_dup (&gp, parent)) ; GRB_TRY (GrB_Vector_dup (&mngp, parent)) ; - GRB_TRY (GrB_Vector_new (&gp_new, Uint, n)) ; + + // allocate workspace vectors + GRB_TRY (GrB_Vector_new (&gp_new, Int, n)) ; GRB_TRY (GrB_Vector_new (&t, GrB_BOOL, n)) ; + GRB_TRY (GrB_Vector_new (&parent2, Int, n)) ; + + #ifdef TIMINGS + double toc = LAGraph_WallClockTime ( ) ; + timings [0] = toc - tic ; // init time + tic = toc ; + #endif //-------------------------------------------------------------------------- // sample phase @@ -348,34 +415,66 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions // give me 3 random items from the row (y = 3) // give me the 4 biggest *values* in each row (y = 4) -// mxv: -// C = A*diag(D) - //---------------------------------------------------------------------- - // unpack A in CSR format + // unload A in CSR format //---------------------------------------------------------------------- - void *Ax ; - GrB_Index *Ap, *Aj, Ap_size, Aj_size, Ax_size ; + #ifdef TIMINGS + double tic2 = LAGraph_WallClockTime ( ) ; + #endif + + void *Ap = NULL, *Aj = NULL ; + uint64_t Ap_size, Aj_size, Ap_len, Aj_len ; bool A_jumbled, A_iso ; - GRB_TRY (GxB_Matrix_unpack_CSR (A, &Ap, &Aj, &Ax, - &Ap_size, &Aj_size, &Ax_size, &A_iso, &A_jumbled, NULL)) ; + int Ap_handling, Aj_handling ; + + // unload A in sparse CSR format into the A_Container + GRB_TRY (GrB_set (A, GxB_SPARSE, GxB_SPARSITY_CONTROL)) ; + GRB_TRY (GrB_set (A, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; + GRB_TRY (GxB_unload_Matrix_into_Container (A, A_Container, NULL)) ; + A_jumbled = A_Container->jumbled ; + A_iso = A_Container->iso ; + + // unload A_Container->p,i into the C arrays, Ap and Aj + GrB_Type Ap_type, Aj_type ; + GRB_TRY (GxB_Vector_unload (A_Container->p, &Ap, &Ap_type, &Ap_len, + &Ap_size, &Ap_handling, NULL)) ; + GRB_TRY (GxB_Vector_unload (A_Container->i, &Aj, &Aj_type, &Aj_len, + &Aj_size, &Aj_handling, NULL)) ; + + bool Ap_is_32 = (Ap_type == GrB_UINT32 || Ap_type == GrB_INT32) ; + bool Aj_is_32 = (Aj_type == GrB_UINT32 || Aj_type == GrB_INT32) ; + const uint32_t *Ap32 = Ap_is_32 ? Ap : NULL ; + const uint64_t *Ap64 = Ap_is_32 ? NULL : Ap ; + const uint32_t *Aj32 = Aj_is_32 ? Aj : NULL ; + const uint64_t *Aj64 = Aj_is_32 ? NULL : Aj ; //---------------------------------------------------------------------- // allocate workspace, including space to construct T //---------------------------------------------------------------------- - GrB_Index Tp_size = (n+1) * sizeof (GrB_Index) ; - GrB_Index Tj_size = nvals * sizeof (GrB_Index) ; + bool Tp_is_32 = (nvals < UINT32_MAX) ; + bool Tj_is_32 = (n < INT32_MAX) ; + GrB_Type Tp_type = Tp_is_32 ? GrB_UINT32 : GrB_UINT64 ; + GrB_Type Tj_type = Tj_is_32 ? GrB_UINT32 : GrB_UINT64 ; + size_t tpsize = Tp_is_32 ? sizeof (uint32_t) : sizeof (uint64_t) ; + size_t tjsize = Tj_is_32 ? sizeof (uint32_t) : sizeof (uint64_t) ; + + GrB_Index Tp_size = (n+1) * tpsize ; + GrB_Index Tj_size = nvals * tjsize ; GrB_Index Tx_size = sizeof (bool) ; - LG_TRY (LAGraph_Malloc ((void **) &Tp, n+1, sizeof (GrB_Index), msg)) ; - LG_TRY (LAGraph_Malloc ((void **) &Tj, nvals, sizeof (GrB_Index), - msg)) ; + LG_TRY (LAGraph_Malloc ((void **) &Tp, n+1, tpsize, msg)) ; + LG_TRY (LAGraph_Malloc ((void **) &Tj, nvals, tjsize, msg)) ; LG_TRY (LAGraph_Calloc ((void **) &Tx, 1, sizeof (bool), msg)) ; - LG_TRY (LAGraph_Malloc ((void **) &range, nthreads + 1, - sizeof (int64_t), msg)) ; - LG_TRY (LAGraph_Calloc ((void **) &count, nthreads + 1, - sizeof (GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ((void **) &range, nthreads+1, sizeof (int64_t), + msg)) ; + LG_TRY (LAGraph_Calloc ((void **) &count, nthreads+1, sizeof (uint64_t), + msg)) ; + + uint32_t *Tp32 = Tp_is_32 ? Tp : NULL ; + uint64_t *Tp64 = Tp_is_32 ? NULL : Tp ; + uint32_t *Tj32 = Tj_is_32 ? Tj : NULL ; + uint64_t *Tj64 = Tj_is_32 ? NULL : Tj ; //---------------------------------------------------------------------- // define parallel tasks to construct T @@ -397,7 +496,7 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions { for (int64_t i = range [tid] ; i < range [tid+1] ; i++) { - int64_t deg = Ap [i + 1] - Ap [i] ; + int64_t deg = AP (i + 1) - AP (i) ; count [tid + 1] += LAGRAPH_MIN (FASTSV_SAMPLES, deg) ; } } @@ -411,6 +510,12 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions count [tid + 1] += count [tid] ; } + #ifdef TIMINGS + double toc2 = LAGraph_WallClockTime ( ) ; + timings [3] = toc2 - tic2 ; // setup T + tic2 = toc2 ; + #endif + //---------------------------------------------------------------------- // construct T //---------------------------------------------------------------------- @@ -421,16 +526,20 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions for (tid = 0 ; tid < nthreads ; tid++) { GrB_Index p = count [tid] ; - Tp [range [tid]] = p ; + int64_t ktid = range [tid] ; + SET_TP (ktid, p) ; // Tp [ktid] = p ; for (int64_t i = range [tid] ; i < range [tid+1] ; i++) { // construct T (i,:) from the first entries in A (i,:) for (int64_t j = 0 ; - j < FASTSV_SAMPLES && Ap [i] + j < Ap [i + 1] ; j++) + j < FASTSV_SAMPLES && AP (i) + j < AP (i + 1) ; j++) { - Tj [p++] = Aj [Ap [i] + j] ; + uint64_t pi = AP (i) + j ; + uint64_t j = AJ (pi) ; + SET_TJ (p, j) ; // Tj [p] = j ; + p++ ; } - Tp [i + 1] = p ; + SET_TP (i+1, p) ; // Tp [i + 1] = p ; } } @@ -439,19 +548,67 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions //---------------------------------------------------------------------- GRB_TRY (GrB_Matrix_new (&T, GrB_BOOL, n, n)) ; - GRB_TRY (GxB_Matrix_pack_CSR (T, &Tp, &Tj, &Tx, Tp_size, Tj_size, - Tx_size, /* T is iso: */ true, A_jumbled, NULL)) ; + + uint64_t T_nvals = TP (n) ; + uint64_t Tp_len = n+1 ; + uint64_t Tj_len = T_nvals ; + + T_Container->nrows = n ; + T_Container->ncols = n ; + T_Container->nrows_nonempty = -1 ; + T_Container->ncols_nonempty = -1 ; + T_Container->nvals = T_nvals ; + T_Container->format = GxB_SPARSE ; + T_Container->orientation = GrB_ROWMAJOR ; + T_Container->iso = true ; + T_Container->jumbled = A_jumbled ; + + // load Tp, Tj, and Tx into the T_Container + GRB_TRY (GxB_Vector_load (T_Container->p, &Tp, Tp_type, Tp_len, + Tp_size, GrB_DEFAULT, NULL)) ; + GRB_TRY (GxB_Vector_load (T_Container->i, &Tj, Tj_type, Tj_len, + Tj_size, GrB_DEFAULT, NULL)) ; + GRB_TRY (GxB_Vector_load (T_Container->x, &Tx, GrB_BOOL, 1, + Tx_size, GrB_DEFAULT, NULL)) ; + + // load T from the T_Container + GRB_TRY (GxB_load_Matrix_from_Container (T, T_Container, NULL)) ; // ] todo: the above will all be done as a single call to GxB_select. + #ifdef TIMINGS + toc2 = LAGraph_WallClockTime ( ) ; + timings [4] = toc2 - tic2 ; // create T + tic2 = toc2 ; + #endif + //---------------------------------------------------------------------- // find the connected components of T //---------------------------------------------------------------------- - LG_TRY (fastsv (T, parent, mngp, &gp, &gp_new, t, ramp_v, eq, min, - min_2nd, min_m, msg)) ; - // update Px - GRB_TRY (GrB_Vector_extractTuples (NULL, Px, &n, parent)) ; + LG_TRY (fastsv (T, parent2, mngp, &gp, &gp_new, t, eq, min, min_2nd, + parent, ramp_v, msg)) ; + + #ifdef TIMINGS + toc2 = LAGraph_WallClockTime ( ) ; + timings [5] = toc2 - tic2 ; // fastsv, in sampling + tic2 = toc2 ; + #endif + + //---------------------------------------------------------------------- + // unload the parent i vector into the Px array + //---------------------------------------------------------------------- + + int handling = 0 ; + GrB_Type type = NULL ; + GRB_TRY (GxB_Vector_unload (parent, &Px, &type, &n, &Px_size, + &handling, NULL)) ; + bool Px_is_32 = (type == GrB_UINT32 || type == GrB_INT32) ; + uint32_t *Px32 = Px_is_32 ? Px : NULL ; + uint64_t *Px64 = Px_is_32 ? NULL : Px ; + + // At this point, both the parent vector and Parent matrix are empty, + // and the Px array holds the content of parent vector. //---------------------------------------------------------------------- // use sampling to estimate the largest connected component in T @@ -484,8 +641,9 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions int max_count = 0 ; // frequency of most frequent entry for (int64_t k = 0 ; k < HASH_SAMPLES ; k++) { - // select an entry from Px at random - GrB_Index x = Px [LG_Random60 (&seed) % n] ; + // select an entry ii from PARENT at random + uint64_t i = LG_Random60 (&seed) % n ; + GrB_Index x = PARENT (i) ; // find x in the hash table GrB_Index h = HASH (x) ; while (ht_key [h] != UINT64_MAX && ht_key [h] != x) h = NEXT (h) ; @@ -500,6 +658,12 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions } } + #ifdef TIMINGS + toc2 = LAGraph_WallClockTime ( ) ; + timings [6] = toc2 - tic2 ; // hash + tic2 = toc2 ; + #endif + //---------------------------------------------------------------------- // compact the largest connected component in A //---------------------------------------------------------------------- @@ -524,60 +688,88 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions // GrB_Col_assign (T, M, NULL, t, GrB_ALL, j, NULL) with an all-true // vector t. - // unpack T to reuse the space (all content is overwritten below) - bool T_jumbled, T_iso ; - GRB_TRY (GxB_Matrix_unpack_CSR (T, &Tp, &Tj, &Tx, &Tp_size, &Tj_size, - &Tx_size, &T_iso, &T_jumbled, NULL)) ; + // unload T from the T_Container; its contents are revised below + GRB_TRY (GxB_unload_Matrix_into_Container (T, T_Container, NULL)) ; + + // unload Tp and Tj from the T_Container + int ignore ; + GRB_TRY (GxB_Vector_unload (T_Container->p, &Tp, &Tp_type, &Tp_len, + &Tp_size, &ignore, NULL)) ; + GRB_TRY (GxB_Vector_unload (T_Container->i, &Tj, &Tj_type, &Tj_len, + &Tj_size, &ignore, NULL)) ; + + // these are likely to be unchanged since the last load of T + Tp_is_32 = (Tp_type == GrB_UINT32 || Tp_type == GrB_INT32) ; + Tj_is_32 = (Tj_type == GrB_UINT32 || Tj_type == GrB_INT32) ; + Tp32 = Tp_is_32 ? Tp : NULL ; + Tp64 = Tp_is_32 ? NULL : Tp ; + Tj32 = Tj_is_32 ? Tj : NULL ; + Tj64 = Tj_is_32 ? NULL : Tj ; + #pragma omp parallel for num_threads(nthreads) schedule(static) for (tid = 0 ; tid < nthreads ; tid++) { - GrB_Index p = Ap [range [tid]] ; + uint64_t ktid = range [tid] ; + GrB_Index p = AP (ktid) ; // thread tid scans A (range [tid]:range [tid+1]-1,:), // and constructs T(i,:) for all rows in this range. for (int64_t i = range [tid] ; i < range [tid+1] ; i++) { - int64_t pi = Px [i] ; // pi = parent (i) - Tp [i] = p ; // start the construction of T(i,:) + int64_t pi = PARENT (i) ; + int64_t pstart = p ; + SET_TP (i, p) ; // Tp [i] = p ; start the construction of T(i,:) // T(i,:) is empty if pi == key if (pi != key) { // scan A(i,:) - for (GrB_Index pS = Ap [i] ; pS < Ap [i+1] ; pS++) + for (GrB_Index pS = AP (i) ; pS < AP (i+1) ; pS++) { // get A(i,j) - int64_t j = Aj [pS] ; - if (Px [j] != key) + int64_t j = AJ (pS) ; + if (PARENT (j) != key) { // add the entry T(i,j) to T, but skip it if - // Px [j] is equal to key - Tj [p++] = j ; + // PARENT (j) is equal to key + SET_TJ (p, j) // Tj [p] = j ; + p++ ; } } // Add the entry T(i,key) if there is room for it in T(i,:); // if and only if node i is adjacent to a node j in the // largest component. The only way there can be space if - // at least one T(i,j) appears with Px [j] equal to the key - // (that is, node j is in the largest connected component, - // key == Px [j]. One of these j's can then be replaced - // with the key. If node i is not adjacent to any node in - // the largest component, then there is no space in T(i,:) - // and no new edge to the largest component is added. - if (p - Tp [i] < Ap [i+1] - Ap [i]) + // at least one T(i,j) appears with PARENT (j) equal to the + // key (that is, node j is in the largest connected + // component, key == PARENT (j). One of these j's can then + // be replaced with the key. If node i is not adjacent to + // any node in the largest component, then there is no + // space in T(i,:) and no new edge to the largest component + // is added. + if (p - pstart < AP (i+1) - AP (i)) { - Tj [p++] = key ; + SET_TJ (p, key) ; // Tj [p] = key ; + p++ ; } } } // count the number of entries inserted into T by this thread - count [tid] = p - Tp [range [tid]] ; + count [tid] = p - TP (ktid) ; } // Compact empty space out of Tj not filled in from the above phase. nvals = 0 ; for (tid = 0 ; tid < nthreads ; tid++) { - memmove (Tj + nvals, - Tj + Tp [range [tid]], sizeof (GrB_Index) * count [tid]) ; + int64_t ktid = range [tid] ; + if (Tj32) + { + memmove (Tj32 + nvals, Tj32 + TP (ktid), + sizeof (uint32_t) * count [tid]) ; + } + else + { + memmove (Tj64 + nvals, Tj64 + TP (ktid), + sizeof (uint64_t) * count [tid]) ; + } nvals += count [tid] ; count [tid] = nvals - count [tid] ; } @@ -586,31 +778,70 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions #pragma omp parallel for num_threads(nthreads) schedule(static) for (tid = 0 ; tid < nthreads ; tid++) { - GrB_Index p = Tp [range [tid]] ; + int64_t ktid = range [tid] ; + GrB_Index p = TP (ktid) ; for (int64_t i = range [tid] ; i < range [tid+1] ; i++) { - Tp [i] -= p - count [tid] ; + int64_t tp = TP (i) ; + tp -= p - count [tid] ; + SET_TP (i, tp) ; // Tp [i] = tp ; } } // finalize T - Tp [n] = nvals ; + SET_TP (n, nvals) ; // Tp [n] = nvals ; + Tj_len = nvals ; + + // load T_Container->p,i from the C arrays, Tp and Tj, for final phase + GRB_TRY (GxB_Vector_load (T_Container->p, &Tp, Tp_type, Tp_len, + Tp_size, GrB_DEFAULT, NULL)) ; + GRB_TRY (GxB_Vector_load (T_Container->i, &Tj, Tj_type, Tj_len, + Tj_size, GrB_DEFAULT, NULL)) ; - // pack T for the final phase - GRB_TRY (GxB_Matrix_pack_CSR (T, &Tp, &Tj, &Tx, Tp_size, Tj_size, - Tx_size, T_iso, /* T is now jumbled */ true, NULL)) ; + T_Container->nrows_nonempty = -1 ; + T_Container->ncols_nonempty = -1 ; + T_Container->jumbled = true ; + T_Container->nvals = nvals ; - // pack A (unchanged since last unpack); this is the original G->A. - GRB_TRY (GxB_Matrix_pack_CSR (A, &Ap, &Aj, &Ax, Ap_size, Aj_size, - Ax_size, A_iso, A_jumbled, NULL)) ; + // load T in sparse CSR format from the T_Container + GRB_TRY (GxB_load_Matrix_from_Container (T, T_Container, NULL)) ; -// ]. The unpack/pack of A into Ap, Aj, Ax will not be needed, and G->A + // load A_Container->p,i from the C arrays, Ap and Aj + // This is the original G->A, and it is unchanged. + GRB_TRY (GxB_Vector_load (A_Container->p, &Ap, Ap_type, Ap_len, + Ap_size, Ap_handling, NULL)) ; + GRB_TRY (GxB_Vector_load (A_Container->i, &Aj, Aj_type, Aj_len, + Aj_size, Aj_handling, NULL)) ; + + // load A in sparse CSR format from the A_Container + GRB_TRY (GxB_load_Matrix_from_Container (A, A_Container, NULL)) ; + + //---------------------------------------------------------------------- + // load the Px array back into the parent vector + //---------------------------------------------------------------------- + + GRB_TRY (GxB_Vector_load (parent, &Px, type, n, Px_size, + GrB_DEFAULT, NULL)) ; + +// ]. The unload/load of A into Ap, Aj, Ax will not be needed, and G->A // will become truly a read-only matrix. // final phase uses the pruned matrix T A = T ; + + #ifdef TIMINGS + toc2 = LAGraph_WallClockTime ( ) ; + timings [7] = toc2 - tic2 ; // prune + tic2 = toc2 ; + #endif } + #ifdef TIMINGS + toc = LAGraph_WallClockTime ( ) ; + timings [1] = toc - tic ; // total sampling time + tic = toc ; + #endif + //-------------------------------------------------------------------------- // check for quick return //-------------------------------------------------------------------------- @@ -622,6 +853,10 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions { (*component) = parent ; LG_FREE_WORK ; + #ifdef TIMINGS + print_timings (timings) ; + LG_SET_BURBLE (false) ; + #endif return (GrB_SUCCESS) ; } @@ -629,8 +864,8 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions // final phase //-------------------------------------------------------------------------- - LG_TRY (fastsv (A, parent, mngp, &gp, &gp_new, t, ramp_v, eq, min, min_2nd, - min_m, msg)) ; + LG_TRY (fastsv (A, parent2, mngp, &gp, &gp_new, t, eq, min, min_2nd, + parent, ramp_v, msg)) ; //-------------------------------------------------------------------------- // free workspace and return result @@ -638,6 +873,14 @@ int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions (*component) = parent ; LG_FREE_WORK ; + #ifdef TIMINGS + toc = LAGraph_WallClockTime ( ) ; + timings [2] = toc - tic ; // final phase + print_timings (timings) ; + LG_SET_BURBLE (false) ; + #endif return (GrB_SUCCESS) ; +#else + LG_ASSERT (false, GrB_NOT_IMPLEMENTED) ; #endif } diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 032e2eb766..990ae00686 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -17,11 +17,28 @@ //------------------------------------------------------------------------------ +// This method is allows for assigns or build into a vector. It is created to +// target some specific mxv GraphBLAS methods that occasionally tend to be +// faster than both build and assign. + +// This method is used for cases where you want to build a vector equivilent to +// the following for loop: +// for (j = 0 ; j < n ; j++) +// { +// uint64_t i = I_vector [j] ; +// c [i] += X_vector [j] ; +// } +// It is fastest when the accum biop is equivalent to the dup moniod and c is a +// full vector or when there is no accumulator and I_vector.nvals is +// sufficiently large when compared to c.nrows. + +// It builds a matix P which is coustructed in O(1) time if a +// filled ramp vector is passed in. + #include "LG_internal.h" #include "LAGraphX.h" #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) -#include #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ @@ -31,7 +48,7 @@ LAGraph_Free(&ramp_a, msg); \ } -int LAGraph_FastAssign +int LAGraph_FastAssign_Monoid ( // output // Vector to be built (or assigned): initialized with correct dimensions. @@ -83,7 +100,6 @@ int LAGraph_FastAssign GRB_TRY (GrB_Vector_new(&ramp_loc, ramp_type, n + 1)); if(ramp == NULL) { - GRB_TRY (GrB_assign (ramp_loc, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_apply (ramp_loc, NULL, NULL, idxnum, ramp_loc, 0, NULL)) ; } @@ -95,6 +111,10 @@ int LAGraph_FastAssign GRB_TRY (GxB_Vector_load( ramp_loc, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), GxB_IS_READONLY, NULL)) ; + // Since ramp_loc won't free this array I should be safe to load it back + // into ramp. + GRB_TRY (GxB_Vector_load( + ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; } GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); // GxB_fprint(ramp_loc, GxB_COMPLETE, stdout); @@ -115,25 +135,134 @@ int LAGraph_FastAssign con->format = GxB_SPARSE; con->orientation = GrB_COLMAJOR; con->nrows = nrows; - con->ncols = n; - con->iso = iso; - con->nvals = n; - con->jumbled = false; + con->ncols = n ; + con->nvals = n ; + con->nrows_nonempty = -1 ; + con->ncols_nonempty = n ; + con->jumbled = false ; + con->format = GxB_SPARSE ; + con->orientation = GrB_COLMAJOR ; + con->Y = NULL ; GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); // TODO: check if it's faster to make P iso and multiply by x with/SECOND GRB_TRY (GrB_reduce( c, mask, accum, dup, P, NULL)) ; GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); // Don't let inputs get freed - con->p = NULL; if (c != i) con->i = NULL; con->x = NULL; - if (ramp) + LG_FREE_ALL; +} + +// This method can be faster if given a builtin semiring. +int LAGraph_FastAssign_Semiring +( + // output + // Vector to be built (or assigned): initialized with correct dimensions. + GrB_Vector c, + // inputs + const GrB_Vector mask, + const GrB_BinaryOp accum, + const GrB_Vector i, // Indecies (duplicates allowed) + const GrB_Vector x, // Values + // Optional (Give me a ramp with size > x.size for faster calculations) + const GrB_Vector ramp, + // monoid is applied to duplicates. Binary op should be SECOND. + const GrB_Semiring dup, + char *msg +) +{ + // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector + // to be sure it remains completely unchanged? + // TODO: take a descriptor for the mask and also to get i by value or + // by index. Ditto for x. + // TODO: take in a semiring instead of dup? less intuitive but faster and + // more flexible. + GrB_Vector ramp_loc = NULL; + GrB_Matrix P = NULL; + int64_t n, nrows; + GxB_Container con = NULL; + void *ramp_a = NULL; + int ramp_h = 0; + int64_t ramp_n = 0, ramp_size = 0; + + bool iso = false; + //TODO: assert inputs are full or desc say to use by value or by index. + LG_ASSERT (c != NULL, GrB_NULL_POINTER); + LG_ASSERT (i != NULL, GrB_NULL_POINTER); + LG_ASSERT (x != NULL, GrB_NULL_POINTER); + LG_ASSERT_MSG (c != x, GrB_NOT_IMPLEMENTED, "c cannot be aliased with x."); + + GRB_TRY (GrB_Vector_size(&n, i)); + GRB_TRY (GrB_Vector_size(&nrows, c)); + GRB_TRY (GrB_Vector_get_INT32(x, (int32_t *) &iso, GxB_ISO)); + + GrB_Type x_type = NULL; + char typename[LAGRAPH_MAX_NAME_LEN]; + LG_TRY (LAGraph_Vector_TypeName(typename, x, msg)); + LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; + + GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; + GrB_IndexUnaryOp idxnum = (n <= INT32_MAX)? + GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; + GRB_TRY (GrB_Vector_new(&ramp_loc, ramp_type, n + 1)); + if(ramp == NULL) { + + GRB_TRY (GrB_assign (ramp_loc, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply (ramp_loc, NULL, NULL, idxnum, ramp_loc, 0, NULL)) ; + } + else + { + GRB_TRY (GxB_Vector_unload( + ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; + LG_ASSERT (ramp_n > n, GrB_DIMENSION_MISMATCH); + GRB_TRY (GxB_Vector_load( + ramp_loc, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), + GxB_IS_READONLY, NULL)) ; + // Since ramp_loc won't free this array I should be safe to load it back + // into ramp. GRB_TRY (GxB_Vector_load( ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; } + GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); + // GxB_fprint(ramp_loc, GxB_COMPLETE, stdout); + GRB_TRY (GxB_Container_new(&con)); + GRB_TRY (GrB_free(&con->p)) ; + GRB_TRY (GrB_free(&con->i)) ; + GRB_TRY (GrB_free(&con->x)) ; + con->p = ramp_loc; + if (c == i) + { + GRB_TRY (GrB_Vector_dup(&con->i, i)) ; + } + else + { + con->i = i; + } + // con->x [0] = false, of length 1 + GRB_TRY (GrB_Vector_new (&(con->x), GrB_BOOL, 1)) ; + GRB_TRY (GrB_assign (con->x, NULL, NULL, 0, GrB_ALL, 1, NULL)) ; + con->format = GxB_SPARSE; + con->orientation = GrB_COLMAJOR; + con->nrows = nrows; + con->ncols = n ; + con->nvals = n ; + con->nrows_nonempty = -1 ; + con->ncols_nonempty = n ; + con->iso = true ; + con->jumbled = false ; + con->format = GxB_SPARSE ; + con->orientation = GrB_COLMAJOR ; + con->Y = NULL ; + GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); + // FIXME: caller should be able to change the descriptor. + GRB_TRY (GrB_mxv(c, mask, accum, dup, P, x, NULL)); + GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); + // Don't let inputs get freed + if (c != i) + con->i = NULL; LG_FREE_ALL; } #endif diff --git a/include/LAGraphX.h b/include/LAGraphX.h index e4fc808f1c..313217ec99 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -294,7 +294,7 @@ int LAGraph_Incidence_Matrix ) ; LAGRAPHX_PUBLIC -int LAGraph_FastAssign +int LAGraph_FastAssign_Monoid ( // output // Vector to be built (or assigned): initialized with correct dimensions. @@ -309,6 +309,31 @@ int LAGraph_FastAssign const GrB_Monoid dup, // Applied to duplicates char *msg ) ; + +LAGRAPHX_PUBLIC +int LAGraph_FastAssign_Semiring +( + // output + // Vector to be built (or assigned): initialized with correct dimensions. + GrB_Vector c, + // inputs + const GrB_Vector mask, + const GrB_BinaryOp accum, + const GrB_Vector i, // Indecies (duplicates allowed) + const GrB_Vector x, // Values + // Optional (Give me a ramp with size > x.size for faster calculations) + const GrB_Vector ramp, + // monoid is applied to duplicates. Binary op should be SECOND. + const GrB_Semiring dup, + char *msg +) ; +#define LAGraph_FastAssign(c, mask, accum, i, x, ramp, dup, msg) \ + _Generic((dup), \ + GrB_Monoid: \ + LAGraph_FastAssign_Monoid, \ + GrB_Semiring: \ + LAGraph_FastAssign_Semiring) \ + (c, mask, accum, i, x, ramp, dup, msg) //**************************************************************************** // Algorithms //**************************************************************************** @@ -1415,14 +1440,14 @@ int LAGraph_SwapEdges char *msg ) ; -int LG_CC_FastSV6_SSGrB10 // SuiteSparse:GraphBLAS method, with GxB extensions +int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GxB extensions ( // output: GrB_Vector *component, // component(i)=r if node is in the component r // input: LAGraph_Graph G, // input graph (modified then restored) char *msg -); +) ; #if defined ( __cplusplus ) } diff --git a/src/benchmark/cc_demo.c b/src/benchmark/cc_demo.c index f20c889675..10fb4192fd 100644 --- a/src/benchmark/cc_demo.c +++ b/src/benchmark/cc_demo.c @@ -333,7 +333,7 @@ int main (int argc, char **argv) #endif //-------------------------------------------------------------------------- - // LG_CC_FastSV6_SSGrB10 + // LG_CC_FastSV7_FA //-------------------------------------------------------------------------- #if 0 for (int trial = 1 ; trial <= nt ; trial++) @@ -347,7 +347,7 @@ int main (int argc, char **argv) { GrB_free (&components2) ; double ttrial = LAGraph_WallClockTime ( ) ; - LAGRAPH_TRY (LG_CC_FastSV6_SSGrB10 (&components2, G, msg)) ; + LAGRAPH_TRY (LG_CC_FastSV7_FA (&components2, G, msg)) ; ttrial = LAGraph_WallClockTime ( ) - ttrial ; ttt += ttrial ; printf ("SV6_v10: nthreads: %2d trial: %2d time: %10.4f sec\n", diff --git a/src/test/test_ConnectedComponents.c b/src/test/test_ConnectedComponents.c index 2392a1c3ae..92cce714fd 100644 --- a/src/test/test_ConnectedComponents.c +++ b/src/test/test_ConnectedComponents.c @@ -136,8 +136,8 @@ void test_cc_matrices (void) OK (LG_check_cc (C2, G, msg)) ; OK (GrB_free (&C2)) ; #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - printf ("\n------ CC_FastSV6_SSGrB_v10:\n") ; - OK (LG_CC_FastSV6_SSGrB10 (&C2, G, msg)) ; + printf ("\n------ LG_CC_FastSV7_FA:\n") ; + OK (LG_CC_FastSV7_FA (&C2, G, msg)) ; ncomponents = count_connected_components (C2) ; TEST_CHECK (ncomponents == ncomp) ; OK (LG_check_cc (C2, G, msg)) ; @@ -201,7 +201,7 @@ void test_cc_errors (void) result = LG_CC_FastSV6 (NULL, NULL, msg) ; TEST_CHECK (result == GrB_NULL_POINTER) ; #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - result = LG_CC_FastSV6_SSGrB10 (NULL, NULL, msg) ; + result = LG_CC_FastSV7_FA (NULL, NULL, msg) ; TEST_CHECK (result == GrB_NULL_POINTER) ; #endif #endif @@ -225,7 +225,7 @@ void test_cc_errors (void) TEST_CHECK (result == -1001) ; printf ("result expected: %d msg:\n%s\n", result, msg) ; #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - result = LG_CC_FastSV6_SSGrB10 (&C, G, msg) ; + result = LG_CC_FastSV7_FA (&C, G, msg) ; TEST_CHECK (result == -1001) ; printf ("result expected: %d msg:\n%s\n", result, msg) ; #endif From 92cd9c912217d83cdb88dcc1e9c2d8df7ef35609 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Fri, 28 Feb 2025 13:36:25 -0600 Subject: [PATCH 066/115] Added vanilla RCC algorithm --- .../algorithm/LAGraph_RichClubCoefficient.c | 249 ++++++++++-------- experimental/test/test_SwapEdges.c | 5 +- src/benchmark/cc_demo.c | 6 +- 3 files changed, 142 insertions(+), 118 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index bfb13e6102..dbc0e98999 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -52,14 +52,11 @@ GrB_free(&plus_2le) ; \ GrB_free(&rcCalculation) ; \ GrB_free(&ramp_v) ; \ + LAGraph_Free((void **) &array_space, NULL) ; \ LAGraph_Free((void **) &index_edge, NULL) ; \ LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ - LAGraph_Free((void **) &edges_per_deg_arr, NULL); \ LAGraph_Free((void **) &ones, NULL); \ - LAGraph_Free((void **) °_vertex_count, NULL); \ - LAGraph_Free((void **) &epd_index, NULL); \ - LAGraph_Free((void **) &vpd_index, NULL); \ } @@ -95,7 +92,6 @@ void rich_club_formula(double *z, const int64_t *x, const int64_t *y) { (*z) = ((double)(*x)) / (((double)(*y)) * (((double)(*y)) - 1.0)); } - int LAGraph_RichClubCoefficient ( // output: @@ -131,11 +127,11 @@ int LAGraph_RichClubCoefficient // max_degree x 1 // the ith entry contains the number of edges whose lowest degree is i. - GrB_Vector edges_per_deg = NULL; + GrB_Vector edges_per_deg = NULL, epd_dense = NULL, epd_I = NULL; // max_degree x 1 // the ith entry contains the number of verticies whose degree is i. - GrB_Vector verts_per_deg = NULL; + GrB_Vector verts_per_deg = NULL, vpd_dense = NULL, vpd_I = NULL; // edge_vec_nvals x 1 // Vector of ones @@ -165,6 +161,8 @@ int LAGraph_RichClubCoefficient GrB_Index deg_vec_size; GrB_Index max_deg; bool iso = false; + + void *array_space = NULL; int64_t *node_edges_arr = NULL, *deg_arr = NULL, *edges_per_deg_arr = NULL, *ones = NULL, @@ -199,7 +197,7 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_new(°rees, GrB_INT64, n)) ; GRB_TRY (GrB_Vector_new(&node_edges, GrB_INT64, n)) ; - + #if LAGRAPH_SUITESPARSE GRB_TRY (GxB_BinaryOp_new( &iseq_2lt, (LAGraph_binary_function) (&iseq_2islt), GrB_INT64, GrB_INT64, GrB_INT64, "iseq_2islt", ISEQ_2ISLT)) ; @@ -207,6 +205,14 @@ int LAGraph_RichClubCoefficient &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), GrB_FP64, GrB_INT64, GrB_INT64, "rich_club_formula", RICH_CLUB_FORMULA)) ; + #else + GRB_TRY (GrB_BinaryOp_new( + &iseq_2lt, (LAGraph_binary_function) (&iseq_2islt), + GrB_INT64, GrB_INT64, GrB_INT64)) ; + GRB_TRY (GrB_BinaryOp_new( + &rcCalculation, (LAGraph_binary_function) (&rich_club_formula), + GrB_FP64, GrB_INT64, GrB_INT64 )) ; + #endif GRB_TRY (GrB_Semiring_new(&plus_2le, GrB_PLUS_MONOID_INT64, iseq_2lt)) ; @@ -231,8 +237,13 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; // Each edge in the graph gets the value of the degree of its row node + #if LAGRAPH_SUITESPARSE GRB_TRY (GrB_mxm( edge_degrees, NULL, NULL, GxB_ANY_FIRST_INT64, D, A, NULL)) ; + #else + GRB_TRY (GrB_mxm( + edge_degrees, NULL, NULL, GrB_PLUS_TIMES_SEMIRING_INT64, D, A, NULL)) ; + #endif // Sum the number of edges each node is "responsible" for. GRB_TRY (GrB_mxv( node_edges, NULL, NULL, plus_2le, edge_degrees, degrees, NULL)) ; @@ -242,16 +253,87 @@ int LAGraph_RichClubCoefficient // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. GRB_TRY (GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; - #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) - if(n == edge_vec_nvals) - { - GRB_TRY (GxB_Vector_unpack_Full ( - node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; - } - else - { + #if LAGRAPH_SUITESPARSE + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) + if(n == edge_vec_nvals) + { + GRB_TRY (GxB_Vector_unpack_Full ( + node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full ( + degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; + } + else + { + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; + LG_TRY(LAGraph_Malloc( + (void **) °_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; + LG_TRY(LAGraph_Malloc( + (void **) &node_edges_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, deg_arr, °_vec_size, degrees + )) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, node_edges_arr, &edge_vec_nvals, node_edges + )) ; + } + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; + LG_TRY (LAGraph_Malloc( + (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; + GRB_TRY (GrB_Matrix_new (&P, GrB_INT64, max_deg, edge_vec_nvals)) ; + GRB_TRY (GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + ramp, NULL, &edge_vec_nvals, ones_v)) ; + ramp[edge_vec_nvals] = edge_vec_nvals; + GRB_TRY (GxB_Matrix_pack_CSC( + P, (GrB_Index **)&ramp, (GrB_Index **)°_arr, + (void **) &node_edges_arr, (edge_vec_nvals + 1) * sizeof(int64_t), + vx_size, vx_size, false, false, NULL + )) ; + GRB_TRY (GrB_mxv( + edges_per_deg, NULL, NULL, GxB_PLUS_FIRST_INT64, P, ones_v, NULL)) ; + GRB_TRY (GrB_mxv( + verts_per_deg, NULL, NULL, GxB_PLUS_PAIR_INT64, P, ones_v, NULL)) ; + #else + if(n == edge_vec_nvals) + { + deg_x = degrees; + node_edges_x = node_edges; + deg_vec_size = n; + } + else + { + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( + degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; + GRB_TRY (GrB_Vector_new(°_x, GrB_BOOL, 0)) ; + GRB_TRY (GrB_Vector_new(&node_edges_x, GrB_BOOL, 0)) ; + GRB_TRY (GxB_Vector_extractTuples_Vector( + NULL, deg_x, degrees, NULL + )) ; + GRB_TRY (GxB_Vector_extractTuples_Vector( + NULL, node_edges_x, node_edges, NULL + )) ; + } + GRB_TRY (GrB_nvals(&edge_vec_nvals, node_edges_x)) + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; + GRB_TRY (GrB_Vector_assign_INT64( + ramp_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply ( + ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + LG_TRY (LAGraph_FastAssign ( + edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, + GxB_PLUS_UINT64_MONOID, msg + )) ; + GRB_TRY (GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (LAGraph_FastAssign ( + verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, + GxB_PLUS_UINT64_MONOID, msg + )) ; + #endif + #else GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; LG_TRY(LAGraph_Malloc( @@ -264,79 +346,21 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; - } - #else - if(n == edge_vec_nvals) - { - deg_x = degrees; - node_edges_x = node_edges; - deg_vec_size = n; - } - else - { - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( - degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; - GRB_TRY (GrB_Vector_new(°_x, GrB_BOOL, 0)) ; - GRB_TRY (GrB_Vector_new(&node_edges_x, GrB_BOOL, 0)) ; - GRB_TRY (GxB_Vector_extractTuples_Vector( - NULL, deg_x, degrees, NULL - )) ; - GRB_TRY (GxB_Vector_extractTuples_Vector( - NULL, node_edges_x, node_edges, NULL - )) ; - } - #endif - - GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)); - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; - GRB_TRY (GrB_Vector_assign_INT64( - ramp_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_apply ( - ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - LG_TRY (LAGraph_FastAssign ( - edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, - GxB_PLUS_UINT64_MONOID, msg - )) ; - GRB_TRY (GrB_Vector_assign_INT64( - ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (LAGraph_FastAssign ( - verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, - GxB_PLUS_UINT64_MONOID, msg - )) ; - #elif LAGRAPH_SUITESPARSE - LG_TRY (LAGraph_Malloc( - (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Matrix_new (&P, GrB_INT64, max_deg, edge_vec_nvals)); - GRB_TRY (GrB_Vector_assign_INT64( - ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - ramp, NULL, &edge_vec_nvals, ones_v)) ; - ramp[edge_vec_nvals] = edge_vec_nvals; - GRB_TRY (GxB_Matrix_pack_CSC( - P, (GrB_Index **)&ramp, (GrB_Index **)°_arr, - (void **) &node_edges_arr, (edge_vec_nvals + 1) * sizeof(int64_t), - vx_size, vx_size, false, false, NULL - )); - GRB_TRY (GrB_mxv( - edges_per_deg, NULL, NULL, GxB_PLUS_FIRST_INT64, P, ones_v, NULL)) ; - GRB_TRY (GrB_mxv( - verts_per_deg, NULL, NULL, GxB_PLUS_PAIR_INT64, P, ones_v, NULL)) ; - #else - // Build with degrees as indecies and handle duplicates via adition - GRB_TRY (GrB_Vector_build ( - edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, - GrB_PLUS_INT64)) ; - - //Hack to make an array of ones - LG_TRY ( - LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Vector_assign_INT64( - ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; - - GRB_TRY (GrB_Vector_build ( - verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; + // Build with degrees as indecies and handle duplicates via adition + GRB_TRY (GrB_Vector_build ( + edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, + GrB_PLUS_INT64)) ; + + //Hack to make an array of ones + GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; + LG_TRY ( + LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; + GRB_TRY (GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; + GRB_TRY (GrB_Vector_build ( + verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; + GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, edges_per_deg)) ; #endif /** @@ -354,31 +378,32 @@ int LAGraph_RichClubCoefficient * * If plus biop is not a monoid, this method should still work? */ - GRB_TRY (GxB_Vector_unpack_CSC( - edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, - &vi_size, &vx_size, &iso, &edge_vec_nvals, NULL, NULL + LG_TRY (LAGraph_Malloc( + &array_space, edge_vec_nvals * 4, sizeof(int64_t), NULL)) ; + epd_index = array_space ; + edges_per_deg_arr = array_space + edge_vec_nvals * sizeof(int64_t) ; + vpd_index = array_space + 2 * edge_vec_nvals * sizeof(int64_t) ; + deg_vertex_count = array_space + 3 * edge_vec_nvals * sizeof(int64_t) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + epd_index, edges_per_deg_arr, &edge_vec_nvals, edges_per_deg )) ; - GRB_TRY (GxB_Vector_unpack_CSC( - verts_per_deg, &vpd_index, (void **)°_vertex_count, - &vi_size, &vx_size, &iso, °_vec_size, NULL, NULL + GRB_TRY (GrB_Vector_extractTuples_INT64( + vpd_index, deg_vertex_count, °_vec_size, verts_per_deg )) ; - - LG_ASSERT(deg_vec_size == edge_vec_nvals, GrB_DIMENSION_MISMATCH); //run a cummulative sum (backwards) on deg_vertex_count - for(uint64_t i = deg_vec_size - 1; i > 0; --i) + for(GrB_Index i = deg_vec_size - 1; i > 0; --i) { - deg_vertex_count[i-1] += deg_vertex_count[i]; - edges_per_deg_arr[i-1] += edges_per_deg_arr[i]; + deg_vertex_count[i-1] += deg_vertex_count[i] ; + edges_per_deg_arr[i-1] += edges_per_deg_arr[i] ; } - - GRB_TRY (GxB_Vector_pack_CSC( - edges_per_deg, &epd_index, (void **)&edges_per_deg_arr, - vi_size, vx_size, false, edge_vec_nvals, NULL, NULL - )); - GRB_TRY (GxB_Vector_pack_CSC( - verts_per_deg, &vpd_index, (void **)°_vertex_count, - vi_size, vx_size, false, deg_vec_size, NULL, NULL - )); + GRB_TRY (GrB_Vector_clear(edges_per_deg)) ; + GRB_TRY (GrB_Vector_clear(verts_per_deg)) ; + GRB_TRY (GrB_Vector_build_INT64( + edges_per_deg, epd_index, edges_per_deg_arr, edge_vec_nvals, NULL + )) ; + GRB_TRY (GrB_Vector_build_INT64( + verts_per_deg, vpd_index, deg_vertex_count, deg_vec_size, NULL + )) ; //Computes the RCC of a matrix GRB_TRY(GrB_eWiseMult( @@ -388,4 +413,4 @@ int LAGraph_RichClubCoefficient LG_FREE_WORK ; return (GrB_SUCCESS) ; -} +} \ No newline at end of file diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index aee3ad0ba7..ae2361c8c3 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -31,9 +31,8 @@ char filename [LEN+1] ; const char* tests [ ] = { "random_unweighted_general1.mtx", -// HACK -// "random_unweighted_general2.mtx", -// "bcsstk13.mtx", + "random_unweighted_general2.mtx", + "bcsstk13.mtx", "" } ; void test_SwapEdges (void) diff --git a/src/benchmark/cc_demo.c b/src/benchmark/cc_demo.c index 10fb4192fd..489119da07 100644 --- a/src/benchmark/cc_demo.c +++ b/src/benchmark/cc_demo.c @@ -350,17 +350,17 @@ int main (int argc, char **argv) LAGRAPH_TRY (LG_CC_FastSV7_FA (&components2, G, msg)) ; ttrial = LAGraph_WallClockTime ( ) - ttrial ; ttt += ttrial ; - printf ("SV6_v10: nthreads: %2d trial: %2d time: %10.4f sec\n", + printf ("FastSV7_FA: nthreads: %2d trial: %2d time: %10.4f sec\n", nthreads, k, ttrial) ; GrB_Index nCC2 = countCC (components2, n) ; if (nCC != nCC2) printf ("failure! %g %g diff %g\n", (double) nCC, (double) nCC2, (double) (nCC-nCC2)) ; } ttt = ttt / ntrials ; - printf ("SV6_v10: nthreads: %2d Avg: time: %10.4f sec ntrials %d\n\n", + printf ("FastSV7_FA: nthreads: %2d Avg: time: %10.4f sec ntrials %d\n\n", nthreads, ttt, ntrials) ; fprintf (stderr, - "SV6_v10: nthreads: %2d Avg: time: %10.4f sec ntrials %d\n", + "FastSV7_FA: nthreads: %2d Avg: time: %10.4f sec ntrials %d\n", nthreads, ttt, ntrials) ; } #endif From 704b16af1b5ba7ad1754e03bb106e8d6117c6dc3 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 13:07:41 -0600 Subject: [PATCH 067/115] Fast Assign transpose and comments --- .../algorithm/LAGraph_RichClubCoefficient.c | 6 +- experimental/algorithm/LG_CC_FastSV7_FA.c | 33 +-- experimental/benchmark/FastAssign_demo.c | 2 +- experimental/utility/LAGraph_FastAssign.c | 268 +++++++++++------- include/LAGraphX.h | 24 +- 5 files changed, 196 insertions(+), 137 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index dbc0e98999..dfee2f000a 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -315,7 +315,7 @@ int LAGraph_RichClubCoefficient NULL, node_edges_x, node_edges, NULL )) ; } - GRB_TRY (GrB_nvals(&edge_vec_nvals, node_edges_x)) + GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, node_edges_x)) GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; GRB_TRY (GrB_Vector_assign_INT64( @@ -324,13 +324,13 @@ int LAGraph_RichClubCoefficient ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, - GxB_PLUS_UINT64_MONOID, msg + GxB_PLUS_UINT64_MONOID, NULL, msg )) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (LAGraph_FastAssign ( verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, - GxB_PLUS_UINT64_MONOID, msg + GxB_PLUS_UINT64_MONOID, NULL, msg )) ; #endif #else diff --git a/experimental/algorithm/LG_CC_FastSV7_FA.c b/experimental/algorithm/LG_CC_FastSV7_FA.c index a1a5708bda..f2e513a5a0 100644 --- a/experimental/algorithm/LG_CC_FastSV7_FA.c +++ b/experimental/algorithm/LG_CC_FastSV7_FA.c @@ -83,7 +83,7 @@ static inline GrB_Info fastsv GrB_BinaryOp min, // GrB_MIN_(integer type) GrB_Semiring min_2nd, // GrB_MIN_SECOND_(integer type) GrB_Vector parent, // parent - GrB_Vector ramp, // [0:n] use to speed up FastAssign + GrB_Vector ramp, // [0:n] used to speed up FastAssign char *msg ) { @@ -110,17 +110,12 @@ static inline GrB_Info fastsv // parent2 = min (mngp, gp) //---------------------------------------------------------------------- - // The parent vector is Parent_Container->i, and thus no longer exists - // when the Parent matrix exists. So the accumulation is done in a - // workspace vector, parent2. + // The parent vector should not be allised into FastAssign, so the + // accumulation is done in a workspace vector, parent2. GRB_TRY (GrB_eWiseAdd (parent2, NULL, NULL, min, mngp, *gp, NULL)) ; - //---------------------------------------------------------------------- - // parent2 = min (parent2, Parent*mngp) using the MIN_SECOND semiring - //---------------------------------------------------------------------- - - // Reduce_assign: This function computes the following, which + // LAGraph_FastAssign: This function computes the following, which // is done explicitly in the Reduce_assign function in LG_CC_Boruvka: // // for (j = 0 ; j < n ; j++) @@ -129,22 +124,12 @@ static inline GrB_Info fastsv // parent2 [i] = min (parent2 [i], mngp [j]) ; // } // - // If Parent(i,j) is present where i == parent (j), then this can be - // written as: - // - // parent2 = min (parent2, Parent*mngp) - // - // when using the min_2nd semiring. This can be done efficiently - // because Parent can be constructed in O(1) time and O(1) additional - // space when using the SuiteSparse load/unload move constructors. The - // min_2nd semiring ignores the values of Parent and operates only on - // the structure, so its values are not relevant. Parent_Container->x - // is thus chosen as a GrB_BOOL array of size 1 where x [0] = false, so - // all entries present in Parent are equal to false. - - // load the parent vector into its matrix form, Parent + // LAGraph_FastAssign does this by building a matrix. + // (See LAGraph_FastAssign.c) Giving it a full ramp vector speeds up the + // function + LG_TRY (LAGraph_FastAssign( - parent2, NULL, min, parent, mngp, ramp, min_2nd, msg)); + parent2, NULL, min, parent, mngp, ramp, min_2nd, NULL, msg)); //---------------------------------------------------------------------- // parent = min (parent, parent2) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index fcfe294645..c3c9b0b1e9 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -132,7 +132,7 @@ int main (int argc, char **argv) GRB_TRY (GrB_Vector_clear(assign_s)) ; t = LAGraph_WallClockTime ( ) ; LG_TRY (LAGraph_FastAssign( - assign_s, NULL, NULL, rand_v, x, NULL, GxB_ANY_BOOL_MONOID, msg + assign_s, NULL, NULL, rand_v, x, NULL, GxB_ANY_BOOL_MONOID, NULL, msg )); t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 990ae00686..9ad0fe6ccf 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -25,16 +25,37 @@ // the following for loop: // for (j = 0 ; j < n ; j++) // { -// uint64_t i = I_vector [j] ; -// c [i] += X_vector [j] ; +// uint64_t i = I_vec [j] ; +// c [i] += X_vec [j] ; // } + // It is fastest when the accum biop is equivalent to the dup moniod and c is a -// full vector or when there is no accumulator and I_vector.nvals is +// full vector or when there is no accumulator and I_vec.nvals is // sufficiently large when compared to c.nrows. // It builds a matix P which is coustructed in O(1) time if a // filled ramp vector is passed in. +// P is built by column and will contain one entry per column placed at row +// I_vec [j]. So, P*X_vec will find for every row the intersections with X_vec, +// apply the dup monoid and put the result with the accumulator back into c at +// that row. + +// X_vec can be sparse if dup is a semiring (dup_second), in which case the jth +// column correspoding to an empty X_vec[j] have no effect on the outcome. + +// desc can also be modified to affect the mask or to pass in GRB_TRAN for +// GrB_INP0, this has some interesting usecases, specifically when X_vec is a +// "map". That is: +// LAGraph_FastAssign(c, NULL, NULL, I_vec, map, NULL, any_second, NULL, msg) +// is equivalent to: +// for (j = 0 ; j < n ; j++) +// { +// c [j] = map[I_vec[j]] ; +// } +// Currently, this is not implemented for LAGraph_FastAssign_Monoid so a +// semiring must be passed in. + #include "LG_internal.h" #include "LAGraphX.h" @@ -43,7 +64,6 @@ #define LG_FREE_ALL \ { \ GrB_free(&P); \ - GrB_free(&ramp_loc); \ GrB_free(&con); \ LAGraph_Free(&ramp_a, msg); \ } @@ -56,82 +76,100 @@ int LAGraph_FastAssign_Monoid // inputs const GrB_Vector mask, const GrB_BinaryOp accum, - const GrB_Vector i, // Indecies (duplicates allowed) - const GrB_Vector x, // Values - // Optional (Give me a ramp with size > x.size for faster calculations) + const GrB_Vector I_vec, // Indecies (duplicates allowed) + const GrB_Vector X_vec, // Values + // Optional (Give me a ramp with size > X_vec.size for faster calculations) const GrB_Vector ramp, const GrB_Monoid dup, // Applied to duplicates + const GrB_Descriptor desc, char *msg ) { // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector // to be sure it remains completely unchanged? // TODO: take a descriptor for the mask and also to get i by value or - // by index. Ditto for x. - // TODO: take in a semiring instead of dup? less intuitive but faster and - // more flexible. - GrB_Vector ramp_loc = NULL; + // by index. Ditto for X_vec. + GrB_Matrix P = NULL; int64_t n, nrows; GxB_Container con = NULL; - void *ramp_a = NULL; - int ramp_h = 0; - int64_t ramp_n = 0, ramp_size = 0; - + void *ramp_a = NULL, *i_a; + int ramp_h = 0, trsp = 0, i_h = 0; + int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; + GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; bool iso = false; + //TODO: assert inputs are full or desc say to use by value or by index. LG_ASSERT (c != NULL, GrB_NULL_POINTER); - LG_ASSERT (i != NULL, GrB_NULL_POINTER); - LG_ASSERT (x != NULL, GrB_NULL_POINTER); - LG_ASSERT_MSG (c != x, GrB_NOT_IMPLEMENTED, "c cannot be aliased with x."); - - GRB_TRY (GrB_Vector_size(&n, i)); - GRB_TRY (GrB_Vector_size(&nrows, c)); - GRB_TRY (GrB_Vector_get_INT32(x, (int32_t *) &iso, GxB_ISO)); + LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER); + LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER); + LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, "c cannot be aliased with X_vec."); + //---------------------------------------------------------------------- + // Find dimensions and type + //---------------------------------------------------------------------- + GRB_TRY (GrB_Vector_size(&n, I_vec)) ; + if(desc != NULL) + { + GRB_TRY (GrB_get(desc, &trsp, GrB_INP0)) ; + LG_ASSERT_MSG (trsp == GrB_DEFAULT, GrB_NOT_IMPLEMENTED, + "Transpose can only be used with a semiring."\ + "Pass dup_second for this to work.") ; + } + GRB_TRY (GrB_Vector_size(&nrows, c)) ; + GRB_TRY (GrB_Vector_get_INT32(X_vec, (int32_t *) &iso, GxB_ISO)); - GrB_Type x_type = NULL; char typename[LAGRAPH_MAX_NAME_LEN]; - LG_TRY (LAGraph_Vector_TypeName(typename, x, msg)); + LG_TRY (LAGraph_Vector_TypeName(typename, X_vec, msg)); LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; - GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; - GrB_IndexUnaryOp idxnum = (n <= INT32_MAX)? - GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; - GRB_TRY (GrB_Vector_new(&ramp_loc, ramp_type, n + 1)); + + //---------------------------------------------------------------------- + // Load up containers + //---------------------------------------------------------------------- + GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); + GRB_TRY (GxB_Container_new(&con)); if(ramp == NULL) { - GRB_TRY (GrB_assign (ramp_loc, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_apply (ramp_loc, NULL, NULL, idxnum, ramp_loc, 0, NULL)) ; + GRB_TRY (GrB_free(&(con->p))) ; + ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; + GrB_IndexUnaryOp idxnum = (n + 1 <= INT32_MAX)? + GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; + GRB_TRY (GrB_Vector_new(&(con->p), ramp_type, n + 1)); + GRB_TRY (GrB_assign (con->p, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply (con->p, NULL, NULL, idxnum, con->p, 0, NULL)) ; } else { GRB_TRY (GxB_Vector_unload( ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; - LG_ASSERT (ramp_n > n, GrB_DIMENSION_MISMATCH); + LG_ASSERT_MSG (ramp_n > n, GrB_DIMENSION_MISMATCH, "Ramp too small!"); GRB_TRY (GxB_Vector_load( - ramp_loc, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), + con->p, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), GxB_IS_READONLY, NULL)) ; - // Since ramp_loc won't free this array I should be safe to load it back + // Since con->p won't free this array I should be safe to load it back // into ramp. GRB_TRY (GxB_Vector_load( ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; + ramp_a = NULL; } - GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); - // GxB_fprint(ramp_loc, GxB_COMPLETE, stdout); - GRB_TRY (GxB_Container_new(&con)); - GRB_TRY (GrB_free(&con->p)) ; - GRB_TRY (GrB_free(&con->i)) ; - GRB_TRY (GrB_free(&con->x)) ; - con->p = ramp_loc; - if (c == i) + if (c == I_vec) { - GRB_TRY (GrB_Vector_dup(&con->i, i)) ; + GRB_TRY (GrB_Vector_dup(&con->i, I_vec)) ; } else { - con->i = i; + // con->i = I_vec + GRB_TRY (GxB_Vector_unload( + I_vec, &i_a, &i_type, &i_n, &i_size, &i_h, NULL)) ; + GRB_TRY (GxB_Vector_load( + con->i, &i_a, i_type, i_n, i_size, GxB_IS_READONLY, NULL)) ; + // Since con->i won't free this array I should be safe to load it back + // into I_vec. + GRB_TRY (GxB_Vector_load( + I_vec, &i_a, i_type, i_n, i_size, i_h, NULL)) ; + i_a = NULL; } - con->x = x; + con->x = X_vec; con->format = GxB_SPARSE; con->orientation = GrB_COLMAJOR; con->nrows = nrows; @@ -143,16 +181,20 @@ int LAGraph_FastAssign_Monoid con->format = GxB_SPARSE ; con->orientation = GrB_COLMAJOR ; con->Y = NULL ; + //---------------------------------------------------------------------- + // Load P and do reduce. + //---------------------------------------------------------------------- GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); - // TODO: check if it's faster to make P iso and multiply by x with/SECOND GRB_TRY (GrB_reduce( - c, mask, accum, dup, P, NULL)) ; + c, mask, accum, dup, P, desc)) ; GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); // Don't let inputs get freed - if (c != i) - con->i = NULL; con->x = NULL; - LG_FREE_ALL; + //---------------------------------------------------------------------- + // Free work. + //---------------------------------------------------------------------- + GrB_free(&P) ; + GrB_free(&con) ; } // This method can be faster if given a builtin semiring. @@ -164,84 +206,112 @@ int LAGraph_FastAssign_Semiring // inputs const GrB_Vector mask, const GrB_BinaryOp accum, - const GrB_Vector i, // Indecies (duplicates allowed) - const GrB_Vector x, // Values - // Optional (Give me a ramp with size > x.size for faster calculations) + const GrB_Vector I_vec, // Indecies (duplicates allowed) + const GrB_Vector X_vec, // Values + // Optional (Give me a ramp with size > X_vec.size for faster calculations) const GrB_Vector ramp, // monoid is applied to duplicates. Binary op should be SECOND. const GrB_Semiring dup, + const GrB_Descriptor desc, char *msg ) { // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector // to be sure it remains completely unchanged? - // TODO: take a descriptor for the mask and also to get i by value or - // by index. Ditto for x. - // TODO: take in a semiring instead of dup? less intuitive but faster and - // more flexible. - GrB_Vector ramp_loc = NULL; + // TODO: take a descriptor for the mask and also to get I_vec by value or + // by index. Ditto for X_vec. GrB_Matrix P = NULL; int64_t n, nrows; GxB_Container con = NULL; - void *ramp_a = NULL; - int ramp_h = 0; - int64_t ramp_n = 0, ramp_size = 0; - + void *ramp_a = NULL, *i_a; + int ramp_h = 0, trsp = 0, i_h = 0; + int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; + GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; bool iso = false; - //TODO: assert inputs are full or desc say to use by value or by index. - LG_ASSERT (c != NULL, GrB_NULL_POINTER); - LG_ASSERT (i != NULL, GrB_NULL_POINTER); - LG_ASSERT (x != NULL, GrB_NULL_POINTER); - LG_ASSERT_MSG (c != x, GrB_NOT_IMPLEMENTED, "c cannot be aliased with x."); + //---------------------------------------------------------------------- + // Check inputs + //---------------------------------------------------------------------- + //TODO: assert inputs are full or desc says to use by value + LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; + LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; + LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; + LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, "c cannot be aliased with X_vec.") ; - GRB_TRY (GrB_Vector_size(&n, i)); - GRB_TRY (GrB_Vector_size(&nrows, c)); - GRB_TRY (GrB_Vector_get_INT32(x, (int32_t *) &iso, GxB_ISO)); + //---------------------------------------------------------------------- + // Find dimensions and type + //---------------------------------------------------------------------- + GRB_TRY (GrB_Vector_size(&n, I_vec)) ; + if(desc != NULL) + { + GRB_TRY (GrB_get(desc, &trsp, GrB_INP0)) ; + if(trsp == GrB_TRAN) + { + GRB_TRY (GrB_Vector_size(&nrows, X_vec)) ; + } + else + { + GRB_TRY (GrB_Vector_size(&nrows, c)) ; + } + } + else + { + GRB_TRY (GrB_Vector_size(&nrows, c)) ; + } + GRB_TRY (GrB_Vector_get_INT32(X_vec, (int32_t *) &iso, GxB_ISO)) ; - GrB_Type x_type = NULL; char typename[LAGRAPH_MAX_NAME_LEN]; - LG_TRY (LAGraph_Vector_TypeName(typename, x, msg)); + LG_TRY (LAGraph_Vector_TypeName(typename, X_vec, msg)); LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; - GrB_Type ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; - GrB_IndexUnaryOp idxnum = (n <= INT32_MAX)? - GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; - GRB_TRY (GrB_Vector_new(&ramp_loc, ramp_type, n + 1)); + //---------------------------------------------------------------------- + // Load up containers + //---------------------------------------------------------------------- + GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); + GRB_TRY (GxB_Container_new(&con)); + if(ramp == NULL) { - - GRB_TRY (GrB_assign (ramp_loc, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_apply (ramp_loc, NULL, NULL, idxnum, ramp_loc, 0, NULL)) ; + GRB_TRY (GrB_free(&(con->p))) ; + ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; + GrB_IndexUnaryOp idxnum = (n + 1 <= INT32_MAX)? + GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; + GRB_TRY (GrB_Vector_new(&(con->p), ramp_type, n + 1)); + GRB_TRY (GrB_assign (con->p, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply (con->p, NULL, NULL, idxnum, con->p, 0, NULL)) ; } else { GRB_TRY (GxB_Vector_unload( ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; - LG_ASSERT (ramp_n > n, GrB_DIMENSION_MISMATCH); + LG_ASSERT_MSG (ramp_n > n, GrB_DIMENSION_MISMATCH, "Ramp too small!"); GRB_TRY (GxB_Vector_load( - ramp_loc, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), + con->p, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), GxB_IS_READONLY, NULL)) ; - // Since ramp_loc won't free this array I should be safe to load it back + // Since con->p won't free this array I should be safe to load it back // into ramp. GRB_TRY (GxB_Vector_load( ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; + ramp_a = NULL; } - GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); - // GxB_fprint(ramp_loc, GxB_COMPLETE, stdout); - GRB_TRY (GxB_Container_new(&con)); - GRB_TRY (GrB_free(&con->p)) ; - GRB_TRY (GrB_free(&con->i)) ; - GRB_TRY (GrB_free(&con->x)) ; - con->p = ramp_loc; - if (c == i) + if (c == I_vec) { - GRB_TRY (GrB_Vector_dup(&con->i, i)) ; + GRB_TRY (GrB_Vector_dup(&con->i, I_vec)) ; } else { - con->i = i; + // con->i = I_vec; + GRB_TRY (GxB_Vector_unload( + I_vec, &i_a, &i_type, &i_n, &i_size, &i_h, NULL)) ; + GRB_TRY (GxB_Vector_load( + con->i, &i_a, i_type, i_n, i_size, GxB_IS_READONLY, NULL)) ; + // Since con->i won't free this array I should be safe to load it back + // into I_vec. + GRB_TRY (GxB_Vector_load( + I_vec, &i_a, i_type, i_n, i_size, i_h, NULL)) ; + i_a = NULL; } // con->x [0] = false, of length 1 + GRB_TRY (GrB_free(&(con->x))) ; GRB_TRY (GrB_Vector_new (&(con->x), GrB_BOOL, 1)) ; GRB_TRY (GrB_assign (con->x, NULL, NULL, 0, GrB_ALL, 1, NULL)) ; con->format = GxB_SPARSE; @@ -256,13 +326,15 @@ int LAGraph_FastAssign_Semiring con->format = GxB_SPARSE ; con->orientation = GrB_COLMAJOR ; con->Y = NULL ; + //---------------------------------------------------------------------- + // Load P and do the mxv + //---------------------------------------------------------------------- GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); - // FIXME: caller should be able to change the descriptor. - GRB_TRY (GrB_mxv(c, mask, accum, dup, P, x, NULL)); - GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); - // Don't let inputs get freed - if (c != i) - con->i = NULL; - LG_FREE_ALL; + GRB_TRY (GrB_mxv(c, mask, accum, dup, P, X_vec, desc)); + //---------------------------------------------------------------------- + // Free work. + //---------------------------------------------------------------------- + GrB_free(&P) ; + GrB_free(&con) ; } #endif diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 313217ec99..1503b6e4c9 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -302,11 +302,12 @@ int LAGraph_FastAssign_Monoid // inputs const GrB_Vector mask, const GrB_BinaryOp accum, - const GrB_Vector i, // Indecies (duplicates allowed) - const GrB_Vector x, // Values + const GrB_Vector I_vec, // Indecies (duplicates allowed) + const GrB_Vector X_vec, // Values // Optional (Give me a ramp with size > x.size for faster calculations) const GrB_Vector ramp, const GrB_Monoid dup, // Applied to duplicates + const GrB_Descriptor desc, char *msg ) ; @@ -319,21 +320,22 @@ int LAGraph_FastAssign_Semiring // inputs const GrB_Vector mask, const GrB_BinaryOp accum, - const GrB_Vector i, // Indecies (duplicates allowed) - const GrB_Vector x, // Values + const GrB_Vector I_vec, // Indecies (duplicates allowed) + const GrB_Vector X_vec, // Values // Optional (Give me a ramp with size > x.size for faster calculations) const GrB_Vector ramp, // monoid is applied to duplicates. Binary op should be SECOND. const GrB_Semiring dup, + const GrB_Descriptor desc, char *msg ) ; -#define LAGraph_FastAssign(c, mask, accum, i, x, ramp, dup, msg) \ - _Generic((dup), \ - GrB_Monoid: \ - LAGraph_FastAssign_Monoid, \ - GrB_Semiring: \ - LAGraph_FastAssign_Semiring) \ - (c, mask, accum, i, x, ramp, dup, msg) +#define LAGraph_FastAssign(c, mask, accum, I_vec, X_vec, ramp, dup, desc, msg) \ + _Generic((dup), \ + GrB_Monoid: \ + LAGraph_FastAssign_Monoid, \ + GrB_Semiring: \ + LAGraph_FastAssign_Semiring) \ + (c, mask, accum, I_vec, X_vec, ramp, dup, desc, msg) //**************************************************************************** // Algorithms //**************************************************************************** From 6c370c0edc29c8acd862e613b83b11187ec7582b Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 13:12:59 -0600 Subject: [PATCH 068/115] Starting SwapEdgesV2 --- experimental/algorithm/LAGraph_SwapEdges.c | 3 +- experimental/algorithm/LAGraph_SwapEdgesV2.c | 694 +++++++++++++++++++ experimental/benchmark/edgeSwap_demo.c | 2 +- experimental/test/test_SwapEdges.c | 2 +- include/LAGraphX.h | 10 + 5 files changed, 708 insertions(+), 3 deletions(-) create mode 100644 experimental/algorithm/LAGraph_SwapEdgesV2.c diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index a7ecfb81b0..b3294fc3ee 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -14,7 +14,7 @@ // Contributed by Gabriel Gomez, Texas A&M University //------------------------------------------------------------------------------ - +#if 0 #define FREE_LOOP \ { \ GrB_free (&M) ; \ @@ -716,3 +716,4 @@ int LAGraph_SwapEdges LG_FREE_WORK ; return (GrB_SUCCESS) ; } +#endif \ No newline at end of file diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c new file mode 100644 index 0000000000..87ebdcb1d4 --- /dev/null +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -0,0 +1,694 @@ +//------------------------------------------------------------------------------ +// LAGraph_SwapEdges: randomly swaps edges in a graph +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Gabriel Gomez, Texas A&M University + +//------------------------------------------------------------------------------ +#define FREE_LOOP \ +{ \ + GrB_free (&M) ; \ + GrB_free (&M_thin) ; \ + GrB_free (E_split) ; \ + GrB_free (E_split + 1) ; \ + GrB_free(&dup_swaps_v); \ + GrB_free(&bad_swaps); \ + GrB_free(&new_hashed_edges); \ + GrB_free(&selected_m); \ + GrB_free(&hashed_edges); \ + GrB_free(&leftover_e) ; \ + LAGraph_Free((void**)&edge_perm, msg) ; \ +} + +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + GrB_free (&E) ; \ + GrB_free (&A_tril) ; \ + GrB_free (&random_v) ; \ + GrB_free (&r_permute) ; \ + GrB_free (&ramp_v) ; \ + GrB_free (&hramp_v) ; \ + GrB_free (&swapVals) ; \ + GrB_free (&r_60) ; \ + GrB_free(&exists); \ + GrB_free (&selected) ; \ + GrB_free (&E_vec) ; \ + GrB_free (&swap_pair) ; \ + GrB_free (&swap_verts) ; \ + GrB_free (&hash_seed_e) ; \ + GrB_free (&duplicate) ; \ + GrB_free (¬_pointers) ; \ + LAGraph_Free((void**)&indices, msg) ; \ + LAGraph_Free((void**)&half_ramp, msg) ; \ + LAGraph_Free((void**) &val_of_P, msg); \ + LAGraph_Free((void **) &dup_swaps, NULL); \ + LAGraph_Free((void **) ¬_ptrs, NULL); \ + FREE_LOOP ; \ +} + +#define LG_FREE_ALL \ +{ \ + /* free any workspace used here */ \ + LG_FREE_WORK ; \ + /* free all the output variable(s) */ \ + GrB_free(A_new) ; \ + /* take any other corrective action */ \ +} + +#include "LG_internal.h" +#include "LAGraphX.h" + +void shift_and + (uint16_t *z, const uint16_t *x) + { + (*z) = (*x) & ((*x) << 8); + (*z) |= (*z) >> 8; + } +#define SHIFT_AND \ +"void shift_and \n"\ +" (uint16_t *z, const uint16_t *x) \n"\ +" { \n"\ +" (*z) = (*x) & ((*x) << 8); \n"\ +" (*z) |= (*z) >> 8; \n"\ +" }" + +typedef struct { + uint64_t a; + uint64_t b; +} edge_type; +#define EDGE_TYPE \ +"typedef struct { uint64_t a; uint64_t b; } edge_type;" + +typedef struct { + uint64_t a; + uint64_t b; + uint64_t c; + uint64_t d; +} swap_type; +#define SWAP_TYPE \ +"typedef struct { \n"\ +" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n" \ +"}swap_type;" + +void swap_ab +(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) +{ + if(I & 1) + { + uint64_t temp = x->a; + z->a = x->b; + z->b = temp; + } +} +#define SWAP_AB \ +"void swap_ab \n"\ +"(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"{ \n"\ +" if (I & 1) \n"\ +" { \n"\ +" uint64_t temp = x->a; \n"\ +" z->a = x->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +"}" + +void swap_bc +(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) +{ + memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. + if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; + if(I & 1) + { + uint64_t temp = z->d; + z->d = z->b; + z->b = temp; + } + else + { + uint64_t temp = z->c; + z->c = z->b; + z->b = temp; + } +} +#define SWAP_BC \ +"void swap_bc \n"\ +"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"{ \n"\ +" memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. \n"\ +" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ +"if(I & 1) \n"\ +" { \n"\ +" uint64_t temp = z->d; \n"\ +" z->d = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +" else \n"\ +" { \n"\ +" uint64_t temp = z->c; \n"\ +" z->c = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +"}" + + +//Simply making a cantor pairing then masking. +void hash_edge +(uint64_t *z, const edge_type *x, const uint64_t *mask) +{ + (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; + (*z) += (x->a < x->b)? x->a: x->b; + (*z) &= (*mask); +} +#define HASH_EDGE \ +"void hash_edge \n"\ +"(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ +"{ \n"\ +" (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; \n"\ +" (*z) += (x->a < x->b)? x->a: x->b; \n"\ +" (*z) &= (*mask); \n"\ +"}" + +void add_term + (uint8_t *z, const uint8_t *x, const uint8_t *y) +{ + (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); +} +#define ADD_TERM \ +"void add_term \n"\ +"(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ +"{ \n"\ +" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); \n"\ +"}" + +void check_map + (uint8_t *z, const uint64_t *x, const uint8_t *map) +{ + (*z) = map[*x]; +} +#define CHECK_MAP \ +"void check_map \n"\ +"(uint8_t *z, const uint64_t *x, const uint8_t *map) \n"\ +"{ \n"\ +" (*z) = map[*x]; \n"\ +"}" +int LAGraph_SwapEdgesV2 +( + // output + GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped + // input: not modified + LAGraph_Graph G, + GrB_Index Q, // Swaps per edge + char *msg +) +{ + //-------------------------------------------------------------------------- + // Declorations + //-------------------------------------------------------------------------- + GrB_Matrix A = NULL; // n x n Adjacency Matrix + + // e x 2 with entries corresponding to verticies of an edge + GrB_Matrix E = NULL, E_t = NULL; + GrB_Vector E_vec = NULL; + GrB_Vector E_split[2] = {NULL, NULL}; + + + // swaps x 4 + // Each row contains 4 entries corresponding to the verticies + // that are involved in the swap. + GrB_Vector M = NULL, M_thin = NULL; + + // n = |V| e = |E| + GrB_Index n = 0, e = 0; + + // n x n + // Lower triangle of adjacency matrix + GrB_Matrix A_tril = NULL ; + + // e x 1 random vectors + GrB_Vector random_v = NULL, r_permute = NULL; + + // indicies for A + GrB_Index *indices = NULL; + + // [0,1,1,. . ., 0] swap a given edge. Boolean + GrB_Vector swapVals = NULL; + + GrB_Vector ramp_v = NULL; + GrB_Vector hramp_v = NULL; + + // [0,0,1,1,2,2,...] + GrB_Index *half_ramp = NULL ; + + // Arrays to unpack edge permutation + GrB_Vector edge_perm = NULL, leftover_e = NULL; + bool iso = false; + + // Number of values kept in each phase + GrB_Index n_keep; + GrB_Index *arr_keep = NULL; + void *junk = NULL; + + + // swaps x 2 matrix which holds the hashes of each planned edge. + GrB_Vector new_hashed_edges = NULL; + + // GrB_Matrix p_buckets = NULL; + + // swaps used for "outdegree" + GrB_Vector big_dense; + + // e holds hashes of old edges + GrB_Vector hashed_edges = NULL; + + // 2^60 holds the buckets in which hashes collided. + GrB_Vector exists = NULL; + GrB_Vector new_edges_h = NULL; + + GrB_UnaryOp lg_shiftland = NULL; + + // b1 <---> a2 or b1 <---> b2 + GrB_IndexUnaryOp swap_pair = NULL; + + GrB_IndexUnaryOp swap_verts = NULL; + + + + // z = h_y(x) + GrB_BinaryOp hash_seed_e = NULL; + + // z = min(2,x+y) + GrB_BinaryOp add_term_biop = NULL; + GrB_Monoid add_term_monoid = NULL; + GrB_Semiring plus_term_one = NULL; + GrB_BinaryOp lg_one_uint8 = NULL; + + + GrB_BinaryOp duplicate = NULL; + + // Toople types + GrB_Type lg_edge = NULL, lg_swap = NULL; + + int16_t *dup_swaps = NULL; + GrB_Vector dup_swaps_v = NULL; + // BOOL swaps * 2 vector that holds false if an edge in the swap did not "work" + GrB_Vector bad_swaps = NULL; + GrB_Vector not_pointers = NULL; + uint64_t *not_ptrs = NULL; + + GrB_Vector sort_h = NULL; + GrB_Vector r_60 = NULL; + + GrB_Matrix selected_m = NULL; + GrB_Vector selected = NULL; + + + // Constants --------------------------------------------------------------- + + uint64_t *val_of_P = NULL; + + GrB_Vector x = NULL; + + GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; + + GrB_Index ind_size = 0; + + //-------------------------------------------------------------------------- + // Check inputs TODO + //-------------------------------------------------------------------------- + LG_ASSERT_MSG ( + G->kind == LAGraph_ADJACENCY_UNDIRECTED, + LAGRAPH_INVALID_GRAPH, + "G must be undirected" + ) ; + // char type[LAGRAPH_MAX_NAME_LEN]; + LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, + "G->nself_edges must be zero") ; + // GRB_TRY (GrB_get(A, type, GrB_EL_TYPE_STRING)) ; + // LG_ASSERT_MSG (MATCHNAME(type, "GrB_BOOL") || MATCHNAME(type, "bool"), LAGRAPH_INVALID_GRAPH, + // "A must be structural") ; + + //-------------------------------------------------------------------------- + // Initializations + //-------------------------------------------------------------------------- + A = G->A ; + + // Types + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; + GRB_TRY (GxB_Type_new( + &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; + GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; + GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; + + + // Extract lower triangular edges. + GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; + GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; + + + GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; + GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; + GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; + + //Init Operators ----------------------------------------------------------- + GRB_TRY (GxB_UnaryOp_new ( + &lg_shiftland, (GxB_unary_function) (&shift_and), + GrB_UINT16, GrB_UINT16, "shift_and", SHIFT_AND + )) ; + GRB_TRY(GxB_BinaryOp_new( + &hash_seed_e, (GxB_binary_function) (&hash_edge), + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_verts, (GxB_index_unary_function) (&swap_ab), + lg_edge, lg_edge, GrB_BOOL, "swap_ab", SWAP_AB + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_pair, (GxB_index_unary_function) (&swap_bc), + lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC + )) ; + GRB_TRY(GxB_BinaryOp_new( + &add_term_biop, (GxB_binary_function) (&add_term), + GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM + )); + GRB_TRY(GxB_BinaryOp_new( + &duplicate, (GxB_binary_function) (&check_map), + GrB_UINT8, GrB_UINT64, GrB_UINT8, "check_map", CHECK_MAP + )); + // This monoid has only been designed for inputs in {0,1,2}, other behavior + // is undefined. + // (0,x) -> x, (1,1) -> 2, (2,x) -> 2 (and commutative) + // Aka (x,y) -> min(2, x + y) + GRB_TRY (GxB_Monoid_terminal_new_UINT8( + &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 + )); + // Now working with the built-in ONEB binary op + GRB_TRY(GrB_Semiring_new( + &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 + )); + // count swaps + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; + + // Make E Matrix ----------------------------------------------------------- + LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; + GRB_TRY ( + GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) + ) ; + GRB_TRY (GxB_Matrix_pack_FullC ( + E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL + )) ; + GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); + int shift_e = __builtin_clzl(e); + uint64_t ehash_size = (1ull << (67-shift_e)); + // if(ehash_size > 6*e) ehash_size/=2; + printf("Hash Size: %ld", ehash_size); + GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, ehash_size)) ; + + // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); + // Init Ramps -------------------------------------------------------------- + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; + GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; + GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, + GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; + GRB_TRY(GrB_Vector_dup(¬_pointers, hramp_v)) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + not_pointers, NULL, NULL, GrB_TIMES_UINT64, not_pointers, 2UL, NULL)) ; + GrB_Index ramp_size; + GRB_TRY (GxB_Vector_unpack_Full ( + hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; + + // Init Constants ---------------------------------------------------------- + GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; + GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; + GRB_TRY (GrB_Scalar_new (&one64, GrB_UINT64)) ; + GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; + GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; + GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; + + + // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_INT8, ehash_size)) ; + GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); + GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); + + LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; + val_of_P[0] = (bool) 1; + + // Make Random ------------------------------------------------------------- + GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; + GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; + // GRB_TRY(GrB_set (new_edges_h, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; + GRB_TRY (GrB_Vector_assign_UINT64 ( + random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; + //TODO: Change seed + LG_TRY( + LAGraph_Random_Seed(random_v, 1548945616ul, msg)); + GRB_TRY (GxB_Matrix_unpack_FullR( + E, (void **) &indices, &ind_size, &iso, NULL)); + GRB_TRY (GxB_Vector_pack_Full( + E_vec, (void **) &indices, ind_size, iso, NULL)); + printf("Entering loop, Good Luck:\n") ; + while(num_swaps < e * Q && num_attempts < e * Q * 5) + { + GrB_Index perm_size, arr_size, junk_size; + // Coming into the loop: + // E must be the incidence matrix of the new graph. W/o self edges nor + // parallel edges. Each row must have exactly two distinct values. + // random_v has a radom dense vector. + // GRB_TRY (GxB_Vector_sort ( + // NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL + // )) ; + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL + )) ; + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, e)); + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_FastAssign( + r_permute, NULL, NULL, r_60, x, ramp_v, GxB_ANY_FIRSTJ_INT64, + NULL, msg)); + + GrB_Index edges_permed = 0; + GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)); + GRB_TRY (GrB_Vector_new(&edge_perm, GrB_BOOL, edges_permed)) ; + GRB_TRY (GrB_Vector_extractTuples(NULL, edge_perm, r_permute, NULL)) ; + swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, edges_permed / 2) ; + + // Chop of last vertex if vertex count is odd + GRB_TRY (GrB_Vector_resize(edge_perm, swaps_per_loop * 2)); + + // GxB_fprint(r_permute, GxB_SHORT, stdout); + GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)); + GRB_TRY (GxB_Vector_extract_Vector( + M_thin, NULL, NULL, E_vec, edge_perm, NULL + )) ; + + + + // Using a CSC pack/unpack strategy to pick out edges involved in the swap + // GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, e, swaps_per_loop * 2)); + // GRB_TRY (GxB_Matrix_pack_CSC( + // selected_m, &ramp, &edge_perm, (void**) &val_of_P, + // swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL + // )); + // GRB_TRY (GrB_Matrix_reduce_Monoid( + // selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, NULL + // )); + // GRB_TRY (GxB_Matrix_unpack_CSC( + // selected_m, &ramp, &edge_perm, (void**) &val_of_P, &junk_size, + // &junk_size, &junk_size, &iso, NULL, NULL + // )); + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + LG_TRY(LAGraph_FastAssign( + selected, NULL, NULL, edge_perm, x, ramp_v, GxB_ANY_BOOL_MONOID, + NULL, msg)); + GRB_TRY (GrB_Vector_assign_BOOL( + selected, selected, NULL, 1, GrB_ALL, 0, GrB_DESC_RSC + )); + GRB_TRY (GrB_Vector_new(&leftover_e, GrB_INT64, 0)); + GRB_TRY (GrB_Vector_extractTuples( + leftover_e, NULL, selected, NULL + )) ; + + GRB_TRY (GrB_Vector_nvals(&edges_permed, leftover_e)); + GRB_TRY (GrB_Vector_new(&E_split[1], lg_edge, edges_permed)); + GRB_TRY (GxB_Vector_extract_Vector( + E_split[1], NULL, NULL, E_vec, leftover_e, NULL)); + GRB_TRY (GrB_Vector_dup(E_split, M_thin)) ; + + GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; + GrB_Index dup_arr_size = 0; + GRB_TRY (GxB_Vector_unpack_Full( + M_thin, (void **) &indices, &ind_size, &iso, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full( + M, (void **) &indices, ind_size, iso, NULL + )) ; + GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( + M, NULL, NULL, swap_pair, M, false, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full( + M, (void **) &indices, &ind_size, &iso, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full( + M_thin, (void **) &indices, ind_size, iso, NULL + )) ; + + // Hash Edges ---------------------------------------------------------- + GRB_TRY (GrB_Vector_new( + &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; + GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; + + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, + ehash_size - 1ll, NULL + )) ;//0xFB21C651E98DF25ULL + GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( + hashed_edges, NULL, NULL, hash_seed_e, E_vec, + ehash_size - 1ll, NULL + )) ; + + //---------------------------------------------------------------------- + // Build Hash Buckets + //---------------------------------------------------------------------- + + // Making the hash set for existing edges via a pack CSC trick. + GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; + GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; + GrB_Index hvn_size; + // GRB_TRY(GxB_Vector_unpack_Full( + // new_hashed_edges, (void **) &hash_vals_new, + // &hvn_size, &iso, NULL + // )) ; + // GRB_TRY(GxB_Vector_unpack_Full( + // hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL + // )) ; + // GRB_TRY (GxB_Matrix_pack_CSC( + // hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, + // perm_size, sizeof(bool), true, false, NULL + // )); + // GRB_TRY (GrB_mxv( + // exists, NULL, NULL, GxB_ANY_PAIR_UINT8, hash_m, x, NULL)); + // GRB_TRY (GxB_Matrix_unpack_CSC( + // hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, + // &perm_size, &junk_size, &iso, NULL, NULL + // )); + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, e)) ; + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + LG_TRY (LAGraph_FastAssign( + exists, NULL, NULL, hashed_edges, x, ramp_v, GxB_ANY_PAIR_UINT8, + NULL, msg + )) ; + + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + + // Want to make exists full. But assign takes too long. + // Exists cannot possibly be full at this point. + int8_t *exists_bitmap = NULL; + uint64_t exists_bsize; + GRB_TRY (GxB_Vector_unpack_Bitmap( + exists, &exists_bitmap, &junk, &exists_bsize, &junk_size, &iso, + &junk_size, NULL + )); + GRB_TRY (GxB_Vector_pack_Full( + exists, (void **)&exists_bitmap, exists_bsize, false, NULL + )); + LG_TRY (LAGraph_FastAssign( + exists, NULL, add_term_biop, new_hashed_edges, x, ramp_v, + plus_term_one, NULL, msg + )) ; + GRB_TRY (GrB_Vector_select_UINT8( + exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 1, + NULL + )); + LG_TRY (LAGraph_FastAssign( + dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, + GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg + )) ; + + GRB_TRY (GrB_Vector_clear(x)); + + int8_t *dup_val = NULL; + GRB_TRY (GxB_Vector_unpack_Bitmap( + dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, + &dup_arr_size, &junk_size, &iso, &n_keep, NULL + )); + LAGraph_Free((void **) &dup_val, msg); + GRB_TRY (GxB_Vector_pack_Full( + bad_swaps, (void **) &dup_swaps, dup_arr_size, false, NULL + )); + GRB_TRY (GrB_apply( + bad_swaps, NULL, NULL, lg_shiftland, bad_swaps, NULL)) ; + GRB_TRY (GxB_Vector_unpack_Full( + bad_swaps, (void **) &dup_swaps, &dup_arr_size, &iso, NULL + )); + GRB_TRY (GxB_Vector_pack_Full( + dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL + )) ; + GRB_TRY (GrB_Vector_clear(exists)) ; + // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; + // Swap Good Edges ----------------------------------------------------- + + GRB_TRY(GrB_Vector_assign( + E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL + )) ; + GRB_TRY(GrB_Vector_assign_BOOL( + dup_swaps_v, dup_swaps_v, NULL, true, GrB_ALL, 0, GrB_DESC_R)); + GRB_TRY(GrB_Vector_nvals(&n_keep, dup_swaps_v)); + n_keep /= 2; + GRB_TRY (GxB_Matrix_concat( + (GrB_Matrix) E_vec, (GrB_Matrix *)E_split, 2, 1, NULL)); + + FREE_LOOP ; // Free Matricies that have to be rebuilt + + // Adjust number of swaps to do next. + num_attempts += swaps_per_loop; + num_swaps += n_keep; + swaps_per_loop = n_keep * 3; + swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; + swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; + + LG_TRY (LAGraph_Random_Next(random_v, msg)) ; + printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); + } + GRB_TRY (GxB_Vector_unpack_Full( + E_vec, (void **) &indices, &ind_size, &iso, NULL)); + GRB_TRY (GxB_Matrix_pack_FullR( + E, (void **) &indices, ind_size, iso, NULL)); + // Build Output Matrix + GRB_TRY (GxB_Matrix_unpack_FullC( + E, (void **)&indices, &ind_size, &iso, NULL)) ; + GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); + GRB_TRY (GrB_eWiseAdd( + *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 + )) ; + LG_FREE_WORK ; + return (GrB_SUCCESS) ; +} \ No newline at end of file diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c index b5244c3716..a5690f38e3 100644 --- a/experimental/benchmark/edgeSwap_demo.c +++ b/experimental/benchmark/edgeSwap_demo.c @@ -82,7 +82,7 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf("Time To Swap #################################################") ; t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_SwapEdges (&Y, G, swaps, msg)) ; + LG_TRY (LAGraph_SwapEdgesV2 (&Y, G, swaps, msg)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("===============================LAGraph_SwapEdges took: %g sec\n", t) ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index ae2361c8c3..eb727c32df 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -101,7 +101,7 @@ void test_SwapEdges (void) //---------------------------------------------------------------------- GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); + OK(LAGraph_SwapEdgesV2( &A_new, G, (GrB_Index) 100, msg)); GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("Test ends:\n") ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 1503b6e4c9..470f70b66d 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1442,6 +1442,16 @@ int LAGraph_SwapEdges char *msg ) ; +int LAGraph_SwapEdgesV2 +( + // output + GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped + // input: not modified + LAGraph_Graph G, + GrB_Index Q, // Swaps per edge + char *msg +) ; + int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GxB extensions ( // output: From 510ded2398516edb6b200073c405f128e8aac9c5 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 15:32:44 -0600 Subject: [PATCH 069/115] added comments and FastSV7_FA brutal --- .../algorithm/LAGraph_RichClubCoefficient.c | 15 +++---- experimental/algorithm/LG_CC_FastSV7_FA.c | 7 +++- experimental/utility/LAGraph_FastAssign.c | 41 ++++++++++++------- src/test/test_ConnectedComponents.c | 10 ++++- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index dfee2f000a..fc96a8599c 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -31,10 +31,6 @@ // rich-club phenomenon across complex network hierarchies”, Applied Physics // Letters Vol 91 Issue 8, August 2007. https://arxiv.org/abs/physics/0701290 -// R. Milo, N. Kashtan, S. Itzkovitz, M. E. J. Newman, U. Alon, “Uniform -// generation of random graphs with arbitrary degree sequences”, 2006. -// https://arxiv.org/abs/cond-mat/0312028 - #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ @@ -360,7 +356,6 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; GRB_TRY (GrB_Vector_build ( verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; - GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, edges_per_deg)) ; #endif /** @@ -374,10 +369,12 @@ int LAGraph_RichClubCoefficient * Mask can be A, then returns a matrix with the same pattern. * [., ., 1, 1, 1, 1, ., ., 1] --> [., ., 1, 2, 3, 4, ., ., 5] * - * Should we be able to sum in the opposite direction? + * Should we be able to sum in the opposite direction? + * Yes since not all monoids have inverse operations. * * If plus biop is not a monoid, this method should still work? */ + GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, edges_per_deg)) ; LG_TRY (LAGraph_Malloc( &array_space, edge_vec_nvals * 4, sizeof(int64_t), NULL)) ; epd_index = array_space ; @@ -388,10 +385,10 @@ int LAGraph_RichClubCoefficient epd_index, edges_per_deg_arr, &edge_vec_nvals, edges_per_deg )) ; GRB_TRY (GrB_Vector_extractTuples_INT64( - vpd_index, deg_vertex_count, °_vec_size, verts_per_deg + vpd_index, deg_vertex_count, &edge_vec_nvals, verts_per_deg )) ; //run a cummulative sum (backwards) on deg_vertex_count - for(GrB_Index i = deg_vec_size - 1; i > 0; --i) + for(GrB_Index i = edge_vec_nvals - 1; i > 0; --i) { deg_vertex_count[i-1] += deg_vertex_count[i] ; edges_per_deg_arr[i-1] += edges_per_deg_arr[i] ; @@ -402,7 +399,7 @@ int LAGraph_RichClubCoefficient edges_per_deg, epd_index, edges_per_deg_arr, edge_vec_nvals, NULL )) ; GRB_TRY (GrB_Vector_build_INT64( - verts_per_deg, vpd_index, deg_vertex_count, deg_vec_size, NULL + verts_per_deg, vpd_index, deg_vertex_count, edge_vec_nvals, NULL )) ; //Computes the RCC of a matrix diff --git a/experimental/algorithm/LG_CC_FastSV7_FA.c b/experimental/algorithm/LG_CC_FastSV7_FA.c index f2e513a5a0..393a830101 100644 --- a/experimental/algorithm/LG_CC_FastSV7_FA.c +++ b/experimental/algorithm/LG_CC_FastSV7_FA.c @@ -34,6 +34,9 @@ // Changed to use GxB load/unload. Converted to use the LAGraph_Graph object. // Exploiting iso status for the temporary matrices Parent and T. +// Modified by Gabriel Gomez, Texas A&M University: moved Parent matrix trick +// out to LAGraph_FastAssign. + // The input graph G must be undirected, or directed and with an adjacency // matrix that has a symmetric structure. Self-edges (diagonal entries) are // OK, and are ignored. The values and type of A are ignored; just its @@ -182,7 +185,7 @@ static inline GrB_Info fastsv GrB_free (&mngp) ; \ GrB_free (&gp_new) ; \ GrB_free (&parent2) ; \ - GrB_free (&ramp_v) ; \ + GrB_free (&ramp_v) ; \ GrB_free (&A_Container) ; \ GrB_free (&T_Container) ; \ } @@ -190,6 +193,7 @@ static inline GrB_Info fastsv #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ + GrB_free (&parent) ; \ LG_FREE_WORK ; \ } @@ -857,6 +861,7 @@ int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GraphBLAS v10 //-------------------------------------------------------------------------- (*component) = parent ; + parent = NULL ; LG_FREE_WORK ; #ifdef TIMINGS toc = LAGraph_WallClockTime ( ) ; diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 9ad0fe6ccf..0daf9a9bfd 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -66,6 +66,7 @@ GrB_free(&P); \ GrB_free(&con); \ LAGraph_Free(&ramp_a, msg); \ + LAGraph_Free(&i_a, msg); \ } int LAGraph_FastAssign_Monoid @@ -85,15 +86,20 @@ int LAGraph_FastAssign_Monoid char *msg ) { - // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector - // to be sure it remains completely unchanged? - // TODO: take a descriptor for the mask and also to get i by value or - // by index. Ditto for X_vec. + // TODO: Change this from a reduce to an mxv: requires a finding the + // appropriate second biop, but will give user flexibility to make X_vec + // not full, and use Transpose descriptor. + + // TODO: Let indicies be specified by value of by index in I_vec via + // descriptor (although build or assign would be better if I_vec is by + // index since it is sorted and has no dups). By value could be useful if + // I_vec is not full. + // TODO: Ditto for X_vec GrB_Matrix P = NULL; int64_t n, nrows; GxB_Container con = NULL; - void *ramp_a = NULL, *i_a; + void *ramp_a = NULL, *i_a = NULL; int ramp_h = 0, trsp = 0, i_h = 0; int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; @@ -128,8 +134,9 @@ int LAGraph_FastAssign_Monoid //---------------------------------------------------------------------- GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); GRB_TRY (GxB_Container_new(&con)); - if(ramp == NULL) + if(ramp == NULL) { + //TODO: maybe let user input a size 0 ramp and build it for them? GRB_TRY (GrB_free(&(con->p))) ; ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; GrB_IndexUnaryOp idxnum = (n + 1 <= INT32_MAX)? @@ -138,7 +145,7 @@ int LAGraph_FastAssign_Monoid GRB_TRY (GrB_assign (con->p, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_apply (con->p, NULL, NULL, idxnum, con->p, 0, NULL)) ; } - else + else { GRB_TRY (GxB_Vector_unload( ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; @@ -154,6 +161,7 @@ int LAGraph_FastAssign_Monoid } if (c == I_vec) { + GRB_TRY (GrB_free(&(con->i))) ; GRB_TRY (GrB_Vector_dup(&con->i, I_vec)) ; } else @@ -169,6 +177,7 @@ int LAGraph_FastAssign_Monoid I_vec, &i_a, i_type, i_n, i_size, i_h, NULL)) ; i_a = NULL; } + GRB_TRY (GrB_free(&(con->x))) ; con->x = X_vec; con->format = GxB_SPARSE; con->orientation = GrB_COLMAJOR; @@ -216,14 +225,16 @@ int LAGraph_FastAssign_Semiring char *msg ) { - // TODO: put data from ALL input vectors into a GxB_IS_READONLY vector - // to be sure it remains completely unchanged? - // TODO: take a descriptor for the mask and also to get I_vec by value or - // by index. Ditto for X_vec. + // TODO: Let indicies be specified by value of by index in I_vec via + // descriptor (although build or assign would be better if I_vec is by + // index since it is sorted and has no dups). By value could be useful if + // I_vec is not full. + // TODO: Ditto for X_vec + GrB_Matrix P = NULL; int64_t n, nrows; GxB_Container con = NULL; - void *ramp_a = NULL, *i_a; + void *ramp_a = NULL, *i_a =NULL; int ramp_h = 0, trsp = 0, i_h = 0; int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; @@ -231,7 +242,7 @@ int LAGraph_FastAssign_Semiring //---------------------------------------------------------------------- // Check inputs //---------------------------------------------------------------------- - //TODO: assert inputs are full or desc says to use by value + //TODO: assert inputs are full or desc says to use by value etc. LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; @@ -271,6 +282,7 @@ int LAGraph_FastAssign_Semiring if(ramp == NULL) { + //TODO: maybe let user input a size 0 ramp and build it for them? GRB_TRY (GrB_free(&(con->p))) ; ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; GrB_IndexUnaryOp idxnum = (n + 1 <= INT32_MAX)? @@ -332,7 +344,8 @@ int LAGraph_FastAssign_Semiring GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); GRB_TRY (GrB_mxv(c, mask, accum, dup, P, X_vec, desc)); //---------------------------------------------------------------------- - // Free work. + // Free work. + // Note: this does not free inputs since they are marked GxB_IS_READONLY //---------------------------------------------------------------------- GrB_free(&P) ; GrB_free(&con) ; diff --git a/src/test/test_ConnectedComponents.c b/src/test/test_ConnectedComponents.c index 92cce714fd..01f3a09c61 100644 --- a/src/test/test_ConnectedComponents.c +++ b/src/test/test_ConnectedComponents.c @@ -260,8 +260,14 @@ void test_cc_brutal (void) // find the connected components printf ("\n--- CC: FastSV6/7 if SuiteSparse, Boruvka if vanilla:\n") ; - LG_BRUTAL_BURBLE (LAGr_ConnectedComponents (&C, G, msg)) ; -// printf ("\nSV6/7 test result, parent vector:\n") ; + LG_BRUTAL_BURBLE (LG_CC_FastSV7_FA (&C, G, msg)) ; + + OK (GrB_free (&C)) ; + printf ("\n--- CC: FastSV7_FA\n") ; + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + LG_BRUTAL_BURBLE (LG_CC_FastSV7_FA (&C, G, msg)) ; + #endif + // printf ("\nSV6/7 test result, parent vector:\n") ; // LG_BRUTAL_BURBLE (LAGraph_Vector_Print (C, LAGraph_SHORT, stdout, msg)) ; // count the # of connected components From 06cec2c76b40e2ec044ce84b8c49cd578993d5bc Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 15:41:58 -0600 Subject: [PATCH 070/115] fixed brutal test CC --- src/test/test_ConnectedComponents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/test_ConnectedComponents.c b/src/test/test_ConnectedComponents.c index 01f3a09c61..f08cd0718f 100644 --- a/src/test/test_ConnectedComponents.c +++ b/src/test/test_ConnectedComponents.c @@ -262,9 +262,9 @@ void test_cc_brutal (void) printf ("\n--- CC: FastSV6/7 if SuiteSparse, Boruvka if vanilla:\n") ; LG_BRUTAL_BURBLE (LG_CC_FastSV7_FA (&C, G, msg)) ; + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) OK (GrB_free (&C)) ; printf ("\n--- CC: FastSV7_FA\n") ; - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) LG_BRUTAL_BURBLE (LG_CC_FastSV7_FA (&C, G, msg)) ; #endif // printf ("\nSV6/7 test result, parent vector:\n") ; From 9d133b127c04498404bf0f48c1dcef50fae62489 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 15:50:25 -0600 Subject: [PATCH 071/115] Fixed typo in brutal CC test --- src/test/test_ConnectedComponents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/test_ConnectedComponents.c b/src/test/test_ConnectedComponents.c index f08cd0718f..7cb882c116 100644 --- a/src/test/test_ConnectedComponents.c +++ b/src/test/test_ConnectedComponents.c @@ -260,7 +260,7 @@ void test_cc_brutal (void) // find the connected components printf ("\n--- CC: FastSV6/7 if SuiteSparse, Boruvka if vanilla:\n") ; - LG_BRUTAL_BURBLE (LG_CC_FastSV7_FA (&C, G, msg)) ; + LG_BRUTAL_BURBLE (LAGr_ConnectedComponents (&C, G, msg)) ; #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) OK (GrB_free (&C)) ; From 67334dab253dcce9d760398985e9e57a8dd6c0fd Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 16:00:42 -0600 Subject: [PATCH 072/115] Remove SwapEdges: not ready to merge --- experimental/algorithm/LAGraph_SwapEdges.c | 718 --------------------- experimental/benchmark/edgeSwap_demo.c | 126 ---- experimental/test/test_SwapEdges.c | 154 ----- include/LAGraphX.h | 14 - 4 files changed, 1012 deletions(-) delete mode 100644 experimental/algorithm/LAGraph_SwapEdges.c delete mode 100644 experimental/benchmark/edgeSwap_demo.c delete mode 100644 experimental/test/test_SwapEdges.c diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c deleted file mode 100644 index a7ecfb81b0..0000000000 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ /dev/null @@ -1,718 +0,0 @@ -//------------------------------------------------------------------------------ -// LAGraph_SwapEdges: randomly swaps edges in a graph -//------------------------------------------------------------------------------ - -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. -// SPDX-License-Identifier: BSD-2-Clause -// -// For additional details (including references to third party source code and -// other files) see the LICENSE file or contact permission@sei.cmu.edu. See -// Contributors.txt for a full list of contributors. Created, in part, with -// funding and support from the U.S. Government (see Acknowledgments.txt file). -// DM22-0790 - -// Contributed by Gabriel Gomez, Texas A&M University - -//------------------------------------------------------------------------------ - -#define FREE_LOOP \ -{ \ - GrB_free (&M) ; \ - GrB_free (&M_thin) ; \ - GrB_free (E_split) ; \ - GrB_free (E_split + 1) ; \ - GrB_free(&dup_swaps_v); \ - GrB_free(&bad_swaps); \ - GrB_free(&new_hashed_edges); \ - GrB_free(&selected_m); \ - GrB_free(&hashed_edges); \ - LAGraph_Free((void**)&leftover_e, msg) ; \ - LAGraph_Free((void**)&hash_vals, msg) ; \ - LAGraph_Free((void**)&hash_vals_new, msg) ; \ - LAGraph_Free((void**)&edge_perm, msg) ; \ -} - -#define LG_FREE_WORK \ -{ \ - /* free any workspace used here */ \ - GrB_free (&E) ; \ - GrB_free (&P) ; \ - GrB_free (&hash_m) ; \ - GrB_free (&A_tril) ; \ - GrB_free (&random_v) ; \ - GrB_free (&r_permute) ; \ - GrB_free (&ramp_v) ; \ - GrB_free (&hramp_v) ; \ - GrB_free (&swapVals) ; \ - GrB_free (&r_60) ; \ - GrB_free(&exists); \ - GrB_free (&selected) ; \ - GrB_free (&E_vec) ; \ - GrB_free (&swap_pair) ; \ - GrB_free (&swap_verts) ; \ - GrB_free (&hash_seed_e) ; \ - GrB_free (&duplicate) ; \ - GrB_free (¬_pointers) ; \ - LAGraph_Free((void**)&indices, msg) ; \ - LAGraph_Free((void**)&ramp, msg) ; \ - LAGraph_Free((void**)&half_ramp, msg) ; \ - LAGraph_Free((void**) &val_of_P, msg); \ - LAGraph_Free((void **) &dup_swaps, NULL); \ - LAGraph_Free((void **) ¬_ptrs, NULL); \ - FREE_LOOP ; \ -} - -#define LG_FREE_ALL \ -{ \ - /* free any workspace used here */ \ - LG_FREE_WORK ; \ - /* free all the output variable(s) */ \ - GrB_free(A_new) ; \ - /* take any other corrective action */ \ -} - -#include "LG_internal.h" -#include "LAGraphX.h" - -void shift_and - (uint16_t *z, const uint16_t *x) - { - (*z) = (*x) & ((*x) << 8); - (*z) |= (*z) >> 8; - } -#define SHIFT_AND \ -"void shift_and \n"\ -" (uint16_t *z, const uint16_t *x) \n"\ -" { \n"\ -" (*z) = (*x) & ((*x) << 8); \n"\ -" (*z) |= (*z) >> 8; \n"\ -" }" - -typedef struct { - uint64_t a; - uint64_t b; -} edge_type; -#define EDGE_TYPE \ -"typedef struct { uint64_t a; uint64_t b; } edge_type;" - -typedef struct { - uint64_t a; - uint64_t b; - uint64_t c; - uint64_t d; -} swap_type; -#define SWAP_TYPE \ -"typedef struct { \n"\ -" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n" \ -"}swap_type;" - -void swap_ab -(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) -{ - if(I & 1) - { - uint64_t temp = x->a; - z->a = x->b; - z->b = temp; - } -} -#define SWAP_AB \ -"void swap_ab \n"\ -"(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ -"{ \n"\ -" if (I & 1) \n"\ -" { \n"\ -" uint64_t temp = x->a; \n"\ -" z->a = x->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -"}" - -void swap_bc -(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) -{ - memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. - if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; - if(I & 1) - { - uint64_t temp = z->d; - z->d = z->b; - z->b = temp; - } - else - { - uint64_t temp = z->c; - z->c = z->b; - z->b = temp; - } -} -#define SWAP_BC \ -"void swap_bc \n"\ -"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ -"{ \n"\ -" memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. \n"\ -" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ -"if(I & 1) \n"\ -" { \n"\ -" uint64_t temp = z->d; \n"\ -" z->d = z->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -" else \n"\ -" { \n"\ -" uint64_t temp = z->c; \n"\ -" z->c = z->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -"}" - - -//Simply making a cantor pairing then masking. -void hash_edge -(uint64_t *z, const edge_type *x, const uint64_t *mask) -{ - (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; - (*z) += (x->a < x->b)? x->a: x->b; - (*z) &= (*mask); -} -#define HASH_EDGE \ -"void hash_edge \n"\ -"(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ -"{ \n"\ -" (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; \n"\ -" (*z) += (x->a < x->b)? x->a: x->b; \n"\ -" (*z) &= (*mask); \n"\ -"}" - -void add_term - (uint8_t *z, const uint8_t *x, const uint8_t *y) -{ - (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); -} -#define ADD_TERM \ -"void add_term \n"\ -"(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ -"{ \n"\ -" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); \n"\ -"}" - -int LAGraph_SwapEdges -( - // output - GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped - // input: not modified - LAGraph_Graph G, - GrB_Index Q, // Swaps per edge - char *msg -) -{ - //-------------------------------------------------------------------------- - // Declorations - //-------------------------------------------------------------------------- - GrB_Matrix A = NULL; // n x n Adjacency Matrix - - // e x 2 with entries corresponding to verticies of an edge - GrB_Matrix E = NULL, E_t = NULL; - GrB_Vector E_vec = NULL; - GrB_Vector E_split[2] = {NULL, NULL}; - - GrB_Matrix P = NULL; - - // swaps x 4 - // Each row contains 4 entries corresponding to the verticies - // that are involved in the swap. - GrB_Vector M = NULL, M_thin = NULL; - - // n = |V| e = |E| - GrB_Index n = 0, e = 0; - - // n x n - // Lower triangle of adjacency matrix - GrB_Matrix A_tril = NULL ; - - // e x 1 random vectors - GrB_Vector random_v = NULL, r_permute = NULL; - - // indicies for A - GrB_Index *indices = NULL; - - // [0,1,1,. . ., 0] swap a given edge. Boolean - GrB_Vector swapVals = NULL; - - GrB_Vector ramp_v = NULL; - GrB_Vector hramp_v = NULL; - - // [0, ... , e] - GrB_Index *ramp = NULL ; - // [0,0,1,1,2,2,...] - GrB_Index *half_ramp = NULL ; - - // Arrays to unpack edge permutation - GrB_Index *edge_perm = NULL, *leftover_e = NULL; - bool iso = false; - - // Number of values kept in each phase - GrB_Index n_keep; - GrB_Index *arr_keep = NULL; - void *junk = NULL; - - - // swaps x 2 matrix which holds the hashes of each planned edge. - GrB_Vector new_hashed_edges = NULL; - - // GrB_Matrix p_buckets = NULL; - - // swaps used for "outdegree" - GrB_Vector big_dense; - - // e holds hashes of old edges - GrB_Vector hashed_edges = NULL; - - // 2^60 holds the buckets in which hashes collided. - GrB_Vector exists = NULL; - GrB_Vector new_edges_h = NULL; - GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; - GrB_Matrix hash_m = NULL; - - GrB_UnaryOp lg_shiftland = NULL; - - // b1 <---> a2 or b1 <---> b2 - GrB_IndexUnaryOp swap_pair = NULL; - - GrB_IndexUnaryOp swap_verts = NULL; - - - - // z = h_y(x) - GrB_BinaryOp hash_seed_e = NULL; - - // z = min(2,x+y) - GrB_BinaryOp add_term_biop = NULL; - GrB_Monoid add_term_monoid = NULL; - GrB_Semiring plus_term_one = NULL; - GrB_BinaryOp lg_one_uint8 = NULL; - - // [^],[h_y(x)] - - GrB_BinaryOp duplicate = NULL; - - // Toople types - GrB_Type lg_edge = NULL, lg_swap = NULL; - - int16_t *dup_swaps = NULL; - GrB_Vector dup_swaps_v = NULL; - // BOOL swaps * 2 vector that holds false if an edge in the swap did not "work" - GrB_Vector bad_swaps = NULL; - GrB_Vector not_pointers = NULL; - uint64_t *not_ptrs = NULL; - - GrB_Vector sort_h = NULL; - GrB_Vector r_60 = NULL; - - GrB_Matrix selected_m = NULL; - GrB_Vector selected = NULL; - - - // Constants --------------------------------------------------------------- - - uint64_t *val_of_P = NULL; - - GrB_Vector x = NULL; - - GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; - - GrB_Index ind_size = 0; - - //-------------------------------------------------------------------------- - // Check inputs TODO - //-------------------------------------------------------------------------- - LG_ASSERT_MSG ( - G->kind == LAGraph_ADJACENCY_UNDIRECTED, - LAGRAPH_INVALID_GRAPH, - "G must be undirected" - ) ; - // char type[LAGRAPH_MAX_NAME_LEN]; - LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, - "G->nself_edges must be zero") ; - // GRB_TRY (GrB_get(A, type, GrB_EL_TYPE_STRING)) ; - // LG_ASSERT_MSG (MATCHNAME(type, "GrB_BOOL") || MATCHNAME(type, "bool"), LAGRAPH_INVALID_GRAPH, - // "A must be structural") ; - - //-------------------------------------------------------------------------- - // Initializations - //-------------------------------------------------------------------------- - A = G->A ; - - // Types - GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; - GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; - GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; - GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; - - - // Extract lower triangular edges. - GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; - GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - - - GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; - GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; - GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; - - //Init Operators ----------------------------------------------------------- - GRB_TRY (GxB_UnaryOp_new ( - &lg_shiftland, (GxB_unary_function) (&shift_and), - GrB_UINT16, GrB_UINT16, "shift_and", SHIFT_AND - )) ; - GRB_TRY(GxB_BinaryOp_new( - &hash_seed_e, (GxB_binary_function) (&hash_edge), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE - )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_verts, (GxB_index_unary_function) (&swap_ab), - lg_edge, lg_edge, GrB_BOOL, "swap_ab", SWAP_AB - )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_pair, (GxB_index_unary_function) (&swap_bc), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC - )) ; - GRB_TRY(GxB_BinaryOp_new( - &add_term_biop, (GxB_binary_function) (&add_term), - GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM - )); - - // This monoid has only been designed for inputs in {0,1,2}, other behavior - // is undefined. - // (0,x) -> x, (1,1) -> 2, (2,x) -> 2 (and commutative) - // Aka (x,y) -> min(2, x + y) - GRB_TRY (GxB_Monoid_terminal_new_UINT8( - &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 - )); - // Now working with the built-in ONEB binary op - GRB_TRY(GrB_Semiring_new( - &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 - )); - // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - - // Make E Matrix ----------------------------------------------------------- - LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; - GRB_TRY ( - GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) - ) ; - GRB_TRY (GxB_Matrix_pack_FullC ( - E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL - )) ; - GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); - int shift_e = __builtin_clzl(e); - uint64_t ehash_size = (1ull << (67-shift_e)); - // if(ehash_size > 6*e) ehash_size/=2; - printf("Hash Size: %ld", ehash_size); - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, ehash_size)) ; - - // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); - // Init Ramps -------------------------------------------------------------- - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, - GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; - GRB_TRY(GrB_Vector_dup(¬_pointers, hramp_v)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - not_pointers, NULL, NULL, GrB_TIMES_UINT64, not_pointers, 2UL, NULL)) ; - GrB_Index ramp_size; - GRB_TRY (GxB_Vector_unpack_Full ( - ramp_v, (void **)&ramp, &ramp_size, &iso, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; - - // Init Constants ---------------------------------------------------------- - GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; - GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; - GRB_TRY (GrB_Scalar_new (&one64, GrB_UINT64)) ; - GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; - GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; - GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - - - GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, 1ull << (64-shift_e), e)) ; - GRB_TRY (GrB_Matrix_new(&hash_m, GrB_BOOL, ehash_size, e)) ; - - // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_INT8, ehash_size)) ; - GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); - GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); - - LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; - val_of_P[0] = (bool) 1; - - // Make Random ------------------------------------------------------------- - GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; - GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - // GRB_TRY(GrB_set (new_edges_h, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_assign_UINT64 ( - random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - //TODO: Change seed - LG_TRY( - LAGraph_Random_Seed(random_v, 1548945616ul, msg)); - GRB_TRY (GxB_Matrix_unpack_FullR( - E, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Vector_pack_Full( - E_vec, (void **) &indices, ind_size, iso, NULL)); - printf("Entering loop, Good Luck:\n") ; - while(num_swaps < e * Q && num_attempts < e * Q * 5) - { - GrB_Index perm_size, arr_size, junk_size; - // Coming into the loop: - // E must be the incidence matrix of the new graph. W/o self edges nor - // parallel edges. Each row must have exactly two distinct values. - // random_v has a radom dense vector. - // GRB_TRY (GxB_Vector_sort ( - // NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL - // )) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL - )) ; - GRB_TRY (GxB_Vector_unpack_Full( - r_60, (void **) &edge_perm, &perm_size, &iso, NULL - )) ; - GRB_TRY (GxB_Matrix_pack_CSC( - P, &ramp, &edge_perm, (void**) &val_of_P, ramp_size, - perm_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_Vector_resize(x, e)); - GRB_TRY (GrB_Vector_assign_BOOL( - x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_mxv( - r_permute, NULL, NULL, GxB_ANY_FIRSTJ_INT64, P, x, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, - &perm_size, &junk_size, &iso, NULL, NULL - )); - - LAGraph_Free((void **) &edge_perm, msg); - - GrB_Index edges_permed = 0; - GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)); - LAGraph_Malloc((void **) &edge_perm, edges_permed, 8,msg); - GRB_TRY (GrB_Vector_extractTuples_UINT64( - NULL, edge_perm, &edges_permed, r_permute - )) ; - swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, edges_permed / 2) ; - // GxB_fprint(r_60, GxB_SHORT, stdout); - // GxB_fprint(r_permute, GxB_SHORT, stdout); - // GxB_Vector_fprint(r_60, "r_60", GxB_SHORT, stdout); - // GRB_TRY (GrB_set(r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)); - // GRB_TRY (GrB_Vector_assign( - // r_permute, NULL, NULL, ramp_v, edge_perm, e, NULL - // )); - - // GxB_fprint(r_permute, GxB_SHORT, stdout); - GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)); - GRB_TRY (GrB_Vector_extract( - M_thin, NULL, NULL, E_vec, edge_perm, swaps_per_loop * 2, NULL - )) ; - - // GRB_TRY (GrB_Vector_assign_BOOL( - // selected, NULL, NULL, true, GrB_ALL, swaps_per_loop * 2, NULL - // )); - // GRB_TRY (GrB_Vector_assign_BOOL( - // selected, NULL, GxB_LAND_BOOL, false, edge_perm, swaps_per_loop * 2, NULL - // )); - // GxB_fprint(selected, GxB_SHORT, stdout); - - - // Using a CSC pack/unpack strategy to pick out edges involved in the swap - GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, e, swaps_per_loop * 2)); - GRB_TRY (GxB_Matrix_pack_CSC( - selected_m, &ramp, &edge_perm, (void**) &val_of_P, - swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL - )); - GRB_TRY (GrB_Matrix_reduce_Monoid( - selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - selected_m, &ramp, &edge_perm, (void**) &val_of_P, &junk_size, - &junk_size, &junk_size, &iso, NULL, NULL - )); - GRB_TRY (GrB_Vector_assign_BOOL( - selected, selected, NULL, 1, GrB_ALL, 0, GrB_DESC_RSC - )); - - LG_TRY (LAGraph_Malloc( - (void **)&leftover_e, e - swaps_per_loop * 2, sizeof(GrB_Index), msg - )); - GRB_TRY (GrB_Vector_extractTuples_BOOL( - leftover_e, NULL, &edges_permed, selected - )) - GRB_TRY (GrB_Vector_new(&E_split[1], lg_edge, edges_permed)); - GRB_TRY (GrB_Vector_extract( - E_split[1], NULL, NULL, E_vec, leftover_e, edges_permed, NULL)); - GRB_TRY (GrB_Vector_dup(E_split, M_thin)) ; - - GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; - GrB_Index dup_arr_size = 0; - GRB_TRY (GxB_Vector_unpack_Full( - M_thin, (void **) &indices, &ind_size, &iso, NULL - )) ; - GRB_TRY (GxB_Vector_pack_Full( - M, (void **) &indices, ind_size, iso, NULL - )) ; - GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( - M, NULL, NULL, swap_pair, M, false, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - M, (void **) &indices, &ind_size, &iso, NULL - )) ; - GRB_TRY (GxB_Vector_pack_Full( - M_thin, (void **) &indices, ind_size, iso, NULL - )) ; - - // Hash Edges ---------------------------------------------------------- - GRB_TRY (GrB_Vector_new( - &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, - ehash_size - 1ll, NULL - )) ;//0xFB21C651E98DF25ULL - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - hashed_edges, NULL, NULL, hash_seed_e, E_vec, - ehash_size - 1ll, NULL - )) ; - // GxB_Vector_fprint(hashed_edges, "Hashed", GxB_SHORT, stdout); - // I will unpack and then reconstruct with hash as index. - - - //---------------------------------------------------------------------- - // Build Hash Buckets - //---------------------------------------------------------------------- - - // Making the hash set for existing edges via a pack CSC trick. - GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; - GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; - GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, e)) ; - GrB_Index hvn_size; - GRB_TRY(GxB_Vector_unpack_Full( - new_hashed_edges, (void **) &hash_vals_new, - &hvn_size, &iso, NULL - )) ; - GRB_TRY(GxB_Vector_unpack_Full( - hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL - )) ; - GRB_TRY (GxB_Matrix_pack_CSC( - hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, - perm_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_mxv( - exists, NULL, NULL, GxB_ANY_PAIR_UINT8, hash_m, x, NULL)); - GRB_TRY (GxB_Matrix_unpack_CSC( - hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, - &perm_size, &junk_size, &iso, NULL, NULL - )); - GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, swaps_per_loop * 2)) ; - // Making the hash map for new edges via a pack CSC trick. - GRB_TRY (GxB_Matrix_pack_CSC( - hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, - hvn_size + 8, hvn_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); - GRB_TRY (GrB_Vector_assign_BOOL( - x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - - // Want to make exists full. But assign takes too long. - // Exists cannot possibly be full at this point. - int8_t *exists_bitmap = NULL; - uint64_t exists_bsize; - GRB_TRY (GxB_Vector_unpack_Bitmap( - exists, &exists_bitmap, &junk, &exists_bsize, &junk_size, &iso, - &junk_size, NULL - )); - GRB_TRY (GxB_Vector_pack_Full( - exists, (void **)&exists_bitmap, exists_bsize, false, NULL - )); - GRB_TRY (GrB_mxv( - exists, NULL, add_term_biop, plus_term_one, hash_m, x, NULL - )); - GRB_TRY (GrB_Vector_select_UINT8( - exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 1, - NULL - )); - GRB_TRY (GrB_vxm( - dup_swaps_v, NULL, NULL, GxB_ANY_PAIR_INT8, - exists, hash_m, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, - &hvn_size, &junk_size, &iso, NULL, NULL - )); - GRB_TRY (GrB_Vector_clear(x)); - - int8_t *dup_val = NULL; - GRB_TRY (GxB_Vector_unpack_Bitmap( - dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, - &dup_arr_size, &junk_size, &iso, &n_keep, NULL - )); - LAGraph_Free((void **) &dup_val, msg); - GRB_TRY (GxB_Vector_pack_Full( - bad_swaps, (void **) &dup_swaps, dup_arr_size, false, NULL - )); - GRB_TRY (GrB_apply( - bad_swaps, NULL, NULL, lg_shiftland, bad_swaps, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - bad_swaps, (void **) &dup_swaps, &dup_arr_size, &iso, NULL - )); - GRB_TRY (GxB_Vector_pack_Full( - dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL - )) ; - GRB_TRY (GrB_Vector_clear(exists)) ; - // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; - // Swap Good Edges ----------------------------------------------------- - - GRB_TRY(GrB_Vector_assign( - E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL - )) ; - GRB_TRY(GrB_Vector_assign_BOOL( - dup_swaps_v, dup_swaps_v, NULL, true, GrB_ALL, 0, GrB_DESC_R)); - GRB_TRY(GrB_Vector_nvals(&n_keep, dup_swaps_v)); - n_keep /= 2; - GRB_TRY (GxB_Matrix_concat( - (GrB_Matrix) E_vec, (GrB_Matrix *)E_split, 2, 1, NULL)); - - FREE_LOOP ; // Free Matricies that have to be rebuilt - - // Adjust number of swaps to do next. - num_attempts += swaps_per_loop; - num_swaps += n_keep; - swaps_per_loop = n_keep * 3; - swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; - swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; - - LG_TRY (LAGraph_Random_Next(random_v, msg)) ; - printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); - } - GRB_TRY (GxB_Vector_unpack_Full( - E_vec, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Matrix_pack_FullR( - E, (void **) &indices, ind_size, iso, NULL)); - // Build Output Matrix - GRB_TRY (GxB_Matrix_unpack_FullC( - E, (void **)&indices, &ind_size, &iso, NULL)) ; - GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); - GRB_TRY (GrB_eWiseAdd( - *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 - )) ; - LG_FREE_WORK ; - return (GrB_SUCCESS) ; -} diff --git a/experimental/benchmark/edgeSwap_demo.c b/experimental/benchmark/edgeSwap_demo.c deleted file mode 100644 index b5244c3716..0000000000 --- a/experimental/benchmark/edgeSwap_demo.c +++ /dev/null @@ -1,126 +0,0 @@ -//------------------------------------------------------------------------------ -// LAGraph/experimental/benchmark/rcc_demo.c: a demo for RichClubCoefficient -//------------------------------------------------------------------------------ - -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. -// SPDX-License-Identifier: BSD-2-Clause -// -// For additional details (including references to third party source code and -// other files) see the LICENSE file or contact permission@sei.cmu.edu. See -// Contributors.txt for a full list of contributors. Created, in part, with -// funding and support from the U.S. Government (see Acknowledgments.txt file). -// DM22-0790 - -// Contributed by Timothy A Davis, Texas A&M University - -//------------------------------------------------------------------------------ - -// ./experimental/benchmark/rcc_demo ../data/west0067.mtx -// ./experimental/benchmark/rcc_demo < ../data/west0067.mtx -// ./experimental/benchmark/rcc_demo ../data/karate.mtx -// - -#include "../../src/benchmark/LAGraph_demo.h" -#include "LAGraphX.h" -#include "LG_internal.h" - -// LG_FREE_ALL is required by LG_TRY -#undef LG_FREE_ALL -#define LG_FREE_ALL \ -{ \ - GrB_free (&Y) ; \ - LAGraph_Delete (&G, msg) ; \ - LAGraph_Delete (&G_new, msg) ; \ -} - -int main (int argc, char **argv) -{ - - //-------------------------------------------------------------------------- - // startup LAGraph and GraphBLAS - //-------------------------------------------------------------------------- - - char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph - LAGraph_Graph G = NULL, G_new = NULL; - GrB_Matrix Y = NULL ; - - // start GraphBLAS and LAGraph - bool burble = true ; // set true for diagnostic outputs - demo_init (burble) ; - LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; - - //-------------------------------------------------------------------------- - // read in the graph: this method is defined in LAGraph_demo.h - //-------------------------------------------------------------------------- - - // readproblem can read in a file in Matrix Market format, or in a binary - // format created by binwrite (see LAGraph_demo.h, or the main program, - // mtx2bin_demo). - - double t = LAGraph_WallClockTime ( ) ; - GrB_Index swaps = (argc > 2) ? atoi(argv [2]): 100; - char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; - LG_TRY (readproblem ( - &G, // the graph that is read from stdin or a file - NULL, // source nodes (none, if NULL) - true, // make the graph undirected, if true - true, // remove self-edges, if true - true, // return G->A as structural, if true, - GrB_BOOL, // prefered GrB_Type of G->A; null if no preference - false, // ensure all entries are positive, if true - argc, argv)) ; // input to this main program - t = LAGraph_WallClockTime ( ) - t ; - printf ("Time to read the graph: %g sec\n", t) ; - - printf ("\n==========================The input graph matrix G:\n") ; - LG_TRY (LAGraph_Graph_Print (G, LAGraph_SHORT, stdout, msg)) ; - - //-------------------------------------------------------------------------- - // try the LAGraph_EdgeSwap algorithm - //-------------------------------------------------------------------------- - - LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; - printf("Time To Swap #################################################") ; - t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_SwapEdges (&Y, G, swaps, msg)) ; - t = LAGraph_WallClockTime ( ) - t ; - printf ("===============================LAGraph_SwapEdges took: %g sec\n", t) ; - - //-------------------------------------------------------------------------- - // check the results - //-------------------------------------------------------------------------- - - t = LAGraph_WallClockTime ( ) ; - bool result = false; - LG_TRY(LAGraph_New(&G_new, &Y, LAGraph_ADJACENCY_UNDIRECTED, msg)); - LG_TRY (LAGraph_Cached_OutDegree (G_new, msg)) ; - LG_TRY (LAGraph_Vector_IsEqual( - &result, G->out_degree, G_new->out_degree, msg)) ; - if (result) - { - printf ("Test passed.\n") ; - } - else - { - printf ("Test failure!\n") ; - } - - t = LAGraph_WallClockTime ( ) - t ; - printf ("Time to check results: %g sec\n", t) ; - - //-------------------------------------------------------------------------- - // print the results (Y is just a copy of G->A) - //-------------------------------------------------------------------------- - - printf ("\n===============================The result matrix:\n") ; - LG_TRY (LAGraph_Matrix_Print (G_new -> A, LAGraph_SHORT, stdout, msg)) ; - - //-------------------------------------------------------------------------- - // free everyting and finish - //-------------------------------------------------------------------------- - - LG_FREE_ALL ; - LG_TRY (LAGraph_Random_Finalize (msg)) ; - LG_TRY (LAGraph_Finalize (msg)) ; - return (GrB_SUCCESS) ; -} diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c deleted file mode 100644 index ae2361c8c3..0000000000 --- a/experimental/test/test_SwapEdges.c +++ /dev/null @@ -1,154 +0,0 @@ -//---------------------------------------------------------------------------- -// LAGraph/src/test/test_SwapEdges.c: test cases for LAGraph_HelloWorld -//---------------------------------------------------------------------------- - -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. -// SPDX-License-Identifier: BSD-2-Clause -// -// For additional details (including references to third party source code and -// other files) see the LICENSE file or contact permission@sei.cmu.edu. See -// Contributors.txt for a full list of contributors. Created, in part, with -// funding and support from the U.S. Government (see Acknowledgments.txt file). -// DM22-0790 - -//----------------------------------------------------------------------------- - - - -#include -#include -#include -#include -#include -#include - -char msg [LAGRAPH_MSG_LEN] ; -LAGraph_Graph G = NULL ; - -#define LEN 512 -char filename [LEN+1] ; - -const char* tests [ ] = -{ - "random_unweighted_general1.mtx", - "random_unweighted_general2.mtx", - "bcsstk13.mtx", - "" -} ; -void test_SwapEdges (void) -{ - //-------------------------------------------------------------------------- - // start LAGraph - //-------------------------------------------------------------------------- - OK (LAGraph_Init (msg)) ; - OK (LAGraph_Random_Init(msg)) ; - GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; - LAGraph_Graph G = NULL, G_new = NULL; - - for (int k = 0 ; ; k++) - { - //The following code taken from MIS tester - // load the matrix as A - const char *aname = tests [k]; - if (strlen (aname) == 0) break; - TEST_CASE (aname) ; - snprintf (filename, LEN, LG_DATA_DIR "%s", aname) ; - FILE *f = fopen (filename, "r") ; - TEST_CHECK (f != NULL) ; - OK (LAGraph_MMRead (&A, f, msg)) ; - OK (fclose (f)) ; - TEST_MSG ("Loading of valued matrix failed") ; - printf ("\nMatrix: %s\n", aname) ; - - // C = structure of A - OK (LAGraph_Matrix_Structure (&C, A, msg)) ; - OK (GrB_free (&A)) ; - - // construct a directed graph G with adjacency matrix C - OK (LAGraph_New (&G, &C, LAGraph_ADJACENCY_DIRECTED, msg)) ; - TEST_CHECK (C == NULL) ; - - // check if the pattern is symmetric - OK (LAGraph_Cached_IsSymmetricStructure (G, msg)) ; - - if (G->is_symmetric_structure == LAGraph_FALSE) - { - // make the adjacency matrix symmetric - OK (LAGraph_Cached_AT (G, msg)) ; - OK (GrB_eWiseAdd (G->A, NULL, NULL, GrB_LOR, G->A, G->AT, NULL)) ; - G->is_symmetric_structure = LAGraph_TRUE ; - } - G->kind = LAGraph_ADJACENCY_UNDIRECTED ; - - // check for self-edges - OK (LAGraph_Cached_NSelfEdges (G, msg)) ; - if (G->nself_edges != 0) - { - // remove self-edges - printf ("graph has %g self edges\n", (double) G->nself_edges) ; - OK (LAGraph_DeleteSelfEdges (G, msg)) ; - printf ("now has %g self edges\n", (double) G->nself_edges) ; - TEST_CHECK (G->nself_edges == 0) ; - } - - // compute the row degree - GrB_Index n = 0; - OK (LAGraph_Cached_OutDegree (G, msg)) ; - OK (GrB_Matrix_nrows(&n, G->A)); - - //---------------------------------------------------------------------- - // test the algorithm - //---------------------------------------------------------------------- - - GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); - GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; - printf ("Test ends:\n") ; - - //---------------------------------------------------------------------- - // check results - //---------------------------------------------------------------------- - bool ok = false; - //Make sure we got a symetric back out: - OK (LAGraph_New (&G_new, &A_new, LAGraph_ADJACENCY_DIRECTED, msg)) ; - OK (LAGraph_Cached_AT (G_new, msg)) ; - OK (LAGraph_Matrix_IsEqual (&ok, G_new->AT, G_new->A, msg)) ; - TEST_CHECK (ok) ; - - //Make sure no self edges created. - OK (LAGraph_Cached_NSelfEdges (G_new, msg)) ; - TEST_CHECK (G_new->nself_edges == 0); - - // Check nvals stay the same. - GrB_Index edge_count, new_edge_count; - OK (GrB_Matrix_nvals(&edge_count, G->A)) ; - OK (GrB_Matrix_nvals(&new_edge_count, G_new->A)) ; - printf("old: %ld, new: %ld", edge_count,new_edge_count); - TEST_CHECK(edge_count == new_edge_count); - //next: check degrees stay the same. - OK (LAGraph_Cached_OutDegree (G_new, msg)) ; - - OK (LAGraph_Vector_IsEqual ( - &ok, G->out_degree, G_new->out_degree, msg)) ; - TEST_CHECK (ok) ; - - OK (LAGraph_Delete (&G, msg)) ; - OK (LAGraph_Delete (&G_new, msg)) ; - } - - //-------------------------------------------------------------------------- - // free everything and finalize LAGraph - //-------------------------------------------------------------------------- - LAGraph_Random_Finalize(msg); - LAGraph_Finalize (msg) ; -} - -//---------------------------------------------------------------------------- -// the make program is created by acutest, and it runs a list of tests: -//---------------------------------------------------------------------------- - -TEST_LIST = -{ - {"SwapEdges", test_SwapEdges}, - {NULL, NULL} -} ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 1503b6e4c9..d5861b0592 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1428,20 +1428,6 @@ int LAGraph_RichClubCoefficient char *msg ) ; -//------------------------------------------------------------------------------ -// LAGraph_SwapEdges: Randomize Graph while maintaining degree sequence. -//------------------------------------------------------------------------------ -LAGRAPHX_PUBLIC -int LAGraph_SwapEdges -( - // output - GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped - // input: not modified - LAGraph_Graph G, - GrB_Index Q, // Swaps per edge - char *msg -) ; - int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GxB extensions ( // output: From 137a271a33d25d9b3f9ad6d1b955727109202666 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 16:12:35 -0600 Subject: [PATCH 073/115] Restored files changed in error --- .gitignore | 1 - .vscode/settings.json | 5 +++++ experimental/benchmark/Incidence_Matrix_demo.c | 2 +- src/algorithm/LAGr_ConnectedComponents.c | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index ca308d807a..682fbeee63 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,6 @@ gmon.out cmake-build-debug* CMakeFiles* *~ -.vscode/ */build/* **/.venv/* diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..26fec30dc4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "lg_internal.h": "c" + } +} \ No newline at end of file diff --git a/experimental/benchmark/Incidence_Matrix_demo.c b/experimental/benchmark/Incidence_Matrix_demo.c index 3c0890a1fe..16f5498fb1 100644 --- a/experimental/benchmark/Incidence_Matrix_demo.c +++ b/experimental/benchmark/Incidence_Matrix_demo.c @@ -133,4 +133,4 @@ int main (int argc, char **argv) LG_FREE_ALL ; LG_TRY (LAGraph_Finalize (msg)) ; return (GrB_SUCCESS) ; -} +} \ No newline at end of file diff --git a/src/algorithm/LAGr_ConnectedComponents.c b/src/algorithm/LAGr_ConnectedComponents.c index be6909a388..642dc56905 100644 --- a/src/algorithm/LAGr_ConnectedComponents.c +++ b/src/algorithm/LAGr_ConnectedComponents.c @@ -32,7 +32,7 @@ int LAGr_ConnectedComponents char *msg ) { - + #if LAGRAPH_SUITESPARSE #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) return (LG_CC_FastSV7 (component, G, msg)) ; From 0c85a8ab1405a379174318563d9d99d76ce1ece0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 21:05:13 -0600 Subject: [PATCH 074/115] Changed strategy for placing new edges in E_vec to Subassign --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 81 ++------------------ 1 file changed, 6 insertions(+), 75 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 87ebdcb1d4..d13f5309f3 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -18,14 +18,10 @@ { \ GrB_free (&M) ; \ GrB_free (&M_thin) ; \ - GrB_free (E_split) ; \ - GrB_free (E_split + 1) ; \ GrB_free(&dup_swaps_v); \ GrB_free(&bad_swaps); \ GrB_free(&new_hashed_edges); \ - GrB_free(&selected_m); \ GrB_free(&hashed_edges); \ - GrB_free(&leftover_e) ; \ LAGraph_Free((void**)&edge_perm, msg) ; \ } @@ -41,7 +37,6 @@ GrB_free (&swapVals) ; \ GrB_free (&r_60) ; \ GrB_free(&exists); \ - GrB_free (&selected) ; \ GrB_free (&E_vec) ; \ GrB_free (&swap_pair) ; \ GrB_free (&swap_verts) ; \ @@ -219,8 +214,6 @@ int LAGraph_SwapEdgesV2 // e x 2 with entries corresponding to verticies of an edge GrB_Matrix E = NULL, E_t = NULL; GrB_Vector E_vec = NULL; - GrB_Vector E_split[2] = {NULL, NULL}; - // swaps x 4 // Each row contains 4 entries corresponding to the verticies @@ -249,8 +242,8 @@ int LAGraph_SwapEdgesV2 // [0,0,1,1,2,2,...] GrB_Index *half_ramp = NULL ; - // Arrays to unpack edge permutation - GrB_Vector edge_perm = NULL, leftover_e = NULL; + // edge permutation + GrB_Vector edge_perm = NULL; bool iso = false; // Number of values kept in each phase @@ -308,10 +301,6 @@ int LAGraph_SwapEdgesV2 GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; - GrB_Matrix selected_m = NULL; - GrB_Vector selected = NULL; - - // Constants --------------------------------------------------------------- uint64_t *val_of_P = NULL; @@ -440,9 +429,6 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - - // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_INT8, ehash_size)) ; - GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; @@ -501,43 +487,7 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GxB_Vector_extract_Vector( M_thin, NULL, NULL, E_vec, edge_perm, NULL )) ; - - - - // Using a CSC pack/unpack strategy to pick out edges involved in the swap - // GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, e, swaps_per_loop * 2)); - // GRB_TRY (GxB_Matrix_pack_CSC( - // selected_m, &ramp, &edge_perm, (void**) &val_of_P, - // swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL - // )); - // GRB_TRY (GrB_Matrix_reduce_Monoid( - // selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, NULL - // )); - // GRB_TRY (GxB_Matrix_unpack_CSC( - // selected_m, &ramp, &edge_perm, (void**) &val_of_P, &junk_size, - // &junk_size, &junk_size, &iso, NULL, NULL - // )); - GRB_TRY (GrB_Vector_clear(x)) ; - GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_assign_BOOL( - x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - LG_TRY(LAGraph_FastAssign( - selected, NULL, NULL, edge_perm, x, ramp_v, GxB_ANY_BOOL_MONOID, - NULL, msg)); - GRB_TRY (GrB_Vector_assign_BOOL( - selected, selected, NULL, 1, GrB_ALL, 0, GrB_DESC_RSC - )); - GRB_TRY (GrB_Vector_new(&leftover_e, GrB_INT64, 0)); - GRB_TRY (GrB_Vector_extractTuples( - leftover_e, NULL, selected, NULL - )) ; - - GRB_TRY (GrB_Vector_nvals(&edges_permed, leftover_e)); - GRB_TRY (GrB_Vector_new(&E_split[1], lg_edge, edges_permed)); - GRB_TRY (GxB_Vector_extract_Vector( - E_split[1], NULL, NULL, E_vec, leftover_e, NULL)); - GRB_TRY (GrB_Vector_dup(E_split, M_thin)) ; - + GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; GrB_Index dup_arr_size = 0; GRB_TRY (GxB_Vector_unpack_Full( @@ -578,23 +528,7 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; GrB_Index hvn_size; - // GRB_TRY(GxB_Vector_unpack_Full( - // new_hashed_edges, (void **) &hash_vals_new, - // &hvn_size, &iso, NULL - // )) ; - // GRB_TRY(GxB_Vector_unpack_Full( - // hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL - // )) ; - // GRB_TRY (GxB_Matrix_pack_CSC( - // hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, - // perm_size, sizeof(bool), true, false, NULL - // )); - // GRB_TRY (GrB_mxv( - // exists, NULL, NULL, GxB_ANY_PAIR_UINT8, hash_m, x, NULL)); - // GRB_TRY (GxB_Matrix_unpack_CSC( - // hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, - // &perm_size, &junk_size, &iso, NULL, NULL - // )); + GRB_TRY (GrB_Vector_clear(x)) ; GRB_TRY (GrB_Vector_resize(x, e)) ; GRB_TRY (GrB_Vector_assign_BOOL( @@ -656,15 +590,12 @@ int LAGraph_SwapEdgesV2 // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; // Swap Good Edges ----------------------------------------------------- - GRB_TRY(GrB_Vector_assign( - E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL - )) ; + GRB_TRY (GxB_Vector_subassign_Vector( + E_vec, dup_swaps_v, NULL, M_thin, edge_perm, NULL)); GRB_TRY(GrB_Vector_assign_BOOL( dup_swaps_v, dup_swaps_v, NULL, true, GrB_ALL, 0, GrB_DESC_R)); GRB_TRY(GrB_Vector_nvals(&n_keep, dup_swaps_v)); n_keep /= 2; - GRB_TRY (GxB_Matrix_concat( - (GrB_Matrix) E_vec, (GrB_Matrix *)E_split, 2, 1, NULL)); FREE_LOOP ; // Free Matricies that have to be rebuilt From 068a7614edee30f1dc323d65ab6fba7b75124bbc Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 1 Mar 2025 21:56:37 -0600 Subject: [PATCH 075/115] Fixed type getting in LAGraph_FastAssign --- experimental/utility/LAGraph_FastAssign.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 0daf9a9bfd..1102c34465 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -124,10 +124,7 @@ int LAGraph_FastAssign_Monoid GRB_TRY (GrB_Vector_size(&nrows, c)) ; GRB_TRY (GrB_Vector_get_INT32(X_vec, (int32_t *) &iso, GxB_ISO)); - char typename[LAGRAPH_MAX_NAME_LEN]; - LG_TRY (LAGraph_Vector_TypeName(typename, X_vec, msg)); - LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; - + GRB_TRY (GxB_Vector_type(&x_type, X_vec)); //---------------------------------------------------------------------- // Load up containers @@ -270,9 +267,7 @@ int LAGraph_FastAssign_Semiring } GRB_TRY (GrB_Vector_get_INT32(X_vec, (int32_t *) &iso, GxB_ISO)) ; - char typename[LAGRAPH_MAX_NAME_LEN]; - LG_TRY (LAGraph_Vector_TypeName(typename, X_vec, msg)); - LG_TRY (LAGraph_TypeFromName (&x_type, typename, msg)) ; + GRB_TRY (GxB_Vector_type(&x_type, X_vec)); //---------------------------------------------------------------------- // Load up containers From d8b0205fdec2937122c5ab24c3a189957b0f0f05 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 2 Mar 2025 11:07:29 -0600 Subject: [PATCH 076/115] Changed misleading P type and added an assert --- experimental/utility/LAGraph_FastAssign.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 1102c34465..2533c2ea79 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -100,16 +100,23 @@ int LAGraph_FastAssign_Monoid int64_t n, nrows; GxB_Container con = NULL; void *ramp_a = NULL, *i_a = NULL; - int ramp_h = 0, trsp = 0, i_h = 0; + int ramp_h = 0, trsp = 0, i_h = 0, x_sparsity = 0; int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; bool iso = false; + GRB_TRY (GrB_get(X_vec, &x_sparsity, GxB_SPARSITY_STATUS)); //TODO: assert inputs are full or desc say to use by value or by index. - LG_ASSERT (c != NULL, GrB_NULL_POINTER); - LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER); - LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER); - LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, "c cannot be aliased with X_vec."); + LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; + LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; + LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; + + // TODO: implement this. + LG_ASSERT_MSG (x_sparsity == GxB_FULL, GrB_NOT_IMPLEMENTED, + "X_vec must be full if dup is a monoid. Pass in the dup_second semiring"\ + " if you want to use a sparse X_vec.") ; + LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, + "c cannot be aliased with X_vec.") ; //---------------------------------------------------------------------- // Find dimensions and type //---------------------------------------------------------------------- @@ -272,7 +279,7 @@ int LAGraph_FastAssign_Semiring //---------------------------------------------------------------------- // Load up containers //---------------------------------------------------------------------- - GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); + GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, nrows, n)); GRB_TRY (GxB_Container_new(&con)); if(ramp == NULL) From 923f838d3aef8824591232f6e717ae869d4e3f69 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 2 Mar 2025 13:27:57 -0600 Subject: [PATCH 077/115] Temporary Fix for weird Segfault --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 75 +++++++++++++------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 71307245c8..06a34b0649 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -24,6 +24,7 @@ { \ GrB_free (&M) ; \ GrB_free (&M_thin) ; \ + GrB_free (&M_con) ; \ GrB_free(&dup_swaps_v); \ GrB_free(&bad_swaps); \ GrB_free(&new_hashed_edges); \ @@ -41,6 +42,7 @@ GrB_free (&ramp_v) ; \ GrB_free (&hramp_v) ; \ GrB_free (&swapVals) ; \ + GrB_free (&E_temp) ; \ GrB_free (&r_60) ; \ GrB_free(&exists); \ GrB_free (&E_vec) ; \ @@ -195,6 +197,7 @@ void add_term void edge2 (edge_type *z, const void *x, const edge_type *y) { + //if(y->a == 0 && y->b == 0) return; z->a = y->a; z->b = y->b; } @@ -202,9 +205,23 @@ void edge2 "void edge2 \n"\ "(edge_type *z, const void *x, const edge_type *y) \n"\ "{ \n"\ +" //if(y->a == 0 && y->b == 0) return; \n"\ " z->a = y->a; \n"\ " z->b = y->b; \n"\ "}" +// void edge2b +// (edge_type *z, const void *x, const edge_type *y) +// { +// z->a = y->a; +// z->b = y->b; +// } +// #define EDGE2B \ +// "void edge2b \n"\ +// "(edge_type *z, const void *x, const edge_type *y) \n"\ +// "{ \n"\ +// " z->a = y->a; \n"\ +// " z->b = y->b; \n"\ +// "}" int LAGraph_SwapEdgesV2 ( @@ -216,6 +233,7 @@ int LAGraph_SwapEdgesV2 char *msg ) { + // TODO: Remove all instances of GxB_(un)pack! //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- @@ -223,13 +241,13 @@ int LAGraph_SwapEdgesV2 // e x 2 with entries corresponding to verticies of an edge GrB_Matrix E = NULL, E_t = NULL; - GrB_Vector E_vec = NULL; + GrB_Vector E_vec = NULL, E_temp = NULL; // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. - GrB_Vector M = NULL, M_thin = NULL, M_picked = NULL; - // GxB_Container M_con = NULL; + GrB_Vector M = NULL, M_thin = NULL; + GxB_Container M_con = NULL; // n = |V| e = |E| GrB_Index n = 0, e = 0; @@ -399,6 +417,9 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GxB_Monoid_terminal_new_UINT8( &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 )); + + // This isn't actually a monoid but since it's never applied as one it + // shouldn't be a problem? FORESHADOWING edge_type iden_second = {0,0}; GRB_TRY (GrB_Monoid_new_UDT( &second_edge_monoid, second_edge, (void *) &iden_second @@ -453,10 +474,8 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; - // GRB_TRY (GxB_Container_new (&M_con)); - - GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); - + GRB_TRY (GrB_Vector_new (&x, GrB_BOOL, e)) ; + GRB_TRY (GxB_Container_new (&M_con)); LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; val_of_P[0] = (bool) 1; @@ -509,7 +528,7 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Vector_resize(edge_perm, swaps_per_loop * 2)); // GxB_fprint(r_permute, GxB_SHORT, stdout); - GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)); + GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)) ; GRB_TRY (GxB_Vector_extract_Vector( M_thin, NULL, NULL, E_vec, edge_perm, NULL )) ; @@ -549,9 +568,8 @@ int LAGraph_SwapEdgesV2 // Build Hash Buckets //---------------------------------------------------------------------- - // Making the hash set for existing edges via a pack CSC trick. + // Making the hash set for existing edges via Fast Assign GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; - GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; GrB_Index hvn_size; @@ -614,23 +632,32 @@ int LAGraph_SwapEdgesV2 )) ; GRB_TRY (GrB_Vector_clear(exists)) ; // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; - // Swap Good Edges ----------------------------------------------------- - - // GRB_TRY(GrB_Vector_assign_BOOL( - // dup_swaps_v, dup_swaps_v, NULL, true, GrB_ALL, 0, GrB_DESC_R)); - // GRB_TRY (GxB_Vector_subassign_Vector( - // E_vec, dup_swaps_v, NULL, M_thin, edge_perm, NULL)); - // GRB_TRY (GxB_unload_Vector_into_Container(M_thin, M_con, NULL)); - // GRB_TRY (GrB_free(&(M_con->b))) ; - // M_con->b = dup_swaps_v; - // GRB_TRY (GxB_load_Vector_from_Container(M_thin, M_con, NULL)); - GRB_TRY (GrB_Vector_assign( - M_thin, dup_swaps_v, NULL, M_thin, GrB_ALL, 0, GrB_DESC_R)) ; + // --------------------------------------------------------------------- + // Place Good Swaps back into E_vec + // --------------------------------------------------------------------- + + GRB_TRY (GxB_Container_new(&M_con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(M_thin, M_con, NULL)); + GRB_TRY (GrB_free(&(M_con->b))) ; + M_con->b = dup_swaps_v; + M_con->nvals = n_keep; + M_con->format = GxB_BITMAP; + GRB_TRY (GxB_load_Vector_from_Container(M_thin, M_con, NULL)); + GRB_TRY (GrB_Vector_new(&E_temp, lg_edge, e)) ; + + // EVIL segfault + // GRB_TRY (LAGraph_FastAssign( + // E_vec, NULL, second_edge, edge_perm, M_thin, ramp_v, + // second_second_edge, NULL, msg)); + + // Temporary fix for the above: GRB_TRY (LAGraph_FastAssign( - E_vec, NULL, second_edge, edge_perm, M_thin, ramp_v, + E_temp, NULL, NULL, edge_perm, M_thin, ramp_v, second_second_edge, NULL, msg)); + GRB_TRY (GrB_eWiseAdd( + E_vec, NULL, NULL, second_edge, E_vec, E_temp, NULL)) ; + GrB_free(&E_temp); - GRB_TRY(GrB_Vector_nvals(&n_keep, M_thin)); n_keep /= 2; FREE_LOOP ; // Free Matricies that have to be rebuilt From 66dee51f26c16c26cb58616020621684361c11b7 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 3 Mar 2025 19:18:15 -0600 Subject: [PATCH 078/115] Switched from pack/unpack to load/unload --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 341 ++++++++----------- experimental/test/test_SwapEdges.c | 7 +- 2 files changed, 152 insertions(+), 196 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 06a34b0649..b91d4d19fc 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -23,13 +23,10 @@ #define FREE_LOOP \ { \ GrB_free (&M) ; \ - GrB_free (&M_thin) ; \ - GrB_free (&M_con) ; \ GrB_free(&dup_swaps_v); \ - GrB_free(&bad_swaps); \ GrB_free(&new_hashed_edges); \ GrB_free(&hashed_edges); \ - LAGraph_Free((void**)&edge_perm, msg) ; \ + GrB_free(&edge_perm) ; \ } #define LG_FREE_WORK \ @@ -40,24 +37,28 @@ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ GrB_free (&ramp_v) ; \ - GrB_free (&hramp_v) ; \ - GrB_free (&swapVals) ; \ GrB_free (&E_temp) ; \ GrB_free (&r_60) ; \ GrB_free(&exists); \ GrB_free (&E_vec) ; \ GrB_free (&swap_pair) ; \ - GrB_free (&swap_verts) ; \ GrB_free (&hash_seed_e) ; \ + GrB_free (&add_term_biop) ; \ + GrB_free (&add_term_monoid) ; \ + GrB_free (&plus_term_one) ; \ GrB_free (&second_edge) ; \ + GrB_free (&second_bool_edge) ; \ GrB_free (&second_edge_monoid) ; \ GrB_free (&second_second_edge) ; \ - GrB_free (¬_pointers) ; \ + GrB_free (&lg_shiftland) ; \ + GrB_free (&lg_edge) ; \ + GrB_free (&lg_swap) ; \ + GrB_free (&con) ; \ + GrB_free (&E_con) ; \ + GrB_free (&one8) ; \ + GrB_free (&x) ; \ LAGraph_Free((void**)&indices, msg) ; \ - LAGraph_Free((void**)&half_ramp, msg) ; \ - LAGraph_Free((void**) &val_of_P, msg); \ LAGraph_Free((void **) &dup_swaps, NULL); \ - LAGraph_Free((void **) ¬_ptrs, NULL); \ FREE_LOOP ; \ } @@ -105,32 +106,10 @@ typedef struct { " uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n" \ "}swap_type;" -void swap_ab -(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) -{ - if(I & 1) - { - uint64_t temp = x->a; - z->a = x->b; - z->b = temp; - } -} -#define SWAP_AB \ -"void swap_ab \n"\ -"(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ -"{ \n"\ -" if (I & 1) \n"\ -" { \n"\ -" uint64_t temp = x->a; \n"\ -" z->a = x->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -"}" - void swap_bc (swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) { - memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. + memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; if(I & 1) { @@ -149,9 +128,9 @@ void swap_bc "void swap_bc \n"\ "(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ -" memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. \n"\ +" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. \n"\ " if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ -"if(I & 1) \n"\ +" if(I & 1) \n"\ " { \n"\ " uint64_t temp = z->d; \n"\ " z->d = z->b; \n"\ @@ -186,13 +165,13 @@ void hash_edge void add_term (uint8_t *z, const uint8_t *x, const uint8_t *y) { - (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); + (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)) ; } #define ADD_TERM \ "void add_term \n"\ "(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ "{ \n"\ -" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); \n"\ +" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)) ; \n"\ "}" void edge2 (edge_type *z, const void *x, const edge_type *y) @@ -240,14 +219,16 @@ int LAGraph_SwapEdgesV2 GrB_Matrix A = NULL; // n x n Adjacency Matrix // e x 2 with entries corresponding to verticies of an edge - GrB_Matrix E = NULL, E_t = NULL; + GrB_Matrix E = NULL; + // e x 1 vector, each entry is an edge. GrB_Vector E_vec = NULL, E_temp = NULL; + GxB_Container E_con = NULL; // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. - GrB_Vector M = NULL, M_thin = NULL; - GxB_Container M_con = NULL; + GrB_Vector M = NULL; + GxB_Container con = NULL; // n = |V| e = |E| GrB_Index n = 0, e = 0; @@ -262,49 +243,29 @@ int LAGraph_SwapEdgesV2 // indicies for A GrB_Index *indices = NULL; - // [0,1,1,. . ., 0] swap a given edge. Boolean - GrB_Vector swapVals = NULL; - GrB_Vector ramp_v = NULL; - GrB_Vector hramp_v = NULL; - - // [0,0,1,1,2,2,...] - GrB_Index *half_ramp = NULL ; // edge permutation GrB_Vector edge_perm = NULL; bool iso = false; // Number of values kept in each phase - GrB_Index n_keep; - GrB_Index *arr_keep = NULL; - void *junk = NULL; - + GrB_Index n_keep = 0, M_nvals = 0, dup_arr_size = 0; // swaps x 2 matrix which holds the hashes of each planned edge. GrB_Vector new_hashed_edges = NULL; - // GrB_Matrix p_buckets = NULL; - - // swaps used for "outdegree" - GrB_Vector big_dense; - // e holds hashes of old edges GrB_Vector hashed_edges = NULL; // 2^60 holds the buckets in which hashes collided. GrB_Vector exists = NULL; - GrB_Vector new_edges_h = NULL; GrB_UnaryOp lg_shiftland = NULL; // b1 <---> a2 or b1 <---> b2 GrB_IndexUnaryOp swap_pair = NULL; - - GrB_IndexUnaryOp swap_verts = NULL; - - // z = h_y(x) GrB_BinaryOp hash_seed_e = NULL; @@ -324,24 +285,21 @@ int LAGraph_SwapEdgesV2 // Toople types GrB_Type lg_edge = NULL, lg_swap = NULL; + // Unload types + GrB_Type M_type = NULL, E_type = NULL; + int M_hand = 0, E_hand = 0; int16_t *dup_swaps = NULL; GrB_Vector dup_swaps_v = NULL; // BOOL swaps * 2 vector that holds false if an edge in the swap did not "work" - GrB_Vector bad_swaps = NULL; - GrB_Vector not_pointers = NULL; - uint64_t *not_ptrs = NULL; GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; // Constants --------------------------------------------------------------- - - uint64_t *val_of_P = NULL; - GrB_Vector x = NULL; - GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; + GrB_Scalar one8 = NULL; GrB_Index ind_size = 0; @@ -356,8 +314,9 @@ int LAGraph_SwapEdgesV2 // char type[LAGRAPH_MAX_NAME_LEN]; LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, "G->nself_edges must be zero") ; - // GRB_TRY (GrB_get(A, type, GrB_EL_TYPE_STRING)) ; - // LG_ASSERT_MSG (MATCHNAME(type, "GrB_BOOL") || MATCHNAME(type, "bool"), LAGRAPH_INVALID_GRAPH, + LG_ASSERT (A_new != NULL, GrB_NULL_POINTER) ; + // GRB_TRY (GxB_Matrix_type(&E_type, A)) ; + // LG_ASSERT_MSG (E_type == GrB_BOOL || , LAGRAPH_INVALID_GRAPH, // "A must be structural") ; //-------------------------------------------------------------------------- @@ -371,7 +330,6 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GxB_Type_new( &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; @@ -381,7 +339,6 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; - GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; //Init Operators ----------------------------------------------------------- @@ -393,10 +350,6 @@ int LAGraph_SwapEdgesV2 &hash_seed_e, (GxB_binary_function) (&hash_edge), GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_verts, (GxB_index_unary_function) (&swap_ab), - lg_edge, lg_edge, GrB_BOOL, "swap_ab", SWAP_AB - )) ; GRB_TRY (GxB_IndexUnaryOp_new ( &swap_pair, (GxB_index_unary_function) (&swap_bc), lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC @@ -404,48 +357,49 @@ int LAGraph_SwapEdgesV2 GRB_TRY(GxB_BinaryOp_new( &add_term_biop, (GxB_binary_function) (&add_term), GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM - )); + )) ; GRB_TRY(GxB_BinaryOp_new( &second_edge, (GxB_binary_function) (&edge2), lg_edge, lg_edge, lg_edge, "edge2", EDGE2 - )); + )) ; GRB_TRY(GxB_BinaryOp_new( &second_bool_edge, (GxB_binary_function) (&edge2), lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2 - )); + )) ; GRB_TRY (GxB_Monoid_terminal_new_UINT8( &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 - )); + )) ; // This isn't actually a monoid but since it's never applied as one it // shouldn't be a problem? FORESHADOWING edge_type iden_second = {0,0}; GRB_TRY (GrB_Monoid_new_UDT( &second_edge_monoid, second_edge, (void *) &iden_second - )); + )) ; // Now working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 - )); + )) ; GRB_TRY(GrB_Semiring_new( &second_second_edge, second_edge_monoid, second_bool_edge - )); + )) ; // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; // Make E Matrix ----------------------------------------------------------- - LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; + LG_TRY (LAGraph_Malloc ( + (void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; GRB_TRY ( GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) ) ; GRB_TRY (GxB_Matrix_pack_FullC ( E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL )) ; - GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); + GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; int shift_e = __builtin_clzl(e); - uint64_t ehash_size = (1ull << (67-shift_e)); + uint64_t ehash_size = (1ull << (67-shift_e)) ; // if(ehash_size > 6*e) ehash_size/=2; printf("Hash Size: %ld", ehash_size); GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, ehash_size)) ; @@ -453,31 +407,15 @@ int LAGraph_SwapEdgesV2 // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; - GRB_TRY(GrB_Vector_dup(¬_pointers, hramp_v)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - not_pointers, NULL, NULL, GrB_TIMES_UINT64, not_pointers, 2UL, NULL)) ; GrB_Index ramp_size; - GRB_TRY (GxB_Vector_unpack_Full ( - hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; // Init Constants ---------------------------------------------------------- - GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; - GRB_TRY (GrB_Scalar_new (&one64, GrB_UINT64)) ; - GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; - GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; GRB_TRY (GrB_Vector_new (&x, GrB_BOOL, e)) ; - GRB_TRY (GxB_Container_new (&M_con)); - LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; - val_of_P[0] = (bool) 1; // Make Random ------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; @@ -485,17 +423,19 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - // GRB_TRY(GrB_set (new_edges_h, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; //TODO: Change seed LG_TRY( - LAGraph_Random_Seed(random_v, 1548945616ul, msg)); - GRB_TRY (GxB_Matrix_unpack_FullR( - E, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Vector_pack_Full( - E_vec, (void **) &indices, ind_size, iso, NULL)); + LAGraph_Random_Seed(random_v, 1548945616ul, msg)) ; + GRB_TRY (GxB_Container_new(&E_con)) ; + GRB_TRY (GxB_unload_Matrix_into_Container(E, E_con, NULL)); + GRB_TRY (GxB_Vector_unload( + E_con->x, (void **) &indices, &E_type, &e, &ind_size, &E_hand, NULL)); + e /= 2; + GRB_TRY (GxB_Vector_load( + E_vec, (void **) &indices, lg_edge, e, ind_size, E_hand, NULL)); printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { @@ -504,50 +444,49 @@ int LAGraph_SwapEdgesV2 // E must be the incidence matrix of the new graph. W/o self edges nor // parallel edges. Each row must have exactly two distinct values. // random_v has a radom dense vector. - // GRB_TRY (GxB_Vector_sort ( - // NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL - // )) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL )) ; GRB_TRY (GrB_Vector_clear(x)) ; - GRB_TRY (GrB_Vector_resize(x, e)); + GRB_TRY (GrB_Vector_resize(x, e)) ; GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; LG_TRY (LAGraph_FastAssign( r_permute, NULL, NULL, r_60, x, ramp_v, GxB_ANY_FIRSTJ_INT64, - NULL, msg)); + NULL, msg)) ; GrB_Index edges_permed = 0; - GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)); + GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)) ; GRB_TRY (GrB_Vector_new(&edge_perm, GrB_BOOL, edges_permed)) ; GRB_TRY (GrB_Vector_extractTuples(NULL, edge_perm, r_permute, NULL)) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, edges_permed / 2) ; - // Chop of last vertex if vertex count is odd - GRB_TRY (GrB_Vector_resize(edge_perm, swaps_per_loop * 2)); + // Chose only the edges we need from edge_perm + GRB_TRY (GrB_Vector_resize(edge_perm, swaps_per_loop * 2)) ; - // GxB_fprint(r_permute, GxB_SHORT, stdout); - GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)) ; + // Get the desired edges from the E_vec array. + GRB_TRY (GrB_Vector_new(&M, lg_edge, swaps_per_loop * 2)) ; GRB_TRY (GxB_Vector_extract_Vector( - M_thin, NULL, NULL, E_vec, edge_perm, NULL - )) ; - - GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; - GrB_Index dup_arr_size = 0; - GRB_TRY (GxB_Vector_unpack_Full( - M_thin, (void **) &indices, &ind_size, &iso, NULL + M, NULL, NULL, E_vec, edge_perm, NULL + )) ; + + // Make the swaps via the swap_pair unary op. + GRB_TRY (GxB_Vector_unload( + M, (void **) &indices, &M_type, &M_nvals, &ind_size, &M_hand, + NULL )) ; - GRB_TRY (GxB_Vector_pack_Full( - M, (void **) &indices, ind_size, iso, NULL + GRB_TRY (GxB_Vector_load( + M, (void **) &indices, lg_swap, M_nvals / 2, ind_size, M_hand, NULL )) ; GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( M, NULL, NULL, swap_pair, M, false, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - M, (void **) &indices, &ind_size, &iso, NULL + GRB_TRY (GxB_Vector_unload( + M, (void **) &indices, &M_type, &M_nvals, &ind_size, &M_hand, + NULL )) ; - GRB_TRY (GxB_Vector_pack_Full( - M_thin, (void **) &indices, ind_size, iso, NULL + GRB_TRY (GxB_Vector_load( + M, (void **) &indices, lg_edge, M_nvals * 2, ind_size, M_hand, + NULL )) ; // Hash Edges ---------------------------------------------------------- @@ -556,7 +495,7 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, + new_hashed_edges, NULL, NULL, hash_seed_e, M, ehash_size - 1ll, NULL )) ;//0xFB21C651E98DF25ULL GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( @@ -568,118 +507,136 @@ int LAGraph_SwapEdgesV2 // Build Hash Buckets //---------------------------------------------------------------------- - // Making the hash set for existing edges via Fast Assign - GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; - GrB_Index hvn_size; + GRB_TRY (GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; + GRB_TRY (GrB_set(dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY (GrB_Vector_clear(x)) ; GRB_TRY (GrB_Vector_resize(x, e)) ; GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + // place a one in any bucket that coresponds to an edge currently in E LG_TRY (LAGraph_FastAssign( exists, NULL, NULL, hashed_edges, x, ramp_v, GxB_ANY_PAIR_UINT8, NULL, msg )) ; GRB_TRY (GrB_Vector_clear(x)) ; - GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); + GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - // Want to make exists full. But assign takes too long. - // Exists cannot possibly be full at this point. - int8_t *exists_bitmap = NULL; - uint64_t exists_bsize; - GRB_TRY (GxB_Vector_unpack_Bitmap( - exists, &exists_bitmap, &junk, &exists_bsize, &junk_size, &iso, - &junk_size, NULL - )); - GRB_TRY (GxB_Vector_pack_Full( - exists, (void **)&exists_bitmap, exists_bsize, false, NULL - )); + // exists cannot possibly be full at this point. + // Fill out exists in O(1) time. + GRB_TRY (GxB_Container_new(&con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(exists, con, NULL)) ; + // Sanity check + LG_ASSERT (con->format == GxB_BITMAP, GrB_INVALID_VALUE) ; + GrB_free(&exists); + exists = con->b; + con->b = NULL; + GRB_TRY (GrB_free(&con)) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; + + // "Count" all of the edges that fit into each bucket. Stop counting at + // 2 since we will have to throw that whole bucket away anyway. LG_TRY (LAGraph_FastAssign( exists, NULL, add_term_biop, new_hashed_edges, x, ramp_v, plus_term_one, NULL, msg )) ; + + // Select buckets with only one corresponding value GRB_TRY (GrB_Vector_select_UINT8( exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 1, NULL - )); + )) ; + + // Find each hashed edge's bucket, dup_swaps_v is 1 if exists[edge] = 1 LG_TRY (LAGraph_FastAssign( dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg )) ; - GRB_TRY (GrB_Vector_clear(x)); - - int8_t *dup_val = NULL; - GRB_TRY (GxB_Vector_unpack_Bitmap( - dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, - &dup_arr_size, &junk_size, &iso, &n_keep, NULL - )); - LAGraph_Free((void **) &dup_val, msg); - GRB_TRY (GxB_Vector_pack_Full( - bad_swaps, (void **) &dup_swaps, dup_arr_size, false, NULL - )); + // Fill out dup_swaps_v in O(1) time. + GRB_TRY (GxB_Container_new(&con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(dup_swaps_v, con, NULL)) ; + n_keep = con->nvals; + GRB_TRY (GrB_free(&dup_swaps_v)); + dup_swaps_v = con->b; + con->b = NULL; + GRB_TRY (GrB_free(&con)) ; + GRB_TRY (GxB_Vector_unload( + dup_swaps_v, (void **) &dup_swaps, &M_type, &M_nvals, &dup_arr_size, + &M_hand, NULL)) ; + GRB_TRY (GxB_Vector_load( + dup_swaps_v, (void **) &dup_swaps, GrB_INT16, M_nvals / 2, + dup_arr_size, M_hand, NULL)) ; GRB_TRY (GrB_apply( - bad_swaps, NULL, NULL, lg_shiftland, bad_swaps, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - bad_swaps, (void **) &dup_swaps, &dup_arr_size, &iso, NULL - )); - GRB_TRY (GxB_Vector_pack_Full( - dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL - )) ; + dup_swaps_v, NULL, NULL, lg_shiftland, dup_swaps_v, NULL)) ; + GRB_TRY (GxB_Vector_unload( + dup_swaps_v, (void **) &dup_swaps, &M_type, &M_nvals, &dup_arr_size, + &M_hand, NULL)) ; + GRB_TRY (GxB_Vector_load( + dup_swaps_v, (void **) &dup_swaps, GrB_INT8, M_nvals * 2, + dup_arr_size, M_hand, NULL)) ; + GRB_TRY (GrB_Vector_clear(exists)) ; - // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; // --------------------------------------------------------------------- // Place Good Swaps back into E_vec // --------------------------------------------------------------------- - GRB_TRY (GxB_Container_new(&M_con)) ; - GRB_TRY (GxB_unload_Vector_into_Container(M_thin, M_con, NULL)); - GRB_TRY (GrB_free(&(M_con->b))) ; - M_con->b = dup_swaps_v; - M_con->nvals = n_keep; - M_con->format = GxB_BITMAP; - GRB_TRY (GxB_load_Vector_from_Container(M_thin, M_con, NULL)); + GRB_TRY (GxB_Container_new(&con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(M, con, NULL)) ; + GRB_TRY (GrB_free(&(con->b))) ; + con->b = dup_swaps_v; + con->nvals = n_keep; + con->format = GxB_BITMAP; + dup_swaps_v = NULL; + GRB_TRY (GxB_load_Vector_from_Container(M, con, NULL)) ; + GRB_TRY (GrB_free(&con)) ; GRB_TRY (GrB_Vector_new(&E_temp, lg_edge, e)) ; + // Want to place edges of M into E_vec inplace BUT: // EVIL segfault // GRB_TRY (LAGraph_FastAssign( - // E_vec, NULL, second_edge, edge_perm, M_thin, ramp_v, - // second_second_edge, NULL, msg)); + // E_vec, NULL, second_edge, edge_perm, M, ramp_v, + // second_second_edge, NULL, msg)) ; // Temporary fix for the above: GRB_TRY (LAGraph_FastAssign( - E_temp, NULL, NULL, edge_perm, M_thin, ramp_v, - second_second_edge, NULL, msg)); + E_temp, NULL, NULL, edge_perm, M, ramp_v, + second_second_edge, NULL, msg)) ; GRB_TRY (GrB_eWiseAdd( E_vec, NULL, NULL, second_edge, E_vec, E_temp, NULL)) ; - GrB_free(&E_temp); + GrB_free (&E_temp) ; n_keep /= 2; FREE_LOOP ; // Free Matricies that have to be rebuilt // Adjust number of swaps to do next. - num_attempts += swaps_per_loop; - num_swaps += n_keep; - swaps_per_loop = n_keep * 3; + num_attempts += swaps_per_loop ; + num_swaps += n_keep ; + swaps_per_loop = n_keep * 3 ; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; LG_TRY (LAGraph_Random_Next(random_v, msg)) ; - printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); + printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop) ; } - GRB_TRY (GxB_Vector_unpack_Full( - E_vec, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Matrix_pack_FullR( - E, (void **) &indices, ind_size, iso, NULL)); + GRB_TRY (GxB_Vector_unload( + E_vec, (void **) &indices, &lg_edge, &e, &ind_size, &E_hand, NULL)); + GRB_TRY (GxB_Vector_load( + E_con->x, (void **) &indices, E_type, e * 2, ind_size, E_hand, NULL)); + GRB_TRY (GxB_load_Matrix_from_Container(E,E_con, NULL)) ; + GRB_TRY (GrB_set(E, GrB_COLMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; + GRB_TRY (GxB_unload_Matrix_into_Container(E,E_con, NULL)) ; + GRB_TRY (GxB_Vector_unload( + E_con->x, (void **) &indices, &E_type, &e, &ind_size, &E_hand, NULL)); + e /= 2; + // Build Output Matrix - GRB_TRY (GxB_Matrix_unpack_FullC( - E, (void **)&indices, &ind_size, &iso, NULL)) ; - GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); + GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; + GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)) ; GRB_TRY (GrB_eWiseAdd( *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 )) ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index d2c1b0f5d5..5a00553393 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -23,8 +23,8 @@ #include char msg [LAGRAPH_MSG_LEN] ; -LAGraph_Graph G = NULL ; - +LAGraph_Graph G = NULL, G_new = NULL; +GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; #define LEN 512 char filename [LEN+1] ; @@ -42,8 +42,7 @@ void test_SwapEdges (void) //-------------------------------------------------------------------------- OK (LAGraph_Init (msg)) ; OK (LAGraph_Random_Init(msg)) ; - GrB_Matrix A = NULL, C = NULL, A_new = NULL, C_new = NULL; - LAGraph_Graph G = NULL, G_new = NULL; + for (int k = 0 ; ; k++) { From 08e4cbfa0b5c6b276292b5f44976bdb06cd61e41 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 3 Mar 2025 20:55:26 -0600 Subject: [PATCH 079/115] added brutal test to rcc and now using fastassign semiring --- .../algorithm/LAGraph_RichClubCoefficient.c | 5 +- experimental/test/test_RichClubCoefficient.c | 106 +++++++++++++++++- 2 files changed, 104 insertions(+), 7 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index fc96a8599c..46091ffe04 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -52,6 +52,7 @@ LAGraph_Free((void **) &index_edge, NULL) ; \ LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ + LAGraph_Free((void **) &ramp, NULL); \ LAGraph_Free((void **) &ones, NULL); \ } @@ -320,13 +321,13 @@ int LAGraph_RichClubCoefficient ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, - GxB_PLUS_UINT64_MONOID, NULL, msg + GxB_PLUS_SECOND_INT64, NULL, msg )) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (LAGraph_FastAssign ( verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, - GxB_PLUS_UINT64_MONOID, NULL, msg + GxB_PLUS_PAIR_INT64, NULL, msg )) ; #endif #else diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 7307727743..ad3de5ac00 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -24,6 +24,9 @@ #include char msg [LAGRAPH_MSG_LEN] ; + +GrB_Matrix A = NULL, C = NULL; +GrB_Vector rcc = NULL; LAGraph_Graph G = NULL ; #define LEN 512 @@ -81,7 +84,6 @@ double rcc3[] = {0.020418922066450775, 0.020418922066450775, 0.16666666666666666, 1.0} ; double rcc4[] = {0.0016506547800326698, 0.0017226315730560155, 0.0034201182512489416, 0.0037033309852068028, 0.05405405405405406}; -// TODO: add singleton test const matrix_info tests [ ] = { {rcc1, sizeof(rcc1) / sizeof(rcc1[0]), "random_unweighted_general1.mtx"}, @@ -97,9 +99,7 @@ void test_RichClubCoefficient (void) // start LAGraph //-------------------------------------------------------------------------- OK (LAGraph_Init (msg)) ; - GrB_Matrix A = NULL, C = NULL; - GrB_Vector rcc = NULL; - LAGraph_Graph G = NULL ; + for (int k = 0 ; ; k++) { @@ -181,10 +181,105 @@ void test_RichClubCoefficient (void) //-------------------------------------------------------------------------- // free everything and finalize LAGraph //-------------------------------------------------------------------------- + LAGraph_Finalize (msg) ; +} +//------------------------------------------------------------------------------ +// test_RCC_brutal: +//------------------------------------------------------------------------------ - LAGraph_Finalize (msg) ; +#if LAGRAPH_SUITESPARSE +void test_rcc_brutal (void) +{ + //-------------------------------------------------------------------------- + // start LAGraph + //-------------------------------------------------------------------------- + OK (LG_brutal_setup (msg)) ; + + + for (int k = 0 ; ; k++) + { + //The following code taken from MIS tester + // load the matrix as A + const char *aname = tests [k].name; + if (strlen (aname) == 0) break; + TEST_CASE (aname) ; + snprintf (filename, LEN, LG_DATA_DIR "%s", aname) ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + TEST_MSG ("Loading of valued matrix failed") ; + printf ("\nMatrix: %s\n", aname) ; + const double *ans = tests [k].rcc; + const uint64_t n_ans = tests [k].n; + + // C = structure of A + OK (LAGraph_Matrix_Structure (&C, A, msg)) ; + OK (GrB_free (&A)) ; + + // construct a directed graph G with adjacency matrix C + OK (LAGraph_New (&G, &C, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (C == NULL) ; + + // check if the pattern is symmetric + OK (LAGraph_Cached_IsSymmetricStructure (G, msg)) ; + + if (G->is_symmetric_structure == LAGraph_FALSE) + { + // make the adjacency matrix symmetric + OK (LAGraph_Cached_AT (G, msg)) ; + OK (GrB_eWiseAdd (G->A, NULL, NULL, GrB_LOR, G->A, G->AT, NULL)) ; + G->is_symmetric_structure = LAGraph_TRUE ; + } + G->kind = LAGraph_ADJACENCY_UNDIRECTED ; + + // check for self-edges + OK (LAGraph_Cached_NSelfEdges (G, msg)) ; + if (G->nself_edges != 0) + { + // remove self-edges + printf ("graph has %g self edges\n", (double) G->nself_edges) ; + OK (LAGraph_DeleteSelfEdges (G, msg)) ; + printf ("now has %g self edges\n", (double) G->nself_edges) ; + TEST_CHECK (G->nself_edges == 0) ; + } + + // compute the row degree + OK (LAGraph_Cached_OutDegree (G, msg)) ; + + LG_BRUTAL_BURBLE (LAGraph_CheckGraph (G, msg)) ; + //---------------------------------------------------------------------- + // test the algorithm + //---------------------------------------------------------------------- + + printf ("RCC computation begins:\n") ; + // GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + LG_BRUTAL_BURBLE (LAGraph_RichClubCoefficient( &rcc, G, msg)); + printf("%s\n", msg); + // GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + printf ("RCC computation ends:\n") ; + + //---------------------------------------------------------------------- + // check results + //---------------------------------------------------------------------- + double comp_val = 0; + for(int64_t i = n_ans - 1; i >= 0; --i) + { + GrB_Vector_extractElement(&comp_val, rcc, i) ; + TEST_CHECK ( + comp_val - ans[i] <= 1e-10 && ans[i] - comp_val <= 1e-10) ; + } + OK (GrB_free (&rcc)) ; + OK (LAGraph_Delete (&G, msg)) ; + } + + //-------------------------------------------------------------------------- + // free everything and finalize LAGraph + //-------------------------------------------------------------------------- + OK(LG_brutal_teardown(msg)) ; } +#endif //---------------------------------------------------------------------------- // the make program is created by acutest, and it runs a list of tests: @@ -193,5 +288,6 @@ void test_RichClubCoefficient (void) TEST_LIST = { {"RichClubCoefficient", test_RichClubCoefficient}, + {"rcc_brutal", test_rcc_brutal}, {NULL, NULL} } ; From 786ee083131cacb08620f87ff73a950603e0bb3f Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 4 Mar 2025 18:46:14 -0600 Subject: [PATCH 080/115] Now working on with saxpy4 of GBv10.0.1 --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 48 +++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index b91d4d19fc..fccaafde85 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -163,15 +163,15 @@ void hash_edge "}" void add_term - (uint8_t *z, const uint8_t *x, const uint8_t *y) + (int8_t *z, const int8_t *x, const int8_t *y) { - (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)) ; + (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; } #define ADD_TERM \ "void add_term \n"\ -"(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ +"(int8_t *z, const int8_t *x, const int8_t *y) \n"\ "{ \n"\ -" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)) ; \n"\ +" (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; \n"\ "}" void edge2 (edge_type *z, const void *x, const edge_type *y) @@ -356,7 +356,7 @@ int LAGraph_SwapEdgesV2 )) ; GRB_TRY(GxB_BinaryOp_new( &add_term_biop, (GxB_binary_function) (&add_term), - GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM + GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM )) ; GRB_TRY(GxB_BinaryOp_new( &second_edge, (GxB_binary_function) (&edge2), @@ -367,8 +367,8 @@ int LAGraph_SwapEdgesV2 lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2 )) ; - GRB_TRY (GxB_Monoid_terminal_new_UINT8( - &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 + GRB_TRY (GxB_Monoid_terminal_new_INT8( + &add_term_monoid, add_term_biop, (int8_t) 0, (int8_t) 2 )) ; // This isn't actually a monoid but since it's never applied as one it @@ -380,7 +380,7 @@ int LAGraph_SwapEdgesV2 // Now working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( - &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 + &plus_term_one, add_term_monoid, GrB_ONEB_INT8 )) ; GRB_TRY(GrB_Semiring_new( &second_second_edge, second_edge_monoid, second_bool_edge @@ -402,7 +402,7 @@ int LAGraph_SwapEdgesV2 uint64_t ehash_size = (1ull << (67-shift_e)) ; // if(ehash_size > 6*e) ehash_size/=2; printf("Hash Size: %ld", ehash_size); - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, ehash_size)) ; + GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- @@ -423,7 +423,6 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; //TODO: Change seed @@ -535,7 +534,8 @@ int LAGraph_SwapEdgesV2 exists = con->b; con->b = NULL; GRB_TRY (GrB_free(&con)) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; + // exist has to be full at this point - confirmed by fprint + // GxB_print(exists, GxB_SUMMARY); // "Count" all of the edges that fit into each bucket. Stop counting at // 2 since we will have to throw that whole bucket away anyway. @@ -543,10 +543,10 @@ int LAGraph_SwapEdgesV2 exists, NULL, add_term_biop, new_hashed_edges, x, ramp_v, plus_term_one, NULL, msg )) ; - + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; // Select buckets with only one corresponding value - GRB_TRY (GrB_Vector_select_UINT8( - exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 1, + GRB_TRY (GrB_Vector_select_INT8( + exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (int8_t) 1, NULL )) ; @@ -584,6 +584,7 @@ int LAGraph_SwapEdgesV2 // Place Good Swaps back into E_vec // --------------------------------------------------------------------- + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,1) GRB_TRY (GxB_Container_new(&con)) ; GRB_TRY (GxB_unload_Vector_into_Container(M, con, NULL)) ; GRB_TRY (GrB_free(&(con->b))) ; @@ -593,21 +594,14 @@ int LAGraph_SwapEdgesV2 dup_swaps_v = NULL; GRB_TRY (GxB_load_Vector_from_Container(M, con, NULL)) ; GRB_TRY (GrB_free(&con)) ; - GRB_TRY (GrB_Vector_new(&E_temp, lg_edge, e)) ; - - // Want to place edges of M into E_vec inplace BUT: - // EVIL segfault - // GRB_TRY (LAGraph_FastAssign( - // E_vec, NULL, second_edge, edge_perm, M, ramp_v, - // second_second_edge, NULL, msg)) ; - - // Temporary fix for the above: GRB_TRY (LAGraph_FastAssign( - E_temp, NULL, NULL, edge_perm, M, ramp_v, + E_vec, NULL, second_edge, edge_perm, M, ramp_v, second_second_edge, NULL, msg)) ; - GRB_TRY (GrB_eWiseAdd( - E_vec, NULL, NULL, second_edge, E_vec, E_temp, NULL)) ; - GrB_free (&E_temp) ; + #else // Fix for old saxpy4 bug + GRB_TRY(GxB_Vector_subassign_Vector( + E_vec, dup_swaps_v, NULL, M, edge_perm, NULL)); + #endif + n_keep /= 2; From 3950a7650401d3d0f9b73024b14fae02ad9e7d01 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sat, 15 Mar 2025 22:22:27 -0500 Subject: [PATCH 081/115] changed dupswap lookup --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index fccaafde85..4e01c2c2e1 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -551,10 +551,12 @@ int LAGraph_SwapEdgesV2 )) ; // Find each hashed edge's bucket, dup_swaps_v is 1 if exists[edge] = 1 - LG_TRY (LAGraph_FastAssign( - dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, - GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg - )) ; + // LG_TRY (LAGraph_FastAssign( + // dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, + // GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg + // )) ; + GRB_TRY (GxB_Vector_extract_Vector( + dup_swaps_v, NULL, NULL, exists, new_hashed_edges, NULL)) ; // Fill out dup_swaps_v in O(1) time. GRB_TRY (GxB_Container_new(&con)) ; From 21a3a95fcc27b2b4619ae337e298f09230db479a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 16 Mar 2025 17:50:12 -0500 Subject: [PATCH 082/115] Fixed input params RCC --- .../algorithm/LAGraph_RichClubCoefficient.c | 37 ++++++++++--------- experimental/algorithm/LG_CC_FastSV7_FA.c | 7 ++-- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index fc96a8599c..843e40526c 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -151,8 +151,7 @@ int LAGraph_RichClubCoefficient GrB_Matrix P = NULL; GrB_Index n ; - GrB_Index vi_size ; - GrB_Index vx_size ; + GrB_Index edge_vec_nvals; GrB_Index deg_vec_size; GrB_Index max_deg; @@ -251,12 +250,14 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; #if LAGRAPH_SUITESPARSE #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) + GrB_Index vi_size ; + GrB_Index vx_size ; if(n == edge_vec_nvals) { GRB_TRY (GxB_Vector_unpack_Full ( node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; GRB_TRY (GxB_Vector_unpack_Full ( - degrees, (void **)°_arr, &vx_size, &iso, NULL)) ; + degrees, (void **)°_arr, &vi_size, &iso, NULL)) ; } else { @@ -267,11 +268,13 @@ int LAGraph_RichClubCoefficient LG_TRY(LAGraph_Malloc( (void **) &node_edges_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; GRB_TRY (GrB_Vector_extractTuples_INT64( - NULL, deg_arr, °_vec_size, degrees + NULL, deg_arr, &edge_vec_nvals, degrees )) ; GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; + vi_size = edge_vec_nvals * sizeof(int64_t); + vx_size = edge_vec_nvals * sizeof(int64_t); } GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; LG_TRY (LAGraph_Malloc( @@ -285,7 +288,7 @@ int LAGraph_RichClubCoefficient GRB_TRY (GxB_Matrix_pack_CSC( P, (GrB_Index **)&ramp, (GrB_Index **)°_arr, (void **) &node_edges_arr, (edge_vec_nvals + 1) * sizeof(int64_t), - vx_size, vx_size, false, false, NULL + vi_size, vx_size, false, false, NULL )) ; GRB_TRY (GrB_mxv( edges_per_deg, NULL, NULL, GxB_PLUS_FIRST_INT64, P, ones_v, NULL)) ; @@ -295,7 +298,9 @@ int LAGraph_RichClubCoefficient if(n == edge_vec_nvals) { deg_x = degrees; + degrees = NULL; node_edges_x = node_edges; + node_edges = NULL; deg_vec_size = n; } else @@ -337,25 +342,23 @@ int LAGraph_RichClubCoefficient LG_TRY(LAGraph_Malloc( (void **) &node_edges_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; GRB_TRY (GrB_Vector_extractTuples_INT64( - NULL, deg_arr, °_vec_size, degrees + NULL, deg_arr, &edge_vec_nvals, degrees )) ; GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; // Build with degrees as indecies and handle duplicates via adition - GRB_TRY (GrB_Vector_build ( - edges_per_deg, deg_arr, node_edges_arr, deg_vec_size, + GRB_TRY (GrB_Vector_build_INT64 ( + edges_per_deg, deg_arr, node_edges_arr, edge_vec_nvals, GrB_PLUS_INT64)) ; - - //Hack to make an array of ones - GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; LG_TRY ( - LAGraph_Malloc((void **) &ones, deg_vec_size, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Vector_assign_INT64( - ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_extractTuples_INT64(NULL, ones, °_vec_size, ones_v)) ; - GRB_TRY (GrB_Vector_build ( - verts_per_deg, deg_arr, ones, deg_vec_size, GrB_PLUS_INT64)) ; + LAGraph_Malloc((void **) &ones, edge_vec_nvals, sizeof(int64_t), NULL)) ; + for(uint64_t i = 0; i < edge_vec_nvals; ++i) + { + ones[i] = 1ll; + } + GRB_TRY (GrB_Vector_build_INT64 ( + verts_per_deg, deg_arr, ones, edge_vec_nvals, GrB_PLUS_INT64)) ; #endif /** diff --git a/experimental/algorithm/LG_CC_FastSV7_FA.c b/experimental/algorithm/LG_CC_FastSV7_FA.c index 393a830101..095e47b6be 100644 --- a/experimental/algorithm/LG_CC_FastSV7_FA.c +++ b/experimental/algorithm/LG_CC_FastSV7_FA.c @@ -128,8 +128,8 @@ static inline GrB_Info fastsv // } // // LAGraph_FastAssign does this by building a matrix. - // (See LAGraph_FastAssign.c) Giving it a full ramp vector speeds up the - // function + // (See LAGraph_FastAssign.c) + // Giving it a full ramp vector speeds up the function LG_TRY (LAGraph_FastAssign( parent2, NULL, min, parent, mngp, ramp, min_2nd, NULL, msg)); @@ -596,8 +596,7 @@ int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GraphBLAS v10 uint32_t *Px32 = Px_is_32 ? Px : NULL ; uint64_t *Px64 = Px_is_32 ? NULL : Px ; - // At this point, both the parent vector and Parent matrix are empty, - // and the Px array holds the content of parent vector. + // At this point, the Px array holds the content of parent vector. //---------------------------------------------------------------------- // use sampling to estimate the largest connected component in T From 0941d38eea951b29f7cfb59b74c743fd5a7503c0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 16 Mar 2025 17:52:46 -0500 Subject: [PATCH 083/115] check GBSS for brutal test --- experimental/test/test_RichClubCoefficient.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index ad3de5ac00..9a9f3f2daa 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -181,7 +181,7 @@ void test_RichClubCoefficient (void) //-------------------------------------------------------------------------- // free everything and finalize LAGraph //-------------------------------------------------------------------------- - LAGraph_Finalize (msg) ; + OK (LAGraph_Finalize (msg)) ; } //------------------------------------------------------------------------------ @@ -199,7 +199,6 @@ void test_rcc_brutal (void) for (int k = 0 ; ; k++) { - //The following code taken from MIS tester // load the matrix as A const char *aname = tests [k].name; if (strlen (aname) == 0) break; @@ -288,6 +287,8 @@ void test_rcc_brutal (void) TEST_LIST = { {"RichClubCoefficient", test_RichClubCoefficient}, + #if LAGRAPH_SUITESPARSE {"rcc_brutal", test_rcc_brutal}, + #endif {NULL, NULL} } ; From de022cfaab52409f153a9a2b34af74b7a53a8c56 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 16 Mar 2025 19:23:37 -0500 Subject: [PATCH 084/115] Fixed fast assign monoid for all but UDTs --- .../algorithm/LAGraph_RichClubCoefficient.c | 4 +- experimental/utility/LAGraph_FastAssign.c | 162 ++++-------------- 2 files changed, 40 insertions(+), 126 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 7d547175f4..27543ea687 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -326,13 +326,13 @@ int LAGraph_RichClubCoefficient ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, - GxB_PLUS_SECOND_INT64, NULL, msg + GrB_PLUS_MONOID_INT64, NULL, msg )) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (LAGraph_FastAssign ( verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, - GxB_PLUS_PAIR_INT64, NULL, msg + GrB_PLUS_MONOID_INT64, NULL, msg )) ; #endif #else diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 2533c2ea79..a371fbe5b9 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -63,10 +63,7 @@ #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ - GrB_free(&P); \ - GrB_free(&con); \ - LAGraph_Free(&ramp_a, msg); \ - LAGraph_Free(&i_a, msg); \ + GrB_free(&sem); \ } int LAGraph_FastAssign_Monoid @@ -86,130 +83,47 @@ int LAGraph_FastAssign_Monoid char *msg ) { - // TODO: Change this from a reduce to an mxv: requires a finding the - // appropriate second biop, but will give user flexibility to make X_vec - // not full, and use Transpose descriptor. - - // TODO: Let indicies be specified by value of by index in I_vec via - // descriptor (although build or assign would be better if I_vec is by - // index since it is sorted and has no dups). By value could be useful if - // I_vec is not full. - // TODO: Ditto for X_vec - - GrB_Matrix P = NULL; - int64_t n, nrows; - GxB_Container con = NULL; - void *ramp_a = NULL, *i_a = NULL; - int ramp_h = 0, trsp = 0, i_h = 0, x_sparsity = 0; - int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; - GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; - bool iso = false; - - GRB_TRY (GrB_get(X_vec, &x_sparsity, GxB_SPARSITY_STATUS)); - //TODO: assert inputs are full or desc say to use by value or by index. - LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; - LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; - LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; - - // TODO: implement this. - LG_ASSERT_MSG (x_sparsity == GxB_FULL, GrB_NOT_IMPLEMENTED, - "X_vec must be full if dup is a monoid. Pass in the dup_second semiring"\ - " if you want to use a sparse X_vec.") ; - LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, - "c cannot be aliased with X_vec.") ; - //---------------------------------------------------------------------- - // Find dimensions and type - //---------------------------------------------------------------------- - GRB_TRY (GrB_Vector_size(&n, I_vec)) ; - if(desc != NULL) - { - GRB_TRY (GrB_get(desc, &trsp, GrB_INP0)) ; - LG_ASSERT_MSG (trsp == GrB_DEFAULT, GrB_NOT_IMPLEMENTED, - "Transpose can only be used with a semiring."\ - "Pass dup_second for this to work.") ; - } - GRB_TRY (GrB_Vector_size(&nrows, c)) ; - GRB_TRY (GrB_Vector_get_INT32(X_vec, (int32_t *) &iso, GxB_ISO)); - - GRB_TRY (GxB_Vector_type(&x_type, X_vec)); - - //---------------------------------------------------------------------- - // Load up containers - //---------------------------------------------------------------------- - GRB_TRY (GrB_Matrix_new(&P, x_type, nrows, n)); - GRB_TRY (GxB_Container_new(&con)); - if(ramp == NULL) - { - //TODO: maybe let user input a size 0 ramp and build it for them? - GRB_TRY (GrB_free(&(con->p))) ; - ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; - GrB_IndexUnaryOp idxnum = (n + 1 <= INT32_MAX)? - GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; - GRB_TRY (GrB_Vector_new(&(con->p), ramp_type, n + 1)); - GRB_TRY (GrB_assign (con->p, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_apply (con->p, NULL, NULL, idxnum, con->p, 0, NULL)) ; - } - else - { - GRB_TRY (GxB_Vector_unload( - ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; - LG_ASSERT_MSG (ramp_n > n, GrB_DIMENSION_MISMATCH, "Ramp too small!"); - GRB_TRY (GxB_Vector_load( - con->p, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), - GxB_IS_READONLY, NULL)) ; - // Since con->p won't free this array I should be safe to load it back - // into ramp. - GRB_TRY (GxB_Vector_load( - ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; - ramp_a = NULL; - } - if (c == I_vec) + GrB_BinaryOp op = NULL; + GrB_Semiring sem = NULL; + int code = 0; + GrB_get(X_vec, &code, GrB_EL_TYPE_CODE); + switch (code) { - GRB_TRY (GrB_free(&(con->i))) ; - GRB_TRY (GrB_Vector_dup(&con->i, I_vec)) ; + case GrB_BOOL_CODE : op = GrB_SECOND_BOOL ; break ; + case GrB_INT8_CODE : op = GrB_SECOND_INT8 ; break ; + case GrB_INT16_CODE : op = GrB_SECOND_INT16 ; break ; + case GrB_INT32_CODE : op = GrB_SECOND_INT32 ; break ; + case GrB_INT64_CODE : op = GrB_SECOND_INT64 ; break ; + case GrB_UINT8_CODE : op = GrB_SECOND_UINT8 ; break ; + case GrB_UINT16_CODE : op = GrB_SECOND_UINT16 ; break ; + case GrB_UINT32_CODE : op = GrB_SECOND_UINT32 ; break ; + case GrB_UINT64_CODE : op = GrB_SECOND_UINT64 ; break ; + case GrB_FP32_CODE : op = GrB_SECOND_FP32 ; break ; + case GrB_FP64_CODE : op = GrB_SECOND_FP64 ; break ; + case GxB_FC32_CODE : op = GxB_SECOND_FC32 ; break ; + case GxB_FC64_CODE : op = GxB_SECOND_FC64 ; break ; + default : + LG_ERROR_MSG("LAGraph failed (file %s, line %d):" \ + " LAGraph_FastAssign_Monoid not implemented for UDTs", + __FILE__, __LINE__); + break ; } - else - { - // con->i = I_vec - GRB_TRY (GxB_Vector_unload( - I_vec, &i_a, &i_type, &i_n, &i_size, &i_h, NULL)) ; - GRB_TRY (GxB_Vector_load( - con->i, &i_a, i_type, i_n, i_size, GxB_IS_READONLY, NULL)) ; - // Since con->i won't free this array I should be safe to load it back - // into I_vec. - GRB_TRY (GxB_Vector_load( - I_vec, &i_a, i_type, i_n, i_size, i_h, NULL)) ; - i_a = NULL; - } - GRB_TRY (GrB_free(&(con->x))) ; - con->x = X_vec; - con->format = GxB_SPARSE; - con->orientation = GrB_COLMAJOR; - con->nrows = nrows; - con->ncols = n ; - con->nvals = n ; - con->nrows_nonempty = -1 ; - con->ncols_nonempty = n ; - con->jumbled = false ; - con->format = GxB_SPARSE ; - con->orientation = GrB_COLMAJOR ; - con->Y = NULL ; - //---------------------------------------------------------------------- - // Load P and do reduce. - //---------------------------------------------------------------------- - GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); - GRB_TRY (GrB_reduce( - c, mask, accum, dup, P, desc)) ; - GRB_TRY (GxB_unload_Matrix_into_Container(P, con, NULL)); - // Don't let inputs get freed - con->x = NULL; - //---------------------------------------------------------------------- - // Free work. - //---------------------------------------------------------------------- - GrB_free(&P) ; - GrB_free(&con) ; + GRB_TRY (GrB_Semiring_new(&sem, dup, op)) ; + // GxB_print(sem, stdout) ; + LG_TRY (LAGraph_FastAssign_Semiring + (c, mask, accum, I_vec, X_vec, ramp, sem, desc, msg)) ; + LG_FREE_ALL ; } +#undef LG_FREE_ALL +#define LG_FREE_ALL \ +{ \ + GrB_free(&P); \ + GrB_free(&con); \ + LAGraph_Free(&ramp_a, msg); \ + LAGraph_Free(&i_a, msg); \ +} + // This method can be faster if given a builtin semiring. int LAGraph_FastAssign_Semiring ( From f860c57f7e7154339bc937d9564c42c10cca58f4 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 16 Mar 2025 22:55:56 -0500 Subject: [PATCH 085/115] fix FA return & small rcc changes --- .../algorithm/LAGraph_RichClubCoefficient.c | 41 ++++++++----------- experimental/utility/LAGraph_FastAssign.c | 5 ++- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 27543ea687..4e59cd35ba 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -36,7 +36,7 @@ /* free any workspace used here */ \ GrB_free(&D) ; \ GrB_free(&P) ; \ - GrB_free(&edge_degrees) ; \ + GrB_free(&A_deg) ; \ GrB_free(°rees) ; \ GrB_free(°_x) ; \ GrB_free(&node_edges) ; \ @@ -49,7 +49,6 @@ GrB_free(&rcCalculation) ; \ GrB_free(&ramp_v) ; \ LAGraph_Free((void **) &array_space, NULL) ; \ - LAGraph_Free((void **) &index_edge, NULL) ; \ LAGraph_Free((void **) &node_edges_arr, NULL); \ LAGraph_Free((void **) °_arr, NULL); \ LAGraph_Free((void **) &ramp, NULL); \ @@ -107,7 +106,7 @@ int LAGraph_RichClubCoefficient // n x n Adjacency Matrix // With values cooresponding to the degree of its column - GrB_Matrix edge_degrees = NULL; + GrB_Matrix A_deg = NULL; // n x n Diagonal Matrix // entries corresponding to degrees. @@ -124,11 +123,11 @@ int LAGraph_RichClubCoefficient // max_degree x 1 // the ith entry contains the number of edges whose lowest degree is i. - GrB_Vector edges_per_deg = NULL, epd_dense = NULL, epd_I = NULL; + GrB_Vector edges_per_deg = NULL; // max_degree x 1 // the ith entry contains the number of verticies whose degree is i. - GrB_Vector verts_per_deg = NULL, vpd_dense = NULL, vpd_I = NULL; + GrB_Vector verts_per_deg = NULL; // edge_vec_nvals x 1 // Vector of ones @@ -154,7 +153,6 @@ int LAGraph_RichClubCoefficient GrB_Index n ; GrB_Index edge_vec_nvals; - GrB_Index deg_vec_size; GrB_Index max_deg; bool iso = false; @@ -164,11 +162,8 @@ int LAGraph_RichClubCoefficient *edges_per_deg_arr = NULL, *ones = NULL, *deg_vertex_count = NULL; - GrB_Index *epd_index = NULL, *vpd_index = NULL; - int64_t *ramp = NULL; - GrB_Index *index_edge = NULL; //-------------------------------------------------------------------------- // Check inputs @@ -189,7 +184,7 @@ int LAGraph_RichClubCoefficient //-------------------------------------------------------------------------- A = G->A ; GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY (GrB_Matrix_new(&edge_degrees, GrB_INT64,n,n)) ; + GRB_TRY (GrB_Matrix_new(&A_deg, GrB_INT64,n,n)) ; GRB_TRY (GrB_Vector_new(°rees, GrB_INT64, n)) ; GRB_TRY (GrB_Vector_new(&node_edges, GrB_INT64, n)) ; @@ -223,26 +218,25 @@ int LAGraph_RichClubCoefficient //-------------------------------------------------------------------------- // degrees = G->out_degree - 1 - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( - degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; - // Fill out degree vector, to target col_scale mxm on graphs // with singletons, scalar value irrelevant. GRB_TRY (GrB_Vector_assign_INT64( - degrees, degrees, NULL, (int64_t) -1, GrB_ALL, 0, GrB_DESC_SC)) ; + degrees, NULL, NULL, (int64_t) -1, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign( + degrees, NULL, GrB_PLUS_INT64, G->out_degree, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; // Each edge in the graph gets the value of the degree of its row node #if LAGRAPH_SUITESPARSE GRB_TRY (GrB_mxm( - edge_degrees, NULL, NULL, GxB_ANY_FIRST_INT64, D, A, NULL)) ; + A_deg, NULL, NULL, GxB_ANY_FIRST_INT64, D, A, NULL)) ; #else GRB_TRY (GrB_mxm( - edge_degrees, NULL, NULL, GrB_PLUS_TIMES_SEMIRING_INT64, D, A, NULL)) ; + A_deg, NULL, NULL, GrB_PLUS_TIMES_SEMIRING_INT64, D, A, NULL)) ; #endif // Sum the number of edges each node is "responsible" for. GRB_TRY (GrB_mxv( - node_edges, NULL, NULL, plus_2le, edge_degrees, degrees, NULL)) ; + node_edges, NULL, NULL, plus_2le, A_deg, degrees, NULL)) ; // The rest of this is indexing the number of edges and number of nodes at @@ -302,7 +296,6 @@ int LAGraph_RichClubCoefficient degrees = NULL; node_edges_x = node_edges; node_edges = NULL; - deg_vec_size = n; } else { @@ -321,18 +314,18 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; GRB_TRY (GrB_Vector_assign_INT64( - ramp_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; + ramp_v, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_apply ( ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( - edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, - GrB_PLUS_MONOID_INT64, NULL, msg + edges_per_deg, NULL, GrB_PLUS_INT64, deg_x, node_edges_x, ramp_v, + GxB_PLUS_SECOND_INT64, NULL, msg )) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; GRB_TRY (LAGraph_FastAssign ( verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, - GrB_PLUS_MONOID_INT64, NULL, msg + GxB_PLUS_PAIR_INT64, NULL, msg )) ; #endif #else @@ -352,8 +345,8 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_build_INT64 ( edges_per_deg, deg_arr, node_edges_arr, edge_vec_nvals, GrB_PLUS_INT64)) ; - LG_TRY ( - LAGraph_Malloc((void **) &ones, edge_vec_nvals, sizeof(int64_t), NULL)) ; + LG_TRY (LAGraph_Malloc( + (void **) &ones, edge_vec_nvals, sizeof(int64_t), NULL)) ; for(uint64_t i = 0; i < edge_vec_nvals; ++i) { ones[i] = 1ll; diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index a371fbe5b9..9280c60c0e 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -113,6 +113,7 @@ int LAGraph_FastAssign_Monoid LG_TRY (LAGraph_FastAssign_Semiring (c, mask, accum, I_vec, X_vec, ramp, sem, desc, msg)) ; LG_FREE_ALL ; + return (GrB_SUCCESS); } #undef LG_FREE_ALL @@ -164,7 +165,8 @@ int LAGraph_FastAssign_Semiring LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; - LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, "c cannot be aliased with X_vec.") ; + LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, + "c cannot be aliased with X_vec.") ; //---------------------------------------------------------------------- // Find dimensions and type @@ -265,5 +267,6 @@ int LAGraph_FastAssign_Semiring //---------------------------------------------------------------------- GrB_free(&P) ; GrB_free(&con) ; + return (GrB_SUCCESS) ; } #endif From 82549a2cd8890f368a45249c9684b52dba39745c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 16 Mar 2025 23:49:26 -0500 Subject: [PATCH 086/115] Removed last pack operation --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 49 +++++++++----------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 4e01c2c2e1..2c5dccf1b6 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -188,19 +188,6 @@ void edge2 " z->a = y->a; \n"\ " z->b = y->b; \n"\ "}" -// void edge2b -// (edge_type *z, const void *x, const edge_type *y) -// { -// z->a = y->a; -// z->b = y->b; -// } -// #define EDGE2B \ -// "void edge2b \n"\ -// "(edge_type *z, const void *x, const edge_type *y) \n"\ -// "{ \n"\ -// " z->a = y->a; \n"\ -// " z->b = y->b; \n"\ -// "}" int LAGraph_SwapEdgesV2 ( @@ -212,7 +199,6 @@ int LAGraph_SwapEdgesV2 char *msg ) { - // TODO: Remove all instances of GxB_(un)pack! //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- @@ -394,17 +380,34 @@ int LAGraph_SwapEdgesV2 GRB_TRY ( GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) ) ; - GRB_TRY (GxB_Matrix_pack_FullC ( - E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL - )) ; + ind_size = 2ull * e * sizeof(GrB_Index); + GRB_TRY (GxB_Container_new(&E_con)) ; + GRB_TRY (GxB_Vector_load( + E_con->x, (void **) &indices, GrB_INT64, e * 2, + ind_size, GrB_DEFAULT, NULL + )); + E_con->nrows_nonempty = E_con->nrows = e; + E_con->nvals = e * 2; + E_con->ncols_nonempty = E_con->ncols = 2; + E_con->iso = false; + E_con->jumbled = false; + E_con->format = GxB_FULL; + E_con->orientation = GrB_COLMAJOR; + GRB_TRY (GxB_load_Matrix_from_Container(E, E_con, NULL)); GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; + GRB_TRY (GxB_unload_Matrix_into_Container(E, E_con, NULL)); + GRB_TRY (GxB_Vector_unload( + E_con->x, (void **) &indices, &E_type, &e, &ind_size, &E_hand, NULL)); + e /= 2; + GRB_TRY (GxB_Vector_load( + E_vec, (void **) &indices, lg_edge, e, ind_size, E_hand, NULL)); + + // Find Hash Size ---------------------------------------------------------- int shift_e = __builtin_clzl(e); uint64_t ehash_size = (1ull << (67-shift_e)) ; - // if(ehash_size > 6*e) ehash_size/=2; printf("Hash Size: %ld", ehash_size); GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; - // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; @@ -428,13 +431,7 @@ int LAGraph_SwapEdgesV2 //TODO: Change seed LG_TRY( LAGraph_Random_Seed(random_v, 1548945616ul, msg)) ; - GRB_TRY (GxB_Container_new(&E_con)) ; - GRB_TRY (GxB_unload_Matrix_into_Container(E, E_con, NULL)); - GRB_TRY (GxB_Vector_unload( - E_con->x, (void **) &indices, &E_type, &e, &ind_size, &E_hand, NULL)); - e /= 2; - GRB_TRY (GxB_Vector_load( - E_vec, (void **) &indices, lg_edge, e, ind_size, E_hand, NULL)); + printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { From 08cb4f87e77243f4348de482548c5ab2443f2d54 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 17 Mar 2025 00:26:48 -0500 Subject: [PATCH 087/115] added file export to swap demo --- experimental/benchmark/SwapEdges_demo.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/experimental/benchmark/SwapEdges_demo.c b/experimental/benchmark/SwapEdges_demo.c index 4fcbe6d40b..313d7e4627 100644 --- a/experimental/benchmark/SwapEdges_demo.c +++ b/experimental/benchmark/SwapEdges_demo.c @@ -60,6 +60,7 @@ int main (int argc, char **argv) double t = LAGraph_WallClockTime ( ) ; GrB_Index swaps = (argc > 2) ? atoi(argv [2]): 100; char *matrix_name = (argc > 1) ? argv [1] : "stdin" ; + FILE *f = (argc > 3) ? fopen (argv[3], "w"): NULL; LG_TRY (readproblem ( &G, // the graph that is read from stdin or a file NULL, // source nodes (none, if NULL) @@ -118,7 +119,10 @@ int main (int argc, char **argv) printf ("\n===============================The result matrix:\n") ; LG_TRY (LAGraph_Matrix_Print (G_new -> A, LAGraph_SHORT, stdout, msg)) ; - + if(f) + { + LG_TRY (binwrite(&(G_new -> A), f, NULL)) ; + } //-------------------------------------------------------------------------- // free everyting and finish //-------------------------------------------------------------------------- From 53f72976031aaf7ca00b48288d9d592bf31c2901 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 19 Mar 2025 14:09:47 -0500 Subject: [PATCH 088/115] Mar 19 meeting: __builtin_clzl --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 2c5dccf1b6..22d017fde2 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -403,7 +403,15 @@ int LAGraph_SwapEdgesV2 E_vec, (void **) &indices, lg_edge, e, ind_size, E_hand, NULL)); // Find Hash Size ---------------------------------------------------------- - int shift_e = __builtin_clzl(e); + int shift_e ; + #if (!( defined ( __NVCC__) || defined ( __INTEL_CLANG_COMPILER) || \ + defined ( __INTEL_COMPILER) ) && defined ( _MSC_VER )) || 1 + // using the built-in Microsoft Windows compiler + // use ceil, log2, etc + shift_e = 64 - (int) floor (log2 ((double) e)) ; + #else + shift_e = __builtin_clzl(e); + #endif uint64_t ehash_size = (1ull << (67-shift_e)) ; printf("Hash Size: %ld", ehash_size); GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; @@ -636,4 +644,4 @@ int LAGraph_SwapEdgesV2 LG_FREE_WORK ; return (GrB_SUCCESS) ; } -#endif \ No newline at end of file +#endif From de02b6eb0b92b8353d5b525b37f62c35c64705d3 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 1 Apr 2025 15:18:54 -0500 Subject: [PATCH 089/115] Filled node_edges for faster mxv --- .../algorithm/LAGraph_RichClubCoefficient.c | 66 ++++--------------- experimental/algorithm/LG_CC_FastSV7_FA.c | 8 --- experimental/utility/LAGraph_FastAssign.c | 3 +- src/utility/LG_internal.h | 6 ++ 4 files changed, 21 insertions(+), 62 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 4e59cd35ba..449e74d6a0 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -226,6 +226,10 @@ int LAGraph_RichClubCoefficient degrees, NULL, GrB_PLUS_INT64, G->out_degree, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; + // Fill out node_edges Vector + GRB_TRY (GrB_Vector_assign_INT64( + node_edges, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; + // Each edge in the graph gets the value of the degree of its row node #if LAGRAPH_SUITESPARSE GRB_TRY (GrB_mxm( @@ -236,60 +240,16 @@ int LAGraph_RichClubCoefficient #endif // Sum the number of edges each node is "responsible" for. GRB_TRY (GrB_mxv( - node_edges, NULL, NULL, plus_2le, A_deg, degrees, NULL)) ; - + node_edges, NULL, GrB_PLUS_INT64, plus_2le, A_deg, degrees, NULL)) ; + // Recover sparcity structure. + GRB_TRY (GrB_Vector_assign( + node_edges, G->out_degree, NULL, node_edges, GrB_ALL, 0, GrB_DESC_RS)) ; // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges // and nodes at degree geq k. GRB_TRY (GrB_Vector_nvals (&edge_vec_nvals, node_edges)) ; - #if LAGRAPH_SUITESPARSE - #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) - GrB_Index vi_size ; - GrB_Index vx_size ; - if(n == edge_vec_nvals) - { - GRB_TRY (GxB_Vector_unpack_Full ( - node_edges, (void **)&node_edges_arr, &vx_size, &iso, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - degrees, (void **)°_arr, &vi_size, &iso, NULL)) ; - } - else - { - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( - degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; - LG_TRY(LAGraph_Malloc( - (void **) °_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; - LG_TRY(LAGraph_Malloc( - (void **) &node_edges_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - NULL, deg_arr, &edge_vec_nvals, degrees - )) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - NULL, node_edges_arr, &edge_vec_nvals, node_edges - )) ; - vi_size = edge_vec_nvals * sizeof(int64_t); - vx_size = edge_vec_nvals * sizeof(int64_t); - } - GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; - LG_TRY (LAGraph_Malloc( - (void **) &ramp, edge_vec_nvals + 1, sizeof(int64_t), NULL)) ; - GRB_TRY (GrB_Matrix_new (&P, GrB_INT64, max_deg, edge_vec_nvals)) ; - GRB_TRY (GrB_Vector_assign_INT64( - ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - ramp, NULL, &edge_vec_nvals, ones_v)) ; - ramp[edge_vec_nvals] = edge_vec_nvals; - GRB_TRY (GxB_Matrix_pack_CSC( - P, (GrB_Index **)&ramp, (GrB_Index **)°_arr, - (void **) &node_edges_arr, (edge_vec_nvals + 1) * sizeof(int64_t), - vi_size, vx_size, false, false, NULL - )) ; - GRB_TRY (GrB_mxv( - edges_per_deg, NULL, NULL, GxB_PLUS_FIRST_INT64, P, ones_v, NULL)) ; - GRB_TRY (GrB_mxv( - verts_per_deg, NULL, NULL, GxB_PLUS_PAIR_INT64, P, ones_v, NULL)) ; - #else + #if USING_GRAPHBLAS_V10 if(n == edge_vec_nvals) { deg_x = degrees; @@ -299,8 +259,9 @@ int LAGraph_RichClubCoefficient } else { - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( - degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; + GRB_TRY (GrB_Vector_assign( + degrees, G->out_degree, NULL, degrees, GrB_ALL, 0, GrB_DESC_RS + )) ; GRB_TRY (GrB_Vector_new(°_x, GrB_BOOL, 0)) ; GRB_TRY (GrB_Vector_new(&node_edges_x, GrB_BOOL, 0)) ; GRB_TRY (GxB_Vector_extractTuples_Vector( @@ -318,7 +279,7 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_apply ( ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( - edges_per_deg, NULL, GrB_PLUS_INT64, deg_x, node_edges_x, ramp_v, + edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, GxB_PLUS_SECOND_INT64, NULL, msg )) ; GRB_TRY (GrB_Vector_assign_INT64( @@ -327,7 +288,6 @@ int LAGraph_RichClubCoefficient verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, GxB_PLUS_PAIR_INT64, NULL, msg )) ; - #endif #else GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; diff --git a/experimental/algorithm/LG_CC_FastSV7_FA.c b/experimental/algorithm/LG_CC_FastSV7_FA.c index 095e47b6be..c5c84ac2b3 100644 --- a/experimental/algorithm/LG_CC_FastSV7_FA.c +++ b/experimental/algorithm/LG_CC_FastSV7_FA.c @@ -60,14 +60,6 @@ double timings [16] ; -#define USING_GRAPHBLAS_V10 0 -#if LAGRAPH_SUITESPARSE - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - #undef USING_GRAPHBLAS_V10 - #define USING_GRAPHBLAS_V10 1 - #endif -#endif - #if USING_GRAPHBLAS_V10 //============================================================================== diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 9280c60c0e..bdbfad55a5 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -59,7 +59,7 @@ #include "LG_internal.h" #include "LAGraphX.h" -#if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) +#if USING_GRAPHBLAS_V10 #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ @@ -260,6 +260,7 @@ int LAGraph_FastAssign_Semiring // Load P and do the mxv //---------------------------------------------------------------------- GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); + GRB_TRY (GxB_fprint(P, GxB_SHORT, stdout)); GRB_TRY (GrB_mxv(c, mask, accum, dup, P, X_vec, desc)); //---------------------------------------------------------------------- // Free work. diff --git a/src/utility/LG_internal.h b/src/utility/LG_internal.h index c4d0df2351..362e1996b3 100644 --- a/src/utility/LG_internal.h +++ b/src/utility/LG_internal.h @@ -239,6 +239,12 @@ typedef unsigned char LG_void ; // code development settings //------------------------------------------------------------------------------ +#if LAGRAPH_SUITESPARSE && GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + #define USING_GRAPHBLAS_V10 1 +#else + #define USING_GRAPHBLAS_V10 0 +#endif + // turn off debugging; do not edit these three lines #ifndef NDEBUG #define NDEBUG From 90602ae69a3499ad30fe2c61a026ee68f6c5b631 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 1 Apr 2025 19:20:14 -0500 Subject: [PATCH 090/115] Renamed variables and changed output of RCC --- .../algorithm/LAGraph_RichClubCoefficient.c | 122 +++++++++++------- experimental/test/test_RichClubCoefficient.c | 5 +- experimental/utility/LAGraph_FastAssign.c | 2 +- 3 files changed, 76 insertions(+), 53 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 449e74d6a0..293ca9e83a 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -61,7 +61,7 @@ /* free any workspace used here */ \ LG_FREE_WORK ; \ /* free all the output variable(s) */ \ - GrB_free (rich_club_coefficents) ; \ + GrB_free (rccs) ; \ } #include "LG_internal.h" @@ -91,8 +91,8 @@ void rich_club_formula(double *z, const int64_t *x, const int64_t *y) int LAGraph_RichClubCoefficient ( // output: - //rich_club_coefficents(i): rich club coefficent of i - GrB_Vector *rich_club_coefficents, + //rccs(i): rich club coefficent of i + GrB_Vector *rccs, // input: LAGraph_Graph G, //input graph @@ -159,9 +159,11 @@ int LAGraph_RichClubCoefficient void *array_space = NULL; int64_t *node_edges_arr = NULL, *deg_arr = NULL, - *edges_per_deg_arr = NULL, *ones = NULL, - *deg_vertex_count = NULL; - + *epd_arr = NULL, *ones = NULL, + *vpd_arr = NULL; + GrB_Type epd_type = NULL, vpd_type = NULL; + int64_t epd_n = 0, vpd_n = 0, epd_size = 0, vpd_size = 0; + int epd_h = 0, vpd_h = 0; GrB_Index *epd_index = NULL, *vpd_index = NULL; int64_t *ramp = NULL; @@ -169,7 +171,7 @@ int LAGraph_RichClubCoefficient // Check inputs //-------------------------------------------------------------------------- LG_TRY (LAGraph_CheckGraph (G, msg)) ; - LG_ASSERT (rich_club_coefficents != NULL, GrB_NULL_POINTER); + LG_ASSERT (rccs != NULL, GrB_NULL_POINTER); LG_ASSERT_MSG( G->kind == LAGraph_ADJACENCY_UNDIRECTED, GrB_INVALID_VALUE, @@ -211,7 +213,7 @@ int LAGraph_RichClubCoefficient &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; GRB_TRY (GrB_Vector_new(&edges_per_deg, GrB_INT64, max_deg)) ; GRB_TRY (GrB_Vector_new(&verts_per_deg, GrB_INT64, max_deg)) ; - GRB_TRY (GrB_Vector_new(rich_club_coefficents, GrB_FP64, max_deg)) ; + GRB_TRY (GrB_Vector_new(rccs, GrB_FP64, max_deg)) ; //-------------------------------------------------------------------------- // Calculations @@ -226,10 +228,6 @@ int LAGraph_RichClubCoefficient degrees, NULL, GrB_PLUS_INT64, G->out_degree, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Matrix_diag(&D, degrees, 0)) ; - // Fill out node_edges Vector - GRB_TRY (GrB_Vector_assign_INT64( - node_edges, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; - // Each edge in the graph gets the value of the degree of its row node #if LAGRAPH_SUITESPARSE GRB_TRY (GrB_mxm( @@ -241,9 +239,6 @@ int LAGraph_RichClubCoefficient // Sum the number of edges each node is "responsible" for. GRB_TRY (GrB_mxv( node_edges, NULL, GrB_PLUS_INT64, plus_2le, A_deg, degrees, NULL)) ; - // Recover sparcity structure. - GRB_TRY (GrB_Vector_assign( - node_edges, G->out_degree, NULL, node_edges, GrB_ALL, 0, GrB_DESC_RS)) ; // The rest of this is indexing the number of edges and number of nodes at // each degree and then doing a cummulative sum to know the amount of edges @@ -274,20 +269,47 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, node_edges_x)) GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; + GRB_TRY (GrB_Vector_assign_INT64( ramp_v, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign_INT64( + edges_per_deg, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign_INT64( + verts_per_deg, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign_INT64( + ones_v, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply ( ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; LG_TRY (LAGraph_FastAssign ( - edges_per_deg, NULL, NULL, deg_x, node_edges_x, ramp_v, + edges_per_deg, NULL, GrB_PLUS_INT64, deg_x, node_edges_x, ramp_v, GxB_PLUS_SECOND_INT64, NULL, msg )) ; - GRB_TRY (GrB_Vector_assign_INT64( - ones_v, NULL, NULL, (int64_t) 1, GrB_ALL, 0, NULL)) ; - GRB_TRY (LAGraph_FastAssign ( - verts_per_deg, NULL, NULL, deg_x, ones_v, ramp_v, + LG_TRY (LAGraph_FastAssign ( + verts_per_deg, NULL, GrB_PLUS_INT64, deg_x, ones_v, ramp_v, GxB_PLUS_PAIR_INT64, NULL, msg )) ; + + GRB_TRY (GxB_Vector_unload( + edges_per_deg, (void **) &epd_arr, &epd_type, + &epd_n, &epd_size, &epd_h, NULL)) ; + GRB_TRY (GxB_Vector_unload( + verts_per_deg, (void **) &vpd_arr, &vpd_type, + &vpd_n, &vpd_size, &vpd_h, NULL)) ; + + LG_ASSERT (max_deg == vpd_n && max_deg == epd_n, GrB_INVALID_VALUE) ; + //run a cummulative sum (backwards) on vpd_arr + for(GrB_Index i = max_deg - 1; i > 0; --i) + { + vpd_arr[i-1] += vpd_arr[i] ; + epd_arr[i-1] += epd_arr[i] ; + } + GRB_TRY(GxB_Vector_load( + edges_per_deg, (void **) &epd_arr, epd_type, + epd_n, epd_size, epd_h, NULL)) ; + GRB_TRY(GxB_Vector_load( + verts_per_deg, (void **) &vpd_arr, vpd_type, + vpd_n, vpd_size, vpd_h, NULL)) ; #else GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; @@ -313,6 +335,35 @@ int LAGraph_RichClubCoefficient } GRB_TRY (GrB_Vector_build_INT64 ( verts_per_deg, deg_arr, ones, edge_vec_nvals, GrB_PLUS_INT64)) ; + + // TODO: FIX THIS (return a ful vector) + GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, edges_per_deg)) ; + LG_TRY (LAGraph_Malloc( + &array_space, edge_vec_nvals * 4, sizeof(int64_t), NULL)) ; + epd_index = array_space ; + epd_arr = array_space + edge_vec_nvals * sizeof(int64_t) ; + vpd_index = array_space + 2 * edge_vec_nvals * sizeof(int64_t) ; + vpd_arr = array_space + 3 * edge_vec_nvals * sizeof(int64_t) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + epd_index, epd_arr, &edge_vec_nvals, edges_per_deg + )) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + vpd_index, vpd_arr, &edge_vec_nvals, verts_per_deg + )) ; + //run a cummulative sum (backwards) on vpd_arr + for(GrB_Index i = edge_vec_nvals - 1; i > 0; --i) + { + vpd_arr[i-1] += vpd_arr[i] ; + epd_arr[i-1] += epd_arr[i] ; + } + GRB_TRY (GrB_Vector_clear(edges_per_deg)) ; + GRB_TRY (GrB_Vector_clear(verts_per_deg)) ; + GRB_TRY (GrB_Vector_build_INT64( + edges_per_deg, epd_index, epd_arr, edge_vec_nvals, NULL + )) ; + GRB_TRY (GrB_Vector_build_INT64( + verts_per_deg, vpd_index, vpd_arr, edge_vec_nvals, NULL + )) ; #endif /** @@ -331,37 +382,10 @@ int LAGraph_RichClubCoefficient * * If plus biop is not a monoid, this method should still work? */ - GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, edges_per_deg)) ; - LG_TRY (LAGraph_Malloc( - &array_space, edge_vec_nvals * 4, sizeof(int64_t), NULL)) ; - epd_index = array_space ; - edges_per_deg_arr = array_space + edge_vec_nvals * sizeof(int64_t) ; - vpd_index = array_space + 2 * edge_vec_nvals * sizeof(int64_t) ; - deg_vertex_count = array_space + 3 * edge_vec_nvals * sizeof(int64_t) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - epd_index, edges_per_deg_arr, &edge_vec_nvals, edges_per_deg - )) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - vpd_index, deg_vertex_count, &edge_vec_nvals, verts_per_deg - )) ; - //run a cummulative sum (backwards) on deg_vertex_count - for(GrB_Index i = edge_vec_nvals - 1; i > 0; --i) - { - deg_vertex_count[i-1] += deg_vertex_count[i] ; - edges_per_deg_arr[i-1] += edges_per_deg_arr[i] ; - } - GRB_TRY (GrB_Vector_clear(edges_per_deg)) ; - GRB_TRY (GrB_Vector_clear(verts_per_deg)) ; - GRB_TRY (GrB_Vector_build_INT64( - edges_per_deg, epd_index, edges_per_deg_arr, edge_vec_nvals, NULL - )) ; - GRB_TRY (GrB_Vector_build_INT64( - verts_per_deg, vpd_index, deg_vertex_count, edge_vec_nvals, NULL - )) ; - + //Computes the RCC of a matrix GRB_TRY(GrB_eWiseMult( - *rich_club_coefficents, NULL, NULL, rcCalculation, + *rccs, NULL, NULL, rcCalculation, edges_per_deg, verts_per_deg, NULL )) ; diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 9a9f3f2daa..33190654e4 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -265,9 +265,8 @@ void test_rcc_brutal (void) double comp_val = 0; for(int64_t i = n_ans - 1; i >= 0; --i) { - GrB_Vector_extractElement(&comp_val, rcc, i) ; - TEST_CHECK ( - comp_val - ans[i] <= 1e-10 && ans[i] - comp_val <= 1e-10) ; + OK (GrB_Vector_extractElement(&comp_val, rcc, i)) ; + TEST_CHECK (fabs(comp_val - ans[i]) <= 1e-15) ; } OK (GrB_free (&rcc)) ; OK (LAGraph_Delete (&G, msg)) ; diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index bdbfad55a5..75c89073f0 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -260,7 +260,7 @@ int LAGraph_FastAssign_Semiring // Load P and do the mxv //---------------------------------------------------------------------- GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); - GRB_TRY (GxB_fprint(P, GxB_SHORT, stdout)); + // GRB_TRY (GxB_fprint(P, GxB_SHORT, stdout)); GRB_TRY (GrB_mxv(c, mask, accum, dup, P, X_vec, desc)); //---------------------------------------------------------------------- // Free work. From a7a119a992e357f97290703b72f0ea504314b1cb Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 1 Apr 2025 23:02:45 -0500 Subject: [PATCH 091/115] intial Swap Edges int 32 support --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 313 +++++++++++++------ 1 file changed, 220 insertions(+), 93 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 2c5dccf1b6..1267b6b423 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -25,7 +25,6 @@ GrB_free (&M) ; \ GrB_free(&dup_swaps_v); \ GrB_free(&new_hashed_edges); \ - GrB_free(&hashed_edges); \ GrB_free(&edge_perm) ; \ } @@ -34,6 +33,8 @@ /* free any workspace used here */ \ GrB_free (&E) ; \ GrB_free (&A_tril) ; \ + GrB_free (&Ai) ; \ + GrB_free (&Aj) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ GrB_free (&ramp_v) ; \ @@ -53,8 +54,8 @@ GrB_free (&lg_shiftland) ; \ GrB_free (&lg_edge) ; \ GrB_free (&lg_swap) ; \ + GrB_free (&hashed_edges) ; \ GrB_free (&con) ; \ - GrB_free (&E_con) ; \ GrB_free (&one8) ; \ GrB_free (&x) ; \ LAGraph_Free((void**)&indices, msg) ; \ @@ -91,8 +92,8 @@ void shift_and typedef struct { uint64_t a; uint64_t b; -} edge_type; -#define EDGE_TYPE \ +} edge_type64; +#define EDGE_TYPE64 \ "typedef struct { uint64_t a; uint64_t b; } edge_type;" typedef struct { @@ -100,14 +101,32 @@ typedef struct { uint64_t b; uint64_t c; uint64_t d; -} swap_type; -#define SWAP_TYPE \ +} swap_type64; +#define SWAP_TYPE64 \ "typedef struct { \n"\ -" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n" \ +" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n"\ "}swap_type;" -void swap_bc -(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) +typedef struct { + uint32_t a; + uint32_t b; +} edge_type32; +#define EDGE_TYPE32 \ +"typedef struct { uint32_t a; uint32_t b; } edge_type;" + +typedef struct { + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; +} swap_type32; +#define SWAP_TYPE32 \ +"typedef struct { \n"\ +" uint32_t a; uint32_t b; uint32_t c; uint32_t d; \n"\ +"}swap_type;" + +void swap_bc64 +(swap_type64 *z, const swap_type64 *x, GrB_Index I, GrB_Index J, const bool *y) { memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; @@ -124,7 +143,25 @@ void swap_bc z->b = temp; } } -#define SWAP_BC \ +void swap_bc32 +(swap_type32 *z, const swap_type32 *x, GrB_Index I, GrB_Index J, const bool *y) +{ + memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. + if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; + if(I & 1) + { + uint32_t temp = z->d; + z->d = z->b; + z->b = temp; + } + else + { + uint32_t temp = z->c; + z->c = z->b; + z->b = temp; + } +} +#define SWAP_BC64 \ "void swap_bc \n"\ "(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ @@ -143,23 +180,67 @@ void swap_bc " z->b = temp; \n"\ " } \n"\ "}" +#define SWAP_BC32 \ +"void swap_bc \n"\ +"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"{ \n"\ +" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. \n"\ +" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ +" if(I & 1) \n"\ +" { \n"\ +" uint32_t temp = z->d; \n"\ +" z->d = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +" else \n"\ +" { \n"\ +" uint32_t temp = z->c; \n"\ +" z->c = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +"}" - -//Simply making a cantor pairing then masking. -void hash_edge -(uint64_t *z, const edge_type *x, const uint64_t *mask) +// using xorshift, from https://en.wikipedia.org/wiki/Xorshift +// with a state of uint64_t, or xorshift64star. +void hash_edge64 +(uint64_t *z, const edge_type64 *x, const uint64_t *mask) +{ + (*z) = x->a ^ x->b; + (*z) ^= (*z) << 13; + (*z) ^= (*z) >> 7; + (*z) ^= (*z) << 17; + (*z) ^= (x->a < x->b)? x->a: x->b; + (*z) ^= (*z) << 13; + (*z) ^= (*z) >> 7; + (*z) ^= (*z) << 17; + (*z) &= (*mask); +} +void hash_edge32 +(uint64_t *z, const edge_type32 *x, const uint64_t *mask) { - (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; - (*z) += (x->a < x->b)? x->a: x->b; + (*z) = x->a ^ x->b; + (*z) ^= (*z) << 13; + (*z) ^= (*z) >> 7; + (*z) ^= (*z) << 17; + (*z) ^= (x->a < x->b)? x->a: x->b; + (*z) ^= (*z) << 13; + (*z) ^= (*z) >> 7; + (*z) ^= (*z) << 17; (*z) &= (*mask); } #define HASH_EDGE \ "void hash_edge \n"\ "(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ "{ \n"\ -" (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; \n"\ -" (*z) += (x->a < x->b)? x->a: x->b; \n"\ -" (*z) &= (*mask); \n"\ +" (*z) = x->a ^ x->b; \n"\ +" (*z) ^= (*z) << 13; \n"\ +" (*z) ^= (*z) >> 7; \n"\ +" (*z) ^= (*z) << 17; \n"\ +" (*z) ^= (x->a < x->b)? x->a: x->b; \n"\ +" (*z) ^= (*z) << 13; \n"\ +" (*z) ^= (*z) >> 7; \n"\ +" (*z) ^= (*z) << 17; \n"\ +" (*z) &= (*mask); \n"\ "}" void add_term @@ -173,14 +254,20 @@ void add_term "{ \n"\ " (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; \n"\ "}" -void edge2 - (edge_type *z, const void *x, const edge_type *y) + +void edge2nd64 + (edge_type64 *z, const void *x, const edge_type64 *y) +{ + z->a = y->a; + z->b = y->b; +} +void edge2nd32 + (edge_type32 *z, const void *x, const edge_type32 *y) { - //if(y->a == 0 && y->b == 0) return; z->a = y->a; z->b = y->b; } -#define EDGE2 \ +#define EDGE2ND \ "void edge2 \n"\ "(edge_type *z, const void *x, const edge_type *y) \n"\ "{ \n"\ @@ -203,12 +290,12 @@ int LAGraph_SwapEdgesV2 // Declorations //-------------------------------------------------------------------------- GrB_Matrix A = NULL; // n x n Adjacency Matrix + GrB_Vector Ai = NULL, Aj = NULL; // e x 2 with entries corresponding to verticies of an edge GrB_Matrix E = NULL; // e x 1 vector, each entry is an edge. GrB_Vector E_vec = NULL, E_temp = NULL; - GxB_Container E_con = NULL; // swaps x 4 // Each row contains 4 entries corresponding to the verticies @@ -227,7 +314,7 @@ int LAGraph_SwapEdgesV2 GrB_Vector random_v = NULL, r_permute = NULL; // indicies for A - GrB_Index *indices = NULL; + void *indices = NULL; GrB_Vector ramp_v = NULL; @@ -272,7 +359,7 @@ int LAGraph_SwapEdgesV2 // Toople types GrB_Type lg_edge = NULL, lg_swap = NULL; // Unload types - GrB_Type M_type = NULL, E_type = NULL; + GrB_Type M_type = NULL, E_type = NULL, Ai_type = NULL; int M_hand = 0, E_hand = 0; int16_t *dup_swaps = NULL; @@ -309,57 +396,89 @@ int LAGraph_SwapEdgesV2 // Initializations //-------------------------------------------------------------------------- A = G->A ; - // Types - GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; - GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; - + GRB_TRY (GrB_Vector_new(&Ai, GrB_BOOL, 0)) ; + GRB_TRY (GrB_Vector_new(&Aj, GrB_BOOL, 0)) ; // Extract lower triangular edges. GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; + GxB_fprint(A_tril, GxB_SHORT, stdout) ; + GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; + GRB_TRY (GxB_Vector_type(&Ai_type, Ai)); + int code; + GrB_get(Ai_type, &code, GrB_EL_TYPE_CODE); GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - - GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; - GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; - + + //Init Operators ----------------------------------------------------------- + if(code == GrB_UINT32_CODE) + { + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type32), "edge_type", EDGE_TYPE32)) ; + GRB_TRY (GxB_Type_new( + &lg_swap, sizeof(swap_type32), "swap_type", SWAP_TYPE32)) ; + GRB_TRY(GxB_BinaryOp_new( + &hash_seed_e, (GxB_binary_function) (&hash_edge32), + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_pair, (GxB_index_unary_function) (&swap_bc32), + lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC32 + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_edge, (GxB_binary_function) (&edge2nd32), + lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_bool_edge, (GxB_binary_function) (&edge2nd32), + lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND + )) ; + } + else + { + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type64), "edge_type", EDGE_TYPE64)) ; + GRB_TRY (GxB_Type_new( + &lg_swap, sizeof(swap_type64), "swap_type", SWAP_TYPE64)) ; + GRB_TRY(GxB_BinaryOp_new( + &hash_seed_e, (GxB_binary_function) (&hash_edge64), + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_pair, (GxB_index_unary_function) (&swap_bc64), + lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC64 + )) ; + GRB_TRY(GxB_BinaryOp_new( + &add_term_biop, (GxB_binary_function) (&add_term), + GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_edge, (GxB_binary_function) (&edge2nd64), + lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_bool_edge, (GxB_binary_function) (&edge2nd64), + lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND + )) ; + } + GRB_TRY (GxB_UnaryOp_new ( &lg_shiftland, (GxB_unary_function) (&shift_and), GrB_UINT16, GrB_UINT16, "shift_and", SHIFT_AND )) ; - GRB_TRY(GxB_BinaryOp_new( - &hash_seed_e, (GxB_binary_function) (&hash_edge), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE - )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_pair, (GxB_index_unary_function) (&swap_bc), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC - )) ; GRB_TRY(GxB_BinaryOp_new( &add_term_biop, (GxB_binary_function) (&add_term), GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM )) ; - GRB_TRY(GxB_BinaryOp_new( - &second_edge, (GxB_binary_function) (&edge2), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2 - )) ; - GRB_TRY(GxB_BinaryOp_new( - &second_bool_edge, (GxB_binary_function) (&edge2), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2 - )) ; GRB_TRY (GxB_Monoid_terminal_new_INT8( &add_term_monoid, add_term_biop, (int8_t) 0, (int8_t) 2 )) ; - // This isn't actually a monoid but since it's never applied as one it - // shouldn't be a problem? FORESHADOWING - edge_type iden_second = {0,0}; + edge_type64 iden_second = {0,0}; GRB_TRY (GrB_Monoid_new_UDT( &second_edge_monoid, second_edge, (void *) &iden_second )) ; @@ -375,39 +494,47 @@ int LAGraph_SwapEdgesV2 GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; // Make E Matrix ----------------------------------------------------------- - LG_TRY (LAGraph_Malloc ( - (void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; - GRB_TRY ( - GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) - ) ; - ind_size = 2ull * e * sizeof(GrB_Index); - GRB_TRY (GxB_Container_new(&E_con)) ; - GRB_TRY (GxB_Vector_load( - E_con->x, (void **) &indices, GrB_INT64, e * 2, - ind_size, GrB_DEFAULT, NULL - )); - E_con->nrows_nonempty = E_con->nrows = e; - E_con->nvals = e * 2; - E_con->ncols_nonempty = E_con->ncols = 2; - E_con->iso = false; - E_con->jumbled = false; - E_con->format = GxB_FULL; - E_con->orientation = GrB_COLMAJOR; - GRB_TRY (GxB_load_Matrix_from_Container(E, E_con, NULL)); - GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; - GRB_TRY (GxB_unload_Matrix_into_Container(E, E_con, NULL)); + GRB_TRY (GrB_Matrix_new(&E, Ai_type, e, 2)) ; + GRB_TRY (GrB_Vector_new(&E_vec, Ai_type, 2 * e)) ; + // LG_TRY (LAGraph_Malloc ( + // (void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; + // GRB_TRY ( + // GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) + // ) ; + // ind_size = 2ull * e * sizeof(GrB_Index); + + // Shuffle i and j into E_vec. + // Filling out E_vec helps assign be much quicker. + + GRB_TRY (GrB_assign( + E_vec, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)); + GrB_Index stride[] = {(GrB_Index) 0, e * 2 - 1, (GrB_Index) 2} ; + int ret = GrB_Vector_assign( + E_vec, NULL, NULL, Aj, stride, GxB_STRIDE, NULL); + printf("%d!!!\n", ret); + GRB_TRY (ret) ; + stride[GxB_BEGIN] = 1; + GRB_TRY (GrB_Vector_assign( + E_vec, NULL, NULL, Ai, stride, GxB_STRIDE, NULL)) ; + + GxB_fprint(E_vec, GxB_SHORT, stdout); + GxB_fprint(lg_edge, GxB_SHORT, stdout); GRB_TRY (GxB_Vector_unload( - E_con->x, (void **) &indices, &E_type, &e, &ind_size, &E_hand, NULL)); + E_vec, &indices, &E_type, &e, &ind_size, &E_hand, NULL)); e /= 2; - GRB_TRY (GxB_Vector_load( - E_vec, (void **) &indices, lg_edge, e, ind_size, E_hand, NULL)); + ret = GxB_Vector_load( + E_vec, &indices, lg_edge, e, ind_size, E_hand, NULL); + printf("%d!!!\n", ret); + + GRB_TRY (ret); // Find Hash Size ---------------------------------------------------------- int shift_e = __builtin_clzl(e); uint64_t ehash_size = (1ull << (67-shift_e)) ; printf("Hash Size: %ld", ehash_size); GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; - + GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; + // Init Ramps -------------------------------------------------------------- GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; @@ -488,16 +615,15 @@ int LAGraph_SwapEdgesV2 // Hash Edges ---------------------------------------------------------- GRB_TRY (GrB_Vector_new( &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( new_hashed_edges, NULL, NULL, hash_seed_e, M, ehash_size - 1ll, NULL - )) ;//0xFB21C651E98DF25ULL + )) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hashed_edges, NULL, NULL, hash_seed_e, E_vec, ehash_size - 1ll, NULL - )) ; + )) ; //---------------------------------------------------------------------- // Build Hash Buckets @@ -614,25 +740,26 @@ int LAGraph_SwapEdgesV2 swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; LG_TRY (LAGraph_Random_Next(random_v, msg)) ; - printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop) ; + printf("#####Made %ld swaps. Total %ld out of %ld."\ + "Attempting %ld swaps next.#####\n\n", + n_keep, num_swaps, e * Q, swaps_per_loop) ; } GRB_TRY (GxB_Vector_unload( E_vec, (void **) &indices, &lg_edge, &e, &ind_size, &E_hand, NULL)); GRB_TRY (GxB_Vector_load( - E_con->x, (void **) &indices, E_type, e * 2, ind_size, E_hand, NULL)); - GRB_TRY (GxB_load_Matrix_from_Container(E,E_con, NULL)) ; - GRB_TRY (GrB_set(E, GrB_COLMAJOR, GrB_STORAGE_ORIENTATION_HINT)) ; - GRB_TRY (GxB_unload_Matrix_into_Container(E,E_con, NULL)) ; - GRB_TRY (GxB_Vector_unload( - E_con->x, (void **) &indices, &E_type, &e, &ind_size, &E_hand, NULL)); - e /= 2; - + E_vec, (void **) &indices, E_type, e * 2, ind_size, E_hand, NULL)); + GRB_TRY (GrB_Vector_extract( + Aj, NULL, NULL, E_vec, stride, GxB_STRIDE, NULL)); + stride[GxB_BEGIN] = 0; + GRB_TRY (GrB_Vector_extract( + Ai, NULL, NULL, E_vec, stride, GxB_STRIDE, NULL)); // Build Output Matrix GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; - GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)) ; + GRB_TRY (GxB_Matrix_build_Scalar_Vector(*A_new, Ai, Aj, one8, NULL)) ; GRB_TRY (GrB_eWiseAdd( *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 )) ; + LG_FREE_WORK ; return (GrB_SUCCESS) ; } From 1d124fd7194d6bf86f54dbd1153c7bbb99a3dab1 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 1 Apr 2025 23:31:21 -0500 Subject: [PATCH 092/115] removed debug statements --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 31 +++++--------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 090ee470ee..6d0765e3ba 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -208,10 +208,7 @@ void hash_edge64 (*z) = x->a ^ x->b; (*z) ^= (*z) << 13; (*z) ^= (*z) >> 7; - (*z) ^= (*z) << 17; (*z) ^= (x->a < x->b)? x->a: x->b; - (*z) ^= (*z) << 13; - (*z) ^= (*z) >> 7; (*z) ^= (*z) << 17; (*z) &= (*mask); } @@ -221,10 +218,7 @@ void hash_edge32 (*z) = x->a ^ x->b; (*z) ^= (*z) << 13; (*z) ^= (*z) >> 7; - (*z) ^= (*z) << 17; - (*z) ^= (x->a < x->b)? x->a: x->b; - (*z) ^= (*z) << 13; - (*z) ^= (*z) >> 7; + (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); (*z) ^= (*z) << 17; (*z) &= (*mask); } @@ -235,10 +229,7 @@ void hash_edge32 " (*z) = x->a ^ x->b; \n"\ " (*z) ^= (*z) << 13; \n"\ " (*z) ^= (*z) >> 7; \n"\ -" (*z) ^= (*z) << 17; \n"\ -" (*z) ^= (x->a < x->b)? x->a: x->b; \n"\ -" (*z) ^= (*z) << 13; \n"\ -" (*z) ^= (*z) >> 7; \n"\ +" (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); \n"\ " (*z) ^= (*z) << 17; \n"\ " (*z) &= (*mask); \n"\ "}" @@ -404,7 +395,6 @@ int LAGraph_SwapEdgesV2 // Extract lower triangular edges. GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; - GxB_fprint(A_tril, GxB_SHORT, stdout) ; GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; GRB_TRY (GxB_Vector_type(&Ai_type, Ai)); int code; @@ -509,10 +499,8 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_assign( E_vec, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)); GrB_Index stride[] = {(GrB_Index) 0, e * 2 - 1, (GrB_Index) 2} ; - int ret = GrB_Vector_assign( - E_vec, NULL, NULL, Aj, stride, GxB_STRIDE, NULL); - printf("%d!!!\n", ret); - GRB_TRY (ret) ; + GRB_TRY (GrB_Vector_assign( + E_vec, NULL, NULL, Aj, stride, GxB_STRIDE, NULL)) ; stride[GxB_BEGIN] = 1; GRB_TRY (GrB_Vector_assign( E_vec, NULL, NULL, Ai, stride, GxB_STRIDE, NULL)) ; @@ -522,19 +510,16 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GxB_Vector_unload( E_vec, &indices, &E_type, &e, &ind_size, &E_hand, NULL)); e /= 2; - ret = GxB_Vector_load( - E_vec, &indices, lg_edge, e, ind_size, E_hand, NULL); - printf("%d!!!\n", ret); - - GRB_TRY (ret); + GRB_TRY (GxB_Vector_load( + E_vec, &indices, lg_edge, e, ind_size, E_hand, NULL)); // Find Hash Size ---------------------------------------------------------- int shift_e ; #if (!( defined ( __NVCC__) || defined ( __INTEL_CLANG_COMPILER) || \ - defined ( __INTEL_COMPILER) ) && defined ( _MSC_VER )) || 1 + defined ( __INTEL_COMPILER) ) && defined ( _MSC_VER )) // using the built-in Microsoft Windows compiler // use ceil, log2, etc - shift_e = 64 - (int) floor (log2 ((double) e)) ; + shift_e = 63 - (int) floor (log2 ((double) e)) ; #else shift_e = __builtin_clzl(e); #endif From ab7164e984fdcf70a113e713d4e30d3ce2cbfb9f Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 2 Apr 2025 00:08:04 -0500 Subject: [PATCH 093/115] debug statements --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 6d0765e3ba..30cb639651 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -486,12 +486,6 @@ int LAGraph_SwapEdgesV2 // Make E Matrix ----------------------------------------------------------- GRB_TRY (GrB_Matrix_new(&E, Ai_type, e, 2)) ; GRB_TRY (GrB_Vector_new(&E_vec, Ai_type, 2 * e)) ; - // LG_TRY (LAGraph_Malloc ( - // (void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; - // GRB_TRY ( - // GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) - // ) ; - // ind_size = 2ull * e * sizeof(GrB_Index); // Shuffle i and j into E_vec. // Filling out E_vec helps assign be much quicker. @@ -505,8 +499,6 @@ int LAGraph_SwapEdgesV2 GRB_TRY (GrB_Vector_assign( E_vec, NULL, NULL, Ai, stride, GxB_STRIDE, NULL)) ; - GxB_fprint(E_vec, GxB_SHORT, stdout); - GxB_fprint(lg_edge, GxB_SHORT, stdout); GRB_TRY (GxB_Vector_unload( E_vec, &indices, &E_type, &e, &ind_size, &E_hand, NULL)); e /= 2; From b49af6e6ff44bc9fb7dcfa7cf87f32df183f2b7f Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 2 Apr 2025 14:48:56 -0500 Subject: [PATCH 094/115] merged RCC branch --- experimental/benchmark/FastAssign_demo.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index c3c9b0b1e9..9a53f6c028 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -93,12 +93,12 @@ int main (int argc, char **argv) rand_v, (void **)&rand_a, &r_size, &iso, NULL )) ; // Baseline: Build - t = LAGraph_WallClockTime ( ) ; - GRB_TRY (GxB_Vector_build_Scalar ( - build_v, rand_a, bool1, r_size)) ; - t = LAGraph_WallClockTime ( ) - t ; - printf ("Time for Build: %g sec\n", t) ; - t = LAGraph_WallClockTime ( ) ; + //t = LAGraph_WallClockTime ( ) ; + //GRB_TRY (GxB_Vector_build_Scalar ( + // build_v, rand_a, bool1, r_size)) ; + //t = LAGraph_WallClockTime ( ) - t ; + //printf ("Time for Build: %g sec\n", t) ; + //t = LAGraph_WallClockTime ( ) ; // Baseline: Single Threaded random access insert From 5e2724db12df71409bd84bf7f5288e16b1515ba7 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 2 Apr 2025 17:34:33 -0500 Subject: [PATCH 095/115] Added Build to FA demo --- experimental/benchmark/FastAssign_demo.c | 28 +++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index c3c9b0b1e9..835e80d15e 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -89,18 +89,19 @@ int main (int argc, char **argv) // try Methods of building a "set" //-------------------------------------------------------------------------- - GRB_TRY (GxB_Vector_unpack_Full ( - rand_v, (void **)&rand_a, &r_size, &iso, NULL - )) ; + // Baseline: Build t = LAGraph_WallClockTime ( ) ; - GRB_TRY (GxB_Vector_build_Scalar ( - build_v, rand_a, bool1, r_size)) ; + GRB_TRY (GxB_Vector_build_Scalar_Vector ( + build_v, rand_v, bool1, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for Build: %g sec\n", t) ; t = LAGraph_WallClockTime ( ) ; - + #if 0 + GRB_TRY (GxB_Vector_unpack_Full ( + rand_v, (void **)&rand_a, &r_size, &iso, NULL + )) ; // Baseline: Single Threaded random access insert LAGraph_Calloc((void **)&set_a, size_p2, sizeof(bool), msg); for(int64_t i = 0; i < size; ++i) @@ -110,21 +111,22 @@ int main (int argc, char **argv) t = LAGraph_WallClockTime ( ) - t ; GRB_TRY (GxB_Vector_pack_Full ( set_v, (void **)&set_a, 1ull << (64-shift_e), false, NULL + )) ; + GRB_TRY (GxB_Vector_pack_Full ( + rand_v, (void **)&rand_a, r_size, iso, NULL )) ; printf ("Time for Single Thread Unpack: %g sec\n", t) ; - + #endif // Baseline: GrB_assign t = LAGraph_WallClockTime ( ) ; - GRB_TRY (GrB_Vector_assign_BOOL( - assign_s, NULL, NULL, 1, rand_a, size, NULL)) ; + GRB_TRY (GxB_Vector_assign_Scalar_Vector( + assign_s, NULL, NULL, bool1, rand_v, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for GraphBLAS Assign: %g sec\n", t) ; - GRB_TRY (GxB_Vector_pack_Full ( - rand_v, (void **)&rand_a, r_size, iso, NULL - )) ; + #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) printf ("GraphBLAS version too low to test LAGraph_FastAssign\n") ; #else @@ -155,7 +157,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- printf ("\n===============================The result set vector:\n") ; - GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; + // GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; // GRB_TRY (GxB_fprint(assign_s, GxB_SHORT, stdout)) ; //-------------------------------------------------------------------------- // free everyting and finish From 26382a43df7ec45d4c63cca114aabbce45e3e730 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 2 Apr 2025 17:47:31 -0500 Subject: [PATCH 096/115] Turned off demo burble and fixed test --- experimental/benchmark/FastAssign_demo.c | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index 835e80d15e..38b9c71165 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -27,6 +27,7 @@ GrB_free (&build_v) ; \ GrB_free (&set_v) ; \ GrB_free (&assign_s) ; \ + GrB_free (&fa_s) ; \ GrB_free (&x) ; \ GrB_free (&bool1) ; \ LAGraph_Free ((void **)&rand_a, msg); \ @@ -41,10 +42,10 @@ int main (int argc, char **argv) char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph // start GraphBLAS and LAGraph - bool burble = true ; // set true for diagnostic outputs + bool burble = false ; // set true for diagnostic outputs demo_init (burble) ; - GrB_Vector rand_v = NULL, build_v = NULL, set_v = NULL, assign_s = NULL, - x = NULL; + GrB_Vector rand_v = NULL, build_v = NULL, set_v = NULL, assign_s = NULL, + fa_s = NULL, x = NULL; GrB_Index *rand_a = NULL; GrB_Scalar bool1 = NULL; bool *set_a = NULL; @@ -60,9 +61,10 @@ int main (int argc, char **argv) GrB_Index bit_mask = size_p2 - 1; GRB_TRY (GrB_Vector_new(&rand_v, GrB_UINT64, size)) ; GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, size)) ; - GRB_TRY (GrB_Vector_new(&build_v, GrB_UINT64, size_p2)) ; + GRB_TRY (GrB_Vector_new(&build_v, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Vector_new(&set_v, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Vector_new(&assign_s, GrB_BOOL, size_p2)) ; + GRB_TRY (GrB_Vector_new(&fa_s, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Scalar_new(&bool1, GrB_BOOL)); @@ -76,15 +78,13 @@ int main (int argc, char **argv) GRB_TRY (GrB_Scalar_setElement_BOOL(bool1, (bool) 1)); GRB_TRY(GrB_set (assign_s, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) + GRB_TRY(GrB_set (fa_s, GxB_BITMAP, GxB_SPARSITY_CONTROL) ;) LG_TRY (LAGraph_Random_Seed(rand_v, 1548945616ul, msg)) ; GRB_TRY (GrB_Vector_apply_BinaryOp1st_UINT64( rand_v, NULL, NULL, GrB_BAND_UINT64, bit_mask, rand_v, NULL)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time to create random vector: %g sec\n", t) ; - printf ("\n==========================The input vector:\n") ; - LG_TRY (LAGraph_Vector_Print (rand_v, LAGraph_SHORT, stdout, msg)) ; - //-------------------------------------------------------------------------- // try Methods of building a "set" //-------------------------------------------------------------------------- @@ -131,10 +131,9 @@ int main (int argc, char **argv) printf ("GraphBLAS version too low to test LAGraph_FastAssign\n") ; #else // FastAssign! - GRB_TRY (GrB_Vector_clear(assign_s)) ; t = LAGraph_WallClockTime ( ) ; LG_TRY (LAGraph_FastAssign( - assign_s, NULL, NULL, rand_v, x, NULL, GxB_ANY_BOOL_MONOID, NULL, msg + fa_s, NULL, NULL, rand_v, x, NULL, GxB_ANY_BOOL_MONOID, NULL, msg )); t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; @@ -143,11 +142,12 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- // check the results (Make sure that assign == build == FastAssign ) //-------------------------------------------------------------------------- - bool isEq = 0; - GRB_TRY (GrB_Vector_assign_BOOL( - assign_s, assign_s, NULL, 0, GrB_ALL, 0, GrB_DESC_SC)) ; - LG_TRY (LAGraph_Vector_IsEqual(&isEq, assign_s, set_v, msg)); - if(isEq) + bool flag = true, isEq = 0; + LG_TRY (LAGraph_Vector_IsEqual(&isEq, assign_s, fa_s, msg)); + flag &= isEq; + LG_TRY (LAGraph_Vector_IsEqual(&isEq, build_v, fa_s, msg)); + flag &= isEq; + if(flag) printf("TEST PASSED\n"); else printf("TEST FAILED\n"); @@ -156,7 +156,7 @@ int main (int argc, char **argv) // print the results //-------------------------------------------------------------------------- - printf ("\n===============================The result set vector:\n") ; + // printf ("\n===============================The result set vector:\n") ; // GRB_TRY (GxB_fprint(set_v, GxB_SHORT, stdout)) ; // GRB_TRY (GxB_fprint(assign_s, GxB_SHORT, stdout)) ; //-------------------------------------------------------------------------- From 614727bf7bd1aafc1910ef810fda75ba7e0f95f3 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 2 Apr 2025 18:09:34 -0500 Subject: [PATCH 097/115] Demo prebuilt ramp --- experimental/benchmark/FastAssign_demo.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index 38b9c71165..f3af13a966 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -30,6 +30,7 @@ GrB_free (&fa_s) ; \ GrB_free (&x) ; \ GrB_free (&bool1) ; \ + GrB_free (&ramp) ; \ LAGraph_Free ((void **)&rand_a, msg); \ } @@ -45,7 +46,7 @@ int main (int argc, char **argv) bool burble = false ; // set true for diagnostic outputs demo_init (burble) ; GrB_Vector rand_v = NULL, build_v = NULL, set_v = NULL, assign_s = NULL, - fa_s = NULL, x = NULL; + fa_s = NULL, x = NULL, ramp = NULL; GrB_Index *rand_a = NULL; GrB_Scalar bool1 = NULL; bool *set_a = NULL; @@ -67,9 +68,12 @@ int main (int argc, char **argv) GRB_TRY (GrB_Vector_new(&fa_s, GrB_BOOL, size_p2)) ; GRB_TRY (GrB_Scalar_new(&bool1, GrB_BOOL)); - - LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; - val_of_P[0] = 1; + GrB_Type ramp_type = (size + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; + GrB_IndexUnaryOp idxnum = (size + 1 <= INT32_MAX)? + GrB_ROWINDEX_INT32: GrB_ROWINDEX_INT64; + GRB_TRY (GrB_Vector_new(&ramp, ramp_type, size + 1)); + GRB_TRY (GrB_assign (ramp, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_apply (ramp, NULL, NULL, idxnum, ramp, 0, NULL)) ; GRB_TRY (GrB_Vector_assign_UINT64( rand_v, NULL, NULL, 0ull, GrB_ALL, 0, NULL)) ; @@ -94,6 +98,7 @@ int main (int argc, char **argv) t = LAGraph_WallClockTime ( ) ; GRB_TRY (GxB_Vector_build_Scalar_Vector ( build_v, rand_v, bool1, NULL)) ; + GRB_TRY (GrB_wait(build_v, GrB_MATERIALIZE)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for Build: %g sec\n", t) ; t = LAGraph_WallClockTime ( ) ; @@ -133,7 +138,7 @@ int main (int argc, char **argv) // FastAssign! t = LAGraph_WallClockTime ( ) ; LG_TRY (LAGraph_FastAssign( - fa_s, NULL, NULL, rand_v, x, NULL, GxB_ANY_BOOL_MONOID, NULL, msg + fa_s, NULL, NULL, rand_v, x, ramp, GxB_ANY_BOOL_MONOID, NULL, msg )); t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; From c6b4dd9337c0b87472842ecfb1a33fae44529dc5 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 8 Apr 2025 16:26:53 -0500 Subject: [PATCH 098/115] Added single threaded non-GB RCC algo --- .../algorithm/LAGraph_RichClubCoefficient.c | 170 +++++++++++++++++- experimental/benchmark/rcc_demo.c | 35 +++- include/LAGraphX.h | 9 + 3 files changed, 207 insertions(+), 7 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 293ca9e83a..8710f91aac 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -391,4 +391,172 @@ int LAGraph_RichClubCoefficient LG_FREE_WORK ; return (GrB_SUCCESS) ; -} \ No newline at end of file +} +#undef LG_FREE_WORK +#undef LG_FREE_ALL +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + LAGraph_Free(&array_space, NULL) ; \ + GrB_free (&cont) ; \ +} + + +#define LG_FREE_ALL \ +{ \ + /* free any workspace used here */ \ + LG_FREE_WORK ; \ + /* free all the output variable(s) */ \ + LAGraph_Free(&Ap, NULL) ; \ + LAGraph_Free(&Ai, NULL) ; \ + LAGraph_Free((void **)&rcc, NULL) ; \ + GrB_free (rccs) ; \ +} + +#if USING_GRAPHBLAS_V10 +int LAGraph_RichClubCoefficient_SingleThreaded +( + // output: + //rccs(i): rich club coefficent of i + GrB_Vector *rccs, + + // input: + LAGraph_Graph G, //input graph + char *msg +) +{ + GxB_Container cont = NULL; + GrB_Matrix A = G->A; + void *Ap = NULL, *Ai = NULL, *array_space = NULL; + GrB_Type p_type = NULL, i_type = NULL; + int p_hand = 0, i_hand = 0; + uint64_t p_n = 0, i_n = 0, p_size = 0, i_size = 0, max_deg = 0; + uint64_t *epd = NULL, *vpd = NULL; + double *rcc = NULL; + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + LG_TRY (LAGraph_CheckGraph (G, msg)) ; + LG_ASSERT (rccs != NULL, GrB_NULL_POINTER); + + LG_ASSERT_MSG( + G->kind == LAGraph_ADJACENCY_UNDIRECTED, GrB_INVALID_VALUE, + "G->A must be symmetric") ; + LG_ASSERT_MSG( + G->is_symmetric_structure == LAGraph_TRUE, GrB_INVALID_VALUE, + "G->A must be symmetric") ; + LG_ASSERT_MSG (G->out_degree != NULL, GrB_EMPTY_OBJECT, + "G->out_degree must be defined") ; + LG_ASSERT_MSG (G->nself_edges == 0, GrB_INVALID_VALUE, + "G->nself_edges must be zero") ; + GRB_TRY(GxB_Container_new(&cont)) ; + GRB_TRY(GxB_unload_Matrix_into_Container(A, cont, NULL)) ; + LG_ASSERT_MSG(cont->format == GxB_SPARSE, GrB_NOT_IMPLEMENTED, + "Matrix must be sparse") ; + GRB_TRY(GxB_Vector_unload( + cont->p, &Ap, &p_type, &p_n, &p_size, &p_hand, NULL)) ; + GRB_TRY(GxB_Vector_unload( + cont->i, &Ai, &i_type, &i_n, &i_size, &i_hand, NULL)) ; + GRB_TRY (GrB_Vector_reduce_INT64( + &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; + + bool i32 = i_type == GrB_INT32 || i_type == GrB_UINT32; + bool p32 = p_type == GrB_INT32 || p_type == GrB_UINT32; + uint64_t ptr = 0, i = 0; + + LG_TRY (LAGraph_Calloc(&array_space, max_deg * 2, sizeof(uint64_t), NULL)) ; + epd = array_space ; + vpd = array_space + max_deg * sizeof(uint64_t) ; + LG_TRY (LAGraph_Malloc((void **) &rcc, max_deg, sizeof(double), NULL)) ; + + if (i32 && p32) + { + uint32_t *p_arr = Ap, *i_arr = Ai; + while(ptr < p_n - 1) + { + uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; + for(; p_arr[ptr + 1] > i; ++i) + { + uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; + epd[dp - 1] += (dp < di) + (dp <= di); + } + if (dp > 0) + ++vpd[dp - 1]; + ++ptr; + } + } + else if (i32) + { + uint64_t *p_arr = Ap; + uint32_t *i_arr = Ai; + while(ptr < p_n - 1) + { + uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; + for(; p_arr[ptr + 1] > i; ++i) + { + uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; + epd[dp - 1] += (dp < di) + (dp <= di); + } + if (dp > 0) + ++vpd[dp - 1]; + ++ptr; + } + } + else if (p32) + { + uint32_t *p_arr = Ap; + uint64_t *i_arr = Ai; + while(ptr < p_n - 1) + { + uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; + for(; p_arr[ptr + 1] > i; ++i) + { + uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; + epd[dp - 1] += (dp < di) + (dp <= di); + } + if (dp > 0) + ++vpd[dp - 1]; + ++ptr; + } + } + else + { + uint64_t *p_arr = Ap, *i_arr = Ai; + while(ptr < p_n - 1) + { + uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; + for(; p_arr[ptr + 1] > i; ++i) + { + uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; + epd[dp - 1] += (dp < di) + (dp <= di); + } + if (dp > 0) + ++vpd[dp - 1]; + ++ptr; + } + } + //run a cummulative sum (backwards) + for(i = max_deg - 1; i > 0; --i) + { + vpd[i-1] += vpd[i] ; + epd[i-1] += epd[i] ; + } + for(i = 0; i < max_deg; ++i) + { + rcc[i] = ((double)epd[i]) / ((double)vpd[i] * ((double) vpd[i] - 1.0)) ; + } + epd = vpd = NULL; + GRB_TRY (GrB_Vector_new(rccs, GrB_FP64, max_deg)); + GRB_TRY (GxB_Vector_load( + *rccs, (void **) &rcc, GrB_FP64, max_deg, max_deg * sizeof(double), + GrB_DEFAULT, NULL)) ; + GRB_TRY (GxB_Vector_load( + cont->p, &Ap, p_type, p_n, p_size, p_hand, NULL)) ; + GRB_TRY (GxB_Vector_load( + cont->i, &Ai, i_type, i_n, i_size, i_hand, NULL)) ; + GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; + GRB_TRY (GxB_fprint(G->A, GxB_SHORT, stdout)); + LG_FREE_WORK ; + return (GrB_SUCCESS) ; +} +#endif diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index ca689ac2a4..2070c77cc4 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -28,10 +28,11 @@ #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ - GrB_free (&Y) ; \ + GrB_free (&rcc1) ; \ + GrB_free (&rcc2) ; \ LAGraph_Delete (&G, msg) ; \ } - +#define SINGLERCC 1 int main (int argc, char **argv) { @@ -41,7 +42,7 @@ int main (int argc, char **argv) char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph LAGraph_Graph G = NULL ; - GrB_Vector Y = NULL ; + GrB_Vector rcc1 = NULL, rcc2 = NULL ; // start GraphBLAS and LAGraph bool burble = true ; // set true for diagnostic outputs @@ -80,16 +81,38 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf ("\n========================== Start RCC ==========================\n") ; t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_RichClubCoefficient (&Y, G, msg)) ; + LG_TRY (LAGraph_RichClubCoefficient (&rcc1, G, msg)) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_RichClubCoefficient: %g sec\n", t) ; + #if SINGLERCC + int result; + LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; + printf ("\n========================== Start RCC ==========================\n") ; + t = LAGraph_WallClockTime ( ) ; + result = LAGraph_RichClubCoefficient (&rcc2, G, msg) ; + t = LAGraph_WallClockTime ( ) - t ; + printf ("Time for LAGraph_RichClubCoefficient: %g sec\n", t) ; + #endif + //-------------------------------------------------------------------------- // check the results (make sure Y is a copy of G->A) //-------------------------------------------------------------------------- t = LAGraph_WallClockTime ( ) ; - //TODO We can't really check this very well + #if SINGLERCC + if(result == GrB_SUCCESS) + { + bool flag; + LG_TRY (LAGraph_Vector_IsEqual(&flag, rcc1, rcc2, msg)); + if (flag) + printf("TEST PASSED\n") ; + else + printf("TEST FAILED\n") ; + } + else + printf("Test indeterminate. Single Thread exited with %d\n", result) ; + #endif t = LAGraph_WallClockTime ( ) - t ; printf ("Time to check results: %g sec\n", t) ; @@ -98,7 +121,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- printf ("\n===============================The result matrix Y:\n") ; - GRB_TRY (GxB_Vector_fprint (Y, "rcc", GxB_SHORT, stdout)); + GRB_TRY (GxB_Vector_fprint (rcc1, "rcc", GxB_SHORT, stdout)); //-------------------------------------------------------------------------- // free everyting and finish diff --git a/include/LAGraphX.h b/include/LAGraphX.h index d5861b0592..408d6dcf6c 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1428,6 +1428,15 @@ int LAGraph_RichClubCoefficient char *msg ) ; +LAGRAPHX_PUBLIC +int LAGraph_RichClubCoefficient_SingleThreaded +( + GrB_Vector *rich_club_coefficents, //output + LAGraph_Graph G, //input graph + char *msg +) ; + +LAGRAPHX_PUBLIC int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GxB extensions ( // output: From 25c271ec2e35210fb189f5279e56059d814bfdd0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 8 Apr 2025 16:54:28 -0500 Subject: [PATCH 099/115] changed eq op --- .../algorithm/LAGraph_RichClubCoefficient.c | 1 - experimental/benchmark/rcc_demo.c | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 8710f91aac..82fbf45d7b 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -555,7 +555,6 @@ int LAGraph_RichClubCoefficient_SingleThreaded GRB_TRY (GxB_Vector_load( cont->i, &Ai, i_type, i_n, i_size, i_hand, NULL)) ; GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; - GRB_TRY (GxB_fprint(G->A, GxB_SHORT, stdout)); LG_FREE_WORK ; return (GrB_SUCCESS) ; } diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index 2070c77cc4..57d435fb9a 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -23,13 +23,22 @@ #include "../../src/benchmark/LAGraph_demo.h" #include "LAGraphX.h" #include "LG_internal.h" - +void iseq(bool *z, const double *x, const double *y) +{ + (*z) = fabs(*x - *y) < 1e-15 ; +} +#define ISEQ \ +" void iseq(bool *z, const double *x, const double *y) \n"\ +" { \n"\ +" (*z) = fabs(*x - *y) < 1e-15 ; \n"\ +" }" // LG_FREE_ALL is required by LG_TRY #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ GrB_free (&rcc1) ; \ GrB_free (&rcc2) ; \ + GrB_free (&iseqFP) ; \ LAGraph_Delete (&G, msg) ; \ } #define SINGLERCC 1 @@ -43,12 +52,15 @@ int main (int argc, char **argv) char msg [LAGRAPH_MSG_LEN] ; // for error messages from LAGraph LAGraph_Graph G = NULL ; GrB_Vector rcc1 = NULL, rcc2 = NULL ; + GrB_BinaryOp iseqFP = NULL ; // start GraphBLAS and LAGraph bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; - LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; - + LG_TRY (LAGraph_Random_Init (msg)) ; + GRB_TRY (GxB_BinaryOp_new ( + &iseqFP, (GxB_binary_function) iseq, + GrB_BOOL, GrB_FP64, GrB_FP64, "iseq", ISEQ)) ; //-------------------------------------------------------------------------- // read in the graph: this method is defined in LAGraph_demo.h //-------------------------------------------------------------------------- @@ -90,7 +102,7 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf ("\n========================== Start RCC ==========================\n") ; t = LAGraph_WallClockTime ( ) ; - result = LAGraph_RichClubCoefficient (&rcc2, G, msg) ; + result = LAGraph_RichClubCoefficient_SingleThreaded (&rcc2, G, msg) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_RichClubCoefficient: %g sec\n", t) ; #endif @@ -104,7 +116,7 @@ int main (int argc, char **argv) if(result == GrB_SUCCESS) { bool flag; - LG_TRY (LAGraph_Vector_IsEqual(&flag, rcc1, rcc2, msg)); + LG_TRY (LAGraph_Vector_IsEqualOp(&flag, rcc1, rcc2, iseqFP, msg)) ; if (flag) printf("TEST PASSED\n") ; else From bc8baee830d2320de0f2e01ceea6582d5c9d6615 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 8 Apr 2025 20:59:34 -0500 Subject: [PATCH 100/115] Parrallelizing non-GB approach --- .../algorithm/LAGraph_RichClubCoefficient.c | 154 +++++++++--------- experimental/benchmark/rcc_demo.c | 2 +- experimental/test/test_RichClubCoefficient.c | 2 +- include/LAGraphX.h | 2 +- 4 files changed, 79 insertions(+), 81 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 82fbf45d7b..9cee8baeb1 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -399,6 +399,8 @@ int LAGraph_RichClubCoefficient /* free any workspace used here */ \ LAGraph_Free(&array_space, NULL) ; \ GrB_free (&cont) ; \ + LAGraph_Free((void **)&Ai, NULL) ; \ + LAGraph_Free((void **)&Ap, NULL) ; \ } @@ -407,14 +409,44 @@ int LAGraph_RichClubCoefficient /* free any workspace used here */ \ LG_FREE_WORK ; \ /* free all the output variable(s) */ \ - LAGraph_Free(&Ap, NULL) ; \ - LAGraph_Free(&Ai, NULL) ; \ LAGraph_Free((void **)&rcc, NULL) ; \ GrB_free (rccs) ; \ } +//Taken from msort1.c +static int64_t LG_binary_search // return pleft +( + const int64_t pivot, + const int64_t *LG_RESTRICT X_0, // search in X [p_start..p_end_-1] + const int64_t p_start, + const int64_t p_end +) +{ + + //-------------------------------------------------------------------------- + // find where the Pivot appears in X + //-------------------------------------------------------------------------- + + // binary search of X [p_start...p_end-1] for the Pivot + int64_t pleft = p_start ; + int64_t pright = p_end - 1 ; + while (pleft < pright) + { + int64_t pmiddle = (pleft + pright) >> 1 ; + bool less = (X_0 [pmiddle] < pivot) ; + pleft = less ? (pmiddle+1) : pleft ; + pright = less ? pright : pmiddle ; + } + + // binary search is narrowed down to a single item + // or it has found the list is empty: + ASSERT (pleft == pright || pleft == pright + 1) ; + + return (pleft) ; +} + #if USING_GRAPHBLAS_V10 -int LAGraph_RichClubCoefficient_SingleThreaded +int LAGraph_RichClubCoefficient_NoGB ( // output: //rccs(i): rich club coefficent of i @@ -427,7 +459,8 @@ int LAGraph_RichClubCoefficient_SingleThreaded { GxB_Container cont = NULL; GrB_Matrix A = G->A; - void *Ap = NULL, *Ai = NULL, *array_space = NULL; + int64_t *Ap = NULL, *Ai = NULL; + void *array_space = NULL; GrB_Type p_type = NULL, i_type = NULL; int p_hand = 0, i_hand = 0; uint64_t p_n = 0, i_n = 0, p_size = 0, i_size = 0, max_deg = 0; @@ -452,88 +485,56 @@ int LAGraph_RichClubCoefficient_SingleThreaded GRB_TRY(GxB_Container_new(&cont)) ; GRB_TRY(GxB_unload_Matrix_into_Container(A, cont, NULL)) ; LG_ASSERT_MSG(cont->format == GxB_SPARSE, GrB_NOT_IMPLEMENTED, - "Matrix must be sparse") ; - GRB_TRY(GxB_Vector_unload( - cont->p, &Ap, &p_type, &p_n, &p_size, &p_hand, NULL)) ; - GRB_TRY(GxB_Vector_unload( - cont->i, &Ai, &i_type, &i_n, &i_size, &i_hand, NULL)) ; + "Matrix must be sparse") ; + LG_TRY (LAGraph_Malloc( + (void **) &Ap, cont->nvals, sizeof(uint64_t), NULL)) ; + LG_TRY (LAGraph_Malloc( + (void **) &Ai, cont->nvals + 1, sizeof(uint64_t), NULL)) ; + p_n = cont->nvals + 1; i_n = cont->nvals; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, Ap, &p_n, cont->p)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, Ai, &i_n, cont->i)) ; + GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; GRB_TRY (GrB_Vector_reduce_INT64( &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; - - bool i32 = i_type == GrB_INT32 || i_type == GrB_UINT32; - bool p32 = p_type == GrB_INT32 || p_type == GrB_UINT32; - uint64_t ptr = 0, i = 0; + int64_t ptr = -1, i = 0, dp = 0; LG_TRY (LAGraph_Calloc(&array_space, max_deg * 2, sizeof(uint64_t), NULL)) ; epd = array_space ; vpd = array_space + max_deg * sizeof(uint64_t) ; LG_TRY (LAGraph_Malloc((void **) &rcc, max_deg, sizeof(double), NULL)) ; - - if (i32 && p32) + // while(ptr < p_n - 1) + // { + // uint64_t dp = Ap[ptr+1] - Ap[ptr]; + // for(; Ap[ptr + 1] > i; ++i) + // { + // uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]] ; + // epd[dp - 1] += (dp < di) + (dp <= di) ; + // } + // if (dp > 0) + // ++vpd[dp - 1] ; + // ++ptr ; + // } + #pragma omp parrallel for schedule(static) + for(i = 0; i < i_n; ++i) { - uint32_t *p_arr = Ap, *i_arr = Ai; - while(ptr < p_n - 1) + if(ptr == -1) { - uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; - for(; p_arr[ptr + 1] > i; ++i) - { - uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; - epd[dp - 1] += (dp < di) + (dp <= di); - } - if (dp > 0) + ptr = LG_binary_search(i, Ap, 0, p_n - 1) ; + dp = Ap[ptr+1] - Ap[ptr]; + if(dp > 0) ++vpd[dp - 1]; - ++ptr; } - } - else if (i32) - { - uint64_t *p_arr = Ap; - uint32_t *i_arr = Ai; - while(ptr < p_n - 1) + if(Ap[ptr + 1] <= i) { - uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; - for(; p_arr[ptr + 1] > i; ++i) - { - uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; - epd[dp - 1] += (dp < di) + (dp <= di); - } - if (dp > 0) - ++vpd[dp - 1]; - ++ptr; - } - } - else if (p32) - { - uint32_t *p_arr = Ap; - uint64_t *i_arr = Ai; - while(ptr < p_n - 1) - { - uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; - for(; p_arr[ptr + 1] > i; ++i) - { - uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; - epd[dp - 1] += (dp < di) + (dp <= di); - } - if (dp > 0) - ++vpd[dp - 1]; - ++ptr; - } - } - else - { - uint64_t *p_arr = Ap, *i_arr = Ai; - while(ptr < p_n - 1) - { - uint64_t dp = p_arr[ptr+1] - p_arr[ptr]; - for(; p_arr[ptr + 1] > i; ++i) - { - uint64_t di = p_arr[i_arr[i]+1] - p_arr[i_arr[i]]; - epd[dp - 1] += (dp < di) + (dp <= di); - } - if (dp > 0) - ++vpd[dp - 1]; - ++ptr; + while(Ap[ptr + 1] <= i) ++ptr; + dp = Ap[ptr+1] - Ap[ptr]; + LG_ASSERT(dp > 0, GrB_INVALID_VALUE) ; + ++vpd[dp - 1]; } + uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]]; + epd[dp - 1] += (dp < di) + (dp <= di); } //run a cummulative sum (backwards) for(i = max_deg - 1; i > 0; --i) @@ -541,6 +542,7 @@ int LAGraph_RichClubCoefficient_SingleThreaded vpd[i-1] += vpd[i] ; epd[i-1] += epd[i] ; } + #pragma omp parrallel for schedule(static) for(i = 0; i < max_deg; ++i) { rcc[i] = ((double)epd[i]) / ((double)vpd[i] * ((double) vpd[i] - 1.0)) ; @@ -550,11 +552,7 @@ int LAGraph_RichClubCoefficient_SingleThreaded GRB_TRY (GxB_Vector_load( *rccs, (void **) &rcc, GrB_FP64, max_deg, max_deg * sizeof(double), GrB_DEFAULT, NULL)) ; - GRB_TRY (GxB_Vector_load( - cont->p, &Ap, p_type, p_n, p_size, p_hand, NULL)) ; - GRB_TRY (GxB_Vector_load( - cont->i, &Ai, i_type, i_n, i_size, i_hand, NULL)) ; - GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; + LG_FREE_WORK ; return (GrB_SUCCESS) ; } diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index 57d435fb9a..2f2647974e 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -102,7 +102,7 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf ("\n========================== Start RCC ==========================\n") ; t = LAGraph_WallClockTime ( ) ; - result = LAGraph_RichClubCoefficient_SingleThreaded (&rcc2, G, msg) ; + result = LAGraph_RichClubCoefficient_NoGB (&rcc2, G, msg) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_RichClubCoefficient: %g sec\n", t) ; #endif diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 33190654e4..e4d2fef4e7 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -158,7 +158,7 @@ void test_RichClubCoefficient (void) printf ("RCC computation begins:\n") ; GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_RichClubCoefficient( &rcc, G, msg)); + OK(LAGraph_RichClubCoefficient_NoGB( &rcc, G, msg)); printf("%s\n", msg); GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("RCC computation ends:\n") ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 408d6dcf6c..6bcbcbefde 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1429,7 +1429,7 @@ int LAGraph_RichClubCoefficient ) ; LAGRAPHX_PUBLIC -int LAGraph_RichClubCoefficient_SingleThreaded +int LAGraph_RichClubCoefficient_NoGB ( GrB_Vector *rich_club_coefficents, //output LAGraph_Graph G, //input graph From 6d81f7f0927b32b46156341918e1206bdf718437 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 9 Apr 2025 00:44:27 -0500 Subject: [PATCH 101/115] Parallel NoGB Fix --- .../algorithm/LAGraph_RichClubCoefficient.c | 57 ++++++++++++------- experimental/benchmark/rcc_demo.c | 4 +- experimental/test/test_RichClubCoefficient.c | 2 +- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 9cee8baeb1..6634e860e4 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -413,8 +413,8 @@ int LAGraph_RichClubCoefficient GrB_free (rccs) ; \ } -//Taken from msort1.c -static int64_t LG_binary_search // return pleft +//Scuffed upperbound function +static int64_t LG_binary_search // returns upperbound - 1 ( const int64_t pivot, const int64_t *LG_RESTRICT X_0, // search in X [p_start..p_end_-1] @@ -429,20 +429,17 @@ static int64_t LG_binary_search // return pleft // binary search of X [p_start...p_end-1] for the Pivot int64_t pleft = p_start ; - int64_t pright = p_end - 1 ; + int64_t pright = p_end - 1; while (pleft < pright) { - int64_t pmiddle = (pleft + pright) >> 1 ; + int64_t pmiddle = pleft + (pright - pleft) / 2 ; bool less = (X_0 [pmiddle] < pivot) ; - pleft = less ? (pmiddle+1) : pleft ; + pleft = less ? pmiddle + 1 : pleft ; pright = less ? pright : pmiddle ; } - - // binary search is narrowed down to a single item - // or it has found the list is empty: - ASSERT (pleft == pright || pleft == pright + 1) ; - - return (pleft) ; + if(X_0[pleft] <= pivot) + pleft++; + return (--pleft) ; } #if USING_GRAPHBLAS_V10 @@ -498,7 +495,7 @@ int LAGraph_RichClubCoefficient_NoGB GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; GRB_TRY (GrB_Vector_reduce_INT64( &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; - int64_t ptr = -1, i = 0, dp = 0; + int64_t i = 0; LG_TRY (LAGraph_Calloc(&array_space, max_deg * 2, sizeof(uint64_t), NULL)) ; epd = array_space ; @@ -516,33 +513,51 @@ int LAGraph_RichClubCoefficient_NoGB // ++vpd[dp - 1] ; // ++ptr ; // } - #pragma omp parrallel for schedule(static) + #pragma omp parallel + { + int64_t dp = 0, ptr = -1, loc_sum = 0; + #pragma omp for schedule(static) for(i = 0; i < i_n; ++i) { if(ptr == -1) { ptr = LG_binary_search(i, Ap, 0, p_n - 1) ; - dp = Ap[ptr+1] - Ap[ptr]; - if(dp > 0) - ++vpd[dp - 1]; + while(Ap[ptr + 1] <= i) ++ptr; + dp = Ap[ptr + 1] - Ap[ptr]; } if(Ap[ptr + 1] <= i) { + #pragma omp atomic + epd[dp - 1] += loc_sum ; + loc_sum = 0; while(Ap[ptr + 1] <= i) ++ptr; - dp = Ap[ptr+1] - Ap[ptr]; - LG_ASSERT(dp > 0, GrB_INVALID_VALUE) ; - ++vpd[dp - 1]; + dp = Ap[ptr + 1] - Ap[ptr]; } uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]]; - epd[dp - 1] += (dp < di) + (dp <= di); + int64_t temp = (dp < di) + (dp <= di); + loc_sum += temp; + } + #pragma omp atomic + epd[dp - 1] += loc_sum ; } + + #pragma omp parallel for schedule(static) + for(i = 0; i < p_n - 1; ++i) + { + int64_t dp = Ap[i + 1] - Ap[i] - 1; + if(dp >= 0) + { + #pragma omp atomic + ++vpd[dp]; + } + } //run a cummulative sum (backwards) for(i = max_deg - 1; i > 0; --i) { vpd[i-1] += vpd[i] ; epd[i-1] += epd[i] ; } - #pragma omp parrallel for schedule(static) + #pragma omp parallel for schedule(static) for(i = 0; i < max_deg; ++i) { rcc[i] = ((double)epd[i]) / ((double)vpd[i] * ((double) vpd[i] - 1.0)) ; diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index 2f2647974e..ffccd079dc 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -25,12 +25,12 @@ #include "LG_internal.h" void iseq(bool *z, const double *x, const double *y) { - (*z) = fabs(*x - *y) < 1e-15 ; + (*z) = (isnan(*x) && isnan(*y)) ||*x == *y ; } #define ISEQ \ " void iseq(bool *z, const double *x, const double *y) \n"\ " { \n"\ -" (*z) = fabs(*x - *y) < 1e-15 ; \n"\ +" (*z) = (isnan(*x) && isnan(*y)) || *x == *y ; \n"\ " }" // LG_FREE_ALL is required by LG_TRY #undef LG_FREE_ALL diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index e4d2fef4e7..0548c7005d 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -158,7 +158,7 @@ void test_RichClubCoefficient (void) printf ("RCC computation begins:\n") ; GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_RichClubCoefficient_NoGB( &rcc, G, msg)); + OK(LAGraph_RichClubCoefficient ( &rcc, G, msg)); printf("%s\n", msg); GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("RCC computation ends:\n") ; From cd880b436e39e340f81cc0c2871ca6ec61b63249 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 10 Apr 2025 00:49:13 -0500 Subject: [PATCH 102/115] Fixed RCC for earlier GB versions. Speed Up No GB. --- .../algorithm/LAGraph_RichClubCoefficient.c | 214 ++++++++++++------ 1 file changed, 147 insertions(+), 67 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 6634e860e4..02a40c1d02 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -36,7 +36,7 @@ /* free any workspace used here */ \ GrB_free(&D) ; \ GrB_free(&P) ; \ - GrB_free(&A_deg) ; \ + GrB_free(&A_deg) ; \ GrB_free(°rees) ; \ GrB_free(°_x) ; \ GrB_free(&node_edges) ; \ @@ -48,11 +48,7 @@ GrB_free(&plus_2le) ; \ GrB_free(&rcCalculation) ; \ GrB_free(&ramp_v) ; \ - LAGraph_Free((void **) &array_space, NULL) ; \ - LAGraph_Free((void **) &node_edges_arr, NULL); \ - LAGraph_Free((void **) °_arr, NULL); \ - LAGraph_Free((void **) &ramp, NULL); \ - LAGraph_Free((void **) &ones, NULL); \ + LAGraph_Free(&a_space, NULL) ; \ } @@ -156,7 +152,7 @@ int LAGraph_RichClubCoefficient GrB_Index max_deg; bool iso = false; - void *array_space = NULL; + void *a_space = NULL; int64_t *node_edges_arr = NULL, *deg_arr = NULL, *epd_arr = NULL, *ones = NULL, @@ -165,7 +161,6 @@ int LAGraph_RichClubCoefficient int64_t epd_n = 0, vpd_n = 0, epd_size = 0, vpd_size = 0; int epd_h = 0, vpd_h = 0; GrB_Index *epd_index = NULL, *vpd_index = NULL; - int64_t *ramp = NULL; //-------------------------------------------------------------------------- // Check inputs @@ -311,47 +306,55 @@ int LAGraph_RichClubCoefficient verts_per_deg, (void **) &vpd_arr, vpd_type, vpd_n, vpd_size, vpd_h, NULL)) ; #else + LG_TRY (LAGraph_Malloc( + &a_space, edge_vec_nvals * 3 + max_deg * 4, sizeof(int64_t), NULL + )) ; + int64_t *T = a_space; + deg_arr = T; T += edge_vec_nvals; + node_edges_arr = T; T += edge_vec_nvals; + ones = T; T += edge_vec_nvals; + epd_arr = T; T += max_deg; + vpd_arr = T; T += max_deg; + epd_index = T; T += max_deg; + vpd_index = T; T += max_deg; + + #pragma omp parallel for schedule(static) + for(uint64_t i = 0; i < edge_vec_nvals; ++i) + { + ones[i] = 1ll; + } GRB_TRY (GrB_Vector_apply_BinaryOp2nd_INT64( degrees, NULL, NULL, GrB_MINUS_INT64, G->out_degree, 1, NULL)) ; - LG_TRY(LAGraph_Malloc( - (void **) °_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; - LG_TRY(LAGraph_Malloc( - (void **) &node_edges_arr, edge_vec_nvals, sizeof(int64_t), NULL)) ; + //TODO: remove NULL for Vanilla GB GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, deg_arr, &edge_vec_nvals, degrees )) ; GRB_TRY (GrB_Vector_extractTuples_INT64( NULL, node_edges_arr, &edge_vec_nvals, node_edges )) ; + // Build with degrees as indecies and handle duplicates via adition GRB_TRY (GrB_Vector_build_INT64 ( edges_per_deg, deg_arr, node_edges_arr, edge_vec_nvals, GrB_PLUS_INT64)) ; - LG_TRY (LAGraph_Malloc( - (void **) &ones, edge_vec_nvals, sizeof(int64_t), NULL)) ; - for(uint64_t i = 0; i < edge_vec_nvals; ++i) - { - ones[i] = 1ll; - } GRB_TRY (GrB_Vector_build_INT64 ( verts_per_deg, deg_arr, ones, edge_vec_nvals, GrB_PLUS_INT64)) ; - - // TODO: FIX THIS (return a ful vector) - GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, edges_per_deg)) ; - LG_TRY (LAGraph_Malloc( - &array_space, edge_vec_nvals * 4, sizeof(int64_t), NULL)) ; - epd_index = array_space ; - epd_arr = array_space + edge_vec_nvals * sizeof(int64_t) ; - vpd_index = array_space + 2 * edge_vec_nvals * sizeof(int64_t) ; - vpd_arr = array_space + 3 * edge_vec_nvals * sizeof(int64_t) ; + GRB_TRY (GrB_Vector_assign_INT64( + edges_per_deg, edges_per_deg, NULL, (int64_t) 0, + GrB_ALL, 0, GrB_DESC_SC)) ; + GRB_TRY (GrB_Vector_assign_INT64( + verts_per_deg, verts_per_deg, NULL, (int64_t) 0, + GrB_ALL, 0, GrB_DESC_SC)) ; + + // Extract into arrays GRB_TRY (GrB_Vector_extractTuples_INT64( - epd_index, epd_arr, &edge_vec_nvals, edges_per_deg + epd_index, epd_arr, &max_deg, edges_per_deg )) ; GRB_TRY (GrB_Vector_extractTuples_INT64( - vpd_index, vpd_arr, &edge_vec_nvals, verts_per_deg + vpd_index, vpd_arr, &max_deg, verts_per_deg )) ; //run a cummulative sum (backwards) on vpd_arr - for(GrB_Index i = edge_vec_nvals - 1; i > 0; --i) + for(GrB_Index i = max_deg - 1; i > 0; --i) { vpd_arr[i-1] += vpd_arr[i] ; epd_arr[i-1] += epd_arr[i] ; @@ -359,11 +362,13 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_Vector_clear(edges_per_deg)) ; GRB_TRY (GrB_Vector_clear(verts_per_deg)) ; GRB_TRY (GrB_Vector_build_INT64( - edges_per_deg, epd_index, epd_arr, edge_vec_nvals, NULL + edges_per_deg, epd_index, epd_arr, max_deg, NULL )) ; GRB_TRY (GrB_Vector_build_INT64( - verts_per_deg, vpd_index, vpd_arr, edge_vec_nvals, NULL + verts_per_deg, vpd_index, vpd_arr, max_deg, NULL )) ; + T = deg_arr = node_edges_arr = ones = NULL ; + epd_index = vpd_index = epd_arr = vpd_arr = NULL ; #endif /** @@ -397,10 +402,11 @@ int LAGraph_RichClubCoefficient #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ - LAGraph_Free(&array_space, NULL) ; \ + LAGraph_Free(&a_space, NULL) ; \ GrB_free (&cont) ; \ LAGraph_Free((void **)&Ai, NULL) ; \ LAGraph_Free((void **)&Ap, NULL) ; \ + LAGraph_Free((void **)&slice, NULL) ; \ } @@ -412,6 +418,18 @@ int LAGraph_RichClubCoefficient LAGraph_Free((void **)&rcc, NULL) ; \ GrB_free (rccs) ; \ } +#define TIMINGS +#ifdef TIMINGS +static void print_timings (const double timings [16]) +{ + double total = timings [0] + timings [1] + timings [2] + timings [3] + timings [4]; + printf ("RCC %12.6f (%4.1f%%) init\n", timings [0], 100. * timings [0] / total) ; + printf ("RCC %12.6f (%4.1f%%) counting edges\n", timings [1], 100. * timings [1] / total) ; + printf ("RCC %12.6f (%4.1f%%) counting nodes\n", timings [2], 100. * timings [2] / total) ; + printf ("RCC %12.6f (%4.1f%%) cumulative sum\n", timings [3], 100. * timings [3] / total) ; + printf ("RCC %12.6f (%4.1f%%) calculation\n", timings [4], 100. * timings [4] / total) ; +} +#endif //Scuffed upperbound function static int64_t LG_binary_search // returns upperbound - 1 @@ -429,7 +447,7 @@ static int64_t LG_binary_search // returns upperbound - 1 // binary search of X [p_start...p_end-1] for the Pivot int64_t pleft = p_start ; - int64_t pright = p_end - 1; + int64_t pright = p_end; while (pleft < pright) { int64_t pmiddle = pleft + (pright - pleft) / 2 ; @@ -457,12 +475,21 @@ int LAGraph_RichClubCoefficient_NoGB GxB_Container cont = NULL; GrB_Matrix A = G->A; int64_t *Ap = NULL, *Ai = NULL; - void *array_space = NULL; + void *a_space = NULL; GrB_Type p_type = NULL, i_type = NULL; int p_hand = 0, i_hand = 0; + int n_threads = LG_nthreads_outer * LG_nthreads_inner; uint64_t p_n = 0, i_n = 0, p_size = 0, i_size = 0, max_deg = 0; uint64_t *epd = NULL, *vpd = NULL; + int64_t *LG_RESTRICT slice = NULL; double *rcc = NULL; + #ifdef TIMINGS + double timings [16] ; + memset(timings, 0, 16*sizeof(double)) ; + double tic = LAGraph_WallClockTime ( ) ; + LG_SET_BURBLE (false) ; + #endif + //-------------------------------------------------------------------------- // Check inputs //-------------------------------------------------------------------------- @@ -496,10 +523,13 @@ int LAGraph_RichClubCoefficient_NoGB GRB_TRY (GrB_Vector_reduce_INT64( &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; int64_t i = 0; - - LG_TRY (LAGraph_Calloc(&array_space, max_deg * 2, sizeof(uint64_t), NULL)) ; - epd = array_space ; - vpd = array_space + max_deg * sizeof(uint64_t) ; + #ifdef TIMINGS + timings[0] = LAGraph_WallClockTime ( ); + #endif + LG_TRY (LAGraph_Calloc(&a_space, max_deg * 2, sizeof(uint64_t), NULL)) ; + LG_TRY (LAGraph_Malloc((void **)&slice, n_threads + 1, sizeof(int64_t), NULL)) ; + epd = a_space ; + vpd = a_space + max_deg * sizeof(uint64_t) ; LG_TRY (LAGraph_Malloc((void **) &rcc, max_deg, sizeof(double), NULL)) ; // while(ptr < p_n - 1) // { @@ -513,62 +543,112 @@ int LAGraph_RichClubCoefficient_NoGB // ++vpd[dp - 1] ; // ++ptr ; // } - #pragma omp parallel - { - int64_t dp = 0, ptr = -1, loc_sum = 0; - #pragma omp for schedule(static) - for(i = 0; i < i_n; ++i) + LG_eslice (slice, i_n, n_threads) ; + #pragma omp parallel for num_threads(n_threads) schedule(static, 1) private(i) + for (int tid = 0 ; tid < n_threads ; tid++) { - if(ptr == -1) + int64_t loc_sum = 0, dp = 0; + int64_t loc_arr[1024]; + memset(loc_arr, 0, 1024 * sizeof(int64_t)); + i = slice[tid]; + int64_t ptr = LG_binary_search(i, Ap, 0, p_n - 1) ; + while(i < slice[tid + 1]) { - ptr = LG_binary_search(i, Ap, 0, p_n - 1) ; while(Ap[ptr + 1] <= i) ++ptr; - dp = Ap[ptr + 1] - Ap[ptr]; + int64_t dp = Ap[ptr + 1] - Ap[ptr]; + if(dp <= 1024) + for(; i < slice[tid + 1] && i < Ap[ptr + 1]; ++i) + { + uint64_t di = Ap[Ai[i] + 1] - Ap[Ai[i]]; + loc_arr[dp - 1] += (dp < di) + (dp <= di); + } + else + { + loc_sum = 0; + for(; i < slice[tid + 1] && i < Ap[ptr + 1]; ++i) + { + uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]]; + loc_sum += (dp < di) + (dp <= di); + } + #pragma omp atomic + epd[dp - 1] += loc_sum ; + } } - if(Ap[ptr + 1] <= i) + #pragma omp critical { - #pragma omp atomic - epd[dp - 1] += loc_sum ; - loc_sum = 0; - while(Ap[ptr + 1] <= i) ++ptr; - dp = Ap[ptr + 1] - Ap[ptr]; + for(int64_t j = 0; j < 1024 && j < max_deg; ++j) + { + epd[j] += loc_arr[j]; + } } - uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]]; - int64_t temp = (dp < di) + (dp <= di); - loc_sum += temp; - } - #pragma omp atomic - epd[dp - 1] += loc_sum ; } + #ifdef TIMINGS + timings[1] = LAGraph_WallClockTime ( ); + #endif - #pragma omp parallel for schedule(static) - for(i = 0; i < p_n - 1; ++i) + #pragma omp parallel { - int64_t dp = Ap[i + 1] - Ap[i] - 1; - if(dp >= 0) + int64_t loc_arr[1024]; + memset(loc_arr, 0, 1024 * sizeof(int64_t)); + #pragma omp for schedule(static) + for(i = 0; i < p_n - 1; ++i) + { + int64_t dp = Ap[i + 1] - Ap[i] - 1; + if(dp < 0) continue; + if(dp < 1024) + { + ++loc_arr[dp]; + } + else + { + #pragma omp atomic + ++vpd[dp]; + } + } + #pragma omp critical { - #pragma omp atomic - ++vpd[dp]; + for(int64_t j = 0; j < 1024 && j < max_deg; ++j) + { + vpd[j] += loc_arr[j]; + } } - } + } + + #ifdef TIMINGS + timings[2] = LAGraph_WallClockTime ( ); + #endif //run a cummulative sum (backwards) for(i = max_deg - 1; i > 0; --i) { vpd[i-1] += vpd[i] ; epd[i-1] += epd[i] ; } + #ifdef TIMINGS + timings[3] = LAGraph_WallClockTime ( ); + #endif #pragma omp parallel for schedule(static) for(i = 0; i < max_deg; ++i) { rcc[i] = ((double)epd[i]) / ((double)vpd[i] * ((double) vpd[i] - 1.0)) ; } + #ifdef TIMINGS + timings[4] = LAGraph_WallClockTime ( ); + timings[4] -= timings[3]; + timings[3] -= timings[2]; + timings[2] -= timings[1]; + timings[1] -= timings[0]; + timings[0] -= tic; + + print_timings(timings); + LG_SET_BURBLE(false); + #endif epd = vpd = NULL; GRB_TRY (GrB_Vector_new(rccs, GrB_FP64, max_deg)); GRB_TRY (GxB_Vector_load( *rccs, (void **) &rcc, GrB_FP64, max_deg, max_deg * sizeof(double), GrB_DEFAULT, NULL)) ; - LG_FREE_WORK ; return (GrB_SUCCESS) ; } #endif +#undef TIMINGS From 71afb0f52e8340fdca871a4fada3dc19c2e53670 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 10 Apr 2025 01:24:17 -0500 Subject: [PATCH 103/115] Removed FastAssign demo on lower GB versions --- experimental/benchmark/FastAssign_demo.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index f3af13a966..1f64a39c79 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -36,7 +36,7 @@ int main (int argc, char **argv) { - + #if USING_GRAPHBLAS_V10 //-------------------------------------------------------------------------- // startup LAGraph and GraphBLAS //-------------------------------------------------------------------------- @@ -172,4 +172,8 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Finalize (msg)) ; LG_TRY (LAGraph_Random_Finalize (msg)) ; return (GrB_SUCCESS) ; + #else + printf ("GraphBLAS version too low to test LAGraph_FastAssign\n") ; + return (GrB_NOT_IMPLEMENTED) ; + #endif } From 063ed7e2629cc471c54f7a834403b44e83a36df0 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 10 Apr 2025 11:36:59 -0500 Subject: [PATCH 104/115] NoGB returns NOT IMPLEMENTED for GB A; int64_t *Ap = NULL, *Ai = NULL; @@ -649,6 +650,9 @@ int LAGraph_RichClubCoefficient_NoGB GrB_DEFAULT, NULL)) ; LG_FREE_WORK ; return (GrB_SUCCESS) ; + #else + printf("LAGraph_RichClubCoefficient_NoGB needs GB v10\n") ; + return (GrB_NOT_IMPLEMENTED) ; + #endif } -#endif #undef TIMINGS From 38c30baf4a7ff076ff65efd65a11450ced67f4d1 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 27 Apr 2025 18:20:21 -0500 Subject: [PATCH 105/115] removed void ptr functions --- experimental/algorithm/LAGraph_SwapEdgesV2.c | 139 ++++++++++++------- 1 file changed, 89 insertions(+), 50 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c index 30cb639651..d812a9c428 100644 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ b/experimental/algorithm/LAGraph_SwapEdgesV2.c @@ -31,7 +31,6 @@ #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ - GrB_free (&E) ; \ GrB_free (&A_tril) ; \ GrB_free (&Ai) ; \ GrB_free (&Aj) ; \ @@ -74,7 +73,6 @@ #include "LG_internal.h" #include "LAGraphX.h" -#if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) void shift_and (uint16_t *z, const uint16_t *x) { @@ -89,6 +87,9 @@ void shift_and " (*z) |= (*z) >> 8; \n"\ " }" +#define INTTYPE "int64_t" +#define EDGE_TYPE "typedef struct { "INTTYPE" a; "INTTYPE" b; } edge_type;" + typedef struct { uint64_t a; uint64_t b; @@ -184,7 +185,7 @@ void swap_bc32 "void swap_bc \n"\ "(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ -" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. \n"\ +" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety.\n"\ " if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ " if(I & 1) \n"\ " { \n"\ @@ -246,21 +247,41 @@ void add_term " (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; \n"\ "}" -void edge2nd64 - (edge_type64 *z, const void *x, const edge_type64 *y) +void edge2nd64_bool + (edge_type64 *z, const bool *x, const edge_type64 *y) { z->a = y->a; z->b = y->b; } -void edge2nd32 - (edge_type32 *z, const void *x, const edge_type32 *y) +void edge2nd32_bool + (edge_type32 *z, const bool *x, const edge_type32 *y) { z->a = y->a; z->b = y->b; } -#define EDGE2ND \ +void edge2nd64_edge + (edge_type64 *z, const edge_type64 *x, const edge_type64 *y) +{ + z->a = y->a; + z->b = y->b; +} +void edge2nd32_edge + (edge_type32 *z, const edge_type32 *x, const edge_type32 *y) +{ + z->a = y->a; + z->b = y->b; +} +#define EDGE2ND_BOOL \ "void edge2 \n"\ -"(edge_type *z, const void *x, const edge_type *y) \n"\ +"(edge_type *z, const bool *x, const edge_type *y) \n"\ +"{ \n"\ +" //if(y->a == 0 && y->b == 0) return; \n"\ +" z->a = y->a; \n"\ +" z->b = y->b; \n"\ +"}" +#define EDGE2ND_EDGE \ +"void edge2 \n"\ +"(edge_type *z, const edge_type *x, const edge_type *y) \n"\ "{ \n"\ " //if(y->a == 0 && y->b == 0) return; \n"\ " z->a = y->a; \n"\ @@ -277,14 +298,12 @@ int LAGraph_SwapEdgesV2 char *msg ) { + #if USING_GRAPHBLAS_V10 //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- GrB_Matrix A = NULL; // n x n Adjacency Matrix GrB_Vector Ai = NULL, Aj = NULL; - - // e x 2 with entries corresponding to verticies of an edge - GrB_Matrix E = NULL; // e x 1 vector, each entry is an edge. GrB_Vector E_vec = NULL, E_temp = NULL; @@ -350,7 +369,7 @@ int LAGraph_SwapEdgesV2 // Toople types GrB_Type lg_edge = NULL, lg_swap = NULL; // Unload types - GrB_Type M_type = NULL, E_type = NULL, Ai_type = NULL; + GrB_Type M_type = NULL, E_type = NULL, Ai_type = NULL, Aj_type = NULL; int M_hand = 0, E_hand = 0; int16_t *dup_swaps = NULL; @@ -360,6 +379,9 @@ int LAGraph_SwapEdgesV2 GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; + // count swaps + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; + // Constants --------------------------------------------------------------- GrB_Vector x = NULL; @@ -387,24 +409,34 @@ int LAGraph_SwapEdgesV2 // Initializations //-------------------------------------------------------------------------- A = G->A ; - // Types + + //-------------------------------------------------------------------------- + // Extract edges from A + //-------------------------------------------------------------------------- + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; GRB_TRY (GrB_Vector_new(&Ai, GrB_BOOL, 0)) ; GRB_TRY (GrB_Vector_new(&Aj, GrB_BOOL, 0)) ; - // Extract lower triangular edges. + // Extract lower triangular edges GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; - GRB_TRY (GxB_Vector_type(&Ai_type, Ai)); - int code; - GrB_get(Ai_type, &code, GrB_EL_TYPE_CODE); + int codei = 0, codej = 0; + GRB_TRY (GxB_Vector_type(&Ai_type, Ai)) ; + GrB_get(Ai, &codei, GrB_EL_TYPE_CODE); + GrB_get(Aj, &codej, GrB_EL_TYPE_CODE); + + LG_ASSERT_MSG ( + codei == codej, GrB_INVALID_VALUE, + "extractTuples_Vector returned different types for Ai and Aj" + ) ; GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - - - //Init Operators ----------------------------------------------------------- - if(code == GrB_UINT32_CODE) + //-------------------------------------------------------------------------- + // Initialize all operators and types + //-------------------------------------------------------------------------- + if(codei == GrB_UINT32_CODE) // Use uint32 if possible { GRB_TRY (GxB_Type_new( &lg_edge, sizeof(edge_type32), "edge_type", EDGE_TYPE32)) ; @@ -419,15 +451,15 @@ int LAGraph_SwapEdgesV2 lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC32 )) ; GRB_TRY(GxB_BinaryOp_new( - &second_edge, (GxB_binary_function) (&edge2nd32), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND + &second_edge, (GxB_binary_function) (&edge2nd32_edge), + lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE )) ; GRB_TRY(GxB_BinaryOp_new( - &second_bool_edge, (GxB_binary_function) (&edge2nd32), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND + &second_bool_edge, (GxB_binary_function) (&edge2nd32_bool), + lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL )) ; } - else + else //uint64 types { GRB_TRY (GxB_Type_new( &lg_edge, sizeof(edge_type64), "edge_type", EDGE_TYPE64)) ; @@ -446,12 +478,12 @@ int LAGraph_SwapEdgesV2 GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM )) ; GRB_TRY(GxB_BinaryOp_new( - &second_edge, (GxB_binary_function) (&edge2nd64), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND + &second_edge, (GxB_binary_function) (&edge2nd64_edge), + lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE )) ; GRB_TRY(GxB_BinaryOp_new( - &second_bool_edge, (GxB_binary_function) (&edge2nd64), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND + &second_bool_edge, (GxB_binary_function) (&edge2nd64_bool), + lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL )) ; } @@ -473,39 +505,39 @@ int LAGraph_SwapEdgesV2 &second_edge_monoid, second_edge, (void *) &iden_second )) ; - // Now working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( &plus_term_one, add_term_monoid, GrB_ONEB_INT8 )) ; GRB_TRY(GrB_Semiring_new( &second_second_edge, second_edge_monoid, second_bool_edge )) ; - // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - // Make E Matrix ----------------------------------------------------------- - GRB_TRY (GrB_Matrix_new(&E, Ai_type, e, 2)) ; + //-------------------------------------------------------------------------- + // Make E Vector + //-------------------------------------------------------------------------- + GRB_TRY (GrB_Vector_new(&E_vec, Ai_type, 2 * e)) ; - // Shuffle i and j into E_vec. // Filling out E_vec helps assign be much quicker. - GRB_TRY (GrB_assign( - E_vec, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)); + E_vec, NULL, NULL, 0, GrB_ALL, 0, NULL)); GrB_Index stride[] = {(GrB_Index) 0, e * 2 - 1, (GrB_Index) 2} ; + + // Shuffle i and j into E_vec. GRB_TRY (GrB_Vector_assign( E_vec, NULL, NULL, Aj, stride, GxB_STRIDE, NULL)) ; stride[GxB_BEGIN] = 1; GRB_TRY (GrB_Vector_assign( E_vec, NULL, NULL, Ai, stride, GxB_STRIDE, NULL)) ; + // Reinterpret E_vec as a vector of tuples. GRB_TRY (GxB_Vector_unload( E_vec, &indices, &E_type, &e, &ind_size, &E_hand, NULL)); e /= 2; GRB_TRY (GxB_Vector_load( E_vec, &indices, lg_edge, e, ind_size, E_hand, NULL)); - // Find Hash Size ---------------------------------------------------------- + // Find Hash Size int shift_e ; #if (!( defined ( __NVCC__) || defined ( __INTEL_CLANG_COMPILER) || \ defined ( __INTEL_COMPILER) ) && defined ( _MSC_VER )) @@ -516,28 +548,34 @@ int LAGraph_SwapEdgesV2 shift_e = __builtin_clzl(e); #endif uint64_t ehash_size = (1ull << (67-shift_e)) ; - printf("Hash Size: %ld", ehash_size); + printf("Hash Size: %ld\n", ehash_size); + + //-------------------------------------------------------------------------- + // Initialize the rest of the vectors + //-------------------------------------------------------------------------- + + // Hash values and buckets GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - // Init Ramps -------------------------------------------------------------- + // Ramp GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; GrB_Index ramp_size; - // Init Constants ---------------------------------------------------------- + // Constants GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; GRB_TRY (GrB_Vector_new (&x, GrB_BOOL, e)) ; - // Make Random ------------------------------------------------------------- + // Random Vector GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; //TODO: Change seed @@ -548,10 +586,8 @@ int LAGraph_SwapEdgesV2 while(num_swaps < e * Q && num_attempts < e * Q * 5) { GrB_Index perm_size, arr_size, junk_size; - // Coming into the loop: - // E must be the incidence matrix of the new graph. W/o self edges nor - // parallel edges. Each row must have exactly two distinct values. - // random_v has a radom dense vector. + printf(EDGE_TYPE); + // r_60 has the random vector shifted by some amount. GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL )) ; @@ -747,5 +783,8 @@ int LAGraph_SwapEdgesV2 LG_FREE_WORK ; return (GrB_SUCCESS) ; + #else + printf("LAGraph_SwapEdgesV2 Needs GB v10\n") ; + return (GrB_NOT_IMPLEMENTED) ; + #endif } -#endif From b4f2f44dcb53d3bcf793ee46435272b8c240608c Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 27 Apr 2025 18:49:07 -0500 Subject: [PATCH 106/115] remove old swapedges file --- .vscode/settings.json | 5 +- experimental/algorithm/LAGraph_SwapEdges.c | 872 ++++++++++--------- experimental/algorithm/LAGraph_SwapEdgesV2.c | 790 ----------------- experimental/test/test_SwapEdges.c | 7 +- 4 files changed, 478 insertions(+), 1196 deletions(-) delete mode 100644 experimental/algorithm/LAGraph_SwapEdgesV2.c diff --git a/.vscode/settings.json b/.vscode/settings.json index 0b6f3775ab..2b8c0ab488 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,9 @@ { "files.associations": { "lg_internal.h": "c", - "lagraphx.h": "c" + "lagraphx.h": "c", + "stdio.h": "c", + "lg_test.h": "c", + "acutest.h": "c" } } \ No newline at end of file diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 0b848542b3..d812a9c428 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -15,50 +15,50 @@ //------------------------------------------------------------------------------ +// References: + +// R. Milo, N. Kashtan, S. Itzkovitz, M. E. J. Newman, and U. Alon, “On the +// uniform generation of random graphs with prescribed degree sequences,” 2004. + #define FREE_LOOP \ { \ GrB_free (&M) ; \ - GrB_free (&M_thin) ; \ - GrB_free (E_split) ; \ - GrB_free (E_split + 1) ; \ GrB_free(&dup_swaps_v); \ - GrB_free(&bad_swaps); \ GrB_free(&new_hashed_edges); \ - GrB_free(&selected_m); \ - GrB_free(&hashed_edges); \ - LAGraph_Free((void**)&leftover_e, msg) ; \ - LAGraph_Free((void**)&hash_vals, msg) ; \ - LAGraph_Free((void**)&hash_vals_new, msg) ; \ - LAGraph_Free((void**)&edge_perm, msg) ; \ + GrB_free(&edge_perm) ; \ } #define LG_FREE_WORK \ { \ /* free any workspace used here */ \ - GrB_free (&E) ; \ - GrB_free (&P) ; \ - GrB_free (&hash_m) ; \ GrB_free (&A_tril) ; \ + GrB_free (&Ai) ; \ + GrB_free (&Aj) ; \ GrB_free (&random_v) ; \ GrB_free (&r_permute) ; \ GrB_free (&ramp_v) ; \ - GrB_free (&hramp_v) ; \ - GrB_free (&swapVals) ; \ + GrB_free (&E_temp) ; \ GrB_free (&r_60) ; \ GrB_free(&exists); \ - GrB_free (&selected) ; \ GrB_free (&E_vec) ; \ GrB_free (&swap_pair) ; \ - GrB_free (&swap_verts) ; \ GrB_free (&hash_seed_e) ; \ - GrB_free (&duplicate) ; \ - GrB_free (¬_pointers) ; \ + GrB_free (&add_term_biop) ; \ + GrB_free (&add_term_monoid) ; \ + GrB_free (&plus_term_one) ; \ + GrB_free (&second_edge) ; \ + GrB_free (&second_bool_edge) ; \ + GrB_free (&second_edge_monoid) ; \ + GrB_free (&second_second_edge) ; \ + GrB_free (&lg_shiftland) ; \ + GrB_free (&lg_edge) ; \ + GrB_free (&lg_swap) ; \ + GrB_free (&hashed_edges) ; \ + GrB_free (&con) ; \ + GrB_free (&one8) ; \ + GrB_free (&x) ; \ LAGraph_Free((void**)&indices, msg) ; \ - LAGraph_Free((void**)&ramp, msg) ; \ - LAGraph_Free((void**)&half_ramp, msg) ; \ - LAGraph_Free((void**) &val_of_P, msg); \ LAGraph_Free((void **) &dup_swaps, NULL); \ - LAGraph_Free((void **) ¬_ptrs, NULL); \ FREE_LOOP ; \ } @@ -73,8 +73,6 @@ #include "LG_internal.h" #include "LAGraphX.h" -#if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) - void shift_and (uint16_t *z, const uint16_t *x) { @@ -89,11 +87,14 @@ void shift_and " (*z) |= (*z) >> 8; \n"\ " }" +#define INTTYPE "int64_t" +#define EDGE_TYPE "typedef struct { "INTTYPE" a; "INTTYPE" b; } edge_type;" + typedef struct { uint64_t a; uint64_t b; -} edge_type; -#define EDGE_TYPE \ +} edge_type64; +#define EDGE_TYPE64 \ "typedef struct { uint64_t a; uint64_t b; } edge_type;" typedef struct { @@ -101,59 +102,73 @@ typedef struct { uint64_t b; uint64_t c; uint64_t d; -} swap_type; -#define SWAP_TYPE \ +} swap_type64; +#define SWAP_TYPE64 \ +"typedef struct { \n"\ +" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n"\ +"}swap_type;" + +typedef struct { + uint32_t a; + uint32_t b; +} edge_type32; +#define EDGE_TYPE32 \ +"typedef struct { uint32_t a; uint32_t b; } edge_type;" + +typedef struct { + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; +} swap_type32; +#define SWAP_TYPE32 \ "typedef struct { \n"\ -" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n" \ +" uint32_t a; uint32_t b; uint32_t c; uint32_t d; \n"\ "}swap_type;" -void swap_ab -(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) +void swap_bc64 +(swap_type64 *z, const swap_type64 *x, GrB_Index I, GrB_Index J, const bool *y) { + memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. + if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; if(I & 1) { - uint64_t temp = x->a; - z->a = x->b; - z->b = temp; + uint64_t temp = z->d; + z->d = z->b; + z->b = temp; } + else + { + uint64_t temp = z->c; + z->c = z->b; + z->b = temp; + } } -#define SWAP_AB \ -"void swap_ab \n"\ -"(edge_type *z, const edge_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ -"{ \n"\ -" if (I & 1) \n"\ -" { \n"\ -" uint64_t temp = x->a; \n"\ -" z->a = x->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -"}" - -void swap_bc -(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) +void swap_bc32 +(swap_type32 *z, const swap_type32 *x, GrB_Index I, GrB_Index J, const bool *y) { - memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. + memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; if(I & 1) { - uint64_t temp = z->d; + uint32_t temp = z->d; z->d = z->b; z->b = temp; } else { - uint64_t temp = z->c; + uint32_t temp = z->c; z->c = z->b; z->b = temp; } } -#define SWAP_BC \ +#define SWAP_BC64 \ "void swap_bc \n"\ "(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ "{ \n"\ -" memcpy(z, x, sizeof(*z)); //unnessesary when aliassed but done for safety. \n"\ +" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. \n"\ " if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ -"if(I & 1) \n"\ +" if(I & 1) \n"\ " { \n"\ " uint64_t temp = z->d; \n"\ " z->d = z->b; \n"\ @@ -166,38 +181,114 @@ void swap_bc " z->b = temp; \n"\ " } \n"\ "}" +#define SWAP_BC32 \ +"void swap_bc \n"\ +"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"{ \n"\ +" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety.\n"\ +" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ +" if(I & 1) \n"\ +" { \n"\ +" uint32_t temp = z->d; \n"\ +" z->d = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +" else \n"\ +" { \n"\ +" uint32_t temp = z->c; \n"\ +" z->c = z->b; \n"\ +" z->b = temp; \n"\ +" } \n"\ +"}" - -//Simply making a cantor pairing then masking. -void hash_edge -(uint64_t *z, const edge_type *x, const uint64_t *mask) +// using xorshift, from https://en.wikipedia.org/wiki/Xorshift +// with a state of uint64_t, or xorshift64star. +void hash_edge64 +(uint64_t *z, const edge_type64 *x, const uint64_t *mask) { - (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; - (*z) += (x->a < x->b)? x->a: x->b; + (*z) = x->a ^ x->b; + (*z) ^= (*z) << 13; + (*z) ^= (*z) >> 7; + (*z) ^= (x->a < x->b)? x->a: x->b; + (*z) ^= (*z) << 17; + (*z) &= (*mask); +} +void hash_edge32 +(uint64_t *z, const edge_type32 *x, const uint64_t *mask) +{ + (*z) = x->a ^ x->b; + (*z) ^= (*z) << 13; + (*z) ^= (*z) >> 7; + (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); + (*z) ^= (*z) << 17; (*z) &= (*mask); } #define HASH_EDGE \ "void hash_edge \n"\ "(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ "{ \n"\ -" (*z) = (((x->a + x->b + 1) * (x->a + x->b)) / 2) & (*mask) ; \n"\ -" (*z) += (x->a < x->b)? x->a: x->b; \n"\ -" (*z) &= (*mask); \n"\ +" (*z) = x->a ^ x->b; \n"\ +" (*z) ^= (*z) << 13; \n"\ +" (*z) ^= (*z) >> 7; \n"\ +" (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); \n"\ +" (*z) ^= (*z) << 17; \n"\ +" (*z) &= (*mask); \n"\ "}" void add_term - (uint8_t *z, const uint8_t *x, const uint8_t *y) + (int8_t *z, const int8_t *x, const int8_t *y) { - (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); + (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; } #define ADD_TERM \ "void add_term \n"\ -"(uint8_t *z, const uint8_t *x, const uint8_t *y) \n"\ +"(int8_t *z, const int8_t *x, const int8_t *y) \n"\ +"{ \n"\ +" (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; \n"\ +"}" + +void edge2nd64_bool + (edge_type64 *z, const bool *x, const edge_type64 *y) +{ + z->a = y->a; + z->b = y->b; +} +void edge2nd32_bool + (edge_type32 *z, const bool *x, const edge_type32 *y) +{ + z->a = y->a; + z->b = y->b; +} +void edge2nd64_edge + (edge_type64 *z, const edge_type64 *x, const edge_type64 *y) +{ + z->a = y->a; + z->b = y->b; +} +void edge2nd32_edge + (edge_type32 *z, const edge_type32 *x, const edge_type32 *y) +{ + z->a = y->a; + z->b = y->b; +} +#define EDGE2ND_BOOL \ +"void edge2 \n"\ +"(edge_type *z, const bool *x, const edge_type *y) \n"\ +"{ \n"\ +" //if(y->a == 0 && y->b == 0) return; \n"\ +" z->a = y->a; \n"\ +" z->b = y->b; \n"\ +"}" +#define EDGE2ND_EDGE \ +"void edge2 \n"\ +"(edge_type *z, const edge_type *x, const edge_type *y) \n"\ "{ \n"\ -" (*z) = (*x) | (*y) + ((uint8_t)1 & (*x) & (*y)); \n"\ +" //if(y->a == 0 && y->b == 0) return; \n"\ +" z->a = y->a; \n"\ +" z->b = y->b; \n"\ "}" -int LAGraph_SwapEdges +int LAGraph_SwapEdgesV2 ( // output GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped @@ -207,22 +298,20 @@ int LAGraph_SwapEdges char *msg ) { + #if USING_GRAPHBLAS_V10 //-------------------------------------------------------------------------- // Declorations //-------------------------------------------------------------------------- GrB_Matrix A = NULL; // n x n Adjacency Matrix - - // e x 2 with entries corresponding to verticies of an edge - GrB_Matrix E = NULL, E_t = NULL; - GrB_Vector E_vec = NULL; - GrB_Vector E_split[2] = {NULL, NULL}; - - GrB_Matrix P = NULL; + GrB_Vector Ai = NULL, Aj = NULL; + // e x 1 vector, each entry is an edge. + GrB_Vector E_vec = NULL, E_temp = NULL; // swaps x 4 // Each row contains 4 entries corresponding to the verticies // that are involved in the swap. - GrB_Vector M = NULL, M_thin = NULL; + GrB_Vector M = NULL; + GxB_Container con = NULL; // n = |V| e = |E| GrB_Index n = 0, e = 0; @@ -235,92 +324,68 @@ int LAGraph_SwapEdges GrB_Vector random_v = NULL, r_permute = NULL; // indicies for A - GrB_Index *indices = NULL; - - // [0,1,1,. . ., 0] swap a given edge. Boolean - GrB_Vector swapVals = NULL; + void *indices = NULL; GrB_Vector ramp_v = NULL; - GrB_Vector hramp_v = NULL; - - // [0, ... , e] - GrB_Index *ramp = NULL ; - // [0,0,1,1,2,2,...] - GrB_Index *half_ramp = NULL ; - // Arrays to unpack edge permutation - GrB_Index *edge_perm = NULL, *leftover_e = NULL; + // edge permutation + GrB_Vector edge_perm = NULL; bool iso = false; // Number of values kept in each phase - GrB_Index n_keep; - GrB_Index *arr_keep = NULL; - void *junk = NULL; - + GrB_Index n_keep = 0, M_nvals = 0, dup_arr_size = 0; // swaps x 2 matrix which holds the hashes of each planned edge. GrB_Vector new_hashed_edges = NULL; - // GrB_Matrix p_buckets = NULL; - - // swaps used for "outdegree" - GrB_Vector big_dense; - // e holds hashes of old edges GrB_Vector hashed_edges = NULL; // 2^60 holds the buckets in which hashes collided. GrB_Vector exists = NULL; - GrB_Vector new_edges_h = NULL; - GrB_Index *hash_vals_new = NULL, *hash_vals = NULL; - GrB_Matrix hash_m = NULL; GrB_UnaryOp lg_shiftland = NULL; // b1 <---> a2 or b1 <---> b2 GrB_IndexUnaryOp swap_pair = NULL; - - GrB_IndexUnaryOp swap_verts = NULL; - - // z = h_y(x) GrB_BinaryOp hash_seed_e = NULL; - // z = min(2,x+y) + // This monoid has only been designed for inputs in {0,1,2}, other behavior + // is undefined. + // (0,x) -> x, (1,1) -> 2, (2,x) -> 2 (and commutative) + // Aka z = min(2, x + y) GrB_BinaryOp add_term_biop = NULL; GrB_Monoid add_term_monoid = NULL; GrB_Semiring plus_term_one = NULL; - GrB_BinaryOp lg_one_uint8 = NULL; - - // [^],[h_y(x)] - GrB_BinaryOp duplicate = NULL; + // z = y + GrB_BinaryOp second_edge = NULL; + GrB_BinaryOp second_bool_edge = NULL; + GrB_Monoid second_edge_monoid = NULL; + GrB_Semiring second_second_edge = NULL; // Toople types GrB_Type lg_edge = NULL, lg_swap = NULL; + // Unload types + GrB_Type M_type = NULL, E_type = NULL, Ai_type = NULL, Aj_type = NULL; + int M_hand = 0, E_hand = 0; int16_t *dup_swaps = NULL; GrB_Vector dup_swaps_v = NULL; // BOOL swaps * 2 vector that holds false if an edge in the swap did not "work" - GrB_Vector bad_swaps = NULL; - GrB_Vector not_pointers = NULL; - uint64_t *not_ptrs = NULL; GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; - GrB_Matrix selected_m = NULL; - GrB_Vector selected = NULL; - + // count swaps + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; // Constants --------------------------------------------------------------- - - uint64_t *val_of_P = NULL; - GrB_Vector x = NULL; - GrB_Scalar zero8 = NULL, one8 = NULL, one64 = NULL ; + GrB_Scalar one8 = NULL; GrB_Index ind_size = 0; @@ -335,8 +400,9 @@ int LAGraph_SwapEdges // char type[LAGRAPH_MAX_NAME_LEN]; LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, "G->nself_edges must be zero") ; - // GRB_TRY (GrB_get(A, type, GrB_EL_TYPE_STRING)) ; - // LG_ASSERT_MSG (MATCHNAME(type, "GrB_BOOL") || MATCHNAME(type, "bool"), LAGRAPH_INVALID_GRAPH, + LG_ASSERT (A_new != NULL, GrB_NULL_POINTER) ; + // GRB_TRY (GxB_Matrix_type(&E_type, A)) ; + // LG_ASSERT_MSG (E_type == GrB_BOOL || , LAGRAPH_INVALID_GRAPH, // "A must be structural") ; //-------------------------------------------------------------------------- @@ -344,377 +410,381 @@ int LAGraph_SwapEdges //-------------------------------------------------------------------------- A = G->A ; - // Types - GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type), "edge_type", EDGE_TYPE)) ; - GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type), "swap_type", SWAP_TYPE)) ; + //-------------------------------------------------------------------------- + // Extract edges from A + //-------------------------------------------------------------------------- + GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; + GRB_TRY (GrB_Vector_new(&Ai, GrB_BOOL, 0)) ; + GRB_TRY (GrB_Vector_new(&Aj, GrB_BOOL, 0)) ; - - // Extract lower triangular edges. + // Extract lower triangular edges GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; - GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; + GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; + int codei = 0, codej = 0; + GRB_TRY (GxB_Vector_type(&Ai_type, Ai)) ; + GrB_get(Ai, &codei, GrB_EL_TYPE_CODE); + GrB_get(Aj, &codej, GrB_EL_TYPE_CODE); + LG_ASSERT_MSG ( + codei == codej, GrB_INVALID_VALUE, + "extractTuples_Vector returned different types for Ai and Aj" + ) ; + GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; + + //-------------------------------------------------------------------------- + // Initialize all operators and types + //-------------------------------------------------------------------------- + if(codei == GrB_UINT32_CODE) // Use uint32 if possible + { + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type32), "edge_type", EDGE_TYPE32)) ; + GRB_TRY (GxB_Type_new( + &lg_swap, sizeof(swap_type32), "swap_type", SWAP_TYPE32)) ; + GRB_TRY(GxB_BinaryOp_new( + &hash_seed_e, (GxB_binary_function) (&hash_edge32), + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_pair, (GxB_index_unary_function) (&swap_bc32), + lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC32 + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_edge, (GxB_binary_function) (&edge2nd32_edge), + lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_bool_edge, (GxB_binary_function) (&edge2nd32_bool), + lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL + )) ; + } + else //uint64 types + { + GRB_TRY (GxB_Type_new( + &lg_edge, sizeof(edge_type64), "edge_type", EDGE_TYPE64)) ; + GRB_TRY (GxB_Type_new( + &lg_swap, sizeof(swap_type64), "swap_type", SWAP_TYPE64)) ; + GRB_TRY(GxB_BinaryOp_new( + &hash_seed_e, (GxB_binary_function) (&hash_edge64), + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + )) ; + GRB_TRY (GxB_IndexUnaryOp_new ( + &swap_pair, (GxB_index_unary_function) (&swap_bc64), + lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC64 + )) ; + GRB_TRY(GxB_BinaryOp_new( + &add_term_biop, (GxB_binary_function) (&add_term), + GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_edge, (GxB_binary_function) (&edge2nd64_edge), + lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE + )) ; + GRB_TRY(GxB_BinaryOp_new( + &second_bool_edge, (GxB_binary_function) (&edge2nd64_bool), + lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL + )) ; + } - GRB_TRY (GrB_Matrix_new(&E, GrB_UINT64, e, 2)) ; - GRB_TRY (GrB_Matrix_new(&E_t, GrB_UINT64, 2, e)) ; - GRB_TRY (GrB_Vector_new(&E_vec, lg_edge, e)) ; - - //Init Operators ----------------------------------------------------------- GRB_TRY (GxB_UnaryOp_new ( &lg_shiftland, (GxB_unary_function) (&shift_and), GrB_UINT16, GrB_UINT16, "shift_and", SHIFT_AND )) ; GRB_TRY(GxB_BinaryOp_new( - &hash_seed_e, (GxB_binary_function) (&hash_edge), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + &add_term_biop, (GxB_binary_function) (&add_term), + GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_verts, (GxB_index_unary_function) (&swap_ab), - lg_edge, lg_edge, GrB_BOOL, "swap_ab", SWAP_AB + + GRB_TRY (GxB_Monoid_terminal_new_INT8( + &add_term_monoid, add_term_biop, (int8_t) 0, (int8_t) 2 )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_pair, (GxB_index_unary_function) (&swap_bc), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC + + edge_type64 iden_second = {0,0}; + GRB_TRY (GrB_Monoid_new_UDT( + &second_edge_monoid, second_edge, (void *) &iden_second )) ; - GRB_TRY(GxB_BinaryOp_new( - &add_term_biop, (GxB_binary_function) (&add_term), - GrB_UINT8, GrB_UINT8, GrB_UINT8, "add_term", ADD_TERM - )); - // This monoid has only been designed for inputs in {0,1,2}, other behavior - // is undefined. - // (0,x) -> x, (1,1) -> 2, (2,x) -> 2 (and commutative) - // Aka (x,y) -> min(2, x + y) - GRB_TRY (GxB_Monoid_terminal_new_UINT8( - &add_term_monoid, add_term_biop, (uint8_t) 0, (uint8_t) 2 - )); - // Now working with the built-in ONEB binary op GRB_TRY(GrB_Semiring_new( - &plus_term_one, add_term_monoid, GrB_ONEB_UINT8 - )); - // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - - // Make E Matrix ----------------------------------------------------------- - LG_TRY (LAGraph_Malloc ((void**)(&indices), 2ull * e, sizeof(GrB_Index), msg)) ; - GRB_TRY ( - GrB_Matrix_extractTuples_BOOL (indices, indices + e, NULL, &e, A_tril) - ) ; - GRB_TRY (GxB_Matrix_pack_FullC ( - E, (void **)&indices, 2ull * e * sizeof(GrB_Index), false, NULL + &plus_term_one, add_term_monoid, GrB_ONEB_INT8 )) ; - GRB_TRY (GrB_set(E, GrB_ROWMAJOR, GrB_STORAGE_ORIENTATION_HINT)); - int shift_e = __builtin_clzl(e); - uint64_t ehash_size = (1ull << (67-shift_e)); - // if(ehash_size > 6*e) ehash_size/=2; - printf("Hash Size: %ld", ehash_size); - GRB_TRY (GrB_Vector_new(&exists, GrB_UINT8, ehash_size)) ; + GRB_TRY(GrB_Semiring_new( + &second_second_edge, second_edge_monoid, second_bool_edge + )) ; + + //-------------------------------------------------------------------------- + // Make E Vector + //-------------------------------------------------------------------------- + + GRB_TRY (GrB_Vector_new(&E_vec, Ai_type, 2 * e)) ; - // GxB_Matrix_fprint(E, "E", GxB_SHORT, stdout); - // Init Ramps -------------------------------------------------------------- + // Filling out E_vec helps assign be much quicker. + GRB_TRY (GrB_assign( + E_vec, NULL, NULL, 0, GrB_ALL, 0, NULL)); + GrB_Index stride[] = {(GrB_Index) 0, e * 2 - 1, (GrB_Index) 2} ; + + // Shuffle i and j into E_vec. + GRB_TRY (GrB_Vector_assign( + E_vec, NULL, NULL, Aj, stride, GxB_STRIDE, NULL)) ; + stride[GxB_BEGIN] = 1; + GRB_TRY (GrB_Vector_assign( + E_vec, NULL, NULL, Ai, stride, GxB_STRIDE, NULL)) ; + + // Reinterpret E_vec as a vector of tuples. + GRB_TRY (GxB_Vector_unload( + E_vec, &indices, &E_type, &e, &ind_size, &E_hand, NULL)); + e /= 2; + GRB_TRY (GxB_Vector_load( + E_vec, &indices, lg_edge, e, ind_size, E_hand, NULL)); + + // Find Hash Size + int shift_e ; + #if (!( defined ( __NVCC__) || defined ( __INTEL_CLANG_COMPILER) || \ + defined ( __INTEL_COMPILER) ) && defined ( _MSC_VER )) + // using the built-in Microsoft Windows compiler + // use ceil, log2, etc + shift_e = 63 - (int) floor (log2 ((double) e)) ; + #else + shift_e = __builtin_clzl(e); + #endif + uint64_t ehash_size = (1ull << (67-shift_e)) ; + printf("Hash Size: %ld\n", ehash_size); + + //-------------------------------------------------------------------------- + // Initialize the rest of the vectors + //-------------------------------------------------------------------------- + + // Hash values and buckets + GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; + GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; + + // Ramp GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&hramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_new(&swapVals, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - hramp_v, NULL, NULL, GrB_DIV_UINT64, ramp_v, 2UL, NULL)) ; - GRB_TRY(GrB_Vector_dup(¬_pointers, hramp_v)) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - not_pointers, NULL, NULL, GrB_TIMES_UINT64, not_pointers, 2UL, NULL)) ; GrB_Index ramp_size; - GRB_TRY (GxB_Vector_unpack_Full ( - ramp_v, (void **)&ramp, &ramp_size, &iso, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full ( - hramp_v, (void **)&half_ramp, &ramp_size, &iso, NULL)) ; - // Init Constants ---------------------------------------------------------- - GRB_TRY (GrB_Scalar_new (&zero8, GrB_UINT8)) ; + // Constants GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; - GRB_TRY (GrB_Scalar_new (&one64, GrB_UINT64)) ; - GRB_TRY (GrB_Scalar_setElement_UINT8 (zero8, 0)) ; GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; - GRB_TRY (GrB_Scalar_setElement_UINT64 (one64, 1ull)) ; + GRB_TRY (GrB_Vector_new (&x, GrB_BOOL, e)) ; - - GRB_TRY (GrB_Matrix_new(&P, GrB_BOOL, 1ull << (64-shift_e), e)) ; - GRB_TRY (GrB_Matrix_new(&hash_m, GrB_BOOL, ehash_size, e)) ; - - // GRB_TRY (GrB_Vector_new (&new_edges_h, GrB_INT8, ehash_size)) ; - GRB_TRY (GrB_Vector_new(&selected, GrB_BOOL, e)); - GRB_TRY (GrB_Vector_new(&x, GrB_BOOL, e)); - - LG_TRY (LAGraph_Malloc ((void**)(&val_of_P), 1, sizeof(bool), msg)) ; - val_of_P[0] = (bool) 1; - - // Make Random ------------------------------------------------------------- + // Random Vector GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - // GRB_TRY(GrB_set (new_edges_h, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - // GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_assign_UINT64 ( random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; //TODO: Change seed LG_TRY( - LAGraph_Random_Seed(random_v, 1548945616ul, msg)); - GRB_TRY (GxB_Matrix_unpack_FullR( - E, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Vector_pack_Full( - E_vec, (void **) &indices, ind_size, iso, NULL)); + LAGraph_Random_Seed(random_v, 1548945616ul, msg)) ; + printf("Entering loop, Good Luck:\n") ; while(num_swaps < e * Q && num_attempts < e * Q * 5) { GrB_Index perm_size, arr_size, junk_size; - // Coming into the loop: - // E must be the incidence matrix of the new graph. W/o self edges nor - // parallel edges. Each row must have exactly two distinct values. - // random_v has a radom dense vector. - // GRB_TRY (GxB_Vector_sort ( - // NULL, r_permute, GrB_LT_UINT64, random_v, GrB_NULL - // )) ; + printf(EDGE_TYPE); + // r_60 has the random vector shifted by some amount. GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL )) ; - GRB_TRY (GxB_Vector_unpack_Full( - r_60, (void **) &edge_perm, &perm_size, &iso, NULL - )) ; - GRB_TRY (GxB_Matrix_pack_CSC( - P, &ramp, &edge_perm, (void**) &val_of_P, ramp_size, - perm_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_Vector_resize(x, e)); + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, e)) ; GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_mxv( - r_permute, NULL, NULL, GxB_ANY_FIRSTJ_INT64, P, x, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - P, &ramp, &edge_perm, (void**) &val_of_P, &ramp_size, - &perm_size, &junk_size, &iso, NULL, NULL - )); - - LAGraph_Free((void **) &edge_perm, msg); + LG_TRY (LAGraph_FastAssign( + r_permute, NULL, NULL, r_60, x, ramp_v, GxB_ANY_FIRSTJ_INT64, + NULL, msg)) ; GrB_Index edges_permed = 0; - GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)); - LAGraph_Malloc((void **) &edge_perm, edges_permed, 8,msg); - GRB_TRY (GrB_Vector_extractTuples_UINT64( - NULL, edge_perm, &edges_permed, r_permute - )) ; + GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)) ; + GRB_TRY (GrB_Vector_new(&edge_perm, GrB_BOOL, edges_permed)) ; + GRB_TRY (GrB_Vector_extractTuples(NULL, edge_perm, r_permute, NULL)) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, edges_permed / 2) ; - // GxB_fprint(r_60, GxB_SHORT, stdout); - // GxB_fprint(r_permute, GxB_SHORT, stdout); - // GxB_Vector_fprint(r_60, "r_60", GxB_SHORT, stdout); - // GRB_TRY (GrB_set(r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)); - // GRB_TRY (GrB_Vector_assign( - // r_permute, NULL, NULL, ramp_v, edge_perm, e, NULL - // )); - - // GxB_fprint(r_permute, GxB_SHORT, stdout); - GRB_TRY (GrB_Vector_new(&M_thin, lg_edge, swaps_per_loop * 2)); - GRB_TRY (GrB_Vector_extract( - M_thin, NULL, NULL, E_vec, edge_perm, swaps_per_loop * 2, NULL - )) ; + + // Chose only the edges we need from edge_perm + GRB_TRY (GrB_Vector_resize(edge_perm, swaps_per_loop * 2)) ; - // GRB_TRY (GrB_Vector_assign_BOOL( - // selected, NULL, NULL, true, GrB_ALL, swaps_per_loop * 2, NULL - // )); - // GRB_TRY (GrB_Vector_assign_BOOL( - // selected, NULL, GxB_LAND_BOOL, false, edge_perm, swaps_per_loop * 2, NULL - // )); - // GxB_fprint(selected, GxB_SHORT, stdout); - - - // Using a CSC pack/unpack strategy to pick out edges involved in the swap - GRB_TRY (GrB_Matrix_new(&selected_m, GrB_BOOL, e, swaps_per_loop * 2)); - GRB_TRY (GxB_Matrix_pack_CSC( - selected_m, &ramp, &edge_perm, (void**) &val_of_P, - swaps_per_loop * 2 * 8 + 8, swaps_per_loop * 2 * 8, 1, true, false, NULL - )); - GRB_TRY (GrB_Matrix_reduce_Monoid( - selected, NULL, NULL, GxB_ANY_BOOL_MONOID, selected_m, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - selected_m, &ramp, &edge_perm, (void**) &val_of_P, &junk_size, - &junk_size, &junk_size, &iso, NULL, NULL - )); - GRB_TRY (GrB_Vector_assign_BOOL( - selected, selected, NULL, 1, GrB_ALL, 0, GrB_DESC_RSC - )); - - LG_TRY (LAGraph_Malloc( - (void **)&leftover_e, e - swaps_per_loop * 2, sizeof(GrB_Index), msg - )); - GRB_TRY (GrB_Vector_extractTuples_BOOL( - leftover_e, NULL, &edges_permed, selected - )) - GRB_TRY (GrB_Vector_new(&E_split[1], lg_edge, edges_permed)); - GRB_TRY (GrB_Vector_extract( - E_split[1], NULL, NULL, E_vec, leftover_e, edges_permed, NULL)); - GRB_TRY (GrB_Vector_dup(E_split, M_thin)) ; - - GRB_TRY(GrB_Vector_new(&M, lg_swap, swaps_per_loop)) ; - GrB_Index dup_arr_size = 0; - GRB_TRY (GxB_Vector_unpack_Full( - M_thin, (void **) &indices, &ind_size, &iso, NULL + // Get the desired edges from the E_vec array. + GRB_TRY (GrB_Vector_new(&M, lg_edge, swaps_per_loop * 2)) ; + GRB_TRY (GxB_Vector_extract_Vector( + M, NULL, NULL, E_vec, edge_perm, NULL + )) ; + + // Make the swaps via the swap_pair unary op. + GRB_TRY (GxB_Vector_unload( + M, (void **) &indices, &M_type, &M_nvals, &ind_size, &M_hand, + NULL )) ; - GRB_TRY (GxB_Vector_pack_Full( - M, (void **) &indices, ind_size, iso, NULL + GRB_TRY (GxB_Vector_load( + M, (void **) &indices, lg_swap, M_nvals / 2, ind_size, M_hand, NULL )) ; GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( M, NULL, NULL, swap_pair, M, false, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - M, (void **) &indices, &ind_size, &iso, NULL + GRB_TRY (GxB_Vector_unload( + M, (void **) &indices, &M_type, &M_nvals, &ind_size, &M_hand, + NULL )) ; - GRB_TRY (GxB_Vector_pack_Full( - M_thin, (void **) &indices, ind_size, iso, NULL + GRB_TRY (GxB_Vector_load( + M, (void **) &indices, lg_edge, M_nvals * 2, ind_size, M_hand, + NULL )) ; // Hash Edges ---------------------------------------------------------- GRB_TRY (GrB_Vector_new( &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - new_hashed_edges, NULL, NULL, hash_seed_e, M_thin, + new_hashed_edges, NULL, NULL, hash_seed_e, M, ehash_size - 1ll, NULL - )) ;//0xFB21C651E98DF25ULL + )) ; GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( hashed_edges, NULL, NULL, hash_seed_e, E_vec, ehash_size - 1ll, NULL )) ; - // GxB_Vector_fprint(hashed_edges, "Hashed", GxB_SHORT, stdout); - // I will unpack and then reconstruct with hash as index. - //---------------------------------------------------------------------- // Build Hash Buckets //---------------------------------------------------------------------- - // Making the hash set for existing edges via a pack CSC trick. - GRB_TRY(GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; - GRB_TRY (GrB_set (dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY (GrB_Vector_new(&bad_swaps, GrB_INT16, swaps_per_loop)) ; - GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, e)) ; - GrB_Index hvn_size; - GRB_TRY(GxB_Vector_unpack_Full( - new_hashed_edges, (void **) &hash_vals_new, - &hvn_size, &iso, NULL - )) ; - GRB_TRY(GxB_Vector_unpack_Full( - hashed_edges, (void **) &hash_vals, &junk_size, &iso, NULL + GRB_TRY (GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; + GRB_TRY (GrB_set(dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; + + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, e)) ; + GRB_TRY (GrB_Vector_assign_BOOL( + x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; + // place a one in any bucket that coresponds to an edge currently in E + LG_TRY (LAGraph_FastAssign( + exists, NULL, NULL, hashed_edges, x, ramp_v, GxB_ANY_PAIR_UINT8, + NULL, msg )) ; - GRB_TRY (GxB_Matrix_pack_CSC( - hash_m, &ramp, &hash_vals, (void**) &val_of_P, ramp_size, - perm_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_mxv( - exists, NULL, NULL, GxB_ANY_PAIR_UINT8, hash_m, x, NULL)); - GRB_TRY (GxB_Matrix_unpack_CSC( - hash_m, &ramp, &hash_vals, (void**) &val_of_P, &ramp_size, - &perm_size, &junk_size, &iso, NULL, NULL - )); - GRB_TRY (GrB_Matrix_resize(hash_m, ehash_size, swaps_per_loop * 2)) ; - // Making the hash map for new edges via a pack CSC trick. - GRB_TRY (GxB_Matrix_pack_CSC( - hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, - hvn_size + 8, hvn_size, sizeof(bool), true, false, NULL - )); - GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)); + + GRB_TRY (GrB_Vector_clear(x)) ; + GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)) ; GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - // Want to make exists full. But assign takes too long. - // Exists cannot possibly be full at this point. - int8_t *exists_bitmap = NULL; - uint64_t exists_bsize; - GRB_TRY (GxB_Vector_unpack_Bitmap( - exists, &exists_bitmap, &junk, &exists_bsize, &junk_size, &iso, - &junk_size, NULL - )); - GRB_TRY (GxB_Vector_pack_Full( - exists, (void **)&exists_bitmap, exists_bsize, false, NULL - )); - GRB_TRY (GrB_mxv( - exists, NULL, add_term_biop, plus_term_one, hash_m, x, NULL - )); - GRB_TRY (GrB_Vector_select_UINT8( - exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (uint8_t) 1, + // exists cannot possibly be full at this point. + // Fill out exists in O(1) time. + GRB_TRY (GxB_Container_new(&con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(exists, con, NULL)) ; + // Sanity check + LG_ASSERT (con->format == GxB_BITMAP, GrB_INVALID_VALUE) ; + GrB_free(&exists); + exists = con->b; + con->b = NULL; + GRB_TRY (GrB_free(&con)) ; + // exist has to be full at this point - confirmed by fprint + // GxB_print(exists, GxB_SUMMARY); + + // "Count" all of the edges that fit into each bucket. Stop counting at + // 2 since we will have to throw that whole bucket away anyway. + LG_TRY (LAGraph_FastAssign( + exists, NULL, add_term_biop, new_hashed_edges, x, ramp_v, + plus_term_one, NULL, msg + )) ; + GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; + // Select buckets with only one corresponding value + GRB_TRY (GrB_Vector_select_INT8( + exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (int8_t) 1, NULL - )); - GRB_TRY (GrB_vxm( - dup_swaps_v, NULL, NULL, GxB_ANY_PAIR_INT8, - exists, hash_m, NULL - )); - GRB_TRY (GxB_Matrix_unpack_CSC( - hash_m, &ramp, &hash_vals_new, (void**) &val_of_P, &junk_size, - &hvn_size, &junk_size, &iso, NULL, NULL - )); - GRB_TRY (GrB_Vector_clear(x)); - - int8_t *dup_val = NULL; - GRB_TRY (GxB_Vector_unpack_Bitmap( - dup_swaps_v, (int8_t **) &dup_swaps, (void **) &dup_val, - &dup_arr_size, &junk_size, &iso, &n_keep, NULL - )); - LAGraph_Free((void **) &dup_val, msg); - GRB_TRY (GxB_Vector_pack_Full( - bad_swaps, (void **) &dup_swaps, dup_arr_size, false, NULL - )); - GRB_TRY (GrB_apply( - bad_swaps, NULL, NULL, lg_shiftland, bad_swaps, NULL)) ; - GRB_TRY (GxB_Vector_unpack_Full( - bad_swaps, (void **) &dup_swaps, &dup_arr_size, &iso, NULL - )); - GRB_TRY (GxB_Vector_pack_Full( - dup_swaps_v, (void **)&dup_swaps, dup_arr_size, false, NULL )) ; + + // Find each hashed edge's bucket, dup_swaps_v is 1 if exists[edge] = 1 + // LG_TRY (LAGraph_FastAssign( + // dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, + // GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg + // )) ; + GRB_TRY (GxB_Vector_extract_Vector( + dup_swaps_v, NULL, NULL, exists, new_hashed_edges, NULL)) ; + + // Fill out dup_swaps_v in O(1) time. + GRB_TRY (GxB_Container_new(&con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(dup_swaps_v, con, NULL)) ; + n_keep = con->nvals; + GRB_TRY (GrB_free(&dup_swaps_v)); + dup_swaps_v = con->b; + con->b = NULL; + GRB_TRY (GrB_free(&con)) ; + GRB_TRY (GxB_Vector_unload( + dup_swaps_v, (void **) &dup_swaps, &M_type, &M_nvals, &dup_arr_size, + &M_hand, NULL)) ; + GRB_TRY (GxB_Vector_load( + dup_swaps_v, (void **) &dup_swaps, GrB_INT16, M_nvals / 2, + dup_arr_size, M_hand, NULL)) ; + GRB_TRY (GrB_apply( + dup_swaps_v, NULL, NULL, lg_shiftland, dup_swaps_v, NULL)) ; + GRB_TRY (GxB_Vector_unload( + dup_swaps_v, (void **) &dup_swaps, &M_type, &M_nvals, &dup_arr_size, + &M_hand, NULL)) ; + GRB_TRY (GxB_Vector_load( + dup_swaps_v, (void **) &dup_swaps, GrB_INT8, M_nvals * 2, + dup_arr_size, M_hand, NULL)) ; + GRB_TRY (GrB_Vector_clear(exists)) ; - // GRB_TRY (GrB_Vector_clear(new_edges_h)) ; - // Swap Good Edges ----------------------------------------------------- + // --------------------------------------------------------------------- + // Place Good Swaps back into E_vec + // --------------------------------------------------------------------- + + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,1) + GRB_TRY (GxB_Container_new(&con)) ; + GRB_TRY (GxB_unload_Vector_into_Container(M, con, NULL)) ; + GRB_TRY (GrB_free(&(con->b))) ; + con->b = dup_swaps_v; + con->nvals = n_keep; + con->format = GxB_BITMAP; + dup_swaps_v = NULL; + GRB_TRY (GxB_load_Vector_from_Container(M, con, NULL)) ; + GRB_TRY (GrB_free(&con)) ; + GRB_TRY (LAGraph_FastAssign( + E_vec, NULL, second_edge, edge_perm, M, ramp_v, + second_second_edge, NULL, msg)) ; + #else // Fix for old saxpy4 bug + GRB_TRY(GxB_Vector_subassign_Vector( + E_vec, dup_swaps_v, NULL, M, edge_perm, NULL)); + #endif + - GRB_TRY(GrB_Vector_assign( - E_split[0], dup_swaps_v, NULL, M_thin, GrB_ALL, 0, NULL - )) ; - GRB_TRY(GrB_Vector_assign_BOOL( - dup_swaps_v, dup_swaps_v, NULL, true, GrB_ALL, 0, GrB_DESC_R)); - GRB_TRY(GrB_Vector_nvals(&n_keep, dup_swaps_v)); n_keep /= 2; - GRB_TRY (GxB_Matrix_concat( - (GrB_Matrix) E_vec, (GrB_Matrix *)E_split, 2, 1, NULL)); FREE_LOOP ; // Free Matricies that have to be rebuilt // Adjust number of swaps to do next. - num_attempts += swaps_per_loop; - num_swaps += n_keep; - swaps_per_loop = n_keep * 3; + num_attempts += swaps_per_loop ; + num_swaps += n_keep ; + swaps_per_loop = n_keep * 3 ; swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; LG_TRY (LAGraph_Random_Next(random_v, msg)) ; - printf("#####Made %ld swaps. Total %ld out of %ld. Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop); + printf("#####Made %ld swaps. Total %ld out of %ld."\ + "Attempting %ld swaps next.#####\n\n", + n_keep, num_swaps, e * Q, swaps_per_loop) ; } - GRB_TRY (GxB_Vector_unpack_Full( - E_vec, (void **) &indices, &ind_size, &iso, NULL)); - GRB_TRY (GxB_Matrix_pack_FullR( - E, (void **) &indices, ind_size, iso, NULL)); + GRB_TRY (GxB_Vector_unload( + E_vec, (void **) &indices, &lg_edge, &e, &ind_size, &E_hand, NULL)); + GRB_TRY (GxB_Vector_load( + E_vec, (void **) &indices, E_type, e * 2, ind_size, E_hand, NULL)); + GRB_TRY (GrB_Vector_extract( + Aj, NULL, NULL, E_vec, stride, GxB_STRIDE, NULL)); + stride[GxB_BEGIN] = 0; + GRB_TRY (GrB_Vector_extract( + Ai, NULL, NULL, E_vec, stride, GxB_STRIDE, NULL)); // Build Output Matrix - GRB_TRY (GxB_Matrix_unpack_FullC( - E, (void **)&indices, &ind_size, &iso, NULL)) ; - GRB_TRY (GxB_Matrix_build_Scalar(*A_new, indices, indices + e, one8, e)); + GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; + GRB_TRY (GxB_Matrix_build_Scalar_Vector(*A_new, Ai, Aj, one8, NULL)) ; GRB_TRY (GrB_eWiseAdd( *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 )) ; + LG_FREE_WORK ; return (GrB_SUCCESS) ; + #else + printf("LAGraph_SwapEdgesV2 Needs GB v10\n") ; + return (GrB_NOT_IMPLEMENTED) ; + #endif } -#endif \ No newline at end of file diff --git a/experimental/algorithm/LAGraph_SwapEdgesV2.c b/experimental/algorithm/LAGraph_SwapEdgesV2.c deleted file mode 100644 index d812a9c428..0000000000 --- a/experimental/algorithm/LAGraph_SwapEdgesV2.c +++ /dev/null @@ -1,790 +0,0 @@ -//------------------------------------------------------------------------------ -// LAGraph_SwapEdges: randomly swaps edges in a graph -//------------------------------------------------------------------------------ - -// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. -// SPDX-License-Identifier: BSD-2-Clause -// -// For additional details (including references to third party source code and -// other files) see the LICENSE file or contact permission@sei.cmu.edu. See -// Contributors.txt for a full list of contributors. Created, in part, with -// funding and support from the U.S. Government (see Acknowledgments.txt file). -// DM22-0790 - -// Contributed by Gabriel Gomez, Texas A&M University - -//------------------------------------------------------------------------------ - -// References: - -// R. Milo, N. Kashtan, S. Itzkovitz, M. E. J. Newman, and U. Alon, “On the -// uniform generation of random graphs with prescribed degree sequences,” 2004. - -#define FREE_LOOP \ -{ \ - GrB_free (&M) ; \ - GrB_free(&dup_swaps_v); \ - GrB_free(&new_hashed_edges); \ - GrB_free(&edge_perm) ; \ -} - -#define LG_FREE_WORK \ -{ \ - /* free any workspace used here */ \ - GrB_free (&A_tril) ; \ - GrB_free (&Ai) ; \ - GrB_free (&Aj) ; \ - GrB_free (&random_v) ; \ - GrB_free (&r_permute) ; \ - GrB_free (&ramp_v) ; \ - GrB_free (&E_temp) ; \ - GrB_free (&r_60) ; \ - GrB_free(&exists); \ - GrB_free (&E_vec) ; \ - GrB_free (&swap_pair) ; \ - GrB_free (&hash_seed_e) ; \ - GrB_free (&add_term_biop) ; \ - GrB_free (&add_term_monoid) ; \ - GrB_free (&plus_term_one) ; \ - GrB_free (&second_edge) ; \ - GrB_free (&second_bool_edge) ; \ - GrB_free (&second_edge_monoid) ; \ - GrB_free (&second_second_edge) ; \ - GrB_free (&lg_shiftland) ; \ - GrB_free (&lg_edge) ; \ - GrB_free (&lg_swap) ; \ - GrB_free (&hashed_edges) ; \ - GrB_free (&con) ; \ - GrB_free (&one8) ; \ - GrB_free (&x) ; \ - LAGraph_Free((void**)&indices, msg) ; \ - LAGraph_Free((void **) &dup_swaps, NULL); \ - FREE_LOOP ; \ -} - -#define LG_FREE_ALL \ -{ \ - /* free any workspace used here */ \ - LG_FREE_WORK ; \ - /* free all the output variable(s) */ \ - GrB_free(A_new) ; \ - /* take any other corrective action */ \ -} - -#include "LG_internal.h" -#include "LAGraphX.h" -void shift_and - (uint16_t *z, const uint16_t *x) - { - (*z) = (*x) & ((*x) << 8); - (*z) |= (*z) >> 8; - } -#define SHIFT_AND \ -"void shift_and \n"\ -" (uint16_t *z, const uint16_t *x) \n"\ -" { \n"\ -" (*z) = (*x) & ((*x) << 8); \n"\ -" (*z) |= (*z) >> 8; \n"\ -" }" - -#define INTTYPE "int64_t" -#define EDGE_TYPE "typedef struct { "INTTYPE" a; "INTTYPE" b; } edge_type;" - -typedef struct { - uint64_t a; - uint64_t b; -} edge_type64; -#define EDGE_TYPE64 \ -"typedef struct { uint64_t a; uint64_t b; } edge_type;" - -typedef struct { - uint64_t a; - uint64_t b; - uint64_t c; - uint64_t d; -} swap_type64; -#define SWAP_TYPE64 \ -"typedef struct { \n"\ -" uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n"\ -"}swap_type;" - -typedef struct { - uint32_t a; - uint32_t b; -} edge_type32; -#define EDGE_TYPE32 \ -"typedef struct { uint32_t a; uint32_t b; } edge_type;" - -typedef struct { - uint32_t a; - uint32_t b; - uint32_t c; - uint32_t d; -} swap_type32; -#define SWAP_TYPE32 \ -"typedef struct { \n"\ -" uint32_t a; uint32_t b; uint32_t c; uint32_t d; \n"\ -"}swap_type;" - -void swap_bc64 -(swap_type64 *z, const swap_type64 *x, GrB_Index I, GrB_Index J, const bool *y) -{ - memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. - if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; - if(I & 1) - { - uint64_t temp = z->d; - z->d = z->b; - z->b = temp; - } - else - { - uint64_t temp = z->c; - z->c = z->b; - z->b = temp; - } -} -void swap_bc32 -(swap_type32 *z, const swap_type32 *x, GrB_Index I, GrB_Index J, const bool *y) -{ - memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. - if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; - if(I & 1) - { - uint32_t temp = z->d; - z->d = z->b; - z->b = temp; - } - else - { - uint32_t temp = z->c; - z->c = z->b; - z->b = temp; - } -} -#define SWAP_BC64 \ -"void swap_bc \n"\ -"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ -"{ \n"\ -" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. \n"\ -" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ -" if(I & 1) \n"\ -" { \n"\ -" uint64_t temp = z->d; \n"\ -" z->d = z->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -" else \n"\ -" { \n"\ -" uint64_t temp = z->c; \n"\ -" z->c = z->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -"}" -#define SWAP_BC32 \ -"void swap_bc \n"\ -"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ -"{ \n"\ -" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety.\n"\ -" if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ -" if(I & 1) \n"\ -" { \n"\ -" uint32_t temp = z->d; \n"\ -" z->d = z->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -" else \n"\ -" { \n"\ -" uint32_t temp = z->c; \n"\ -" z->c = z->b; \n"\ -" z->b = temp; \n"\ -" } \n"\ -"}" - -// using xorshift, from https://en.wikipedia.org/wiki/Xorshift -// with a state of uint64_t, or xorshift64star. -void hash_edge64 -(uint64_t *z, const edge_type64 *x, const uint64_t *mask) -{ - (*z) = x->a ^ x->b; - (*z) ^= (*z) << 13; - (*z) ^= (*z) >> 7; - (*z) ^= (x->a < x->b)? x->a: x->b; - (*z) ^= (*z) << 17; - (*z) &= (*mask); -} -void hash_edge32 -(uint64_t *z, const edge_type32 *x, const uint64_t *mask) -{ - (*z) = x->a ^ x->b; - (*z) ^= (*z) << 13; - (*z) ^= (*z) >> 7; - (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); - (*z) ^= (*z) << 17; - (*z) &= (*mask); -} -#define HASH_EDGE \ -"void hash_edge \n"\ -"(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ -"{ \n"\ -" (*z) = x->a ^ x->b; \n"\ -" (*z) ^= (*z) << 13; \n"\ -" (*z) ^= (*z) >> 7; \n"\ -" (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); \n"\ -" (*z) ^= (*z) << 17; \n"\ -" (*z) &= (*mask); \n"\ -"}" - -void add_term - (int8_t *z, const int8_t *x, const int8_t *y) -{ - (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; -} -#define ADD_TERM \ -"void add_term \n"\ -"(int8_t *z, const int8_t *x, const int8_t *y) \n"\ -"{ \n"\ -" (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; \n"\ -"}" - -void edge2nd64_bool - (edge_type64 *z, const bool *x, const edge_type64 *y) -{ - z->a = y->a; - z->b = y->b; -} -void edge2nd32_bool - (edge_type32 *z, const bool *x, const edge_type32 *y) -{ - z->a = y->a; - z->b = y->b; -} -void edge2nd64_edge - (edge_type64 *z, const edge_type64 *x, const edge_type64 *y) -{ - z->a = y->a; - z->b = y->b; -} -void edge2nd32_edge - (edge_type32 *z, const edge_type32 *x, const edge_type32 *y) -{ - z->a = y->a; - z->b = y->b; -} -#define EDGE2ND_BOOL \ -"void edge2 \n"\ -"(edge_type *z, const bool *x, const edge_type *y) \n"\ -"{ \n"\ -" //if(y->a == 0 && y->b == 0) return; \n"\ -" z->a = y->a; \n"\ -" z->b = y->b; \n"\ -"}" -#define EDGE2ND_EDGE \ -"void edge2 \n"\ -"(edge_type *z, const edge_type *x, const edge_type *y) \n"\ -"{ \n"\ -" //if(y->a == 0 && y->b == 0) return; \n"\ -" z->a = y->a; \n"\ -" z->b = y->b; \n"\ -"}" - -int LAGraph_SwapEdgesV2 -( - // output - GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped - // input: not modified - LAGraph_Graph G, - GrB_Index Q, // Swaps per edge - char *msg -) -{ - #if USING_GRAPHBLAS_V10 - //-------------------------------------------------------------------------- - // Declorations - //-------------------------------------------------------------------------- - GrB_Matrix A = NULL; // n x n Adjacency Matrix - GrB_Vector Ai = NULL, Aj = NULL; - // e x 1 vector, each entry is an edge. - GrB_Vector E_vec = NULL, E_temp = NULL; - - // swaps x 4 - // Each row contains 4 entries corresponding to the verticies - // that are involved in the swap. - GrB_Vector M = NULL; - GxB_Container con = NULL; - - // n = |V| e = |E| - GrB_Index n = 0, e = 0; - - // n x n - // Lower triangle of adjacency matrix - GrB_Matrix A_tril = NULL ; - - // e x 1 random vectors - GrB_Vector random_v = NULL, r_permute = NULL; - - // indicies for A - void *indices = NULL; - - GrB_Vector ramp_v = NULL; - - // edge permutation - GrB_Vector edge_perm = NULL; - bool iso = false; - - // Number of values kept in each phase - GrB_Index n_keep = 0, M_nvals = 0, dup_arr_size = 0; - - // swaps x 2 matrix which holds the hashes of each planned edge. - GrB_Vector new_hashed_edges = NULL; - - // e holds hashes of old edges - GrB_Vector hashed_edges = NULL; - - // 2^60 holds the buckets in which hashes collided. - GrB_Vector exists = NULL; - - GrB_UnaryOp lg_shiftland = NULL; - - // b1 <---> a2 or b1 <---> b2 - GrB_IndexUnaryOp swap_pair = NULL; - - // z = h_y(x) - GrB_BinaryOp hash_seed_e = NULL; - - // This monoid has only been designed for inputs in {0,1,2}, other behavior - // is undefined. - // (0,x) -> x, (1,1) -> 2, (2,x) -> 2 (and commutative) - // Aka z = min(2, x + y) - GrB_BinaryOp add_term_biop = NULL; - GrB_Monoid add_term_monoid = NULL; - GrB_Semiring plus_term_one = NULL; - - // z = y - GrB_BinaryOp second_edge = NULL; - GrB_BinaryOp second_bool_edge = NULL; - GrB_Monoid second_edge_monoid = NULL; - GrB_Semiring second_second_edge = NULL; - - // Toople types - GrB_Type lg_edge = NULL, lg_swap = NULL; - // Unload types - GrB_Type M_type = NULL, E_type = NULL, Ai_type = NULL, Aj_type = NULL; - int M_hand = 0, E_hand = 0; - - int16_t *dup_swaps = NULL; - GrB_Vector dup_swaps_v = NULL; - // BOOL swaps * 2 vector that holds false if an edge in the swap did not "work" - - GrB_Vector sort_h = NULL; - GrB_Vector r_60 = NULL; - - // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; - - // Constants --------------------------------------------------------------- - GrB_Vector x = NULL; - - GrB_Scalar one8 = NULL; - - GrB_Index ind_size = 0; - - //-------------------------------------------------------------------------- - // Check inputs TODO - //-------------------------------------------------------------------------- - LG_ASSERT_MSG ( - G->kind == LAGraph_ADJACENCY_UNDIRECTED, - LAGRAPH_INVALID_GRAPH, - "G must be undirected" - ) ; - // char type[LAGRAPH_MAX_NAME_LEN]; - LG_ASSERT_MSG (G->nself_edges == 0, LAGRAPH_NO_SELF_EDGES_ALLOWED, - "G->nself_edges must be zero") ; - LG_ASSERT (A_new != NULL, GrB_NULL_POINTER) ; - // GRB_TRY (GxB_Matrix_type(&E_type, A)) ; - // LG_ASSERT_MSG (E_type == GrB_BOOL || , LAGRAPH_INVALID_GRAPH, - // "A must be structural") ; - - //-------------------------------------------------------------------------- - // Initializations - //-------------------------------------------------------------------------- - A = G->A ; - - //-------------------------------------------------------------------------- - // Extract edges from A - //-------------------------------------------------------------------------- - - GRB_TRY (GrB_Matrix_nrows (&n, A)) ; - GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; - GRB_TRY (GrB_Vector_new(&Ai, GrB_BOOL, 0)) ; - GRB_TRY (GrB_Vector_new(&Aj, GrB_BOOL, 0)) ; - - // Extract lower triangular edges - GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; - GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; - int codei = 0, codej = 0; - GRB_TRY (GxB_Vector_type(&Ai_type, Ai)) ; - GrB_get(Ai, &codei, GrB_EL_TYPE_CODE); - GrB_get(Aj, &codej, GrB_EL_TYPE_CODE); - - LG_ASSERT_MSG ( - codei == codej, GrB_INVALID_VALUE, - "extractTuples_Vector returned different types for Ai and Aj" - ) ; - GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - - //-------------------------------------------------------------------------- - // Initialize all operators and types - //-------------------------------------------------------------------------- - if(codei == GrB_UINT32_CODE) // Use uint32 if possible - { - GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type32), "edge_type", EDGE_TYPE32)) ; - GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type32), "swap_type", SWAP_TYPE32)) ; - GRB_TRY(GxB_BinaryOp_new( - &hash_seed_e, (GxB_binary_function) (&hash_edge32), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE - )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_pair, (GxB_index_unary_function) (&swap_bc32), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC32 - )) ; - GRB_TRY(GxB_BinaryOp_new( - &second_edge, (GxB_binary_function) (&edge2nd32_edge), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE - )) ; - GRB_TRY(GxB_BinaryOp_new( - &second_bool_edge, (GxB_binary_function) (&edge2nd32_bool), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL - )) ; - } - else //uint64 types - { - GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type64), "edge_type", EDGE_TYPE64)) ; - GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type64), "swap_type", SWAP_TYPE64)) ; - GRB_TRY(GxB_BinaryOp_new( - &hash_seed_e, (GxB_binary_function) (&hash_edge64), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE - )) ; - GRB_TRY (GxB_IndexUnaryOp_new ( - &swap_pair, (GxB_index_unary_function) (&swap_bc64), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC64 - )) ; - GRB_TRY(GxB_BinaryOp_new( - &add_term_biop, (GxB_binary_function) (&add_term), - GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM - )) ; - GRB_TRY(GxB_BinaryOp_new( - &second_edge, (GxB_binary_function) (&edge2nd64_edge), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE - )) ; - GRB_TRY(GxB_BinaryOp_new( - &second_bool_edge, (GxB_binary_function) (&edge2nd64_bool), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL - )) ; - } - - GRB_TRY (GxB_UnaryOp_new ( - &lg_shiftland, (GxB_unary_function) (&shift_and), - GrB_UINT16, GrB_UINT16, "shift_and", SHIFT_AND - )) ; - GRB_TRY(GxB_BinaryOp_new( - &add_term_biop, (GxB_binary_function) (&add_term), - GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM - )) ; - - GRB_TRY (GxB_Monoid_terminal_new_INT8( - &add_term_monoid, add_term_biop, (int8_t) 0, (int8_t) 2 - )) ; - - edge_type64 iden_second = {0,0}; - GRB_TRY (GrB_Monoid_new_UDT( - &second_edge_monoid, second_edge, (void *) &iden_second - )) ; - - GRB_TRY(GrB_Semiring_new( - &plus_term_one, add_term_monoid, GrB_ONEB_INT8 - )) ; - GRB_TRY(GrB_Semiring_new( - &second_second_edge, second_edge_monoid, second_bool_edge - )) ; - - //-------------------------------------------------------------------------- - // Make E Vector - //-------------------------------------------------------------------------- - - GRB_TRY (GrB_Vector_new(&E_vec, Ai_type, 2 * e)) ; - - // Filling out E_vec helps assign be much quicker. - GRB_TRY (GrB_assign( - E_vec, NULL, NULL, 0, GrB_ALL, 0, NULL)); - GrB_Index stride[] = {(GrB_Index) 0, e * 2 - 1, (GrB_Index) 2} ; - - // Shuffle i and j into E_vec. - GRB_TRY (GrB_Vector_assign( - E_vec, NULL, NULL, Aj, stride, GxB_STRIDE, NULL)) ; - stride[GxB_BEGIN] = 1; - GRB_TRY (GrB_Vector_assign( - E_vec, NULL, NULL, Ai, stride, GxB_STRIDE, NULL)) ; - - // Reinterpret E_vec as a vector of tuples. - GRB_TRY (GxB_Vector_unload( - E_vec, &indices, &E_type, &e, &ind_size, &E_hand, NULL)); - e /= 2; - GRB_TRY (GxB_Vector_load( - E_vec, &indices, lg_edge, e, ind_size, E_hand, NULL)); - - // Find Hash Size - int shift_e ; - #if (!( defined ( __NVCC__) || defined ( __INTEL_CLANG_COMPILER) || \ - defined ( __INTEL_COMPILER) ) && defined ( _MSC_VER )) - // using the built-in Microsoft Windows compiler - // use ceil, log2, etc - shift_e = 63 - (int) floor (log2 ((double) e)) ; - #else - shift_e = __builtin_clzl(e); - #endif - uint64_t ehash_size = (1ull << (67-shift_e)) ; - printf("Hash Size: %ld\n", ehash_size); - - //-------------------------------------------------------------------------- - // Initialize the rest of the vectors - //-------------------------------------------------------------------------- - - // Hash values and buckets - GRB_TRY (GrB_Vector_new(&exists, GrB_INT8, ehash_size)) ; - GRB_TRY (GrB_Vector_new(&hashed_edges, GrB_UINT64, e)) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - - // Ramp - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_UINT64, e + 1)) ; - GRB_TRY (GrB_Vector_assign_UINT64 (ramp_v, NULL, NULL, 0, GrB_ALL, 0, NULL)) ; - GRB_TRY (GrB_Vector_apply_IndexOp_UINT64 (ramp_v, NULL, NULL, - GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - GrB_Index ramp_size; - - // Constants - GRB_TRY (GrB_Scalar_new (&one8, GrB_UINT8)) ; - GRB_TRY (GrB_Scalar_setElement_UINT8 (one8, 1)) ; - GRB_TRY (GrB_Vector_new (&x, GrB_BOOL, e)) ; - - // Random Vector - GRB_TRY (GrB_Vector_new(&random_v, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_60, GrB_UINT64, e)) ; - GRB_TRY (GrB_Vector_new(&r_permute, GrB_UINT64, 1ull << (64-shift_e))) ; - GRB_TRY(GrB_set (r_permute, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - GRB_TRY (GrB_Vector_assign_UINT64 ( - random_v, NULL, NULL, 0, GrB_ALL, e, NULL)) ; - //TODO: Change seed - LG_TRY( - LAGraph_Random_Seed(random_v, 1548945616ul, msg)) ; - - printf("Entering loop, Good Luck:\n") ; - while(num_swaps < e * Q && num_attempts < e * Q * 5) - { - GrB_Index perm_size, arr_size, junk_size; - printf(EDGE_TYPE); - // r_60 has the random vector shifted by some amount. - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL - )) ; - GRB_TRY (GrB_Vector_clear(x)) ; - GRB_TRY (GrB_Vector_resize(x, e)) ; - GRB_TRY (GrB_Vector_assign_BOOL( - x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - LG_TRY (LAGraph_FastAssign( - r_permute, NULL, NULL, r_60, x, ramp_v, GxB_ANY_FIRSTJ_INT64, - NULL, msg)) ; - - GrB_Index edges_permed = 0; - GRB_TRY (GrB_Vector_nvals(&edges_permed, r_permute)) ; - GRB_TRY (GrB_Vector_new(&edge_perm, GrB_BOOL, edges_permed)) ; - GRB_TRY (GrB_Vector_extractTuples(NULL, edge_perm, r_permute, NULL)) ; - swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, edges_permed / 2) ; - - // Chose only the edges we need from edge_perm - GRB_TRY (GrB_Vector_resize(edge_perm, swaps_per_loop * 2)) ; - - // Get the desired edges from the E_vec array. - GRB_TRY (GrB_Vector_new(&M, lg_edge, swaps_per_loop * 2)) ; - GRB_TRY (GxB_Vector_extract_Vector( - M, NULL, NULL, E_vec, edge_perm, NULL - )) ; - - // Make the swaps via the swap_pair unary op. - GRB_TRY (GxB_Vector_unload( - M, (void **) &indices, &M_type, &M_nvals, &ind_size, &M_hand, - NULL - )) ; - GRB_TRY (GxB_Vector_load( - M, (void **) &indices, lg_swap, M_nvals / 2, ind_size, M_hand, NULL - )) ; - GRB_TRY (GrB_Vector_apply_IndexOp_BOOL( - M, NULL, NULL, swap_pair, M, false, NULL)) ; - GRB_TRY (GxB_Vector_unload( - M, (void **) &indices, &M_type, &M_nvals, &ind_size, &M_hand, - NULL - )) ; - GRB_TRY (GxB_Vector_load( - M, (void **) &indices, lg_edge, M_nvals * 2, ind_size, M_hand, - NULL - )) ; - - // Hash Edges ---------------------------------------------------------- - GRB_TRY (GrB_Vector_new( - &new_hashed_edges, GrB_UINT64, swaps_per_loop * 2)) ; - - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - new_hashed_edges, NULL, NULL, hash_seed_e, M, - ehash_size - 1ll, NULL - )) ; - GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( - hashed_edges, NULL, NULL, hash_seed_e, E_vec, - ehash_size - 1ll, NULL - )) ; - - //---------------------------------------------------------------------- - // Build Hash Buckets - //---------------------------------------------------------------------- - - GRB_TRY (GrB_Vector_new(&dup_swaps_v, GrB_INT8, swaps_per_loop * 2)) ; - GRB_TRY (GrB_set(dup_swaps_v, GxB_BITMAP, GxB_SPARSITY_CONTROL)) ; - - GRB_TRY (GrB_Vector_clear(x)) ; - GRB_TRY (GrB_Vector_resize(x, e)) ; - GRB_TRY (GrB_Vector_assign_BOOL( - x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - // place a one in any bucket that coresponds to an edge currently in E - LG_TRY (LAGraph_FastAssign( - exists, NULL, NULL, hashed_edges, x, ramp_v, GxB_ANY_PAIR_UINT8, - NULL, msg - )) ; - - GRB_TRY (GrB_Vector_clear(x)) ; - GRB_TRY (GrB_Vector_resize(x, swaps_per_loop * 2)) ; - GRB_TRY (GrB_Vector_assign_BOOL( - x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - - // exists cannot possibly be full at this point. - // Fill out exists in O(1) time. - GRB_TRY (GxB_Container_new(&con)) ; - GRB_TRY (GxB_unload_Vector_into_Container(exists, con, NULL)) ; - // Sanity check - LG_ASSERT (con->format == GxB_BITMAP, GrB_INVALID_VALUE) ; - GrB_free(&exists); - exists = con->b; - con->b = NULL; - GRB_TRY (GrB_free(&con)) ; - // exist has to be full at this point - confirmed by fprint - // GxB_print(exists, GxB_SUMMARY); - - // "Count" all of the edges that fit into each bucket. Stop counting at - // 2 since we will have to throw that whole bucket away anyway. - LG_TRY (LAGraph_FastAssign( - exists, NULL, add_term_biop, new_hashed_edges, x, ramp_v, - plus_term_one, NULL, msg - )) ; - GRB_TRY(GrB_set (exists, GxB_BITMAP | GxB_FULL, GxB_SPARSITY_CONTROL)) ; - // Select buckets with only one corresponding value - GRB_TRY (GrB_Vector_select_INT8( - exists, NULL, NULL, GrB_VALUEEQ_UINT8, exists, (int8_t) 1, - NULL - )) ; - - // Find each hashed edge's bucket, dup_swaps_v is 1 if exists[edge] = 1 - // LG_TRY (LAGraph_FastAssign( - // dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, - // GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg - // )) ; - GRB_TRY (GxB_Vector_extract_Vector( - dup_swaps_v, NULL, NULL, exists, new_hashed_edges, NULL)) ; - - // Fill out dup_swaps_v in O(1) time. - GRB_TRY (GxB_Container_new(&con)) ; - GRB_TRY (GxB_unload_Vector_into_Container(dup_swaps_v, con, NULL)) ; - n_keep = con->nvals; - GRB_TRY (GrB_free(&dup_swaps_v)); - dup_swaps_v = con->b; - con->b = NULL; - GRB_TRY (GrB_free(&con)) ; - GRB_TRY (GxB_Vector_unload( - dup_swaps_v, (void **) &dup_swaps, &M_type, &M_nvals, &dup_arr_size, - &M_hand, NULL)) ; - GRB_TRY (GxB_Vector_load( - dup_swaps_v, (void **) &dup_swaps, GrB_INT16, M_nvals / 2, - dup_arr_size, M_hand, NULL)) ; - GRB_TRY (GrB_apply( - dup_swaps_v, NULL, NULL, lg_shiftland, dup_swaps_v, NULL)) ; - GRB_TRY (GxB_Vector_unload( - dup_swaps_v, (void **) &dup_swaps, &M_type, &M_nvals, &dup_arr_size, - &M_hand, NULL)) ; - GRB_TRY (GxB_Vector_load( - dup_swaps_v, (void **) &dup_swaps, GrB_INT8, M_nvals * 2, - dup_arr_size, M_hand, NULL)) ; - - GRB_TRY (GrB_Vector_clear(exists)) ; - // --------------------------------------------------------------------- - // Place Good Swaps back into E_vec - // --------------------------------------------------------------------- - - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,1) - GRB_TRY (GxB_Container_new(&con)) ; - GRB_TRY (GxB_unload_Vector_into_Container(M, con, NULL)) ; - GRB_TRY (GrB_free(&(con->b))) ; - con->b = dup_swaps_v; - con->nvals = n_keep; - con->format = GxB_BITMAP; - dup_swaps_v = NULL; - GRB_TRY (GxB_load_Vector_from_Container(M, con, NULL)) ; - GRB_TRY (GrB_free(&con)) ; - GRB_TRY (LAGraph_FastAssign( - E_vec, NULL, second_edge, edge_perm, M, ramp_v, - second_second_edge, NULL, msg)) ; - #else // Fix for old saxpy4 bug - GRB_TRY(GxB_Vector_subassign_Vector( - E_vec, dup_swaps_v, NULL, M, edge_perm, NULL)); - #endif - - - n_keep /= 2; - - FREE_LOOP ; // Free Matricies that have to be rebuilt - - // Adjust number of swaps to do next. - num_attempts += swaps_per_loop ; - num_swaps += n_keep ; - swaps_per_loop = n_keep * 3 ; - swaps_per_loop = LAGRAPH_MAX(swaps_per_loop, 16) ; - swaps_per_loop = LAGRAPH_MIN(swaps_per_loop, e / 3) ; - - LG_TRY (LAGraph_Random_Next(random_v, msg)) ; - printf("#####Made %ld swaps. Total %ld out of %ld."\ - "Attempting %ld swaps next.#####\n\n", - n_keep, num_swaps, e * Q, swaps_per_loop) ; - } - GRB_TRY (GxB_Vector_unload( - E_vec, (void **) &indices, &lg_edge, &e, &ind_size, &E_hand, NULL)); - GRB_TRY (GxB_Vector_load( - E_vec, (void **) &indices, E_type, e * 2, ind_size, E_hand, NULL)); - GRB_TRY (GrB_Vector_extract( - Aj, NULL, NULL, E_vec, stride, GxB_STRIDE, NULL)); - stride[GxB_BEGIN] = 0; - GRB_TRY (GrB_Vector_extract( - Ai, NULL, NULL, E_vec, stride, GxB_STRIDE, NULL)); - // Build Output Matrix - GRB_TRY(GrB_Matrix_new(A_new, GrB_BOOL, n, n)) ; - GRB_TRY (GxB_Matrix_build_Scalar_Vector(*A_new, Ai, Aj, one8, NULL)) ; - GRB_TRY (GrB_eWiseAdd( - *A_new, NULL, NULL, GrB_LOR_MONOID_BOOL, *A_new,*A_new, GrB_DESC_T0 - )) ; - - LG_FREE_WORK ; - return (GrB_SUCCESS) ; - #else - printf("LAGraph_SwapEdgesV2 Needs GB v10\n") ; - return (GrB_NOT_IMPLEMENTED) ; - #endif -} diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 5a00553393..0426eff3e9 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ const char* tests [ ] = } ; void test_SwapEdges (void) { + #if USING_GRAPHBLAS_V10 //-------------------------------------------------------------------------- // start LAGraph //-------------------------------------------------------------------------- @@ -100,11 +102,7 @@ void test_SwapEdges (void) //---------------------------------------------------------------------- GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) - OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); - #else OK(LAGraph_SwapEdgesV2( &A_new, G, (GrB_Index) 100, msg)); - #endif GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("Test ends:\n") ; @@ -144,6 +142,7 @@ void test_SwapEdges (void) //-------------------------------------------------------------------------- LAGraph_Random_Finalize(msg); LAGraph_Finalize (msg) ; + #endif } //---------------------------------------------------------------------------- From c0f0e476f3f1ad5bc32d9245195116314359a880 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 27 Apr 2025 20:38:36 -0500 Subject: [PATCH 107/115] renamed function and changed demo call --- experimental/algorithm/LAGraph_SwapEdges.c | 4 ++-- experimental/benchmark/SwapEdges_demo.c | 4 ---- experimental/test/test_SwapEdges.c | 2 +- include/LAGraphX.h | 10 ---------- 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index d812a9c428..9fcd3f051b 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -288,7 +288,7 @@ void edge2nd32_edge " z->b = y->b; \n"\ "}" -int LAGraph_SwapEdgesV2 +int LAGraph_SwapEdges ( // output GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped @@ -784,7 +784,7 @@ int LAGraph_SwapEdgesV2 LG_FREE_WORK ; return (GrB_SUCCESS) ; #else - printf("LAGraph_SwapEdgesV2 Needs GB v10\n") ; + printf("LAGraph_SwapEdges Needs GB v10\n") ; return (GrB_NOT_IMPLEMENTED) ; #endif } diff --git a/experimental/benchmark/SwapEdges_demo.c b/experimental/benchmark/SwapEdges_demo.c index 313d7e4627..129f524ec7 100644 --- a/experimental/benchmark/SwapEdges_demo.c +++ b/experimental/benchmark/SwapEdges_demo.c @@ -83,11 +83,7 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf("Time To Swap #################################################") ; t = LAGraph_WallClockTime ( ) ; - #if GxB_IMPLEMENTATION < GxB_VERSION (10,0,0) LG_TRY (LAGraph_SwapEdges (&Y, G, swaps, msg)) ; - #else - LG_TRY (LAGraph_SwapEdgesV2 (&Y, G, swaps, msg)) ; - #endif t = LAGraph_WallClockTime ( ) - t ; printf ("===============================LAGraph_SwapEdges took: %g sec\n", t) ; diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 0426eff3e9..6d76b49d03 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -102,7 +102,7 @@ void test_SwapEdges (void) //---------------------------------------------------------------------- GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_SwapEdgesV2( &A_new, G, (GrB_Index) 100, msg)); + OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("Test ends:\n") ; diff --git a/include/LAGraphX.h b/include/LAGraphX.h index bce180ae8f..dc98b6e89b 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1442,16 +1442,6 @@ int LAGraph_SwapEdges char *msg ) ; -int LAGraph_SwapEdgesV2 -( - // output - GrB_Matrix *A_new, //The adjacency matrix of G with edges randomly swapped - // input: not modified - LAGraph_Graph G, - GrB_Index Q, // Swaps per edge - char *msg -) ; - LAGRAPHX_PUBLIC int LAGraph_RichClubCoefficient_NoGB ( From e430c2c7528536996f583f0f86a2e704d769ca90 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Mon, 28 Apr 2025 15:23:39 -0500 Subject: [PATCH 108/115] Moved out the rcc checker --- .vscode/settings.json | 5 +- .../algorithm/LAGraph_RichClubCoefficient.c | 259 ----------------- experimental/benchmark/rcc_demo.c | 2 +- experimental/test/LG_check_RCC.c | 270 ++++++++++++++++++ experimental/test/include/LG_Xtest.h | 7 + include/LAGraphX.h | 8 - 6 files changed, 281 insertions(+), 270 deletions(-) create mode 100644 experimental/test/LG_check_RCC.c diff --git a/.vscode/settings.json b/.vscode/settings.json index 14cf1033e0..2e1ef5fe9f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,7 @@ { "files.associations": { "lg_internal.h": "c", - "random": "c" - } + "random": "c", + "lg_test.h": "c" +} } \ No newline at end of file diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 5b6dc00a06..62ecdc74c8 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -397,262 +397,3 @@ int LAGraph_RichClubCoefficient LG_FREE_WORK ; return (GrB_SUCCESS) ; } -#undef LG_FREE_WORK -#undef LG_FREE_ALL -#define LG_FREE_WORK \ -{ \ - /* free any workspace used here */ \ - LAGraph_Free(&a_space, NULL) ; \ - GrB_free (&cont) ; \ - LAGraph_Free((void **)&Ai, NULL) ; \ - LAGraph_Free((void **)&Ap, NULL) ; \ - LAGraph_Free((void **)&slice, NULL) ; \ -} - - -#define LG_FREE_ALL \ -{ \ - /* free any workspace used here */ \ - LG_FREE_WORK ; \ - /* free all the output variable(s) */ \ - LAGraph_Free((void **)&rcc, NULL) ; \ - GrB_free (rccs) ; \ -} -#define TIMINGS -#ifdef TIMINGS -static void print_timings (const double timings [16]) -{ - double total = timings [0] + timings [1] + timings [2] + timings [3] + timings [4]; - printf ("RCC %12.6f (%4.1f%%) init\n", timings [0], 100. * timings [0] / total) ; - printf ("RCC %12.6f (%4.1f%%) counting edges\n", timings [1], 100. * timings [1] / total) ; - printf ("RCC %12.6f (%4.1f%%) counting nodes\n", timings [2], 100. * timings [2] / total) ; - printf ("RCC %12.6f (%4.1f%%) cumulative sum\n", timings [3], 100. * timings [3] / total) ; - printf ("RCC %12.6f (%4.1f%%) calculation\n", timings [4], 100. * timings [4] / total) ; -} -#endif - -//Scuffed upperbound function -static int64_t LG_binary_search // returns upperbound - 1 -( - const int64_t pivot, - const int64_t *LG_RESTRICT X_0, // search in X [p_start..p_end_-1] - const int64_t p_start, - const int64_t p_end -) -{ - - //-------------------------------------------------------------------------- - // find where the Pivot appears in X - //-------------------------------------------------------------------------- - - // binary search of X [p_start...p_end-1] for the Pivot - int64_t pleft = p_start ; - int64_t pright = p_end; - while (pleft < pright) - { - int64_t pmiddle = pleft + (pright - pleft) / 2 ; - bool less = (X_0 [pmiddle] < pivot) ; - pleft = less ? pmiddle + 1 : pleft ; - pright = less ? pright : pmiddle ; - } - if(X_0[pleft] <= pivot) - pleft++; - return (--pleft) ; -} - - -int LAGraph_RichClubCoefficient_NoGB -( - // output: - //rccs(i): rich club coefficent of i - GrB_Vector *rccs, - - // input: - LAGraph_Graph G, //input graph - char *msg -) -{ - #if USING_GRAPHBLAS_V10 - GxB_Container cont = NULL; - GrB_Matrix A = G->A; - int64_t *Ap = NULL, *Ai = NULL; - void *a_space = NULL; - GrB_Type p_type = NULL, i_type = NULL; - int p_hand = 0, i_hand = 0; - int n_threads = LG_nthreads_outer * LG_nthreads_inner; - uint64_t p_n = 0, i_n = 0, p_size = 0, i_size = 0, max_deg = 0; - uint64_t *epd = NULL, *vpd = NULL; - int64_t *LG_RESTRICT slice = NULL; - double *rcc = NULL; - #ifdef TIMINGS - double timings [16] ; - memset(timings, 0, 16*sizeof(double)) ; - double tic = LAGraph_WallClockTime ( ) ; - LG_SET_BURBLE (false) ; - #endif - - //-------------------------------------------------------------------------- - // Check inputs - //-------------------------------------------------------------------------- - LG_TRY (LAGraph_CheckGraph (G, msg)) ; - LG_ASSERT (rccs != NULL, GrB_NULL_POINTER); - - LG_ASSERT_MSG( - G->kind == LAGraph_ADJACENCY_UNDIRECTED, GrB_INVALID_VALUE, - "G->A must be symmetric") ; - LG_ASSERT_MSG( - G->is_symmetric_structure == LAGraph_TRUE, GrB_INVALID_VALUE, - "G->A must be symmetric") ; - LG_ASSERT_MSG (G->out_degree != NULL, GrB_EMPTY_OBJECT, - "G->out_degree must be defined") ; - LG_ASSERT_MSG (G->nself_edges == 0, GrB_INVALID_VALUE, - "G->nself_edges must be zero") ; - GRB_TRY(GxB_Container_new(&cont)) ; - GRB_TRY(GxB_unload_Matrix_into_Container(A, cont, NULL)) ; - LG_ASSERT_MSG(cont->format == GxB_SPARSE, GrB_NOT_IMPLEMENTED, - "Matrix must be sparse") ; - LG_TRY (LAGraph_Malloc( - (void **) &Ap, cont->nvals, sizeof(uint64_t), NULL)) ; - LG_TRY (LAGraph_Malloc( - (void **) &Ai, cont->nvals + 1, sizeof(uint64_t), NULL)) ; - p_n = cont->nvals + 1; i_n = cont->nvals; - GRB_TRY (GrB_Vector_extractTuples_INT64( - NULL, Ap, &p_n, cont->p)) ; - GRB_TRY (GrB_Vector_extractTuples_INT64( - NULL, Ai, &i_n, cont->i)) ; - GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; - GRB_TRY (GrB_Vector_reduce_INT64( - &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; - int64_t i = 0; - #ifdef TIMINGS - timings[0] = LAGraph_WallClockTime ( ); - #endif - LG_TRY (LAGraph_Calloc(&a_space, max_deg * 2, sizeof(uint64_t), NULL)) ; - LG_TRY (LAGraph_Malloc((void **)&slice, n_threads + 1, sizeof(int64_t), NULL)) ; - epd = a_space ; - vpd = a_space + max_deg * sizeof(uint64_t) ; - LG_TRY (LAGraph_Malloc((void **) &rcc, max_deg, sizeof(double), NULL)) ; - // while(ptr < p_n - 1) - // { - // uint64_t dp = Ap[ptr+1] - Ap[ptr]; - // for(; Ap[ptr + 1] > i; ++i) - // { - // uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]] ; - // epd[dp - 1] += (dp < di) + (dp <= di) ; - // } - // if (dp > 0) - // ++vpd[dp - 1] ; - // ++ptr ; - // } - LG_eslice (slice, i_n, n_threads) ; - #pragma omp parallel for num_threads(n_threads) schedule(static, 1) private(i) - for (int tid = 0 ; tid < n_threads ; tid++) - { - int64_t loc_sum = 0, dp = 0; - int64_t loc_arr[1024]; - memset(loc_arr, 0, 1024 * sizeof(int64_t)); - i = slice[tid]; - int64_t ptr = LG_binary_search(i, Ap, 0, p_n - 1) ; - while(i < slice[tid + 1]) - { - while(Ap[ptr + 1] <= i) ++ptr; - int64_t dp = Ap[ptr + 1] - Ap[ptr]; - if(dp <= 1024) - for(; i < slice[tid + 1] && i < Ap[ptr + 1]; ++i) - { - uint64_t di = Ap[Ai[i] + 1] - Ap[Ai[i]]; - loc_arr[dp - 1] += (dp < di) + (dp <= di); - } - else - { - loc_sum = 0; - for(; i < slice[tid + 1] && i < Ap[ptr + 1]; ++i) - { - uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]]; - loc_sum += (dp < di) + (dp <= di); - } - #pragma omp atomic - epd[dp - 1] += loc_sum ; - } - } - #pragma omp critical - { - for(int64_t j = 0; j < 1024 && j < max_deg; ++j) - { - epd[j] += loc_arr[j]; - } - } - } - #ifdef TIMINGS - timings[1] = LAGraph_WallClockTime ( ); - #endif - - #pragma omp parallel - { - int64_t loc_arr[1024]; - memset(loc_arr, 0, 1024 * sizeof(int64_t)); - #pragma omp for schedule(static) - for(i = 0; i < p_n - 1; ++i) - { - int64_t dp = Ap[i + 1] - Ap[i] - 1; - if(dp < 0) continue; - if(dp < 1024) - { - ++loc_arr[dp]; - } - else - { - #pragma omp atomic - ++vpd[dp]; - } - } - #pragma omp critical - { - for(int64_t j = 0; j < 1024 && j < max_deg; ++j) - { - vpd[j] += loc_arr[j]; - } - } - } - - #ifdef TIMINGS - timings[2] = LAGraph_WallClockTime ( ); - #endif - //run a cummulative sum (backwards) - for(i = max_deg - 1; i > 0; --i) - { - vpd[i-1] += vpd[i] ; - epd[i-1] += epd[i] ; - } - #ifdef TIMINGS - timings[3] = LAGraph_WallClockTime ( ); - #endif - #pragma omp parallel for schedule(static) - for(i = 0; i < max_deg; ++i) - { - rcc[i] = ((double)epd[i]) / ((double)vpd[i] * ((double) vpd[i] - 1.0)) ; - } - #ifdef TIMINGS - timings[4] = LAGraph_WallClockTime ( ); - timings[4] -= timings[3]; - timings[3] -= timings[2]; - timings[2] -= timings[1]; - timings[1] -= timings[0]; - timings[0] -= tic; - - print_timings(timings); - LG_SET_BURBLE(false); - #endif - epd = vpd = NULL; - GRB_TRY (GrB_Vector_new(rccs, GrB_FP64, max_deg)); - GRB_TRY (GxB_Vector_load( - *rccs, (void **) &rcc, GrB_FP64, max_deg, max_deg * sizeof(double), - GrB_DEFAULT, NULL)) ; - LG_FREE_WORK ; - return (GrB_SUCCESS) ; - #else - printf("LAGraph_RichClubCoefficient_NoGB needs GB v10\n") ; - return (GrB_NOT_IMPLEMENTED) ; - #endif -} -#undef TIMINGS diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index ffccd079dc..ace3cfa785 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -102,7 +102,7 @@ int main (int argc, char **argv) LG_TRY (LAGraph_Cached_OutDegree (G, msg)) ; printf ("\n========================== Start RCC ==========================\n") ; t = LAGraph_WallClockTime ( ) ; - result = LAGraph_RichClubCoefficient_NoGB (&rcc2, G, msg) ; + result = LG_check_rcc (&rcc2, G, msg) ; t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_RichClubCoefficient: %g sec\n", t) ; #endif diff --git a/experimental/test/LG_check_RCC.c b/experimental/test/LG_check_RCC.c new file mode 100644 index 0000000000..4617379ca6 --- /dev/null +++ b/experimental/test/LG_check_RCC.c @@ -0,0 +1,270 @@ +//------------------------------------------------------------------------------ +// LG_check_rcc: A hand coded RCC algorithm for CSR matircies. +//------------------------------------------------------------------------------ + +// LAGraph, (c) 2019-2022 by The LAGraph Contributors, All Rights Reserved. +// SPDX-License-Identifier: BSD-2-Clause +// +// For additional details (including references to third party source code and +// other files) see the LICENSE file or contact permission@sei.cmu.edu. See +// Contributors.txt for a full list of contributors. Created, in part, with +// funding and support from the U.S. Government (see Acknowledgments.txt file). +// DM22-0790 + +// Contributed by Gabriel Gomez, Texas A&M University + +//------------------------------------------------------------------------------ + +#include +#include "LG_internal.h" +#include "LG_test.h" +#include "LG_Xtest.h" + +#undef LG_FREE_WORK +#undef LG_FREE_ALL + +#define LG_FREE_WORK \ +{ \ + /* free any workspace used here */ \ + LAGraph_Free(&a_space, NULL) ; \ + GrB_free (&cont) ; \ + LAGraph_Free((void **)&Ai, NULL) ; \ + LAGraph_Free((void **)&Ap, NULL) ; \ + LAGraph_Free((void **)&slice, NULL) ; \ +} + +#define LG_FREE_ALL \ +{ \ + /* free any workspace used here */ \ + LG_FREE_WORK ; \ + /* free all the output variable(s) */ \ + LAGraph_Free((void **)&rcc, NULL) ; \ + GrB_free (rccs) ; \ +} +#define TIMINGS +#ifdef TIMINGS +static void print_timings (const double timings [16]) +{ + double total = timings [0] + timings [1] + timings [2] + timings [3] + timings [4]; + printf ("RCC %12.6f (%4.1f%%) init\n", timings [0], 100. * timings [0] / total) ; + printf ("RCC %12.6f (%4.1f%%) counting edges\n", timings [1], 100. * timings [1] / total) ; + printf ("RCC %12.6f (%4.1f%%) counting nodes\n", timings [2], 100. * timings [2] / total) ; + printf ("RCC %12.6f (%4.1f%%) cumulative sum\n", timings [3], 100. * timings [3] / total) ; + printf ("RCC %12.6f (%4.1f%%) calculation\n", timings [4], 100. * timings [4] / total) ; +} +#endif + +//Scuffed upperbound function +static int64_t LG_binary_search // returns upperbound - 1 +( + const int64_t pivot, + const int64_t *LG_RESTRICT X_0, // search in X [p_start..p_end_-1] + const int64_t p_start, + const int64_t p_end +) +{ + + //-------------------------------------------------------------------------- + // find where the Pivot appears in X + //-------------------------------------------------------------------------- + + // binary search of X [p_start...p_end-1] for the Pivot + int64_t pleft = p_start ; + int64_t pright = p_end; + while (pleft < pright) + { + int64_t pmiddle = pleft + (pright - pleft) / 2 ; + bool less = (X_0 [pmiddle] < pivot) ; + pleft = less ? pmiddle + 1 : pleft ; + pright = less ? pright : pmiddle ; + } + if(X_0[pleft] <= pivot) + pleft++; + return (--pleft) ; +} + + +int LG_check_rcc + +( + // output: + //rccs(i): rich club coefficent of i + GrB_Vector *rccs, + + // input: + LAGraph_Graph G, //input graph + char *msg +) +{ + #if USING_GRAPHBLAS_V10 + GxB_Container cont = NULL; + GrB_Matrix A = G->A; + int64_t *Ap = NULL, *Ai = NULL; + void *a_space = NULL; + GrB_Type p_type = NULL, i_type = NULL; + int p_hand = 0, i_hand = 0; + int n_threads = LG_nthreads_outer * LG_nthreads_inner; + uint64_t p_n = 0, i_n = 0, p_size = 0, i_size = 0, max_deg = 0; + uint64_t *epd = NULL, *vpd = NULL; + int64_t *LG_RESTRICT slice = NULL; + double *rcc = NULL; + #ifdef TIMINGS + double timings [16] ; + memset(timings, 0, 16*sizeof(double)) ; + double tic = LAGraph_WallClockTime ( ) ; + LG_SET_BURBLE (false) ; + #endif + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + LG_TRY (LAGraph_CheckGraph (G, msg)) ; + LG_ASSERT (rccs != NULL, GrB_NULL_POINTER); + + LG_ASSERT_MSG( + G->kind == LAGraph_ADJACENCY_UNDIRECTED, GrB_INVALID_VALUE, + "G->A must be symmetric") ; + LG_ASSERT_MSG( + G->is_symmetric_structure == LAGraph_TRUE, GrB_INVALID_VALUE, + "G->A must be symmetric") ; + LG_ASSERT_MSG (G->out_degree != NULL, GrB_EMPTY_OBJECT, + "G->out_degree must be defined") ; + LG_ASSERT_MSG (G->nself_edges == 0, GrB_INVALID_VALUE, + "G->nself_edges must be zero") ; + GRB_TRY(GxB_Container_new(&cont)) ; + GRB_TRY(GxB_unload_Matrix_into_Container(A, cont, NULL)) ; + LG_ASSERT_MSG(cont->format == GxB_SPARSE, GrB_NOT_IMPLEMENTED, + "Matrix must be sparse") ; + LG_TRY (LAGraph_Malloc( + (void **) &Ap, cont->nvals, sizeof(uint64_t), NULL)) ; + LG_TRY (LAGraph_Malloc( + (void **) &Ai, cont->nvals + 1, sizeof(uint64_t), NULL)) ; + p_n = cont->nvals + 1; i_n = cont->nvals; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, Ap, &p_n, cont->p)) ; + GRB_TRY (GrB_Vector_extractTuples_INT64( + NULL, Ai, &i_n, cont->i)) ; + GRB_TRY (GxB_load_Matrix_from_Container(A, cont, NULL)) ; + GRB_TRY (GrB_Vector_reduce_INT64( + &max_deg, NULL, GrB_MAX_MONOID_INT64, G->out_degree, NULL)) ; + int64_t i = 0; + #ifdef TIMINGS + timings[0] = LAGraph_WallClockTime ( ); + #endif + LG_TRY (LAGraph_Calloc(&a_space, max_deg * 2, sizeof(uint64_t), NULL)) ; + LG_TRY (LAGraph_Malloc((void **)&slice, n_threads + 1, sizeof(int64_t), NULL)) ; + epd = a_space ; + vpd = a_space + max_deg * sizeof(uint64_t) ; + LG_TRY (LAGraph_Malloc((void **) &rcc, max_deg, sizeof(double), NULL)) ; + LG_eslice (slice, i_n, n_threads) ; + #pragma omp parallel for num_threads(n_threads) schedule(static, 1) private(i) + for (int tid = 0 ; tid < n_threads ; tid++) + { + int64_t loc_sum = 0, dp = 0; + int64_t loc_arr[1024]; + memset(loc_arr, 0, 1024 * sizeof(int64_t)); + i = slice[tid]; + int64_t ptr = LG_binary_search(i, Ap, 0, p_n - 1) ; + while(i < slice[tid + 1]) + { + while(Ap[ptr + 1] <= i) ++ptr; + int64_t dp = Ap[ptr + 1] - Ap[ptr]; + if(dp <= 1024) + for(; i < slice[tid + 1] && i < Ap[ptr + 1]; ++i) + { + uint64_t di = Ap[Ai[i] + 1] - Ap[Ai[i]]; + loc_arr[dp - 1] += (dp < di) + (dp <= di); + } + else + { + loc_sum = 0; + for(; i < slice[tid + 1] && i < Ap[ptr + 1]; ++i) + { + uint64_t di = Ap[Ai[i]+1] - Ap[Ai[i]]; + loc_sum += (dp < di) + (dp <= di); + } + #pragma omp atomic + epd[dp - 1] += loc_sum ; + } + } + #pragma omp critical + { + for(int64_t j = 0; j < 1024 && j < max_deg; ++j) + { + epd[j] += loc_arr[j]; + } + } + } + #ifdef TIMINGS + timings[1] = LAGraph_WallClockTime ( ); + #endif + + #pragma omp parallel + { + int64_t loc_arr[1024]; + memset(loc_arr, 0, 1024 * sizeof(int64_t)); + #pragma omp for schedule(static) + for(i = 0; i < p_n - 1; ++i) + { + int64_t dp = Ap[i + 1] - Ap[i] - 1; + if(dp < 0) continue; + if(dp < 1024) + { + ++loc_arr[dp]; + } + else + { + #pragma omp atomic + ++vpd[dp]; + } + } + #pragma omp critical + { + for(int64_t j = 0; j < 1024 && j < max_deg; ++j) + { + vpd[j] += loc_arr[j]; + } + } + } + + #ifdef TIMINGS + timings[2] = LAGraph_WallClockTime ( ); + #endif + //run a cummulative sum (backwards) + for(i = max_deg - 1; i > 0; --i) + { + vpd[i-1] += vpd[i] ; + epd[i-1] += epd[i] ; + } + #ifdef TIMINGS + timings[3] = LAGraph_WallClockTime ( ); + #endif + #pragma omp parallel for schedule(static) + for(i = 0; i < max_deg; ++i) + { + rcc[i] = ((double)epd[i]) / ((double)vpd[i] * ((double) vpd[i] - 1.0)) ; + } + #ifdef TIMINGS + timings[4] = LAGraph_WallClockTime ( ); + timings[4] -= timings[3]; + timings[3] -= timings[2]; + timings[2] -= timings[1]; + timings[1] -= timings[0]; + timings[0] -= tic; + + print_timings(timings); + LG_SET_BURBLE(false); + #endif + epd = vpd = NULL; + GRB_TRY (GrB_Vector_new(rccs, GrB_FP64, max_deg)); + GRB_TRY (GxB_Vector_load( + *rccs, (void **) &rcc, GrB_FP64, max_deg, max_deg * sizeof(double), + GrB_DEFAULT, NULL)) ; + LG_FREE_WORK ; + return (GrB_SUCCESS) ; + #else + printf ("RCC not implemented for GraphBLAS versions under 10\n") ; + return (GrB_NOT_IMPLEMENTED) ; + #endif +} +#undef TIMINGS diff --git a/experimental/test/include/LG_Xtest.h b/experimental/test/include/LG_Xtest.h index 8e604f7bd4..90da1a2276 100644 --- a/experimental/test/include/LG_Xtest.h +++ b/experimental/test/include/LG_Xtest.h @@ -91,4 +91,11 @@ int LG_check_edgeBetweennessCentrality char *msg ) ; +int LG_check_rcc +( + GrB_Vector *rich_club_coefficents, //output + LAGraph_Graph G, //input graph + char *msg +) ; + #endif diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 2811ed0516..2a7f879bf5 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -1458,14 +1458,6 @@ int LAGraph_SwapEdges char *msg ) ; -LAGRAPHX_PUBLIC -int LAGraph_RichClubCoefficient_NoGB -( - GrB_Vector *rich_club_coefficents, //output - LAGraph_Graph G, //input graph - char *msg -) ; - LAGRAPHX_PUBLIC int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GxB extensions ( From 846c4712c5ec630a07f7df4c408fc29a2ba087f3 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Tue, 29 Apr 2025 12:42:48 -0500 Subject: [PATCH 109/115] include rcc check on demo --- experimental/benchmark/rcc_demo.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index ace3cfa785..7fb42bb08a 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -23,6 +23,8 @@ #include "../../src/benchmark/LAGraph_demo.h" #include "LAGraphX.h" #include "LG_internal.h" +#include "LG_Xtest.h" + void iseq(bool *z, const double *x, const double *y) { (*z) = (isnan(*x) && isnan(*y)) ||*x == *y ; From ae9d178d1c471cc92e84c40ee3784c4ad9f8a191 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Wed, 7 May 2025 13:27:41 -0500 Subject: [PATCH 110/115] LG_Random fixes and starting test cov --- .../algorithm/LAGraph_RichClubCoefficient.c | 4 +- experimental/algorithm/LAGraph_SwapEdges.c | 47 ++++--- experimental/algorithm/LG_CC_FastSV7_FA.c | 11 +- experimental/benchmark/FastAssign_demo.c | 6 +- experimental/benchmark/SwapEdges_demo.c | 2 - experimental/benchmark/rcc_demo.c | 1 - experimental/test/test_RichClubCoefficient.c | 115 +++++++++++++++++- experimental/test/test_SwapEdges.c | 7 +- experimental/utility/LAGraph_FastAssign.c | 9 +- include/LAGraphX.h | 8 +- 10 files changed, 171 insertions(+), 39 deletions(-) diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index 62ecdc74c8..e04590968c 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -276,11 +276,11 @@ int LAGraph_RichClubCoefficient GRB_TRY (GrB_apply ( ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; - LG_TRY (LAGraph_FastAssign ( + LG_TRY (LAGraph_FastAssign_Semiring ( edges_per_deg, NULL, GrB_PLUS_INT64, deg_x, node_edges_x, ramp_v, GxB_PLUS_SECOND_INT64, NULL, msg )) ; - LG_TRY (LAGraph_FastAssign ( + LG_TRY (LAGraph_FastAssign_Semiring ( verts_per_deg, NULL, GrB_PLUS_INT64, deg_x, ones_v, ramp_v, GxB_PLUS_PAIR_INT64, NULL, msg )) ; diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 9fcd3f051b..9e9b5b3d4f 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -380,7 +380,7 @@ int LAGraph_SwapEdges GrB_Vector r_60 = NULL; // count swaps - GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = e / 3 ; + GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = 0 ; // Constants --------------------------------------------------------------- GrB_Vector x = NULL; @@ -418,10 +418,33 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_new (&A_tril, GrB_BOOL, n, n)) ; GRB_TRY (GrB_Vector_new(&Ai, GrB_BOOL, 0)) ; GRB_TRY (GrB_Vector_new(&Aj, GrB_BOOL, 0)) ; - + // Extract lower triangular edges GRB_TRY (GrB_select (A_tril, NULL, NULL, GrB_TRIL, A, 0, NULL)) ; + GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; + swaps_per_loop = e / 3; GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; + // #ifdef COVERAGE + // GxB_fprint(Ai, GxB_SHORT, stdout) ; + // GxB_fprint(Aj, GxB_SHORT, stdout) ; + // if(n > 100) + // { + // // // Make Ai and Aj 64 bit + // GrB_Vector temp_i = NULL; + // GRB_TRY (GrB_Vector_new(&temp_i, GrB_INT64, e)) ; + // GRB_TRY (GrB_assign(temp_i, NULL, NULL, Ai, GrB_ALL, 0, NULL)) ; + // GRB_TRY (GrB_free(&Ai)) ; + // Ai = temp_i; + // temp_i = NULL; + // GRB_TRY (GrB_Vector_new(&temp_i, GrB_INT64, e)) ; + // GRB_TRY (GrB_assign(temp_i, NULL, NULL, Aj, GrB_ALL, 0, NULL)) ; + // GRB_TRY (GrB_free(&Aj)) ; + // Aj = temp_i; + // temp_i = NULL; + // } + // GxB_fprint(Ai, GxB_SHORT, stdout) ; + // GxB_fprint(Aj, GxB_SHORT, stdout) ; + // #endif int codei = 0, codej = 0; GRB_TRY (GxB_Vector_type(&Ai_type, Ai)) ; GrB_get(Ai, &codei, GrB_EL_TYPE_CODE); @@ -431,8 +454,6 @@ int LAGraph_SwapEdges codei == codej, GrB_INVALID_VALUE, "extractTuples_Vector returned different types for Ai and Aj" ) ; - GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; - //-------------------------------------------------------------------------- // Initialize all operators and types //-------------------------------------------------------------------------- @@ -473,10 +494,6 @@ int LAGraph_SwapEdges &swap_pair, (GxB_index_unary_function) (&swap_bc64), lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC64 )) ; - GRB_TRY(GxB_BinaryOp_new( - &add_term_biop, (GxB_binary_function) (&add_term), - GrB_INT8, GrB_INT8, GrB_INT8, "add_term", ADD_TERM - )) ; GRB_TRY(GxB_BinaryOp_new( &second_edge, (GxB_binary_function) (&edge2nd64_edge), lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE @@ -586,7 +603,6 @@ int LAGraph_SwapEdges while(num_swaps < e * Q && num_attempts < e * Q * 5) { GrB_Index perm_size, arr_size, junk_size; - printf(EDGE_TYPE); // r_60 has the random vector shifted by some amount. GRB_TRY (GrB_Vector_apply_BinaryOp2nd_UINT64( r_60, NULL, NULL, GxB_BSHIFT_UINT64, random_v, -(shift_e), NULL @@ -595,7 +611,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_resize(x, e)) ; GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; - LG_TRY (LAGraph_FastAssign( + LG_TRY (LAGraph_FastAssign_Semiring( r_permute, NULL, NULL, r_60, x, ramp_v, GxB_ANY_FIRSTJ_INT64, NULL, msg)) ; @@ -658,7 +674,7 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Vector_assign_BOOL( x, NULL, NULL, true, GrB_ALL, 0, NULL)) ; // place a one in any bucket that coresponds to an edge currently in E - LG_TRY (LAGraph_FastAssign( + LG_TRY (LAGraph_FastAssign_Semiring( exists, NULL, NULL, hashed_edges, x, ramp_v, GxB_ANY_PAIR_UINT8, NULL, msg )) ; @@ -683,7 +699,7 @@ int LAGraph_SwapEdges // "Count" all of the edges that fit into each bucket. Stop counting at // 2 since we will have to throw that whole bucket away anyway. - LG_TRY (LAGraph_FastAssign( + LG_TRY (LAGraph_FastAssign_Semiring( exists, NULL, add_term_biop, new_hashed_edges, x, ramp_v, plus_term_one, NULL, msg )) ; @@ -695,7 +711,7 @@ int LAGraph_SwapEdges )) ; // Find each hashed edge's bucket, dup_swaps_v is 1 if exists[edge] = 1 - // LG_TRY (LAGraph_FastAssign( + // LG_TRY (LAGraph_FastAssign_Semiring( // dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, // GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg // )) ; @@ -740,7 +756,7 @@ int LAGraph_SwapEdges dup_swaps_v = NULL; GRB_TRY (GxB_load_Vector_from_Container(M, con, NULL)) ; GRB_TRY (GrB_free(&con)) ; - GRB_TRY (LAGraph_FastAssign( + GRB_TRY (LAGraph_FastAssign_Semiring( E_vec, NULL, second_edge, edge_perm, M, ramp_v, second_second_edge, NULL, msg)) ; #else // Fix for old saxpy4 bug @@ -764,7 +780,8 @@ int LAGraph_SwapEdges printf("#####Made %ld swaps. Total %ld out of %ld."\ "Attempting %ld swaps next.#####\n\n", n_keep, num_swaps, e * Q, swaps_per_loop) ; - } + // return (GrB_NOT_IMPLEMENTED) ; + } GRB_TRY (GxB_Vector_unload( E_vec, (void **) &indices, &lg_edge, &e, &ind_size, &E_hand, NULL)); GRB_TRY (GxB_Vector_load( diff --git a/experimental/algorithm/LG_CC_FastSV7_FA.c b/experimental/algorithm/LG_CC_FastSV7_FA.c index c5c84ac2b3..bfffd1c3ad 100644 --- a/experimental/algorithm/LG_CC_FastSV7_FA.c +++ b/experimental/algorithm/LG_CC_FastSV7_FA.c @@ -123,7 +123,7 @@ static inline GrB_Info fastsv // (See LAGraph_FastAssign.c) // Giving it a full ramp vector speeds up the function - LG_TRY (LAGraph_FastAssign( + LG_TRY (LAGraph_FastAssign_Semiring( parent2, NULL, min, parent, mngp, ramp, min_2nd, NULL, msg)); //---------------------------------------------------------------------- @@ -622,7 +622,7 @@ int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GraphBLAS v10 for (int64_t k = 0 ; k < HASH_SAMPLES ; k++) { // select an entry ii from PARENT at random - uint64_t i = LG_Random60 (&seed) % n ; + uint64_t i = LG_Random64 (&seed) % n ; GrB_Index x = PARENT (i) ; // find x in the hash table GrB_Index h = HASH (x) ; @@ -740,6 +740,11 @@ int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GraphBLAS v10 for (tid = 0 ; tid < nthreads ; tid++) { int64_t ktid = range [tid] ; + memmove (Tj32 ? ((void *) (Tj32 + nvals)) : ((void *) (Tj64 + nvals)), + Tj32 ? ((void *) (Tj32 + TP (ktid))) : ((void *) (Tj64 + TP (ktid))), + tjsize * count [tid]) ; + +#if 0 if (Tj32) { memmove (Tj32 + nvals, Tj32 + TP (ktid), @@ -750,6 +755,8 @@ int LG_CC_FastSV7_FA // SuiteSparse:GraphBLAS method, with GraphBLAS v10 memmove (Tj64 + nvals, Tj64 + TP (ktid), sizeof (uint64_t) * count [tid]) ; } +#endif + nvals += count [tid] ; count [tid] = nvals - count [tid] ; } diff --git a/experimental/benchmark/FastAssign_demo.c b/experimental/benchmark/FastAssign_demo.c index 1f64a39c79..139e8af902 100644 --- a/experimental/benchmark/FastAssign_demo.c +++ b/experimental/benchmark/FastAssign_demo.c @@ -52,7 +52,6 @@ int main (int argc, char **argv) bool *set_a = NULL; GrB_Index r_size = 0, ramp_size = 0, junk_size = 0; bool iso = false; - LG_TRY (LAGraph_Random_Init (msg)) ; bool *val_of_P = NULL; double t = LAGraph_WallClockTime ( ) ; @@ -137,8 +136,8 @@ int main (int argc, char **argv) #else // FastAssign! t = LAGraph_WallClockTime ( ) ; - LG_TRY (LAGraph_FastAssign( - fa_s, NULL, NULL, rand_v, x, ramp, GxB_ANY_BOOL_MONOID, NULL, msg + LG_TRY (LAGraph_FastAssign_Semiring( + fa_s, NULL, NULL, rand_v, x, ramp, GxB_ANY_PAIR_BOOL, NULL, msg )); t = LAGraph_WallClockTime ( ) - t ; printf ("Time for LAGraph_FastAssign: %g sec\n", t) ; @@ -170,7 +169,6 @@ int main (int argc, char **argv) LG_FREE_ALL ; LG_TRY (LAGraph_Finalize (msg)) ; - LG_TRY (LAGraph_Random_Finalize (msg)) ; return (GrB_SUCCESS) ; #else printf ("GraphBLAS version too low to test LAGraph_FastAssign\n") ; diff --git a/experimental/benchmark/SwapEdges_demo.c b/experimental/benchmark/SwapEdges_demo.c index 129f524ec7..0a33b12072 100644 --- a/experimental/benchmark/SwapEdges_demo.c +++ b/experimental/benchmark/SwapEdges_demo.c @@ -47,7 +47,6 @@ int main (int argc, char **argv) // start GraphBLAS and LAGraph bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; - LAGRAPH_TRY (LAGraph_Random_Init (msg)) ; //-------------------------------------------------------------------------- // read in the graph: this method is defined in LAGraph_demo.h @@ -124,7 +123,6 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- LG_FREE_ALL ; - LG_TRY (LAGraph_Random_Finalize (msg)) ; LG_TRY (LAGraph_Finalize (msg)) ; return (GrB_SUCCESS) ; } diff --git a/experimental/benchmark/rcc_demo.c b/experimental/benchmark/rcc_demo.c index 7fb42bb08a..1ba638e333 100644 --- a/experimental/benchmark/rcc_demo.c +++ b/experimental/benchmark/rcc_demo.c @@ -59,7 +59,6 @@ int main (int argc, char **argv) // start GraphBLAS and LAGraph bool burble = true ; // set true for diagnostic outputs demo_init (burble) ; - LG_TRY (LAGraph_Random_Init (msg)) ; GRB_TRY (GxB_BinaryOp_new ( &iseqFP, (GxB_binary_function) iseq, GrB_BOOL, GrB_FP64, GrB_FP64, "iseq", ISEQ)) ; diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 0548c7005d..c2edd61b31 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -26,7 +26,7 @@ char msg [LAGRAPH_MSG_LEN] ; GrB_Matrix A = NULL, C = NULL; -GrB_Vector rcc = NULL; +GrB_Vector rcc = NULL, check_rcc = NULL ; LAGraph_Graph G = NULL ; #define LEN 512 @@ -93,6 +93,17 @@ const matrix_info tests [ ] = {NULL, 0, ""} } ; +const char *tests2 [ ] = +{ + "random_unweighted_general1.mtx", + "random_unweighted_general2.mtx", + "bcsstk13.mtx", + "test_FW_1000.mtx", + "test_FW_2003.mtx", + "test_FW_2500.mtx", + NULL +} ; + void test_RichClubCoefficient (void) { //-------------------------------------------------------------------------- @@ -184,6 +195,107 @@ void test_RichClubCoefficient (void) OK (LAGraph_Finalize (msg)) ; } +void iseq(bool *z, const double *x, const double *y) +{ + (*z) = (isnan(*x) && isnan(*y)) ||*x == *y ; +} +#define ISEQ \ +" void iseq(bool *z, const double *x, const double *y) \n"\ +" { \n"\ +" (*z) = (isnan(*x) && isnan(*y)) || *x == *y ; \n"\ +" }" +//------------------------------------------------------------------------------ +// test RichClubCoefficient vs C code +//------------------------------------------------------------------------------ +void test_RCC_Check (void) +{ + //-------------------------------------------------------------------------- + // start LAGraph + //-------------------------------------------------------------------------- + OK (LAGraph_Init (msg)) ; + GrB_BinaryOp iseqFP = NULL ; + OK (GxB_BinaryOp_new ( + &iseqFP, (GxB_binary_function) iseq, + GrB_BOOL, GrB_FP64, GrB_FP64, "iseq", ISEQ)) ; + for (int k = 0 ; ; k++) + { + //The following code taken from MIS tester + // load the matrix as A + const char *aname = tests [k].name; + if (strlen (aname) == 0) break; + TEST_CASE (aname) ; + snprintf (filename, LEN, LG_DATA_DIR "%s", aname) ; + FILE *f = fopen (filename, "r") ; + TEST_CHECK (f != NULL) ; + OK (LAGraph_MMRead (&A, f, msg)) ; + OK (fclose (f)) ; + TEST_MSG ("Loading of valued matrix failed") ; + printf ("\nMatrix: %s\n", aname) ; + const double *ans = tests [k].rcc; + const uint64_t n_ans = tests [k].n; + + // C = structure of A + OK (LAGraph_Matrix_Structure (&C, A, msg)) ; + OK (GrB_free (&A)) ; + + // construct a directed graph G with adjacency matrix C + OK (LAGraph_New (&G, &C, LAGraph_ADJACENCY_DIRECTED, msg)) ; + TEST_CHECK (C == NULL) ; + + // check if the pattern is symmetric + OK (LAGraph_Cached_IsSymmetricStructure (G, msg)) ; + + if (G->is_symmetric_structure == LAGraph_FALSE) + { + // make the adjacency matrix symmetric + OK (LAGraph_Cached_AT (G, msg)) ; + OK (GrB_eWiseAdd (G->A, NULL, NULL, GrB_LOR, G->A, G->AT, NULL)) ; + G->is_symmetric_structure = LAGraph_TRUE ; + } + G->kind = LAGraph_ADJACENCY_UNDIRECTED ; + + // check for self-edges + OK (LAGraph_Cached_NSelfEdges (G, msg)) ; + if (G->nself_edges != 0) + { + // remove self-edges + printf ("graph has %g self edges\n", (double) G->nself_edges) ; + OK (LAGraph_DeleteSelfEdges (G, msg)) ; + printf ("now has %g self edges\n", (double) G->nself_edges) ; + TEST_CHECK (G->nself_edges == 0) ; + } + + // compute the row degree + OK (LAGraph_Cached_OutDegree (G, msg)) ; + + //---------------------------------------------------------------------- + // test the algorithm + //---------------------------------------------------------------------- + + // GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + OK(LAGraph_RichClubCoefficient ( &rcc, G, msg)); + // GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + + OK(LG_check_rcc(&check_rcc, G, msg)); + //---------------------------------------------------------------------- + // check results + //---------------------------------------------------------------------- + bool flag = false; + OK (LAGraph_Vector_IsEqualOp(&flag, rcc, check_rcc, iseqFP, msg)) ; + TEST_CHECK (flag) ; + GxB_Vector_fprint (rcc, "rcc", GxB_SHORT, stdout); + GxB_Vector_fprint (check_rcc, "check_rcc", GxB_SHORT, stdout); + OK (GrB_free (&rcc)) ; + OK (GrB_free (&check_rcc)) ; + OK (LAGraph_Delete (&G, msg)) ; + } + + //-------------------------------------------------------------------------- + // free everything and finalize LAGraph + //-------------------------------------------------------------------------- + OK (GrB_free (&iseqFP)) ; + OK (LAGraph_Finalize (msg)) ; +} //------------------------------------------------------------------------------ // test_RCC_brutal: //------------------------------------------------------------------------------ @@ -286,6 +398,7 @@ void test_rcc_brutal (void) TEST_LIST = { {"RichClubCoefficient", test_RichClubCoefficient}, + {"RichClubCoefficient_Check", test_RCC_Check}, #if LAGRAPH_SUITESPARSE {"rcc_brutal", test_rcc_brutal}, #endif diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index 6d76b49d03..c8ba3f1dbf 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -33,7 +33,10 @@ const char* tests [ ] = { "random_unweighted_general1.mtx", "random_unweighted_general2.mtx", + "random_weighted_general1.mtx", + "random_weighted_general2.mtx", "bcsstk13.mtx", + "test_FW_2500.mtx", "" } ; void test_SwapEdges (void) @@ -43,8 +46,6 @@ void test_SwapEdges (void) // start LAGraph //-------------------------------------------------------------------------- OK (LAGraph_Init (msg)) ; - OK (LAGraph_Random_Init(msg)) ; - for (int k = 0 ; ; k++) { @@ -105,6 +106,7 @@ void test_SwapEdges (void) OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; printf ("Test ends:\n") ; + printf ("%s\n", msg + 1) ; //---------------------------------------------------------------------- // check results @@ -140,7 +142,6 @@ void test_SwapEdges (void) //-------------------------------------------------------------------------- // free everything and finalize LAGraph //-------------------------------------------------------------------------- - LAGraph_Random_Finalize(msg); LAGraph_Finalize (msg) ; #endif } diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 75c89073f0..20d354dae1 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -60,6 +60,10 @@ #include "LG_internal.h" #include "LAGraphX.h" #if USING_GRAPHBLAS_V10 + +// Uncomment if you would like to use the monoid version of FastAssign. +// Passing in a semiring is faster but this may be more convienient. +#if 0 #undef LG_FREE_ALL #define LG_FREE_ALL \ { \ @@ -115,6 +119,7 @@ int LAGraph_FastAssign_Monoid LG_FREE_ALL ; return (GrB_SUCCESS); } +#endif #undef LG_FREE_ALL #define LG_FREE_ALL \ @@ -139,7 +144,7 @@ int LAGraph_FastAssign_Semiring // Optional (Give me a ramp with size > X_vec.size for faster calculations) const GrB_Vector ramp, // monoid is applied to duplicates. Binary op should be SECOND. - const GrB_Semiring dup, + const GrB_Semiring semiring, const GrB_Descriptor desc, char *msg ) @@ -261,7 +266,7 @@ int LAGraph_FastAssign_Semiring //---------------------------------------------------------------------- GRB_TRY (GxB_load_Matrix_from_Container(P, con, NULL)); // GRB_TRY (GxB_fprint(P, GxB_SHORT, stdout)); - GRB_TRY (GrB_mxv(c, mask, accum, dup, P, X_vec, desc)); + GRB_TRY (GrB_mxv(c, mask, accum, semiring, P, X_vec, desc)); //---------------------------------------------------------------------- // Free work. // Note: this does not free inputs since they are marked GxB_IS_READONLY diff --git a/include/LAGraphX.h b/include/LAGraphX.h index 4b9e0245b5..2b337c087e 100644 --- a/include/LAGraphX.h +++ b/include/LAGraphX.h @@ -296,13 +296,7 @@ int LAGraph_FastAssign_Semiring const GrB_Descriptor desc, char *msg ) ; -#define LAGraph_FastAssign(c, mask, accum, I_vec, X_vec, ramp, dup, desc, msg) \ - _Generic((dup), \ - GrB_Monoid: \ - LAGraph_FastAssign_Monoid, \ - GrB_Semiring: \ - LAGraph_FastAssign_Semiring) \ - (c, mask, accum, I_vec, X_vec, ramp, dup, desc, msg) + //**************************************************************************** // Algorithms //**************************************************************************** From b7c8d32ba2344a3ec4a1523b9e3ebc3b76398499 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 8 May 2025 12:29:03 -0500 Subject: [PATCH 111/115] Remove test check for older versions --- .vscode/settings.json | 7 ------- experimental/test/test_RichClubCoefficient.c | 2 ++ 2 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 2e1ef5fe9f..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files.associations": { - "lg_internal.h": "c", - "random": "c", - "lg_test.h": "c" -} -} \ No newline at end of file diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index c2edd61b31..7182a6a665 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -398,7 +398,9 @@ void test_rcc_brutal (void) TEST_LIST = { {"RichClubCoefficient", test_RichClubCoefficient}, + #if USING_GRAPHBLAS_V10 {"RichClubCoefficient_Check", test_RCC_Check}, + #endif #if LAGRAPH_SUITESPARSE {"rcc_brutal", test_rcc_brutal}, #endif From 1a2a052b9fd15846939528ceda458f2a401b3030 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Thu, 8 May 2025 14:18:50 -0500 Subject: [PATCH 112/115] more coverage and added paper --- data/bcsstk13_celeb.mtx | 44757 ++++++++++++++++ .../algorithm/LAGraph_RichClubCoefficient.c | 12 +- experimental/algorithm/LAGraph_SwapEdges.c | 17 +- experimental/test/test_RichClubCoefficient.c | 20 +- papers/GOMEZ-FINALTHESIS-2025.pdf | Bin 0 -> 308199 bytes 5 files changed, 44779 insertions(+), 27 deletions(-) create mode 100644 data/bcsstk13_celeb.mtx create mode 100644 papers/GOMEZ-FINALTHESIS-2025.pdf diff --git a/data/bcsstk13_celeb.mtx b/data/bcsstk13_celeb.mtx new file mode 100644 index 0000000000..4a20efef69 --- /dev/null +++ b/data/bcsstk13_celeb.mtx @@ -0,0 +1,44757 @@ +%%MatrixMarket matrix coordinate real symmetric +%------------------------------------------------------------------------------- +% UF Sparse Matrix Collection, Tim Davis +% http://www.cise.ufl.edu/research/sparse/matrices/HB/bcsstk13 +% name: HB/bcsstk13 +% [SYMMETRIC STIFFNESS MATRIX, FLUID FLOW GENERALIZED EIGENVALUES] +% id: 35 +% date: 1982 +% author: J. Lewis +% ed: I. Duff, R. Grimes, J. Lewis +% fields: title A name id date author ed kind +% kind: computational fluid dynamics problem +%------------------------------------------------------------------------------- +2003 2003 42943 +1 1 277281165.183 +2 1 3101923.80092 +3 1 -51131286.8839 +4 1 -1312271.27988 +5 1 -61260263.8669 +6 1 1023498082.5 +7 1 -47543152.1944 +8 1 -1322042.41997 +9 1 3741313.67444 +10 1 1240267.52824 +11 1 84564.5407441 +12 1 -37798021.8761 +37 1 -203602411.838 +41 1 60932462.1774 +42 1 1061296104.38 +157 1 -15930371.5854 +158 1 -1115853.26223 +159 1 51131286.8839 +160 1 1240267.52824 +161 1 84564.5407441 +162 1 264.817735487 +163 1 -11650935.864 +164 1 -664028.118722 +165 1 -3741313.67444 +166 1 -1312271.27988 +167 1 -61260263.8669 +168 1 26864.5201164 +169 1 1445706.29901 +173 1 60932462.1774 +174 1 26599.7023809 +1 200 3.14159 +1 201 3.14159 +1 202 3.14159 +1 203 3.14159 +1 204 3.14159 +1 205 3.14159 +1 206 3.14159 +1 207 3.14159 +1 208 3.14159 +1 209 3.14159 +1 210 3.14159 +1 211 3.14159 +1 212 3.14159 +1 213 3.14159 +1 214 3.14159 +1 215 3.14159 +1 216 3.14159 +1 217 3.14159 +1 218 3.14159 +1 219 3.14159 +1 220 3.14159 +1 221 3.14159 +1 222 3.14159 +1 223 3.14159 +1 224 3.14159 +1 225 3.14159 +1 226 3.14159 +1 227 3.14159 +1 228 3.14159 +1 229 3.14159 +1 230 3.14159 +1 231 3.14159 +1 232 3.14159 +1 233 3.14159 +1 234 3.14159 +1 235 3.14159 +1 236 3.14159 +1 237 3.14159 +1 238 3.14159 +1 239 3.14159 +1 240 3.14159 +1 241 3.14159 +1 242 3.14159 +1 243 3.14159 +1 244 3.14159 +1 245 3.14159 +1 246 3.14159 +1 247 3.14159 +1 248 3.14159 +1 249 3.14159 +1 250 3.14159 +1 251 3.14159 +1 252 3.14159 +1 253 3.14159 +1 254 3.14159 +1 255 3.14159 +1 256 3.14159 +1 257 3.14159 +1 258 3.14159 +1 259 3.14159 +1 260 3.14159 +1 261 3.14159 +1 262 3.14159 +1 263 3.14159 +1 264 3.14159 +1 265 3.14159 +1 266 3.14159 +1 267 3.14159 +1 268 3.14159 +1 269 3.14159 +1 270 3.14159 +1 271 3.14159 +1 272 3.14159 +1 273 3.14159 +1 274 3.14159 +1 275 3.14159 +1 276 3.14159 +1 277 3.14159 +1 278 3.14159 +1 279 3.14159 +1 280 3.14159 +1 281 3.14159 +1 282 3.14159 +1 283 3.14159 +1 284 3.14159 +1 285 3.14159 +1 286 3.14159 +1 287 3.14159 +1 288 3.14159 +1 289 3.14159 +1 290 3.14159 +1 291 3.14159 +1 292 3.14159 +1 293 3.14159 +1 294 3.14159 +1 295 3.14159 +1 296 3.14159 +1 297 3.14159 +1 298 3.14159 +1 299 3.14159 +1 300 3.14159 +1 301 3.14159 +1 302 3.14159 +1 303 3.14159 +1 304 3.14159 +1 305 3.14159 +1 306 3.14159 +1 307 3.14159 +1 308 3.14159 +1 309 3.14159 +1 310 3.14159 +1 311 3.14159 +1 312 3.14159 +1 313 3.14159 +1 314 3.14159 +1 315 3.14159 +1 316 3.14159 +1 317 3.14159 +1 318 3.14159 +1 319 3.14159 +1 320 3.14159 +1 321 3.14159 +1 322 3.14159 +1 323 3.14159 +1 324 3.14159 +1 325 3.14159 +1 326 3.14159 +1 327 3.14159 +1 328 3.14159 +1 329 3.14159 +1 330 3.14159 +1 331 3.14159 +1 332 3.14159 +1 333 3.14159 +1 334 3.14159 +1 335 3.14159 +1 336 3.14159 +1 337 3.14159 +1 338 3.14159 +1 339 3.14159 +1 340 3.14159 +1 341 3.14159 +1 342 3.14159 +1 343 3.14159 +1 344 3.14159 +1 345 3.14159 +1 346 3.14159 +1 347 3.14159 +1 348 3.14159 +1 349 3.14159 +1 350 3.14159 +1 351 3.14159 +1 352 3.14159 +1 353 3.14159 +1 354 3.14159 +1 355 3.14159 +1 356 3.14159 +1 357 3.14159 +1 358 3.14159 +1 359 3.14159 +1 360 3.14159 +1 361 3.14159 +1 362 3.14159 +1 363 3.14159 +1 364 3.14159 +1 365 3.14159 +1 366 3.14159 +1 367 3.14159 +1 368 3.14159 +1 369 3.14159 +1 370 3.14159 +1 371 3.14159 +1 372 3.14159 +1 373 3.14159 +1 374 3.14159 +1 375 3.14159 +1 376 3.14159 +1 377 3.14159 +1 378 3.14159 +1 379 3.14159 +1 380 3.14159 +1 381 3.14159 +1 382 3.14159 +1 383 3.14159 +1 384 3.14159 +1 385 3.14159 +1 386 3.14159 +1 387 3.14159 +1 388 3.14159 +1 389 3.14159 +1 390 3.14159 +1 391 3.14159 +1 392 3.14159 +1 393 3.14159 +1 394 3.14159 +1 395 3.14159 +1 396 3.14159 +1 397 3.14159 +1 398 3.14159 +1 399 3.14159 +1 400 3.14159 +1 401 3.14159 +1 402 3.14159 +1 403 3.14159 +1 404 3.14159 +1 405 3.14159 +1 406 3.14159 +1 407 3.14159 +1 408 3.14159 +1 409 3.14159 +1 410 3.14159 +1 411 3.14159 +1 412 3.14159 +1 413 3.14159 +1 414 3.14159 +1 415 3.14159 +1 416 3.14159 +1 417 3.14159 +1 418 3.14159 +1 419 3.14159 +1 420 3.14159 +1 421 3.14159 +1 422 3.14159 +1 423 3.14159 +1 424 3.14159 +1 425 3.14159 +1 426 3.14159 +1 427 3.14159 +1 428 3.14159 +1 429 3.14159 +1 430 3.14159 +1 431 3.14159 +1 432 3.14159 +1 433 3.14159 +1 434 3.14159 +1 435 3.14159 +1 436 3.14159 +1 437 3.14159 +1 438 3.14159 +1 439 3.14159 +1 440 3.14159 +1 441 3.14159 +1 442 3.14159 +1 443 3.14159 +1 444 3.14159 +1 445 3.14159 +1 446 3.14159 +1 447 3.14159 +1 448 3.14159 +1 449 3.14159 +1 450 3.14159 +1 451 3.14159 +1 452 3.14159 +1 453 3.14159 +1 454 3.14159 +1 455 3.14159 +1 456 3.14159 +1 457 3.14159 +1 458 3.14159 +1 459 3.14159 +1 460 3.14159 +1 461 3.14159 +1 462 3.14159 +1 463 3.14159 +1 464 3.14159 +1 465 3.14159 +1 466 3.14159 +1 467 3.14159 +1 468 3.14159 +1 469 3.14159 +1 470 3.14159 +1 471 3.14159 +1 472 3.14159 +1 473 3.14159 +1 474 3.14159 +1 475 3.14159 +1 476 3.14159 +1 477 3.14159 +1 478 3.14159 +1 479 3.14159 +1 480 3.14159 +1 481 3.14159 +1 482 3.14159 +1 483 3.14159 +1 484 3.14159 +1 485 3.14159 +1 486 3.14159 +1 487 3.14159 +1 488 3.14159 +1 489 3.14159 +1 490 3.14159 +1 491 3.14159 +1 492 3.14159 +1 493 3.14159 +1 494 3.14159 +1 495 3.14159 +1 496 3.14159 +1 497 3.14159 +1 498 3.14159 +1 499 3.14159 +1 500 3.14159 +1 501 3.14159 +1 502 3.14159 +1 503 3.14159 +1 504 3.14159 +1 505 3.14159 +1 506 3.14159 +1 507 3.14159 +1 508 3.14159 +1 509 3.14159 +1 510 3.14159 +1 511 3.14159 +1 512 3.14159 +1 513 3.14159 +1 514 3.14159 +1 515 3.14159 +1 516 3.14159 +1 517 3.14159 +1 518 3.14159 +1 519 3.14159 +1 520 3.14159 +1 521 3.14159 +1 522 3.14159 +1 523 3.14159 +1 524 3.14159 +1 525 3.14159 +1 526 3.14159 +1 527 3.14159 +1 528 3.14159 +1 529 3.14159 +1 530 3.14159 +1 531 3.14159 +1 532 3.14159 +1 533 3.14159 +1 534 3.14159 +1 535 3.14159 +1 536 3.14159 +1 537 3.14159 +1 538 3.14159 +1 539 3.14159 +1 540 3.14159 +1 541 3.14159 +1 542 3.14159 +1 543 3.14159 +1 544 3.14159 +1 545 3.14159 +1 546 3.14159 +1 547 3.14159 +1 548 3.14159 +1 549 3.14159 +1 550 3.14159 +1 551 3.14159 +1 552 3.14159 +1 553 3.14159 +1 554 3.14159 +1 555 3.14159 +1 556 3.14159 +1 557 3.14159 +1 558 3.14159 +1 559 3.14159 +1 560 3.14159 +1 561 3.14159 +1 562 3.14159 +1 563 3.14159 +1 564 3.14159 +1 565 3.14159 +1 566 3.14159 +1 567 3.14159 +1 568 3.14159 +1 569 3.14159 +1 570 3.14159 +1 571 3.14159 +1 572 3.14159 +1 573 3.14159 +1 574 3.14159 +1 575 3.14159 +1 576 3.14159 +1 577 3.14159 +1 578 3.14159 +1 579 3.14159 +1 580 3.14159 +1 581 3.14159 +1 582 3.14159 +1 583 3.14159 +1 584 3.14159 +1 585 3.14159 +1 586 3.14159 +1 587 3.14159 +1 588 3.14159 +1 589 3.14159 +1 590 3.14159 +1 591 3.14159 +1 592 3.14159 +1 593 3.14159 +1 594 3.14159 +1 595 3.14159 +1 596 3.14159 +1 597 3.14159 +1 598 3.14159 +1 599 3.14159 +1 600 3.14159 +1 601 3.14159 +1 602 3.14159 +1 603 3.14159 +1 604 3.14159 +1 605 3.14159 +1 606 3.14159 +1 607 3.14159 +1 608 3.14159 +1 609 3.14159 +1 610 3.14159 +1 611 3.14159 +1 612 3.14159 +1 613 3.14159 +1 614 3.14159 +1 615 3.14159 +1 616 3.14159 +1 617 3.14159 +1 618 3.14159 +1 619 3.14159 +1 620 3.14159 +1 621 3.14159 +1 622 3.14159 +1 623 3.14159 +1 624 3.14159 +1 625 3.14159 +1 626 3.14159 +1 627 3.14159 +1 628 3.14159 +1 629 3.14159 +1 630 3.14159 +1 631 3.14159 +1 632 3.14159 +1 633 3.14159 +1 634 3.14159 +1 635 3.14159 +1 636 3.14159 +1 637 3.14159 +1 638 3.14159 +1 639 3.14159 +1 640 3.14159 +1 641 3.14159 +1 642 3.14159 +1 643 3.14159 +1 644 3.14159 +1 645 3.14159 +1 646 3.14159 +1 647 3.14159 +1 648 3.14159 +1 649 3.14159 +1 650 3.14159 +1 651 3.14159 +1 652 3.14159 +1 653 3.14159 +1 654 3.14159 +1 655 3.14159 +1 656 3.14159 +1 657 3.14159 +1 658 3.14159 +1 659 3.14159 +1 660 3.14159 +1 661 3.14159 +1 662 3.14159 +1 663 3.14159 +1 664 3.14159 +1 665 3.14159 +1 666 3.14159 +1 667 3.14159 +1 668 3.14159 +1 669 3.14159 +1 670 3.14159 +1 671 3.14159 +1 672 3.14159 +1 673 3.14159 +1 674 3.14159 +1 675 3.14159 +1 676 3.14159 +1 677 3.14159 +1 678 3.14159 +1 679 3.14159 +1 680 3.14159 +1 681 3.14159 +1 682 3.14159 +1 683 3.14159 +1 684 3.14159 +1 685 3.14159 +1 686 3.14159 +1 687 3.14159 +1 688 3.14159 +1 689 3.14159 +1 690 3.14159 +1 691 3.14159 +1 692 3.14159 +1 693 3.14159 +1 694 3.14159 +1 695 3.14159 +1 696 3.14159 +1 697 3.14159 +1 698 3.14159 +1 699 3.14159 +1 700 3.14159 +1 701 3.14159 +1 702 3.14159 +1 703 3.14159 +1 704 3.14159 +1 705 3.14159 +1 706 3.14159 +1 707 3.14159 +1 708 3.14159 +1 709 3.14159 +1 710 3.14159 +1 711 3.14159 +1 712 3.14159 +1 713 3.14159 +1 714 3.14159 +1 715 3.14159 +1 716 3.14159 +1 717 3.14159 +1 718 3.14159 +1 719 3.14159 +1 720 3.14159 +1 721 3.14159 +1 722 3.14159 +1 723 3.14159 +1 724 3.14159 +1 725 3.14159 +1 726 3.14159 +1 727 3.14159 +1 728 3.14159 +1 729 3.14159 +1 730 3.14159 +1 731 3.14159 +1 732 3.14159 +1 733 3.14159 +1 734 3.14159 +1 735 3.14159 +1 736 3.14159 +1 737 3.14159 +1 738 3.14159 +1 739 3.14159 +1 740 3.14159 +1 741 3.14159 +1 742 3.14159 +1 743 3.14159 +1 744 3.14159 +1 745 3.14159 +1 746 3.14159 +1 747 3.14159 +1 748 3.14159 +1 749 3.14159 +1 750 3.14159 +1 751 3.14159 +1 752 3.14159 +1 753 3.14159 +1 754 3.14159 +1 755 3.14159 +1 756 3.14159 +1 757 3.14159 +1 758 3.14159 +1 759 3.14159 +1 760 3.14159 +1 761 3.14159 +1 762 3.14159 +1 763 3.14159 +1 764 3.14159 +1 765 3.14159 +1 766 3.14159 +1 767 3.14159 +1 768 3.14159 +1 769 3.14159 +1 770 3.14159 +1 771 3.14159 +1 772 3.14159 +1 773 3.14159 +1 774 3.14159 +1 775 3.14159 +1 776 3.14159 +1 777 3.14159 +1 778 3.14159 +1 779 3.14159 +1 780 3.14159 +1 781 3.14159 +1 782 3.14159 +1 783 3.14159 +1 784 3.14159 +1 785 3.14159 +1 786 3.14159 +1 787 3.14159 +1 788 3.14159 +1 789 3.14159 +1 790 3.14159 +1 791 3.14159 +1 792 3.14159 +1 793 3.14159 +1 794 3.14159 +1 795 3.14159 +1 796 3.14159 +1 797 3.14159 +1 798 3.14159 +1 799 3.14159 +1 800 3.14159 +1 801 3.14159 +1 802 3.14159 +1 803 3.14159 +1 804 3.14159 +1 805 3.14159 +1 806 3.14159 +1 807 3.14159 +1 808 3.14159 +1 809 3.14159 +1 810 3.14159 +1 811 3.14159 +1 812 3.14159 +1 813 3.14159 +1 814 3.14159 +1 815 3.14159 +1 816 3.14159 +1 817 3.14159 +1 818 3.14159 +1 819 3.14159 +1 820 3.14159 +1 821 3.14159 +1 822 3.14159 +1 823 3.14159 +1 824 3.14159 +1 825 3.14159 +1 826 3.14159 +1 827 3.14159 +1 828 3.14159 +1 829 3.14159 +1 830 3.14159 +1 831 3.14159 +1 832 3.14159 +1 833 3.14159 +1 834 3.14159 +1 835 3.14159 +1 836 3.14159 +1 837 3.14159 +1 838 3.14159 +1 839 3.14159 +1 840 3.14159 +1 841 3.14159 +1 842 3.14159 +1 843 3.14159 +1 844 3.14159 +1 845 3.14159 +1 846 3.14159 +1 847 3.14159 +1 848 3.14159 +1 849 3.14159 +1 850 3.14159 +1 851 3.14159 +1 852 3.14159 +1 853 3.14159 +1 854 3.14159 +1 855 3.14159 +1 856 3.14159 +1 857 3.14159 +1 858 3.14159 +1 859 3.14159 +1 860 3.14159 +1 861 3.14159 +1 862 3.14159 +1 863 3.14159 +1 864 3.14159 +1 865 3.14159 +1 866 3.14159 +1 867 3.14159 +1 868 3.14159 +1 869 3.14159 +1 870 3.14159 +1 871 3.14159 +1 872 3.14159 +1 873 3.14159 +1 874 3.14159 +1 875 3.14159 +1 876 3.14159 +1 877 3.14159 +1 878 3.14159 +1 879 3.14159 +1 880 3.14159 +1 881 3.14159 +1 882 3.14159 +1 883 3.14159 +1 884 3.14159 +1 885 3.14159 +1 886 3.14159 +1 887 3.14159 +1 888 3.14159 +1 889 3.14159 +1 890 3.14159 +1 891 3.14159 +1 892 3.14159 +1 893 3.14159 +1 894 3.14159 +1 895 3.14159 +1 896 3.14159 +1 897 3.14159 +1 898 3.14159 +1 899 3.14159 +1 900 3.14159 +1 901 3.14159 +1 902 3.14159 +1 903 3.14159 +1 904 3.14159 +1 905 3.14159 +1 906 3.14159 +1 907 3.14159 +1 908 3.14159 +1 909 3.14159 +1 910 3.14159 +1 911 3.14159 +1 912 3.14159 +1 913 3.14159 +1 914 3.14159 +1 915 3.14159 +1 916 3.14159 +1 917 3.14159 +1 918 3.14159 +1 919 3.14159 +1 920 3.14159 +1 921 3.14159 +1 922 3.14159 +1 923 3.14159 +1 924 3.14159 +1 925 3.14159 +1 926 3.14159 +1 927 3.14159 +1 928 3.14159 +1 929 3.14159 +1 930 3.14159 +1 931 3.14159 +1 932 3.14159 +1 933 3.14159 +1 934 3.14159 +1 935 3.14159 +1 936 3.14159 +1 937 3.14159 +1 938 3.14159 +1 939 3.14159 +1 940 3.14159 +1 941 3.14159 +1 942 3.14159 +1 943 3.14159 +1 944 3.14159 +1 945 3.14159 +1 946 3.14159 +1 947 3.14159 +1 948 3.14159 +1 949 3.14159 +1 950 3.14159 +1 951 3.14159 +1 952 3.14159 +1 953 3.14159 +1 954 3.14159 +1 955 3.14159 +1 956 3.14159 +1 957 3.14159 +1 958 3.14159 +1 959 3.14159 +1 960 3.14159 +1 961 3.14159 +1 962 3.14159 +1 963 3.14159 +1 964 3.14159 +1 965 3.14159 +1 966 3.14159 +1 967 3.14159 +1 968 3.14159 +1 969 3.14159 +1 970 3.14159 +1 971 3.14159 +1 972 3.14159 +1 973 3.14159 +1 974 3.14159 +1 975 3.14159 +1 976 3.14159 +1 977 3.14159 +1 978 3.14159 +1 979 3.14159 +1 980 3.14159 +1 981 3.14159 +1 982 3.14159 +1 983 3.14159 +1 984 3.14159 +1 985 3.14159 +1 986 3.14159 +1 987 3.14159 +1 988 3.14159 +1 989 3.14159 +1 990 3.14159 +1 991 3.14159 +1 992 3.14159 +1 993 3.14159 +1 994 3.14159 +1 995 3.14159 +1 996 3.14159 +1 997 3.14159 +1 998 3.14159 +1 999 3.14159 +1 1000 3.14159 +1 1001 3.14159 +1 1002 3.14159 +1 1003 3.14159 +1 1004 3.14159 +1 1005 3.14159 +1 1006 3.14159 +1 1007 3.14159 +1 1008 3.14159 +1 1009 3.14159 +1 1010 3.14159 +1 1011 3.14159 +1 1012 3.14159 +1 1013 3.14159 +1 1014 3.14159 +1 1015 3.14159 +1 1016 3.14159 +1 1017 3.14159 +1 1018 3.14159 +1 1019 3.14159 +1 1020 3.14159 +1 1021 3.14159 +1 1022 3.14159 +1 1023 3.14159 +1 1024 3.14159 +1 1025 3.14159 +1 1026 3.14159 +1 1027 3.14159 +1 1028 3.14159 +1 1029 3.14159 +1 1030 3.14159 +1 1031 3.14159 +1 1032 3.14159 +1 1033 3.14159 +1 1034 3.14159 +1 1035 3.14159 +1 1036 3.14159 +1 1037 3.14159 +1 1038 3.14159 +1 1039 3.14159 +1 1040 3.14159 +1 1041 3.14159 +1 1042 3.14159 +1 1043 3.14159 +1 1044 3.14159 +1 1045 3.14159 +1 1046 3.14159 +1 1047 3.14159 +1 1048 3.14159 +1 1049 3.14159 +1 1050 3.14159 +1 1051 3.14159 +1 1052 3.14159 +1 1053 3.14159 +1 1054 3.14159 +1 1055 3.14159 +1 1056 3.14159 +1 1057 3.14159 +1 1058 3.14159 +1 1059 3.14159 +1 1060 3.14159 +1 1061 3.14159 +1 1062 3.14159 +1 1063 3.14159 +1 1064 3.14159 +1 1065 3.14159 +1 1066 3.14159 +1 1067 3.14159 +1 1068 3.14159 +1 1069 3.14159 +1 1070 3.14159 +1 1071 3.14159 +1 1072 3.14159 +1 1073 3.14159 +1 1074 3.14159 +1 1075 3.14159 +1 1076 3.14159 +1 1077 3.14159 +1 1078 3.14159 +1 1079 3.14159 +1 1080 3.14159 +1 1081 3.14159 +1 1082 3.14159 +1 1083 3.14159 +1 1084 3.14159 +1 1085 3.14159 +1 1086 3.14159 +1 1087 3.14159 +1 1088 3.14159 +1 1089 3.14159 +1 1090 3.14159 +1 1091 3.14159 +1 1092 3.14159 +1 1093 3.14159 +1 1094 3.14159 +1 1095 3.14159 +1 1096 3.14159 +1 1097 3.14159 +1 1098 3.14159 +1 1099 3.14159 +1 1100 3.14159 +1 1101 3.14159 +1 1102 3.14159 +1 1103 3.14159 +1 1104 3.14159 +1 1105 3.14159 +1 1106 3.14159 +1 1107 3.14159 +1 1108 3.14159 +1 1109 3.14159 +1 1110 3.14159 +1 1111 3.14159 +1 1112 3.14159 +1 1113 3.14159 +1 1114 3.14159 +1 1115 3.14159 +1 1116 3.14159 +1 1117 3.14159 +1 1118 3.14159 +1 1119 3.14159 +1 1120 3.14159 +1 1121 3.14159 +1 1122 3.14159 +1 1123 3.14159 +1 1124 3.14159 +1 1125 3.14159 +1 1126 3.14159 +1 1127 3.14159 +1 1128 3.14159 +1 1129 3.14159 +1 1130 3.14159 +1 1131 3.14159 +1 1132 3.14159 +1 1133 3.14159 +1 1134 3.14159 +1 1135 3.14159 +1 1136 3.14159 +1 1137 3.14159 +1 1138 3.14159 +1 1139 3.14159 +1 1140 3.14159 +1 1141 3.14159 +1 1142 3.14159 +1 1143 3.14159 +1 1144 3.14159 +1 1145 3.14159 +1 1146 3.14159 +1 1147 3.14159 +1 1148 3.14159 +1 1149 3.14159 +1 1150 3.14159 +1 1151 3.14159 +1 1152 3.14159 +1 1153 3.14159 +1 1154 3.14159 +1 1155 3.14159 +1 1156 3.14159 +1 1157 3.14159 +1 1158 3.14159 +1 1159 3.14159 +1 1160 3.14159 +1 1161 3.14159 +1 1162 3.14159 +1 1163 3.14159 +1 1164 3.14159 +1 1165 3.14159 +1 1166 3.14159 +1 1167 3.14159 +1 1168 3.14159 +1 1169 3.14159 +1 1170 3.14159 +1 1171 3.14159 +1 1172 3.14159 +1 1173 3.14159 +1 1174 3.14159 +1 1175 3.14159 +1 1176 3.14159 +1 1177 3.14159 +1 1178 3.14159 +1 1179 3.14159 +1 1180 3.14159 +1 1181 3.14159 +1 1182 3.14159 +1 1183 3.14159 +1 1184 3.14159 +1 1185 3.14159 +1 1186 3.14159 +1 1187 3.14159 +1 1188 3.14159 +1 1189 3.14159 +1 1190 3.14159 +1 1191 3.14159 +1 1192 3.14159 +1 1193 3.14159 +1 1194 3.14159 +1 1195 3.14159 +1 1196 3.14159 +1 1197 3.14159 +1 1198 3.14159 +1 1199 3.14159 +1 1200 3.14159 +1 1201 3.14159 +1 1202 3.14159 +1 1203 3.14159 +1 1204 3.14159 +1 1205 3.14159 +1 1206 3.14159 +1 1207 3.14159 +1 1208 3.14159 +1 1209 3.14159 +1 1210 3.14159 +1 1211 3.14159 +1 1212 3.14159 +1 1213 3.14159 +1 1214 3.14159 +1 1215 3.14159 +1 1216 3.14159 +1 1217 3.14159 +1 1218 3.14159 +1 1219 3.14159 +1 1220 3.14159 +1 1221 3.14159 +1 1222 3.14159 +1 1223 3.14159 +1 1224 3.14159 +1 1225 3.14159 +1 1226 3.14159 +1 1227 3.14159 +1 1228 3.14159 +1 1229 3.14159 +1 1230 3.14159 +1 1231 3.14159 +1 1232 3.14159 +1 1233 3.14159 +1 1234 3.14159 +1 1235 3.14159 +1 1236 3.14159 +1 1237 3.14159 +1 1238 3.14159 +1 1239 3.14159 +1 1240 3.14159 +1 1241 3.14159 +1 1242 3.14159 +1 1243 3.14159 +1 1244 3.14159 +1 1245 3.14159 +1 1246 3.14159 +1 1247 3.14159 +1 1248 3.14159 +1 1249 3.14159 +1 1250 3.14159 +1 1251 3.14159 +1 1252 3.14159 +1 1253 3.14159 +1 1254 3.14159 +1 1255 3.14159 +1 1256 3.14159 +1 1257 3.14159 +1 1258 3.14159 +1 1259 3.14159 +1 1260 3.14159 +1 1261 3.14159 +1 1262 3.14159 +1 1263 3.14159 +1 1264 3.14159 +1 1265 3.14159 +1 1266 3.14159 +1 1267 3.14159 +1 1268 3.14159 +1 1269 3.14159 +1 1270 3.14159 +1 1271 3.14159 +1 1272 3.14159 +1 1273 3.14159 +1 1274 3.14159 +1 1275 3.14159 +1 1276 3.14159 +1 1277 3.14159 +1 1278 3.14159 +1 1279 3.14159 +1 1280 3.14159 +1 1281 3.14159 +1 1282 3.14159 +1 1283 3.14159 +1 1284 3.14159 +1 1285 3.14159 +1 1286 3.14159 +1 1287 3.14159 +1 1288 3.14159 +1 1289 3.14159 +1 1290 3.14159 +1 1291 3.14159 +1 1292 3.14159 +1 1293 3.14159 +1 1294 3.14159 +1 1295 3.14159 +1 1296 3.14159 +1 1297 3.14159 +1 1298 3.14159 +1 1299 3.14159 +1 1300 3.14159 +1 1301 3.14159 +1 1302 3.14159 +1 1303 3.14159 +1 1304 3.14159 +1 1305 3.14159 +1 1306 3.14159 +1 1307 3.14159 +1 1308 3.14159 +1 1309 3.14159 +1 1310 3.14159 +1 1311 3.14159 +1 1312 3.14159 +1 1313 3.14159 +1 1314 3.14159 +1 1315 3.14159 +1 1316 3.14159 +1 1317 3.14159 +1 1318 3.14159 +1 1319 3.14159 +1 1320 3.14159 +1 1321 3.14159 +1 1322 3.14159 +1 1323 3.14159 +1 1324 3.14159 +1 1325 3.14159 +1 1326 3.14159 +1 1327 3.14159 +1 1328 3.14159 +1 1329 3.14159 +1 1330 3.14159 +1 1331 3.14159 +1 1332 3.14159 +1 1333 3.14159 +1 1334 3.14159 +1 1335 3.14159 +1 1336 3.14159 +1 1337 3.14159 +1 1338 3.14159 +1 1339 3.14159 +1 1340 3.14159 +1 1341 3.14159 +1 1342 3.14159 +1 1343 3.14159 +1 1344 3.14159 +1 1345 3.14159 +1 1346 3.14159 +1 1347 3.14159 +1 1348 3.14159 +1 1349 3.14159 +1 1350 3.14159 +1 1351 3.14159 +1 1352 3.14159 +1 1353 3.14159 +1 1354 3.14159 +1 1355 3.14159 +1 1356 3.14159 +1 1357 3.14159 +1 1358 3.14159 +1 1359 3.14159 +1 1360 3.14159 +1 1361 3.14159 +1 1362 3.14159 +1 1363 3.14159 +1 1364 3.14159 +1 1365 3.14159 +1 1366 3.14159 +1 1367 3.14159 +1 1368 3.14159 +1 1369 3.14159 +1 1370 3.14159 +1 1371 3.14159 +1 1372 3.14159 +1 1373 3.14159 +1 1374 3.14159 +1 1375 3.14159 +1 1376 3.14159 +1 1377 3.14159 +1 1378 3.14159 +1 1379 3.14159 +1 1380 3.14159 +1 1381 3.14159 +1 1382 3.14159 +1 1383 3.14159 +1 1384 3.14159 +1 1385 3.14159 +1 1386 3.14159 +1 1387 3.14159 +1 1388 3.14159 +1 1389 3.14159 +1 1390 3.14159 +1 1391 3.14159 +1 1392 3.14159 +1 1393 3.14159 +1 1394 3.14159 +1 1395 3.14159 +1 1396 3.14159 +1 1397 3.14159 +1 1398 3.14159 +1 1399 3.14159 +1 1400 3.14159 +1 1401 3.14159 +1 1402 3.14159 +1 1403 3.14159 +1 1404 3.14159 +1 1405 3.14159 +1 1406 3.14159 +1 1407 3.14159 +1 1408 3.14159 +1 1409 3.14159 +1 1410 3.14159 +1 1411 3.14159 +1 1412 3.14159 +1 1413 3.14159 +1 1414 3.14159 +1 1415 3.14159 +1 1416 3.14159 +1 1417 3.14159 +1 1418 3.14159 +1 1419 3.14159 +1 1420 3.14159 +1 1421 3.14159 +1 1422 3.14159 +1 1423 3.14159 +1 1424 3.14159 +1 1425 3.14159 +1 1426 3.14159 +1 1427 3.14159 +1 1428 3.14159 +1 1429 3.14159 +1 1430 3.14159 +1 1431 3.14159 +1 1432 3.14159 +1 1433 3.14159 +1 1434 3.14159 +1 1435 3.14159 +1 1436 3.14159 +1 1437 3.14159 +1 1438 3.14159 +1 1439 3.14159 +1 1440 3.14159 +1 1441 3.14159 +1 1442 3.14159 +1 1443 3.14159 +1 1444 3.14159 +1 1445 3.14159 +1 1446 3.14159 +1 1447 3.14159 +1 1448 3.14159 +1 1449 3.14159 +1 1450 3.14159 +1 1451 3.14159 +1 1452 3.14159 +1 1453 3.14159 +1 1454 3.14159 +1 1455 3.14159 +1 1456 3.14159 +1 1457 3.14159 +1 1458 3.14159 +1 1459 3.14159 +1 1460 3.14159 +1 1461 3.14159 +1 1462 3.14159 +1 1463 3.14159 +1 1464 3.14159 +1 1465 3.14159 +1 1466 3.14159 +1 1467 3.14159 +1 1468 3.14159 +1 1469 3.14159 +1 1470 3.14159 +1 1471 3.14159 +1 1472 3.14159 +1 1473 3.14159 +1 1474 3.14159 +1 1475 3.14159 +1 1476 3.14159 +1 1477 3.14159 +1 1478 3.14159 +1 1479 3.14159 +1 1480 3.14159 +1 1481 3.14159 +1 1482 3.14159 +1 1483 3.14159 +1 1484 3.14159 +1 1485 3.14159 +1 1486 3.14159 +1 1487 3.14159 +1 1488 3.14159 +1 1489 3.14159 +1 1490 3.14159 +1 1491 3.14159 +1 1492 3.14159 +1 1493 3.14159 +1 1494 3.14159 +1 1495 3.14159 +1 1496 3.14159 +1 1497 3.14159 +1 1498 3.14159 +1 1499 3.14159 +1 1500 3.14159 +1 1501 3.14159 +1 1502 3.14159 +1 1503 3.14159 +1 1504 3.14159 +1 1505 3.14159 +1 1506 3.14159 +1 1507 3.14159 +1 1508 3.14159 +1 1509 3.14159 +1 1510 3.14159 +1 1511 3.14159 +1 1512 3.14159 +1 1513 3.14159 +1 1514 3.14159 +1 1515 3.14159 +1 1516 3.14159 +1 1517 3.14159 +1 1518 3.14159 +1 1519 3.14159 +1 1520 3.14159 +1 1521 3.14159 +1 1522 3.14159 +1 1523 3.14159 +1 1524 3.14159 +1 1525 3.14159 +1 1526 3.14159 +1 1527 3.14159 +1 1528 3.14159 +1 1529 3.14159 +1 1530 3.14159 +1 1531 3.14159 +1 1532 3.14159 +1 1533 3.14159 +1 1534 3.14159 +1 1535 3.14159 +1 1536 3.14159 +1 1537 3.14159 +1 1538 3.14159 +1 1539 3.14159 +1 1540 3.14159 +1 1541 3.14159 +1 1542 3.14159 +1 1543 3.14159 +1 1544 3.14159 +1 1545 3.14159 +1 1546 3.14159 +1 1547 3.14159 +1 1548 3.14159 +1 1549 3.14159 +1 1550 3.14159 +1 1551 3.14159 +1 1552 3.14159 +1 1553 3.14159 +1 1554 3.14159 +1 1555 3.14159 +1 1556 3.14159 +1 1557 3.14159 +1 1558 3.14159 +1 1559 3.14159 +1 1560 3.14159 +1 1561 3.14159 +1 1562 3.14159 +1 1563 3.14159 +1 1564 3.14159 +1 1565 3.14159 +1 1566 3.14159 +1 1567 3.14159 +1 1568 3.14159 +1 1569 3.14159 +1 1570 3.14159 +1 1571 3.14159 +1 1572 3.14159 +1 1573 3.14159 +1 1574 3.14159 +1 1575 3.14159 +1 1576 3.14159 +1 1577 3.14159 +1 1578 3.14159 +1 1579 3.14159 +1 1580 3.14159 +1 1581 3.14159 +1 1582 3.14159 +1 1583 3.14159 +1 1584 3.14159 +1 1585 3.14159 +1 1586 3.14159 +1 1587 3.14159 +1 1588 3.14159 +1 1589 3.14159 +1 1590 3.14159 +1 1591 3.14159 +1 1592 3.14159 +1 1593 3.14159 +1 1594 3.14159 +1 1595 3.14159 +1 1596 3.14159 +1 1597 3.14159 +1 1598 3.14159 +1 1599 3.14159 +1 1600 3.14159 +1 1601 3.14159 +1 1602 3.14159 +1 1603 3.14159 +1 1604 3.14159 +1 1605 3.14159 +1 1606 3.14159 +1 1607 3.14159 +1 1608 3.14159 +1 1609 3.14159 +1 1610 3.14159 +1 1611 3.14159 +1 1612 3.14159 +1 1613 3.14159 +1 1614 3.14159 +1 1615 3.14159 +1 1616 3.14159 +1 1617 3.14159 +1 1618 3.14159 +1 1619 3.14159 +1 1620 3.14159 +1 1621 3.14159 +1 1622 3.14159 +1 1623 3.14159 +1 1624 3.14159 +1 1625 3.14159 +1 1626 3.14159 +1 1627 3.14159 +1 1628 3.14159 +1 1629 3.14159 +1 1630 3.14159 +1 1631 3.14159 +1 1632 3.14159 +1 1633 3.14159 +1 1634 3.14159 +1 1635 3.14159 +1 1636 3.14159 +1 1637 3.14159 +1 1638 3.14159 +1 1639 3.14159 +1 1640 3.14159 +1 1641 3.14159 +1 1642 3.14159 +1 1643 3.14159 +1 1644 3.14159 +1 1645 3.14159 +1 1646 3.14159 +1 1647 3.14159 +1 1648 3.14159 +1 1649 3.14159 +1 1650 3.14159 +1 1651 3.14159 +1 1652 3.14159 +1 1653 3.14159 +1 1654 3.14159 +1 1655 3.14159 +1 1656 3.14159 +1 1657 3.14159 +1 1658 3.14159 +1 1659 3.14159 +1 1660 3.14159 +1 1661 3.14159 +1 1662 3.14159 +1 1663 3.14159 +1 1664 3.14159 +1 1665 3.14159 +1 1666 3.14159 +1 1667 3.14159 +1 1668 3.14159 +1 1669 3.14159 +1 1670 3.14159 +1 1671 3.14159 +1 1672 3.14159 +1 1673 3.14159 +1 1674 3.14159 +1 1675 3.14159 +1 1676 3.14159 +1 1677 3.14159 +1 1678 3.14159 +1 1679 3.14159 +1 1680 3.14159 +1 1681 3.14159 +1 1682 3.14159 +1 1683 3.14159 +1 1684 3.14159 +1 1685 3.14159 +1 1686 3.14159 +1 1687 3.14159 +1 1688 3.14159 +1 1689 3.14159 +1 1690 3.14159 +1 1691 3.14159 +1 1692 3.14159 +1 1693 3.14159 +1 1694 3.14159 +1 1695 3.14159 +1 1696 3.14159 +1 1697 3.14159 +1 1698 3.14159 +1 1699 3.14159 +1 1700 3.14159 +1 1701 3.14159 +1 1702 3.14159 +1 1703 3.14159 +1 1704 3.14159 +1 1705 3.14159 +1 1706 3.14159 +1 1707 3.14159 +1 1708 3.14159 +1 1709 3.14159 +1 1710 3.14159 +1 1711 3.14159 +1 1712 3.14159 +1 1713 3.14159 +1 1714 3.14159 +1 1715 3.14159 +1 1716 3.14159 +1 1717 3.14159 +1 1718 3.14159 +1 1719 3.14159 +1 1720 3.14159 +1 1721 3.14159 +1 1722 3.14159 +1 1723 3.14159 +1 1724 3.14159 +1 1725 3.14159 +1 1726 3.14159 +1 1727 3.14159 +1 1728 3.14159 +1 1729 3.14159 +1 1730 3.14159 +1 1731 3.14159 +1 1732 3.14159 +1 1733 3.14159 +1 1734 3.14159 +1 1735 3.14159 +1 1736 3.14159 +1 1737 3.14159 +1 1738 3.14159 +1 1739 3.14159 +1 1740 3.14159 +1 1741 3.14159 +1 1742 3.14159 +1 1743 3.14159 +1 1744 3.14159 +1 1745 3.14159 +1 1746 3.14159 +1 1747 3.14159 +1 1748 3.14159 +1 1749 3.14159 +1 1750 3.14159 +1 1751 3.14159 +1 1752 3.14159 +1 1753 3.14159 +1 1754 3.14159 +1 1755 3.14159 +1 1756 3.14159 +1 1757 3.14159 +1 1758 3.14159 +1 1759 3.14159 +1 1760 3.14159 +1 1761 3.14159 +1 1762 3.14159 +1 1763 3.14159 +1 1764 3.14159 +1 1765 3.14159 +1 1766 3.14159 +1 1767 3.14159 +1 1768 3.14159 +1 1769 3.14159 +1 1770 3.14159 +1 1771 3.14159 +1 1772 3.14159 +1 1773 3.14159 +1 1774 3.14159 +1 1775 3.14159 +1 1776 3.14159 +1 1777 3.14159 +1 1778 3.14159 +1 1779 3.14159 +1 1780 3.14159 +1 1781 3.14159 +1 1782 3.14159 +1 1783 3.14159 +1 1784 3.14159 +1 1785 3.14159 +1 1786 3.14159 +1 1787 3.14159 +1 1788 3.14159 +1 1789 3.14159 +1 1790 3.14159 +1 1791 3.14159 +1 1792 3.14159 +1 1793 3.14159 +1 1794 3.14159 +1 1795 3.14159 +1 1796 3.14159 +1 1797 3.14159 +1 1798 3.14159 +1 1799 3.14159 +1 1800 3.14159 +1 1801 3.14159 +1 1802 3.14159 +1 1803 3.14159 +1 1804 3.14159 +1 1805 3.14159 +1 1806 3.14159 +1 1807 3.14159 +1 1808 3.14159 +1 1809 3.14159 +1 1810 3.14159 +1 1811 3.14159 +1 1812 3.14159 +1 1813 3.14159 +1 1814 3.14159 +1 1815 3.14159 +1 1816 3.14159 +1 1817 3.14159 +1 1818 3.14159 +1 1819 3.14159 +1 1820 3.14159 +1 1821 3.14159 +1 1822 3.14159 +1 1823 3.14159 +1 1824 3.14159 +1 1825 3.14159 +1 1826 3.14159 +1 1827 3.14159 +1 1828 3.14159 +1 1829 3.14159 +1 1830 3.14159 +1 1831 3.14159 +1 1832 3.14159 +1 1833 3.14159 +1 1834 3.14159 +1 1835 3.14159 +1 1836 3.14159 +1 1837 3.14159 +1 1838 3.14159 +1 1839 3.14159 +1 1840 3.14159 +1 1841 3.14159 +1 1842 3.14159 +1 1843 3.14159 +1 1844 3.14159 +1 1845 3.14159 +1 1846 3.14159 +1 1847 3.14159 +1 1848 3.14159 +1 1849 3.14159 +1 1850 3.14159 +1 1851 3.14159 +1 1852 3.14159 +1 1853 3.14159 +1 1854 3.14159 +1 1855 3.14159 +1 1856 3.14159 +1 1857 3.14159 +1 1858 3.14159 +1 1859 3.14159 +1 1860 3.14159 +1 1861 3.14159 +1 1862 3.14159 +1 1863 3.14159 +1 1864 3.14159 +1 1865 3.14159 +1 1866 3.14159 +1 1867 3.14159 +1 1868 3.14159 +1 1869 3.14159 +1 1870 3.14159 +1 1871 3.14159 +1 1872 3.14159 +1 1873 3.14159 +1 1874 3.14159 +1 1875 3.14159 +1 1876 3.14159 +1 1877 3.14159 +1 1878 3.14159 +1 1879 3.14159 +1 1880 3.14159 +1 1881 3.14159 +1 1882 3.14159 +1 1883 3.14159 +1 1884 3.14159 +1 1885 3.14159 +1 1886 3.14159 +1 1887 3.14159 +1 1888 3.14159 +1 1889 3.14159 +1 1890 3.14159 +1 1891 3.14159 +1 1892 3.14159 +1 1893 3.14159 +1 1894 3.14159 +1 1895 3.14159 +1 1896 3.14159 +1 1897 3.14159 +1 1898 3.14159 +1 1899 3.14159 +1 1900 3.14159 +1 1901 3.14159 +1 1902 3.14159 +1 1903 3.14159 +1 1904 3.14159 +1 1905 3.14159 +1 1906 3.14159 +1 1907 3.14159 +1 1908 3.14159 +1 1909 3.14159 +1 1910 3.14159 +1 1911 3.14159 +1 1912 3.14159 +1 1913 3.14159 +1 1914 3.14159 +1 1915 3.14159 +1 1916 3.14159 +1 1917 3.14159 +1 1918 3.14159 +1 1919 3.14159 +1 1920 3.14159 +1 1921 3.14159 +1 1922 3.14159 +1 1923 3.14159 +1 1924 3.14159 +1 1925 3.14159 +1 1926 3.14159 +1 1927 3.14159 +1 1928 3.14159 +1 1929 3.14159 +1 1930 3.14159 +1 1931 3.14159 +1 1932 3.14159 +1 1933 3.14159 +1 1934 3.14159 +1 1935 3.14159 +1 1936 3.14159 +1 1937 3.14159 +1 1938 3.14159 +1 1939 3.14159 +1 1940 3.14159 +1 1941 3.14159 +1 1942 3.14159 +1 1943 3.14159 +1 1944 3.14159 +1 1945 3.14159 +1 1946 3.14159 +1 1947 3.14159 +1 1948 3.14159 +1 1949 3.14159 +1 1950 3.14159 +1 1951 3.14159 +1 1952 3.14159 +1 1953 3.14159 +1 1954 3.14159 +1 1955 3.14159 +1 1956 3.14159 +1 1957 3.14159 +1 1958 3.14159 +1 1959 3.14159 +1 1960 3.14159 +1 1961 3.14159 +1 1962 3.14159 +1 1963 3.14159 +1 1964 3.14159 +1 1965 3.14159 +1 1966 3.14159 +1 1967 3.14159 +1 1968 3.14159 +1 1969 3.14159 +1 1970 3.14159 +1 1971 3.14159 +1 1972 3.14159 +1 1973 3.14159 +1 1974 3.14159 +1 1975 3.14159 +1 1976 3.14159 +1 1977 3.14159 +1 1978 3.14159 +1 1979 3.14159 +1 1980 3.14159 +1 1981 3.14159 +1 1982 3.14159 +1 1983 3.14159 +1 1984 3.14159 +1 1985 3.14159 +1 1986 3.14159 +1 1987 3.14159 +1 1988 3.14159 +1 1989 3.14159 +1 1990 3.14159 +1 1991 3.14159 +1 1992 3.14159 +1 1993 3.14159 +1 1994 3.14159 +1 1995 3.14159 +1 1996 3.14159 +1 1997 3.14159 +1 1998 3.14159 +1 1999 3.14159 +2 2 127878987.61 +3 2 44013741.032 +4 2 19246452.9736 +5 2 1312271.27988 +6 2 554365443.862 +7 2 -1322042.41997 +8 2 -28243530.7564 +9 2 255092.119607 +10 2 -18190408.5101 +11 2 -1240267.52824 +12 2 554365443.862 +38 2 -93082589.2857 +39 2 -3.75e6 +157 2 -1115853.26223 +158 2 359230.938651 +159 2 3486258.96796 +160 2 -18190408.5101 +161 2 -1240267.52824 +162 2 -3883.95461427 +163 2 -664028.118722 +164 2 7291026.49292 +165 2 3494907.88039 +166 2 19246452.9736 +167 2 1312271.27988 +168 2 -3883.95461427 +170 2 -14203125 +171 2 -4.75e7 +3 3 2606613608.48 +4 3 -60880441.1474 +5 3 -64909343.3301 +7 3 -3741313.67444 +8 3 -255092.119607 +9 3 889752960.235 +10 3 4425681.3016 +11 3 -64909343.3301 +38 3 3.75e6 +39 3 -3897594.75217 +40 3 -65306122.449 +157 3 51131286.8839 +158 3 3486258.96796 +159 3 -1008230888.57 +163 3 3741313.67444 +164 3 -3494907.88039 +165 3 -2065696418.72 +170 3 -4.75e7 +171 3 -418541666.667 +4 4 1343678049.38 +5 4 -58120631.4485 +6 4 266308.785854 +7 4 1240267.52824 +8 4 -18190408.5101 +9 4 -4425681.3016 +10 4 -815326541.667 +11 4 -114874410.524 +12 4 19486.008721 +39 4 65306122.449 +40 4 228571428.571 +157 4 -1240267.52824 +158 4 18190408.5101 +160 4 -768825799.607 +161 4 -52420465.0817 +162 4 -266308.785854 +163 4 1312271.27988 +164 4 -19246452.9736 +166 4 798395044.586 +167 4 54436570.1275 +168 4 -19486.008721 +5 5 4346251312.17 +6 5 -229238.234542 +7 5 84564.5407441 +8 5 -1240267.52824 +9 5 64909343.3301 +10 5 -114874410.524 +11 5 861648873.443 +12 5 1328.60478962 +37 5 60932462.1774 +41 5 -2597905172.08 +42 5 -19531.25 +157 5 -84564.5407441 +158 5 1240267.52824 +160 5 -52420465.0817 +161 5 -3574158.36043 +162 5 -18157.5987915 +163 5 61260263.8669 +164 5 -1312271.27988 +166 5 54436570.1275 +167 5 2570304503.38 +168 5 18202.6452104 +169 5 -60932462.1774 +173 5 -2559919704.85 +174 5 247395.833333 +6 6 22281022277.1 +7 6 37798021.8761 +8 6 -554365443.862 +10 6 -19486.008721 +11 6 -1328.60478962 +12 6 7425919663.24 +37 6 -1061296104.38 +41 6 19531.25 +42 6 3714541546.53 +157 6 -264.817735488 +158 6 3883.95461427 +160 6 -266308.785854 +161 6 -18157.5987915 +162 6 -70256.865273 +163 6 26864.5201164 +164 6 -3883.95461427 +166 6 19486.008721 +167 6 -18202.6452104 +168 6 -64535.7534561 +169 6 -26599.7023809 +173 6 247395.833333 +174 6 87917.7517361 +7 7 151303864.252 +8 7 5973284.88839 +9 7 -4.92377853394 +10 7 -2723421.68315 +11 7 -185687.696604 +12 7 -6376921.48282 +13 7 -53460600.8758 +14 7 -1225004.91393 +15 7 3741314.03471 +16 7 1344548.31266 +17 7 91672.7575228 +18 7 -44174943.359 +151 7 -15182835.018 +152 7 -1067356.89932 +153 7 51131291.8077 +154 7 1344548.31266 +155 7 91672.7575228 +156 7 239.03933031 +157 7 -19186904.5787 +158 7 -1243027.39295 +159 7 -.360276773572 +160 7 -2723421.68315 +161 7 -185687.696604 +162 7 -25.7784051772 +163 7 -15930371.5854 +164 7 -1115853.26223 +165 7 -51131286.8839 +166 7 1240267.52824 +167 7 84564.5407441 +168 7 -264.817735487 +8 8 64102954.9725 +9 8 72.2154411972 +10 8 39943549.3075 +11 8 2723421.68315 +12 8 93540729.7935 +13 8 -1225004.91393 +14 8 -35577190.0604 +15 8 255086.83555 +16 8 -19720255.1109 +17 8 -1344548.31266 +18 8 647906173.656 +151 8 -1067356.89932 +152 8 399128.531709 +153 8 3486186.75252 +154 8 -19720255.1109 +155 8 -1344548.31266 +156 8 -3505.94808003 +157 8 -1243027.39295 +158 8 -1040593.62601 +159 8 5.28405665327 +160 8 39943549.3075 +161 8 2723421.68315 +162 8 378.006534245 +163 8 -1115853.26223 +164 8 359230.938651 +165 8 -3486258.96796 +166 8 -18190408.5101 +167 8 -1240267.52824 +168 8 3883.95461427 +9 9 3787116429.26 +10 9 746666.957293 +11 9 -10952584.596 +13 9 -3741314.03471 +14 9 -255086.83555 +15 9 812930006.362 +16 9 5172348.25889 +17 9 -75861927.9261 +151 9 51131291.8077 +152 9 3486186.75252 +153 9 -941606296.811 +157 9 .360276684165 +158 9 -5.28405665886 +159 9 -3539962210.47 +163 9 -51131286.8839 +164 9 -3486258.96796 +165 9 -1008230888.57 +10 10 1838797922.66 +11 10 -121372016.76 +12 10 .0256446730345 +13 10 1344548.31266 +14 10 -19720255.1109 +15 10 -5172348.25889 +16 10 -884511338.987 +17 10 -124395783.193 +18 10 19486.0105974 +151 10 -1344548.31266 +152 10 19720255.1109 +154 10 -832701668.825 +155 10 -56774499.9985 +156 10 -266308.811499 +157 10 2723421.68315 +158 10 -39943549.3075 +160 10 1658448267.65 +161 10 113075928.663 +162 10 -.00187643477693 +163 10 -1240267.52824 +164 10 18190408.5101 +166 10 -768825799.607 +167 10 -52420465.0817 +168 10 266308.785854 +11 11 3610646982.24 +12 11 -.376122089918 +13 11 91672.7575228 +14 11 -1344548.31266 +15 11 75861927.9261 +16 11 -124395783.193 +17 11 931498433.092 +18 11 1328.57726849 +151 11 -91672.7575228 +152 11 1344548.31266 +154 11 -56774499.9985 +155 11 -3870946.78774 +156 11 -18157.2226694 +157 11 185687.696604 +158 11 -2723421.68315 +160 11 113075928.663 +161 11 7709716.3016 +162 11 .0275211288608 +163 11 -84564.5407441 +164 11 1240267.52824 +166 11 -52420465.0817 +167 11 -3574158.36043 +168 11 18157.5987915 +12 12 30908010006.6 +13 12 44174943.359 +14 12 -647906173.656 +16 12 -19486.0105974 +17 12 -1328.57726849 +18 12 8028006381.1 +151 12 -239.03933031 +152 12 3505.94808003 +154 12 -266308.811499 +155 12 -18157.2226694 +156 12 -60303.8364694 +157 12 -25.7784051772 +158 12 378.006534245 +160 12 .00187643861864 +161 12 -.0275211285989 +162 12 -419039.273135 +163 12 264.817735488 +164 12 -3883.95461427 +166 12 266308.785854 +167 12 18157.5987915 +168 12 -70256.865273 +13 13 155261494.809 +14 13 5743062.41889 +15 13 28.1372363567 +16 13 -2822466.33981 +17 13 -192450.249465 +18 13 -5180.35752951 +19 13 -53460538.2035 +20 13 -1225150.27895 +21 13 3741311.97589 +22 13 1344705.96223 +23 13 91694.4092623 +24 13 -44180123.7165 +145 13 -15182822.7343 +146 13 -1067482.97372 +147 13 51131263.6705 +148 13 1344705.96223 +149 13 91694.4092623 +150 13 239.067821852 +151 13 -17974697.9769 +152 13 -1158067.35298 +153 13 2.05882233381 +154 13 -2822466.33981 +155 13 -192450.249465 +156 13 .0284915415423 +157 13 -15182835.018 +158 13 -1067356.89932 +159 13 -51131291.8077 +160 13 1344548.31266 +161 13 91672.7575228 +162 13 -239.03933031 +14 14 71425601.7055 +15 14 -412.659386575 +16 14 41394159.2159 +17 14 2822466.33981 +18 14 -1069.60903405 +19 14 -1225150.27895 +20 14 -35577151.8203 +21 14 255117.03014 +22 14 -19720222.1968 +23 14 -1344705.96223 +24 14 647905104.047 +145 14 -1067482.97372 +146 14 399111.012451 +147 14 3486599.41191 +148 14 -19720222.1968 +149 14 -1344705.96223 +150 14 -3505.94903231 +151 14 -1158067.35298 +152 14 -1069499.36893 +153 14 -30.1945892498 +154 14 41394159.2159 +155 14 2822466.33981 +156 14 -.000952283997322 +157 14 -1067356.89932 +158 14 399128.531709 +159 14 -3486186.75252 +160 14 -19720255.1109 +161 14 -1344548.31266 +162 14 3505.94808003 +15 15 3650051757.77 +16 15 606.556768 +17 15 125.238990307 +19 15 -3741311.97589 +20 15 -255117.03014 +21 15 812930531.292 +22 15 5172954.81566 +23 15 -75861802.6871 +145 15 51131263.6705 +146 15 3486599.41191 +147 15 -941606746.418 +151 15 -2.05882251263 +152 15 30.1945892377 +153 15 -3392699252.2 +157 15 -51131291.8077 +158 15 -3486186.75252 +159 15 -941606296.811 +16 16 1904525997.96 +17 16 -126510185.321 +18 16 -.146548105404 +19 16 1344705.96223 +20 16 -19720222.1968 +21 16 -5172954.81566 +22 16 -884508824.166 +23 16 -124410369.609 +24 16 19485.9998744 +145 16 -1344705.96223 +146 16 19720222.1968 +148 16 -832700284.099 +149 16 -56781157.2103 +150 16 -266308.66495 +151 16 2822466.33981 +152 16 -41394159.2159 +154 16 1720105046.35 +155 16 117285595.027 +156 16 .0107230314752 +157 16 -1344548.31266 +158 16 19720255.1109 +160 16 -832701668.825 +161 16 -56774499.9985 +162 16 266308.811499 +17 17 3751292339.65 +18 17 2.14926763845 +19 17 91694.4092623 +20 17 -1344705.96223 +21 17 75861802.6871 +22 17 -124410369.609 +23 17 931495912.577 +24 17 1328.73453198 +145 17 -91694.4092623 +146 17 1344705.96223 +148 17 -56781157.2103 +149 17 -3871861.0714 +150 17 -18159.371937 +151 17 192450.249465 +152 17 -2822466.33981 +154 17 117285595.027 +155 17 7997134.17417 +156 17 -.15726348578 +157 17 -91672.7575228 +158 17 1344548.31266 +160 17 -56774499.9985 +161 17 -3870946.78774 +162 17 18157.2226694 +18 18 32112168454.3 +19 18 44180123.7165 +20 18 -647905104.047 +22 18 -19485.9998744 +23 18 -1328.73453198 +24 18 8028001963.43 +145 18 -239.067821852 +146 18 3505.94903231 +148 18 -266308.66495 +149 18 -18159.371937 +150 18 -60303.9053591 +151 18 .0284915415432 +152 18 -.000952283997322 +154 18 -.0107230285648 +155 18 .157263485977 +156 18 -392980.743201 +157 18 239.03933031 +158 18 -3505.94808003 +160 18 266308.811499 +161 18 18157.2226694 +162 18 -60303.8364694 +19 19 219316900.158 +20 19 -8272451.23215 +21 19 -78.1508424282 +22 19 -4241754.87925 +23 19 -289178.077331 +24 19 -142432386.411 +25 19 -129927711.112 +26 19 11944914.0496 +27 19 3741317.69424 +28 19 2798044.744 +29 19 190733.383383 +30 19 -186612510.127 +139 19 -12246875.3942 +140 19 -901720.943131 +141 19 51131341.8213 +142 19 2798044.744 +143 19 190733.383383 +144 19 -336.652503136 +145 19 -8498952.71397 +146 19 -478108.621669 +147 19 -5.71835456789 +148 19 -4241754.87925 +149 19 -289178.077331 +150 19 -575.720324988 +151 19 -15182822.7343 +152 19 -1067482.97372 +153 19 -51131263.6705 +154 19 1344705.96223 +155 19 91694.4092623 +156 19 -239.067821852 +20 20 340123226.74 +21 20 1146.2777545 +22 20 62219394.5602 +23 20 4241754.87925 +24 20 2089686731.56 +25 20 11944914.0496 +26 20 -304344479.09 +27 20 255033.156158 +28 20 -41047111.1589 +29 20 -2798044.744 +30 20 2737591835.61 +139 20 -901720.943131 +140 20 919837.389689 +141 20 3485453.13416 +142 20 -41047111.1589 +143 20 -2798044.744 +144 20 4938.66752767 +145 20 -478108.621669 +146 20 -1520544.23155 +147 20 83.8739820197 +148 20 62219394.5602 +149 20 4241754.87925 +150 20 8444.61655998 +151 20 -1067482.97372 +152 20 399111.012451 +153 20 -3486599.41191 +154 20 -19720222.1968 +155 20 -1344705.96223 +156 20 3505.94903231 +21 21 2844230487.43 +22 21 16677256.7023 +23 21 -244679197.577 +25 21 -3741317.69424 +26 21 -255033.156158 +27 21 264124264.243 +28 21 21850211.518 +29 21 -320541000.264 +139 21 51131341.8213 +140 21 3485453.13416 +141 21 -555812342.012 +145 21 5.71835459769 +146 21 -83.8739820179 +147 21 -2423866194.54 +151 21 -51131263.6705 +152 21 -3486599.41191 +153 21 -941606746.418 +22 22 2852468224.59 +23 22 -197149075.397 +24 22 .407035633922 +25 22 2798044.744 +26 22 -41047111.1589 +27 22 -21850211.518 +28 22 -1846782398.44 +29 22 -257599456.807 +30 22 19486.0296575 +139 22 -2798044.744 +140 22 41047111.1589 +142 22 -1725975107.46 +143 22 -117653969.826 +144 22 -266309.071986 +145 22 4241754.87925 +146 22 -62219394.5602 +148 22 2599333105.29 +149 22 177207243.88 +150 22 -.0297830933705 +151 22 -1344705.96223 +152 22 19720222.1968 +154 22 -832700284.099 +155 22 -56781157.2103 +156 22 266308.66495 +23 23 5730883765.75 +24 23 -5.97019663826 +25 23 190733.383383 +26 23 -2798044.744 +27 23 320541000.264 +28 23 -257599456.807 +29 23 1914623041.79 +30 23 1328.29768832 +139 23 -190733.383383 +140 23 2798044.744 +142 23 -117653969.826 +143 23 -8020078.9431 +144 23 -18153.4017404 +145 23 289178.077331 +146 23 -4241754.87925 +148 23 177207243.88 +149 23 12080947.9857 +150 23 .436843656578 +151 23 -91694.4092623 +152 23 1344705.96223 +154 23 -56781157.2103 +155 23 -3871861.0714 +156 23 18159.371937 +24 24 49059884192.9 +25 24 186612510.127 +26 24 -2737591835.61 +28 24 -19486.0296575 +29 24 -1328.29768832 +30 24 16501883733.8 +139 24 336.652503136 +140 24 -4938.66752767 +142 24 -266309.071986 +143 24 -18153.4017404 +144 24 21566.1787783 +145 24 -575.720324988 +146 24 8444.61655998 +148 24 .0297830962809 +149 24 -.436843656389 +150 24 -190273.93149 +151 24 239.067821852 +152 24 -3505.94903231 +154 24 266308.66495 +155 24 18159.371937 +156 24 -60303.9053591 +25 25 382669770.07 +26 25 -11144152.5636 +27 25 51131341.8213 +28 25 -2830438.94272 +29 25 -50249232.3332 +30 25 1985050731.85 +31 25 -240974128.483 +35 25 49659354.6271 +36 25 1798438221.73 +133 25 1181045.14985 +137 25 49659354.6271 +138 25 9903.27380952 +139 25 -702100.230973 +140 25 100959.457081 +141 25 3741317.69424 +142 25 -2830438.94272 +143 25 -50249232.3332 +144 25 10239.9263127 +145 25 -12246875.3942 +146 25 -901720.943131 +147 25 -51131341.8213 +148 25 2798044.744 +149 25 190733.383383 +150 25 336.652503136 +26 26 420721145.968 +27 26 54735453.1342 +28 26 41522331.6781 +29 26 2830438.94272 +30 26 -2737591835.61 +32 26 -106489285.714 +33 26 -3.75e6 +134 26 -12610714.2857 +135 26 -5.125e7 +139 26 100959.457081 +140 26 1803495.73273 +141 26 4005033.15616 +142 26 41522331.6781 +143 26 2830438.94272 +144 26 -4938.66752767 +145 26 -901720.943131 +146 26 919837.389689 +147 26 -3485453.13416 +148 26 -41047111.1589 +149 26 -2798044.744 +150 26 -4938.66752767 +27 27 1915767002.33 +28 27 -256250211.518 +29 27 320541000.264 +32 27 3.75e6 +33 27 170401428.571 +34 27 -2.344e8 +134 27 -5.125e7 +135 27 -509654761.905 +139 27 -3741317.69424 +140 27 -4005033.15616 +141 27 -1284825591.22 +145 27 -51131341.8213 +146 27 -3485453.13416 +147 27 -555812342.012 +28 28 4244204957.05 +29 28 -133890275.388 +30 28 -266309.071986 +33 28 2.344e8 +34 28 1.172e9 +139 28 2830438.94272 +140 28 -41522331.6781 +142 28 1739281282 +143 28 118561007.39 +144 28 19486.0296575 +145 28 -2798044.744 +146 28 41047111.1589 +148 28 -1725975107.46 +149 28 -117653969.826 +150 28 266309.071986 +29 29 5983179098.6 +30 29 -285080.485074 +31 29 49659354.6271 +35 29 -2105712053.56 +36 29 -19531.25 +133 29 -49659354.6271 +137 29 -2087277901.78 +138 29 266927.083333 +139 29 50249232.3332 +140 29 -2830438.94272 +142 29 118561007.39 +143 29 2106474021.76 +144 29 20859.5476883 +145 29 -190733.383383 +146 29 2798044.744 +148 29 -117653969.826 +149 29 -8020078.9431 +150 29 18153.4017404 +30 30 50988230933.5 +31 30 -1798438221.73 +35 30 19531.25 +36 30 8992197929.07 +133 30 -9903.27380952 +137 30 266927.083333 +138 30 42695.9325397 +139 30 10239.9263127 +140 30 -4938.66752767 +142 30 -19486.0296575 +143 30 -20859.5476883 +144 30 60916.4306731 +145 30 -336.652503136 +146 30 4938.66752767 +148 30 266309.071986 +149 30 18153.4017404 +150 30 21566.1787783 +31 31 481967158.686 +35 31 -100112581.49 +103 31 -240974128.483 +107 31 49659354.6271 +108 31 1798438221.73 +127 31 1181045.14985 +131 31 49659354.6271 +132 31 9903.27380952 +133 31 -2380992.01962 +137 31 -100112581.49 +139 31 1181045.14985 +143 31 49659354.6271 +144 31 -9903.27380952 +32 32 232621428.571 +104 32 -106489285.714 +105 32 -3.75e6 +128 32 -12610714.2857 +129 32 -5.125e7 +134 32 5578571.42857 +135 32 -5.96046447754e-8 +140 32 -12610714.2857 +141 32 5.125e7 +33 33 1793125714.29 +104 33 3.75e6 +105 33 170401428.571 +106 33 -2.344e8 +128 33 -5.125e7 +129 33 -509654761.905 +134 33 -1.19209289551e-7 +135 33 -1114619047.62 +140 33 5.125e7 +141 33 -509654761.905 +34 34 4.688e9 +105 34 2.344e8 +106 34 1.172e9 +35 35 4255880952.36 +36 35 1.86264514923e-9 +103 35 49659354.6271 +107 35 -2105712053.56 +108 35 -19531.25 +127 35 -49659354.6271 +131 35 -2087277901.78 +132 35 266927.083333 +133 35 100112581.49 +137 35 4196784226.17 +138 35 -2.32830643654e-10 +139 35 -49659354.6271 +143 35 -2087277901.78 +144 35 -266927.083333 +36 36 35968853100.2 +103 36 -1798438221.73 +107 36 19531.25 +108 36 8992197929.07 +127 36 -9903.27380952 +131 36 266927.083333 +132 36 42695.9325397 +137 36 2.32830643654e-10 +138 36 109399.801587 +139 36 9903.27380952 +143 36 -266927.083333 +144 36 42695.9325397 +37 37 407216172.617 +41 37 -122341579.861 +42 37 .000190746039152 +43 37 -203602411.838 +47 37 60932462.1774 +48 37 1061296104.38 +163 37 1445706.29901 +167 37 60932462.1774 +168 37 -26599.7023809 +169 37 -2902761.53864 +173 37 -122341579.861 +174 37 5.58793544769e-9 +175 37 1445706.29901 +179 37 60932462.1774 +180 37 26599.7023809 +38 38 198977678.571 +44 38 -93082589.2857 +45 38 -3.75e6 +164 38 -14203125 +165 38 4.75e7 +170 38 1.559375e7 +171 38 -8.94069671631e-8 +176 38 -14203125 +177 38 -4.75e7 +39 39 1289045189.5 +40 39 -1.09672546387e-5 +44 39 3.75e6 +45 39 -3897594.75221 +46 39 -65306122.449 +164 39 4.75e7 +165 39 -418541666.667 +170 39 -2.98023223877e-8 +171 39 -444166666.667 +176 39 -4.75e7 +177 39 -418541666.667 +40 40 914285714.286 +45 40 65306122.449 +46 40 228571428.571 +41 41 5222503052.49 +42 41 -9.31322574615e-10 +43 41 60932462.1774 +47 41 -2597905172.08 +48 41 -19531.25 +163 41 -60932462.1774 +167 41 -2559919704.85 +168 41 -247395.833333 +169 41 122341579.861 +173 41 5133185763.88 +174 41 1.62981450558e-9 +175 41 -60932462.1774 +179 41 -2559919704.85 +180 41 247395.833333 +42 42 14858201830.7 +43 42 -1061296104.38 +47 42 19531.25 +48 42 3714541546.53 +163 42 26599.7023809 +167 42 -247395.833333 +168 42 87917.7517361 +169 42 5.47152012587e-9 +173 42 6.98491930962e-10 +174 42 316026.475694 +175 42 -26599.7023809 +179 42 247395.833333 +180 42 87917.7517361 +43 43 407216172.617 +47 43 -122341579.861 +48 43 -9.91863198578e-5 +49 43 -203602411.838 +53 43 60932462.1773 +54 43 1061296104.38 +169 43 1445706.29901 +173 43 60932462.1774 +174 43 -26599.7023809 +175 43 -2902761.53863 +179 43 -122341579.861 +180 43 -2.44472175837e-9 +181 43 1445706.29901 +185 43 60932462.1773 +186 43 26599.7023809 +44 44 198977678.571 +45 44 -2.38418579102e-7 +50 44 -93082589.2857 +51 44 -3.75e6 +170 44 -14203125 +171 44 4.75e7 +176 44 1.559375e7 +177 44 -2.08616256714e-7 +182 44 -14203125 +183 44 -4.75e7 +45 45 1289045189.5 +46 45 5.48362731934e-6 +50 45 3.75e6 +51 45 -3897594.75219 +52 45 -65306122.449 +170 45 4.75e7 +171 45 -418541666.667 +176 45 2.98023223877e-8 +177 45 -444166666.667 +182 45 -4.75e7 +183 45 -418541666.667 +46 46 914285714.286 +51 46 65306122.449 +52 46 228571428.571 +47 47 5222503052.48 +48 47 -4.65661287308e-9 +49 47 60932462.1773 +53 47 -2597905172.07 +54 47 -19531.25 +169 47 -60932462.1774 +173 47 -2559919704.85 +174 47 -247395.833333 +175 47 122341579.861 +179 47 5133185763.87 +180 47 4.07453626394e-9 +181 47 -60932462.1773 +185 47 -2559919704.85 +186 47 247395.833333 +48 48 14858201830.7 +49 48 -1061296104.38 +53 48 19531.25 +54 48 3714541546.53 +169 48 26599.7023809 +173 48 -247395.833333 +174 48 87917.7517361 +175 48 -2.32830643654e-9 +180 48 316026.475694 +181 48 -26599.7023809 +185 48 247395.833333 +186 48 87917.7517361 +49 49 407216172.617 +53 49 -122341579.861 +54 49 5.34076243639e-5 +55 49 -203602411.838 +59 49 60932462.1775 +60 49 1061296104.38 +175 49 1445706.29901 +179 49 60932462.1773 +180 49 -26599.7023809 +181 49 -2902761.53864 +185 49 -122341579.861 +186 49 1.04773789644e-9 +187 49 1445706.29901 +191 49 60932462.1775 +192 49 26599.7023809 +50 50 198977678.571 +56 50 -93082589.2857 +57 50 -3.75e6 +176 50 -14203125 +177 50 4.75e7 +182 50 1.559375e7 +183 50 -2.98023223877e-8 +188 50 -14203125 +189 50 -4.75e7 +51 51 1289045189.5 +52 51 -2.86102294922e-6 +56 51 3.75e6 +57 51 -3897594.7522 +58 51 -65306122.449 +176 51 4.75e7 +177 51 -418541666.667 +182 51 -1.78813934326e-7 +183 51 -444166666.667 +188 51 -4.75e7 +189 51 -418541666.667 +52 52 914285714.286 +57 52 65306122.449 +58 52 228571428.571 +53 53 5222503052.49 +54 53 9.31322574615e-10 +55 53 60932462.1775 +59 53 -2597905172.08 +60 53 -19531.25 +175 53 -60932462.1773 +179 53 -2559919704.85 +180 53 -247395.833333 +181 53 122341579.861 +185 53 5133185763.88 +186 53 -1.2805685401e-9 +187 53 -60932462.1775 +191 53 -2559919704.86 +192 53 247395.833333 +54 54 14858201830.7 +55 54 -1061296104.38 +59 54 19531.25 +60 54 3714541546.53 +175 54 26599.7023809 +179 54 -247395.833333 +180 54 87917.7517361 +181 54 9.31322574615e-10 +185 54 3.95812094212e-9 +186 54 316026.475694 +187 54 -26599.7023809 +191 54 247395.833333 +192 54 87917.7517361 +55 55 277300786.596 +56 55 -3101923.80092 +57 55 -51131286.8839 +58 55 1312271.27988 +59 55 -61260263.867 +60 55 -1022997736.48 +61 55 -47543152.1944 +62 55 1322042.41997 +63 55 3741313.67444 +64 55 -1240267.52824 +65 55 84564.5407441 +66 55 37798021.8761 +79 55 -15930371.5854 +80 55 1115853.26223 +81 55 51131286.8839 +82 55 -1240267.52824 +83 55 84564.5407441 +84 55 -264.817735488 +181 55 1445706.29901 +185 55 60932462.1775 +186 55 -26599.7023809 +187 55 -11650935.864 +188 55 664028.118722 +189 55 -3741313.67444 +190 55 1312271.27988 +191 55 -61260263.867 +192 55 -26864.5201164 +325 55 -19621.4125789 +330 55 500346.020761 +56 56 129743693.493 +57 56 -44013741.032 +58 56 19246452.9736 +59 56 -1312271.27988 +60 56 554365443.862 +61 56 1322042.41997 +62 56 -28243530.7564 +63 56 -255092.119607 +64 56 -18190408.5101 +65 56 1240267.52824 +66 56 554365443.862 +79 56 1115853.26223 +80 56 359230.938651 +81 56 -3486258.96796 +82 56 -18190408.5101 +83 56 1240267.52824 +84 56 -3883.95461427 +182 56 -14203125 +183 56 4.75e7 +187 56 664028.118722 +188 56 7291026.49292 +189 56 -3494907.88039 +190 56 19246452.9736 +191 56 -1312271.27988 +192 56 -3883.95461427 +326 56 -1864705.88235 +57 57 2606633229.89 +58 57 60380095.1266 +59 57 -64909343.3301 +61 57 -3741313.67444 +62 57 255092.119607 +63 57 889752960.235 +64 57 -4425681.3016 +65 57 -64909343.3301 +79 57 51131286.8839 +80 57 -3486258.96796 +81 57 -1008230888.57 +182 57 4.75e7 +183 57 -418541666.667 +187 57 3741313.67444 +188 57 3494907.88039 +189 57 -2065696418.72 +327 57 -19621.4125789 +328 57 -500346.020761 +58 58 1360689814.09 +59 58 58120631.4485 +60 58 266308.785854 +61 58 -1240267.52824 +62 58 -18190408.5101 +63 58 4425681.3016 +64 58 -815326541.667 +65 58 114874410.524 +66 58 19486.008721 +79 58 1240267.52824 +80 58 18190408.5101 +82 58 -768825799.607 +83 58 52420465.0817 +84 58 -266308.785854 +187 58 -1312271.27988 +188 58 -19246452.9736 +190 58 798395044.586 +191 58 -54436570.1275 +192 58 -19486.008721 +327 58 500346.020761 +328 58 8505882.35294 +59 59 4346251312.17 +60 59 229238.234542 +61 59 84564.5407442 +62 59 1240267.52824 +63 59 64909343.3301 +64 59 114874410.524 +65 59 861648873.443 +66 59 -1328.60478962 +79 59 -84564.5407442 +80 59 -1240267.52824 +82 59 52420465.0817 +83 59 -3574158.36043 +84 59 18157.5987915 +181 59 -60932462.1775 +185 59 -2559919704.86 +186 59 -247395.833333 +187 59 61260263.867 +188 59 1312271.27988 +190 59 -54436570.1275 +191 59 2570304503.38 +192 59 -18202.6452104 +60 60 22298034041.8 +61 60 -37798021.8761 +62 60 -554365443.862 +64 60 -19486.008721 +65 60 1328.60478962 +66 60 7425919663.24 +79 60 264.817735488 +80 60 3883.95461427 +82 60 -266308.785854 +83 60 18157.5987915 +84 60 -70256.865273 +181 60 26599.7023809 +185 60 -247395.833333 +186 60 87917.7517361 +187 60 -26864.5201164 +188 60 -3883.95461427 +190 60 19486.008721 +191 60 18202.6452104 +192 60 -64535.7534561 +325 60 -500346.020761 +330 60 8505882.35294 +61 61 151303864.252 +62 61 -5973284.88839 +63 61 -4.9237780571 +64 61 2723421.68315 +65 61 -185687.696604 +66 61 6376921.48282 +67 61 -53460600.8758 +68 61 1225004.91393 +69 61 3741314.03471 +70 61 -1344548.31266 +71 61 91672.7575228 +72 61 44174943.359 +73 61 -15182835.018 +74 61 1067356.89932 +75 61 51131291.8077 +76 61 -1344548.31266 +77 61 91672.7575228 +78 61 -239.03933031 +79 61 -19186904.5787 +80 61 1243027.39295 +81 61 -.360276475549 +82 61 2723421.68315 +83 61 -185687.696604 +84 61 25.7784051772 +187 61 -15930371.5854 +188 61 1115853.26223 +189 61 -51131286.8839 +190 61 -1240267.52824 +191 61 84564.5407442 +192 61 264.817735488 +62 62 64102954.9725 +63 62 -72.2154414952 +64 62 39943549.3075 +65 62 -2723421.68315 +66 62 93540729.7935 +67 62 1225004.91393 +68 62 -35577190.0604 +69 62 -255086.835551 +70 62 -19720255.1109 +71 62 1344548.31266 +72 62 647906173.656 +73 62 1067356.89932 +74 62 399128.531709 +75 62 -3486186.75252 +76 62 -19720255.1109 +77 62 1344548.31266 +78 62 -3505.94808003 +79 62 1243027.39295 +80 62 -1040593.62601 +81 62 -5.28405669332 +82 62 39943549.3075 +83 62 -2723421.68315 +84 62 378.006534245 +187 62 1115853.26223 +188 62 359230.938651 +189 62 3486258.96796 +190 62 -18190408.5101 +191 62 1240267.52824 +192 62 3883.95461427 +63 63 3787116429.26 +64 63 -746666.957293 +65 63 -10952584.596 +67 63 -3741314.03471 +68 63 255086.835551 +69 63 812930006.362 +70 63 -5172348.2589 +71 63 -75861927.9261 +73 63 51131291.8077 +74 63 -3486186.75252 +75 63 -941606296.811 +79 63 .360276684165 +80 63 5.28405667935 +81 63 -3539962210.47 +187 63 -51131286.8839 +188 63 3486258.96796 +189 63 -1008230888.57 +64 64 1838797922.66 +65 64 121372016.76 +66 64 .0256446786225 +67 64 -1344548.31266 +68 64 -19720255.1109 +69 64 5172348.2589 +70 64 -884511338.987 +71 64 124395783.193 +72 64 19486.0105974 +73 64 1344548.31266 +74 64 19720255.1109 +76 64 -832701668.825 +77 64 56774499.9985 +78 64 -266308.811499 +79 64 -2723421.68315 +80 64 -39943549.3075 +82 64 1658448267.65 +83 64 -113075928.663 +84 64 -.0018764405977 +187 64 1240267.52824 +188 64 18190408.5101 +190 64 -768825799.607 +191 64 52420465.0817 +192 64 266308.785854 +65 65 3610646982.24 +66 65 .376122091082 +67 65 91672.7575228 +68 65 1344548.31266 +69 65 75861927.9261 +70 65 124395783.193 +71 65 931498433.092 +72 65 -1328.57726849 +73 65 -91672.7575228 +74 65 -1344548.31266 +76 65 56774499.9985 +77 65 -3870946.78774 +78 65 18157.2226694 +79 65 185687.696604 +80 65 2723421.68315 +82 65 -113075928.663 +83 65 7709716.3016 +84 65 -.0275211285698 +187 65 -84564.5407442 +188 65 -1240267.52824 +190 65 52420465.0817 +191 65 -3574158.36043 +192 65 -18157.5987915 +66 66 30908010006.6 +67 66 -44174943.359 +68 66 -647906173.656 +70 66 -19486.0105974 +71 66 1328.57726849 +72 66 8028006381.1 +73 66 239.03933031 +74 66 3505.94808003 +76 66 -266308.811499 +77 66 18157.2226694 +78 66 -60303.8364694 +79 66 25.7784051772 +80 66 378.006534245 +82 66 .00187643722165 +83 66 .0275211287953 +84 66 -419039.273135 +187 66 -264.817735488 +188 66 -3883.95461427 +190 66 266308.785854 +191 66 -18157.5987915 +192 66 -70256.865273 +67 67 155261570.756 +68 67 -5742722.17494 +70 67 2822300.80656 +71 67 -192427.520127 +72 67 -4.05318496632e-6 +73 67 -17974698.9681 +74 67 1157998.54845 +75 67 8.94069671631e-8 +76 67 2822300.80656 +77 67 -192427.520127 +78 67 2.18278728425e-11 +79 67 -15182835.018 +80 67 1067356.89932 +81 67 -51131291.8077 +82 67 -1344548.31266 +83 67 91672.7575228 +84 67 239.03933031 +85 67 -53460600.8758 +86 67 1225004.91393 +87 67 3741314.03471 +88 67 -1344548.31266 +89 67 91672.7575228 +90 67 44174943.359 +109 67 -15182835.018 +110 67 1067356.89932 +111 67 51131291.8077 +112 67 -1344548.31266 +113 67 91672.7575228 +114 67 -239.03933031 +68 68 71425613.2952 +69 68 -3.27825546265e-7 +70 68 41394192.6676 +71 68 -2822300.80656 +73 68 1157998.54845 +74 68 -1069490.23786 +75 68 -2.98023223877e-8 +76 68 41394192.6676 +77 68 -2822300.80656 +79 68 1067356.89932 +80 68 399128.531709 +81 68 3486186.75252 +82 68 -19720255.1109 +83 68 1344548.31266 +84 68 3505.94808003 +85 68 1225004.91393 +86 68 -35577190.0604 +87 68 -255086.83555 +88 68 -19720255.1109 +89 68 1344548.31266 +90 68 647906173.656 +109 68 1067356.89932 +110 68 399128.531709 +111 68 -3486186.75252 +112 68 -19720255.1109 +113 68 1344548.31266 +114 68 -3505.94808003 +69 69 3650050831.05 +70 69 4.76837158203e-7 +73 69 2.98023223877e-8 +74 69 2.14204192162e-8 +75 69 -3392698250.16 +79 69 -51131291.8077 +80 69 3486186.75252 +81 69 -941606296.811 +85 69 -3741314.03471 +86 69 255086.83555 +87 69 812930006.362 +88 69 -5172348.25889 +89 69 -75861927.9261 +109 69 51131291.8077 +110 69 -3486186.75252 +111 69 -941606296.811 +70 70 1904525460.84 +71 70 126502770.623 +72 70 3.72529029846e-9 +73 70 -2822300.80656 +74 70 -41394192.6676 +76 70 1720106446.13 +77 70 -117278717.072 +78 70 -2.91038304567e-9 +79 70 1344548.31266 +80 70 19720255.1109 +82 70 -832701668.825 +83 70 56774499.9985 +84 70 266308.811499 +85 70 -1344548.31266 +86 70 -19720255.1109 +87 70 5172348.25889 +88 70 -884511338.987 +89 70 124395783.193 +90 70 19486.0105974 +109 70 1344548.31266 +110 70 19720255.1109 +112 70 -832701668.825 +113 70 56774499.9985 +114 70 -266308.811499 +71 71 3751294392.63 +72 71 1.39698386192e-9 +73 71 192427.520127 +74 71 2822300.80656 +76 71 -117278717.072 +77 71 7996189.71775 +78 71 8.0035533756e-11 +79 71 -91672.7575228 +80 71 -1344548.31266 +82 71 56774499.9985 +83 71 -3870946.78774 +84 71 -18157.2226694 +85 71 91672.7575228 +86 71 1344548.31266 +87 71 75861927.9261 +88 71 124395783.193 +89 71 931498433.092 +90 71 -1328.57726849 +109 71 -91672.7575228 +110 71 -1344548.31266 +112 71 56774499.9985 +113 71 -3870946.78774 +114 71 18157.2226694 +72 72 32112177289.6 +73 72 2.18278728425e-11 +76 72 -1.62981450558e-9 +77 72 2.2555468604e-10 +78 72 -392980.563664 +79 72 -239.03933031 +80 72 -3505.94808003 +82 72 266308.811499 +83 72 -18157.2226694 +84 72 -60303.8364694 +85 72 -44174943.359 +86 72 -647906173.656 +88 72 -19486.0105974 +89 72 1328.57726849 +90 72 8028006381.1 +109 72 239.03933031 +110 72 3505.94808003 +112 72 -266308.811499 +113 72 18157.2226694 +114 72 -60303.8364694 +73 73 191836155.982 +74 73 -8168823.18017 +76 73 -7.45058059692e-9 +77 73 4.65661287308e-10 +78 73 -4.05325408792e-6 +79 73 -47577708.9868 +80 73 791699.243002 +81 73 2.08616256714e-7 +84 73 -44175717.9389 +85 73 -15182835.018 +86 73 1067356.89932 +87 73 -51131291.8077 +88 73 1344548.31266 +89 73 -91672.7575228 +90 73 -239.03933031 +109 73 -47577708.9868 +110 73 791699.243002 +111 73 -1.78813934326e-7 +112 73 -2.23517417908e-8 +113 73 9.31322574615e-10 +114 73 44175717.9389 +928 73 -15182835.018 +929 73 1067356.89932 +930 73 -51131291.8077 +931 73 -1344548.31266 +932 73 91672.7575228 +933 73 239.03933031 +1000 73 -15182835.018 +1001 73 1067356.89932 +1002 73 51131291.8077 +1003 73 -1344548.31266 +1004 73 91672.7575228 +1005 73 -239.03933031 +1026 73 -17974698.9681 +1027 73 1157998.54845 +1028 73 8.94069671631e-8 +1029 73 2822300.80656 +1030 73 -192427.520127 +1031 73 2.18278728425e-11 +74 74 72582413.2841 +75 74 -1.49011611938e-8 +76 74 -1.19209289551e-7 +77 74 1.49011611938e-8 +79 74 791699.243002 +80 74 -36019973.4676 +81 74 -1.39698386192e-8 +84 74 -647917534.284 +85 74 1067356.89932 +86 74 399128.531709 +87 74 3486186.75252 +88 74 19720255.1109 +89 74 -1344548.31266 +90 74 -3505.94808003 +109 74 791699.243002 +110 74 -36019973.4676 +111 74 1.210719347e-8 +112 74 -2.38418579102e-7 +113 74 7.45058059692e-9 +114 74 647917534.284 +928 74 1067356.89932 +929 74 399128.531709 +930 74 3486186.75252 +931 74 -19720255.1109 +932 74 1344548.31266 +933 74 3505.94808003 +1000 74 1067356.89932 +1001 74 399128.531709 +1002 74 -3486186.75252 +1003 74 -19720255.1109 +1004 74 1344548.31266 +1005 74 -3505.94808003 +1026 74 1157998.54845 +1027 74 -1069490.23786 +1028 74 -2.98023223877e-8 +1029 74 41394192.6676 +1030 74 -2822300.80656 +75 75 7291900372.6 +76 75 4.76837158203e-7 +79 75 -1.78813934326e-7 +80 75 1.210719347e-8 +81 75 1629960657.48 +82 75 5172348.2589 +83 75 75861927.9261 +85 75 -51131291.8077 +86 75 3486186.75252 +87 75 -941606296.811 +109 75 2.08616256714e-7 +110 75 -1.39698386192e-8 +111 75 1629960657.48 +112 75 -5172348.25889 +113 75 -75861927.9261 +928 75 -51131291.8077 +929 75 3486186.75252 +930 75 -941606296.811 +1000 75 51131291.8077 +1001 75 -3486186.75252 +1002 75 -941606296.811 +1026 75 2.98023223877e-8 +1027 75 2.14204192162e-8 +1028 75 -3392698250.16 +76 76 3662822857.29 +77 76 6620153.27119 +78 76 5.58793544769e-9 +79 76 -1.49011611938e-8 +80 76 -2.38418579102e-7 +81 76 -5172348.2589 +82 76 -1708956928.73 +83 76 180607374.794 +84 76 -5.93718141317e-9 +85 76 -1344548.31266 +86 76 -19720255.1109 +88 76 -832701668.825 +89 76 56774499.9985 +90 76 266308.811499 +109 76 7.45058059692e-9 +111 76 5172348.25889 +112 76 -1708956928.73 +113 76 180607374.794 +114 76 9.31322574615e-10 +928 76 1344548.31266 +929 76 19720255.1109 +931 76 -832701668.825 +932 76 56774499.9985 +933 76 266308.811499 +1000 76 1344548.31266 +1001 76 19720255.1109 +1003 76 -832701668.825 +1004 76 56774499.9985 +1005 76 -266308.811499 +1026 76 -2822300.80656 +1027 76 -41394192.6676 +1029 76 1720106446.13 +1030 76 -117278717.072 +1031 76 -2.91038304567e-9 +77 77 3759468119.08 +78 77 -4.65661287308e-10 +79 77 9.31322574615e-10 +80 77 1.49011611938e-8 +81 77 -75861927.9261 +82 77 180607374.794 +83 77 927665866.008 +84 77 4.07453626394e-10 +85 77 91672.7575228 +86 77 1344548.31266 +88 77 56774499.9985 +89 77 -3870946.78774 +90 77 -18157.2226694 +110 77 7.45058059692e-9 +111 77 75861927.9261 +112 77 180607374.794 +113 77 927665866.008 +114 77 -5.82076609135e-11 +928 77 -91672.7575228 +929 77 -1344548.31266 +931 77 56774499.9985 +932 77 -3870946.78774 +933 77 -18157.2226694 +1000 77 -91672.7575228 +1001 77 -1344548.31266 +1003 77 56774499.9985 +1004 77 -3870946.78774 +1005 77 18157.2226694 +1026 77 192427.520127 +1027 77 2822300.80656 +1029 77 -117278717.072 +1030 77 7996189.71775 +1031 77 8.0035533756e-11 +78 78 32112959569.1 +79 78 44175717.9389 +80 78 647917534.284 +82 78 9.31322574615e-10 +83 78 -6.54836185277e-11 +84 78 8028164009.65 +85 78 239.03933031 +86 78 3505.94808003 +88 78 266308.811499 +89 78 -18157.2226694 +90 78 -60303.8364694 +109 78 -44175717.9389 +110 78 -647917534.284 +112 78 -5.93718141317e-9 +113 78 4.07453626394e-10 +114 78 8028164009.65 +928 78 -239.03933031 +929 78 -3505.94808003 +931 78 266308.811499 +932 78 -18157.2226694 +933 78 -60303.8364694 +1000 78 239.03933031 +1001 78 3505.94808003 +1003 78 -266308.811499 +1004 78 18157.2226694 +1005 78 -60303.8364694 +1026 78 2.18278728425e-11 +1029 78 -1.62981450558e-9 +1030 78 2.2555468604e-10 +1031 78 -392980.563664 +79 79 188393156.607 +80 79 -8436876.78029 +81 79 -2.38418579102e-7 +82 79 -7.45058059692e-9 +83 79 4.65661287308e-10 +84 79 6376973.01368 +187 79 -40215225.2558 +188 79 792702.428314 +189 79 1.78813934326e-7 +191 79 4.65661287308e-10 +192 79 -37798744.9252 +876 79 1115853.26223 +877 79 -51131286.8839 +878 79 -1240267.52824 +879 79 84564.5407442 +880 79 264.817735488 +884 79 -15930371.5854 +928 79 -19186904.5787 +929 79 1243027.39295 +930 79 -.360276475549 +931 79 2723421.68315 +932 79 -185687.696604 +933 79 25.7784051772 +1026 79 -15182835.018 +1027 79 1067356.89932 +1028 79 51131291.8077 +1029 79 -1344548.31266 +1030 79 91672.7575228 +1031 79 -239.03933031 +80 80 65227529.448 +81 80 2.98023223877e-8 +82 80 -1.19209289551e-7 +83 80 7.45058059692e-9 +84 80 93541485.8083 +187 80 792702.428314 +188 80 -28643087.669 +189 80 -1.210719347e-8 +190 80 -1.19209289551e-7 +191 80 1.49011611938e-8 +192 80 -554376048.476 +876 80 359230.938651 +877 80 3486258.96796 +878 80 -18190408.5101 +879 80 1240267.52824 +880 80 3883.95461427 +884 80 1115853.26223 +928 80 1243027.39295 +929 80 -1040593.62601 +930 80 -5.28405669332 +931 80 39943549.3075 +932 80 -2723421.68315 +933 80 378.006534245 +1026 80 1067356.89932 +1027 80 399128.531709 +1028 80 -3486186.75252 +1029 80 -19720255.1109 +1030 80 1344548.31266 +1031 80 -3505.94808003 +81 81 7566886746.59 +82 81 -746666.957293 +83 81 -10952584.596 +187 81 -8.94069671631e-8 +188 81 6.51925802231e-9 +189 81 1782751387.64 +190 81 4425681.3016 +191 81 64909343.3301 +876 81 3486258.96796 +877 81 -1008230888.57 +884 81 -51131286.8839 +928 81 .360276684165 +929 81 5.28405667935 +930 81 -3539962210.47 +1026 81 51131291.8077 +1027 81 -3486186.75252 +1028 81 -941606296.811 +82 82 3536851017.96 +83 82 5595759.03008 +84 82 3.72529029846e-9 +187 82 1.49011611938e-8 +188 82 2.38418579102e-7 +189 82 -4425681.3016 +190 82 -1575092448.79 +191 82 166677149.486 +192 82 -3.84170562029e-9 +876 82 18190408.5101 +878 82 -768825799.607 +879 82 52420465.0817 +880 82 266308.785854 +884 82 1240267.52824 +928 82 -2723421.68315 +929 82 -39943549.3075 +931 82 1658448267.65 +932 82 -113075928.663 +933 82 -.0018764405977 +1026 82 1344548.31266 +1027 82 19720255.1109 +1029 82 -832701668.825 +1030 82 56774499.9985 +1031 82 -266308.811499 +83 83 3618540811.88 +84 83 -2.32830643654e-10 +187 83 -1.39698386192e-9 +188 83 -2.23517417908e-8 +189 83 -64909343.3301 +190 83 166677149.486 +191 83 858116833.194 +192 83 2.61934474111e-10 +876 83 -1240267.52824 +878 83 52420465.0817 +879 83 -3574158.36043 +880 83 -18157.5987915 +884 83 -84564.5407442 +928 83 185687.696604 +929 83 2723421.68315 +931 83 -113075928.663 +932 83 7709716.3016 +933 83 -.0275211285698 +1026 83 -91672.7575228 +1027 83 -1344548.31266 +1029 83 56774499.9985 +1030 83 -3870946.78774 +1031 83 18157.2226694 +84 84 30908803746 +187 84 37798744.9252 +188 84 554376048.476 +190 84 9.31322574615e-10 +191 84 -6.54836185277e-11 +192 84 7426079945.47 +876 84 -3883.95461427 +878 84 266308.785854 +879 84 -18157.5987915 +880 84 -70256.865273 +884 84 -264.817735488 +928 84 25.7784051772 +929 84 378.006534245 +931 84 .00187643722165 +932 84 .0275211287953 +933 84 -419039.273135 +1026 84 239.03933031 +1027 84 3505.94808003 +1029 84 -266308.811499 +1030 84 18157.2226694 +1031 84 -60303.8364694 +85 85 219786857.668 +86 85 9082570.34129 +87 85 7.81556820869 +88 85 4242271.82777 +89 85 -289249.055857 +90 85 142947993.157 +91 85 -129927944.051 +92 85 -11947748.2381 +93 85 3741313.46284 +94 85 -2798719.34207 +95 85 190826.013807 +96 85 186657503.333 +109 85 -8498970.9065 +110 85 478016.380712 +111 85 .571871042252 +112 85 4242271.82777 +113 85 -289249.055857 +114 85 575.77205751 +115 85 -12246844.9199 +116 85 901939.25889 +117 85 51131283.9922 +118 85 -2798719.34207 +119 85 190826.013807 +120 85 336.7327272 +331 85 -469661.896808 +332 85 -807139.556004 +336 85 465433.183904 +86 86 341597143.014 +87 86 114.627675056 +88 86 62219287.8443 +89 86 -4242271.82777 +90 86 2089417962.7 +91 86 -11947748.2381 +92 86 -304343053.582 +93 86 -255095.222941 +94 86 -41046971.5288 +95 86 2798719.34207 +96 86 2737582547.04 +109 86 478016.380712 +110 86 -1520530.71707 +111 86 8.38739084359 +112 86 62219287.8443 +113 86 -4242271.82777 +114 86 8444.58499814 +115 86 901939.25889 +116 86 919806.359872 +117 86 -3486301.3802 +118 86 -41046971.5288 +119 86 2798719.34207 +120 86 4938.63691812 +331 86 -807139.556004 +332 86 -1475303.54621 +336 86 -258410.689858 +87 87 2844251796.91 +88 87 -17148564.6377 +89 87 -244419574.061 +91 87 -3741313.46284 +92 87 255095.222941 +93 87 264125013.707 +94 87 -21855479.7126 +95 87 -320539912.677 +109 87 -.571871072054 +110 87 -8.38739084173 +111 87 -2423866304.93 +115 87 51131283.9922 +116 87 -3486301.3802 +117 87 -555812681.016 +333 87 -21534.2241549 +334 87 -465433.183904 +335 87 258410.689858 +88 88 2865882967.96 +89 88 189727008.632 +90 88 -.0407060831785 +91 88 -2798719.34207 +92 88 -41046971.5288 +93 88 21855479.7126 +94 88 -1846771741.73 +95 88 257661563.949 +96 88 19486.007619 +109 88 -4242271.82777 +110 88 -62219287.8443 +112 88 2599328623.8 +113 88 -177228952.942 +114 88 .00297849357594 +115 88 2798719.34207 +116 88 41046971.5288 +118 88 -1725969241.24 +119 88 117682336.099 +120 88 -266308.770792 +333 88 465433.183904 +334 88 6706473.2902 +335 88 -3723465.47124 +89 89 5735011586.81 +90 89 -.597019140958 +91 89 190826.013807 +92 89 2798719.34207 +93 89 320539912.677 +94 89 257661563.949 +95 89 1914612328.51 +96 89 -1328.62095282 +109 89 289249.055857 +110 89 4242271.82777 +112 89 -177228952.942 +113 89 12083928.7042 +114 89 .0436843274147 +115 89 -190826.013807 +116 89 -2798719.34207 +118 89 117682336.099 +119 89 -8023973.94966 +120 89 18157.8196885 +333 89 -258410.689858 +334 89 -3723465.47124 +335 89 2067285.51886 +90 90 49077403219.1 +91 90 -186657503.333 +92 90 -2737582547.04 +94 90 -19486.007619 +95 90 1328.62095282 +96 90 16501865070.4 +109 90 575.77205751 +110 90 8444.58499814 +112 90 -.00297849229537 +113 90 -.0436843274947 +114 90 -190274.046605 +115 90 -336.7327272 +116 90 -4938.63691812 +118 90 -266308.770792 +119 90 18157.8196885 +120 90 21566.0523277 +331 90 -465433.183904 +332 90 258410.689858 +336 90 8773758.80906 +91 91 382669989.736 +92 91 11146791.8728 +93 91 51131283.9922 +94 91 2831121.42449 +95 91 -50249326.0411 +96 91 -1985095725.06 +97 91 -240974128.483 +101 91 49659354.6271 +102 91 -1798438221.73 +109 91 -12246844.9199 +110 91 901939.25889 +111 91 -51131283.9922 +112 91 -2798719.34207 +113 91 190826.013807 +114 91 -336.7327272 +115 91 -702117.432258 +116 91 -100982.893513 +117 91 3741313.46284 +118 91 2831121.42449 +119 91 -50249326.0411 +120 91 -10240.0065367 +121 91 1181045.14985 +125 91 49659354.6271 +126 91 -9903.27380952 +92 92 420719747.106 +93 92 -54736301.3802 +94 92 41522191.5105 +95 92 -2831121.42449 +96 92 -2737582547.04 +98 92 -106489285.714 +99 92 3.75e6 +109 92 901939.25889 +110 92 919806.359872 +111 92 3486301.3802 +112 92 -41046971.5288 +113 92 2798719.34207 +114 92 -4938.63691812 +115 92 -100982.893513 +116 92 1803500.11615 +117 92 -4005095.22294 +118 92 41522191.5105 +119 92 -2831121.42449 +120 92 -4938.63691812 +122 92 -12610714.2857 +123 92 5.125e7 +93 93 1915767704.3 +94 93 256255479.713 +95 93 320539912.677 +98 93 -3.75e6 +99 93 170401428.571 +100 93 2.344e8 +109 93 -51131283.9922 +110 93 3486301.3802 +111 93 -555812681.016 +115 93 -3741313.46284 +116 93 4005095.22294 +117 93 -1284826703.66 +122 93 5.125e7 +123 93 -509654761.905 +94 94 4244207290.96 +95 94 133922554.263 +96 94 -266308.770792 +99 94 -2.344e8 +100 94 1.172e9 +109 94 2798719.34207 +110 94 41046971.5288 +112 94 -1725969241.24 +113 94 117682336.099 +114 94 266308.770792 +115 94 -2831121.42449 +116 94 -41522191.5105 +118 94 1739275400.73 +119 94 -118589594.406 +120 94 19486.007619 +95 95 5983170295.64 +96 95 285084.903022 +97 95 49659354.6271 +101 95 -2105712053.56 +102 95 19531.25 +109 95 -190826.013807 +110 95 -2798719.34207 +112 95 117682336.099 +113 95 -8023973.94966 +114 95 -18157.8196885 +115 95 50249326.0411 +116 95 2831121.42449 +118 95 -118589594.406 +119 95 2106477946.93 +120 95 -20859.8709528 +121 95 -49659354.6271 +125 95 -2087277901.78 +126 95 -266927.083333 +96 96 50988193606.8 +97 96 1798438221.73 +101 96 -19531.25 +102 96 8992197929.07 +109 96 336.7327272 +110 96 4938.63691812 +112 96 266308.770792 +113 96 -18157.8196885 +114 96 21566.0523277 +115 96 -10240.0065367 +116 96 -4938.63691812 +118 96 -19486.007619 +119 96 20859.8709528 +120 96 60916.1360204 +121 96 9903.27380952 +125 96 -266927.083333 +126 96 42695.9325397 +97 97 481967158.686 +101 97 -100112581.49 +103 97 -240974128.483 +107 97 49659354.6271 +108 97 -1798438221.73 +115 97 1181045.14985 +119 97 49659354.6271 +120 97 9903.27380952 +121 97 -2380992.01962 +125 97 -100112581.49 +127 97 1181045.14985 +131 97 49659354.6271 +132 97 -9903.27380952 +98 98 232621428.571 +104 98 -106489285.714 +105 98 3.75e6 +116 98 -12610714.2857 +117 98 -5.125e7 +122 98 5578571.42857 +123 98 -5.96046447754e-8 +128 98 -12610714.2857 +129 98 5.125e7 +99 99 1793125714.29 +104 99 -3.75e6 +105 99 170401428.571 +106 99 2.344e8 +116 99 -5.125e7 +117 99 -509654761.905 +122 99 -1.19209289551e-7 +123 99 -1114619047.62 +128 99 5.125e7 +129 99 -509654761.905 +100 100 4.688e9 +105 100 -2.344e8 +106 100 1.172e9 +101 101 4255880952.36 +102 101 1.86264514923e-9 +103 101 49659354.6271 +107 101 -2105712053.56 +108 101 19531.25 +115 101 -49659354.6271 +119 101 -2087277901.78 +120 101 266927.083333 +121 101 100112581.49 +125 101 4196784226.17 +126 101 -2.32830643654e-10 +127 101 -49659354.6271 +131 101 -2087277901.78 +132 101 -266927.083333 +102 102 35968853100.2 +103 102 1798438221.73 +107 102 -19531.25 +108 102 8992197929.07 +115 102 -9903.27380952 +119 102 266927.083333 +120 102 42695.9325397 +125 102 2.32830643654e-10 +126 102 109399.801587 +127 102 9903.27380952 +131 102 -266927.083333 +132 102 42695.9325397 +103 103 482929227.652 +107 103 -100112581.49 +121 103 1181045.14985 +125 103 49659354.6271 +126 103 9903.27380952 +127 103 -2380992.01962 +131 103 -100112581.49 +133 103 1181045.14985 +137 103 49659354.6271 +138 103 -9903.27380952 +385 103 -962068.965517 +104 104 232623351.569 +108 104 167300.832342 +122 104 -12610714.2857 +123 104 -5.125e7 +128 104 5578571.42857 +129 104 -5.96046447754e-8 +134 104 -12610714.2857 +135 104 5.125e7 +386 104 -1922.9980729 +390 104 167300.832342 +105 105 1793127637.28 +107 105 -167300.832342 +122 105 -5.125e7 +123 105 -509654761.905 +128 105 -1.19209289551e-7 +129 105 -1114619047.62 +134 105 5.125e7 +135 105 -509654761.905 +387 105 -1922.9980729 +389 105 -167300.832342 +106 106 4.688e9 +107 107 4275287848.92 +108 107 1.86264514923e-9 +121 107 -49659354.6271 +125 107 -2087277901.78 +126 107 266927.083333 +127 107 100112581.49 +131 107 4196784226.17 +132 107 -2.32830643654e-10 +133 107 -49659354.6271 +137 107 -2087277901.78 +138 107 -266927.083333 +387 107 167300.832342 +389 107 9703448.27586 +108 108 35988259996.8 +121 108 -9903.27380952 +125 108 266927.083333 +126 108 42695.9325397 +131 108 2.32830643654e-10 +132 108 109399.801587 +133 108 9903.27380952 +137 108 -266927.083333 +138 108 42695.9325397 +386 108 -167300.832342 +390 108 9703448.27586 +109 109 256702325.729 +110 109 6667323.79002 +111 109 2.38418579102e-7 +112 109 -2.98023223877e-8 +113 109 1.86264514923e-9 +114 109 142949144.743 +115 109 -136797653.156 +116 109 -11546508.5548 +117 109 2.98023223877e-8 +118 109 1.49011611938e-8 +120 109 186659429.498 +235 109 -469661.896808 +236 109 -807139.556004 +240 109 465433.183904 +1000 109 -8498970.9065 +1001 109 478016.380712 +1002 109 .571871042252 +1003 109 4242271.82777 +1004 109 -289249.055857 +1005 109 575.77205751 +1019 109 -12246844.9199 +1021 109 901939.25889 +1022 109 51131283.9922 +1023 109 -2798719.34207 +1024 109 190826.013807 +1025 109 336.7327272 +1026 109 -15182835.018 +1027 109 1067356.89932 +1028 109 -51131291.8077 +1029 109 -1344548.31266 +1030 109 91672.7575228 +1031 109 239.03933031 +110 110 343253871.295 +111 110 -1.49011611938e-8 +113 110 2.98023223877e-8 +114 110 2089434851.86 +115 110 -11546508.5548 +116 110 -305355402.63 +117 110 -1.86264514923e-9 +119 110 1.49011611938e-8 +120 110 2737610796.84 +235 110 -807139.556004 +236 110 -1475303.54621 +240 110 -258410.689858 +1000 110 478016.380712 +1001 110 -1520530.71707 +1002 110 8.38739084359 +1003 110 62219287.8443 +1004 110 -4242271.82777 +1005 110 8444.58499814 +1019 110 901939.25889 +1021 110 919806.359872 +1022 110 -3486301.3802 +1023 110 -41046971.5288 +1024 110 2798719.34207 +1025 110 4938.63691812 +1026 110 1067356.89932 +1027 110 399128.531709 +1028 110 3486186.75252 +1029 110 -19720255.1109 +1030 110 1344548.31266 +1031 110 3505.94808003 +111 111 5648765868.99 +112 111 -17148564.6377 +113 111 -244419574.061 +115 111 1.49011611939e-7 +116 111 -1.02445483208e-8 +117 111 563865573.266 +118 111 -21855479.7126 +119 111 -320539912.677 +237 111 -21534.2241549 +238 111 -465433.183904 +239 111 258410.689858 +1000 111 -.571871072054 +1001 111 -8.38739084173 +1002 111 -2423866304.93 +1019 111 51131283.9922 +1021 111 -3486301.3802 +1022 111 -555812681.016 +1026 111 -51131291.8077 +1027 111 3486186.75252 +1028 111 -941606296.811 +112 112 5494947889.62 +113 112 10470578.7879 +114 112 -1.86264514923e-9 +115 112 1.49011611938e-8 +116 112 2.38418579102e-7 +117 112 21855479.7126 +118 112 -3570075646.19 +119 112 375162168.502 +120 112 -1.86264514923e-9 +237 112 465433.183904 +238 112 6706473.2902 +239 112 -3723465.47124 +1000 112 -4242271.82777 +1001 112 -62219287.8443 +1003 112 2599328623.8 +1004 112 -177228952.942 +1005 112 .00297849357594 +1019 112 2798719.34207 +1021 112 41046971.5288 +1023 112 -1725969241.24 +1024 112 117682336.099 +1025 112 -266308.770792 +1026 112 1344548.31266 +1027 112 19720255.1109 +1029 112 -832701668.825 +1030 112 56774499.9985 +1031 112 266308.811499 +113 113 5747233752.72 +114 113 1.16415321827e-10 +115 113 -9.31322574615e-10 +116 113 -2.98023223877e-8 +117 113 320539912.677 +118 113 375162168.502 +119 113 1906600745.62 +120 113 1.23691279441e-10 +237 113 -258410.689858 +238 113 -3723465.47124 +239 113 2067285.51886 +1000 113 289249.055857 +1001 113 4242271.82777 +1003 113 -177228952.942 +1004 113 12083928.7042 +1005 113 .0436843274147 +1019 113 -190826.013807 +1021 113 -2798719.34207 +1023 113 117682336.099 +1024 113 -8023973.94966 +1025 113 18157.8196885 +1026 113 -91672.7575228 +1027 113 -1344548.31266 +1029 113 56774499.9985 +1030 113 -3870946.78774 +1031 113 -18157.2226694 +114 114 49078188255.3 +115 114 -186659429.498 +116 114 -2737610796.84 +118 114 4.65661287308e-10 +119 114 -3.63797880709e-11 +120 114 16502043560.7 +235 114 -465433.183904 +236 114 258410.689858 +240 114 8773758.80906 +1000 114 575.77205751 +1001 114 8444.58499814 +1003 114 -.00297849229537 +1004 114 -.0436843274947 +1005 114 -190274.046605 +1019 114 -336.7327272 +1021 114 -4938.63691812 +1023 114 -266308.770792 +1024 114 18157.8196885 +1025 114 21566.0523277 +1026 114 -239.03933031 +1027 114 -3505.94808003 +1029 114 266308.811499 +1030 114 -18157.2226694 +1031 114 -60303.8364694 +115 115 402495077.861 +116 115 9944595.8241 +120 115 -1985135872.95 +121 115 -242161590.3 +126 115 -1798476443.45 +998 115 49659354.6271 +999 115 -9903.27380952 +1000 115 -12246844.9199 +1001 115 901939.25889 +1002 115 -51131283.9922 +1003 115 -2798719.34207 +1004 115 190826.013807 +1005 115 -336.7327272 +1016 115 1181045.14985 +1019 115 -702117.432258 +1021 115 -100982.893513 +1022 115 3741313.46284 +1023 115 2831121.42449 +1024 115 -50249326.0411 +1025 115 -10240.0065367 +116 116 442108789.678 +117 116 -2.38418579102e-7 +120 116 -2737610796.84 +122 116 -116978571.429 +123 116 -5.96046447754e-8 +995 116 -12610714.2857 +996 116 5.125e7 +1000 116 901939.25889 +1001 116 919806.359872 +1002 116 3486301.3802 +1003 116 -41046971.5288 +1004 116 2798719.34207 +1005 116 -4938.63691812 +1019 116 -100982.893513 +1021 116 1803500.11615 +1022 116 -4005095.22294 +1023 116 41522191.5105 +1024 116 -2831121.42449 +1025 116 -4938.63691812 +117 117 3764666529.41 +118 117 256255479.713 +119 117 320539912.677 +122 117 1.49011611939e-7 +123 117 372056190.476 +124 117 2.344e8 +995 117 5.125e7 +996 117 -509654761.905 +1000 117 -51131283.9922 +1001 117 3486301.3802 +1002 117 -555812681.016 +1019 117 -3741313.46284 +1021 117 4005095.22294 +1022 117 -1284826703.66 +118 118 5994123514.4 +119 118 14607433.0947 +120 118 -1.86264514923e-9 +123 118 -2.344e8 +124 118 1.172e9 +1000 118 2798719.34207 +1001 118 41046971.5288 +1003 118 -1725969241.24 +1004 118 117682336.099 +1005 118 266308.770792 +1019 118 -2831121.42449 +1021 118 -41522191.5105 +1023 118 1739275400.73 +1024 118 -118589594.406 +1025 118 19486.007619 +119 119 8099246074.5 +120 119 5.58793544769e-9 +125 119 -4191424107.13 +126 119 2.32830643654e-9 +998 119 -2087277901.78 +999 119 -266927.083333 +1000 119 -190826.013807 +1001 119 -2798719.34207 +1003 119 117682336.099 +1004 119 -8023973.94966 +1005 119 -18157.8196885 +1016 119 -49659354.6271 +1019 119 50249326.0411 +1021 119 2831121.42449 +1023 119 -118589594.406 +1024 119 2106477946.93 +1025 119 -20859.8709528 +120 120 50989014053.3 +121 120 1798476443.45 +125 120 -3.72529029846e-9 +126 120 8992395858.14 +998 120 -266927.083333 +999 120 42695.9325397 +1000 120 336.7327272 +1001 120 4938.63691812 +1003 120 266308.770792 +1004 120 -18157.8196885 +1005 120 21566.0523277 +1016 120 9903.27380952 +1019 120 -10240.0065367 +1021 120 -4938.63691812 +1023 120 -19486.007619 +1024 120 20859.8709528 +1025 120 60916.1360204 +121 121 484360984.039 +127 121 -242161590.3 +132 121 -1798476443.45 +987 121 1181045.14985 +993 121 49659354.6271 +994 121 -9903.27380952 +998 121 -100112581.49 +1016 121 -2380992.01962 +1019 121 1181045.14985 +1024 121 49659354.6271 +1025 121 9903.27380952 +122 122 273242857.143 +128 122 -116978571.429 +129 122 -5.96046447754e-8 +990 122 -12610714.2857 +991 122 5.125e7 +995 122 5578571.42857 +996 122 -5.96046447754e-8 +1021 122 -12610714.2857 +1022 122 -5.125e7 +123 123 3523744761.9 +128 123 1.49011611939e-7 +129 123 372056190.476 +130 123 2.344e8 +990 123 5.125e7 +991 123 -509654761.905 +995 123 -1.19209289551e-7 +996 123 -1114619047.62 +1021 123 -5.125e7 +1022 123 -509654761.905 +124 124 4.688e9 +129 124 -2.344e8 +130 124 1.172e9 +125 125 8471761904.73 +131 125 -4191424107.13 +132 125 2.32830643654e-9 +987 125 -49659354.6271 +993 125 -2087277901.78 +994 125 -266927.083333 +998 125 4196784226.17 +999 125 -2.32830643654e-10 +1016 125 100112581.49 +1019 125 -49659354.6271 +1024 125 -2087277901.78 +1025 125 266927.083333 +126 126 35969706200.4 +127 126 1798476443.45 +131 126 -3.72529029846e-9 +132 126 8992395858.14 +987 126 9903.27380952 +993 126 -266927.083333 +994 126 42695.9325397 +998 126 2.32830643654e-10 +999 126 109399.801587 +1019 126 -9903.27380952 +1024 126 266927.083333 +1025 126 42695.9325397 +127 127 485323053.005 +133 127 -242161590.3 +138 127 -1798476443.45 +379 127 -962068.965517 +979 127 1181045.14985 +985 127 49659354.6271 +986 127 -9903.27380952 +987 127 -2380992.01962 +993 127 -100112581.49 +998 127 49659354.6271 +999 127 9903.27380952 +1016 127 1181045.14985 +128 128 273244780.141 +132 128 167300.832342 +134 128 -116978571.429 +135 128 -5.96046447754e-8 +380 128 -1922.9980729 +384 128 167300.832342 +982 128 -12610714.2857 +983 128 5.125e7 +990 128 5578571.42857 +991 128 -5.96046447754e-8 +995 128 -12610714.2857 +996 128 -5.125e7 +129 129 3523746684.9 +131 129 -167300.832342 +134 129 1.49011611939e-7 +135 129 372056190.476 +136 129 2.344e8 +381 129 -1922.9980729 +383 129 -167300.832342 +982 129 5.125e7 +983 129 -509654761.905 +990 129 -1.19209289551e-7 +991 129 -1114619047.62 +995 129 -5.125e7 +996 129 -509654761.905 +130 130 4.688e9 +135 130 -2.344e8 +136 130 1.172e9 +131 131 8491168801.28 +137 131 -4191424107.13 +138 131 2.32830643654e-9 +381 131 167300.832342 +383 131 9703448.27586 +979 131 -49659354.6271 +985 131 -2087277901.78 +986 131 -266927.083333 +987 131 100112581.49 +993 131 4196784226.17 +994 131 -2.32830643654e-10 +998 131 -2087277901.78 +999 131 266927.083333 +1016 131 -49659354.6271 +132 132 35989113096.9 +133 132 1798476443.45 +137 132 -3.72529029846e-9 +138 132 8992395858.14 +380 132 -167300.832342 +384 132 9703448.27586 +979 132 9903.27380952 +985 132 -266927.083333 +986 132 42695.9325397 +993 132 2.32830643654e-10 +994 132 109399.801587 +998 132 266927.083333 +999 132 42695.9325397 +1016 132 -9903.27380952 +133 133 484360984.039 +139 133 -242161590.3 +144 133 -1798476443.45 +975 133 49659354.6271 +976 133 -9903.27380952 +977 133 1181045.14985 +979 133 -2380992.01962 +985 133 -100112581.49 +987 133 1181045.14985 +993 133 49659354.6271 +994 133 9903.27380952 +134 134 273242857.143 +140 134 -116978571.429 +141 134 -5.96046447754e-8 +972 134 -12610714.2857 +973 134 5.125e7 +982 134 5578571.42857 +983 134 -5.96046447754e-8 +990 134 -12610714.2857 +991 134 -5.125e7 +135 135 3523744761.9 +140 135 1.49011611939e-7 +141 135 372056190.476 +142 135 2.344e8 +972 135 5.125e7 +973 135 -509654761.905 +982 135 -1.19209289551e-7 +983 135 -1114619047.62 +990 135 -5.125e7 +991 135 -509654761.905 +136 136 4.688e9 +141 136 -2.344e8 +142 136 1.172e9 +137 137 8471761904.73 +143 137 -4191424107.13 +144 137 2.32830643654e-9 +975 137 -2087277901.78 +976 137 -266927.083333 +977 137 -49659354.6271 +979 137 100112581.49 +985 137 4196784226.17 +986 137 -2.32830643654e-10 +987 137 -49659354.6271 +993 137 -2087277901.78 +994 137 266927.083333 +138 138 35969706200.4 +139 138 1798476443.45 +143 138 -3.72529029846e-9 +144 138 8992395858.14 +975 138 -266927.083333 +976 138 42695.9325397 +977 138 9903.27380952 +985 138 2.32830643654e-10 +986 138 109399.801587 +987 138 -9903.27380952 +993 138 266927.083333 +994 138 42695.9325397 +139 139 402494905.847 +140 139 -9942247.20624 +141 139 4.76837158203e-7 +144 139 1985090879.28 +145 139 -136797454.596 +146 139 11543770.1783 +147 139 2.38418579102e-7 +148 139 -1.49011611938e-8 +149 139 -9.31322574615e-10 +150 139 186614435.827 +958 139 -12246875.3942 +959 139 -901720.943131 +960 139 -51131341.8213 +961 139 2798044.744 +962 139 190733.383383 +963 139 336.652503136 +972 139 100959.457081 +973 139 3741317.69424 +974 139 -2830438.94272 +975 139 -50249232.3332 +976 139 10239.9263127 +977 139 -702100.230973 +979 139 1181045.14985 +985 139 49659354.6271 +986 139 9903.27380952 +140 140 442110149.803 +141 140 2.38418579102e-7 +144 140 -2737620085.48 +145 140 11543770.1783 +146 140 -305356816.047 +147 140 1.58324837685e-8 +148 140 2.38418579102e-7 +149 140 1.49011611938e-8 +150 140 -2737620085.48 +958 140 -901720.943131 +959 140 919837.389689 +960 140 -3485453.13416 +961 140 -41047111.1589 +962 140 -2798044.744 +963 140 -4938.66752767 +972 140 1803495.73273 +973 140 4005033.15616 +974 140 41522331.6781 +975 140 2830438.94272 +976 140 -4938.66752767 +977 140 100959.457081 +982 140 -12610714.2857 +983 140 -5.125e7 +141 141 3764665004.62 +142 141 -256250211.518 +143 141 320541000.264 +145 141 -2.38418579102e-7 +146 141 -1.58324837685e-8 +147 141 563864195.182 +148 141 -21850211.518 +149 141 320541000.264 +958 141 -51131341.8213 +959 141 -3485453.13416 +960 141 -555812342.012 +972 141 -4005033.15616 +973 141 -1284825591.22 +977 141 -3741317.69424 +982 141 -5.125e7 +983 141 -509654761.905 +142 142 5994127077.8 +143 142 -14603917.4902 +144 142 -7.45058059692e-9 +145 142 1.49011611938e-8 +146 142 -2.38418579102e-7 +147 142 21850211.518 +148 142 -3570092170.12 +149 142 -375071739.576 +150 142 4.65661287308e-10 +958 142 -2798044.744 +959 142 41047111.1589 +961 142 -1725975107.46 +962 142 -117653969.826 +963 142 266309.071986 +972 142 -41522331.6781 +974 142 1739281282 +975 142 118561007.39 +976 142 19486.0296575 +977 142 2830438.94272 +143 143 8099250928.18 +144 143 -5.58793544769e-9 +145 143 9.31322574615e-10 +146 143 -1.49011611938e-8 +147 143 -320541000.264 +148 143 -375071739.576 +149 143 1906615347.85 +150 143 3.63797880709e-11 +958 143 -190733.383383 +959 143 2798044.744 +961 143 -117653969.826 +962 143 -8020078.9431 +963 143 18153.4017404 +972 143 -2830438.94272 +974 143 118561007.39 +975 143 2106474021.76 +976 143 20859.5476883 +977 143 50249232.3332 +979 143 -49659354.6271 +985 143 -2087277901.78 +986 143 266927.083333 +144 144 50989051380.2 +145 144 -186614435.827 +146 144 2737620085.48 +148 144 3.60887497664e-9 +149 144 2.40106601268e-10 +150 144 16502062224.2 +958 144 -336.652503136 +959 144 4938.66752767 +961 144 266309.071986 +962 144 18153.4017404 +963 144 21566.1787783 +972 144 -4938.66752767 +974 144 -19486.0296575 +975 144 -20859.5476883 +976 144 60916.4306731 +977 144 10239.9263127 +979 144 -9903.27380952 +985 144 266927.083333 +986 144 42695.9325397 +145 145 256232399.527 +146 145 -5857352.21301 +148 145 1.49011611938e-8 +149 145 1.39698386192e-9 +150 145 -142433537.439 +151 145 -47577643.2456 +152 145 -791792.88829 +153 145 1.19209289551e-7 +154 145 7.45058059692e-9 +156 145 44180898.3877 +944 145 -15182822.7343 +945 145 -1067482.97372 +946 145 -51131263.6705 +947 145 1344705.96223 +948 145 91694.4092623 +949 145 -239.067821852 +958 145 -8498952.71397 +959 145 -478108.621669 +960 145 -5.71835456789 +961 145 -4241754.87925 +962 145 -289178.077331 +963 145 -575.720324988 +972 145 -901720.943131 +973 145 51131341.8213 +974 145 2798044.744 +975 145 190733.383383 +976 145 -336.652503136 +977 145 -12246875.3942 +146 146 341779935.625 +147 146 -1.49011611938e-8 +149 146 -2.23517417908e-8 +150 146 2089703620.82 +151 146 -791792.88829 +152 146 -36019927.9188 +153 146 8.38190317154e-9 +155 146 7.45058059692e-9 +156 146 -647916464.663 +944 146 -1067482.97372 +945 146 399111.012451 +946 146 -3486599.41191 +947 146 -19720222.1968 +948 146 -1344705.96223 +949 146 3505.94903231 +958 146 -478108.621669 +959 146 -1520544.23155 +960 146 83.8739820197 +961 146 62219394.5602 +962 146 4241754.87925 +963 146 8444.61655998 +972 146 919837.389689 +973 146 3485453.13416 +974 146 -41047111.1589 +975 146 -2798044.744 +976 146 4938.66752767 +977 146 -901720.943131 +147 147 5648744670.18 +148 147 16677256.7023 +149 147 -244679197.577 +151 147 -2.68220901489e-7 +152 147 -1.86264514923e-8 +153 147 1629961700.57 +154 147 -5172954.81566 +155 147 75861802.6871 +944 147 -51131263.6705 +945 147 -3486599.41191 +946 147 -941606746.418 +958 147 5.71835459769 +959 147 -83.8739820179 +960 147 -2423866194.54 +972 147 3485453.13416 +973 147 -555812342.012 +977 147 51131341.8213 +148 148 5481537632.33 +149 148 -17914376.8218 +150 148 -1.86264514923e-9 +151 148 -7.45058059692e-9 +153 148 5172954.81566 +154 148 -1708953032.78 +155 148 -180628551.726 +156 148 -2.32830643654e-10 +944 148 -1344705.96223 +945 148 19720222.1968 +947 148 -832700284.099 +948 148 -56781157.2103 +949 148 266308.66495 +958 148 4241754.87925 +959 148 -62219394.5602 +961 148 2599333105.29 +962 148 177207243.88 +963 148 -.0297830933705 +972 148 41047111.1589 +974 148 -1725975107.46 +975 148 -117653969.826 +976 148 -266309.071986 +977 148 -2798044.744 +149 149 5743102947.89 +150 149 -1.16415321827e-10 +152 149 -7.45058059692e-9 +153 149 -75861802.6871 +154 149 -180628551.726 +155 149 927662440.321 +156 149 -1.45519152284e-11 +944 149 -91694.4092623 +945 149 1344705.96223 +947 149 -56781157.2103 +948 149 -3871861.0714 +949 149 18159.371937 +958 149 289178.077331 +959 149 -4241754.87925 +961 149 177207243.88 +962 149 12080947.9857 +963 149 .436843656578 +972 149 2798044.744 +974 149 -117653969.826 +975 149 -8020078.9431 +976 149 -18153.4017404 +977 149 -190733.383383 +150 150 49060669229.4 +151 150 -44180898.3877 +152 150 647916464.663 +154 150 3.14321368933e-9 +155 150 2.18278728426e-10 +156 150 8028159592.01 +944 150 239.067821852 +945 150 -3505.94903231 +947 150 266308.66495 +948 150 18159.371937 +949 150 -60303.9053591 +958 150 -575.720324988 +959 150 8444.61655998 +961 150 .0297830962809 +962 150 -.436843656389 +963 150 -190273.93149 +972 150 -4938.66752767 +974 150 -266309.071986 +975 150 -18153.4017404 +976 150 21566.1787783 +977 150 336.652503136 +151 151 191836063.691 +152 151 8169306.58331 +153 151 2.38418579102e-7 +154 151 7.45058059692e-9 +155 151 4.65661287308e-10 +156 151 -5180.44882342 +157 151 -47577708.9868 +158 151 -791699.243002 +159 151 1.78813934326e-7 +160 151 2.23517417908e-8 +161 151 9.31322574615e-10 +162 151 44175717.9389 +896 151 -15182835.018 +897 151 -1067356.89932 +898 151 -51131291.8077 +899 151 1344548.31266 +900 151 91672.7575228 +901 151 -239.03933031 +944 151 -17974697.9769 +945 151 -1158067.35298 +946 151 2.05882233381 +947 151 -2822466.33981 +948 151 -192450.249465 +949 151 .0284915415423 +958 151 -15182822.7343 +959 151 -1067482.97372 +960 151 51131263.6705 +961 151 1344705.96223 +962 151 91694.4092623 +963 151 239.067821852 +152 152 72582421.0359 +153 152 1.49011611938e-8 +154 152 -1.19209289551e-7 +156 152 -1069.62104891 +157 152 -791699.243002 +158 152 -36019973.4676 +159 152 1.210719347e-8 +160 152 -2.38418579102e-7 +161 152 -7.45058059692e-9 +162 152 -647917534.284 +896 152 -1067356.89932 +897 152 399128.531709 +898 152 -3486186.75252 +899 152 -19720255.1109 +900 152 -1344548.31266 +901 152 3505.94808003 +944 152 -1158067.35298 +945 152 -1069499.36893 +946 152 -30.1945892498 +947 152 41394159.2159 +948 152 2822466.33981 +949 152 -.000952283997322 +958 152 -1067482.97372 +959 152 399111.012451 +960 152 3486599.41191 +961 152 -19720222.1968 +962 152 -1344705.96223 +963 152 -3505.94903231 +153 153 7291902232.82 +154 153 606.556768 +155 153 125.238990307 +157 153 -2.08616256714e-7 +158 153 -1.39698386192e-8 +159 153 1629960657.48 +160 153 -5172348.25889 +161 153 75861927.9261 +896 153 -51131291.8077 +897 153 -3486186.75252 +898 153 -941606296.811 +944 153 -2.05882251263 +945 153 30.1945892377 +946 153 -3392699252.2 +958 153 51131263.6705 +959 153 3486599.41191 +960 153 -941606746.418 +154 154 3662821983.18 +155 154 -6620535.96723 +156 154 -3.72529029846e-9 +157 154 -7.45058059692e-9 +159 154 5172348.25889 +160 154 -1708956928.73 +161 154 -180607374.794 +162 154 -9.31322574615e-10 +896 154 -1344548.31266 +897 154 19720255.1109 +899 154 -832701668.825 +900 154 -56774499.9985 +901 154 266308.811499 +944 154 2822466.33981 +945 154 -41394159.2159 +947 154 1720105046.35 +948 154 117285595.027 +949 154 .0107230314752 +958 154 -1344705.96223 +959 154 19720222.1968 +961 154 -832700284.099 +962 154 -56781157.2103 +963 154 -266308.66495 +155 155 3759467031.62 +156 155 -3.49245965481e-10 +158 155 -7.45058059692e-9 +159 155 -75861927.9261 +160 155 -180607374.794 +161 155 927665866.008 +162 155 -5.82076609135e-11 +896 155 -91672.7575228 +897 155 1344548.31266 +899 155 -56774499.9985 +900 155 -3870946.78774 +901 155 18157.2226694 +944 155 192450.249465 +945 155 -2822466.33981 +947 155 117285595.027 +948 155 7997134.17417 +949 155 -.15726348578 +958 155 -91694.4092623 +959 155 1344705.96223 +961 155 -56781157.2103 +962 155 -3871861.0714 +963 155 -18159.371937 +156 156 32112950733.8 +157 156 -44175717.9389 +158 156 647917534.284 +160 156 5.93718141317e-9 +161 156 4.07453626394e-10 +162 156 8028164009.65 +896 156 239.03933031 +897 156 -3505.94808003 +899 156 266308.811499 +900 156 18157.2226694 +901 156 -60303.8364694 +944 156 .0284915415432 +945 156 -.000952283997322 +947 156 -.0107230285648 +948 156 .157263485977 +949 156 -392980.743201 +958 156 -239.067821852 +959 156 3505.94903231 +961 156 -266308.66495 +962 156 -18159.371937 +963 156 -60303.9053591 +157 157 188393156.607 +158 157 8436876.78029 +160 157 7.45058059692e-9 +161 157 4.65661287308e-10 +162 157 -6376973.01368 +163 157 -40215225.2558 +164 157 -792702.428313 +165 157 1.19209289551e-7 +168 157 37798744.9252 +850 157 -1115853.26223 +851 157 -51131286.8839 +852 157 1240267.52824 +853 157 84564.5407441 +854 157 -264.817735487 +855 157 -15930371.5854 +896 157 -19186904.5787 +897 157 -1243027.39295 +898 157 -.360276773572 +899 157 -2723421.68315 +900 157 -185687.696604 +901 157 -25.7784051772 +944 157 -15182835.018 +945 157 -1067356.89932 +946 157 51131291.8077 +947 157 1344548.31266 +948 157 91672.7575228 +949 157 239.03933031 +158 158 65227529.448 +160 158 -1.19209289551e-7 +161 158 -1.49011611938e-8 +162 158 93541485.8083 +163 158 -792702.428313 +164 158 -28643087.669 +165 158 8.38190317154e-9 +168 158 -554376048.476 +850 158 359230.938651 +851 158 -3486258.96796 +852 158 -18190408.5101 +853 158 -1240267.52824 +854 158 3883.95461427 +855 158 -1115853.26223 +896 158 -1243027.39295 +897 158 -1040593.62601 +898 158 5.28405665327 +899 158 39943549.3075 +900 158 2723421.68315 +901 158 378.006534245 +944 158 -1067356.89932 +945 158 399128.531709 +946 158 3486186.75252 +947 158 -19720255.1109 +948 158 -1344548.31266 +949 158 -3505.94808003 +159 159 7566886746.59 +160 159 746666.957293 +161 159 -10952584.596 +163 159 -1.19209289551e-7 +164 159 -7.45058059692e-9 +165 159 1782751387.64 +166 159 -4425681.3016 +167 159 64909343.3301 +850 159 -3486258.96796 +851 159 -1008230888.57 +855 159 -51131286.8839 +896 159 .360276684165 +897 159 -5.28405665886 +898 159 -3539962210.47 +944 159 51131291.8077 +945 159 3486186.75252 +946 159 -941606296.811 +160 160 3536851017.96 +161 160 -5595759.03007 +162 160 -3.72529029846e-9 +165 160 4425681.3016 +166 160 -1575092448.79 +167 160 -166677149.486 +168 160 1.16415321827e-9 +850 160 18190408.5101 +852 160 -768825799.607 +853 160 -52420465.0817 +854 160 266308.785854 +855 160 -1240267.52824 +896 160 2723421.68315 +897 160 -39943549.3075 +899 160 1658448267.65 +900 160 113075928.663 +901 160 -.00187643477693 +944 160 -1344548.31266 +945 160 19720255.1109 +947 160 -832701668.825 +948 160 -56774499.9985 +949 160 -266308.811499 +161 161 3618540811.88 +162 161 -2.32830643654e-10 +165 161 -64909343.3301 +166 161 -166677149.486 +167 161 858116833.194 +168 161 8.0035533756e-11 +850 161 1240267.52824 +852 161 -52420465.0817 +853 161 -3574158.36043 +854 161 18157.5987915 +855 161 -84564.5407441 +896 161 185687.696604 +897 161 -2723421.68315 +899 161 113075928.663 +900 161 7709716.3016 +901 161 .0275211288608 +944 161 -91672.7575228 +945 161 1344548.31266 +947 161 -56774499.9985 +948 161 -3870946.78774 +949 161 -18157.2226694 +162 162 30908803746 +163 162 -37798744.9252 +164 162 554376048.476 +166 162 3.95812094212e-9 +167 162 2.69210431725e-10 +168 162 7426079945.47 +850 162 -3883.95461427 +852 162 266308.785854 +853 162 18157.5987915 +854 162 -70256.865273 +855 162 264.817735488 +896 162 -25.7784051772 +897 162 378.006534245 +899 162 .00187643861864 +900 162 -.0275211285989 +901 162 -419039.273135 +944 162 -239.03933031 +945 162 3505.94808003 +947 162 -266308.811499 +948 162 -18157.2226694 +949 162 -60303.8364694 +163 163 297553253.177 +164 163 4352465.19021 +168 163 1023568974.04 +169 163 -205066825.62 +173 163 4.76837158203e-7 +174 163 1061367718.96 +826 163 60932462.1774 +827 163 26599.7023809 +850 163 -664028.118722 +851 163 -3741313.67444 +852 163 -1312271.27988 +853 163 -61260263.8669 +854 163 26864.5201164 +855 163 -11650935.864 +857 163 1445706.29901 +896 163 -15930371.5854 +897 163 -1115853.26223 +898 163 51131286.8839 +899 163 1240267.52824 +900 163 84564.5407441 +901 163 264.817735487 +164 164 153628287.092 +165 164 2.38418579102e-7 +168 164 554376048.476 +170 164 -111879464.286 +171 164 2.98023223877e-8 +823 164 -14203125 +824 164 -4.75e7 +850 164 7291026.49292 +851 164 3494907.88039 +852 164 19246452.9736 +853 164 1312271.27988 +854 164 -3883.95461427 +855 164 -664028.118722 +896 164 -1115853.26223 +897 164 359230.938651 +898 164 3486258.96796 +899 164 -18190408.5101 +900 164 -1240267.52824 +901 164 -3883.95461427 +165 165 5197542488.38 +166 165 -60880441.1474 +167 165 -64909343.3301 +170 165 -2.68220901489e-7 +171 165 4644071.91451 +172 165 -65306122.449 +823 165 -4.75e7 +824 165 -418541666.667 +850 165 -3494907.88039 +851 165 -2065696418.72 +855 165 3741313.67444 +896 165 51131286.8839 +897 165 3486258.96796 +898 165 -1008230888.57 +166 166 2162582446.46 +167 166 -2285682.39448 +168 166 1.86264514923e-9 +171 166 65306122.449 +172 166 228571428.571 +850 166 -19246452.9736 +852 166 798395044.586 +853 166 54436570.1275 +854 166 -19486.008721 +855 166 1312271.27988 +896 166 -1240267.52824 +897 166 18190408.5101 +899 166 -768825799.607 +900 166 -52420465.0817 +901 166 -266308.785854 +167 167 6923947167.46 +168 167 -7.45058059692e-9 +169 167 -4.76837158203e-7 +173 167 -5158447706.79 +174 167 -1.39698386192e-9 +826 167 -2559919704.85 +827 167 247395.833333 +850 167 -1312271.27988 +852 167 54436570.1275 +853 167 2570304503.38 +854 167 18202.6452104 +855 167 61260263.8669 +857 167 -60932462.1774 +896 167 -84564.5407441 +897 167 1240267.52824 +899 167 -52420465.0817 +900 167 -3574158.36043 +901 167 -18157.5987915 +168 168 22281954363.6 +169 168 -1061367718.96 +173 168 5.12227416038e-9 +174 168 3714797378.78 +826 168 247395.833333 +827 168 87917.7517361 +850 168 -3883.95461427 +852 168 19486.008721 +853 168 -18202.6452104 +854 168 -64535.7534561 +855 168 26864.5201164 +857 168 -26599.7023809 +896 168 -264.817735488 +897 168 3883.95461427 +899 168 -266308.785854 +900 168 -18157.5987915 +901 168 -70256.865273 +169 169 410156349.122 +174 169 .000190756749362 +175 169 -205066825.62 +179 169 4.76837158203e-7 +180 169 1061367718.96 +826 169 -122341579.861 +827 169 5.58793544769e-9 +831 169 60932462.1774 +832 169 26599.7023809 +853 169 60932462.1774 +854 169 -26599.7023809 +855 169 1445706.29901 +857 169 -2902761.53864 +860 169 1445706.29901 +170 170 249383928.571 +176 170 -111879464.286 +823 170 1.559375e7 +824 170 -8.94069671631e-8 +828 170 -14203125 +829 170 -4.75e7 +850 170 -14203125 +851 170 4.75e7 +171 171 2553211856.17 +172 171 -1.09672546387e-5 +176 171 -1.78813934326e-7 +177 171 4644071.91443 +178 171 -65306122.449 +823 171 -2.98023223877e-8 +824 171 -444166666.667 +828 171 -4.75e7 +829 171 -418541666.667 +850 171 4.75e7 +851 171 -418541666.667 +172 172 914285714.286 +177 172 65306122.449 +178 172 228571428.571 +173 173 10370280830.3 +174 173 -1.86264514923e-9 +175 173 -4.76837158203e-7 +179 173 -5158447706.79 +180 173 2.32830643654e-10 +826 173 5133185763.88 +827 173 1.62981450558e-9 +831 173 -2559919704.85 +832 173 247395.833333 +853 173 -2559919704.85 +854 173 -247395.833333 +855 173 -60932462.1774 +857 173 122341579.861 +860 173 -60932462.1774 +174 174 14859260804.2 +175 174 -1061367718.96 +179 174 2.67755240202e-9 +180 174 3714797378.78 +826 174 6.98491930962e-10 +827 174 316026.475694 +831 174 247395.833333 +832 174 87917.7517361 +853 174 -247395.833333 +854 174 87917.7517361 +855 174 26599.7023809 +857 174 5.47152012587e-9 +860 174 -26599.7023809 +175 175 410156349.122 +180 175 -9.91905108094e-5 +181 175 -205066825.62 +185 175 4.76837158203e-7 +186 175 1061367718.96 +826 175 60932462.1774 +827 175 -26599.7023809 +831 175 -122341579.861 +832 175 -2.44472175837e-9 +836 175 60932462.1773 +837 175 26599.7023809 +857 175 1445706.29901 +860 175 -2902761.53863 +881 175 1445706.29901 +176 176 249383928.571 +177 176 2.38418579102e-7 +182 176 -111879464.286 +183 176 1.49011611939e-7 +823 176 -14203125 +824 176 4.75e7 +828 176 1.559375e7 +829 176 -2.08616256714e-7 +833 176 -14203125 +834 176 -4.75e7 +177 177 2553211856.17 +178 177 5.48362731934e-6 +182 177 -1.78813934326e-7 +183 177 4644071.91448 +184 177 -65306122.449 +823 177 4.75e7 +824 177 -418541666.667 +828 177 2.98023223877e-8 +829 177 -444166666.667 +833 177 -4.75e7 +834 177 -418541666.667 +178 178 914285714.286 +183 178 65306122.449 +184 178 228571428.571 +179 179 10370280830.2 +180 179 -3.72529029846e-9 +181 179 4.76837158203e-7 +185 179 -5158447706.78 +186 179 -2.09547579288e-9 +826 179 -2559919704.85 +827 179 -247395.833333 +831 179 5133185763.87 +832 179 4.07453626394e-9 +836 179 -2559919704.85 +837 179 247395.833333 +857 179 -60932462.1774 +860 179 122341579.861 +881 179 -60932462.1773 +180 180 14859260804.2 +181 180 -1061367718.96 +185 180 4.07453626394e-9 +186 180 3714797378.78 +826 180 -247395.833333 +827 180 87917.7517361 +832 180 316026.475694 +836 180 247395.833333 +837 180 87917.7517361 +857 180 26599.7023809 +860 180 -2.32830643654e-9 +881 180 -26599.7023809 +181 181 410156349.122 +186 181 5.34085556865e-5 +187 181 -205066825.62 +191 181 4.76837158203e-7 +192 181 1061367718.96 +831 181 60932462.1773 +832 181 -26599.7023809 +836 181 -122341579.861 +837 181 1.04773789644e-9 +860 181 1445706.29901 +879 181 60932462.1775 +880 181 26599.7023809 +881 181 -2902761.53864 +884 181 1445706.29901 +182 182 249383928.571 +188 182 -111879464.286 +189 182 1.78813934326e-7 +828 182 -14203125 +829 182 4.75e7 +833 182 1.559375e7 +834 182 -2.98023223877e-8 +876 182 -14203125 +877 182 -4.75e7 +183 183 2553211856.17 +184 183 -2.86102294922e-6 +188 183 -1.78813934326e-7 +189 183 4644071.91446 +190 183 -65306122.449 +828 183 4.75e7 +829 183 -418541666.667 +833 183 -1.78813934326e-7 +834 183 -444166666.667 +876 183 -4.75e7 +877 183 -418541666.667 +184 184 914285714.286 +189 184 65306122.449 +190 184 228571428.571 +185 185 10370280830.3 +186 185 -2.79396772385e-9 +187 185 -9.53674316406e-7 +191 185 -5158447706.8 +192 185 -2.09547579288e-9 +831 185 -2559919704.85 +832 185 -247395.833333 +836 185 5133185763.88 +837 185 -1.2805685401e-9 +860 185 -60932462.1773 +879 185 -2559919704.86 +880 185 247395.833333 +881 185 122341579.861 +884 185 -60932462.1775 +186 186 14859260804.2 +187 186 -1061367718.96 +191 186 4.3073669076e-9 +192 186 3714797378.78 +831 186 -247395.833333 +832 186 87917.7517361 +836 186 3.95812094212e-9 +837 186 316026.475694 +860 186 26599.7023809 +879 186 247395.833333 +880 186 87917.7517361 +881 186 9.31322574615e-10 +884 186 -26599.7023809 +187 187 297572874.59 +188 187 -4352465.19021 +189 187 -4.76837158203e-7 +192 187 -1023068628.02 +193 187 -19621.4125789 +198 187 500346.020761 +836 187 60932462.1775 +837 187 -26599.7023809 +876 187 664028.118722 +877 187 -3741313.67444 +878 187 1312271.27988 +879 187 -61260263.867 +880 187 -26864.5201164 +881 187 1445706.29901 +884 187 -11650935.864 +928 187 -15930371.5854 +929 187 1115853.26223 +930 187 51131286.8839 +931 187 -1240267.52824 +932 187 84564.5407441 +933 187 -264.817735488 +188 188 155492992.974 +189 188 2.38418579102e-7 +192 188 554376048.476 +194 188 -1864705.88235 +833 188 -14203125 +834 188 4.75e7 +876 188 7291026.49292 +877 188 -3494907.88039 +878 188 19246452.9736 +879 188 -1312271.27988 +880 188 -3883.95461427 +884 188 664028.118722 +928 188 1115853.26223 +929 188 359230.938651 +930 188 -3486258.96796 +931 188 -18190408.5101 +932 188 1240267.52824 +933 188 -3883.95461427 +189 189 5197562109.79 +190 189 60380095.1266 +191 189 -64909343.3301 +195 189 -19621.4125789 +196 189 -500346.020761 +833 189 4.75e7 +834 189 -418541666.667 +876 189 3494907.88039 +877 189 -2065696418.72 +884 189 3741313.67444 +928 189 51131286.8839 +929 189 -3486258.96796 +930 189 -1008230888.57 +190 190 2179594211.17 +191 190 2285682.39449 +192 190 7.45058059692e-9 +195 190 500346.020761 +196 190 8505882.35294 +876 190 -19246452.9736 +878 190 798395044.586 +879 190 -54436570.1275 +880 190 -19486.008721 +884 190 -1312271.27988 +928 190 1240267.52824 +929 190 18190408.5101 +931 190 -768825799.607 +932 190 52420465.0817 +933 190 -266308.785854 +191 191 6923947167.47 +192 191 3.72529029846e-9 +836 191 -2559919704.86 +837 191 -247395.833333 +876 191 1312271.27988 +878 191 -54436570.1275 +879 191 2570304503.38 +880 191 -18202.6452104 +881 191 -60932462.1775 +884 191 61260263.867 +928 191 -84564.5407442 +929 191 -1240267.52824 +931 191 52420465.0817 +932 191 -3574158.36043 +933 191 18157.5987915 +192 192 22298966128.3 +193 192 -500346.020761 +198 192 8505882.35294 +836 192 -247395.833333 +837 192 87917.7517361 +876 192 -3883.95461427 +878 192 19486.008721 +879 192 18202.6452104 +880 192 -64535.7534561 +881 192 26599.7023809 +884 192 -26864.5201164 +928 192 264.817735488 +929 192 3883.95461427 +931 192 -266308.785854 +932 192 18157.5987915 +933 192 -70256.865273 +193 193 5951372064.49 +197 193 -456969.978074 +198 193 -500346.020761 +199 193 -1995620603.91 +201 193 -1.43051147461e-5 +203 193 -1194214.87603 +205 193 -1541233766.23 +207 193 -1.3375e9 +211 193 1757305194.81 +213 193 -3.81469726563e-6 +229 193 -1208636363.64 +231 193 1.3375e9 +235 193 765422077.922 +237 193 6.67572021484e-6 +313 193 -1.2875e9 +315 193 1.3375e9 +325 193 -1384303267.74 +327 193 1.43051147461e-5 +329 193 737244.897959 +331 193 -1056785714.29 +333 193 -1.3375e9 +194 194 20987459.9087 +196 194 76135309.4957 +198 194 680272.108847 +200 194 -11691032.29 +202 194 377538370.72 +204 194 149659.863943 +206 194 1675648.19189 +208 194 -51806621.4089 +210 194 6662286.12657 +212 194 -3213782.46015 +214 194 8647247.63872 +216 194 -12883941.4554 +230 194 2812153.44445 +232 194 -88025137.741 +234 194 -6512626.26263 +236 194 -5211754.03204 +238 194 6176605.45623 +240 194 13564213.5642 +314 194 1521262.44016 +316 194 60453869.0476 +318 194 5158730.15873 +326 194 -7368553.61192 +328 194 -301403061.225 +330 194 190476.190476 +332 194 2353304.29129 +334 194 94201743.1973 +336 194 -4968253.96825 +195 195 75136545595.4 +196 195 500346.020761 +199 195 1.04904174805e-5 +201 195 -40005025974 +205 195 -1.3375e9 +207 195 -12311580086.6 +211 195 7.62939453125e-6 +213 195 20443722943.7 +229 195 1.3375e9 +231 195 -9054393939.39 +235 195 -3.81469726563e-6 +237 195 14010822510.8 +313 195 1.3375e9 +315 195 -9858333333.33 +325 195 -9.53674316406e-6 +327 195 -30988642857.1 +331 195 -1.3375e9 +333 195 -7373095238.1 +196 196 29143680235.1 +198 196 2.38418579102e-7 +200 196 -377538370.72 +202 196 10263800505 +204 196 7.45058059692e-8 +206 196 51806621.4089 +208 196 -1955560816.5 +210 196 27864583.3333 +212 196 8647247.63872 +214 196 -3846744979.56 +216 196 -2.38418579102e-7 +230 196 88025137.741 +232 196 -3078694234.01 +234 196 -27864583.3333 +236 196 6176605.45623 +238 196 -6602975438.91 +240 196 -2.08616256714e-7 +314 196 -60453869.0476 +316 196 -2731018518.52 +318 196 -27864583.3333 +326 196 301403061.225 +328 196 10931230158.7 +330 196 -3.27825546265e-7 +332 196 -94201743.1973 +334 196 -4091283068.78 +336 196 27864583.3333 +197 197 93831168.8312 +199 197 1194214.87603 +203 197 26272727.2727 +325 197 -737244.897959 +329 197 20642857.1429 +198 198 1681138263.21 +200 198 149659.863943 +202 198 -2.68220901489e-7 +204 198 -820482267.732 +206 198 -6662286.12657 +208 198 27864583.3333 +210 198 -413386093.073 +212 198 12883941.4554 +214 198 -1.49011611939e-7 +216 198 779643533.549 +230 198 6512626.26263 +232 198 -27864583.3333 +234 198 -290785984.848 +236 198 -13564213.5642 +238 198 -7.45058059692e-8 +240 198 577296401.515 +314 198 -5158730.15873 +316 198 -27864583.3333 +318 198 -321614583.333 +326 198 190476.190476 +328 198 -1.49011611939e-7 +330 198 -629358516.483 +332 198 4968253.96825 +334 198 27864583.3333 +336 198 -224010416.667 +199 199 3276299825.96 +203 199 -321051.974812 +204 199 -419558.160726 +205 199 1034636147.19 +207 199 1.107e8 +211 199 -1541233766.23 +213 199 1.3375e9 +217 199 -32816666.6667 +219 199 -2.22e7 +223 199 13931516.9271 +225 199 4.47034835815e-8 +227 199 -1367187.5 +229 199 488599696.97 +231 199 -1.107e8 +235 199 -1208636363.64 +237 199 -1.3375e9 +241 199 -35143333.3333 +243 199 2.22e7 +879 199 -148079.350845 +880 199 -419558.160726 +884 199 -16453.261205 +200 200 120632419.479 +201 200 -546703.165553 +202 200 1562042297.92 +204 200 584911891.157 +206 200 -35894820.6625 +208 200 -511979092.877 +210 200 -1422501401.77 +212 200 1675648.19189 +214 200 51806621.4089 +216 200 6662286.12657 +218 200 23926336.9237 +220 200 -563785714.286 +222 200 767390476.19 +224 200 -68806565.338 +226 200 1939432589.29 +228 200 37449142.8571 +230 200 -65070362.7037 +232 200 -766074862.259 +234 200 2007413292.93 +236 200 2812153.44445 +238 200 88025137.741 +240 200 -6512626.26263 +242 200 34014668.5185 +244 200 -8.541e8 +246 200 -729941333.333 +876 200 -1565445.5636 +877 200 546703.165553 +878 200 148079.350845 +201 201 41965022511.2 +202 201 419558.160726 +203 201 -11907482.9932 +205 201 -1.107e8 +207 201 11574216536.9 +209 201 12403628.1179 +211 201 1.3375e9 +213 201 -12311580086.6 +217 201 -2.22e7 +219 201 -40642857.1428 +223 201 1.49011611938e-8 +225 201 -92307142.8571 +229 201 1.107e8 +231 201 8000220359.15 +233 201 -24311111.1111 +235 201 -1.3375e9 +237 201 -9054393939.39 +241 201 2.22e7 +243 201 -3.53e7 +876 201 546703.165553 +877 201 -209407.319635 +878 201 419558.160726 +202 202 116015172061 +204 202 1.19209289551e-5 +206 202 -511979092.877 +208 202 -28055008766.7 +210 202 -8.405625e7 +212 202 -51806621.4089 +214 202 -1955560816.5 +216 202 -27864583.3333 +218 202 563785714.286 +220 202 -28427428571.4 +222 202 1.0656e9 +224 202 -1939432589.29 +226 202 86988928571.4 +228 202 -8.10623168945e-6 +230 202 -766074862.259 +232 202 -44106030455.2 +234 202 8.405625e7 +236 202 -88025137.741 +238 202 -3078694234.01 +240 202 27864583.3333 +242 202 8.541e8 +244 202 -4.1872e10 +246 202 -1.0656e9 +876 202 -148079.350845 +877 202 -419558.160726 +878 202 8020964.83742 +203 203 2642393835.33 +204 203 5034697.92872 +207 203 -12403628.1179 +209 203 520952380.952 +223 203 1367187.5 +227 203 4.375e7 +231 203 24311111.1111 +233 203 729333333.333 +879 203 888476.105068 +880 203 2517348.96436 +884 203 148079.350845 +204 204 213813096517 +206 204 1422501401.77 +208 204 8.405625e7 +210 204 76561028950.2 +212 204 -6662286.12657 +214 204 -27864583.3333 +216 204 -413386093.073 +218 204 -767390476.19 +220 204 1.0656e9 +222 204 -4.89128e10 +224 204 37449142.8571 +226 204 -1.04904174805e-5 +228 204 -82251103557.7 +230 204 -2007413292.93 +232 204 -8.405625e7 +234 204 72233805984.8 +236 204 6512626.26263 +238 204 27864583.3333 +240 204 -290785984.848 +242 204 729941333.333 +244 204 -1.0656e9 +246 204 -3.381424e10 +879 204 2517348.96436 +880 204 7132488.73235 +884 204 419558.160726 +205 205 1835263440.06 +206 205 3.97142534007e-6 +207 205 1.3153e9 +208 205 -9.76029984235e-6 +209 205 -1312821969.7 +210 205 -1541800820.71 +211 205 -1227126264.39 +212 205 1.72051585967e-6 +213 205 1.125e8 +214 205 -9.87242064346e-9 +215 205 68655.3030303 +216 205 6340751.26263 +217 205 -43959604.0702 +218 205 6.02358906813e-7 +219 205 -1.8e6 +220 205 -1.24176519097e-5 +221 205 -1312890625 +222 205 645277777.778 +223 205 -32816666.6667 +225 205 2.22e7 +424 205 177695.91432 +425 205 -1.88869425226e-6 +426 205 -1.54806846301e-7 +427 205 -1.06700124469e-8 +428 205 -51609.8484848 +429 205 6340751.26263 +430 205 -62884703.0517 +431 205 -3.59777014084e-6 +432 205 -9.66264817703e-9 +433 205 1.15153153263e-5 +434 205 962604640.151 +435 205 -1541800820.71 +436 205 37979721.2577 +437 205 -8.07835713453e-7 +438 205 3.0961418246e-7 +439 205 8.85876085069e-6 +440 205 9.6265625e8 +441 205 645277777.778 +206 206 704560109.65 +207 206 8.5625e6 +208 206 935887796.389 +209 206 1.13686202027e-5 +210 206 1422501401.77 +211 206 1.71237192027e-6 +212 206 254906339.036 +213 206 2.5e6 +214 206 -119601042.897 +215 206 -4.55318155513e-10 +216 206 -6662286.12657 +217 206 6.22874531813e-7 +218 206 -15583346.4723 +219 206 -6.3125e6 +220 206 1055488839.29 +221 206 1.13690755208e-5 +222 206 -767390476.19 +224 206 23926336.9237 +226 206 -563785714.286 +228 206 -767390476.19 +424 206 -1.88869425226e-6 +425 206 -291363636.364 +426 206 -2.75e7 +427 206 7.07629297694e-23 +428 206 3.42273647938e-10 +429 206 -4.20515101098e-8 +430 206 -3.61014182644e-6 +431 206 -604653724.747 +432 206 3.8125e6 +433 206 -1.18466705107e-19 +434 206 -9.90699496593e-6 +435 206 1.46430723796e-5 +436 206 -8.07835713453e-7 +437 206 -37524305.5556 +438 206 1.89375e7 +439 206 -9.11714137551e-20 +440 206 -9.90733723958e-6 +441 206 -6.6409837963e-6 +207 207 24426376511.6 +208 207 37986111.1111 +209 207 -12403628.1179 +210 207 -1.60832036033e-6 +211 207 -1.125e8 +212 207 -2.5e6 +213 207 -23476124458.9 +214 207 -1.60800790784e-23 +215 207 1.1182492539e-10 +216 207 1.0327738799e-8 +217 207 1.8e6 +218 207 6.3125e6 +219 207 -110023809.524 +220 207 -2.01786843533e-20 +221 207 -1.7951171875e-6 +222 207 1.04857638889e-6 +223 207 2.22e7 +225 207 -40642857.1428 +424 207 -1.54806846301e-7 +425 207 -2.75e7 +426 207 -1.675e7 +427 207 -1.737918694e-23 +428 207 -8.40614956382e-11 +429 207 1.0327738799e-8 +430 207 -1.06435217621e-7 +431 207 -3.8125e6 +432 207 -12857253.0864 +433 207 37986111.1111 +434 207 1.25559519198e-6 +435 207 -1.60832036033e-6 +436 207 3.0961418246e-7 +437 207 1.89375e7 +438 207 -32614583.3333 +439 207 1.43954863824e-20 +440 207 1.56431640625e-6 +441 207 1.04857638889e-6 +208 208 64330296645.5 +209 208 .000564493749976 +210 208 1037735416.67 +211 208 -1.07830569545e-8 +212 208 119601042.897 +213 208 -1.75633124637e-23 +214 208 3447038089.23 +215 208 1.36480801943e-8 +216 208 2.34375e6 +217 208 1.03204991319e-5 +218 208 -1055488839.29 +219 208 1.67708110894e-20 +220 208 44161928571.4 +221 208 .000526859486111 +222 208 -86399999.9999 +224 208 563785714.286 +226 208 -28427428571.4 +228 208 -1.0656e9 +424 208 1.06700124469e-8 +425 208 -7.07629297694e-23 +426 208 1.737918694e-23 +427 208 -7.06313291676e-22 +428 208 -1.20094280478e-8 +429 208 3.84744655958e-7 +430 208 8.29867460561e-6 +431 208 -8.54547798611e-20 +432 208 -37986111.1111 +433 208 911666666.667 +434 208 -.000494143302691 +435 208 -5.01398009349e-5 +436 208 -8.85876085069e-6 +437 208 9.11714137551e-20 +438 208 -1.43954863824e-20 +439 208 -4.98002397945e-18 +440 208 -.000479099111111 +441 208 3.03357708333e-5 +209 209 70801883661.5 +210 209 908427083.333 +211 209 -68655.3030303 +212 209 4.55318155513e-10 +213 209 -1.1182492539e-10 +214 209 1.34784147903e-8 +215 209 2045138.88889 +216 209 52083.3333333 +217 209 1312890625 +218 209 -1.13690755208e-5 +219 209 1.7951171875e-6 +220 209 .000527844236111 +221 209 57903166666.7 +222 209 -3.03e8 +424 209 51609.8484848 +425 209 -3.42273647938e-10 +426 209 8.40614956382e-11 +427 209 -1.20094280478e-8 +428 209 -1670138.88889 +429 209 572916.666667 +430 209 962604640.151 +431 209 -9.90699496593e-6 +432 209 1.87286949753e-6 +433 209 -.000495127883025 +434 209 -47344228899.6 +435 209 302947916.667 +436 209 -9.6265625e8 +437 209 9.90733723958e-6 +438 209 -1.56431640625e-6 +439 209 -.000479099111111 +440 209 -46695666666.7 +441 209 -9.09e8 +210 210 170139734794 +211 210 6340751.26263 +212 210 -6662286.12657 +213 210 1.0327738799e-8 +214 210 -2.34375e6 +215 210 -52083.3333333 +216 210 -707065746.753 +217 210 645277777.778 +218 210 -767390476.19 +219 210 1.04857638889e-6 +220 210 8.64e7 +221 210 3.03e8 +222 210 -72234233333.3 +224 210 767390476.19 +226 210 -1.0656e9 +228 210 -4.89128e10 +424 210 -6340751.26263 +425 210 4.20515101098e-8 +426 210 -1.0327738799e-8 +427 210 3.84744655958e-7 +428 210 572916.666667 +429 210 -233882575.757 +430 210 1541800820.71 +431 210 -1.46430723796e-5 +432 210 1.60832036033e-6 +433 210 -5.63758601073e-5 +434 210 -302947916.667 +435 210 46023424242.4 +436 210 -645277777.778 +437 210 6.6409837963e-6 +438 210 -1.04857638889e-6 +439 210 3.03357708333e-5 +440 210 -9.09e8 +441 210 -24425166666.7 +211 211 3186278720.06 +212 211 6.06854526629e-6 +213 211 -1.54194349968e-5 +214 211 2.30747170785e-8 +215 211 -4348.33024118 +216 211 -14345463.5642 +313 211 -887633461.784 +314 211 1.09903199771e-6 +315 211 1.125e8 +316 211 -7.49503414647e-9 +317 211 64306.9727891 +318 211 4749503.96825 +325 211 -1.2875e9 +327 211 -1.3375e9 +418 211 133211.237537 +419 211 -1.13385261287e-6 +420 211 -5.68546835865e-8 +421 211 -7.8784198141e-9 +422 211 -53784.0136054 +423 211 4749503.96825 +424 211 -401329.605561 +425 211 -5.76781898581e-6 +426 211 4.9882648956e-8 +427 211 2.34889232143e-8 +428 211 -2174.1651206 +429 211 -14345463.5642 +430 211 177695.91432 +431 211 -1.97827758559e-6 +432 211 2.09950098143e-7 +433 211 -9.98546515103e-9 +434 211 51609.8484848 +435 211 6340751.26263 +212 212 1285485430.44 +213 212 -3.57627868652e-7 +214 212 17294495.2774 +215 212 2.46543782049e-10 +216 212 12883941.4554 +313 212 1.09092187866e-6 +314 212 334625102.356 +315 212 2.5e6 +316 212 -102306547.619 +317 212 -2.08774373465e-10 +318 212 -5158730.15873 +326 212 1521262.44016 +328 212 60453869.0476 +330 212 -5158730.15873 +418 212 -1.13385261287e-6 +419 212 -362857142.857 +420 212 -2.75e7 +421 212 2.55775087715e-23 +422 212 1.7461129417e-10 +423 212 -1.54193965636e-8 +424 212 -5.76785280616e-6 +425 212 -1220779220.78 +426 212 8.94069671631e-8 +427 212 -1.20277715847e-22 +428 212 -1.67662353767e-10 +429 212 7.28879350299e-8 +430 212 -1.97827758559e-6 +431 212 -291363636.364 +432 212 2.75e7 +433 212 6.62230501336e-23 +434 212 -3.42273647938e-10 +435 212 -4.20515101098e-8 +213 213 43518695887.4 +214 213 3.75102981289e-23 +215 213 -7.51748440791e-12 +216 213 -2.33212608606e-8 +313 213 -1.125e8 +314 213 -2.5e6 +315 213 -18253880952.4 +316 213 -1.21571238388e-23 +317 213 1.04307440982e-10 +318 213 7.70380851994e-9 +325 213 -1.3375e9 +327 213 -9858333333.33 +418 213 -5.68546835865e-8 +419 213 -2.75e7 +420 213 -19857142.8571 +421 213 -1.27789845199e-23 +422 213 -8.72389506398e-11 +423 213 7.70380851994e-9 +424 213 3.29555656226e-8 +425 213 -8.94069671631e-8 +426 213 -25892857.1429 +427 213 3.81875453095e-23 +428 213 -3.17745500159e-12 +429 213 -2.33212608606e-8 +430 213 2.09950098143e-7 +431 213 2.75e7 +432 213 -1.675e7 +433 213 -1.62642046021e-23 +434 213 8.40614956382e-11 +435 213 1.0327738799e-8 +214 214 9173449525.01 +215 214 3.21326092648e-8 +216 214 -4.05415771082e-7 +313 214 -7.9125828934e-9 +314 214 102306547.619 +315 214 -1.28343978479e-23 +316 214 3902893518.52 +317 214 8.13960537919e-9 +318 214 2.34375e6 +326 214 -60453869.0476 +328 214 -2731018518.52 +330 214 27864583.3333 +418 214 7.8784198141e-9 +419 214 -2.55775087715e-23 +420 214 1.27789845199e-23 +421 214 -4.97876139361e-22 +422 214 -8.02784322641e-9 +423 214 2.9087952998e-7 +424 214 -2.31535985068e-8 +425 214 1.16871597045e-22 +426 214 -3.76390103246e-23 +427 214 1.161760145e-21 +428 214 -2.52490414437e-8 +429 214 -7.96741445777e-7 +430 214 9.98546515103e-9 +431 214 -6.62230501336e-23 +432 214 1.62642046021e-23 +433 214 -6.81558637934e-22 +434 214 -1.01431086034e-8 +435 214 3.77145552949e-7 +215 215 6708829.36508 +313 215 -64306.9727891 +314 215 2.08774373465e-10 +315 215 -1.04307440982e-10 +316 215 7.9706445657e-9 +317 215 2481150.79365 +318 215 52083.3333333 +418 215 53784.0136054 +419 215 -1.7461129417e-10 +420 215 8.72389506398e-11 +421 215 -8.02784322641e-9 +422 215 -2186507.93651 +423 215 572916.666667 +424 215 -2174.1651206 +425 215 -1.67662353767e-10 +426 215 -3.17745500159e-12 +427 215 -2.52497460343e-8 +428 215 -5369543.65079 +429 215 5.12227416038e-9 +430 215 -51609.8484848 +431 215 3.42273647938e-10 +432 215 -8.40614956382e-11 +433 215 -1.01431086034e-8 +434 215 -1670138.88889 +435 215 -572916.666667 +216 216 1490614853.9 +313 216 4749503.96825 +314 216 -5158730.15873 +315 216 7.70380851994e-9 +316 216 -2.34375e6 +317 216 -52083.3333333 +318 216 -538013392.857 +326 216 5158730.15873 +328 216 27864583.3333 +330 216 -321614583.333 +418 216 -4749503.96825 +419 216 1.54193965636e-8 +420 216 -7.70380851994e-9 +421 216 2.9087952998e-7 +422 216 572916.666667 +423 216 -178184523.809 +424 216 14345463.5642 +425 216 -7.28879350299e-8 +426 216 2.33212608606e-8 +427 216 -7.97094093346e-7 +428 216 5.12227416038e-9 +429 216 490192099.567 +430 216 -6340751.26263 +431 216 4.20515101098e-8 +432 216 -1.0327738799e-8 +433 216 3.77145552949e-7 +434 216 -572916.666667 +435 216 -233882575.757 +217 217 220319390.241 +218 217 1.10465504646e-7 +219 217 -4.15853700766e-7 +220 217 -1.62385621268e-6 +221 217 -155925943.047 +222 217 -2096613247.86 +223 217 -26732051.2821 +225 217 1.49011611939e-7 +301 217 -66544554.6888 +302 217 9.0069325137e-7 +303 217 -1.8e6 +304 217 -1.77604912818e-5 +305 217 -1468816568.05 +306 217 841127136.752 +307 217 -33251282.0513 +309 217 2.22e7 +430 217 37979721.2577 +431 217 -7.46288838453e-7 +432 217 -8.01826925395e-8 +433 217 -1.09559136285e-5 +434 217 -9.6265625e8 +435 217 645277777.778 +436 217 -102353160.136 +437 217 3.06804248816e-7 +438 217 -1.48988926363e-7 +439 217 6.83405466267e-6 +440 217 -24372226.3312 +441 217 -2096613247.86 +442 217 47423207.397 +443 217 -1.19454869819e-6 +444 217 3.99794207637e-7 +445 217 1.1973832354e-5 +446 217 938284023.669 +447 217 841127136.752 +218 218 208006702.956 +220 218 204477348.373 +221 218 5.02728008403e-6 +222 218 1940301831.5 +224 218 -55752638.6455 +226 218 48647928.9941 +228 218 1940301831.5 +301 218 9.21168411626e-7 +302 218 -36416279.726 +303 218 -6.3125e6 +304 218 1259966187.66 +305 218 1.63963556049e-5 +306 218 -960797069.597 +308 218 28459408.2978 +310 218 -515137785.292 +312 218 -960797069.597 +430 218 -7.46288838453e-7 +431 218 -37524305.5556 +432 218 -1.89375e7 +433 218 1.12754611093e-19 +434 218 9.90733723958e-6 +435 218 -6.6409837963e-6 +436 218 3.0684471356e-7 +437 218 -80578792.735 +438 218 -2.98023223877e-8 +439 218 -1.29759775638e-19 +440 218 -3.43063079132e-6 +441 218 2.59511715782e-5 +442 218 -1.19454869819e-6 +443 218 -34448985.0427 +444 218 1.89375e7 +445 218 -1.70211352977e-19 +446 218 -1.33379680309e-5 +447 218 -1.19568558954e-5 +219 219 350466460.623 +220 219 -2.59200803965e-21 +221 219 -7.5512838293e-8 +222 219 -3.40342387136e-6 +223 219 -1.63912773132e-7 +225 219 53697802.1978 +301 219 1.8e6 +302 219 6.3125e6 +303 219 -146278960.623 +304 219 -2.88038736813e-20 +305 219 -1.87063002579e-6 +306 219 1.36413567691e-6 +307 219 2.22e7 +309 219 -46197802.1978 +430 219 -8.01826925395e-8 +431 219 -1.89375e7 +432 219 -32614583.3333 +433 219 -1.78033596463e-20 +434 219 -1.56431640625e-6 +435 219 1.04857638889e-6 +436 219 -1.9852451664e-7 +437 219 -8.94069671631e-8 +438 219 4693910.25641 +439 219 1.10567948134e-20 +440 219 -4.26121883769e-8 +441 219 -3.40342387136e-6 +442 219 3.99794207637e-7 +443 219 1.89375e7 +444 219 -33100160.2564 +445 219 1.94190999074e-20 +446 219 1.52170421787e-6 +447 219 1.36413567691e-6 +220 220 115835241758 +221 220 .00126845296626 +222 220 -.000134537217647 +224 220 48647928.9941 +226 220 -45635164835.2 +228 220 -7.62939453125e-6 +301 220 1.50322199279e-5 +302 220 -1259966187.66 +303 220 2.43791771909e-20 +304 220 41197978022 +305 220 .000609349662482 +306 220 -86399999.9999 +308 220 515137785.292 +310 220 -21832439560.4 +312 220 -1.0656e9 +430 220 1.09559136285e-5 +431 220 -1.12754611093e-19 +432 220 1.78033596463e-20 +433 220 -5.04083229195e-18 +434 220 -.000482053361111 +435 220 4.90460208333e-5 +436 220 2.72069199621e-8 +437 220 -4.55200406151e-20 +438 220 7.25546326614e-24 +439 220 -1.23442120802e-17 +440 220 -.0010158636201 +441 220 -.000112860120891 +442 220 -1.1973832354e-5 +443 220 1.70211352977e-19 +444 220 -1.94190999074e-20 +445 220 -7.57880795304e-18 +446 220 -.000528848777867 +447 220 3.76593083908e-5 +221 221 134530628205 +222 221 .000339508056641 +301 221 1468816568.05 +302 221 -1.63963556049e-5 +303 221 1.87063002579e-6 +304 221 .000610332470175 +305 221 51100397435.9 +306 221 -3.03e8 +430 221 9.6265625e8 +431 221 -9.90733723958e-6 +432 221 1.56431640625e-6 +433 221 -.000482053361111 +434 221 -46695666666.7 +435 221 9.09e8 +436 221 -24372226.3312 +437 221 -3.43063079132e-6 +438 221 -4.26121883769e-8 +439 221 -.0010158616778 +440 221 -84527935897.4 +441 221 -.000123977661133 +442 221 -938284023.669 +443 221 1.33379680309e-5 +444 221 -1.52170421787e-6 +445 221 -.000528848777867 +446 221 -37306551282.1 +447 221 -9.09e8 +222 222 211869166667 +224 222 -1940301831.5 +226 222 -4.76837158203e-7 +228 222 118707261538 +301 222 841127136.752 +302 222 -960797069.597 +303 222 1.36413567691e-6 +304 222 8.64e7 +305 222 3.03e8 +306 222 -92527333333.3 +308 222 960797069.597 +310 222 -1.0656e9 +312 222 -60885661538.4 +430 222 -645277777.778 +431 222 6.6409837963e-6 +432 222 -1.04857638889e-6 +433 222 4.90460208333e-5 +434 222 9.09e8 +435 222 -24425166666.7 +436 222 2096613247.86 +437 222 -2.59511715782e-5 +438 222 3.40342387136e-6 +439 222 -.000115237829224 +440 222 -.0001220703125 +441 222 70258448717.9 +442 222 -841127136.752 +443 222 1.19568558954e-5 +444 222 -1.36413567691e-6 +445 222 3.76593083908e-5 +446 222 -9.09e8 +447 222 -31188282051.3 +223 223 208811976.432 +225 223 1.19209289551e-7 +227 223 -703818.41716 +228 223 -500346.020761 +229 223 -35143333.3333 +231 223 -2.22e7 +241 223 -61517179.4872 +243 223 -8.94069671631e-8 +289 223 -33259487.1795 +291 223 2.22e7 +301 223 -33251282.0513 +303 223 -2.22e7 +307 223 -3871.94659382 +309 223 1.78813934326e-7 +311 223 -2071005.91716 +1181 223 -19621.4125789 +1187 223 -500346.020761 +224 224 173737342.288 +226 224 185092178.255 +228 224 135753142.857 +230 224 34014668.5185 +232 224 8.541e8 +234 224 -729941333.333 +242 224 -84937317.2752 +244 224 34748520.7101 +246 224 2076054974.36 +290 224 41683893.2012 +292 224 -819351479.29 +294 224 -930369641.026 +302 224 28459408.2978 +304 224 -515137785.292 +306 224 960797069.597 +308 224 -90400622.0876 +310 224 2124524767.54 +312 224 30427428.5713 +1183 224 -1864705.88235 +225 225 294656434.599 +226 225 500346.020761 +229 225 -2.22e7 +231 225 -3.53e7 +241 225 8.94069671631e-8 +243 225 26992307.6923 +289 225 2.22e7 +291 225 -38092307.6923 +301 225 -2.22e7 +303 225 -46197802.1978 +307 225 -3.12924385071e-7 +309 225 -122786813.187 +1184 225 -19621.4125789 +1185 225 500346.020761 +226 226 193253699677 +228 226 7.62939453125e-6 +230 226 -8.541e8 +232 226 -4.1872e10 +234 226 1.0656e9 +242 226 34748520.7101 +244 226 -73140676923.1 +246 226 8.58306884766e-6 +290 226 819351479.29 +292 226 -33117538461.5 +294 226 -1.0656e9 +302 226 515137785.292 +304 226 -21832439560.4 +306 226 1.0656e9 +308 226 -2124524767.54 +310 226 75490901098.9 +312 226 -2.38418579102e-6 +1184 226 -500346.020761 +1185 226 8505882.35294 +227 227 195192307.692 +307 227 2071005.91716 +311 227 53846153.8461 +228 228 229551885855 +230 228 729941333.333 +232 228 1.0656e9 +234 228 -3.381424e10 +242 228 -2076054974.36 +244 228 -5.72204589844e-6 +246 228 88863495384.6 +290 228 930369641.026 +292 228 -1.0656e9 +294 228 -42576935384.6 +302 228 -960797069.597 +304 228 1.0656e9 +306 228 -60885661538.4 +308 228 30427428.5713 +310 228 9.53674316406e-7 +312 228 -104521530533 +1181 228 500346.020761 +1187 228 8505882.35294 +229 229 3022800903.4 +230 229 670571.479708 +231 229 -279228.326424 +233 229 -333775.240609 +234 229 -386170.163909 +235 229 -1537308915.6 +237 229 -9.53674316406e-7 +239 229 1194214.87603 +241 229 25258183.5938 +243 229 1.49011611938e-8 +245 229 -1367187.5 +247 229 -35143333.3333 +249 229 2.22e7 +253 229 488599696.97 +255 229 -1.107e8 +259 229 -1208636363.64 +261 229 -1.3375e9 +1000 229 -390171.392634 +1001 229 -670571.479708 +1002 229 279228.326422 +1004 229 -160802.616642 +1005 229 -386170.163909 +230 230 147188209.665 +231 230 -502928.609781 +232 230 1754520625.28 +233 230 -4.65661287308e-10 +234 230 214403.488857 +236 230 -12240572.8543 +238 230 -394387052.342 +242 230 -77207396.9329 +244 230 2148746875 +248 230 34014668.5185 +250 230 -8.541e8 +252 230 -729941333.333 +254 230 -65070362.7037 +256 230 -766074862.259 +258 230 2007413292.93 +260 230 2812153.44445 +262 230 88025137.741 +264 230 -6512626.26263 +1000 230 -670571.479708 +1001 230 -1225658.39594 +1002 230 502928.609781 +1003 230 160802.616642 +1004 230 4.65661287308e-10 +1005 230 214403.488855 +231 231 35284763842.6 +232 231 386170.163909 +233 231 -214403.488855 +235 231 -9.53674316406e-7 +237 231 -33034939393.9 +241 231 1.49011611938e-8 +243 231 -7.065e7 +247 231 2.22e7 +249 231 -3.53e7 +253 231 1.107e8 +255 231 8000220359.15 +257 231 -24311111.1111 +259 231 -1.3375e9 +261 231 -9054393939.39 +1000 231 279228.326422 +1001 231 502928.609781 +1002 231 -227288.202221 +1003 231 386170.163909 +1004 231 -214403.488855 +232 232 126026937453 +233 232 -6178722.62253 +234 232 2572841.86627 +236 232 394387052.342 +238 232 10960797558.9 +240 232 -2.08616256714e-7 +242 232 -2148746875 +244 232 9.78415e10 +246 232 -4.76837158203e-6 +248 232 8.541e8 +250 232 -4.1872e10 +252 232 -1.0656e9 +254 232 -766074862.259 +256 232 -44106030455.2 +258 232 8.405625e7 +260 232 -88025137.741 +262 232 -3078694234.01 +264 232 27864583.3333 +1001 232 -160802.616642 +1002 232 -386170.163909 +1003 232 6529180.20862 +1004 232 -3089361.31127 +1005 232 1286420.93313 +233 233 3062738875.1 +234 233 4634041.9669 +235 233 -1194214.87603 +239 233 26272727.2727 +241 233 1367187.5 +245 233 4.375e7 +255 233 24311111.1111 +257 233 729333333.333 +1000 233 160802.616642 +1001 233 4.65661287308e-10 +1002 233 214403.488855 +1003 233 -3089361.31127 +1004 233 2680043.61069 +1005 233 2317020.98345 +234 234 219124156157 +238 234 -1.78813934326e-7 +240 234 -673293414.918 +244 234 -3.81469726563e-6 +246 234 -65921183557.7 +248 234 729941333.333 +250 234 -1.0656e9 +252 234 -3.381424e10 +254 234 -2007413292.93 +256 234 -8.405625e7 +258 234 72233805984.8 +260 234 6512626.26263 +262 234 27864583.3333 +264 234 -290785984.848 +1000 234 386170.163909 +1001 234 -214403.488855 +1003 234 1286420.93313 +1004 234 2317020.98345 +1005 234 7279592.41962 +235 235 5531367559.52 +236 235 807139.556004 +237 235 -7.62939453125e-6 +239 235 -456969.978074 +240 235 -465433.183904 +253 235 -1208636363.64 +255 235 1.3375e9 +259 235 765422077.922 +261 235 6.67572021484e-6 +325 235 -1056785714.29 +327 235 1.3375e9 +331 235 -993588982.021 +335 235 737244.897959 +337 235 -1056785714.29 +339 235 -1.3375e9 +236 236 21724352.3571 +238 236 71194025.1307 +240 236 258410.689858 +254 236 2812153.44445 +256 236 -88025137.741 +258 236 -6512626.26263 +260 236 -5211754.03204 +262 236 6176605.45623 +264 236 13564213.5642 +326 236 2353304.29129 +328 236 94201743.1973 +330 236 4968253.96825 +332 236 -7915883.36393 +334 236 -323193027.211 +338 236 2353304.29129 +340 236 94201743.1973 +342 236 -4968253.96825 +237 237 63306460928.2 +238 237 465433.183904 +239 237 -258410.689858 +253 237 1.3375e9 +255 237 -9054393939.39 +259 237 -3.81469726563e-6 +261 237 14010822510.8 +325 237 1.3375e9 +327 237 -7373095238.1 +331 237 4.76837158203e-6 +333 237 -25438166666.7 +337 237 -1.3375e9 +339 237 -7373095238.1 +238 238 30374396291.9 +239 238 -7446930.94247 +254 238 88025137.741 +256 238 -3078694234.01 +258 238 -27864583.3333 +260 238 6176605.45623 +262 238 -6602975438.91 +264 238 -2.08616256714e-7 +326 238 -94201743.1973 +328 238 -4091283068.78 +330 238 -27864583.3333 +332 238 323193027.211 +334 238 11956673280.4 +336 238 -1.78813934326e-7 +338 238 -94201743.1973 +340 238 -4091283068.78 +342 238 27864583.3333 +239 239 97965739.8689 +331 239 -737244.897959 +335 239 20642857.1429 +240 240 1452000044.26 +254 240 6512626.26263 +256 240 -27864583.3333 +258 240 -290785984.848 +260 240 -13564213.5642 +262 240 -7.45058059692e-8 +264 240 577296401.515 +326 240 -4968253.96825 +328 240 -27864583.3333 +330 240 -224010416.667 +334 240 -3.42726707458e-7 +336 240 -511159111.722 +338 240 4968253.96825 +340 240 27864583.3333 +342 240 -224010416.667 +241 241 223970222.045 +242 241 807139.556004 +243 241 -1.19209289551e-7 +245 241 -703818.41716 +246 241 -465433.183904 +247 241 -61517179.4872 +249 241 -8.94069671631e-8 +253 241 -35143333.3333 +255 241 -2.22e7 +283 241 -33259487.1795 +285 241 2.22e7 +289 241 11081256.2585 +291 241 -5.96046447754e-8 +293 241 -2071005.91716 +307 241 -33259487.1795 +309 241 -2.22e7 +1153 241 -469661.896808 +1154 241 -807139.556004 +1158 241 -465433.183904 +242 242 197689010.252 +244 242 157293361.686 +246 242 258410.689865 +248 242 -84937317.2752 +250 242 34748520.7101 +252 242 2076054974.36 +254 242 34014668.5185 +256 242 8.541e8 +258 242 -729941333.333 +284 242 41683893.2012 +286 242 -819351479.29 +288 242 -930369641.026 +290 242 -100478998.661 +292 242 2306040236.69 +308 242 41683893.2012 +310 242 -819351479.29 +312 242 930369641.026 +1153 242 -807139.556004 +1154 242 -1475303.54621 +1158 242 258410.689858 +243 243 261133072.686 +244 243 465433.183904 +245 243 -258410.689858 +247 243 8.94069671631e-8 +249 243 26992307.6923 +253 243 -2.22e7 +255 243 -3.53e7 +283 243 2.22e7 +285 243 -38092307.6923 +291 243 -97661538.4615 +307 243 -2.22e7 +309 243 -38092307.6923 +1155 243 -21534.2241549 +1156 243 465433.183904 +1157 243 -258410.689858 +244 244 209191305254 +245 244 -7446930.94247 +246 244 -3.81469726563e-6 +248 244 34748520.7101 +250 244 -73140676923.1 +252 244 8.58306884766e-6 +254 244 -8.541e8 +256 244 -4.1872e10 +258 244 1.0656e9 +284 244 819351479.29 +286 244 -33117538461.5 +288 244 -1.0656e9 +290 244 -2306040236.69 +292 244 83585846153.8 +294 244 7.15255737305e-6 +308 244 819351479.29 +310 244 -33117538461.5 +312 244 1.0656e9 +1155 244 -465433.183904 +1156 244 6706473.2902 +1157 244 -3723465.47124 +245 245 199326878.73 +289 245 2071005.91716 +293 245 53846153.8461 +1155 245 258410.689858 +1156 245 -3723465.47124 +1157 245 2067285.51886 +246 246 200799412377 +248 246 -2076054974.36 +250 246 -5.72204589844e-6 +252 246 88863495384.6 +254 246 729941333.333 +256 246 1.0656e9 +258 246 -3.381424e10 +284 246 930369641.026 +286 246 -1.0656e9 +288 246 -42576935384.6 +292 246 -2.86102294922e-6 +294 246 -84971401301.8 +308 246 -930369641.026 +310 246 1.0656e9 +312 246 -42576935384.6 +1153 246 465433.183904 +1154 246 -258410.689858 +1158 246 8773758.80906 +247 247 208792355.019 +249 247 -3.57627868652e-7 +251 247 -703818.41716 +253 247 13931516.9271 +255 247 1.49011611938e-8 +257 247 1367187.5 +271 247 -32816666.6667 +273 247 -2.22e7 +277 247 -26732051.2821 +279 247 1.49011611939e-7 +283 247 -3871.94659385 +285 247 -2.38418579102e-7 +287 247 -2071005.91716 +289 247 -33259487.1795 +291 247 -2.22e7 +295 247 -33251282.0513 +297 247 2.22e7 +248 248 171872636.405 +250 248 185092178.254 +252 248 -135753142.857 +254 248 -68806565.338 +256 248 -1939432589.29 +258 248 -37449142.8571 +272 248 23926336.9237 +274 248 563785714.286 +276 248 -767390476.19 +278 248 -55752638.6455 +280 248 48647928.9941 +282 248 1940301831.5 +284 248 -90400622.0876 +286 248 2124524767.54 +288 248 -30427428.5713 +290 248 41683893.2012 +292 248 -819351479.29 +294 248 930369641.026 +296 248 28459408.2978 +298 248 -515137785.292 +300 248 -960797069.597 +249 249 294636813.187 +253 249 -1.49011611938e-8 +255 249 -92307142.8571 +271 249 -2.22e7 +273 249 -40642857.1428 +277 249 -1.63912773132e-7 +279 249 53697802.1978 +283 249 3.12924385071e-7 +285 249 -122786813.187 +289 249 -2.22e7 +291 249 -38092307.6923 +295 249 2.22e7 +297 249 -46197802.1978 +250 250 193236687912 +252 250 -1.14440917969e-5 +254 250 1939432589.29 +256 250 86988928571.4 +258 250 1.90734863281e-6 +272 250 -563785714.286 +274 250 -28427428571.4 +276 250 1.0656e9 +278 250 48647928.9941 +280 250 -45635164835.2 +282 250 -7.62939453125e-6 +284 250 -2124524767.54 +286 250 75490901098.9 +288 250 7.15255737305e-6 +290 250 819351479.29 +292 250 -33117538461.5 +294 250 1.0656e9 +296 250 515137785.292 +298 250 -21832439560.4 +300 250 -1.0656e9 +251 251 195192307.692 +253 251 -1367187.5 +257 251 4.375e7 +283 251 2071005.91716 +287 251 53846153.8461 +252 252 2.2953487409e11 +254 252 -37449142.8571 +256 252 1.90734863281e-6 +258 252 -82251103557.7 +272 252 767390476.19 +274 252 1.0656e9 +276 252 -4.89128e10 +278 252 -1940301831.5 +280 252 -4.76837158203e-7 +282 252 118707261538 +284 252 -30427428.5713 +286 252 -4.76837158203e-6 +288 252 -104521530533 +290 252 -930369641.026 +292 252 1.0656e9 +294 252 -42576935384.6 +296 252 960797069.597 +298 252 -1.0656e9 +300 252 -60885661538.4 +253 253 3276283372.7 +255 253 -7.62939453125e-6 +257 253 -172972.623967 +259 253 -1995620603.91 +261 253 -1.14440917969e-5 +263 253 1194214.87603 +265 253 -1541233766.23 +267 253 -1.3375e9 +271 253 1034636147.19 +273 253 -1.107e8 +277 253 -32816666.6667 +279 253 2.22e7 +254 254 119066973.916 +256 254 1561894218.57 +258 254 -584911891.157 +260 254 -11691032.29 +262 254 -377538370.72 +264 254 -149659.863943 +266 254 1675648.19189 +268 254 51806621.4089 +270 254 -6662286.12657 +272 254 -35894820.6625 +274 254 -511979092.877 +276 254 1422501401.77 +278 254 23926336.9237 +280 254 -563785714.286 +282 254 -767390476.19 +255 255 41964813103.9 +257 255 11907482.9932 +259 255 1.43051147461e-5 +261 255 -40005025974 +265 255 -1.3375e9 +267 255 -12311580086.6 +271 255 1.107e8 +273 255 11574216536.9 +275 255 -12403628.1179 +277 255 2.22e7 +279 255 -40642857.1428 +256 256 115999130131 +258 256 -7.9870223999e-6 +260 256 377538370.72 +262 256 10263800505 +264 256 -2.98023223877e-8 +266 256 -51806621.4089 +268 256 -1955560816.5 +270 256 27864583.3333 +272 256 -511979092.877 +274 256 -28055008766.7 +276 256 8.405625e7 +278 256 563785714.286 +280 256 -28427428571.4 +282 256 -1.0656e9 +257 257 2640616883.12 +259 257 -1194214.87603 +263 257 26272727.2727 +273 257 12403628.1179 +275 257 520952380.952 +258 258 2.1379883154e11 +260 258 -149659.863943 +262 258 -5.06639480591e-7 +264 258 -820482267.732 +266 258 6662286.12657 +268 258 27864583.3333 +270 258 -413386093.073 +272 258 -1422501401.77 +274 258 -8.405625e7 +276 258 76561028950.2 +278 258 767390476.19 +280 258 -1.0656e9 +282 258 -4.89128e10 +259 259 5951352443.08 +261 259 -7.62939453125e-6 +263 259 -456969.978074 +265 259 1757305194.81 +267 259 7.62939453125e-6 +271 259 -1541233766.23 +273 259 1.3375e9 +331 259 -1056785714.29 +333 259 1.3375e9 +337 259 -1384303267.74 +339 259 -1.33514404297e-5 +341 259 737244.897959 +343 259 -1.2875e9 +345 259 -1.3375e9 +260 260 19122754.0263 +262 260 76135309.4957 +264 260 -680272.108847 +266 260 -3213782.46015 +268 260 8647247.63872 +270 260 12883941.4554 +272 260 1675648.19189 +274 260 -51806621.4089 +276 260 -6662286.12657 +332 260 2353304.29129 +334 260 94201743.1973 +336 260 4968253.96825 +338 260 -7368553.61192 +340 260 -301403061.225 +342 260 -190476.190476 +344 260 1521262.44016 +346 260 60453869.0476 +348 260 -5158730.15873 +261 261 75136525974 +265 261 -3.81469726563e-6 +267 261 20443722943.7 +271 261 1.3375e9 +273 261 -12311580086.6 +331 261 1.3375e9 +333 261 -7373095238.1 +337 261 1.43051147461e-5 +339 261 -30988642857.1 +343 261 -1.3375e9 +345 261 -9858333333.33 +262 262 29126668470.4 +264 262 1.19209289551e-7 +266 262 8647247.63872 +268 262 -3846744979.56 +270 262 -1.49011611939e-7 +272 262 51806621.4089 +274 262 -1955560816.5 +276 262 -27864583.3333 +332 262 -94201743.1973 +334 262 -4091283068.78 +336 262 -27864583.3333 +338 262 301403061.225 +340 262 10931230158.7 +342 262 1.19209289551e-7 +344 262 -60453869.0476 +346 262 -2731018518.52 +348 262 27864583.3333 +263 263 93831168.8312 +337 263 -737244.897959 +341 263 20642857.1429 +264 264 1664126498.5 +266 264 -12883941.4554 +268 264 -2.38418579102e-7 +270 264 779643533.549 +272 264 6662286.12657 +274 264 -27864583.3333 +276 264 -413386093.073 +332 264 -4968253.96825 +334 264 -27864583.3333 +336 264 -224010416.667 +338 264 -190476.190476 +340 264 -4.32133674622e-7 +342 264 -629358516.483 +344 264 5158730.15873 +346 264 27864583.3333 +348 264 -321614583.333 +265 265 3186278720.06 +267 265 1.52587890625e-5 +269 265 -4348.33024118 +270 265 -14345463.5642 +271 265 -1227126264.39 +273 265 1.125e8 +275 265 -68655.3030303 +276 265 6340751.26263 +337 265 -1.2875e9 +339 265 1.3375e9 +343 265 -887633461.784 +345 265 -1.125e8 +347 265 64306.9727891 +348 265 4749503.96825 +373 265 177695.91432 +377 265 51609.8484848 +378 265 6340751.26263 +379 265 -401329.605561 +383 265 -2174.1651206 +384 265 -14345463.5642 +385 265 133211.237537 +389 265 -53784.0136054 +390 265 4749503.96825 +266 266 1285485430.44 +267 266 -3.57627868652e-7 +268 266 17294495.2774 +270 266 -12883941.4554 +272 266 254906339.036 +273 266 -2.5e6 +274 266 119601042.897 +276 266 6662286.12657 +338 266 1521262.44016 +340 266 60453869.0476 +342 266 5158730.15873 +344 266 334625102.356 +345 266 2.5e6 +346 266 -102306547.619 +348 266 5158730.15873 +374 266 -291363636.364 +375 266 2.75e7 +380 266 -1220779220.78 +381 266 8.94069671631e-8 +386 266 -362857142.857 +387 266 -2.75e7 +267 267 43518695887.4 +271 267 -1.125e8 +272 267 2.5e6 +273 267 -23476124458.9 +337 267 1.3375e9 +339 267 -9858333333.33 +343 267 1.125e8 +344 267 -2.5e6 +345 267 -18253880952.4 +374 267 2.75e7 +375 267 -1.675e7 +380 267 -8.94069671631e-8 +381 267 -25892857.1429 +386 267 -2.75e7 +387 267 -19857142.8571 +268 268 9173449525.01 +270 268 -1.19209289551e-7 +272 268 -119601042.897 +274 268 3447038089.23 +276 268 2.34375e6 +338 268 -60453869.0476 +340 268 -2731018518.52 +342 268 -27864583.3333 +344 268 102306547.619 +346 268 3902893518.52 +348 268 -2.34375e6 +269 269 6708829.36508 +270 269 7.45058059692e-9 +271 269 68655.3030303 +275 269 2045138.88889 +276 269 -52083.3333333 +343 269 -64306.9727891 +347 269 2481150.79365 +348 269 52083.3333333 +373 269 -51609.8484848 +377 269 -1670138.88889 +378 269 -572916.666667 +379 269 -2174.1651206 +383 269 -5369543.65079 +384 269 -4.19095158577e-9 +385 269 53784.0136054 +389 269 -2186507.93651 +390 269 572916.666667 +270 270 1490614853.9 +271 270 6340751.26263 +272 270 6662286.12657 +274 270 -2.34375e6 +275 270 52083.3333333 +276 270 -707065746.753 +338 270 -5158730.15873 +340 270 -27864583.3333 +342 270 -321614583.333 +343 270 4749503.96825 +344 270 5158730.15873 +346 270 2.34375e6 +347 270 -52083.3333333 +348 270 -538013392.857 +373 270 -6340751.26263 +377 270 -572916.666667 +378 270 -233882575.757 +379 270 14345463.5642 +383 270 -4.65661287308e-9 +384 270 490192099.567 +385 270 -4749503.96825 +389 270 572916.666667 +390 270 -178184523.809 +271 271 1835263440.06 +273 271 -1.3153e9 +275 271 -1312821969.7 +276 271 -1541800820.71 +277 271 -43959604.0702 +279 271 1.8e6 +281 271 -1312890625 +282 271 645277777.778 +373 271 -62884703.0517 +377 271 962604640.151 +378 271 -1541800820.71 +379 271 177695.91432 +383 271 -51609.8484848 +384 271 6340751.26263 +448 271 37979721.2577 +452 271 9.6265625e8 +453 271 645277777.778 +272 272 704560109.65 +273 272 8.5625e6 +274 272 935887796.389 +276 272 -1422501401.77 +278 272 -15583346.4723 +279 272 -6.3125e6 +280 272 1055488839.29 +282 272 767390476.19 +374 272 -604653724.747 +375 272 3.8125e6 +380 272 -291363636.364 +381 272 -2.75e7 +449 272 -37524305.5556 +450 272 1.89375e7 +273 273 24426376511.6 +274 273 37986111.1111 +275 273 12403628.1179 +277 273 -1.8e6 +278 273 6.3125e6 +279 273 -110023809.524 +374 273 -3.8125e6 +375 273 -12857253.0864 +376 273 37986111.1111 +380 273 -2.75e7 +381 273 -1.675e7 +449 273 1.89375e7 +450 273 -32614583.3333 +274 274 64330296645.5 +276 274 -1037735416.67 +278 274 -1055488839.29 +280 274 44161928571.4 +282 274 8.64e7 +375 274 -37986111.1111 +376 274 911666666.667 +275 275 70801883661.5 +276 275 908427083.333 +277 275 1312890625 +281 275 57903166666.7 +282 275 -3.03e8 +373 275 962604640.151 +377 275 -47344228899.6 +378 275 302947916.667 +379 275 51609.8484848 +383 275 -1670138.88889 +384 275 572916.666667 +448 275 -9.6265625e8 +452 275 -46695666666.7 +453 275 -9.09e8 +276 276 170139734794 +277 276 645277777.778 +278 276 767390476.19 +280 276 -8.64e7 +281 276 3.03e8 +282 276 -72234233333.3 +373 276 1541800820.71 +377 276 -302947916.667 +378 276 46023424242.4 +379 276 -6340751.26263 +383 276 572916.666667 +384 276 -233882575.757 +448 276 -645277777.778 +452 276 -9.09e8 +453 276 -24425166666.7 +277 277 220319390.241 +279 277 2.38418579102e-7 +281 277 -155925943.047 +282 277 -2096613247.86 +283 277 -33251282.0513 +285 277 -2.22e7 +295 277 -66544554.6888 +297 277 1.8e6 +299 277 -1468816568.05 +300 277 841127136.752 +373 277 37979721.2577 +377 277 -9.6265625e8 +378 277 645277777.778 +448 277 -102353160.136 +452 277 -24372226.3312 +453 277 -2096613247.86 +454 277 47423207.397 +458 277 938284023.669 +459 277 841127136.752 +278 278 208006702.956 +279 278 -1.19209289551e-7 +280 278 204477348.373 +282 278 -1940301831.5 +284 278 28459408.2978 +286 278 -515137785.292 +288 278 960797069.597 +296 278 -36416279.726 +297 278 -6.3125e6 +298 278 1259966187.66 +300 278 960797069.597 +374 278 -37524305.5556 +375 278 -1.89375e7 +449 278 -80578792.735 +455 278 -34448985.0427 +456 278 1.89375e7 +279 279 350466460.623 +283 279 -2.22e7 +285 279 -46197802.1978 +295 279 -1.8e6 +296 279 6.3125e6 +297 279 -146278960.623 +374 279 -1.89375e7 +375 279 -32614583.3333 +450 279 4693910.25641 +455 279 1.89375e7 +456 279 -33100160.2564 +280 280 115835241758 +282 280 3.81469726563e-6 +284 280 515137785.292 +286 280 -21832439560.4 +288 280 1.0656e9 +296 280 -1259966187.66 +298 280 41197978022 +300 280 8.64e7 +281 281 134530628205 +282 281 7.62939453125e-6 +295 281 1468816568.05 +299 281 51100397435.9 +300 281 -3.03e8 +373 281 9.6265625e8 +377 281 -46695666666.7 +378 281 9.09e8 +448 281 -24372226.3312 +452 281 -84527935897.4 +453 281 1.90734863281e-6 +454 281 -938284023.669 +458 281 -37306551282.1 +459 281 -9.09e8 +282 282 211869166667 +284 282 -960797069.597 +286 282 1.0656e9 +288 282 -60885661538.4 +295 282 841127136.752 +296 282 960797069.597 +298 282 -8.64e7 +299 282 3.03e8 +300 282 -92527333333.3 +373 282 -645277777.778 +377 282 9.09e8 +378 282 -24425166666.7 +448 282 2096613247.86 +452 282 -3.81469726563e-6 +453 282 70258448718 +454 282 -841127136.752 +458 282 -9.09e8 +459 282 -31188282051.3 +283 283 195524252.613 +285 283 3.57627868652e-7 +287 283 -821556.066311 +289 283 -41470209.7902 +291 283 -2.23517417908e-7 +295 283 -8906293.70629 +297 283 -1.78813934326e-7 +769 283 -32790303.0303 +771 283 -2.22e7 +775 283 -11200380.6662 +777 283 2.23517417908e-7 +779 283 -2892561.98347 +781 283 -34642424.2424 +783 283 2.22e7 +284 284 214898866.509 +286 284 216055161.622 +288 284 -112347428.572 +290 284 -97826795.3688 +292 284 40561396.6452 +294 284 -2394813762.24 +296 284 -63327734.8988 +298 284 56785955.3035 +300 284 2282466333.67 +770 284 48497035.501 +772 284 -778790082.645 +774 284 1120380121.21 +776 284 -114016483.197 +778 284 2340579929.16 +780 284 -25746285.7139 +782 284 32081932.0432 +784 284 -458351829.988 +786 284 -1146126406.93 +285 285 339711488.511 +289 285 3.42726707458e-7 +291 285 41219580.4196 +295 285 1.34110450745e-7 +297 285 70873126.8731 +769 285 -2.22e7 +771 285 -41527272.7273 +775 285 -8.94069671631e-8 +777 285 -151096103.896 +781 285 2.22e7 +783 285 -52103896.1039 +286 286 179229947652 +288 286 3.43322753906e-5 +290 286 40561396.6453 +292 286 -56905040559.4 +294 286 1.19209289551e-5 +296 286 56785955.3035 +298 286 -32691788211.8 +300 286 2.86102294922e-6 +770 286 778790082.645 +772 286 -27130181818.2 +774 286 1.0656e9 +776 286 -2340579929.16 +778 286 68630129870.1 +780 286 -1.38282775879e-5 +782 286 458351829.988 +784 286 -17224311688.3 +786 286 -1.0656e9 +287 287 234965034.965 +775 287 2892561.98347 +779 287 63636363.6364 +288 288 265581230253 +290 288 2394813762.24 +292 288 -1.04904174805e-5 +294 288 103842622657 +296 288 -2282466333.67 +298 288 -1.28746032715e-5 +300 288 1.4066107972e11 +770 288 -1120380121.21 +772 288 1.0656e9 +774 288 -50943767272.7 +776 288 -25746285.7139 +778 288 1.90734863281e-6 +780 288 -1.2567025972e11 +782 288 1146126406.93 +784 288 -1.0656e9 +786 288 -72402618181.8 +289 289 204389998.426 +290 289 807139.556004 +291 289 1.19209289551e-7 +293 289 -821556.066311 +294 289 -465433.183904 +307 289 -41470209.7902 +309 289 -2.23517417908e-7 +757 289 -32790303.0303 +759 289 -2.22e7 +769 289 38407.2126215 +771 289 1.49011611938e-8 +773 289 -2892561.98347 +775 289 -32790303.0303 +777 289 2.22e7 +1534 289 -469661.896808 +1535 289 -807139.556004 +1539 289 -465433.183904 +290 290 242525834.292 +292 290 183606044.306 +294 290 258410.689865 +308 290 -97826795.3688 +310 290 40561396.6452 +312 290 -2394813762.24 +758 290 48497035.501 +760 290 -778790082.645 +762 290 1120380121.21 +770 290 -125238498.751 +772 290 2489646280.99 +776 290 48497035.501 +778 290 -778790082.645 +780 290 -1120380121.21 +1534 290 -807139.556004 +1535 290 -1475303.54621 +1539 290 258410.689858 +291 291 296883072.686 +292 291 465433.183904 +293 291 -258410.689858 +307 291 3.42726707458e-7 +309 291 41219580.4196 +757 291 -2.22e7 +759 291 -41527272.7273 +769 291 -1.49011611938e-8 +771 291 -1.224e8 +775 291 2.22e7 +777 291 -41527272.7273 +1536 291 -21534.2241549 +1537 291 465433.183904 +1538 291 -258410.689858 +292 292 189535941618 +293 292 -7446930.94247 +308 292 40561396.6453 +310 292 -56905040559.4 +312 292 1.19209289551e-5 +758 292 778790082.645 +760 292 -27130181818.2 +762 292 1.0656e9 +770 292 -2489646280.99 +772 292 74765818181.8 +774 292 -3.33786010742e-6 +776 292 778790082.645 +778 292 -27130181818.2 +780 292 -1.0656e9 +1536 292 -465433.183904 +1537 292 6706473.2902 +1538 292 -3723465.47124 +293 293 239099606.003 +769 293 2892561.98347 +773 293 63636363.6364 +1536 293 258410.689858 +1537 293 -3723465.47124 +1538 293 2067285.51886 +294 294 229199659449 +308 294 2394813762.24 +310 294 -1.04904174805e-5 +312 294 103842622657 +758 294 -1120380121.21 +760 294 1.0656e9 +762 294 -50943767272.7 +774 294 -102923030629 +776 294 1120380121.21 +778 294 -1.0656e9 +780 294 -50943767272.7 +1534 294 465433.183904 +1535 294 -258410.689858 +1539 294 8773758.80906 +295 295 227409546.92 +299 295 -124168212.531 +300 295 -2333673585.58 +448 295 47423207.397 +452 295 -938284023.669 +453 295 841127136.752 +454 295 -97058748.1422 +458 295 -110889142.138 +459 295 -1844948902.17 +775 295 -34642424.2424 +777 295 -2.22e7 +781 295 -40796760.9984 +783 295 1.8e6 +785 295 -634607801.277 +786 295 187028351.82 +787 295 -60808775.2716 +791 295 -958376979.301 +792 295 542667395.914 +811 295 67230084.7838 +815 295 827394881.53 +816 295 844363727.503 +296 296 234474711.555 +297 296 6957998.49161 +298 296 238683162.991 +300 296 -2282466333.67 +449 296 -34448985.0427 +450 296 -1.89375e7 +455 296 -69598598.3475 +456 296 -6957998.49161 +776 296 32081932.0432 +778 296 -458351829.988 +780 296 1146126406.93 +782 296 -77378826.6087 +783 296 -2.525e7 +784 296 1498649350.65 +786 296 1146126406.93 +788 296 16859378.6741 +789 296 23959003.0168 +812 296 -30632105.9469 +813 296 13915996.9832 +297 297 412106290.514 +449 297 -1.89375e7 +450 297 -33100160.2564 +455 297 -6957998.49161 +456 297 9188414.78103 +775 297 -2.22e7 +777 297 -52103896.1039 +781 297 -1.8e6 +782 297 -1.2625e7 +783 297 -180055194.805 +788 297 23959003.0168 +789 297 -15687127.3144 +812 297 13915996.9832 +813 297 -18744690.8674 +298 298 117195956044 +300 298 -1.52587890625e-5 +776 298 458351829.988 +778 298 -17224311688.3 +780 298 1.0656e9 +782 298 -1498649350.65 +784 298 40110857142.9 +786 298 8.64e7 +299 299 142033450256 +300 299 1.136962778e10 +448 299 938284023.669 +452 299 -37306551282.1 +453 299 9.09e8 +454 299 -201676087.197 +458 299 -78034413002 +459 299 -11973256732.4 +781 299 977493112.948 +785 299 14443875624 +786 299 -5565935610.07 +787 299 1607403588.74 +791 299 46013384575 +792 299 4569221436.9 +811 299 -1728519857.58 +815 299 -40347733434.3 +816 299 -13162785999.5 +300 300 238616379023 +448 300 -841127136.752 +452 300 9.09e8 +453 300 -31188282051.3 +454 300 2351965372.02 +458 300 -11973256732.4 +459 300 68844993059.6 +776 300 -1146126406.93 +778 300 1.0656e9 +780 300 -72402618181.8 +781 300 -179021598.604 +782 300 1146126406.93 +784 300 -8.64e7 +785 300 -628843436.831 +786 300 -72651380372.5 +787 300 1985965195.27 +791 300 12582000483.8 +792 300 -18238057812.1 +811 300 -1825235383.11 +815 300 -13162785999.5 +816 300 -29252566128.3 +301 301 227409546.92 +302 301 -1.78180192573e-7 +303 301 -1.76090172996e-8 +304 301 -6.05535792758e-6 +305 301 -124168212.531 +306 301 -2333673585.58 +307 301 -8906293.70629 +309 301 -1.78813934326e-7 +436 301 47423207.397 +437 301 -1.13312321742e-6 +438 301 -1.38609438197e-7 +439 301 -1.47021037078e-5 +440 301 -938284023.669 +441 301 841127136.752 +442 301 -97058748.1422 +443 301 2.03223390433e-7 +444 301 3.33138323157e-7 +445 301 -1.12030322584e-5 +446 301 -110889142.138 +447 301 -1844948902.17 +727 301 -60808775.2716 +728 301 1.06731224293e-6 +729 301 6.28901943401e-7 +730 301 -5.96816050794e-6 +731 301 -958376979.301 +732 301 542667395.914 +733 301 67230084.7838 +734 301 -8.80400634995e-7 +735 301 -8.50517291371e-7 +736 301 1.86184887971e-5 +737 301 827394881.531 +738 301 844363727.503 +751 301 -40796760.9984 +753 301 -1.8e6 +755 301 -634607801.277 +756 301 187028351.82 +757 301 -34642424.2424 +759 301 2.22e7 +302 302 234474711.555 +303 302 6957998.49161 +304 302 238683162.991 +305 302 -6.25763260078e-6 +306 302 2282466333.67 +308 302 -63327734.8988 +310 302 56785955.3035 +312 302 2282466333.67 +436 302 -1.13312321742e-6 +437 302 -34448985.0427 +438 302 -1.89375e7 +439 302 2.08994488124e-19 +440 302 1.33379680309e-5 +441 302 -1.19568558954e-5 +442 302 3.70352591094e-7 +443 302 -69598598.3475 +444 302 -6957998.49161 +445 302 1.60421279098e-19 +446 302 4.52774475534e-6 +447 302 2.36214573519e-5 +727 302 9.20658202526e-7 +728 302 16859378.6741 +729 302 23959003.0168 +730 302 6.35498572604e-20 +731 302 1.01387230041e-5 +732 302 -3.82301562147e-6 +733 302 -8.80400634995e-7 +734 302 -30632105.9469 +735 302 13915996.9832 +736 302 -1.98252427006e-19 +737 302 -8.81022327556e-6 +738 302 -8.99091006138e-6 +752 302 -77378826.6087 +753 302 -2.525e7 +754 302 1498649350.65 +756 302 -1146126406.93 +758 302 32081932.0432 +760 302 -458351829.988 +762 302 -1146126406.93 +303 303 412106290.514 +304 303 3.11325361536e-19 +305 303 1.29310551212e-5 +306 303 1.23129905284e-5 +307 303 1.34110450745e-7 +309 303 70873126.8731 +436 303 -1.38609438197e-7 +437 303 -1.89375e7 +438 303 -33100160.2564 +439 303 -2.38437963979e-20 +440 303 -1.52170421787e-6 +441 303 1.36413567691e-6 +442 303 3.78173334731e-7 +443 303 -6957998.49161 +444 303 9188414.78103 +445 303 -2.250010398e-20 +446 303 -1.11328568821e-5 +447 303 6.67528750301e-6 +727 303 7.63334813771e-7 +728 303 23959003.0168 +729 303 -15687127.3144 +730 303 6.93271170114e-20 +731 303 1.10604250954e-5 +732 303 -4.17056249615e-6 +733 303 -8.50517291371e-7 +734 303 13915996.9832 +735 303 -18744690.8674 +736 303 -2.16275374915e-19 +737 303 -9.61115266424e-6 +738 303 -9.8082655215e-6 +751 303 1.8e6 +752 303 -1.2625e7 +753 303 -180055194.805 +757 303 2.22e7 +759 303 -52103896.1039 +304 304 117195956044 +305 304 .00135877395251 +306 304 .000552259780145 +308 304 56785955.3035 +310 304 -32691788211.8 +312 304 2.86102294922e-6 +436 304 1.47021037078e-5 +437 304 -2.08994488124e-19 +438 304 2.38437963979e-20 +439 304 -7.66263325913e-18 +440 304 -.000531797200944 +441 304 6.35026833908e-5 +442 304 7.07041516257e-6 +443 304 -2.12600380981e-20 +444 304 -2.82629628799e-19 +445 304 -1.08137248136e-17 +446 304 -.001106687211 +447 304 .00017136440899 +727 304 4.16510950572e-5 +728 304 -4.43507030701e-19 +729 304 -4.83825851674e-19 +730 304 5.1442011944e-18 +731 304 .000625321714937 +732 304 -.000130362947465 +733 304 -3.96077647182e-5 +734 304 4.21749346536e-19 +735 304 4.60090196221e-19 +736 304 -1.17781766676e-17 +737 304 -.000582529692539 +738 304 -.000479961831198 +752 304 -1498649350.65 +754 304 40110857142.9 +756 304 -8.64e7 +758 304 458351829.988 +760 304 -17224311688.3 +762 304 -1.0656e9 +305 305 142033450256 +306 305 1.136962778e10 +436 305 938284023.669 +437 305 -1.33379680309e-5 +438 305 1.52170421787e-6 +439 305 -.000531797200944 +440 305 -37306551282.1 +441 305 9.09e8 +442 305 -201676087.197 +443 305 5.49445759625e-6 +444 305 -1.00782610557e-5 +445 305 -.00109866500937 +446 305 -78034413002 +447 305 -11973256732.4 +727 305 1607403588.74 +728 305 -2.07007480899e-5 +729 305 -2.25826342799e-5 +730 305 .000618282320998 +731 305 46013384575 +732 305 4569221436.9 +733 305 -1728519857.58 +734 305 1.84055355205e-5 +735 305 2.00787660224e-5 +736 305 -.000582529692539 +737 305 -40347733434.3 +738 305 -13162785999.5 +751 305 977493112.948 +755 305 14443875624 +756 305 -5565935610.07 +306 306 238616379023 +308 306 -2282466333.67 +310 306 -1.28746032715e-5 +312 306 1.4066107972e11 +436 306 -841127136.752 +437 306 1.19568558954e-5 +438 306 -1.36413567691e-6 +439 306 6.35026833908e-5 +440 306 9.09e8 +441 306 -31188282051.3 +442 306 2351965372.02 +443 306 -2.90202438364e-5 +444 306 -1.25648727588e-5 +445 306 .000173526089546 +446 306 -11973256732.4 +447 306 68844993059.6 +727 306 1985965195.27 +728 306 -1.920448472e-5 +729 306 -2.09503469672e-5 +730 306 -.000123910169687 +731 306 12582000483.8 +732 306 -18238057812.1 +733 306 -1825235383.11 +734 306 1.94353767646e-5 +735 306 2.12022291977e-5 +736 306 -.000479961831198 +737 306 -13162785999.5 +738 306 -29252566128.3 +751 306 -179021598.604 +752 306 -1146126406.93 +754 306 8.64e7 +755 306 -628843436.831 +756 306 -72651380372.5 +758 306 1146126406.93 +760 306 -1.0656e9 +762 306 -72402618181.8 +307 307 195543874.025 +309 307 -2.38418579102e-7 +311 307 -821556.066311 +312 307 -500346.020761 +751 307 -34642424.2424 +753 307 -2.22e7 +757 307 -11200380.6662 +759 307 -1.9371509552e-7 +761 307 -2892561.98347 +769 307 -32790303.0303 +771 307 2.22e7 +1432 307 -19621.4125789 +1441 307 -500346.020761 +308 308 216763572.391 +310 308 216055161.622 +312 308 112347428.572 +752 308 32081932.0432 +754 308 -458351829.988 +756 308 1146126406.93 +758 308 -114016483.197 +760 308 2340579929.16 +762 308 25746285.7139 +770 308 48497035.501 +772 308 -778790082.645 +774 308 -1120380121.21 +1437 308 -1864705.88235 +309 309 339731109.924 +310 309 500346.020761 +751 309 -2.22e7 +753 309 -52103896.1039 +757 309 8.94069671631e-8 +759 309 -151096103.896 +769 309 2.22e7 +771 309 -41527272.7273 +1438 309 -19621.4125789 +1439 309 500346.020761 +310 310 179246959417 +312 310 -3.43322753906e-5 +752 310 458351829.988 +754 310 -17224311688.3 +756 310 1.0656e9 +758 310 -2340579929.16 +760 310 68630129870.1 +762 310 4.76837158203e-6 +770 310 778790082.645 +772 310 -27130181818.2 +774 310 -1.0656e9 +1438 310 -500346.020761 +1439 310 8505882.35294 +311 311 234965034.965 +757 311 2892561.98347 +761 311 63636363.6364 +312 312 265598242018 +752 312 -1146126406.93 +754 312 1.0656e9 +756 312 -72402618181.8 +758 312 25746285.7139 +760 312 -2.86102294922e-6 +762 312 -1.2567025972e11 +770 312 1120380121.21 +772 312 -1.0656e9 +774 312 -50943767272.7 +1432 312 500346.020761 +1441 312 8505882.35294 +313 313 4675977450.32 +314 313 2.50698147362e-6 +315 313 -1.37290620846e-7 +316 313 3.56081743374e-8 +317 313 47984.6938776 +318 313 -22006448.4127 +319 313 -2973989553.18 +320 313 6.46060218742e-8 +321 313 1.125e8 +322 313 -2.39463216146e-8 +323 313 112291.666667 +324 313 14782986.1111 +325 313 3589642857.14 +327 313 -1.23977661133e-5 +355 313 -3116428571.43 +357 313 -1.3375e9 +412 313 412624.614197 +413 313 -6.46022979159e-8 +414 313 2.9319733314e-9 +415 313 -2.40425238715e-8 +416 313 -29791.6666667 +417 313 14782986.1111 +418 313 -614556.91655 +419 313 -2.37484315384e-6 +420 313 2.94188281177e-8 +421 313 3.58953577481e-8 +422 313 23992.3469388 +423 313 -22006448.4127 +424 313 133211.237537 +425 313 -1.2230639224e-6 +426 313 1.21704344191e-7 +427 313 -7.52919722576e-9 +428 313 53784.0136054 +429 313 4749503.96825 +314 314 1021168341.48 +315 314 -1.19209289551e-7 +316 314 -190848214.286 +317 314 1.32743557492e-10 +318 314 20895691.61 +319 314 5.64810218742e-8 +320 314 69219378.7568 +321 314 2.5e6 +322 314 -293154761.905 +323 314 -7.60308159722e-11 +324 314 -14929138.322 +326 314 560293.727279 +328 314 -95424107.1428 +330 314 20895691.61 +356 314 -2094378.75679 +358 314 -34970238.0952 +360 314 -14929138.322 +412 314 -6.46022979159e-8 +413 314 -1.61e8 +414 314 -2.75e7 +415 314 1.62787922047e-23 +416 314 2.01714409722e-11 +417 314 -1.00093135127e-8 +418 314 -2.37482827289e-6 +419 314 -901142857.143 +420 314 -2.38418579102e-7 +421 314 -5.21446804099e-23 +422 314 -1.54439853198e-10 +423 314 3.1787669133e-8 +424 314 -1.2230639224e-6 +425 314 -362857142.857 +426 314 2.75e7 +427 314 2.44437479378e-23 +428 314 -1.7461129417e-10 +429 314 -1.54193965636e-8 +315 315 71947616666.7 +316 315 5.78321766067e-23 +317 315 7.8166517351e-11 +318 315 -3.57409178949e-8 +319 315 -1.125e8 +320 315 -2.5e6 +321 315 -52334330952.4 +322 315 -3.89127726237e-23 +323 315 1.82473958333e-10 +324 315 2.40223524305e-8 +325 315 1.43051147461e-5 +327 315 34969047619.1 +355 315 -1.3375e9 +357 315 -26422619047.6 +412 315 2.9319733314e-9 +413 315 -2.75e7 +414 315 -1.285e7 +415 315 -3.90691012912e-23 +416 315 -4.84114583333e-11 +417 315 2.40223524305e-8 +418 315 1.65716058955e-8 +419 315 1.04308128357e-7 +420 315 -14792857.1429 +421 315 5.82977086203e-23 +422 315 3.88274923064e-11 +423 315 -3.57409178949e-8 +424 315 1.21704344191e-7 +425 315 2.75e7 +426 315 -19857142.8571 +427 315 -1.22125371668e-23 +428 315 8.72389506398e-11 +429 315 7.70380851994e-9 +316 316 10210458002.6 +317 316 1.33832585841e-8 +318 316 -3.67502220701e-7 +319 316 -2.40983832465e-8 +320 316 293154761.905 +321 316 -3.91598727756e-23 +322 316 3302372685.18 +323 316 1.00951244213e-9 +324 316 2.34375e6 +326 316 -95424107.1428 +328 316 -1304208002.64 +330 316 8.94069671631e-8 +356 316 34970238.0952 +358 316 -21122685.1852 +360 316 27864583.3333 +412 316 2.40425238715e-8 +413 316 -1.62787922047e-23 +414 316 3.90691012912e-23 +415 316 -1.4130328079e-21 +416 316 -1.2972728588e-9 +417 316 8.69018120659e-7 +418 316 -3.55864780417e-8 +419 316 5.10382350692e-23 +420 316 -5.77968184504e-23 +421 316 2.00414620818e-21 +422 316 -1.03513885444e-8 +423 316 -1.25387008988e-6 +424 316 7.52919722576e-9 +425 316 -2.44437479378e-23 +426 316 1.22125371668e-23 +427 316 -4.85808347925e-22 +428 316 -6.169274278e-9 +429 316 2.87159550235e-7 +317 317 5912996.03175 +318 317 1.11758708954e-8 +319 317 -112291.666667 +320 317 7.60308159722e-11 +321 317 -1.82473958333e-10 +322 317 8.40241608796e-10 +323 317 1365972.22222 +324 317 52083.3333333 +412 317 29791.6666667 +413 317 -2.01714409722e-11 +414 317 4.84114583333e-11 +415 317 -1.2972728588e-9 +416 317 -540972.222222 +417 317 572916.666667 +418 317 23992.3469388 +419 317 -1.54439853198e-10 +420 317 3.88274923064e-11 +421 317 -1.03510785246e-8 +422 317 -3673710.31746 +423 317 1.04773789644e-8 +424 317 -53784.0136054 +425 317 1.7461129417e-10 +426 317 -8.72389506398e-11 +427 317 -6.169274278e-9 +428 317 -2186507.93651 +429 317 -572916.666667 +318 318 2343022321.43 +319 318 14782986.1111 +320 318 -14929138.322 +321 318 2.40223524305e-8 +322 318 -2.34375e6 +323 318 -52083.3333333 +324 318 -1618401785.71 +326 318 -20895691.61 +328 318 -4.17232513428e-7 +330 318 1276421130.95 +356 318 14929138.322 +358 318 27864583.3333 +360 318 -920877976.19 +412 318 -14782986.1111 +413 318 1.00093135127e-8 +414 318 -2.40223524305e-8 +415 318 8.69018120659e-7 +416 318 572916.666667 +417 318 -534541666.666 +418 318 22006448.4127 +419 318 -3.1787669133e-8 +420 318 3.57409178949e-8 +421 318 -1.25413774034e-6 +422 318 -1.86264514923e-9 +423 318 772101190.476 +424 318 -4749503.96825 +425 318 1.54193965636e-8 +426 318 -7.70380851994e-9 +427 318 2.87159550235e-7 +428 318 -572916.666667 +429 318 -178184523.809 +319 319 3233881447.2 +320 319 3.9e7 +321 319 -1.3375e9 +322 319 2.50042643229e-8 +323 319 -112291.666667 +324 319 -15434027.7778 +325 319 -3116428571.43 +327 319 1.3375e9 +355 319 2930054761.9 +356 319 -3e6 +357 319 1.125e8 +407 319 -41169047.6191 +408 319 -3.9e7 +412 319 -32761661.4859 +413 319 3e6 +414 319 4.24056037809e-10 +415 319 2.51004665799e-8 +416 319 29791.6666667 +417 319 -15434027.7778 +418 319 412624.614197 +419 319 -1.53977297916e-7 +420 319 4.01715566647e-8 +421 319 -2.40021809896e-8 +422 319 29791.6666667 +423 319 14782986.1111 +320 320 1048117328.94 +321 320 -2.75e7 +322 320 293154761.905 +323 320 7.60308159722e-11 +324 320 15141723.356 +326 320 -2094378.75679 +328 320 34970238.0952 +330 320 -14929138.322 +355 320 3e6 +356 320 355257671.058 +358 320 34970238.0952 +360 320 15141723.356 +407 320 -3.9e7 +408 320 -377166666.667 +412 320 -3e6 +413 320 -932333333.333 +414 320 2.5e6 +415 320 -1.69951075801e-23 +416 320 -2.01714409722e-11 +417 320 1.04501229745e-8 +418 320 -1.53977297916e-7 +419 320 -1.61e8 +420 320 2.75e7 +421 320 1.62514767117e-23 +422 320 -2.01714409722e-11 +423 320 -1.00093135127e-8 +321 321 52698911964.1 +322 321 240132275.132 +323 321 -10872260.0151 +324 321 -2.50802951389e-8 +325 321 1.3375e9 +327 321 -26422619047.6 +355 321 -1.125e8 +357 321 26073919208.7 +358 321 -118410052.91 +359 321 -10872260.0151 +409 321 3448383.004 +410 321 -118410052.91 +411 321 10030536.6591 +412 321 -2.96136062886e-9 +413 321 -2.5e6 +414 321 -6479555.8435 +415 321 240132275.132 +416 321 10030536.6591 +417 321 -2.50802951389e-8 +418 321 4.01715566647e-8 +419 321 2.75e7 +420 321 -1.285e7 +421 321 -3.9003544108e-23 +422 321 4.84114583333e-11 +423 321 2.40223524305e-8 +322 322 15155335648.2 +323 322 -5.2e7 +324 322 27864583.3333 +326 322 -34970238.0952 +328 322 -21122685.1852 +330 322 -27864583.3333 +356 322 34970238.0952 +357 322 -118410052.91 +358 322 -2750168981.48 +359 322 -4e6 +360 322 2.34375e6 +409 322 118410052.91 +410 322 -4744317460.32 +411 322 5.2e7 +412 322 -2.50601236979e-8 +413 322 1.69677920871e-23 +414 322 -240132275.132 +415 322 7665650793.65 +416 322 4e6 +417 322 -8.93985568576e-7 +418 322 2.40021809896e-8 +419 322 -1.62514767117e-23 +420 322 3.9003544108e-23 +421 322 -1.41051137778e-21 +422 322 5.6470630787e-10 +423 322 8.68242296006e-7 +323 323 813333035.714 +324 323 572916.666667 +357 323 10872260.0151 +358 323 4e6 +359 323 656834920.635 +409 323 -10030536.6591 +410 323 5.2e7 +411 323 -621482539.682 +412 323 29791.6666667 +413 323 -2.01714409722e-11 +414 323 10030536.6591 +415 323 -4e6 +416 323 -740978273.809 +417 323 52083.3333333 +418 323 -29791.6666667 +419 323 2.01714409722e-11 +420 323 -4.84114583333e-11 +421 323 5.6470630787e-10 +422 323 -540972.222222 +423 323 -572916.666667 +324 324 1667508928.57 +326 324 14929138.322 +328 324 -27864583.3333 +330 324 -920877976.19 +356 324 -15141723.356 +358 324 -2.34375e6 +360 324 929806547.618 +412 324 15434027.7778 +413 324 -1.04501229745e-8 +414 324 2.50802951389e-8 +415 324 -8.9405609809e-7 +416 324 -52083.3333333 +417 324 550166666.666 +418 324 -14782986.1111 +419 324 1.00093135127e-8 +420 324 -2.40223524305e-8 +421 324 8.68242296006e-7 +422 324 -572916.666667 +423 324 -534541666.666 +325 325 8387565365.34 +329 325 5042755.10204 +330 325 -500346.020761 +331 325 2191785714.29 +333 325 4.76837158203e-6 +355 325 -5048956761.9 +357 325 -2.86102294922e-6 +359 325 5.78e6 +361 325 -2.275e9 +363 325 -1.3375e9 +326 326 85953246.5367 +328 326 -840168367.347 +330 326 517006.80273 +332 326 -4454847.50117 +334 326 -68160076.5306 +336 326 21412698.4127 +356 326 -76671979.2679 +358 326 -1141571428.57 +360 326 68027.2108759 +362 326 2066358.02469 +364 326 26041666.6667 +366 326 -14861111.1111 +327 327 123739148193 +328 327 500346.020761 +331 327 1.90734863281e-6 +333 327 24528095238.1 +355 327 9.53674316406e-7 +357 327 -89601914285.7 +361 327 -1.3375e9 +363 327 -18991666666.7 +328 328 36410682399.6 +330 328 -1.19209289551e-7 +332 328 -68160076.5306 +334 328 -3861605489.42 +336 328 -2.08616256714e-7 +356 328 1141571428.57 +358 328 12305694444.4 +360 328 -5.96046447754e-8 +362 328 -26041666.6667 +364 328 -779571759.259 +366 328 27864583.3333 +329 329 156885714.286 +355 329 -5.78e6 +359 329 5.78e7 +330 330 2669145555.91 +332 330 -21412698.4127 +334 330 -3.72529029846e-7 +336 330 927239583.333 +356 330 68027.2108758 +358 330 -1.49011611939e-7 +360 330 -1859918131.87 +362 330 14861111.1111 +364 330 27864583.3333 +366 330 -655729166.666 +331 331 7424443977.25 +332 331 807139.556004 +335 331 5042755.10204 +336 331 -465433.183904 +337 331 2191785714.29 +339 331 4.76837158203e-6 +355 331 -2.275e9 +357 331 1.3375e9 +361 331 -4150385333.33 +365 331 5.78e6 +367 331 -2.275e9 +369 331 -1.3375e9 +332 332 84044273.3299 +334 332 -785640306.122 +336 332 258410.689858 +338 332 -4454847.50117 +340 332 -68160076.5306 +342 332 21412698.4127 +356 332 2066358.02469 +358 332 26041666.6667 +360 332 14861111.1111 +362 332 -74582716.0494 +364 332 -1108833333.33 +368 332 2066358.02469 +370 332 26041666.6667 +372 332 -14861111.1111 +333 333 103644388201 +334 333 465433.183904 +335 333 -258410.689858 +337 333 1.90734863281e-6 +339 333 24528095238.1 +355 333 1.3375e9 +357 333 -18991666666.7 +363 333 -74532866666.7 +367 333 -1.3375e9 +369 333 -18991666666.7 +334 334 36419838211.1 +335 334 -7446930.94247 +336 334 2.38418579102e-7 +338 334 -68160076.5306 +340 334 -3861605489.42 +342 334 -2.08616256714e-7 +356 334 -26041666.6667 +358 334 -779571759.259 +360 334 -27864583.3333 +362 334 1108833333.33 +364 334 12126643518.5 +366 334 -5.96046447754e-8 +368 334 -26041666.6667 +370 334 -779571759.259 +372 334 27864583.3333 +335 335 161020285.323 +361 335 -5.78e6 +365 335 5.78e7 +336 336 2263952142.16 +338 336 -21412698.4127 +340 336 -3.72529029846e-7 +342 336 927239583.333 +356 336 -14861111.1111 +358 336 -27864583.3333 +360 336 -655729166.666 +366 336 -1545245512.82 +368 336 14861111.1111 +370 336 27864583.3333 +372 336 -655729166.666 +337 337 8387545743.93 +341 337 5042755.10204 +343 337 3589642857.14 +345 337 -1.23977661133e-5 +349 337 -3116428571.43 +351 337 -1.3375e9 +361 337 -2.275e9 +363 337 1.3375e9 +367 337 -5048956761.9 +369 337 9.53674316406e-7 +371 337 5.78e6 +338 338 84088540.6543 +340 338 -840168367.347 +342 338 -517006.80273 +344 338 560293.727279 +346 338 -95424107.1428 +348 338 20895691.61 +350 338 -2094378.75679 +352 338 -34970238.0952 +354 338 -14929138.322 +362 338 2066358.02469 +364 338 26041666.6667 +366 338 14861111.1111 +368 338 -76671979.2679 +370 338 -1141571428.57 +372 338 -68027.2108759 +339 339 123739128571 +343 339 1.43051147461e-5 +345 339 34969047619.1 +349 339 -1.3375e9 +351 339 -26422619047.6 +361 339 1.3375e9 +363 339 -18991666666.7 +367 339 3.81469726563e-6 +369 339 -89601914285.7 +340 340 36393670634.9 +342 340 5.96046447754e-7 +344 340 -95424107.1428 +346 340 -1304208002.64 +348 340 8.94069671631e-8 +350 340 34970238.0952 +352 340 -21122685.1852 +354 340 27864583.3333 +362 340 -26041666.6667 +364 340 -779571759.259 +366 340 -27864583.3333 +368 340 1141571428.57 +370 340 12305694444.4 +372 340 -1.19209289551e-7 +341 341 156885714.286 +367 341 -5.78e6 +371 341 5.78e7 +342 342 2652133791.21 +344 342 -20895691.61 +346 342 -4.17232513428e-7 +348 342 1276421130.95 +350 342 14929138.322 +352 342 27864583.3333 +354 342 -920877976.19 +362 342 -14861111.1111 +364 342 -27864583.3333 +366 342 -655729166.666 +368 342 -68027.2108758 +370 342 -3.27825546265e-7 +372 342 -1859918131.87 +343 343 4675977450.32 +347 343 47984.6938776 +348 343 -22006448.4127 +349 343 -2973989553.18 +351 343 -1.125e8 +353 343 112291.666667 +354 343 14782986.1111 +367 343 -3116428571.43 +369 343 1.3375e9 +379 343 133211.237537 +383 343 53784.0136054 +384 343 4749503.96825 +385 343 -614556.91655 +389 343 23992.3469388 +390 343 -22006448.4127 +391 343 412624.614197 +395 343 -29791.6666667 +396 343 14782986.1111 +344 344 1021168341.48 +345 344 -2.38418579102e-7 +346 344 -190848214.286 +348 344 -20895691.61 +350 344 69219378.7568 +351 344 2.5e6 +352 344 -293154761.905 +354 344 14929138.322 +368 344 -2094378.75679 +370 344 -34970238.0952 +372 344 14929138.322 +380 344 -362857142.857 +381 344 2.75e7 +386 344 -901142857.143 +387 344 -1.04308128357e-7 +392 344 -1.61e8 +393 344 -2.75e7 +345 345 71947616666.7 +349 345 1.125e8 +350 345 -2.5e6 +351 345 -52334330952.4 +367 345 1.3375e9 +369 345 -26422619047.6 +380 345 2.75e7 +381 345 -19857142.8571 +386 345 2.38418579102e-7 +387 345 -14792857.1429 +392 345 -2.75e7 +393 345 -1.285e7 +346 346 10210458002.6 +348 346 -7.15255737305e-7 +350 346 293154761.905 +352 346 3302372685.18 +354 346 -2.34375e6 +368 346 34970238.0952 +370 346 -21122685.1852 +372 346 -27864583.3333 +347 347 5912996.03175 +348 347 1.49011611938e-8 +349 347 -112291.666667 +353 347 1365972.22222 +354 347 52083.3333333 +379 347 -53784.0136054 +383 347 -2186507.93651 +384 347 -572916.666667 +385 347 23992.3469388 +389 347 -3673710.31746 +390 347 2.79396772385e-9 +391 347 29791.6666667 +395 347 -540972.222222 +396 347 572916.666667 +348 348 2343022321.43 +349 348 14782986.1111 +350 348 14929138.322 +352 348 2.34375e6 +353 348 -52083.3333333 +354 348 -1618401785.71 +368 348 -14929138.322 +370 348 -27864583.3333 +372 348 -920877976.19 +379 348 -4749503.96825 +383 348 -572916.666667 +384 348 -178184523.809 +385 348 22006448.4127 +389 348 -1.00117176771e-8 +390 348 772101190.476 +391 348 -14782986.1111 +395 348 572916.666667 +396 348 -534541666.666 +349 349 3233881447.2 +350 349 -3.9e7 +351 349 1.3375e9 +353 349 -112291.666667 +354 349 -15434027.7778 +367 349 2930054761.9 +368 349 3e6 +369 349 -1.125e8 +385 349 412624.614197 +389 349 29791.6666667 +390 349 14782986.1111 +391 349 -32761661.4859 +392 349 -3e6 +395 349 29791.6666667 +396 349 -15434027.7778 +397 349 -41169047.6191 +398 349 3.9e7 +350 350 1048117328.94 +351 350 -2.75e7 +352 350 293154761.905 +354 350 -15141723.356 +367 350 -3e6 +368 350 355257671.058 +370 350 34970238.0952 +372 350 -15141723.356 +386 350 -1.61e8 +387 350 2.75e7 +391 350 3e6 +392 350 -932333333.333 +393 350 2.5e6 +397 350 3.9e7 +398 350 -377166666.667 +351 351 52698911964.1 +352 351 240132275.132 +353 351 10872260.0151 +367 351 1.125e8 +369 351 26073919208.7 +370 351 -118410052.91 +371 351 10872260.0151 +386 351 2.75e7 +387 351 -1.285e7 +392 351 -2.5e6 +393 351 -6479555.8435 +394 351 240132275.132 +395 351 -10030536.6591 +399 351 3448383.004 +400 351 -118410052.91 +401 351 -10030536.6591 +352 352 15155335648.2 +353 352 5.2e7 +354 352 -27864583.3333 +368 352 34970238.0952 +369 352 -118410052.91 +370 352 -2750168981.48 +371 352 4e6 +372 352 -2.34375e6 +393 352 -240132275.132 +394 352 7665650793.65 +395 352 -4e6 +399 352 118410052.91 +400 352 -4744317460.32 +401 352 -5.2e7 +353 353 813333035.714 +354 353 572916.666667 +369 353 -10872260.0151 +370 353 -4e6 +371 353 656834920.635 +385 353 -29791.6666667 +389 353 -540972.222222 +390 353 -572916.666667 +391 353 29791.6666667 +393 353 -10030536.6591 +394 353 4e6 +395 353 -740978273.809 +396 353 52083.3333333 +399 353 10030536.6591 +400 353 -5.2e7 +401 353 -621482539.682 +354 354 1667508928.57 +368 354 15141723.356 +370 354 2.34375e6 +372 354 929806547.618 +385 354 -14782986.1111 +389 354 -572916.666667 +390 354 -534541666.666 +391 354 15434027.7778 +395 354 -52083.3333333 +396 354 550166666.666 +355 355 5647453904.76 +356 355 -2.38418579102e-7 +357 355 -7.62939453125e-6 +359 355 -5.78e6 +361 355 1988876666.67 +362 355 -3e6 +363 355 1.125e8 +402 355 -32436666.6667 +403 355 -3.9e7 +407 355 -52394285.7143 +408 355 1.9371509552e-7 +412 355 -41169047.6191 +413 355 3.9e7 +356 356 1357484612.89 +358 356 1141571428.57 +360 356 136054.421777 +361 356 3e6 +362 356 241957716.049 +364 356 -26041666.6667 +366 356 15277777.7778 +402 356 -3.9e7 +403 356 -277633333.333 +407 356 -2.08616256714e-7 +408 356 -1.2232e9 +412 356 3.9e7 +413 356 -377166666.667 +357 357 90445375006.1 +358 357 520673015.873 +359 357 -538702.947848 +361 357 -1.125e8 +363 357 18502702081.5 +364 357 -193596296.296 +365 357 -11410962.963 +404 357 5594590.12346 +405 357 -193596296.296 +406 357 9761185.18519 +409 357 -14839269.4237 +410 357 520673015.873 +411 357 -269351.473921 +414 357 3448383.004 +415 357 -118410052.91 +416 357 -10030536.6591 +358 358 42461872222.2 +359 358 1.90734863281e-6 +360 358 1.19209289551e-7 +362 358 -26041666.6667 +363 358 -193596296.296 +364 358 -6685703240.74 +365 358 -4e6 +366 358 2.34375e6 +404 358 193596296.296 +405 358 -7309777777.78 +406 358 5.2e7 +409 358 -520673015.873 +410 358 17062095238.1 +411 358 -1.16229057312e-6 +414 358 118410052.91 +415 358 -4744317460.32 +416 358 -5.2e7 +359 359 1538327619.05 +363 359 11410962.963 +364 359 4e6 +365 359 485328888.889 +404 359 -9761185.18519 +405 359 5.2e7 +406 359 -435835555.556 +409 359 -269351.473921 +410 359 1.49011611939e-7 +411 359 -1253036190.48 +414 359 10030536.6591 +415 359 -5.2e7 +416 359 -621482539.682 +360 360 1902775274.72 +362 360 -15277777.7778 +364 360 -2.34375e6 +366 360 668229166.666 +361 361 4.827632e9 +365 361 -5.78e6 +367 361 1988876666.67 +368 361 -3e6 +369 361 1.125e8 +397 361 -32436666.6667 +398 361 -3.9e7 +402 361 -40126666.6667 +403 361 -1.49011611938e-8 +407 361 -32436666.6667 +408 361 3.9e7 +362 362 1151534567.9 +364 362 1108833333.33 +367 362 3e6 +368 362 241957716.049 +370 362 -26041666.6667 +372 362 15277777.7778 +397 362 -3.9e7 +398 362 -277633333.333 +403 362 -1009733333.33 +407 362 3.9e7 +408 362 -277633333.333 +363 363 75515626084 +364 363 561081481.481 +367 363 -1.125e8 +369 363 18502702081.5 +370 363 -193596296.296 +371 363 -11410962.963 +399 363 5594590.12346 +400 363 -193596296.296 +401 363 9761185.18519 +404 363 -16019427.1605 +405 363 561081481.481 +409 363 5594590.12346 +410 363 -193596296.296 +411 363 -9761185.18519 +364 364 42853073148.1 +365 364 4.76837158203e-7 +366 364 2.38418579102e-7 +368 364 -26041666.6667 +369 364 -193596296.296 +370 364 -6685703240.74 +371 364 -4e6 +372 364 2.34375e6 +399 364 193596296.296 +400 364 -7309777777.78 +401 364 5.2e7 +404 364 -561081481.481 +405 364 18792888888.9 +406 364 -2.68220901489e-7 +409 364 193596296.296 +410 364 -7309777777.78 +411 364 -5.2e7 +365 365 1338915555.56 +369 365 11410962.963 +370 365 4e6 +371 365 485328888.889 +399 365 -9761185.18519 +400 365 5.2e7 +401 365 -435835555.556 +405 365 -1.19209289551e-7 +406 365 -1025342222.22 +409 365 9761185.18519 +410 365 -5.2e7 +411 365 -435835555.556 +366 366 1595245512.82 +368 366 -15277777.7778 +370 366 -2.34375e6 +372 366 668229166.666 +367 367 5647453904.76 +368 367 2.38418579102e-7 +371 367 -5.78e6 +391 367 -41169047.6191 +392 367 -3.9e7 +397 367 -52394285.7143 +398 367 -2.23517417908e-7 +402 367 -32436666.6667 +403 367 3.9e7 +368 368 1357484612.89 +370 368 1141571428.57 +372 368 -136054.421777 +391 368 -3.9e7 +392 368 -377166666.667 +397 368 1.78813934326e-7 +398 368 -1.2232e9 +402 368 3.9e7 +403 368 -277633333.333 +369 369 90445375006.1 +370 369 520673015.873 +371 369 538702.947848 +393 369 3448383.004 +394 369 -118410052.91 +395 369 10030536.6591 +399 369 -14839269.4237 +400 369 520673015.873 +401 369 269351.473921 +404 369 5594590.12346 +405 369 -193596296.296 +406 369 -9761185.18519 +370 370 42461872222.2 +371 370 -7.15255737305e-7 +372 370 7.15255737305e-7 +393 370 118410052.91 +394 370 -4744317460.32 +395 370 5.2e7 +399 370 -520673015.873 +400 370 17062095238.1 +401 370 4.47034835815e-7 +404 370 193596296.296 +405 370 -7309777777.78 +406 370 -5.2e7 +371 371 1538327619.05 +393 371 -10030536.6591 +394 371 5.2e7 +395 371 -621482539.682 +399 371 269351.473921 +400 371 -4.17232513428e-7 +401 371 -1253036190.48 +404 371 9761185.18519 +405 371 -5.2e7 +406 371 -435835555.556 +372 372 1902775274.72 +373 373 169766576.11 +375 373 97754.1792891 +377 373 -2369364195.78 +378 373 -463043676.901 +379 373 -4074626.14033 +383 373 121637623.242 +384 373 -284342.297629 +448 373 -90116103.595 +452 373 -2490984786.18 +453 373 -66835949.5229 +466 373 46094308.7696 +470 373 1238309004.93 +471 373 578441828.255 +472 373 -96145581.9144 +476 373 1238241134.62 +477 373 -2004844497.61 +478 373 214562.253931 +482 373 -67870.314992 +483 373 6056408.965 +987 373 -946849.603789 +991 373 -97754.1792891 +993 373 -17032.8359503 +374 374 1473239209.39 +375 374 -1.19209289551e-7 +376 374 190005.459917 +378 374 -164650.747519 +380 374 593014050.905 +381 374 -1.34110450745e-7 +382 374 -1194214.87603 +449 374 46500825.2239 +450 374 8.94069671631e-8 +451 374 1367187.5 +467 374 -42934690.2412 +468 374 1.89375e7 +473 374 -775952869.567 +474 374 3.8125e6 +479 374 -360322966.507 +480 374 -2.75e7 +990 374 -1892.53732781 +992 374 17032.8359503 +994 374 -164650.747519 +375 375 153321848.858 +376 375 22623307.1714 +377 375 164650.747519 +380 375 8.94069671631e-8 +381 375 13004784.689 +450 375 -24702987.9386 +467 375 1.89375e7 +468 375 -33756647.4781 +473 375 -3.8125e6 +474 375 -25889735.6196 +475 375 60609418.2826 +479 375 -2.75e7 +480 375 -19743421.0526 +987 375 -97754.1792891 +991 375 -12005.0386336 +993 375 164650.747519 +376 376 4266741076.65 +378 376 -1975808.97023 +380 376 1194214.87603 +382 376 26272727.2727 +449 376 -1367187.5 +451 376 4.375e7 +474 376 -60609418.2826 +475 376 1151578947.37 +990 376 -17032.8359503 +992 376 102197.015702 +994 376 -987904.485116 +377 377 132503553874 +378 377 -3.81842255592e-6 +379 377 -121637623.242 +383 377 2677237872.14 +384 377 3.72529029846e-9 +448 377 2490984786.18 +452 377 115674600877 +453 377 7.62939453125e-6 +466 377 -1238309004.93 +470 377 -59698309210.5 +471 377 -9.09e8 +472 377 1238241134.62 +476 377 -61231972798.6 +477 377 302947916.667 +478 377 67870.314992 +482 377 -2168585.52632 +483 377 572916.666667 +987 377 17032.8359503 +991 377 -164650.747519 +993 377 9651940.37182 +378 378 135678706421 +379 378 -284342.297629 +383 378 -1.04773789644e-8 +384 378 -389540175.285 +448 378 -66835949.5229 +452 378 -5.72204589844e-6 +453 378 -38568158864.7 +466 378 -578441828.255 +470 378 -9.09e8 +471 378 -18066707236.8 +472 378 2004844497.61 +476 378 -302947916.667 +477 378 45233040719.7 +478 378 -6056408.965 +482 378 572916.666667 +483 378 -179754535.486 +990 378 164650.747519 +992 378 -987904.485116 +994 378 9549743.35612 +379 379 7384342.58981 +383 379 -46495394.0641 +384 379 -1292464.98923 +385 379 -2074982.72089 +389 379 75142229.1778 +390 379 -361890.196983 +472 379 214562.253931 +476 379 67870.314992 +477 379 6056408.965 +478 379 -552412.864869 +482 379 -1721.21405379 +483 379 -15637928.5534 +484 379 155608.301563 +488 379 -69591.5290458 +489 379 4387613.77127 +380 380 2881356929.3 +381 380 -1.19209289551e-7 +382 380 456969.978074 +384 380 -167300.832342 +386 380 769051995.422 +387 380 2.38418579102e-7 +388 380 -737244.897959 +473 380 -360322966.507 +474 380 2.75e7 +479 380 -1555814251.54 +480 380 -1.78813934326e-7 +485 380 -452283834.586 +486 380 -2.75e7 +381 381 103071386.429 +383 381 167300.832342 +386 381 -5.96046447754e-8 +387 381 25373120.3008 +473 381 2.75e7 +474 381 -19743421.0526 +479 381 2.38418579102e-7 +480 381 -35232612.7819 +485 381 -2.75e7 +486 381 -23971334.5865 +382 382 93831168.8312 +386 382 737244.897959 +388 382 20642857.1429 +383 383 9579623607.84 +384 383 2.98023223877e-8 +385 383 -75142229.1778 +389 383 2105522621.66 +390 383 -1.11758708954e-8 +472 383 -67870.314992 +476 383 -2168585.52632 +477 383 -572916.666667 +478 383 -1721.21405379 +482 383 -6993068.60902 +483 383 6.98491930962e-9 +484 383 69591.5290458 +488 383 -2808211.93609 +489 383 572916.666667 +384 384 1043374314.82 +385 384 -361890.196983 +389 384 -6.053596735e-9 +390 384 -280808821.935 +472 384 -6056408.965 +476 384 -572916.666667 +477 384 -179754535.486 +478 384 15637928.5534 +482 384 -1.72294676304e-8 +483 384 412625580.286 +484 384 -4387613.77127 +488 384 572916.666667 +489 384 -134186834.273 +385 385 43384295.1619 +389 385 513085972.576 +390 385 -982273.391815 +391 385 -40140018.2556 +395 385 588228201.754 +396 385 -129246.498921 +478 385 155608.301563 +482 385 69591.5290458 +483 385 4387613.77127 +484 385 -811651.931384 +488 385 18993.9413265 +489 385 -22988721.8045 +490 385 517539.474697 +494 385 -50597.5877193 +495 385 14653739.6122 +386 386 2237940524.07 +387 386 -4.76837158203e-7 +388 386 -5042755.10204 +390 386 -167300.832342 +392 386 218009403.509 +393 386 1.49011611938e-8 +394 386 -5.78e6 +479 386 -452283834.586 +480 386 2.75e7 +485 386 -1161321428.57 +486 386 -1.49011611938e-8 +491 386 -186394736.842 +492 386 -2.75e7 +387 387 107834065.855 +389 387 167300.832342 +392 387 5.96046447754e-8 +393 387 -25705263.1579 +479 387 2.75e7 +480 387 -23971334.5865 +485 387 -2.98023223877e-8 +486 387 -22908928.5714 +491 387 -2.75e7 +492 387 -13119736.8421 +388 388 156885714.286 +392 388 5.78e6 +394 388 5.78e7 +389 389 15992085071.2 +390 389 1.49011611938e-8 +391 389 -588228201.754 +395 389 5882832090.64 +396 389 -5.58793544769e-9 +478 389 -69591.5290458 +482 389 -2808211.93609 +483 389 -572916.666667 +484 389 18993.9413265 +488 389 -4992410.71428 +489 389 -2.32830643654e-9 +490 389 50597.5877193 +494 389 -812993.421053 +495 389 572916.666667 +390 390 1516480419.9 +391 390 -129246.498921 +395 390 -2.56113708019e-9 +396 390 -947514701.417 +478 390 -4387613.77127 +482 390 -572916.666667 +483 390 -134186834.273 +484 390 22988721.8045 +488 390 -8.84756445885e-9 +489 390 629909970.238 +490 390 -14653739.6122 +494 390 572916.666667 +495 390 -420723135.965 +391 391 139200524.475 +392 391 2.38418579102e-7 +395 391 -588228201.754 +396 391 -258492.997848 +397 391 67336131.9967 +398 391 5.96046447754e-8 +484 391 517539.474697 +488 391 50597.5877193 +489 391 14653739.6122 +490 391 -43476627.8697 +491 391 -3e6 +494 391 50597.5877193 +495 391 -15692520.7756 +532 391 -49919465.33 +533 391 3.9e7 +392 392 2305034456.14 +393 392 2.38418579102e-7 +394 392 5.78e6 +397 392 -1.04308128357e-7 +398 392 804929824.561 +485 392 -186394736.842 +486 392 2.75e7 +490 392 3e6 +491 392 -1200315789.47 +492 392 2.5e6 +532 392 3.9e7 +533 392 -470763157.895 +393 393 71172900.2211 +394 393 48329229.5065 +395 393 24341064.301 +399 393 -6982391.71559 +400 393 24164614.7533 +401 393 24341064.301 +485 393 2.75e7 +486 393 -13119736.8421 +491 393 -2.5e6 +492 393 -12994406.478 +493 393 288461504.639 +494 393 -12802439.9623 +534 393 3510070.81192 +535 393 -94245438.1568 +536 393 -12802439.9623 +394 394 19252216541.3 +395 394 -4.76837158203e-7 +399 394 24164614.7533 +400 394 -5913739348.37 +401 394 -3.8743019104e-7 +492 394 -288461504.639 +493 394 6986895572.26 +494 394 -4e6 +534 394 94245438.1568 +535 394 -3296790309.11 +536 394 -5.2e7 +395 395 13577957990.5 +399 395 -24341064.301 +400 395 8.94069671631e-8 +401 395 1475408911.17 +484 395 -50597.5877193 +488 395 -812993.421053 +489 395 -572916.666667 +490 395 50597.5877193 +492 395 -12802439.9623 +493 395 4e6 +494 395 -947344101.573 +495 395 52083.3333333 +534 395 12802439.9623 +535 395 -5.2e7 +536 395 -790586688.944 +396 396 1018238385.63 +484 396 -14653739.6122 +488 396 -572916.666667 +489 396 -420723135.965 +490 396 15692520.7756 +494 396 -52083.3333333 +495 396 440459978.07 +397 397 180582756.892 +402 397 37239005.8479 +403 397 -1.78813934326e-7 +490 397 -49919465.33 +491 397 -3.9e7 +532 397 -71182756.8922 +533 397 1.04308128357e-7 +573 397 -38055672.5146 +574 397 3.9e7 +398 398 2885073684.21 +402 398 2.53319740295e-7 +403 398 560207017.544 +490 398 -3.9e7 +491 398 -470763157.895 +532 398 -1.19209289551e-7 +533 398 -1558673684.21 +573 398 3.9e7 +574 398 -342773684.211 +399 399 36588116.2788 +400 399 82850107.7255 +401 399 965176.114889 +404 399 -12127258.8544 +405 399 17260439.1095 +406 399 25306240.4159 +492 399 3510070.81192 +493 399 -94245438.1568 +494 399 12802439.9623 +534 399 -21659223.3586 +535 399 603523123.598 +536 399 213236.583525 +575 399 6466983.13427 +576 399 -176335857.187 +577 399 -12589203.3788 +400 400 39883135839.6 +401 400 2.38418579102e-6 +404 400 17260439.1095 +405 400 -11301607017.5 +406 400 -2.98023223877e-8 +492 400 94245438.1568 +493 400 -3296790309.11 +494 400 5.2e7 +534 400 -603523123.598 +535 400 15081644110.3 +536 400 -6.25848770142e-7 +575 400 176335857.187 +576 400 -5458959064.33 +577 400 -5.2e7 +401 401 3166518563.07 +404 401 -25306240.4159 +405 401 -5.36441802978e-7 +406 401 1082818791.42 +492 401 -12802439.9623 +493 401 5.2e7 +494 401 -790586688.944 +534 401 213236.583525 +535 401 1.19209289551e-7 +536 401 -1609451896.41 +575 401 12589203.3788 +576 401 -5.2e7 +577 401 -558307680.312 +402 402 163153567.252 +407 402 37239005.8479 +408 402 -1.78813934326e-7 +532 402 -38055672.5146 +533 402 -3.9e7 +573 402 -56520233.9181 +574 402 1.49011611938e-8 +614 402 -38055672.5146 +615 402 3.9e7 +403 403 2421428070.18 +407 403 2.53319740295e-7 +408 403 560207017.544 +532 403 -3.9e7 +533 403 -342773684.211 +573 403 -1.19209289551e-7 +574 403 -1291294736.84 +614 403 3.9e7 +615 403 -342773684.211 +404 404 38819905.7995 +405 404 69041756.4379 +409 404 -12127258.8544 +410 404 17260439.1095 +411 404 25306240.4159 +534 404 6466983.13427 +535 404 -176335857.187 +536 404 12589203.3788 +575 404 -22669107.4456 +576 404 630123237.919 +616 404 6466983.13427 +617 404 -176335857.187 +618 404 -12589203.3788 +405 405 41493038596.5 +406 405 7.15255737305e-7 +409 405 17260439.1095 +410 405 -11301607017.5 +411 405 -2.98023223877e-8 +534 405 176335857.187 +535 405 -5458959064.33 +536 405 5.2e7 +575 405 -630123237.919 +576 405 16189497076 +577 405 -1.49011611939e-7 +616 405 176335857.187 +617 405 -5458959064.33 +618 405 -5.2e7 +406 406 2706327797.27 +409 406 -25306240.4159 +410 406 -5.36441802978e-7 +411 406 1082818791.42 +534 406 -12589203.3788 +535 406 5.2e7 +536 406 -558307680.312 +576 406 6.85453414917e-7 +577 406 -1326283352.83 +616 406 12589203.3788 +617 406 -5.2e7 +618 406 -558307680.312 +407 407 180582756.892 +408 407 2.38418579102e-7 +412 407 67336131.9967 +413 407 5.96046447754e-8 +573 407 -38055672.5146 +574 407 -3.9e7 +614 407 -71182756.8922 +615 407 -1.34110450745e-7 +631 407 -49919465.33 +632 407 3.9e7 +408 408 2885073684.21 +412 408 -1.04308128357e-7 +413 408 804929824.561 +573 408 -3.9e7 +574 408 -342773684.211 +614 408 -5.96046447754e-8 +615 408 -1558673684.21 +631 408 3.9e7 +632 408 -470763157.895 +409 409 36588116.2788 +410 409 82850107.7255 +411 409 -965176.114889 +414 409 -6982391.71559 +415 409 24164614.7533 +416 409 24341064.301 +575 409 6466983.13427 +576 409 -176335857.187 +577 409 12589203.3788 +616 409 -21659223.3586 +617 409 603523123.598 +618 409 -213236.583525 +633 409 3510070.81192 +634 409 -94245438.1568 +635 409 -12802439.9623 +410 410 39883135839.6 +411 410 -1.19209289551e-6 +414 410 24164614.7533 +415 410 -5913739348.37 +416 410 -3.8743019104e-7 +575 410 176335857.187 +576 410 -5458959064.33 +577 410 5.2e7 +616 410 -603523123.598 +617 410 15081644110.3 +618 410 2.08616256714e-7 +633 410 94245438.1568 +634 410 -3296790309.11 +635 410 -5.2e7 +411 411 3166518563.07 +414 411 -24341064.301 +415 411 8.94069671631e-8 +416 411 1475408911.17 +575 411 -12589203.3788 +576 411 5.2e7 +577 411 -558307680.312 +616 411 -213236.583525 +617 411 7.7486038208e-7 +618 411 -1609451896.41 +633 411 12802439.9623 +634 411 -5.2e7 +635 411 -790586688.944 +412 412 139200524.475 +413 412 7.15255737305e-7 +414 412 -3.64650020996e-8 +415 412 4.57745487854e-8 +416 412 -588228201.754 +417 412 -258492.997848 +418 412 -40140018.2556 +419 412 1.40474418646e-7 +420 412 -5.49196286814e-8 +421 412 -4.24396318999e-8 +422 412 -588228201.754 +423 412 -129246.498921 +614 412 -49919465.33 +615 412 -3.9e7 +631 412 -43476627.8697 +632 412 3e6 +633 412 1.12513953765e-8 +634 412 7.10426101541e-8 +635 412 50597.5877193 +636 412 -15692520.7756 +649 412 517539.474697 +650 412 -2.49865474897e-7 +651 412 8.01626227019e-8 +652 412 -6.62742181007e-8 +653 412 50597.5877193 +654 412 14653739.6122 +413 413 2305034456.14 +414 413 2.38418579102e-7 +415 413 5.78e6 +416 413 1.53812585363e-10 +417 413 1.8865384388e-8 +418 413 1.54974418646e-7 +419 413 218009403.509 +420 413 -5.96046447754e-8 +421 413 5.78e6 +422 413 1.53812585363e-10 +423 413 1.89608829835e-8 +614 413 -3.9e7 +615 413 -470763157.895 +631 413 -3e6 +632 413 -1200315789.47 +633 413 2.5e6 +634 413 -4.76733304981e-23 +635 413 -3.39536443906e-11 +636 413 1.05305073626e-8 +649 413 -2.49865474897e-7 +650 413 -186394736.842 +651 413 2.75e7 +652 413 4.44734884623e-23 +653 413 -3.39536443906e-11 +654 413 -9.83343052923e-9 +414 414 71172900.2211 +415 414 48329229.5065 +416 414 -24341064.301 +417 414 -4.59283613708e-8 +418 414 -5.49497821902e-8 +419 414 -2.98023223877e-8 +420 414 -25705263.1579 +421 414 -2.61483667029e-22 +422 414 -1.91170696711e-6 +423 414 4.22858193146e-8 +616 414 3510070.81192 +617 414 -94245438.1568 +618 414 12802439.9623 +631 414 7.89613221859e-9 +632 414 -2.5e6 +633 414 -12994406.478 +634 414 288461504.639 +635 414 12802439.9623 +636 414 -7.10086565097e-8 +649 414 8.01626227019e-8 +650 414 2.75e7 +651 414 -13119736.8421 +652 414 -2.99890836906e-22 +653 414 2.2895408443e-10 +654 414 6.63081717451e-8 +415 415 19252216541.3 +416 415 9.53674316406e-7 +417 415 -2.59976182954e-6 +418 415 -4.21320067292e-8 +419 415 -5.78e6 +420 415 -2.60532641865e-22 +421 415 5.78e7 +422 415 1.75767798345e-9 +423 415 2.9339090175e-6 +616 415 94245438.1568 +617 415 -3296790309.11 +618 415 5.2e7 +631 415 -7.09747028653e-8 +632 415 4.76277611333e-23 +633 415 -288461504.639 +634 415 6986895572.26 +635 415 4e6 +636 415 -1.99304645011e-6 +649 415 6.62742181007e-8 +650 415 -4.44734884623e-23 +651 415 2.99890836906e-22 +652 415 -8.61145592324e-21 +653 415 2.04688654201e-9 +654 415 1.903387733e-6 +416 416 13577957990.5 +417 416 -1.49011611938e-8 +418 416 588228201.754 +419 416 -1.53812585363e-10 +420 416 1.91170696711e-6 +421 416 2.05976131678e-9 +422 416 5882832090.64 +423 416 9.31322574615e-9 +616 416 -12802439.9623 +617 416 5.2e7 +618 416 -790586688.944 +631 416 50597.5877193 +632 416 -3.39536443906e-11 +633 416 12802439.9623 +634 416 -4e6 +635 416 -947344101.573 +636 416 52083.3333333 +649 416 -50597.5877193 +650 416 3.39536443906e-11 +651 416 -2.2895408443e-10 +652 416 2.04688654201e-9 +653 416 -812993.421053 +654 416 -572916.666667 +417 417 1018238385.63 +418 417 -129246.498921 +419 417 -1.86091170165e-8 +420 417 4.22858193146e-8 +421 417 2.9339083893e-6 +422 417 -9.31322574615e-10 +423 417 -947514701.417 +631 417 15692520.7756 +632 417 -1.05305073626e-8 +633 417 7.10086565097e-8 +634 417 -1.99311635143e-6 +635 417 -52083.3333333 +636 417 440459978.07 +649 417 -14653739.6122 +650 417 9.83343052923e-9 +651 417 -6.63081717451e-8 +652 417 1.903387733e-6 +653 417 -572916.666667 +654 417 -420723135.965 +418 418 42422226.1964 +419 418 5.64410984764e-6 +420 418 -2.01699486947e-7 +421 418 6.80747277824e-8 +422 418 513085972.576 +423 418 -982273.391815 +424 418 -2074982.72089 +425 418 2.49195339125e-6 +426 418 -9.20847655541e-8 +427 418 -1.26722338569e-8 +428 418 -75142229.1778 +429 418 -361890.196983 +631 418 517539.474697 +632 418 -9.90474896801e-10 +633 418 4.32547279651e-8 +634 418 -6.63421253895e-8 +635 418 -50597.5877193 +636 418 14653739.6122 +649 418 -811651.931384 +650 418 -3.03214682149e-6 +651 418 1.06711101847e-7 +652 418 1.04316073457e-7 +653 418 18993.9413265 +654 418 -22988721.8045 +667 418 155608.301563 +668 418 -1.59524217748e-6 +669 418 1.98879725906e-7 +670 418 -1.96878483675e-8 +671 418 69591.5290458 +672 418 4387613.77127 +419 419 2237938601.07 +420 419 -4.76837158203e-7 +421 419 -5042755.10204 +422 419 3.08208954567e-10 +423 419 -1.39378508707e-8 +424 419 2.50653672459e-6 +425 419 769051995.422 +426 419 -8.94069671631e-8 +427 419 737244.897959 +428 419 4.6202153993e-10 +429 419 3.55130936285e-9 +631 419 -9.90474896801e-10 +632 419 -186394736.842 +633 419 -2.75e7 +634 419 4.45190578272e-23 +635 419 3.39536443906e-11 +636 419 -9.83343052923e-9 +649 419 -3.03221527387e-6 +650 419 -1161321428.57 +651 419 -8.94069671631e-8 +652 419 -1.55987215556e-22 +653 419 -1.92218825008e-10 +654 419 3.42431607065e-8 +667 419 -1.59524217748e-6 +668 419 -452283834.586 +669 419 2.75e7 +670 419 6.39855071943e-23 +671 419 -2.26172469399e-10 +672 419 -1.42597447566e-8 +420 420 107832142.857 +421 420 4.12554006581e-22 +422 420 1.66794542347e-6 +423 420 -6.83829367369e-8 +424 420 -9.2067404443e-8 +425 420 8.94069671631e-8 +426 420 25373120.3008 +427 420 -7.93758633787e-23 +428 420 -2.4376154364e-7 +429 420 1.22102123169e-8 +631 420 4.32547279651e-8 +632 420 -2.75e7 +633 420 -13119736.8421 +634 420 -3.00198117388e-22 +635 420 -2.2895408443e-10 +636 420 6.63081717451e-8 +649 420 9.38163650048e-8 +650 420 1.49011611938e-8 +651 420 -22908928.5714 +652 420 4.72486691632e-22 +653 420 8.69003256739e-11 +654 420 -1.04123854632e-7 +667 420 1.98879725906e-7 +668 420 2.75e7 +669 420 -23971334.5865 +670 420 -8.93570498821e-23 +671 420 3.15854410104e-10 +672 420 1.99140208369e-8 +421 421 156885714.286 +422 421 2.93237590437e-8 +423 421 -3.90443293468e-6 +424 421 -1.1748190777e-8 +425 421 -737244.897959 +426 421 -7.63997683644e-23 +427 421 20642857.1429 +428 421 1.77879955604e-8 +429 421 8.62007238285e-7 +631 421 6.63421253895e-8 +632 421 -4.45190578272e-23 +633 421 3.00198117388e-22 +634 421 -8.61841459923e-21 +635 421 -3.13800929132e-9 +636 421 1.90415664748e-6 +649 421 -1.03931635807e-7 +650 421 1.5456266387e-22 +651 421 -4.70740918449e-22 +652 421 1.28790309384e-20 +653 421 -1.35582955985e-8 +654 421 -2.85280195576e-6 +667 421 1.96878483675e-8 +668 421 -6.39855071943e-23 +669 421 8.93570498821e-23 +670 421 -2.77696988241e-21 +671 421 -6.52639737364e-9 +672 421 6.07170527579e-7 +422 422 15972678174.6 +423 422 3.72529029846e-9 +424 422 75142229.1778 +425 422 -4.6202153993e-10 +426 422 2.4376154364e-7 +427 422 1.80918150048e-8 +428 422 2105522621.66 +429 422 1.04773789644e-8 +631 422 50597.5877193 +632 422 -3.39536443906e-11 +633 422 2.2895408443e-10 +634 422 -3.13800929132e-9 +635 422 -812993.421053 +636 422 572916.666667 +649 422 18993.9413265 +650 422 -1.92218825008e-10 +651 422 8.69003256739e-11 +652 422 -1.35597216898e-8 +653 422 -4992410.71428 +654 422 6.75208866596e-9 +667 422 -69591.5290458 +668 422 2.26172469399e-10 +669 422 -3.15854410104e-10 +670 422 -6.52639737364e-9 +671 422 -2808211.93609 +672 422 -572916.666667 +423 423 1497073523.35 +424 423 -361890.196983 +425 423 -1.23200574891e-9 +426 423 1.22102123169e-8 +427 423 8.62007599975e-7 +428 423 6.98491930962e-10 +429 423 -280808821.935 +631 423 -14653739.6122 +632 423 9.83343052923e-9 +633 423 -6.63081717451e-8 +634 423 1.90415664748e-6 +635 423 572916.666667 +636 423 -420723135.965 +649 423 22988721.8045 +650 423 -3.42431607065e-8 +651 423 1.04123854632e-7 +652 423 -2.85307059611e-6 +653 423 -9.0803951025e-9 +654 423 629909970.238 +667 423 -4387613.77127 +668 423 1.42597447566e-8 +669 423 -1.99140208369e-8 +670 423 6.07170527579e-7 +671 423 -572916.666667 +672 423 -134186834.273 +424 424 6422273.6243 +425 424 1.36201281036e-5 +426 424 -3.04530390765e-7 +427 424 4.66142498756e-8 +428 424 -46495394.0641 +429 424 -1292464.98923 +430 424 -4074626.14033 +431 424 3.90789290795e-6 +432 424 -5.82225254368e-8 +433 424 -1.77783539552e-8 +434 424 -121637623.242 +435 424 -284342.297629 +649 424 155608.301563 +650 424 -1.34561420129e-6 +651 424 2.01297259055e-8 +652 424 -2.01401933063e-8 +653 424 -69591.5290458 +654 424 4387613.77127 +667 424 -552412.864869 +668 424 -7.31741273791e-6 +669 424 1.64800372315e-7 +670 424 7.06831346734e-8 +671 424 -1721.21405382 +672 424 -15637928.5534 +685 424 214562.253931 +686 424 -2.49191981616e-6 +687 424 2.70037158911e-7 +688 424 -2.66702748076e-8 +689 424 67870.3149921 +690 424 6056408.965 +425 425 2881355006.3 +426 425 1.19209289551e-7 +427 425 456969.978074 +428 425 5.27876530033e-10 +429 425 7.12991948494e-9 +430 425 3.92213533219e-6 +431 425 593014050.905 +432 425 -1.49011611939e-7 +433 425 1194214.87603 +434 425 9.89898069962e-10 +435 425 6.15008611136e-9 +649 425 -1.34561420129e-6 +650 425 -452283834.586 +651 425 -2.75e7 +652 425 6.54556282454e-23 +653 425 2.26172469399e-10 +654 425 -1.42597447566e-8 +667 425 -7.31710564916e-6 +668 425 -1555814251.54 +669 425 -1.78813934326e-7 +670 425 -3.55203260182e-22 +671 425 -2.19747407171e-10 +672 425 7.85192666412e-8 +685 425 -2.49191981616e-6 +686 425 -360322966.507 +687 425 2.75e7 +688 425 1.75228384482e-22 +689 425 -4.45919876571e-10 +690 425 -3.97916694279e-8 +426 426 103069463.431 +427 426 2.77957355928e-22 +428 426 -1.52469644314e-7 +429 426 -4.71421264056e-8 +430 426 -5.8531370466e-8 +431 426 -1.19209289551e-7 +432 426 13004784.689 +433 426 -1.0771997992e-22 +434 426 -3.96231187953e-7 +435 426 1.67884558852e-8 +649 426 2.01297259055e-8 +650 426 -2.75e7 +651 426 -23971334.5865 +652 426 -9.14101035478e-23 +653 426 -3.15854410104e-10 +654 426 1.99140208369e-8 +667 426 1.48199495122e-7 +668 426 -5.96046447754e-8 +669 426 -35232612.7819 +670 426 3.18487641071e-22 +671 426 -1.19804997987e-11 +672 426 -7.04633872662e-8 +685 426 2.70037158911e-7 +686 426 2.75e7 +687 426 -19743421.0526 +688 426 -1.19410094025e-22 +689 426 3.03873910305e-10 +690 426 2.71161946842e-8 +427 427 93831168.8312 +428 427 7.03954481225e-8 +429 427 -2.74200591065e-6 +430 427 -1.57985578153e-8 +431 427 -1194214.87603 +432 427 -1.01449826392e-22 +433 427 26272727.2727 +434 427 2.96133971013e-8 +435 427 1.1932529876e-6 +649 427 2.01401933063e-8 +650 427 -6.54556282454e-23 +651 427 9.14101035478e-23 +652 427 -2.81077367085e-21 +653 427 -1.17269802109e-8 +654 427 6.10894485912e-7 +667 427 -7.0243639859e-8 +668 427 3.50813837592e-22 +669 427 -3.16547684933e-22 +670 427 8.20358196432e-21 +671 427 -3.28058752484e-8 +672 427 -1.85889992344e-6 +685 427 2.66702748076e-8 +686 427 -1.75228384482e-22 +687 427 1.19410094025e-22 +688 427 -3.66325962668e-21 +689 427 -1.16828831948e-8 +690 427 8.01045916325e-7 +428 428 9560216711.29 +429 428 8.27014446259e-7 +430 428 121637623.242 +431 428 -9.89898069963e-10 +432 428 3.96231187953e-7 +433 428 2.9910114273e-8 +434 428 2677237872.14 +435 428 -8.01170244813e-7 +649 428 69591.5290458 +650 428 -2.26172469399e-10 +651 428 3.15854410104e-10 +652 428 -1.17269802109e-8 +653 428 -2808211.93609 +654 428 572916.666667 +667 428 -1721.21405376 +668 428 -2.19747407172e-10 +669 428 -1.19804997984e-11 +670 428 -3.27994775662e-8 +671 428 -6993068.60902 +672 428 8.21426510811e-7 +685 428 -67870.3149921 +686 428 4.45919876571e-10 +687 428 -3.03873910305e-10 +688 428 -1.16828831948e-8 +689 428 -2168585.52632 +690 428 -572916.666667 +429 429 1023967418.27 +430 429 -284342.297629 +431 429 -1.63040474764e-9 +432 429 1.67884558852e-8 +433 429 1.19324655332e-6 +434 429 -8.10949131846e-7 +435 429 -389540175.285 +649 429 -4387613.77127 +650 429 1.42597447566e-8 +651 429 -1.99140208369e-8 +652 429 6.10894485912e-7 +653 429 572916.666667 +654 429 -134186834.273 +667 429 15637928.5534 +668 429 -7.85192666412e-8 +669 429 7.04633872662e-8 +670 429 -1.85924577504e-6 +671 429 8.15372914076e-7 +672 429 412625580.286 +685 429 -6056408.965 +686 429 3.97916694279e-8 +687 429 -2.71161946842e-8 +688 429 8.01045916325e-7 +689 429 -572916.666667 +690 429 -179754535.486 +430 430 168819726.506 +431 430 8.72174642601e-6 +432 430 -5.99756710846e-8 +433 430 -2.15930807265e-5 +434 430 -2369347162.94 +435 430 -463043676.901 +436 430 -90116103.595 +437 430 1.37005856497e-6 +438 430 -2.26912003116e-7 +439 430 -2.66683695945e-5 +440 430 -2490984786.18 +441 430 -66835949.5229 +667 430 214562.253931 +668 430 -2.24566981616e-6 +669 430 -9.13224902116e-8 +670 430 -2.75621145608e-8 +671 430 -67870.314992 +672 430 6056408.965 +685 430 -96145581.9144 +686 430 -4.44320724355e-6 +687 430 -1.41612210974e-7 +688 430 1.76822723531e-5 +689 430 1238241134.62 +690 430 -2004844497.61 +703 430 46094308.7696 +704 430 -9.90355012979e-7 +705 430 5.5502155787e-7 +706 430 9.95152255381e-6 +707 430 1238309004.93 +708 430 578441828.255 +431 431 1473237316.85 +433 431 172972.623967 +434 431 2.50888661153e-5 +435 431 3.77623799641e-6 +436 431 1.40688148164e-6 +437 431 46500825.2239 +438 431 1.49011611939e-7 +439 431 1367187.5 +440 431 2.50898560134e-5 +441 431 7.69675952872e-7 +667 431 -2.24566981616e-6 +668 431 -360322966.507 +669 431 -2.75e7 +670 431 1.81087928123e-22 +671 431 4.4591987657e-10 +672 431 -3.97916694279e-8 +685 431 -4.47815942158e-6 +686 431 -775952869.567 +687 431 3.8125e6 +688 431 -1.79482266287e-19 +689 431 -1.25781666039e-5 +690 431 1.84187572621e-5 +703 431 -9.90355012979e-7 +704 431 -42934690.2412 +705 431 1.89375e7 +706 431 -1.01086518573e-19 +707 431 -1.25786125238e-5 +708 431 -5.8757512028e-6 +432 432 153309843.82 +433 432 22623307.1714 +434 432 -7.82424633111e-6 +435 432 -3.49578538884e-6 +436 432 -2.2860087373e-7 +438 432 -24702987.9386 +439 432 -9.10173894401e-20 +440 432 -8.04530264871e-6 +441 432 1.5785135811e-6 +667 432 -9.13224902116e-8 +668 432 -2.75e7 +669 432 -19743421.0526 +670 432 -1.23403103829e-22 +671 432 -3.03873910305e-10 +672 432 2.71161946842e-8 +685 432 -2.37004754834e-7 +686 432 -3.8125e6 +687 432 -25889735.6196 +688 432 60609418.2826 +689 432 5.1398708337e-6 +690 432 -5.10410574916e-6 +703 432 5.5502155787e-7 +704 432 1.89375e7 +705 432 -33756647.4781 +706 432 4.51964982652e-20 +707 432 5.62398673074e-6 +708 432 2.62708996999e-6 +433 433 4266536682.62 +434 433 .00123999706577 +435 433 -.000228485764105 +436 433 2.35113424323e-5 +437 433 -1367187.5 +438 433 7.05625288099e-20 +439 433 4.375e7 +440 433 .00116942662704 +441 433 .000108426639254 +667 433 2.75621145608e-8 +668 433 -1.81087928123e-22 +669 433 1.23403103829e-22 +670 433 -3.73067236425e-21 +671 433 -1.68130915282e-8 +672 433 8.08574242349e-7 +685 433 7.47406085476e-6 +686 433 -7.60563180737e-20 +687 433 -60609418.2826 +688 433 1151578947.37 +689 433 -.000629775484475 +690 433 -.00012632836431 +703 433 -9.95152255381e-6 +704 433 1.01086518573e-19 +705 433 -4.51964982652e-20 +706 433 -6.44862622621e-18 +707 433 -.000602280765928 +708 433 7.28194357182e-5 +434 434 132484249994 +435 434 .000275481492281 +436 434 2490984786.18 +437 434 -2.50898560134e-5 +438 434 8.04530264871e-6 +439 434 .00117119412704 +440 434 115674600877 +441 434 8.96453857422e-5 +667 434 67870.314992 +668 434 -4.4591987657e-10 +669 434 3.03873910305e-10 +670 434 -1.68130915282e-8 +671 434 -2168585.52632 +672 434 572916.666666 +685 434 1238241134.62 +686 434 -1.25781666039e-5 +687 434 6.10749487996e-6 +688 434 -.000632527268093 +689 434 -61231972798.6 +690 434 302947916.667 +703 434 -1238309004.93 +704 434 1.25786125238e-5 +705 434 -5.62398673074e-6 +706 434 -.000602280765928 +707 434 -59698309210.5 +708 434 -9.09e8 +435 435 135659606935 +436 435 -66835949.5229 +437 435 7.60789234121e-7 +438 435 1.5785135811e-6 +439 435 .000108345573465 +440 435 8.96453857422e-5 +441 435 -38568158864.7 +667 435 -6056408.965 +668 435 3.97916694279e-8 +669 435 -2.71161946842e-8 +670 435 8.08574242349e-7 +671 435 572916.666666 +672 435 -179754535.486 +685 435 2004844497.61 +686 435 -1.84187572621e-5 +687 435 5.10410574916e-6 +688 435 -.000132483364127 +689 435 -302947916.667 +690 435 45233040719.7 +703 435 -578441828.255 +704 435 5.8757512028e-6 +705 435 -2.62708996999e-6 +706 435 7.28194357182e-5 +707 435 -9.09e8 +708 435 -18066707236.8 +436 436 258898159.677 +437 436 5.77626429677e-8 +438 436 2.11429090297e-7 +439 436 -3.71010069932e-6 +440 436 -105633089.867 +441 436 -242280317.021 +442 436 -117552410.254 +443 436 2.06386182564e-6 +444 436 -2.51554495606e-7 +445 436 -3.82863432267e-5 +446 436 -2596617876.05 +447 436 -54304208.9873 +685 436 46094308.7696 +686 436 -8.18339387979e-7 +687 436 1.70291294713e-7 +688 436 -1.52057024938e-5 +689 436 -1238309004.93 +690 436 578441828.255 +703 436 -139121322.726 +704 436 3.8133130954e-7 +705 436 -5.60276245609e-7 +706 436 1.53271326583e-5 +707 436 -19294679.1789 +708 436 -2338893564.88 +721 436 58864599.6103 +722 436 -1.45738365449e-6 +723 436 6.86231002313e-7 +724 436 1.36517991198e-5 +725 436 1219014325.75 +726 436 786822927.765 +437 437 268092538.401 +438 437 -1.19209289551e-7 +439 437 703818.41716 +440 437 1.09644386114e-5 +441 437 2.69171557235e-6 +442 437 2.10108938974e-6 +443 437 30656088.1299 +444 437 -2.98023223877e-8 +445 437 2071005.91716 +446 437 3.60542946248e-5 +447 437 8.30719156589e-7 +685 437 -8.18339387979e-7 +686 437 -42934690.2412 +687 437 -1.89375e7 +688 437 1.54457925332e-19 +689 437 1.25786125238e-5 +690 437 -5.8757512028e-6 +703 437 3.80967126847e-7 +704 437 -111742856.992 +705 437 -2.98023223877e-8 +706 437 -2.46847008652e-19 +707 437 -4.66937087482e-6 +708 437 2.86406130164e-5 +721 437 -1.45738365449e-6 +722 437 -38019821.1876 +723 437 1.89375e7 +724 437 -1.93160982283e-19 +725 437 -1.72479833986e-5 +726 437 -1.11328542323e-5 +438 438 209141036.184 +439 438 7.39208209952e-21 +440 438 -3.4997743817e-7 +441 438 -7.25433791208e-6 +442 438 -2.52389702112e-7 +443 438 -1.19209289551e-7 +444 438 -46338267.5439 +445 438 -1.30662445858e-19 +446 438 -8.39528008688e-6 +447 438 2.23204860191e-6 +685 438 1.70291294713e-7 +686 438 -1.89375e7 +687 438 -33756647.4781 +688 438 -6.90592321593e-20 +689 438 -5.62398673074e-6 +690 438 2.62708996999e-6 +703 438 -6.10665499995e-7 +704 438 2.98023223877e-8 +705 438 -10669381.5368 +706 438 7.02695444402e-20 +707 438 -5.24661264895e-8 +708 438 -1.06577617834e-5 +721 438 6.86231002313e-7 +722 438 1.89375e7 +723 438 -32652918.3536 +724 438 6.23957229001e-20 +725 438 5.57152060425e-6 +726 438 3.59618427882e-6 +439 439 195192307.692 +440 439 .00277831597759 +441 439 -.000473962611054 +442 439 3.38222460229e-5 +443 439 -2071005.91716 +444 439 1.02214329645e-19 +445 439 53846153.8461 +446 439 .0013508098291 +447 439 .000150543847481 +685 439 1.52057024938e-5 +686 439 -1.54457925332e-19 +687 439 6.90592321593e-20 +688 439 -6.61636862094e-18 +689 439 -.000610537515928 +690 439 9.12864883498e-5 +703 439 -5.98839090862e-6 +704 439 1.43037819953e-20 +705 439 -2.6861016362e-20 +706 439 -1.48236012416e-17 +707 439 -.00131146987672 +708 439 -.00027323238685 +721 439 -1.36517991198e-5 +722 439 1.93160982283e-19 +723 439 -6.23957229001e-20 +724 439 -9.9867897913e-18 +725 439 -.000675048781998 +726 439 9.52719511315e-5 +440 440 235892848853 +441 440 .000701904296875 +442 440 2596617876.05 +443 440 -3.60542946248e-5 +444 440 8.39528008688e-6 +445 440 .00135259675217 +446 440 96732073549.3 +447 440 -3.81469726563e-5 +685 440 1238309004.93 +686 440 -1.25786125238e-5 +687 440 5.62398673074e-6 +688 440 -.000610537515928 +689 440 -59698309210.5 +690 440 9.09e8 +703 440 -19294679.1789 +704 440 -4.66937087482e-6 +705 440 -5.24661264896e-8 +706 440 -.00131148735749 +707 440 -109959047571 +708 440 8.01086425781e-5 +721 440 -1219014325.75 +722 440 1.72479833986e-5 +723 440 -5.57152060425e-6 +724 440 -.000675048781998 +725 440 -48003214574.9 +726 440 -9.09e8 +441 441 157423625646 +442 441 -54304208.9873 +443 441 8.17284169485e-7 +444 441 2.23204860191e-6 +445 441 .000150503757568 +446 441 -1.14440917969e-5 +447 441 -52567572044 +685 441 -578441828.255 +686 441 5.8757512028e-6 +687 441 -2.62708996999e-6 +688 441 9.12864883498e-5 +689 441 9.09e8 +690 441 -18066707236.8 +703 441 2338893564.88 +704 441 -2.86406130164e-5 +705 441 1.06577617834e-5 +706 441 -.00027565107106 +707 441 5.91278076172e-5 +708 441 60224597925.1 +721 441 -786822927.765 +722 441 1.11328542323e-5 +723 441 -3.59618427882e-6 +724 441 9.52719511315e-5 +725 441 -9.09e8 +726 441 -23658943319.8 +442 442 284926330.704 +443 442 -5.50334370938e-7 +444 442 -4.30101127409e-7 +445 442 -6.76435123651e-6 +446 442 44081470.1179 +447 442 -704667712.57 +703 442 58864599.6103 +704 442 -1.28427548142e-6 +705 442 1.50332975997e-7 +706 442 -2.08441676774e-5 +707 442 -1219014325.75 +708 442 786822927.765 +721 442 -157735175.787 +722 442 5.47979932765e-7 +723 442 1.74908503899e-6 +724 442 -3.48875071317e-5 +725 442 -22522372.732 +726 442 -2571300389.36 +727 442 61040065.8024 +728 442 -1.40110455746e-6 +729 442 -1.58187720633e-6 +730 442 3.92483016896e-6 +731 442 736607936.472 +732 442 -337347257.655 +733 442 -150409102.6 +734 442 1.79538375322e-6 +735 442 1.95004728359e-6 +736 442 -8.31114454831e-6 +737 442 -2552536405.93 +738 442 156035735.863 +739 442 70598233.2692 +740 442 -3.84542558814e-7 +741 442 -2.36306480509e-6 +742 442 3.33515306045e-5 +743 442 1196491953.02 +744 442 978715688.743 +443 443 247037661.413 +444 443 6957998.49161 +445 443 821556.066311 +446 443 -1.34989473004e-5 +447 443 4.15936785568e-6 +703 443 -1.28427548142e-6 +704 443 -38019821.1876 +705 443 -1.89375e7 +706 443 2.94926688278e-19 +707 443 1.72479833986e-5 +708 443 -1.11328542323e-5 +721 443 9.12699702579e-7 +722 443 -86186418.8443 +723 443 -2.98023223877e-8 +724 443 3.50372700438e-19 +725 443 7.69703886133e-6 +726 443 2.8068835447e-5 +727 443 -1.40110455746e-6 +728 443 -44404833.2196 +729 443 -23959003.0168 +730 443 -4.17921730954e-20 +731 443 -7.84351043465e-6 +732 443 3.59212357688e-6 +733 443 1.63502074817e-6 +734 443 30232351.2775 +735 443 5021503.01677 +736 443 2892561.98347 +737 443 2.25553473244e-5 +738 443 8.97062256291e-7 +739 443 -3.84542558814e-7 +740 443 -35267444.1786 +741 443 1.89375e7 +742 443 -2.66227130264e-19 +743 443 -9.55094453729e-6 +744 443 -7.81255505927e-6 +444 444 233720308.075 +445 444 1.24222329304e-18 +446 444 5.67023426737e-5 +447 444 2.02632985369e-5 +703 444 1.50332975997e-7 +704 444 -1.89375e7 +705 444 -32652918.3536 +706 444 -9.52685356027e-20 +707 444 -5.57152060425e-6 +708 444 3.59618427882e-6 +721 444 1.82693920566e-6 +722 444 1.78813934326e-7 +723 444 1654214.20685 +724 444 5.11645829809e-19 +725 444 -3.46680294619e-5 +726 444 2.71904682703e-5 +727 444 -1.58187720633e-6 +728 444 -23959003.0168 +729 444 -53176509.0492 +730 444 -4.55914615586e-20 +731 444 -8.5565568378e-6 +732 444 3.91868026569e-6 +733 444 1.91639292199e-6 +734 444 5021503.01677 +735 444 -46504312.3224 +736 444 -6.03349198335e-20 +737 444 4.83070625868e-5 +738 444 -1.42442027761e-5 +739 444 -2.36306480509e-6 +740 444 1.89375e7 +741 444 -32790769.5375 +742 444 -8.11048585154e-19 +743 444 -2.90965088576e-5 +744 444 -2.38005860672e-5 +445 445 234965034.965 +446 445 .00259833158541 +447 445 .00138784393272 +703 445 2.08441676774e-5 +704 445 -2.94926688278e-19 +705 445 9.52685356027e-20 +706 445 -1.02219253561e-17 +707 445 -.000683357974306 +708 445 .000120995056395 +721 445 1.9493429409e-5 +722 445 -1.47650216132e-20 +723 445 -1.1338332999e-18 +724 445 9.5789052857e-18 +725 445 -.00101964696623 +726 445 .000725247018638 +727 445 -7.52220355283e-6 +728 445 8.00975378311e-20 +729 445 8.73791321793e-20 +730 445 -1.16050333254e-17 +731 445 -.000579009995569 +732 445 -.000468282836707 +733 445 4.48160314384e-5 +734 445 -2892561.98347 +735 445 -9.68342796152e-19 +736 445 63636363.6364 +737 445 .000987704996856 +738 445 -.000807017485967 +739 445 -3.33515306044e-5 +740 445 2.66227130264e-19 +741 445 8.11048585154e-19 +742 445 -1.99933623991e-17 +743 445 -.000342382221313 +744 445 -.000709769811875 +446 446 214061663727 +447 446 11257692169.9 +703 446 1219014325.75 +704 446 -1.72479833986e-5 +705 446 5.57152060425e-6 +706 446 -.000683357974306 +707 446 -48003214574.9 +708 446 9.09e8 +721 446 -22522372.732 +722 446 7.69703886133e-6 +723 446 -3.46680294619e-5 +724 446 -.00100214041728 +725 446 -88987654030.2 +726 446 .0001220703125 +727 446 -1615036176.25 +728 446 1.71971444694e-5 +729 446 1.87605212393e-5 +730 446 -.000579009995569 +731 446 -42000460707 +732 446 -11344785999.5 +733 446 3340177700.65 +734 446 -3.09422685182e-5 +735 446 -5.74564311619e-5 +736 446 .000980007572614 +737 446 92818963548.2 +738 446 11538221436.9 +739 446 -1196491953.02 +740 446 9.55094453729e-6 +741 446 2.90965088576e-5 +742 446 -.000342382221313 +743 446 -40122612440.2 +744 446 -9.09e8 +447 447 167201661515 +703 447 -786822927.765 +704 447 1.11328542323e-5 +705 447 -3.59618427882e-6 +706 447 .000120995056395 +707 447 9.09e8 +708 447 -23658943319.8 +721 447 2571300389.36 +722 447 -2.8068835447e-5 +723 447 -2.71904682703e-5 +724 447 .000728984018638 +725 447 .000101089477539 +726 447 67856833272 +727 447 832886218.032 +728 447 -8.86869584015e-6 +729 447 -9.67494091653e-6 +730 447 -.000468282836707 +731 447 -11344785999.5 +732 447 -29913657037.3 +733 447 124145696.089 +734 447 1.3374335267e-6 +735 447 -1.38737629202e-5 +736 447 -.000808632895324 +737 447 11538221436.9 +738 447 -49466932812.3 +739 447 -978715688.743 +740 447 7.81255505927e-6 +741 447 2.38005860672e-5 +742 447 -.000709769811875 +743 447 -9.09e8 +744 447 -28888416267.9 +448 448 259860228.642 +452 448 -105633089.867 +453 448 -242280317.021 +454 448 -117552410.254 +458 448 -2596617876.05 +459 448 -54304208.9874 +460 448 58864599.6103 +464 448 1219014325.75 +465 448 786822927.765 +466 448 -139121322.726 +470 448 -19294679.1789 +471 448 -2338893564.88 +472 448 46094308.7696 +476 448 -1238309004.93 +477 448 578441828.255 +1125 448 -962068.965517 +449 449 268094461.399 +450 449 1.19209289551e-7 +451 449 703818.41716 +453 449 -167300.832342 +455 449 30656088.1299 +456 449 -2.98023223877e-8 +457 449 2071005.91716 +461 449 -38019821.1876 +462 449 1.89375e7 +467 449 -111742856.992 +468 449 2.98023223877e-8 +473 449 -42934690.2412 +474 449 -1.89375e7 +1128 449 -1922.9980729 +1132 449 -167300.832342 +450 450 209142959.182 +452 450 167300.832342 +456 450 -46338267.5439 +461 450 1.89375e7 +462 450 -32652918.3536 +468 450 -10669381.5368 +473 450 -1.89375e7 +474 450 -33756647.4781 +1129 450 -1922.9980729 +1131 450 167300.832342 +451 451 195192307.692 +455 451 -2071005.91716 +457 451 53846153.8461 +452 452 235912255749 +453 452 3.81469726563e-6 +454 452 2596617876.05 +458 452 96732073549.3 +459 452 9.53674316406e-6 +460 452 -1219014325.75 +464 452 -48003214574.9 +465 452 -9.09e8 +466 452 -19294679.1789 +470 452 -109959047571 +471 452 -3.81469726563e-6 +472 452 1238309004.93 +476 452 -59698309210.5 +477 452 9.09e8 +1129 452 -167300.832342 +1131 452 9703448.27586 +453 453 157443032542 +454 453 -54304208.9874 +458 453 -1.14440917969e-5 +459 453 -52567572044 +460 453 -786822927.765 +464 453 -9.09e8 +465 453 -23658943319.8 +466 453 2338893564.88 +470 453 -7.62939453125e-6 +471 453 60224597925.1 +472 453 -578441828.255 +476 453 9.09e8 +477 453 -18066707236.8 +1128 453 167300.832342 +1132 453 9703448.27586 +454 454 285888399.67 +458 454 44081470.118 +459 454 -704667712.57 +460 454 -157735175.787 +464 454 -22522372.732 +465 454 -2571300389.36 +466 454 58864599.6103 +470 454 -1219014325.75 +471 454 786822927.765 +787 454 61040065.8024 +791 454 736607936.472 +792 454 -337347257.655 +811 454 -150409102.6 +815 454 -2552536405.93 +816 454 156035735.863 +817 454 70598233.2692 +821 454 1196491953.02 +822 454 978715688.743 +1521 454 -962068.965517 +455 455 247039584.411 +456 455 6957998.49161 +457 455 821556.066311 +459 455 -167300.832342 +461 455 -86186418.8443 +467 455 -38019821.1876 +468 455 -1.89375e7 +788 455 -44404833.2196 +789 455 -23959003.0168 +812 455 30232351.2775 +813 455 5021503.01677 +814 455 2892561.98347 +818 455 -35267444.1786 +819 455 1.89375e7 +1524 455 -1922.9980729 +1528 455 -167300.832342 +456 456 233722231.073 +458 456 167300.832342 +461 456 8.94069671631e-8 +462 456 1654214.20685 +467 456 -1.89375e7 +468 456 -32652918.3536 +788 456 -23959003.0168 +789 456 -53176509.0492 +812 456 5021503.01677 +813 456 -46504312.3224 +818 456 1.89375e7 +819 456 -32790769.5375 +1525 456 -1922.9980729 +1527 456 167300.832342 +457 457 234965034.965 +812 457 -2892561.98347 +814 457 63636363.6364 +458 458 214081070623 +459 458 11257692169.9 +460 458 -22522372.732 +464 458 -88987654030.2 +466 458 1219014325.75 +470 458 -48003214574.9 +471 458 9.09e8 +787 458 -1615036176.25 +791 458 -42000460707 +792 458 -11344785999.5 +811 458 3340177700.65 +815 458 92818963548.2 +816 458 11538221436.9 +817 458 -1196491953.02 +821 458 -40122612440.2 +822 458 -9.09e8 +1525 458 -167300.832342 +1527 458 9703448.27586 +459 459 167221068411 +460 459 2571300389.36 +464 459 -7.62939453125e-6 +465 459 67856833272 +466 459 -786822927.765 +470 459 9.09e8 +471 459 -23658943319.8 +787 459 832886218.032 +791 459 -11344785999.5 +792 459 -29913657037.3 +811 459 124145696.089 +815 459 11538221436.9 +816 459 -49466932812.3 +817 459 -978715688.743 +821 459 -9.09e8 +822 459 -28888416267.9 +1524 459 167300.832342 +1528 459 9703448.27586 +460 460 324700304.178 +464 460 -116191500.807 +465 460 97446624.079 +466 460 -123244023.843 +470 460 2722974596.25 +471 460 26391794.0214 +520 460 53804397.6817 +524 460 -1091534235 +525 460 813214721.786 +526 460 -138845554.632 +530 460 -24893148.8092 +531 460 -2473853765.28 +805 460 64101733.5623 +809 460 1066641086.19 +810 460 1001047206.76 +811 460 70598233.2692 +815 460 1196491953.02 +816 460 -978715688.743 +817 460 -152155514.039 +821 460 -2839166097.06 +822 460 22331518.0182 +461 461 245024644.151 +462 461 1.19209289551e-7 +463 461 821556.066311 +467 461 35369267.3118 +468 461 1.78813934326e-7 +469 461 -2071005.91716 +521 461 -36248702.6862 +522 461 -1.89375e7 +527 461 -73942224.4422 +528 461 -1.19209289551e-7 +806 461 -34094787.1573 +807 461 1.89375e7 +812 461 -35267444.1786 +813 461 -1.89375e7 +818 461 23365487.0334 +819 461 -2.98023223877e-8 +820 461 2892561.98347 +462 462 218793837.741 +468 462 -39528629.2655 +521 462 -1.89375e7 +522 462 -32626144.6886 +527 462 5.96046447754e-8 +528 462 8223276.72328 +806 462 1.89375e7 +807 462 -33311417.7489 +812 462 -1.89375e7 +813 462 -32790769.5375 +818 462 8.94069671631e-8 +819 462 -57761449.0772 +463 463 234965034.965 +467 463 2071005.91716 +469 463 53846153.8461 +818 463 -2892561.98347 +820 463 63636363.6364 +464 464 215000393291 +465 464 1.90734863281e-5 +466 464 -2722974596.25 +470 464 101861800656 +471 464 -9.53674316406e-6 +520 464 1091534235 +524 464 -43135509157.5 +525 464 9.09e8 +526 464 -24893148.8092 +530 464 -79221130869.1 +531 464 7.62939453125e-6 +805 464 -1066641086.19 +809 464 -35951627705.6 +810 464 -9.09e8 +811 464 -1196491953.02 +815 464 -40122612440.2 +816 464 9.09e8 +817 464 2839166097.06 +821 464 88746967418.5 +822 464 -5.72204589844e-6 +465 465 165675649484 +466 465 26391794.0214 +471 465 -47583795487.2 +520 465 -813214721.786 +524 465 9.09e8 +525 465 -26703586080.6 +526 465 2473853765.28 +530 465 -1.52587890625e-5 +531 465 72953278721.3 +805 465 -1001047206.76 +809 465 -9.09e8 +810 465 -32398264069.3 +811 465 978715688.743 +815 465 9.09e8 +816 465 -28888416267.9 +817 465 22331518.0182 +821 465 -1.52587890625e-5 +822 465 -59770049485.6 +466 466 277160746.529 +470 466 -99540033.284 +471 466 117748004.095 +472 466 -94345505.0789 +476 466 2623434562.97 +477 466 32482208.0263 +514 466 42578995.7884 +518 466 -1112859933.04 +519 466 610924036.281 +520 466 -121685196.731 +524 466 -21325698.04 +525 466 -2221145560.79 +526 466 53804397.6817 +530 466 1091534235 +531 466 813214721.786 +467 467 279980983.723 +468 467 -1.19209289551e-7 +469 467 703818.41716 +473 467 51692355.4818 +475 467 -1367187.5 +515 467 -40348648.3135 +516 467 -1.89375e7 +521 467 -97747887.0955 +522 467 5.96046447754e-8 +527 467 -36248702.6862 +528 467 1.89375e7 +468 468 204698585.406 +473 468 -2.98023223877e-8 +474 468 -18352913.5338 +515 468 -1.89375e7 +516 468 -33046688.9881 +521 468 -1.19209289551e-7 +522 468 -4065261.56135 +527 468 1.89375e7 +528 468 -32626144.6886 +469 469 195192307.692 +473 469 1367187.5 +475 469 4.375e7 +470 470 2.4724406497e11 +471 470 -7.62939453125e-6 +472 470 -2623434562.97 +476 470 122183088972 +477 470 1.90734863281e-6 +514 470 1112859933.04 +518 470 -53772279761.9 +519 470 9.09e8 +520 470 -21325698.04 +524 470 -98413863553.1 +525 470 -1.33514404297e-5 +526 470 -1091534235 +530 470 -43135509157.5 +531 470 -9.09e8 +471 471 152313298494 +472 471 32482208.0263 +476 471 -1.90734863281e-6 +477 471 -34257322555.2 +514 471 -610924036.281 +518 471 9.09e8 +519 471 -20650592261.9 +520 471 2221145560.79 +524 471 3.81469726563e-6 +525 471 64091321199.6 +526 471 -813214721.786 +530 471 -9.09e8 +531 471 -26703586080.6 +472 472 185247269.829 +476 472 -2501790175.66 +477 472 225038787.445 +478 472 -4095353.07076 +482 472 121644387.311 +483 472 138190.086745 +508 472 198487.410865 +512 472 -60504.5995671 +513 472 6194599.05174 +514 472 -79688183.9875 +518 472 1112799428.44 +519 472 -1779805710.16 +520 472 42578995.7884 +524 472 1112859933.04 +525 472 610924036.281 +473 473 1560077713 +474 473 -1.19209289551e-7 +475 473 172972.623967 +479 473 634345219.736 +480 473 1.34110450745e-7 +481 473 -1194214.87603 +509 473 -328603896.104 +510 473 -2.75e7 +515 473 -697952217.487 +516 473 3.8125e6 +521 473 -40348648.3135 +522 473 1.89375e7 +474 474 153503473.074 +475 474 -10994905.8109 +479 474 2.98023223877e-8 +480 474 15719070.4033 +509 474 -2.75e7 +510 474 -18339285.7143 +515 474 -3.8125e6 +516 474 -20093851.0904 +517 474 49614512.4716 +521 474 1.89375e7 +522 474 -33046688.9881 +475 475 4527012873.09 +479 475 1194214.87603 +481 475 26272727.2727 +516 475 -49614512.4716 +517 475 1041904761.9 +476 476 138923041622 +477 476 7.45058059692e-9 +478 476 -121644387.311 +482 476 2677463070.55 +483 476 -9.31322574615e-9 +508 476 60504.5995671 +512 476 -1942212.30159 +513 476 572916.666667 +514 476 1112799428.44 +518 476 -54919364278.1 +519 476 302947916.667 +520 476 -1112859933.04 +524 476 -53772279761.9 +525 476 -9.09e8 +477 477 137418822709 +478 477 138190.086745 +482 477 -8.84756445885e-9 +483 477 -355485115.761 +508 477 -6194599.05174 +512 477 572916.666667 +513 477 -201578057.359 +514 477 1779805710.16 +518 477 -302947916.667 +519 477 45268598890.7 +520 477 -610924036.281 +524 477 -9.09e8 +525 477 -20650592261.9 +478 478 6500668.81466 +482 478 -46494850.5229 +483 478 628136.757936 +484 478 -2088098.80975 +488 478 75149536.7884 +489 478 175878.292222 +502 478 146358.644731 +506 478 -62406.9940476 +507 478 4563492.06349 +508 478 -479820.680366 +512 478 -1902.39448052 +513 478 -15009791.7955 +514 478 198487.410865 +518 478 60504.5995671 +519 478 6194599.05174 +479 479 3056273837.47 +480 479 -1.19209289551e-7 +481 479 456969.978074 +485 479 820659138.279 +486 479 -2.98023223877e-7 +487 479 -737244.897959 +503 479 -4.1125e8 +504 479 -2.75e7 +509 479 -1403003246.75 +510 479 7.45058059692e-8 +515 479 -328603896.104 +516 479 2.75e7 +480 480 106194463.431 +485 480 2.68220901489e-7 +486 480 28462406.015 +503 480 -2.75e7 +504 480 -2.20625e7 +509 480 -8.94069671631e-8 +510 480 -31026785.7143 +515 480 2.75e7 +516 480 -18339285.7143 +481 481 93831168.8312 +485 481 737244.897959 +487 481 20642857.1429 +482 482 9560935957.32 +484 482 -75149536.7884 +488 482 2105824456.98 +489 482 4.19095158577e-9 +502 482 62406.9940476 +506 482 -2525173.61111 +507 482 572916.666667 +508 482 -1902.39448052 +512 482 -6256200.39682 +513 482 -2.32830643654e-9 +514 482 -60504.5995671 +518 482 -1942212.30159 +519 482 -572916.666667 +483 483 983881852.796 +484 483 175878.292222 +488 483 -1.07102096081e-8 +489 483 -252456887.411 +502 483 -4563492.06349 +506 483 572916.666667 +507 483 -152005208.333 +508 483 15009791.7955 +512 483 -6.51925802231e-9 +513 483 442868979.978 +514 483 -6194599.05174 +518 483 -572916.666667 +519 483 -201578057.359 +484 484 42525842.9016 +488 484 513079974.49 +489 484 477383.936033 +490 484 -40196659.2219 +494 484 588229511.278 +495 484 62813.6757911 +496 484 469953.080571 +500 484 -41413.6904762 +501 484 14716553.288 +502 484 -718892.440127 +506 484 20993.3035714 +507 484 -22511337.8685 +508 484 146358.644731 +512 484 62406.9940476 +513 484 4563492.06349 +485 485 2367545743.93 +486 485 3.57627868652e-7 +487 485 -5042755.10204 +491 485 240366546.366 +492 485 4.47034835815e-8 +493 485 -5.78e6 +497 485 -174357142.857 +498 485 -2.75e7 +503 485 -1042964285.71 +504 485 -2.98023223877e-7 +509 485 -4.1125e8 +510 485 2.75e7 +486 486 108985714.286 +491 486 -8.94069671631e-8 +492 486 -23162406.015 +497 486 -2.75e7 +498 486 -12917857.1429 +503 486 2.98023223877e-7 +504 486 -19305357.1429 +509 486 2.75e7 +510 486 -2.20625e7 +487 487 156885714.286 +491 487 5.78e6 +493 487 5.78e7 +488 488 15973123015.9 +489 488 1.11758708954e-8 +490 488 -588229511.278 +494 488 5882879908.1 +495 488 -9.31322574615e-10 +496 488 41413.6904762 +500 488 -691914.68254 +501 488 572916.666667 +502 488 20993.3035714 +506 488 -4398462.30159 +507 488 5.12227416038e-9 +508 488 -62406.9940476 +512 488 -2525173.61111 +513 488 -572916.666667 +489 489 1416479029.3 +490 489 62813.6757909 +494 489 -7.91624188423e-9 +495 489 -878307856.179 +496 489 -14716553.288 +500 489 572916.666667 +501 489 -466328869.047 +502 489 22511337.8685 +506 489 -1.35041773319e-8 +507 489 686191220.238 +508 489 -4563492.06349 +512 489 -572916.666667 +513 489 -152005208.333 +490 490 143411313.97 +491 490 2.38418579102e-7 +494 490 -588229511.278 +495 490 125627.35159 +496 490 -38630281.3389 +497 490 -3e6 +500 490 41413.6904762 +501 490 -15566893.424 +502 490 469953.080571 +506 490 41413.6904762 +507 490 14716553.288 +532 490 73690893.9014 +533 490 -1.49011611939e-7 +537 490 -45866666.6667 +538 490 3.9e7 +491 491 2439082075.19 +492 491 -1.19209289551e-7 +493 491 5.78e6 +496 491 3e6 +497 491 -1078380952.38 +498 491 2.5e6 +503 491 -174357142.857 +504 491 2.75e7 +532 491 7.45058059692e-8 +533 491 858596491.228 +537 491 3.9e7 +538 491 -427833333.333 +492 492 72179542.7723 +493 492 -23487959.6652 +494 492 25743936.561 +497 492 -2.5e6 +498 492 -9962868.48072 +499 492 264973544.974 +500 492 -11538624.3386 +503 492 2.75e7 +504 492 -12917857.1429 +534 492 -7080234.82109 +535 492 -11743979.8326 +536 492 25743936.561 +539 492 3547896.19552 +540 492 -105989417.989 +541 492 -11538624.3386 +493 493 19088565747.7 +494 493 2.38418579102e-7 +498 493 -264973544.974 +499 493 7229111111.11 +500 493 -4e6 +534 493 -11743979.8326 +535 493 -4915421888.05 +536 493 5.66244125366e-7 +539 493 105989417.989 +540 493 -3890444444.44 +541 493 -5.2e7 +494 494 13681227930.9 +495 494 1.11758708954e-8 +496 494 41413.6904762 +498 494 -11538624.3386 +499 494 4e6 +500 494 -853292559.524 +501 494 52083.3333333 +502 494 -41413.6904762 +506 494 -691914.68254 +507 494 -572916.666667 +534 494 -25743936.561 +535 494 -3.57627868652e-7 +536 494 1562929546.09 +539 494 11538624.3386 +540 494 -5.2e7 +541 494 -713422222.222 +495 495 953495826.103 +496 495 15566893.424 +500 495 -52083.3333333 +501 495 484186011.904 +502 495 -14716553.288 +506 495 -572916.666667 +507 495 -466328869.047 +496 496 3238092236.7 +497 496 3.9e7 +498 496 1.3375e9 +500 496 -113601.190476 +501 496 15566893.424 +502 496 -2974046194.15 +504 496 1.125e8 +506 496 -113601.190476 +507 496 -14716553.288 +532 496 -45866666.6667 +533 496 -3.9e7 +537 496 2936409523.81 +538 496 -3e6 +539 496 -1.125e8 +543 496 -3116428571.43 +545 496 -1.3375e9 +497 497 1182164947.99 +498 497 2.75e7 +499 497 293154761.905 +501 497 -15141723.356 +503 497 91576521.6139 +504 497 2.5e6 +505 497 293154761.905 +507 497 14929138.322 +532 497 -3.9e7 +533 497 -427833333.333 +537 497 3e6 +538 497 408924337.725 +540 497 34970238.0952 +542 497 -15141723.356 +544 497 -2094378.75679 +546 497 34970238.0952 +548 497 14929138.322 +498 498 52699918606.7 +499 498 -264973544.974 +500 498 12275132.2751 +502 498 -1.125e8 +503 498 -2.5e6 +504 498 -52331788095.2 +534 498 3547896.19552 +535 498 105989417.989 +536 498 -11538624.3386 +537 498 1.125e8 +539 498 26073821365.6 +540 498 105989417.989 +541 498 12275132.2751 +543 498 -1.3375e9 +545 498 -26422619047.6 +499 499 14991684854.5 +500 499 -5.2e7 +501 499 -27864583.3333 +503 499 -293154761.905 +505 499 3302372685.18 +507 499 2.34375e6 +534 499 -105989417.989 +535 499 -3890444444.44 +536 499 5.2e7 +538 499 34970238.0952 +539 499 105989417.989 +540 499 -1751851521.16 +541 499 -4e6 +542 499 -2.34375e6 +544 499 -34970238.0952 +546 499 -21122685.1852 +548 499 27864583.3333 +500 500 916602976.19 +501 500 -572916.666667 +502 500 113601.190476 +506 500 1413789.68254 +507 500 52083.3333333 +534 500 11538624.3386 +535 500 5.2e7 +536 500 -713422222.222 +539 500 -12275132.2751 +540 500 4e6 +541 500 744355555.556 +501 501 1602766369.05 +502 501 -14716553.288 +503 501 14929138.322 +505 501 -2.34375e6 +506 501 -52083.3333333 +507 501 -1549194940.47 +538 501 15141723.356 +540 501 2.34375e6 +542 501 929806547.618 +544 501 -14929138.322 +546 501 27864583.3333 +548 501 -920877976.19 +502 502 4676081067.02 +506 502 41986.6071429 +507 502 22511337.8685 +508 502 -887646577.873 +510 502 1.125e8 +512 502 -71614.5833333 +513 502 -4563492.06349 +537 502 -3116428571.43 +539 502 1.3375e9 +543 502 3589642857.14 +545 502 1.23977661133e-5 +549 502 -1.2875e9 +551 502 -1.3375e9 +503 503 1150775484.33 +505 503 -190848214.286 +507 503 -20895691.61 +509 503 386232245.213 +510 503 2.5e6 +511 503 102306547.619 +513 503 5158730.15873 +538 503 -2094378.75679 +540 503 -34970238.0952 +542 503 14929138.322 +544 503 560293.727279 +546 503 -95424107.1428 +548 503 -20895691.61 +550 503 1521262.44016 +552 503 -60453869.0476 +554 503 5158730.15873 +504 504 71948770238.1 +508 504 -1.125e8 +509 504 -2.5e6 +510 504 -18250791666.7 +537 504 1.3375e9 +539 504 -26422619047.6 +543 504 -1.43051147461e-5 +545 504 34969047619.1 +549 504 -1.3375e9 +551 504 -9858333333.33 +505 505 10210458002.6 +507 505 -9.53674316406e-7 +509 505 -102306547.619 +511 505 3902893518.52 +513 505 2.34375e6 +538 505 34970238.0952 +540 505 -21122685.1852 +542 505 -27864583.3333 +544 505 -95424107.1428 +546 505 -1304208002.64 +548 505 -8.94069671631e-8 +550 505 60453869.0476 +552 505 -2731018518.52 +554 505 27864583.3333 +506 506 6357837.30159 +507 506 -1.11758708954e-8 +508 506 71614.5833333 +512 506 2782986.11111 +513 506 52083.3333333 +507 507 2262427827.38 +508 507 -4563492.06349 +509 507 5158730.15873 +511 507 -2.34375e6 +512 507 -52083.3333333 +513 507 -509661458.333 +538 507 -14929138.322 +540 507 -27864583.3333 +542 507 -920877976.19 +544 507 20895691.61 +546 507 4.17232513428e-7 +548 507 1276421130.95 +550 507 -5158730.15873 +552 507 27864583.3333 +554 507 -321614583.333 +508 508 3186357115.25 +510 508 1.52587890625e-5 +512 508 -3804.78896104 +513 508 15009791.7955 +514 508 -1227146991.32 +516 508 1.125e8 +518 508 -75419.3722944 +519 508 -6194599.05174 +543 508 -1.2875e9 +545 508 1.3375e9 +549 508 1757305194.81 +551 508 -7.62939453125e-6 +555 508 -1541233766.23 +557 508 -1.3375e9 +509 509 1460404261.61 +511 509 17294495.2774 +513 509 -12883941.4554 +515 509 296237507.867 +516 509 2.5e6 +517 509 119601042.897 +519 509 6662286.12657 +544 509 1521262.44016 +546 509 60453869.0476 +548 509 5158730.15873 +550 509 -3213782.46015 +552 509 8647247.63872 +554 509 -12883941.4554 +556 509 1675648.19189 +558 509 -51806621.4089 +560 509 6662286.12657 +510 510 43521820887.4 +514 510 -1.125e8 +515 510 -2.5e6 +516 510 -23473410173.2 +543 510 1.3375e9 +545 510 -9858333333.33 +549 510 3.81469726563e-6 +551 510 20443722943.7 +555 510 -1.3375e9 +557 510 -12311580086.6 +511 511 9173449525.01 +513 511 -4.76837158203e-7 +515 511 -119601042.897 +517 511 3447038089.23 +519 511 2.34375e6 +544 511 -60453869.0476 +546 511 -2731018518.52 +548 511 -27864583.3333 +550 511 8647247.63872 +552 511 -3846744979.56 +554 511 1.49011611939e-7 +556 511 51806621.4089 +558 511 -1955560816.5 +560 511 27864583.3333 +512 512 7428075.39682 +514 512 75419.3722944 +518 512 2270337.30159 +519 512 52083.3333333 +513 513 1450529288.42 +514 513 -6194599.05174 +515 513 6662286.12657 +517 513 -2.34375e6 +518 513 -52083.3333333 +519 513 -673010687.229 +544 513 -5158730.15873 +546 513 -27864583.3333 +548 513 -321614583.333 +550 513 12883941.4554 +552 513 2.38418579102e-7 +554 513 779643533.549 +556 513 -6662286.12657 +558 513 27864583.3333 +560 513 -413386093.073 +514 514 1851691983.38 +516 514 -1.3153e9 +518 514 -1445264982.41 +519 514 1779805710.16 +520 514 -48189005.5541 +522 514 1.8e6 +524 514 -1445340401.79 +525 514 -610924036.281 +549 514 -1541233766.23 +551 514 1.3375e9 +555 514 1034636147.19 +557 514 1.107e8 +561 514 -32816666.6667 +563 514 -2.22e7 +515 515 791400505.799 +516 515 -8.5625e6 +517 515 935887796.389 +519 515 -1422501401.77 +521 515 -10391816.2143 +522 515 6.3125e6 +523 515 1055488839.29 +525 515 767390476.19 +550 515 1675648.19189 +552 515 51806621.4089 +554 515 6662286.12657 +556 515 -35894820.6625 +558 515 -511979092.877 +560 515 -1422501401.77 +562 515 23926336.9237 +564 515 -563785714.286 +566 515 767390476.19 +516 516 24426570140.9 +517 516 -49614512.4716 +518 516 12403628.1179 +520 516 -1.8e6 +521 516 -6.3125e6 +522 516 -103673735.119 +549 516 1.3375e9 +551 516 -12311580086.6 +555 516 -1.107e8 +557 516 11574216536.9 +559 516 12403628.1179 +561 516 -2.22e7 +563 516 -40642857.1428 +517 517 64590772836 +519 517 -1037735416.67 +521 517 -1055488839.29 +523 517 44161928571.4 +525 517 8.64e7 +550 517 -51806621.4089 +552 517 -1955560816.5 +554 517 -27864583.3333 +556 517 -511979092.877 +558 517 -28055008766.7 +560 517 -8.405625e7 +562 517 563785714.286 +564 517 -28427428571.4 +566 517 1.0656e9 +518 518 7.724067529e10 +519 518 -908427083.333 +520 518 1445340401.79 +524 518 64411654761.9 +525 518 3.03e8 +557 518 -12403628.1179 +559 518 520952380.952 +519 519 171898950568 +520 519 -610924036.281 +521 519 767390476.19 +523 519 -8.64e7 +524 519 -3.03e8 +525 519 -67923397023.8 +550 519 -6662286.12657 +552 519 -27864583.3333 +554 519 -413386093.073 +556 519 1422501401.77 +558 519 8.405625e7 +560 519 76561028950.2 +562 519 -767390476.19 +564 519 1.0656e9 +566 519 -4.89128e10 +520 520 238582977.093 +522 520 3.57627868652e-7 +524 520 -149832886.465 +525 520 2221145560.79 +526 520 -72236168.278 +528 520 1.8e6 +530 520 -1595173288.25 +531 520 -813214721.786 +555 520 -32816666.6667 +557 520 2.22e7 +561 520 -26732051.2821 +563 520 -1.49011611939e-7 +567 520 -33251282.0513 +569 520 -2.22e7 +521 521 219895148.278 +522 521 1.19209289551e-7 +523 521 204477348.373 +525 521 -1940301831.5 +527 521 -31703100.5441 +528 521 6.3125e6 +529 521 1259966187.66 +531 521 960797069.597 +556 521 23926336.9237 +558 521 563785714.286 +560 521 767390476.19 +562 521 -55752638.6455 +564 521 48647928.9941 +566 521 -1940301831.5 +568 521 28459408.2978 +570 521 -515137785.292 +572 521 960797069.597 +522 522 346024009.844 +526 522 -1.8e6 +527 522 -6.3125e6 +528 522 -139469322.344 +555 522 2.22e7 +557 522 -40642857.1428 +561 522 1.63912773132e-7 +563 522 53697802.1978 +567 522 -2.22e7 +569 522 -46197802.1978 +523 523 115835241758 +525 523 3.81469726563e-6 +527 523 -1259966187.66 +529 523 41197978022 +531 523 8.64e7 +556 523 -563785714.286 +558 523 -28427428571.4 +560 523 -1.0656e9 +562 523 48647928.9941 +564 523 -45635164835.2 +566 523 7.62939453125e-6 +568 523 515137785.292 +570 523 -21832439560.4 +572 523 1.0656e9 +524 524 145881844322 +525 524 1.14440917969e-5 +526 524 1595173288.25 +530 524 56230124542.1 +531 524 3.03e8 +525 525 206758839515 +526 525 -813214721.786 +527 525 960797069.597 +529 525 -8.64e7 +530 525 -3.03e8 +531 525 -87543556776.5 +556 525 -767390476.19 +558 525 -1.0656e9 +560 525 -4.89128e10 +562 525 1940301831.5 +564 525 4.76837158203e-7 +566 525 118707261538 +568 525 -960797069.597 +570 525 1.0656e9 +572 525 -60885661538.4 +526 526 266615135.897 +530 526 -174897550.002 +531 526 2473853765.28 +561 526 -33251282.0513 +563 526 2.22e7 +567 526 -8906293.70629 +569 526 1.78813934326e-7 +799 526 -34642424.2424 +801 526 -2.22e7 +805 526 -96593544.231 +807 526 1.8e6 +809 526 -1770070838.25 +810 526 -1001047206.76 +817 526 64101733.5623 +821 526 1066641086.19 +822 526 -1001047206.76 +527 527 232461694.293 +528 527 -1.19209289551e-7 +529 527 238683162.991 +531 527 -2282466333.67 +562 527 28459408.2978 +564 527 515137785.292 +566 527 960797069.597 +568 527 -63327734.8988 +570 527 56785955.3035 +572 527 -2282466333.67 +800 527 32081932.0432 +802 527 -458351829.988 +804 527 1146126406.93 +806 527 -53613584.906 +807 527 6.3125e6 +808 527 1498649350.65 +810 527 1146126406.93 +818 527 -34094787.1573 +819 527 -1.89375e7 +528 528 397179820.18 +561 528 2.22e7 +563 528 -46197802.1978 +567 528 -1.34110450745e-7 +569 528 70873126.8731 +799 528 -2.22e7 +801 528 -52103896.1039 +805 528 -1.8e6 +806 528 -6.3125e6 +807 528 -172567640.693 +818 528 -1.89375e7 +819 528 -33311417.7489 +529 529 117195956044 +531 529 -1.52587890625e-5 +562 529 -515137785.292 +564 529 -21832439560.4 +566 529 -1.0656e9 +568 529 56785955.3035 +570 529 -32691788211.8 +572 529 -2.86102294922e-6 +800 529 458351829.988 +802 529 -17224311688.3 +804 529 1.0656e9 +806 529 -1498649350.65 +808 529 40110857142.9 +810 529 8.64e7 +530 530 136361270729 +531 530 -1.14440917969e-5 +805 530 1770070838.25 +809 530 51427082251.1 +810 530 3.03e8 +817 530 -1066641086.19 +821 530 -35951627705.6 +822 530 9.09e8 +531 531 236025214785 +562 531 -960797069.597 +564 531 -1.0656e9 +566 531 -60885661538.4 +568 531 2282466333.67 +570 531 1.28746032715e-5 +572 531 1.4066107972e11 +800 531 -1146126406.93 +802 531 1.0656e9 +804 531 -72402618181.8 +805 531 -1001047206.76 +806 531 1146126406.93 +808 531 -8.64e7 +809 531 -3.03e8 +810 531 -106033200866 +817 531 1001047206.76 +821 531 9.09e8 +822 531 -32398264069.3 +532 532 186931328.321 +533 532 2.38418579102e-7 +537 532 -6.272e7 +538 532 -1.9371509552e-7 +573 532 42535672.5146 +574 532 1.19209289551e-7 +578 532 -35413333.3333 +579 532 3.9e7 +533 533 3060330827.07 +537 533 2.08616256714e-7 +538 533 -1405657142.86 +573 533 -1.63912773132e-7 +574 533 599568922.306 +578 533 3.9e7 +579 533 -312795238.095 +534 534 40058131.2376 +535 534 -40265073.7118 +536 534 897838.246407 +539 534 -18315537.1846 +540 534 563258049.887 +541 534 235682.539683 +575 534 -12643529.6171 +576 534 -8388557.0233 +577 534 26641774.8074 +580 534 6115443.6022 +581 534 -184724414.21 +582 534 -11302941.7989 +535 535 39108812030.1 +536 535 -1.19209289551e-6 +539 535 -563258049.887 +540 535 15823619047.6 +541 535 1.19209289551e-7 +575 535 -8388557.0233 +576 535 -10094743525.5 +577 535 6.55651092529e-7 +580 535 184724414.21 +581 535 -6209746031.75 +582 535 -5.2e7 +536 536 3339463324.98 +539 536 235682.539683 +540 536 -4.76837158203e-7 +541 536 -1447192380.95 +575 536 -26641774.8074 +576 536 2.68220901489e-7 +577 536 1143313394.6 +580 536 11302941.7989 +581 536 -5.2e7 +582 536 -502516825.397 +537 537 5653802476.19 +539 537 7.62939453125e-6 +541 537 -5.78e6 +543 537 -5048956761.9 +545 537 -9.53674316406e-7 +547 537 -5.78e6 +573 537 -35413333.3333 +574 537 -3.9e7 +578 537 1994173333.33 +579 537 -3e6 +580 537 -1.125e8 +584 537 -2.275e9 +586 537 -1.3375e9 +538 538 1532741755.75 +540 538 1141571428.57 +542 538 -136054.421777 +544 538 -76671979.2679 +546 538 1141571428.57 +548 538 -68027.2108758 +573 538 -3.9e7 +574 538 -312795238.095 +578 538 3e6 +579 538 281319620.811 +581 538 -26041666.6667 +583 538 -15277777.7778 +585 538 2066358.02469 +587 538 -26041666.6667 +589 538 14861111.1111 +539 539 90448845021.1 +540 539 -563258049.887 +541 539 471365.079365 +543 539 2.86102294922e-6 +545 539 -89601914285.7 +575 539 6115443.6022 +576 539 184724414.21 +577 539 -11302941.7989 +578 539 1.125e8 +580 539 18502185810.7 +581 539 184724414.21 +582 539 12746497.3545 +584 539 -1.3375e9 +586 539 -18991666666.7 +540 540 41687548412.7 +541 540 7.15255737305e-7 +542 540 -1.19209289551e-7 +544 540 -1141571428.57 +546 540 12305694444.4 +548 540 1.49011611939e-7 +575 540 -184724414.21 +576 540 -6209746031.75 +577 540 5.2e7 +579 540 -26041666.6667 +580 540 184724414.21 +581 540 -5478839748.68 +582 540 -4e6 +583 540 -2.34375e6 +585 540 26041666.6667 +587 540 -779571759.259 +589 540 27864583.3333 +541 541 1711272380.95 +543 541 5.78e6 +547 541 5.78e7 +575 541 11302941.7989 +576 541 5.2e7 +577 541 -502516825.397 +580 541 -12746497.3545 +581 541 4e6 +582 541 545823492.063 +542 542 1902775274.72 +544 542 -68027.2108759 +546 542 5.96046447754e-8 +548 542 -1859918131.87 +579 542 15277777.7778 +581 542 2.34375e6 +583 542 668229166.666 +585 542 -14861111.1111 +587 542 27864583.3333 +589 542 -655729166.666 +543 543 8387545743.93 +547 543 5042755.10204 +549 543 -1384303267.74 +551 543 9.53674316406e-6 +553 543 -737244.897959 +578 543 -2.275e9 +580 543 1.3375e9 +584 543 2191785714.29 +586 543 -4.76837158203e-6 +590 543 -1056785714.29 +592 543 -1.3375e9 +544 544 84088540.6543 +546 544 -840168367.347 +548 544 -517006.80273 +550 544 -7368553.61192 +552 544 301403061.225 +554 544 -190476.190476 +579 544 2066358.02469 +581 544 26041666.6667 +583 544 14861111.1111 +585 544 -4454847.50117 +587 544 -68160076.5306 +589 544 -21412698.4127 +591 544 2353304.29129 +593 544 -94201743.1973 +595 544 4968253.96825 +545 545 123739128571 +549 545 -1.43051147461e-5 +551 545 -30988642857.1 +578 545 1.3375e9 +580 545 -18991666666.7 +584 545 -1.90734863281e-6 +586 545 24528095238.1 +590 545 -1.3375e9 +592 545 -7373095238.1 +546 546 36393670634.9 +548 546 1.19209289551e-7 +550 546 -301403061.225 +552 546 10931230158.7 +554 546 1.49011611939e-7 +579 546 -26041666.6667 +581 546 -779571759.259 +583 546 -27864583.3333 +585 546 -68160076.5306 +587 546 -3861605489.42 +589 546 2.08616256714e-7 +591 546 94201743.1973 +593 546 -4091283068.78 +595 546 27864583.3333 +547 547 156885714.286 +549 547 737244.897959 +553 547 20642857.1429 +548 548 2652133791.21 +550 548 -190476.190476 +552 548 3.27825546265e-7 +554 548 -629358516.483 +579 548 -14861111.1111 +581 548 -27864583.3333 +583 548 -655729166.666 +585 548 21412698.4127 +587 548 3.72529029846e-7 +589 548 927239583.333 +591 548 -4968253.96825 +593 548 27864583.3333 +595 548 -224010416.667 +549 549 5951352443.08 +553 549 -456969.978074 +555 549 -1995620603.91 +557 549 1.43051147461e-5 +559 549 -1194214.87603 +584 549 -1056785714.29 +586 549 1.3375e9 +590 549 765422077.922 +592 549 -6.67572021484e-6 +596 549 -1208636363.64 +598 549 -1.3375e9 +550 550 19122754.0263 +552 550 76135309.4957 +554 550 -680272.108847 +556 550 -11691032.29 +558 550 377538370.72 +560 550 -149659.863943 +585 550 2353304.29129 +587 550 94201743.1973 +589 550 4968253.96825 +591 550 -5211754.03204 +593 550 6176605.45623 +595 550 -13564213.5642 +597 550 2812153.44445 +599 550 -88025137.741 +601 550 6512626.26263 +551 551 75136525974 +555 551 -1.04904174805e-5 +557 551 -40005025974 +584 551 1.3375e9 +586 551 -7373095238.1 +590 551 3.81469726563e-6 +592 551 14010822510.8 +596 551 -1.3375e9 +598 551 -9054393939.39 +552 552 29126668470.4 +554 552 -2.38418579102e-7 +556 552 -377538370.72 +558 552 10263800505 +560 552 -7.45058059692e-8 +585 552 -94201743.1973 +587 552 -4091283068.78 +589 552 -27864583.3333 +591 552 6176605.45623 +593 552 -6602975438.91 +595 552 2.08616256714e-7 +597 552 88025137.741 +599 552 -3078694234.01 +601 552 27864583.3333 +553 553 93831168.8312 +555 553 1194214.87603 +559 553 26272727.2727 +554 554 1664126498.5 +556 554 -149659.863943 +558 554 2.68220901489e-7 +560 554 -820482267.732 +585 554 -4968253.96825 +587 554 -27864583.3333 +589 554 -224010416.667 +591 554 13564213.5642 +593 554 7.45058059692e-8 +595 554 577296401.515 +597 554 -6512626.26263 +599 554 27864583.3333 +601 554 -290785984.848 +555 555 3276283372.7 +559 555 -172972.623967 +561 555 13931516.9271 +563 555 -4.47034835815e-8 +565 555 -1367187.5 +590 555 -1208636363.64 +592 555 1.3375e9 +596 555 488599696.97 +598 555 1.107e8 +602 555 -35143333.3333 +604 555 -2.22e7 +556 556 119066973.916 +558 556 1561894218.57 +560 556 -584911891.157 +562 556 -68806565.338 +564 556 1939432589.29 +566 556 -37449142.8571 +591 556 2812153.44445 +593 556 88025137.741 +595 556 6512626.26263 +597 556 -65070362.7037 +599 556 -766074862.259 +601 556 -2007413292.93 +603 556 34014668.5185 +605 556 -8.541e8 +607 556 729941333.333 +557 557 41964813103.9 +559 557 11907482.9932 +561 557 -1.49011611938e-8 +563 557 -92307142.8571 +590 557 1.3375e9 +592 557 -9054393939.39 +596 557 -1.107e8 +598 557 8000220359.15 +600 557 24311111.1111 +602 557 -2.22e7 +604 557 -3.53e7 +558 558 115999130131 +560 558 -1.19209289551e-5 +562 558 -1939432589.29 +564 558 86988928571.4 +566 558 8.10623168945e-6 +591 558 -88025137.741 +593 558 -3078694234.01 +595 558 -27864583.3333 +597 558 -766074862.259 +599 558 -44106030455.2 +601 558 -8.405625e7 +603 558 8.541e8 +605 558 -4.1872e10 +607 558 1.0656e9 +559 559 2640616883.12 +561 559 1367187.5 +565 559 4.375e7 +598 559 -24311111.1111 +600 559 729333333.333 +560 560 2.1379883154e11 +562 560 -37449142.8571 +564 560 1.04904174805e-5 +566 560 -82251103557.7 +591 560 -6512626.26263 +593 560 -27864583.3333 +595 560 -290785984.848 +597 560 2007413292.93 +599 560 8.405625e7 +601 560 72233805984.8 +603 560 -729941333.333 +605 560 1.0656e9 +607 560 -3.381424e10 +561 561 208792355.019 +563 561 -1.19209289551e-7 +565 561 -703818.41716 +567 561 -3871.94659382 +569 561 -1.78813934326e-7 +571 561 -2071005.91716 +596 561 -35143333.3333 +598 561 2.22e7 +602 561 -61517179.4872 +604 561 8.94069671631e-8 +608 561 -33259487.1795 +610 561 -2.22e7 +562 562 171872636.405 +564 562 185092178.255 +566 562 -135753142.857 +568 562 -90400622.0876 +570 562 2124524767.54 +572 562 -30427428.5713 +597 562 34014668.5185 +599 562 8.541e8 +601 562 729941333.333 +603 562 -84937317.2752 +605 562 34748520.7101 +607 562 -2076054974.36 +609 562 41683893.2012 +611 562 -819351479.29 +613 562 930369641.026 +563 563 294636813.187 +567 563 3.12924385071e-7 +569 563 -122786813.187 +596 563 2.22e7 +598 563 -3.53e7 +602 563 -8.94069671631e-8 +604 563 26992307.6923 +608 563 -2.22e7 +610 563 -38092307.6923 +564 564 193236687912 +566 564 -7.62939453125e-6 +568 564 -2124524767.54 +570 564 75490901098.9 +572 564 2.38418579102e-6 +597 564 -8.541e8 +599 564 -4.1872e10 +601 564 -1.0656e9 +603 564 34748520.7101 +605 564 -73140676923.1 +607 564 -8.58306884766e-6 +609 564 819351479.29 +611 564 -33117538461.5 +613 564 1.0656e9 +565 565 195192307.692 +567 565 2071005.91716 +571 565 53846153.8461 +566 566 2.2953487409e11 +568 566 -30427428.5713 +570 566 -9.53674316406e-7 +572 566 -104521530533 +597 566 -729941333.333 +599 566 -1.0656e9 +601 566 -3.381424e10 +603 566 2076054974.36 +605 566 5.72204589844e-6 +607 566 88863495384.6 +609 566 -930369641.026 +611 566 1.0656e9 +613 566 -42576935384.6 +567 567 195524252.613 +569 567 2.38418579102e-7 +571 567 -821556.066311 +602 567 -33259487.1795 +604 567 2.22e7 +608 567 -41470209.7902 +610 567 -3.42726707458e-7 +793 567 -32790303.0303 +795 567 -2.22e7 +799 567 -11200380.6662 +801 567 1.9371509552e-7 +803 567 -2892561.98347 +805 567 -34642424.2424 +807 567 2.22e7 +568 568 214898866.509 +570 568 216055161.622 +572 568 -112347428.572 +603 568 41683893.2012 +605 568 819351479.29 +607 568 930369641.026 +609 568 -97826795.3688 +611 568 40561396.6453 +613 568 -2394813762.24 +794 568 48497035.501 +796 568 -778790082.645 +798 568 1120380121.21 +800 568 -114016483.197 +802 568 2340579929.16 +804 568 -25746285.7139 +806 568 32081932.0432 +808 568 -458351829.988 +810 568 -1146126406.93 +569 569 339711488.511 +602 569 2.22e7 +604 569 -38092307.6923 +608 569 2.23517417908e-7 +610 569 41219580.4196 +793 569 -2.22e7 +795 569 -41527272.7273 +799 569 -8.94069671631e-8 +801 569 -151096103.896 +805 569 2.22e7 +807 569 -52103896.1039 +570 570 179229947652 +572 570 3.43322753906e-5 +603 570 -819351479.29 +605 570 -33117538461.5 +607 570 -1.0656e9 +609 570 40561396.6452 +611 570 -56905040559.4 +613 570 1.04904174805e-5 +794 570 778790082.645 +796 570 -27130181818.2 +798 570 1.0656e9 +800 570 -2340579929.16 +802 570 68630129870.1 +804 570 -4.76837158203e-6 +806 570 458351829.988 +808 570 -17224311688.3 +810 570 -1.0656e9 +571 571 234965034.965 +799 571 2892561.98347 +803 571 63636363.6364 +572 572 265581230253 +603 572 -930369641.026 +605 572 -1.0656e9 +607 572 -42576935384.6 +609 572 2394813762.24 +611 572 -1.19209289551e-5 +613 572 103842622657 +794 572 -1120380121.21 +796 572 1.0656e9 +798 572 -50943767272.7 +800 572 -25746285.7139 +802 572 2.86102294922e-6 +804 572 -1.2567025972e11 +806 572 1146126406.93 +808 572 -1.0656e9 +810 572 -72402618181.8 +573 573 167560233.918 +578 573 -49173333.3333 +579 573 -4.47034835815e-8 +614 573 42535672.5146 +615 573 1.19209289551e-7 +625 573 -35413333.3333 +626 573 3.9e7 +574 574 2566275689.22 +578 574 2.98023223877e-8 +579 574 -1162980952.38 +614 574 -1.63912773132e-7 +615 574 599568922.306 +625 574 3.9e7 +626 574 -312795238.095 +575 575 42232364.9004 +576 575 -33554228.0932 +580 575 -19441051.6935 +581 575 596569009.826 +616 575 -12643529.6171 +617 575 -8388557.0233 +618 575 26641774.8074 +627 575 6115443.6022 +628 575 -184724414.21 +629 575 -11302941.7989 +576 576 40271692564.7 +577 576 -9.53674316406e-7 +580 576 -596569009.826 +581 576 17189015873 +582 576 -1.19209289551e-7 +616 576 -8388557.0233 +617 576 -10094743525.5 +618 576 6.55651092529e-7 +627 576 184724414.21 +628 576 -6209746031.75 +629 576 -5.2e7 +577 577 2845734781.4 +581 577 -1.78813934326e-7 +582 577 -1189495873.02 +616 577 -26641774.8074 +617 577 2.68220901489e-7 +618 577 1143313394.6 +627 577 11302941.7989 +628 577 -5.2e7 +629 577 -502516825.397 +578 578 4832038666.67 +582 578 -5.78e6 +584 578 -4150385333.33 +588 578 -5.78e6 +614 578 -35413333.3333 +615 578 -3.9e7 +625 578 1994173333.33 +626 578 -3e6 +627 578 -1.125e8 +637 578 -2.275e9 +639 578 -1.3375e9 +579 579 1296382186.95 +581 579 1108833333.33 +585 579 -74582716.0494 +587 579 1108833333.33 +614 579 -3.9e7 +615 579 -312795238.095 +625 579 3e6 +626 579 281319620.811 +628 579 -26041666.6667 +630 579 -15277777.7778 +638 579 2066358.02469 +640 579 -26041666.6667 +642 579 14861111.1111 +580 580 75519038543 +581 580 -596569009.826 +586 580 -74532866666.7 +616 580 6115443.6022 +617 580 184724414.21 +618 580 -11302941.7989 +625 580 1.125e8 +627 580 18502185810.7 +628 580 184724414.21 +629 580 12746497.3545 +637 580 -1.3375e9 +639 580 -18991666666.7 +581 581 41631727116.4 +582 581 2.38418579102e-7 +583 581 -2.38418579102e-7 +585 581 -1108833333.33 +587 581 12126643518.5 +616 581 -184724414.21 +617 581 -6209746031.75 +618 581 5.2e7 +626 581 -26041666.6667 +627 581 184724414.21 +628 581 -5478839748.68 +629 581 -4e6 +630 581 -2.34375e6 +638 581 26041666.6667 +640 581 -779571759.259 +642 581 27864583.3333 +582 582 1478322539.68 +584 582 5.78e6 +588 582 5.78e7 +616 582 11302941.7989 +617 582 5.2e7 +618 582 -502516825.397 +627 582 -12746497.3545 +628 582 4e6 +629 582 545823492.063 +583 583 1595245512.82 +587 583 5.96046447754e-8 +589 583 -1545245512.82 +626 583 15277777.7778 +628 583 2.34375e6 +630 583 668229166.666 +638 583 -14861111.1111 +640 583 27864583.3333 +642 583 -655729166.666 +584 584 7423974315.35 +588 584 5042755.10204 +590 584 -993588982.021 +592 584 -4.76837158203e-6 +594 584 -737244.897959 +625 584 -2.275e9 +627 584 1.3375e9 +637 584 2191785714.29 +639 584 -4.76837158203e-6 +655 584 -1056785714.29 +657 584 -1.3375e9 +585 585 82568969.7837 +587 585 -785640306.122 +591 585 -7915883.36393 +593 585 323193027.211 +626 585 2066358.02469 +628 585 26041666.6667 +630 585 14861111.1111 +638 585 -4454847.50117 +640 585 -68160076.5306 +642 585 -21412698.4127 +656 585 2353304.29129 +658 585 -94201743.1973 +660 585 4968253.96825 +586 586 103644366667 +592 586 -25438166666.7 +625 586 1.3375e9 +627 586 -18991666666.7 +637 586 -1.90734863281e-6 +639 586 24528095238.1 +655 586 -1.3375e9 +657 586 -7373095238.1 +587 587 36406425264.6 +589 587 -2.38418579102e-7 +591 587 -323193027.211 +593 587 11956673280.4 +595 587 3.42726707458e-7 +626 587 -26041666.6667 +628 587 -779571759.259 +630 587 -27864583.3333 +638 587 -68160076.5306 +640 587 -3861605489.42 +642 587 2.08616256714e-7 +656 587 94201743.1973 +658 587 -4091283068.78 +660 587 27864583.3333 +588 588 156885714.286 +590 588 737244.897959 +594 588 20642857.1429 +589 589 2246404624.54 +593 589 1.78813934326e-7 +595 589 -511159111.722 +626 589 -14861111.1111 +628 589 -27864583.3333 +630 589 -655729166.666 +638 589 21412698.4127 +640 589 3.72529029846e-7 +642 589 927239583.333 +656 589 -4968253.96825 +658 589 27864583.3333 +660 589 -224010416.667 +590 590 5530897897.62 +592 590 7.62939453125e-6 +594 590 -456969.978074 +596 590 -1537308915.6 +598 590 9.53674316406e-7 +600 590 -1194214.87603 +637 590 -1056785714.29 +639 590 1.3375e9 +655 590 765422077.922 +657 590 -6.67572021484e-6 +673 590 -1208636363.64 +675 590 -1.3375e9 +591 591 20249048.8109 +593 591 71194025.1307 +597 591 -12240572.8543 +599 591 394387052.342 +638 591 2353304.29129 +640 591 94201743.1973 +642 591 4968253.96825 +656 591 -5211754.03204 +658 591 6176605.45623 +660 591 -13564213.5642 +674 591 2812153.44445 +676 591 -88025137.741 +678 591 6512626.26263 +592 592 63306439393.9 +596 592 9.53674316406e-7 +598 592 -33034939393.9 +637 592 1.3375e9 +639 592 -7373095238.1 +655 592 3.81469726563e-6 +657 592 14010822510.8 +673 592 -1.3375e9 +675 592 -9054393939.39 +593 593 30360983345.4 +597 593 -394387052.342 +599 593 10960797558.9 +601 593 1.78813934326e-7 +638 593 -94201743.1973 +640 593 -4091283068.78 +642 593 -27864583.3333 +656 593 6176605.45623 +658 593 -6602975438.91 +660 593 2.08616256714e-7 +674 593 88025137.741 +676 593 -3078694234.01 +678 593 27864583.3333 +594 594 93831168.8312 +596 594 1194214.87603 +600 594 26272727.2727 +595 595 1434452526.64 +599 595 2.08616256714e-7 +601 595 -673293414.918 +638 595 -4968253.96825 +640 595 -27864583.3333 +642 595 -224010416.667 +656 595 13564213.5642 +658 595 7.45058059692e-8 +660 595 577296401.515 +674 595 -6512626.26263 +676 595 27864583.3333 +678 595 -290785984.848 +596 596 3022410732.01 +598 596 7.62939453125e-6 +600 596 -172972.623967 +602 596 25258183.5938 +604 596 -1.49011611938e-8 +606 596 -1367187.5 +655 596 -1208636363.64 +657 596 1.3375e9 +673 596 488599696.97 +675 596 1.107e8 +691 596 -35143333.3333 +693 596 -2.22e7 +597 597 145962551.269 +599 597 1754359822.66 +603 597 -77207396.9329 +605 597 2148746875 +656 597 2812153.44445 +658 597 88025137.741 +660 597 6512626.26263 +674 597 -65070362.7037 +676 597 -766074862.259 +678 597 -2007413292.93 +692 597 34014668.5185 +694 597 -8.541e8 +696 597 729941333.333 +598 598 35284536554.4 +602 598 -1.49011611938e-8 +604 598 -7.065e7 +655 598 1.3375e9 +657 598 -9054393939.39 +673 598 -1.107e8 +675 598 8000220359.15 +677 598 24311111.1111 +691 598 -2.22e7 +693 598 -3.53e7 +599 599 126013879092 +601 599 -3.93390655518e-6 +603 599 -2148746875 +605 599 9.78415e10 +607 599 4.76837158203e-6 +656 599 -88025137.741 +658 599 -3078694234.01 +660 599 -27864583.3333 +674 599 -766074862.259 +676 599 -44106030455.2 +678 599 -8.405625e7 +692 599 8.541e8 +694 599 -4.1872e10 +696 599 1.0656e9 +600 600 3057378787.88 +602 600 1367187.5 +606 600 4.375e7 +675 600 -24311111.1111 +677 600 729333333.333 +601 601 219109596973 +605 601 3.81469726563e-6 +607 601 -65921183557.7 +656 601 -6512626.26263 +658 601 -27864583.3333 +660 601 -290785984.848 +674 601 2007413292.93 +676 601 8.405625e7 +678 601 72233805984.8 +692 601 -729941333.333 +694 601 1.0656e9 +696 601 -3.381424e10 +602 602 223500560.148 +604 602 1.19209289551e-7 +606 602 -703818.41716 +608 602 11081256.2585 +610 602 5.96046447754e-8 +612 602 -2071005.91716 +673 602 -35143333.3333 +675 602 2.22e7 +691 602 -61517179.4872 +693 602 8.94069671631e-8 +709 602 -33259487.1795 +711 602 -2.22e7 +603 603 196213706.705 +605 603 157293361.686 +609 603 -100478998.661 +611 603 2306040236.69 +674 603 34014668.5185 +676 603 8.541e8 +678 603 729941333.333 +692 603 -84937317.2752 +694 603 34748520.7101 +696 603 -2076054974.36 +710 603 41683893.2012 +712 603 -819351479.29 +714 603 930369641.026 +604 604 261111538.462 +610 604 -97661538.4615 +673 604 2.22e7 +675 604 -3.53e7 +691 604 -8.94069671631e-8 +693 604 26992307.6923 +709 604 -2.22e7 +711 604 -38092307.6923 +605 605 209177892308 +607 605 3.81469726563e-6 +609 605 -2306040236.69 +611 605 83585846153.8 +613 605 -7.15255737305e-6 +674 605 -8.541e8 +676 605 -4.1872e10 +678 605 -1.0656e9 +692 605 34748520.7101 +694 605 -73140676923.1 +696 605 -8.58306884766e-6 +710 605 819351479.29 +712 605 -33117538461.5 +714 605 1.0656e9 +606 606 195192307.692 +608 606 2071005.91716 +612 606 53846153.8461 +607 607 2.0078186486e11 +611 607 2.86102294922e-6 +613 607 -84971401301.8 +674 607 -729941333.333 +676 607 -1.0656e9 +678 607 -3.381424e10 +692 607 2076054974.36 +694 607 5.72204589844e-6 +696 607 88863495384.6 +710 607 -930369641.026 +712 607 1.0656e9 +714 607 -42576935384.6 +608 608 203920336.529 +610 608 -1.19209289551e-7 +612 608 -821556.066311 +691 608 -33259487.1795 +693 608 2.22e7 +709 608 -41470209.7902 +711 608 -3.42726707458e-7 +763 608 -32790303.0303 +765 608 -2.22e7 +793 608 38407.2126215 +795 608 -1.49011611938e-8 +797 608 -2892561.98347 +799 608 -32790303.0303 +801 608 2.22e7 +609 609 241050530.745 +611 609 183606044.306 +692 609 41683893.2012 +694 609 819351479.29 +696 609 930369641.026 +710 609 -97826795.3688 +712 609 40561396.6453 +714 609 -2394813762.24 +764 609 48497035.501 +766 609 -778790082.645 +768 609 1120380121.21 +794 609 -125238498.751 +796 609 2489646280.99 +800 609 48497035.501 +802 609 -778790082.645 +804 609 -1120380121.21 +610 610 296861538.462 +691 610 2.22e7 +693 610 -38092307.6923 +709 610 2.23517417908e-7 +711 610 41219580.4196 +763 610 -2.22e7 +765 610 -41527272.7273 +793 610 1.49011611938e-8 +795 610 -1.224e8 +799 610 2.22e7 +801 610 -41527272.7273 +611 611 189522528671 +692 611 -819351479.29 +694 611 -33117538461.5 +696 611 -1.0656e9 +710 611 40561396.6452 +712 611 -56905040559.4 +714 611 1.04904174805e-5 +764 611 778790082.645 +766 611 -27130181818.2 +768 611 1.0656e9 +794 611 -2489646280.99 +796 611 74765818181.8 +798 611 3.33786010742e-6 +800 611 778790082.645 +802 611 -27130181818.2 +804 611 -1.0656e9 +612 612 234965034.965 +793 612 2892561.98347 +797 612 63636363.6364 +613 613 229182111931 +692 613 -930369641.026 +694 613 -1.0656e9 +696 613 -42576935384.6 +710 613 2394813762.24 +712 613 -1.19209289551e-5 +714 613 103842622657 +764 613 -1120380121.21 +766 613 1.0656e9 +768 613 -50943767272.7 +798 613 -102923030629 +800 613 1120380121.21 +802 613 -1.0656e9 +804 613 -50943767272.7 +614 614 186931328.321 +619 614 -45866666.6667 +620 614 3.9e7 +625 614 -6.272e7 +626 614 1.34110450745e-7 +631 614 73690893.9014 +632 614 -1.49011611939e-7 +615 615 3060330827.07 +619 615 3.9e7 +620 615 -427833333.333 +625 615 -2.38418579102e-7 +626 615 -1405657142.86 +631 615 7.45058059692e-8 +632 615 858596491.228 +616 616 40058131.2376 +617 616 -40265073.7118 +618 616 -897838.246407 +621 616 3547896.19552 +622 616 -105989417.989 +623 616 -11538624.3386 +627 616 -18315537.1846 +628 616 563258049.887 +629 616 -235682.539683 +633 616 -7080234.82109 +634 616 -11743979.8326 +635 616 25743936.561 +617 617 39108812030.1 +618 617 2.38418579102e-7 +621 617 105989417.989 +622 617 -3890444444.44 +623 617 -5.2e7 +627 617 -563258049.887 +628 617 15823619047.6 +629 617 -4.47034835815e-7 +633 617 -11743979.8326 +634 617 -4915421888.05 +635 617 5.66244125366e-7 +618 618 3339463324.98 +621 618 11538624.3386 +622 618 -5.2e7 +623 618 -713422222.222 +627 618 -235682.539683 +628 618 1.19209289551e-7 +629 618 -1447192380.95 +633 618 -25743936.561 +634 618 -3.57627868652e-7 +635 618 1562929546.09 +619 619 3238092236.7 +620 619 -3.9e7 +621 619 -1.3375e9 +622 619 -8.41657563775e-7 +623 619 -113601.190476 +624 619 15566893.424 +625 619 2936409523.81 +626 619 3e6 +627 619 1.125e8 +631 619 -38630281.3389 +632 619 -3000000.00001 +633 619 -1.03199022597e-8 +634 619 -8.38106984835e-7 +635 619 41413.6904762 +636 619 15566893.424 +637 619 -3116428571.43 +639 619 1.3375e9 +643 619 -2974046194.15 +644 619 2.69623323612e-6 +645 619 -1.125e8 +646 619 7.90620214002e-7 +647 619 -113601.190476 +648 619 -14716553.288 +649 619 469953.080571 +650 619 -2.52212300695e-6 +651 619 9.17220186618e-8 +652 619 7.94170792942e-7 +653 619 41413.6904762 +654 619 -14716553.288 +620 620 1182164947.99 +621 620 2.75e7 +622 620 293154761.905 +623 620 2.60200821995e-9 +624 620 15141723.356 +625 620 -3e6 +626 620 408924337.725 +628 620 34970238.0952 +630 620 15141723.356 +631 620 2999999.99999 +632 620 -1078380952.38 +633 620 -2.5e6 +634 620 1.91966409384e-20 +635 620 -9.48570719955e-10 +636 620 -3.56555987474e-7 +638 620 -2094378.75679 +640 620 34970238.0952 +642 620 -14929138.322 +643 620 2.42673323612e-6 +644 620 91576521.6139 +645 620 2.5e6 +646 620 293154761.905 +647 620 2.60200821996e-9 +648 620 -14929138.322 +649 620 -2.52212300695e-6 +650 620 -174357142.857 +651 620 -2.75e7 +652 620 -1.8190292924e-20 +653 620 -9.48570719954e-10 +654 620 3.3707914912e-7 +621 621 52699918606.7 +622 621 -264973544.974 +623 621 -12275132.2751 +624 621 8.39055555555e-7 +625 621 -1.125e8 +627 621 26073821365.6 +628 621 105989417.989 +629 621 -12275132.2751 +631 621 1.04203907264e-7 +632 621 2.5e6 +633 621 -9962868.48072 +634 621 -264973544.974 +635 621 11538624.3386 +636 621 8.39055555555e-7 +637 621 1.3375e9 +639 621 -26422619047.6 +643 621 1.125e8 +644 621 -2.5e6 +645 621 -52331788095.2 +646 621 4.26144295347e-20 +647 621 -6.12310416667e-9 +648 621 -7.93222222222e-7 +649 621 9.17220186618e-8 +650 621 -2.75e7 +651 621 -12917857.1429 +652 621 4.28058057396e-20 +653 621 2.23219791667e-9 +654 621 -7.93222222222e-7 +622 622 14991684854.5 +623 622 5.2e7 +624 622 27864583.3334 +626 622 34970238.0952 +627 622 105989417.989 +628 622 -1751851521.16 +629 622 4e6 +630 622 2343749.99991 +631 622 8.40004126275e-7 +632 622 -1.92400945114e-20 +633 622 264973544.974 +634 622 7229111111.11 +635 622 -4e6 +636 622 -2.6098818998e-5 +638 622 -34970238.0952 +640 622 -21122685.1851 +642 622 -27864583.3334 +643 622 7.95824230442e-7 +644 622 -293154761.905 +645 622 4.28949260208e-20 +646 622 3302372685.18 +647 622 3.51898077287e-8 +648 622 -2343749.99987 +649 622 -7.94170792942e-7 +650 622 1.8190292924e-20 +651 622 -4.28058057396e-20 +652 622 -1.35656089918e-18 +653 622 -4.67283493953e-8 +654 622 2.51482485615e-5 +623 623 916602976.19 +624 623 -572916.666666 +627 623 12275132.2751 +628 623 -4e6 +629 623 744355555.556 +631 623 41413.6904762 +632 623 -9.48570719954e-10 +633 623 11538624.3386 +634 623 4e6 +635 623 -853292559.524 +636 623 -52083.3333329 +643 623 113601.190476 +644 623 -2.60200821995e-9 +645 623 6.12310416666e-9 +646 623 2.95752243953e-8 +647 623 1413789.68254 +648 623 52083.3333329 +649 623 -41413.6904762 +650 623 9.48570719954e-10 +651 623 -2.23219791667e-9 +652 623 -4.67283493953e-8 +653 623 -691914.68254 +654 623 572916.666666 +624 624 1602766369.05 +626 624 -15141723.356 +628 624 -2343750.00009 +630 624 929806547.618 +631 624 -15566893.424 +632 624 3.56555987474e-7 +633 624 -8.39055555555e-7 +634 624 -2.60964330853e-5 +635 624 52083.3333338 +636 624 484186011.904 +638 624 14929138.322 +640 624 -27864583.3334 +642 624 -920877976.189 +643 624 -14716553.288 +644 624 -14929138.322 +645 624 -7.93222222222e-7 +646 624 2343750.00013 +647 624 -52083.3333338 +648 624 -1549194940.47 +649 624 14716553.288 +650 624 -3.3707914912e-7 +651 624 7.93222222222e-7 +652 624 2.51482485615e-5 +653 624 572916.666666 +654 624 -466328869.047 +625 625 5653802476.19 +627 625 -.000129699707031 +629 625 -5.78e6 +631 625 -45866666.6667 +632 625 -3.9e7 +637 625 -5048956761.9 +639 625 .00011157989502 +641 625 -5.78e6 +643 625 -3116428571.43 +645 625 -1.3375e9 +626 626 1532741755.75 +628 626 1141571428.57 +630 626 136054.421784 +631 626 -3.9e7 +632 626 -427833333.333 +638 626 -76671979.2679 +640 626 1141571428.57 +642 626 68027.2108819 +644 626 -2094378.75679 +646 626 34970238.0952 +648 626 14929138.322 +627 627 90448845021.1 +628 627 -563258049.887 +629 627 -471365.079365 +633 627 3547896.19552 +634 627 105989417.989 +635 627 -11538624.3386 +637 627 .000140190124512 +639 627 -89601914285.7 +643 627 -1.3375e9 +645 627 -26422619047.6 +628 628 41687548412.7 +630 628 8.96453857422e-5 +633 628 -105989417.989 +634 628 -3890444444.44 +635 628 5.2e7 +638 628 -1141571428.57 +640 628 12305694444.4 +642 628 .000106051564217 +644 628 -34970238.0952 +646 628 -21122685.1852 +648 628 27864583.3332 +629 629 1711272380.95 +633 629 11538624.3386 +634 629 5.2e7 +635 629 -713422222.222 +637 629 5.78e6 +641 629 5.78e7 +630 630 1902775274.72 +638 630 68027.2108693 +640 630 .000106781721115 +642 630 -1859918131.87 +644 630 -14929138.322 +646 630 27864583.3332 +648 630 -920877976.189 +631 631 143411313.97 +632 631 9.05990600586e-6 +633 631 -1.53901054996e-6 +634 631 7.65367109056e-7 +635 631 -588229511.278 +636 631 125627.35159 +643 631 469953.080571 +644 631 -5.48662300695e-6 +645 631 1.35148392342e-6 +646 631 -7.92273651502e-7 +647 631 41413.6904762 +648 631 14716553.288 +649 631 -40196659.2219 +650 631 2.52522663289e-6 +651 631 3.21718590866e-8 +652 631 -7.29593840466e-7 +653 631 -588229511.278 +654 631 62813.6757908 +632 632 2439082075.19 +634 632 5.78e6 +635 632 2.67978998935e-9 +636 632 3.79549480112e-7 +643 632 -5.48662300695e-6 +644 632 -174357142.857 +645 632 2.75e7 +646 632 1.81468393511e-20 +647 632 -9.48570719955e-10 +648 632 -3.3707914912e-7 +649 632 2.77210163289e-6 +650 632 240366546.366 +651 632 -2.53319740295e-7 +652 632 5.78e6 +653 632 2.67978998935e-9 +654 632 -2.93721718591e-7 +633 633 72179542.7723 +634 633 -23487959.6652 +635 633 -25743936.561 +636 633 -7.68046899045e-7 +643 633 1.35148392342e-6 +644 633 2.75e7 +645 633 -12917857.1429 +646 633 -4.2703549816e-20 +647 633 2.23219791667e-9 +648 633 7.93222222222e-7 +649 633 1.43340405453e-7 +650 633 5.96046447754e-8 +651 633 -23162406.015 +652 633 -4.25952335062e-20 +653 633 -3.41704759731e-6 +654 633 7.26914050477e-7 +634 634 19088565747.7 +635 634 -2.38418579102e-7 +636 634 -2.82128174112e-5 +643 634 7.92273651502e-7 +644 634 -1.81468393511e-20 +645 634 4.2703549816e-20 +646 634 -1.3537316839e-18 +647 634 1.50320672714e-8 +648 634 2.51220035218e-5 +649 634 -7.24234260487e-7 +650 634 -5.78e6 +651 634 -4.23140330951e-20 +652 634 5.78e7 +653 634 3.07947441033e-8 +654 634 2.71264990471e-5 +635 635 13681227930.9 +636 635 4.13507223129e-7 +643 635 -41413.6904762 +644 635 9.48570719955e-10 +645 635 -2.23219791667e-9 +646 635 1.50320672714e-8 +647 635 -691914.68254 +648 635 -572916.666667 +649 635 588229511.278 +650 635 -2.67978998935e-9 +651 635 3.41704759731e-6 +652 635 3.593797327e-8 +653 635 5882879908.1 +654 635 -4.14904206991e-7 +636 636 953495826.103 +643 636 -14716553.288 +644 636 3.3707914912e-7 +645 636 -7.93222222222e-7 +646 636 2.51220035218e-5 +647 636 -572916.666667 +648 636 -466328869.047 +649 636 62813.6757911 +650 636 -3.60769718591e-7 +651 636 7.26914050477e-7 +652 636 2.71288150584e-5 +653 636 -4.27244231105e-7 +654 636 -878307856.179 +637 637 8387545743.92 +639 637 -4.57763671875e-5 +641 637 5042755.10204 +643 637 3589642857.14 +645 637 5.00679016113e-5 +655 637 -1384303267.74 +657 637 -4.76837158203e-6 +659 637 -737244.897959 +661 637 -1.2875e9 +663 637 -1.3375e9 +638 638 84088540.6543 +640 638 -840168367.347 +642 638 517006.802723 +644 638 560293.727279 +646 638 -95424107.1428 +648 638 -20895691.61 +656 638 -7368553.61192 +658 638 301403061.225 +660 638 190476.190476 +662 638 1521262.44016 +664 638 -60453869.0476 +666 638 5158730.15873 +639 639 123739128571 +643 639 7.00950622559e-5 +645 639 34969047619 +655 639 2.86102294922e-6 +657 639 -30988642857.1 +661 639 -1.3375e9 +663 639 -9858333333.33 +640 640 36393670634.9 +642 640 8.71419906616e-5 +644 640 -95424107.1428 +646 640 -1304208002.64 +648 640 -8.6709856987e-5 +656 640 -301403061.225 +658 640 10931230158.7 +660 640 4.32133674622e-7 +662 640 60453869.0476 +664 640 -2731018518.52 +666 640 27864583.3333 +641 641 156885714.286 +655 641 737244.897959 +659 641 20642857.1429 +642 642 2652133791.21 +644 642 20895691.61 +646 642 -8.61436128616e-5 +648 642 1276421130.95 +656 642 190476.190476 +660 642 -629358516.483 +662 642 -5158730.15873 +664 642 27864583.3333 +666 642 -321614583.333 +643 643 4676081067.02 +644 643 4.26550684864e-5 +645 643 -.000145485776301 +646 643 -8.59710305768e-7 +647 643 41986.6071429 +648 643 22511337.8685 +649 643 -718892.440127 +650 643 -3.873947362e-5 +651 643 5.10726903616e-8 +652 643 -8.57642615091e-7 +653 643 20993.3035715 +654 643 22511337.8685 +655 643 -1.2875e9 +657 643 1.3375e9 +661 643 -887646577.873 +662 643 1.63100831296e-5 +663 643 -1.125e8 +664 643 1.03080563823e-8 +665 643 -71614.5833333 +666 643 -4563492.06349 +667 643 146358.644731 +668 643 -1.71657882251e-5 +669 643 -1.0880416226e-6 +670 643 1.59263259992e-8 +671 643 62406.9940476 +672 643 -4563492.06349 +644 644 1150775484.33 +645 644 1.19209289551e-7 +646 644 -190848214.286 +647 644 4.00120582954e-10 +648 644 20895691.6099 +649 644 -3.89943902867e-5 +650 644 -1042964285.71 +651 644 3.12924385071e-7 +652 644 1.99795111615e-20 +653 644 -1.66757009401e-9 +654 644 -6.47671507756e-7 +656 644 1521262.44016 +658 644 -60453869.0476 +660 644 -5158730.15873 +661 644 1.62954997962e-5 +662 644 386232245.213 +663 644 2.5e6 +664 644 102306547.619 +665 644 3.00212880291e-9 +666 644 -5158730.15873 +667 644 -1.71657882251e-5 +668 644 -4.1125e8 +669 644 -2.75e7 +670 644 -6.67641697837e-22 +671 644 -2.61614081396e-9 +672 644 1.91304484757e-7 +645 645 71948770238.1 +646 645 -4.51526784135e-20 +647 645 5.91422829861e-9 +648 645 8.59310185185e-7 +649 645 1.46152055441e-7 +650 645 -2.53319740295e-7 +651 645 -19305357.1429 +652 645 -4.53276679986e-20 +653 645 -2.05017751736e-9 +654 645 8.59310185185e-7 +655 645 1.3375e9 +657 645 -9858333333.33 +661 645 1.125e8 +662 645 -2.5e6 +663 645 -18250791666.7 +664 645 3.00651644483e-23 +665 645 -2.08875868056e-10 +666 645 -1.33101851852e-8 +667 645 -1.0880416226e-6 +668 645 -2.75e7 +669 645 -2.20625e7 +670 645 4.64517841642e-23 +671 645 1.82020399306e-10 +672 645 -1.33101851852e-8 +646 646 10210458002.6 +647 646 1.93733559697e-7 +648 646 6.34239487118e-5 +649 646 8.60977755279e-7 +650 646 -2.01553981565e-20 +651 646 4.52406728964e-20 +652 646 1.40169637983e-18 +653 646 -1.6560330176e-7 +654 646 -2.66877983094e-5 +656 646 60453869.0476 +658 646 -2731018518.52 +660 646 -27864583.3333 +661 646 1.63123139881e-8 +662 646 -102306547.619 +663 646 4.75775824653e-23 +664 646 3902893518.52 +665 646 1.16816454475e-7 +666 646 -2.34375e6 +667 646 -1.59263259992e-8 +668 646 6.67641697837e-22 +669 646 -4.64517841642e-23 +670 646 -5.87078687156e-21 +671 646 -1.07527888007e-7 +672 646 4.67365554729e-7 +647 647 6357837.30159 +648 647 1.06543302536e-6 +649 647 20993.3035714 +650 647 -1.66757009401e-9 +651 647 -2.05017751736e-9 +652 647 -1.70914065649e-7 +653 647 -4398462.30159 +654 647 1.07544474304e-6 +661 647 71614.5833333 +662 647 -3.00212880291e-9 +663 647 2.08875868055e-10 +664 647 1.16512635031e-7 +665 647 2782986.11111 +666 647 52083.3333327 +667 647 -62406.9940476 +668 647 2.61614081396e-9 +669 647 -1.82020399306e-10 +670 647 -1.07527888007e-7 +671 647 -2525173.61111 +672 647 572916.666666 +648 648 2262427827.38 +649 648 -22511337.8685 +650 648 6.47671507756e-7 +651 648 -8.59310185185e-7 +652 648 -2.66858174892e-5 +653 648 1.0933727026e-6 +654 648 686191220.238 +656 648 5158730.15873 +658 648 -27864583.3333 +660 648 -321614583.333 +661 648 -4563492.06349 +662 648 -5158730.15873 +663 648 -1.33101851852e-8 +664 648 2.34375e6 +665 648 -52083.333334 +666 648 -509661458.333 +667 648 4563492.06349 +668 648 -1.91304484757e-7 +669 648 1.33101851852e-8 +670 648 4.67365554729e-7 +671 648 572916.666666 +672 648 -152005208.333 +649 649 42525842.9016 +650 649 4.29871968604e-5 +651 649 -1.58874657081e-6 +652 649 7.54610744573e-7 +653 649 513079974.49 +654 649 477383.936033 +661 649 146358.644731 +662 649 -1.73262048918e-5 +663 649 1.21759329803e-6 +664 649 -1.06940443712e-8 +665 649 62406.9940476 +666 649 4563492.06349 +667 649 -2088098.80975 +668 649 1.77111146422e-5 +669 649 -2.04169920388e-7 +670 649 3.34845968231e-9 +671 649 -75149536.7884 +672 649 175878.292222 +650 650 2367545743.93 +651 650 1.19209289551e-7 +652 650 -5042755.10204 +653 650 5.75585980031e-10 +654 650 5.84204942288e-7 +661 650 -1.73262048918e-5 +662 650 -4.1125e8 +663 650 2.75e7 +664 650 4.48301129911e-22 +665 650 -2.61614081396e-9 +666 650 -1.91304484757e-7 +667 650 1.77030045231e-5 +668 650 820659138.279 +669 650 -2.98023223877e-8 +670 650 737244.897959 +671 650 3.25537596937e-9 +672 650 -1.72744144762e-7 +651 651 108985714.286 +652 651 4.49432512285e-20 +653 651 2.97898505667e-6 +654 651 -7.55186330553e-7 +661 651 1.21759329803e-6 +662 651 2.75e7 +663 651 -2.20625e7 +664 651 -3.11909627494e-23 +665 651 1.82020399306e-10 +666 651 1.33101851852e-8 +667 651 -1.08167457847e-8 +668 651 -1.04308128357e-7 +669 651 28462406.015 +670 651 4.16565837471e-23 +671 651 -4.38062540638e-7 +672 651 -6.60383565168e-9 +652 652 156885714.286 +653 652 2.68111560157e-7 +654 652 -2.969411397e-5 +661 652 1.06940443712e-8 +662 652 -4.48301129911e-22 +663 652 3.11909627494e-23 +664 652 -5.59058818328e-21 +665 652 -1.04185874118e-7 +666 652 4.19331493882e-7 +667 652 9.85921162106e-9 +668 652 -737244.897959 +669 652 6.14678227692e-23 +670 652 20642857.1429 +671 652 1.2663380547e-7 +672 652 1.04389998578e-6 +653 653 15973123015.9 +654 653 1.08778476715e-6 +661 653 -62406.9940476 +662 653 2.61614081396e-9 +663 653 -1.82020399306e-10 +664 653 -1.04185874118e-7 +665 653 -2525173.61111 +666 653 -572916.666667 +667 653 75149536.7884 +668 653 -3.25537596938e-9 +669 653 4.38062540638e-7 +670 653 1.26464844657e-7 +671 653 2105824456.98 +672 653 -6.40982761979e-7 +654 654 1416479029.3 +661 654 -4563492.06349 +662 654 1.91304484757e-7 +663 654 -1.33101851852e-8 +664 654 4.19331493882e-7 +665 654 -572916.666667 +666 654 -152005208.333 +667 654 175878.292222 +668 654 -1.81345335238e-7 +669 654 -6.60383565168e-9 +670 654 1.04792817692e-6 +671 654 -6.46570697427e-7 +672 654 -252456887.411 +655 655 5951352443.08 +657 655 -3.0517578125e-5 +659 655 -456969.978074 +661 655 1757305194.81 +663 655 1.04904174805e-5 +673 655 -1995620603.91 +675 655 -2.00271606445e-5 +677 655 -1194214.87603 +679 655 -1541233766.23 +681 655 -1.3375e9 +656 656 19122754.0263 +658 656 76135309.4957 +660 656 680272.108845 +662 656 -3213782.46015 +664 656 8647247.63872 +666 656 -12883941.4554 +674 656 -11691032.29 +676 656 377538370.72 +678 656 149659.863944 +680 656 1675648.19189 +682 656 -51806621.4089 +684 656 6662286.12657 +657 657 75136525974 +661 657 -1.14440917969e-5 +663 657 20443722943.7 +673 657 1.90734863281e-5 +675 657 -40005025974 +679 657 -1.3375e9 +681 657 -12311580086.6 +658 658 29126668470.4 +660 658 -5.96046447754e-7 +662 658 8647247.63872 +664 658 -3846744979.56 +666 658 -3.8743019104e-7 +674 658 -377538370.72 +676 658 10263800505 +678 658 6.25848770142e-7 +680 658 51806621.4089 +682 658 -1955560816.5 +684 658 27864583.3333 +659 659 93831168.8312 +673 659 1194214.87603 +677 659 26272727.2727 +660 660 1664126498.5 +662 660 12883941.4554 +664 660 4.17232513428e-7 +666 660 779643533.55 +674 660 149659.863944 +676 660 -2.68220901489e-7 +678 660 -820482267.732 +680 660 -6662286.12657 +682 660 27864583.3333 +684 660 -413386093.073 +661 661 3186357115.25 +662 661 5.65233732035e-5 +663 661 1.49410839138e-5 +664 661 -4.2869789983e-8 +665 661 -3804.78896099 +666 661 15009791.7955 +667 661 -479820.680366 +668 661 -5.457450213e-5 +669 661 1.05402985537e-7 +670 661 -4.37242480146e-8 +671 661 -1902.39448047 +672 661 15009791.7955 +673 661 -1541233766.23 +675 661 1.3375e9 +679 661 -1227146991.32 +680 661 1.05272413681e-5 +681 661 -1.125e8 +682 661 1.50019521123e-8 +683 661 -75419.3722944 +684 661 -6194599.05174 +685 661 198487.410865 +686 661 -1.1445407346e-5 +687 661 -9.11004957938e-7 +688 661 1.97657636976e-8 +689 661 60504.5995671 +690 661 -6194599.05174 +662 662 1460404261.61 +664 662 17294495.2774 +665 662 -3.58859373928e-10 +666 662 12883941.4554 +667 662 -5.45748430391e-5 +668 662 -1403003246.75 +669 662 4.47034835815e-8 +670 662 1.68962195585e-21 +671 662 4.95598657706e-10 +672 662 -5.73786741729e-7 +674 662 1675648.19189 +676 662 -51806621.4089 +678 662 -6662286.12657 +679 662 1.05129989438e-5 +680 662 296237507.867 +681 662 2.5e6 +682 662 119601042.897 +683 662 2.64326942898e-9 +684 662 -6662286.12657 +685 662 -1.1445407346e-5 +686 662 -328603896.104 +687 662 -2.75e7 +688 662 -6.92742956258e-22 +689 662 -2.12054215626e-9 +690 662 2.17105947718e-7 +663 663 43521820887.4 +664 663 -1.23290254099e-22 +665 663 -5.95507120706e-12 +666 663 4.32286493569e-8 +667 663 7.10379061723e-8 +668 663 5.96046447754e-8 +669 663 -31026785.7143 +670 663 -1.26107228693e-22 +671 663 -9.6739641749e-12 +672 663 4.32286493569e-8 +673 663 1.3375e9 +675 663 -12311580086.6 +679 663 1.125e8 +680 663 -2.5e6 +681 663 -23473410173.2 +682 663 4.27328332897e-23 +683 663 -2.14830939263e-10 +684 663 -1.76452215413e-8 +685 663 -9.11004957938e-7 +686 663 -2.75e7 +687 663 -18339285.7143 +688 663 5.63024784113e-23 +689 663 1.7234643513e-10 +690 663 -1.76452215413e-8 +664 664 9173449525.01 +665 664 2.88242785888e-7 +666 664 -6.12790123232e-7 +667 664 4.27330506992e-8 +668 664 -1.61892129525e-21 +669 664 1.22927071684e-22 +670 664 -5.8900782309e-21 +671 664 -2.4366296987e-7 +672 664 -1.27492069214e-6 +674 664 51806621.4089 +676 664 -1955560816.5 +678 664 -27864583.3333 +679 664 2.02884909703e-8 +680 664 -119601042.897 +681 664 5.77914591275e-23 +682 664 3447038089.23 +683 664 7.97182754415e-8 +684 664 -2.34375e6 +685 664 -1.97657636976e-8 +686 664 6.92742956258e-22 +687 664 -5.63024784113e-23 +688 664 -4.13565738121e-21 +689 664 -6.97018613001e-8 +690 664 5.94271407254e-7 +665 665 7428075.39682 +666 665 1.4491379261e-6 +667 665 -1902.39448057 +668 665 4.9559865771e-10 +669 665 -9.67396417517e-12 +670 665 -2.43670072143e-7 +671 665 -6256200.39682 +672 665 1.46776437759e-6 +679 665 75419.3722943 +680 665 -2.64326942898e-9 +681 665 2.14830939263e-10 +682 665 7.94215582698e-8 +683 665 2270337.30159 +684 665 52083.3333325 +685 665 -60504.5995671 +686 665 2.12054215626e-9 +687 665 -1.7234643513e-10 +688 665 -6.97018613001e-8 +689 665 -1942212.30159 +690 665 572916.666666 +666 666 1450529288.42 +667 666 -15009791.7955 +668 666 5.73786741729e-7 +669 666 -4.32286493569e-8 +670 666 -1.2756366313e-6 +671 666 1.47335231304e-6 +672 666 442868979.978 +674 666 6662286.12657 +676 666 -27864583.3333 +678 666 -413386093.073 +679 666 -6194599.05174 +680 666 -6662286.12657 +681 666 -1.76452215413e-8 +682 666 2.34375e6 +683 666 -52083.3333341 +684 666 -673010687.229 +685 666 6194599.05174 +686 666 -2.17105947718e-7 +687 666 1.76452215413e-8 +688 666 5.94271407254e-7 +689 666 572916.666666 +690 666 -201578057.359 +667 667 6500668.81466 +668 667 6.40749560409e-5 +669 667 -1.06501463871e-7 +670 667 -2.71572112834e-8 +671 667 -46494850.5229 +672 667 628136.757936 +679 667 198487.410865 +680 667 -1.16020740127e-5 +681 667 1.01661408968e-6 +682 667 -1.55246793851e-8 +683 667 60504.5995671 +684 667 6194599.05174 +685 667 -4095353.07076 +686 667 1.27227623557e-5 +687 667 -1.3804889441e-7 +688 667 6.29312379943e-9 +689 667 -121644387.311 +690 667 138190.086745 +668 668 3056273837.47 +669 668 2.38418579102e-7 +670 668 456969.978074 +671 668 -7.75266259409e-11 +672 668 4.9777028581e-7 +679 668 -1.16020740127e-5 +680 668 -328603896.104 +681 668 2.75e7 +682 668 5.44103048924e-22 +683 668 -2.12054215626e-9 +684 668 -2.17105947718e-7 +685 668 1.27146184164e-5 +686 668 634345219.736 +687 668 -2.08616256714e-7 +688 668 1194214.87603 +689 668 3.17784934343e-9 +690 668 -1.7051087233e-7 +669 669 106194463.431 +670 669 -1.93017666293e-22 +671 669 -2.54627776545e-7 +672 669 2.72347379093e-8 +679 669 1.01661408968e-6 +680 669 2.75e7 +681 669 -18339285.7143 +682 669 -4.42218140059e-23 +683 669 1.72346435131e-10 +684 669 1.76452215413e-8 +685 669 4.3383236352e-9 +686 669 -8.94069671631e-8 +687 669 15719070.4033 +688 669 6.12216797279e-23 +689 669 -6.92690317183e-7 +690 669 -9.47097314286e-9 +670 670 93831168.8312 +671 670 3.26505624745e-7 +672 670 -3.08065205654e-6 +679 670 1.55246793851e-8 +680 670 -5.44103048924e-22 +681 670 4.42218140059e-23 +682 670 -3.90687431242e-21 +683 670 -6.64379724112e-8 +684 670 5.54112677096e-7 +685 670 1.26488224863e-8 +686 670 -1194214.87603 +687 670 8.10672257087e-23 +688 670 26272727.2727 +689 670 9.58532577525e-8 +690 670 1.4317530024e-6 +671 671 9560935957.32 +672 671 2.27242708206e-6 +679 671 -60504.5995671 +680 671 2.12054215626e-9 +681 671 -1.72346435131e-10 +682 671 -6.64379724112e-8 +683 671 -1942212.30159 +684 671 -572916.666667 +685 671 121644387.311 +686 671 -3.17784934343e-9 +687 671 6.92690317183e-7 +688 671 9.56835923484e-8 +689 671 2677463070.55 +690 671 -1.60443596542e-6 +672 672 983881852.796 +679 672 -6194599.05174 +680 672 2.17105947718e-7 +681 672 -1.76452215413e-8 +682 672 5.54112677096e-7 +683 672 -572916.666667 +684 672 -201578057.359 +685 672 138190.086745 +686 672 -1.84117684251e-7 +687 672 -9.47097314286e-9 +688 672 1.43471940278e-6 +689 672 -1.61561183631e-6 +690 672 -355485115.761 +673 673 3276283372.7 +677 673 -172972.623967 +679 673 1034636147.19 +681 673 1.107e8 +691 673 13931516.9271 +693 673 1.04308128357e-7 +695 673 -1367187.5 +697 673 -32816666.6667 +699 673 -2.22e7 +674 674 119066973.916 +676 674 1561894218.57 +678 674 584911891.156 +680 674 -35894820.6625 +682 674 -511979092.877 +684 674 -1422501401.77 +692 674 -68806565.338 +694 674 1939432589.29 +696 674 37449142.8572 +698 674 23926336.9237 +700 674 -563785714.286 +702 674 767390476.19 +675 675 41964813103.9 +677 675 -11907482.9932 +679 675 -1.107e8 +681 675 11574216536.9 +683 675 12403628.1179 +691 675 -1.34110450745e-7 +693 675 -92307142.8571 +697 675 -2.22e7 +699 675 -40642857.1428 +676 676 115999130131 +678 676 9.53674316406e-7 +680 676 -511979092.877 +682 676 -28055008766.7 +684 676 -8.405625e7 +692 676 -1939432589.29 +694 676 86988928571.4 +696 676 -2.86102294922e-6 +698 676 563785714.286 +700 676 -28427428571.4 +702 676 1.0656e9 +677 677 2640616883.12 +681 677 -12403628.1179 +683 677 520952380.952 +691 677 1367187.5 +695 677 4.375e7 +678 678 2.1379883154e11 +680 678 1422501401.77 +682 678 8.405625e7 +684 678 76561028950.2 +692 678 37449142.8571 +696 678 -82251103557.7 +698 678 -767390476.19 +700 678 1.0656e9 +702 678 -4.89128e10 +679 679 1851691983.38 +680 679 2.30719078428e-5 +681 679 1.3153e9 +682 679 -3.72532855642e-5 +683 679 -1445264982.41 +684 679 1779805710.16 +685 679 -79688183.9875 +686 679 -2.16703311463e-5 +687 679 -1.99244352207e-7 +688 679 2.76466354669e-5 +689 679 1112799428.44 +690 679 1779805710.16 +691 679 -32816666.6667 +693 679 2.22e7 +697 679 -48189005.5541 +698 679 1.92264654878e-6 +699 679 -1.8e6 +700 679 -3.23866915863e-5 +701 679 -1445340401.79 +702 679 -610924036.281 +703 679 42578995.7884 +704 679 -2.23514817639e-6 +705 679 -3.02460800354e-7 +706 679 3.25179932563e-5 +707 679 1112859933.04 +708 679 -610924036.281 +680 680 791400505.799 +681 680 -8.5625e6 +682 680 935887796.389 +683 680 3.41659100894e-5 +684 680 1422501401.77 +685 680 -2.16477506539e-5 +686 680 -697952217.487 +687 680 -3.8125e6 +688 680 -7.63387324722e-19 +689 680 -3.07340109417e-5 +690 680 -5.24212901611e-5 +692 680 23926336.9237 +694 680 -563785714.286 +696 680 -767390476.19 +697 680 1.88582363212e-6 +698 680 -10391816.2143 +699 680 6.3125e6 +700 680 1055488839.29 +701 680 3.41685533588e-5 +702 680 -767390476.19 +703 680 -2.23514817639e-6 +704 680 -40348648.3135 +705 680 -1.89375e7 +706 680 -8.98116004222e-19 +707 680 -3.07361314838e-5 +708 680 1.68731400497e-5 +681 681 24426570140.9 +682 681 -49614512.4716 +683 681 -12403628.1179 +684 681 3.08737547475e-6 +685 681 -2.57919712548e-8 +686 681 3.8125e6 +687 681 -20093851.0904 +688 681 -49614512.4716 +689 681 4.83648365179e-6 +690 681 3.08737547475e-6 +691 681 2.22e7 +693 681 -40642857.1428 +697 681 1.8e6 +698 681 -6.3125e6 +699 681 -103673735.119 +700 681 -9.44611837935e-20 +701 681 -3.60831705729e-6 +702 681 -1.78186177249e-6 +703 681 -3.02460800354e-7 +704 681 -1.89375e7 +705 681 -33046688.9881 +706 681 9.48441469976e-20 +707 681 3.24584147135e-6 +708 681 -1.78186177249e-6 +682 682 64590772836 +683 682 .00167240750119 +684 682 1037735416.67 +685 682 3.38213864164e-5 +686 682 -9.34269393525e-19 +687 682 49614512.4716 +688 682 1041904761.9 +689 682 -.00155116479997 +690 682 -9.62170702664e-5 +692 682 563785714.286 +694 682 -28427428571.4 +696 682 -1.0656e9 +697 682 3.59504151313e-5 +698 682 -1055488839.29 +699 682 1.04855377466e-19 +700 682 44161928571.4 +701 682 .00159586040533 +702 682 -86399999.9999 +703 682 -3.25179932563e-5 +704 682 8.98116004222e-19 +705 682 -9.48441469976e-20 +706 682 -4.13402524931e-17 +707 682 -.00148779040533 +708 682 8.53366083829e-5 +683 683 7.724067529e10 +684 683 -908427083.333 +685 683 1112799428.44 +686 683 -3.07340109417e-5 +687 683 1.65485459805e-6 +688 683 -.00154939759668 +689 683 -54919364278.1 +690 683 -302947916.667 +697 683 1445340401.79 +698 683 -3.41685533588e-5 +699 683 3.60831705729e-6 +700 683 .00159409290533 +701 683 64411654761.9 +702 683 3.03e8 +703 683 -1112859933.04 +704 683 3.07361314838e-5 +705 683 -3.24584147135e-6 +706 683 -.00148779040533 +707 683 -53772279761.9 +708 683 9.09e8 +684 684 171898950568 +685 684 -1779805710.16 +686 684 5.24212901611e-5 +687 684 -3.08737547475e-6 +688 684 -7.94835782029e-5 +689 684 302947916.667 +690 684 45268598890.7 +692 684 767390476.19 +694 684 -1.0656e9 +696 684 -4.89128e10 +697 684 -610924036.281 +698 684 -767390476.19 +699 684 -1.78186177249e-6 +700 684 8.64e7 +701 684 -3.03e8 +702 684 -67923397023.8 +703 684 610924036.281 +704 684 -1.68731400497e-5 +705 684 1.78186177249e-6 +706 684 8.53366083829e-5 +707 684 9.09e8 +708 684 -20650592261.9 +685 685 185247269.829 +686 685 2.78222289287e-5 +687 685 3.7398231678e-7 +688 685 -4.99028862765e-5 +689 685 -2501790175.66 +690 685 225038787.445 +697 685 42578995.7884 +698 685 -2.34561692639e-6 +699 685 7.43610628217e-7 +700 685 2.89542697114e-5 +701 685 1112859933.04 +702 685 610924036.281 +703 685 -94345505.0789 +704 685 2.69034620694e-6 +705 685 -3.88458038229e-7 +706 685 -4.70441056539e-5 +707 685 -2623434562.97 +708 685 32482208.0263 +686 686 1560077713 +687 686 2.38418579102e-7 +688 686 172972.623967 +689 686 4.78861560021e-5 +690 686 3.40037047535e-5 +697 686 -2.34561692639e-6 +698 686 -40348648.3135 +699 686 1.89375e7 +700 686 -7.99689353933e-19 +701 686 -3.07361314838e-5 +702 686 -1.68731400497e-5 +703 686 2.66983058194e-6 +704 686 51692355.4818 +705 686 2.08616256714e-7 +706 686 1367187.5 +707 686 4.78893338514e-5 +708 686 -1.09894135865e-5 +687 687 153503473.074 +688 687 -10994905.8109 +689 687 -1.03646441321e-5 +690 687 2.01673027441e-6 +697 687 7.43610628217e-7 +698 687 1.89375e7 +699 687 -33046688.9881 +700 687 8.44499533248e-20 +701 687 3.24584147135e-6 +702 687 1.78186177249e-6 +703 687 -1.68010983092e-7 +704 687 -1.78813934326e-7 +705 687 -18352913.5338 +706 687 -1.55239221923e-19 +707 687 -9.95033194559e-6 +708 687 -8.45228197504e-7 +688 688 4527012873.09 +689 688 .00234791081698 +690 688 -.000257111590912 +697 688 -2.89542697114e-5 +698 688 7.99689353933e-19 +699 688 -8.44499533248e-20 +700 688 -4.1047352493e-17 +701 688 -.00148248790533 +702 688 3.51251798115e-5 +703 688 4.87345620489e-5 +704 688 -1367187.5 +705 688 1.68707762144e-19 +706 688 4.375e7 +707 688 .00223842754626 +708 688 .000120271487547 +689 689 138923041622 +690 689 .000264830887318 +697 689 -1112859933.04 +698 689 3.07361314838e-5 +699 689 -3.24584147135e-6 +700 689 -.00148248790533 +701 689 -53772279761.9 +702 689 -9.09e8 +703 689 2623434562.97 +704 689 -4.78893338514e-5 +705 689 9.95033194559e-6 +706 689 .00223744279626 +707 689 122183088972 +708 689 -.000116348266602 +690 690 137418822709 +697 690 -610924036.281 +698 690 1.68731400497e-5 +699 690 -1.78186177249e-6 +700 690 3.51251798115e-5 +701 690 -9.09e8 +702 690 -20650592261.9 +703 690 32482208.0263 +704 690 -1.10053641073e-5 +705 690 -8.45228197504e-7 +706 690 .000130852946193 +707 690 -9.72747802734e-5 +708 690 -34257322555.2 +691 691 208792355.019 +695 691 -703818.41716 +697 691 -26732051.2821 +699 691 -2.98023223877e-8 +709 691 -3871.9465929 +711 691 2.38418579102e-7 +713 691 -2071005.91716 +715 691 -33251282.0513 +717 691 -2.22e7 +692 692 171872636.405 +694 692 185092178.255 +696 692 135753142.857 +698 692 -55752638.6455 +700 692 48647928.994 +702 692 -1940301831.5 +710 692 -90400622.0876 +712 692 2124524767.54 +714 692 30427428.5713 +716 692 28459408.2978 +718 692 -515137785.292 +720 692 960797069.597 +693 693 294636813.187 +697 693 2.98023223877e-8 +699 693 53697802.1978 +709 693 -2.38418579102e-7 +711 693 -122786813.187 +715 693 -2.22e7 +717 693 -46197802.1978 +694 694 193236687912 +696 694 1.14440917969e-5 +698 694 48647928.9941 +700 694 -45635164835.2 +702 694 1.23977661133e-5 +710 694 -2124524767.54 +712 694 75490901098.9 +714 694 -1.57356262207e-5 +716 694 515137785.292 +718 694 -21832439560.4 +720 694 1.0656e9 +695 695 195192307.692 +709 695 2071005.91716 +713 695 53846153.8461 +696 696 2.2953487409e11 +698 696 1940301831.5 +700 696 2.86102294922e-6 +702 696 118707261538 +710 696 30427428.5713 +712 696 6.67572021484e-6 +714 696 -104521530533 +716 696 -960797069.597 +718 696 1.0656e9 +720 696 -60885661538.4 +697 697 238582977.093 +698 697 2.16483316121e-7 +699 697 -5.7495806114e-8 +700 697 2.66634603854e-6 +701 697 -149832886.464 +702 697 2221145560.79 +703 697 -121685196.731 +704 697 4.72785778484e-7 +705 697 -2.94088710989e-7 +706 697 -1.59410820316e-5 +707 697 -21325698.0401 +708 697 2221145560.79 +709 697 -33251282.0513 +711 697 2.22e7 +715 697 -72236168.278 +716 697 1.47286243212e-6 +717 697 -1.8e6 +718 697 -2.25884094335e-5 +719 697 -1595173288.25 +720 697 -813214721.786 +721 697 53804397.6817 +722 697 -1.70233823246e-6 +723 697 -1.14872851252e-7 +724 697 2.37088473391e-5 +725 697 1091534235 +726 697 -813214721.786 +698 698 219895148.278 +699 698 1.19209289551e-7 +700 698 204477348.373 +701 698 -9.18220307909e-6 +702 698 1940301831.5 +703 698 4.7319042592e-7 +704 698 -97747887.0955 +706 698 5.84854011075e-19 +707 698 9.42522499107e-6 +708 698 -5.18705003613e-5 +710 698 28459408.2978 +712 698 -515137785.292 +714 698 -960797069.597 +715 698 1.43563486802e-6 +716 698 -31703100.5441 +717 698 6.3125e6 +718 698 1259966187.66 +719 698 2.49863502798e-5 +720 698 -960797069.597 +721 698 -1.70233823246e-6 +722 698 -36248702.6862 +723 698 -1.89375e7 +724 698 -4.62887019477e-19 +725 698 -2.13109064928e-5 +726 698 1.58770493301e-5 +699 699 346024009.844 +700 699 6.86537447571e-21 +701 699 -1.65418772952e-7 +702 699 6.51585704055e-6 +703 699 -3.96291091942e-7 +704 699 1.78813934326e-7 +705 699 -4065261.56135 +706 699 -4.59224042939e-20 +707 699 -2.72148809826e-8 +708 699 6.51585704055e-6 +709 699 2.22e7 +711 699 -46197802.1978 +715 699 1.8e6 +716 699 -6.3125e6 +717 699 -139469322.344 +718 699 -6.66068483294e-20 +719 699 -3.77373583024e-6 +720 699 -2.39794084629e-6 +721 699 -1.14872851252e-7 +722 699 -1.89375e7 +723 699 -32626144.6886 +724 699 6.99107036921e-20 +725 699 3.21862659037e-6 +726 699 -2.39794084629e-6 +700 700 115835241758 +701 700 .00277674322671 +702 700 -.000227946847929 +703 700 -2.90936795052e-6 +704 700 2.80811188791e-19 +705 700 -7.69199107114e-21 +706 700 -5.79167771467e-17 +707 700 -.00236592572671 +708 700 -.000185576523382 +710 700 515137785.292 +712 700 -21832439560.4 +714 700 -1.0656e9 +715 700 2.7384291126e-5 +716 700 -1259966187.66 +717 700 8.07485507563e-20 +718 700 41197978022 +719 700 .000938624464504 +720 700 -86399999.9999 +721 700 -2.37088473391e-5 +722 700 4.62887019477e-19 +723 700 -6.99107036921e-20 +724 700 -1.67792048622e-17 +725 700 -.000844849849119 +726 700 9.64884864281e-5 +701 701 145881844322 +702 701 .000179290771484 +703 701 -21325698.0401 +704 701 9.42522499107e-6 +705 701 -2.72148809826e-8 +706 701 -.00236590630364 +707 701 -98413863553.1 +708 701 .000207901000977 +715 701 1595173288.25 +716 701 -2.49863502798e-5 +717 701 3.77373583024e-6 +718 701 .000936837541427 +719 701 56230124542.1 +720 701 3.03e8 +721 701 -1091534235 +722 701 2.13109064928e-5 +723 701 -3.21862659037e-6 +724 701 -.000844849849119 +725 701 -43135509157.5 +726 701 9.09e8 +702 702 206758839515 +703 702 -2221145560.79 +704 702 5.18705003613e-5 +705 702 -6.51585704055e-6 +706 702 -.000190482237668 +707 702 .000217437744141 +708 702 64091321199.6 +710 702 960797069.597 +712 702 -1.0656e9 +714 702 -60885661538.4 +715 702 -813214721.786 +716 702 -960797069.597 +717 702 -2.39794084629e-6 +718 702 86400000.0001 +719 702 -3.03e8 +720 702 -87543556776.5 +721 702 813214721.786 +722 702 -1.58770493301e-5 +723 702 2.39794084629e-6 +724 702 9.64884864281e-5 +725 702 9.09e8 +726 702 -26703586080.6 +703 703 277160746.529 +704 703 1.63780454442e-7 +705 703 4.90344417417e-7 +706 703 -8.96860191172e-7 +707 703 -99540033.2839 +708 703 117748004.095 +715 703 53804397.6817 +716 703 -1.81402092477e-6 +717 703 6.24591434462e-7 +718 703 1.89129656465e-5 +719 703 1091534235 +720 703 813214721.786 +721 703 -123244023.843 +722 703 2.6360310064e-6 +723 703 -3.42862010364e-7 +724 703 -4.34460458672e-5 +725 703 -2722974596.25 +726 703 26391794.0213 +704 704 279980983.723 +706 704 703818.41716 +707 704 -3.24504455172e-6 +708 704 2.32341257091e-5 +715 704 -1.81402092477e-6 +716 704 -36248702.6862 +717 704 1.89375e7 +718 704 -3.69253138812e-19 +719 704 -2.13109064928e-5 +720 704 -1.58770493301e-5 +721 704 2.61555584614e-6 +722 704 35369267.3118 +723 704 2.98023223877e-8 +724 704 2071005.91716 +725 704 4.46442892997e-5 +726 704 -4.73198147315e-6 +705 705 204698585.406 +706 705 -3.10011436144e-20 +707 705 -4.9095335403e-7 +708 705 4.14190474289e-6 +715 705 6.24591434462e-7 +716 705 1.89375e7 +717 705 -32626144.6886 +718 705 5.57690012652e-20 +719 705 3.21862659037e-6 +720 705 2.39794084629e-6 +721 705 -2.75006590564e-7 +722 705 -1.19209289551e-7 +723 705 -39528629.2655 +724 705 -1.5415900672e-19 +725 705 -1.04412852996e-5 +726 705 -1.19824343253e-6 +706 706 195192307.692 +707 706 .00428660623805 +708 706 -.0005778870818 +715 706 -1.89129656465e-5 +716 706 3.69253138812e-19 +717 706 -5.57690012652e-20 +718 706 -1.65698795875e-17 +719 706 -.000839489079888 +720 706 6.09942007138e-5 +721 706 4.58425327322e-5 +722 706 -2071005.91716 +723 706 1.72890116996e-19 +724 706 53846153.8461 +725 706 .00168008463112 +726 706 .000174803212803 +707 707 2.4724406497e11 +708 707 .000530242919922 +715 707 -1091534235 +716 707 2.13109064928e-5 +717 707 -3.21862659037e-6 +718 707 -.000839489079888 +719 707 -43135509157.5 +720 707 -9.09e8 +721 707 2722974596.25 +722 707 -4.46442892997e-5 +723 707 1.04412852996e-5 +724 707 .00167910182342 +725 707 101861800656 +726 707 -.000156402587891 +708 708 152313298494 +715 708 -813214721.786 +716 708 1.58770493301e-5 +717 708 -2.39794084629e-6 +718 708 6.09942007138e-5 +719 708 -9.09e8 +720 708 -26703586080.6 +721 708 26391794.0214 +722 708 -4.75640872243e-6 +723 708 -1.19824343253e-6 +724 708 .000178060272953 +725 708 -.000133514404297 +726 708 -47583795487.2 +709 709 195524252.613 +711 709 -1.07288360596e-6 +713 709 -821556.066311 +715 709 -8906293.7063 +717 709 1.19209289551e-7 +745 709 -34642424.2424 +747 709 -2.22e7 +763 709 -11200380.6662 +765 709 -1.71363353729e-7 +767 709 -2892561.98347 +793 709 -32790303.0303 +795 709 2.22e7 +710 710 214898866.509 +712 710 216055161.622 +714 710 112347428.572 +716 710 -63327734.8988 +718 710 56785955.3035 +720 710 -2282466333.67 +746 710 32081932.0432 +748 710 -458351829.988 +750 710 1146126406.93 +764 710 -114016483.197 +766 710 2340579929.16 +768 710 25746285.7139 +794 710 48497035.501 +796 710 -778790082.645 +798 710 -1120380121.21 +711 711 339711488.511 +715 711 1.78813934326e-7 +717 711 70873126.8731 +745 711 -2.22e7 +747 711 -52103896.1039 +763 711 -1.11758708954e-7 +765 711 -151096103.896 +793 711 2.22e7 +795 711 -41527272.7273 +712 712 179229947652 +714 712 -.000755310058594 +716 712 56785955.3035 +718 712 -32691788211.8 +720 712 .000446796417236 +746 712 458351829.988 +748 712 -17224311688.3 +750 712 1.0656e9 +764 712 -2340579929.16 +766 712 68630129870.1 +768 712 -.000566959381103 +794 712 778790082.645 +796 712 -27130181818.2 +798 712 -1.0656e9 +713 713 234965034.965 +763 713 2892561.98347 +767 713 63636363.6364 +714 714 265581230253 +716 714 2282466333.67 +718 714 .000452995300293 +720 714 1.4066107972e11 +746 714 -1146126406.93 +748 714 1.0656e9 +750 714 -72402618181.8 +764 714 25746285.7139 +766 714 -.000566482543945 +768 714 -1.2567025972e11 +794 714 1120380121.21 +796 714 -1.0656e9 +798 714 -50943767272.7 +715 715 266615135.897 +716 715 4.37969165119e-7 +717 715 1.00902110558e-6 +718 715 6.15372872031e-5 +719 715 -174897550.003 +720 715 2473853765.28 +721 715 -138845554.632 +722 715 1.0478630474e-6 +723 715 3.00169735216e-6 +724 715 3.42576181819e-5 +725 715 -24893148.809 +726 715 2473853765.28 +739 715 64101733.5623 +740 715 -1.51388292057e-6 +741 715 -3.92874712445e-6 +742 715 -3.03630922709e-5 +743 715 1066641086.19 +744 715 -1001047206.76 +745 715 -96593544.231 +746 715 4.06436764801e-7 +747 715 -1.8e6 +748 715 -4.93806800222e-5 +749 715 -1770070838.25 +750 715 -1001047206.76 +763 715 -34642424.2424 +765 715 2.22e7 +716 716 232461694.293 +717 716 1.19209289551e-7 +718 716 238683162.991 +719 716 -1.44341679743e-5 +720 716 2282466333.67 +721 716 5.20938513598e-7 +722 716 -73942224.4422 +723 716 2.98023223877e-8 +724 716 1.50430988283e-20 +725 716 1.28455010468e-5 +726 716 -3.31966227776e-5 +739 716 -1.51388292057e-6 +740 716 -34094787.1573 +741 716 -1.89375e7 +742 716 2.40976922785e-19 +743 716 -8.46540544592e-6 +744 716 7.94481910128e-6 +745 716 8.96133734498e-7 +746 716 -53613584.906 +747 716 6.3125e6 +748 716 1498649350.65 +749 716 1.05521823054e-5 +750 716 -1146126406.93 +764 716 32081932.0432 +766 716 -458351829.988 +768 716 -1146126406.93 +717 717 397179820.18 +718 717 -1.48810762135e-18 +719 717 7.57681188577e-5 +720 717 -4.71031192288e-5 +721 717 2.85540766962e-6 +722 717 5.96046447754e-8 +723 717 8223276.72328 +724 717 -2.36227706191e-18 +725 717 -4.45913717515e-5 +726 717 -4.71031192288e-5 +739 717 -3.92874712445e-6 +740 717 -1.89375e7 +741 717 -33311417.7489 +742 717 1.17771994263e-18 +743 717 -4.13727451612e-5 +744 717 3.88284977168e-5 +745 717 1.8e6 +746 717 -6.3125e6 +747 717 -172567640.693 +748 717 1.91537183117e-18 +749 717 7.19943830274e-5 +750 717 3.88284977168e-5 +763 717 2.22e7 +765 717 -52103896.1039 +718 718 117195956044 +719 718 .00137784428331 +720 718 -7.19364441849e-5 +721 718 -5.99486202756e-5 +722 718 6.82725544446e-19 +723 718 1.5798871163e-18 +724 718 3.97592124726e-17 +725 718 -.00112019540219 +726 718 .00140555335799 +739 718 3.03630922709e-5 +740 718 -2.40976922785e-19 +741 718 -1.17771994263e-18 +742 718 -5.04480465517e-17 +743 718 -.000250072196798 +744 718 -.00124944565394 +745 718 -2.82763154114e-5 +746 718 -1498649350.65 +747 718 1.09677829474e-18 +748 718 40110857142.9 +749 718 .000319486742252 +750 718 -86400000.0022 +764 718 458351829.988 +766 718 -17224311688.3 +768 718 -1.0656e9 +719 719 136361270729 +720 719 3.81469726563e-5 +721 719 -24893148.8091 +722 719 1.28455010468e-5 +723 719 -4.45913717515e-5 +724 719 -.00114548777981 +725 719 -79221130869.1 +726 719 .000173568725586 +739 719 -1066641086.19 +740 719 8.46540544592e-6 +741 719 4.13727451612e-5 +742 719 -.000250072196798 +743 719 -35951627705.6 +744 719 9.09e8 +745 719 1770070838.25 +746 719 -1.05521823054e-5 +747 719 -7.19943830274e-5 +748 719 .000342992196798 +749 719 51427082251.1 +750 719 3.03e8 +720 720 236025214785 +721 720 -2473853765.28 +722 720 3.31966227776e-5 +723 720 4.71031192288e-5 +724 720 .00139853145323 +725 720 .000171661376953 +726 720 72953278721.3 +739 720 1001047206.76 +740 720 -7.94481910128e-6 +741 720 -3.88284977168e-5 +742 720 -.00124944565394 +743 720 9.09e8 +744 720 -32398264069.3 +745 720 -1001047206.76 +746 720 -1146126406.93 +747 720 3.88284977168e-5 +748 720 86399999.9977 +749 720 -3.03e8 +750 720 -106033200866 +764 720 1146126406.93 +766 720 -1.0656e9 +768 720 -72402618181.8 +721 721 324700304.178 +722 721 -1.01025229057e-6 +723 721 -1.58691476446e-6 +724 721 2.72954455636e-6 +725 721 -116191500.807 +726 721 97446624.0791 +733 721 70598233.2692 +734 721 -1.30559369518e-6 +735 721 -2.66540033141e-6 +736 721 -1.42496415299e-5 +737 721 1196491953.02 +738 721 -978715688.743 +739 721 -152155514.039 +740 721 1.47116582186e-6 +741 721 2.90176854645e-6 +742 721 -6.97418213523e-6 +743 721 -2839166097.06 +744 721 22331518.0181 +745 721 64101733.5623 +746 721 -4.47920114829e-8 +747 721 -3.62815188636e-6 +748 721 4.72939031627e-5 +749 721 1066641086.19 +750 721 1001047206.76 +722 722 245024644.151 +724 722 821556.066311 +725 722 -2.26421955148e-5 +726 722 5.02529071069e-6 +733 722 -1.30559369518e-6 +734 722 -35267444.1786 +735 722 -1.89375e7 +736 722 1.13747138528e-19 +737 722 -9.55094453729e-6 +738 722 7.81255505927e-6 +739 722 1.28848589762e-6 +740 722 23365487.0334 +741 722 -1.49011611939e-7 +742 722 2892561.98347 +743 722 2.20020937849e-5 +744 722 -2.22547037256e-7 +745 722 -4.47920114829e-8 +746 722 -34094787.1573 +747 722 1.89375e7 +748 722 -3.75348437799e-19 +749 722 -8.46540544592e-6 +750 722 -7.94481910128e-6 +723 723 218793837.741 +724 723 1.99960488348e-18 +725 723 9.92416594035e-5 +726 723 1.99126509584e-5 +733 723 -2.66540033141e-6 +734 723 -1.89375e7 +735 723 -32790769.5375 +736 723 3.46525373567e-19 +737 723 -2.90965088576e-5 +738 723 2.38005860672e-5 +739 723 2.90118845038e-6 +740 723 -2.98023223877e-8 +741 723 -57761449.0772 +742 723 -2.39550286225e-19 +743 723 8.88003741039e-5 +744 723 -1.50279116496e-5 +745 723 -3.62815188636e-6 +746 723 1.89375e7 +747 723 -33311417.7489 +748 723 -1.83443018328e-18 +749 723 -4.13727451612e-5 +750 723 -3.88284977168e-5 +724 724 234965034.965 +725 724 .00264722752226 +726 724 .00244333302248 +733 724 1.42496415299e-5 +734 724 -1.13747138528e-19 +735 724 -3.46525373567e-19 +736 724 -1.92875463704e-17 +737 724 -.000298171766767 +738 724 -.000695257706611 +739 724 3.70300054345e-5 +740 724 -2892561.98347 +741 724 -1.61502588096e-18 +742 724 63636363.6364 +743 724 .000697678054474 +744 724 -.00191596606979 +745 724 -4.72939031627e-5 +746 724 3.75348437799e-19 +747 724 1.83443018328e-18 +748 724 -5.1567353911e-17 +749 724 -.000320588560434 +750 724 -.00126387422537 +725 725 215000393291 +726 725 .000144958496094 +733 725 -1196491953.02 +734 725 9.55094453729e-6 +735 725 2.90965088576e-5 +736 725 -.000298171766767 +737 725 -40122612440.2 +738 725 9.09e8 +739 725 2839166097.06 +740 725 -2.20020937849e-5 +741 725 -8.88003741039e-5 +742 725 .000688909418111 +743 725 88746967418.5 +744 725 -.000137329101563 +745 725 -1066641086.19 +746 725 8.46540544592e-6 +747 725 4.13727451612e-5 +748 725 -.000320588560434 +749 725 -35951627705.6 +750 725 -9.09e8 +726 726 165675649484 +733 726 978715688.743 +734 726 -7.81255505927e-6 +735 726 -2.38005860672e-5 +736 726 -.000695257706611 +737 726 9.09e8 +738 726 -28888416267.9 +739 726 22331518.0181 +740 726 -4.19810467723e-8 +741 726 -1.50279116496e-5 +742 726 -.0019159939144 +743 726 -.000143051147461 +744 726 -59770049485.6 +745 726 -1001047206.76 +746 726 7.94481910128e-6 +747 726 3.88284977168e-5 +748 726 -.00126387422537 +749 726 -9.09e8 +750 726 -32398264069.3 +727 727 463053855.23 +728 727 -57635021.5376 +729 727 -7.82170356997e-7 +730 727 5.06846070988e-6 +731 727 2278495164.51 +732 727 -111291599.578 +733 727 -240914483.194 +734 727 22212852.0379 +735 727 1.60071274955e-6 +736 727 -4.41048379001e-5 +737 727 -1615036176.25 +738 727 -2316401434.47 +751 727 -177703995.9 +752 727 35422169.4997 +755 727 -671091575.778 +756 727 1052030857.66 +1593 727 -128696533.056 +1594 727 46052561.7153 +1611 727 -30194211.8711 +1615 727 167849399.366 +1618 727 -15858349.8443 +1626 727 -83819532.9771 +728 728 674276997.648 +729 728 27831993.9664 +730 728 -5.39697205218e-20 +731 728 -2.07007480899e-5 +732 728 1.43295967651e-5 +733 728 6579518.70458 +734 728 -280274475.596 +735 728 -15206993.9664 +736 728 4.69634848011e-19 +737 728 1.71971444694e-5 +738 728 2.46653856449e-5 +751 728 51055502.833 +752 728 -348590400.84 +753 728 -1.2625e7 +1593 728 46052561.7153 +1594 728 -176681324.103 +1611 728 316282808.265 +1615 728 -30194211.8711 +1618 728 -157468150.829 +1626 728 -15858349.8443 +729 729 840523918.372 +730 729 358405379.326 +731 729 -5578535915.69 +732 729 1.56322873801e-5 +733 729 1.73514561992e-6 +734 729 -2581993.96645 +735 729 -331245999.408 +736 729 4069022854.2 +737 729 2675212626.1 +738 729 2.69076934308e-5 +752 729 -2.525e7 +753 729 -414246943.774 +754 729 -5632781442.13 +755 729 1254780943.51 +1595 729 -242251196.103 +1596 729 -3250115520.47 +1597 729 1254780943.51 +1612 729 547237898.28 +1613 729 -5578535915.69 +1617 729 357202456.742 +1619 729 1875189451.49 +1620 729 2675212626.1 +1628 729 -141118599.466 +730 730 201417060549 +731 730 -115111000745 +732 730 .000626073753399 +733 730 -3.0251303709e-6 +734 730 3.22120363568e-20 +735 730 -4675902925.62 +736 730 48706800668.4 +737 730 37277741448.6 +738 730 .000213362224012 +753 730 3815972536.2 +754 730 23327670735.5 +755 730 109429334932 +1595 730 3686006314.74 +1596 730 -27399233529.9 +1597 730 1.0773686525e11 +1612 730 83856030570.7 +1613 730 -114230759234 +1617 730 -3093357076.69 +1619 730 2670170572.72 +1620 730 38089969619.9 +1628 730 -91124227.957 +731 731 747017148729 +732 731 16087811266.9 +733 731 -1728519857.58 +734 731 1.84055355205e-5 +735 731 2033203927.19 +736 731 36256363670.8 +737 731 -380494817031 +738 731 -11995727465.4 +751 731 -328206264.107 +753 731 3336690408.25 +754 731 1.1045071271e11 +755 731 -339835856962 +756 731 5278869317.09 +1595 731 -6549038713.11 +1596 731 1.0773686525e11 +1597 731 -328627438555 +1612 731 -114230759234 +1613 731 669157376992 +1617 731 15362623601.7 +1619 731 38089969619.9 +1620 731 -330303741104 +1628 731 -8604943308.32 +732 732 72442634660.6 +733 732 1324052269.4 +734 732 -1.40987047205e-5 +735 732 -1.53804051496e-5 +736 732 .00021981500179 +737 732 -11389727465.4 +738 732 29363788011.9 +751 732 -1418080808.08 +755 732 -11473648364 +756 732 13381555437.8 +733 733 449255526.742 +734 733 2688818.5803 +735 733 -2.20359621288e-6 +736 733 2.48166072248e-5 +737 733 3340177700.65 +738 733 946694491.884 +739 733 -136975814.556 +740 733 -9268337.28488 +741 733 2.06797529375e-6 +742 733 -4.23324170311e-5 +743 733 -1196491953.02 +744 733 -1348023167.97 +1611 733 31041650.1557 +1615 733 -99638977.4215 +1618 733 3511185.53586 +1622 733 -34552835.6916 +1626 733 127153373.462 +1650 733 -85208840.4846 +734 734 527233230.131 +735 734 8894493.96645 +736 734 -2892561.98347 +737 734 -3.09422685182e-5 +738 734 -1.36235570846e-5 +739 734 -24901670.6182 +740 734 -187163777.909 +741 734 -6.3125e6 +742 734 3.37916662265e-19 +743 734 9.55094453729e-6 +744 734 1.07605358145e-5 +1611 734 -163795928.606 +1615 734 31041650.1557 +1618 734 268020088.069 +1622 734 -127301937.24 +1626 734 3511185.53586 +1650 734 -34552835.6916 +735 735 557066055.823 +736 735 -2149399109.52 +737 735 -4181739635.5 +738 735 6.12566129347e-6 +739 735 2.16875380252e-6 +740 735 6.3125e6 +741 735 -103556119.295 +742 735 2460779393.76 +743 735 807003351.567 +744 735 3.27814724938e-5 +1612 735 -2482069522.9 +1613 735 2033203927.19 +1617 735 -166058787.017 +1619 735 -1114462291.53 +1620 735 -4181739635.5 +1623 735 1301882809.03 +1624 735 807003351.567 +1628 735 200683353.54 +1652 735 -55918730.9153 +736 736 159497471786 +737 736 7618688334.01 +738 736 .00164913256526 +739 736 2.32305279565e-5 +740 736 -1.8543667053e-19 +741 736 -1898246256.55 +742 736 37524118280.8 +743 736 -45221833757.1 +744 736 .000870731917138 +1612 736 2256755757.9 +1613 736 35025836286.6 +1617 736 1869005478.48 +1619 736 46490408858.6 +1620 736 7695484597.52 +1623 736 -13615131849.7 +1624 736 -44068102636.4 +1628 736 -1278598787.96 +1652 736 -611784178.657 +737 737 685997189738 +738 737 10977162902.9 +739 737 -1196491953.02 +740 737 9.55094453729e-6 +741 737 1361695287.57 +742 737 -46243211534.9 +743 737 -270066349824 +744 737 -3.03e8 +1612 737 35025836286.6 +1613 737 -331337278141 +1617 737 -7675720191.48 +1619 737 7695484597.52 +1620 737 564767826114 +1623 737 -44068102636.4 +1624 737 -228075519868 +1628 737 13459644804.5 +1652 737 -5639092891.18 +738 738 8.59856584e10 +739 738 1348023167.97 +740 738 -1.07605358145e-5 +741 738 -3.27814724938e-5 +742 738 .000875569285559 +743 738 3.03e8 +744 738 35905258373.2 +739 739 391834260.415 +740 739 65906416.2533 +741 739 -1.85270529217e-6 +742 739 4.22899146431e-6 +743 739 2839166097.06 +744 739 44663036.0362 +745 739 -162199454.207 +746 739 -41004745.635 +747 739 3.07457496882e-6 +748 739 -5.90199802602e-5 +749 739 -1066641086.19 +750 739 -1303360131.93 +1618 739 12347164.3084 +1622 739 43124361.8813 +1626 739 -56361618.2623 +1642 739 -145032407.913 +1643 739 -55471526.1897 +1650 739 126949581.731 +740 740 447606759.553 +741 740 1.19209289551e-7 +742 740 -2892561.98347 +743 740 -2.20020937849e-5 +744 740 -3.26124788036e-7 +745 740 -56638078.9684 +746 740 -183948459.564 +747 740 -6.3125e6 +748 740 4.68412541748e-19 +749 740 8.46540544592e-6 +750 740 1.03441280312e-5 +1618 740 -115763048.351 +1622 740 232845631.517 +1626 740 12347164.3084 +1642 740 -55471526.1897 +1643 740 -146860360.943 +1650 740 43124361.8813 +741 741 376233426.931 +742 741 -313569200.489 +743 741 -2902272968.73 +744 741 1.77731023206e-5 +745 741 3.17477338152e-6 +746 741 6.3125e6 +747 741 -119351392.417 +748 741 3071991295.86 +749 741 -152375886.75 +750 741 5.05545748143e-5 +1619 741 -739349671.828 +1620 741 1361695287.57 +1623 741 -354455381.767 +1624 741 -2902272968.73 +1628 741 -33060546.7395 +1644 741 -132313490.063 +1645 741 1872208529.86 +1646 741 -152375886.75 +1652 741 138501757.947 +742 742 211670057932 +743 742 138092717259 +744 742 .00274383200363 +745 742 4.20891693684e-5 +746 742 -3.34041026733e-19 +747 742 -1571319824.76 +748 742 -19565043758.4 +749 742 -1.2813059894e11 +750 742 .0015005027968 +1619 742 -12861257775.6 +1620 742 -47132235969.8 +1623 742 86875609751 +1624 742 137451857276 +1628 742 -1795038750.93 +1644 742 -2626008490.76 +1645 742 -82312357165.4 +1646 742 -126600714522 +1652 742 3845156873.18 +743 743 561342798905 +744 743 -.0001220703125 +745 743 -1066641086.19 +746 743 8.46540544592e-6 +747 743 1720766119.39 +748 743 -129151976718 +749 743 -237473570472 +750 743 -3.03e8 +1619 743 -47132235969.8 +1620 743 -226190834683 +1623 743 137451857276 +1624 743 446772439133 +1628 743 -6524466558.25 +1644 743 -3898988025.35 +1645 743 -126600714522 +1646 743 -201851587794 +1652 743 10797958081.4 +744 744 86500876553.3 +745 744 1303360131.93 +746 744 -1.03441280312e-5 +747 744 -5.05545748143e-5 +748 744 .00150531232061 +749 744 3.03e8 +750 744 38746835497.8 +745 745 260905433.465 +746 745 27625280.6072 +747 745 2.22e7 +748 745 6.11067571197e-5 +749 745 1770070838.25 +750 745 1303360131.93 +763 745 -51792042.8576 +764 745 -18082787.208 +765 745 -1.8e6 +1622 745 -8571526.18971 +1642 745 105801686.477 +1643 745 48567426.5965 +1650 745 -54768519.0237 +1722 745 -29512868.9427 +1723 745 7099685.16235 +746 746 287843858.248 +747 746 -1.89375e7 +748 746 -1498649350.65 +749 746 -1.05521823054e-5 +750 746 1226583549.78 +763 746 -33716120.5413 +764 746 -55715837.8004 +766 746 458351829.988 +768 746 1226583549.78 +1622 746 -110754805.388 +1642 746 48567426.5965 +1643 746 125916907.813 +1650 746 -8571526.18971 +1722 746 7099685.16235 +1723 746 -6405223.28799 +747 747 334438900.097 +748 747 -3140436487.83 +749 747 -1425414660.44 +750 747 -5.05545748143e-5 +763 747 1.8e6 +765 747 18192218.7597 +766 747 649567066.389 +767 747 -315736734.477 +1623 747 -371537058.761 +1624 747 1720766119.39 +1644 747 48577120.9443 +1645 747 -1960047014 +1646 747 -245021414.255 +1652 747 -54265906.4741 +1710 747 34492013.6352 +1724 747 630173774.219 +1725 747 864656511.708 +748 748 262095039704 +749 748 148234315517 +750 748 -1.0656e9 +764 748 458351829.988 +765 748 310564999.241 +766 748 -68144928149.8 +767 748 -51526019273.2 +768 748 -86399999.9995 +1623 748 -79953460869.1 +1624 748 -129664847856 +1644 748 5901472906.2 +1645 748 131752973613 +1646 748 146427095712 +1652 748 -4228971510.51 +1710 748 -1914621202.96 +1724 748 -50028353364.3 +1725 748 -52279321312.2 +749 749 387153671367 +750 749 9.09e8 +765 749 1515585605.21 +766 749 -52547397051 +767 749 11067747924.1 +1623 749 -129664847856 +1624 749 -195954347053 +1644 749 10077867055.2 +1645 749 146427095712 +1646 749 222174534099 +1652 749 -6942843785.33 +1710 749 -3072818327.94 +1724 749 -52279321312.2 +1725 749 -80128250945.5 +750 750 125488743723 +764 750 -1226583549.78 +766 750 86400000.0005 +768 750 75781818181.8 +751 751 275381183.883 +752 751 -21733462.138 +753 751 2.22e7 +755 751 1305699377.05 +756 751 -1239059209.48 +757 751 -29996381.0619 +758 751 17905533.2658 +759 751 -1.8e6 +1593 751 96157733.0406 +1594 751 -40254563.8653 +1611 751 -847438.284649 +1615 751 -81238199.7224 +1675 751 -5931154.99846 +1676 751 -6125571.81083 +752 752 441047300.144 +753 752 3.7875e7 +754 752 -1498649350.65 +756 752 1226583549.78 +757 752 33538866.5991 +758 752 -50264990.941 +760 752 458351829.988 +762 752 1226583549.78 +1593 752 -40254563.8653 +1594 752 150574405.125 +1611 752 -157697990.77 +1615 752 -847438.284649 +1675 752 -6125571.81083 +1676 752 11458571.847 +753 753 598283576.562 +754 753 5578372440.61 +755 753 -2789977890.36 +757 753 1.8e6 +759 753 17780774.7527 +760 753 -379924938.417 +761 753 -208759299.135 +1595 753 151953794.461 +1596 753 3217606479.08 +1597 753 -1457013646.2 +1612 753 1433306614.53 +1613 753 3336690408.25 +1617 753 -161375013.888 +1677 753 -358024978.278 +1678 753 1124204945.03 +1681 753 43792902.7948 +754 754 199781095642 +755 754 -115480940705 +756 754 -1.0656e9 +758 754 458351829.988 +759 754 21165074.9587 +760 754 -29022324713.6 +761 754 30442016691.4 +762 754 -8.64e7 +1595 754 -2760779689.16 +1596 754 73399655166.5 +1597 754 -113880176987 +1612 754 -26158989085.4 +1613 754 110800998583 +1617 754 1627913904 +1677 754 -8382090148.78 +1678 754 31167312369.6 +1681 754 1166109711.74 +755 755 487907898127 +756 755 -12056804927.2 +759 755 1701867260.09 +760 755 31463394469.1 +761 755 6505127057.88 +1595 755 13147574591.7 +1596 755 -113880176987 +1597 755 339343827732 +1612 755 110800998583 +1613 755 -325526827444 +1617 755 -9562328727.87 +1677 755 31167312369.6 +1678 755 -97595761029.2 +1681 755 -3751916177.03 +756 756 1.0390133581e11 +758 756 -1226583549.78 +760 756 8.64e7 +762 756 75781818181.8 +757 757 274538017.954 +758 757 -28123014.2597 +759 757 1.19209289551e-7 +761 757 2892561.98347 +769 757 -28944647.8825 +770 757 -2315115.38053 +771 757 -1.8e6 +1593 757 -103285001.292 +1594 757 37617277.8256 +1675 757 2114328.19577 +1676 757 -22052559.8419 +1810 757 -34713207.9743 +1811 757 -18665454.9426 +758 758 442446551 +760 758 -2340579929.16 +762 758 51492571.4289 +769 758 13318217.9528 +770 758 -19871491.7411 +772 758 778790082.645 +774 758 1278076121.21 +1593 758 37617277.8256 +1594 758 -239734206.582 +1675 758 -22052559.8419 +1676 758 -68300285.8012 +1810 758 -18665454.9426 +1811 758 -29738060.2825 +759 759 313092710.282 +760 759 2258860540.92 +761 759 -1680800500.27 +769 759 1.8e6 +771 759 -24770476.6148 +772 759 -786254618.485 +773 759 -1377702116.05 +1595 759 9583488.99064 +1596 759 -4423952.78949 +1597 759 144364012.849 +1677 759 2293095249.44 +1678 759 -226604177.234 +1681 759 -189189091.481 +1812 759 -726430882.218 +1813 759 1633997454.23 +1816 759 122139866.797 +760 760 190313675839 +761 760 -38209362003.3 +762 760 1.14440917969e-5 +770 760 778790082.645 +771 760 -732372142.806 +772 760 -60401035637.7 +773 760 13569148946.6 +774 760 -8.64e7 +1595 760 584367062.367 +1596 760 -24392549151.6 +1597 760 28299894698.7 +1677 760 70025144586.5 +1678 760 -43913189637.6 +1681 760 -4201402519.01 +1812 760 -37985408856.3 +1813 760 12917405918.6 +1816 760 2470471996.94 +761 761 2.1337693544e11 +771 761 2207879968.57 +772 761 14590526724.4 +773 761 82134383167.5 +1595 761 -68367403.8715 +1596 761 28299894698.7 +1597 761 -103923366672 +1677 761 -43913189637.6 +1678 761 -70045735997.5 +1681 761 4279059823.9 +1812 761 12917405918.6 +1813 761 -80478777817.2 +1816 761 -4529012589.2 +762 762 1.4189041972e11 +770 762 -1278076121.21 +772 762 8.64e7 +774 762 55674647272.7 +763 763 272746292.371 +764 763 30102768.3023 +765 763 -1.19209289551e-7 +767 763 2892561.98347 +793 763 -72018902.6534 +794 763 2012636.3538 +795 763 -1.8e6 +1642 763 -78434500.1452 +1643 763 -38104754.3958 +1722 763 58574552.9009 +1723 763 19813234.3697 +1763 763 -49362291.6767 +1764 763 19892235.9112 +764 764 316305800.782 +766 764 -2340579929.16 +768 764 51492571.429 +793 764 -13620696.9795 +794 764 -53670388.278 +796 764 778790082.645 +798 764 1278076121.21 +1642 764 -38104754.3958 +1643 764 -135763517.032 +1722 764 19813234.3697 +1723 764 -4131882.3162 +1763 764 19892235.9112 +1764 764 -32486659.7029 +765 765 259470330.147 +766 765 -2092409728.05 +767 765 -870134561.431 +793 765 1.8e6 +795 765 -14720222.4634 +796 765 1056634201.76 +797 765 -1010965488.94 +1644 765 19694960.731 +1645 765 331641197.23 +1646 765 232760515.834 +1710 765 -94179790.6768 +1724 765 -2104843001 +1725 765 -465996155.864 +1765 765 1023124730.82 +1766 765 675998006.003 +1783 765 60179776.2296 +766 766 263544527674 +767 766 54914226367.5 +768 766 -.000785827636719 +794 766 778790082.645 +795 766 1013774134.56 +796 766 -1.1337389517e11 +797 766 -13807627197 +798 766 -8.64e7 +1644 766 -1413722826.53 +1645 766 -58333155323.8 +1646 766 -49309867426.1 +1710 766 4535121542.24 +1724 766 156842185691 +1725 766 58496054688.5 +1765 766 -87739581301.5 +1766 766 -14255730469.9 +1783 766 -2692330188.61 +767 767 1.6854758333e11 +795 767 1408222740.35 +796 767 -14829004974.8 +797 767 50153498372.8 +1644 767 -140231497.157 +1645 767 -49309867426.1 +1646 767 -83296708341.1 +1710 767 2010275573.22 +1724 767 58496054688.5 +1725 767 -23226825837.5 +1765 767 -14255730469.9 +1766 767 -37298579695.4 +1783 767 -2092395520.51 +768 768 1.4189041972e11 +794 768 -1278076121.21 +796 768 8.64e7 +798 768 55674647272.7 +769 769 255447138.465 +770 769 12678174.4786 +773 769 2892561.98347 +775 769 -35438751.4772 +776 769 -22317416.4145 +777 769 -1.8e6 +1675 769 -48812485.829 +1676 769 27716995.5517 +1810 769 1033774.639 +1811 769 7606481.39759 +1942 769 -76779829.0676 +1943 769 -39002452.9663 +770 770 395785872.041 +772 770 -2489646280.99 +775 770 -6684083.08114 +776 770 -35164759.5493 +778 770 778790082.645 +780 770 1278076121.21 +1675 770 27716995.5517 +1676 770 -71985759.7325 +1810 770 7606481.39759 +1811 770 -95298716.6104 +1942 770 -39002452.9663 +1943 770 -144240716.659 +771 771 336269593.79 +772 771 3004515515.52 +773 771 857342471.187 +775 771 1.8e6 +777 771 -14414046.1712 +778 771 -299532123.586 +779 771 -1991282733.05 +1677 771 -800378366.774 +1678 771 -1215749652.05 +1681 771 120975718.414 +1812 771 2982289132.4 +1813 771 -261597813.499 +1816 771 -271733402.16 +1944 771 -253752282.737 +1945 771 313406602.891 +1962 771 62257158.1973 +772 772 206245917626 +773 772 17673495924.3 +776 772 778790082.645 +777 772 -708785098.976 +778 772 -50814013342.6 +779 772 -26808431852.2 +780 772 -8.64e7 +1677 772 -40669679219.7 +1678 772 9914172754.25 +1681 772 2310120533.54 +1812 772 87246566662.8 +1813 772 12747168987.8 +1816 772 -5397399527.86 +1944 772 -33385746183.6 +1945 772 -28617231886.8 +1962 772 1577803196.27 +773 773 200999982828 +777 773 724614202.402 +778 773 -25787054074.4 +779 773 44644131191.9 +1677 773 9914172754.25 +1678 773 -81285126106.5 +1681 773 2762113330.38 +1812 773 12747168987.8 +1813 773 -108728350232 +1816 773 -1825938166.87 +1944 773 -28617231886.8 +1945 773 -90168063115.6 +1962 773 -1140429721.05 +774 774 121846550629 +776 774 -1278076121.21 +778 774 8.64e7 +780 774 55674647272.7 +775 775 349801612.854 +776 775 57910065.0639 +777 775 -2.38418579102e-7 +779 775 2892561.98347 +781 775 -73422093.1837 +782 775 -49188176.9207 +783 775 -1.8e6 +1810 775 -15922339.5274 +1811 775 9658636.78822 +1942 775 63285670.8993 +1943 775 40224822.4951 +1947 775 -208590991.626 +1948 775 -51921264.3453 +776 776 640441508.307 +778 776 -2340579929.16 +780 776 -51492571.4289 +781 776 -33554843.5874 +782 776 -167103893.747 +784 776 458351829.988 +786 776 1226583549.78 +1810 776 9658636.78822 +1811 776 -77511.7567222 +1942 776 40224822.4951 +1943 776 56200539.5135 +1947 776 -51921264.3453 +1948 776 -459758367.115 +777 777 584007830.406 +778 777 3684671432.76 +779 777 985743240.313 +781 777 1.8e6 +783 777 -61231814.8001 +784 777 2272518611.59 +785 777 -2290033901.11 +1812 777 -761818695.206 +1813 777 -1945250118.06 +1816 777 110680969.5 +1944 777 3641999102.4 +1945 777 -468426233.281 +1949 777 -437152505.677 +1950 777 2282879877.46 +1951 777 -1074339054.25 +1962 777 66746839.4695 +778 778 200816623089 +779 778 76677846485.2 +780 778 -1.14440917969e-5 +782 778 458351829.988 +783 778 -897237544.926 +784 778 -24921105333.8 +785 778 -63036366887.3 +786 778 -8.64e7 +1812 778 -23772334816.2 +1813 778 -31883309053.6 +1816 778 2057584888.26 +1944 778 78014240102 +1945 778 72997163583.6 +1949 778 -1905099511.96 +1950 778 -30755659066.3 +1951 778 -61283235231.9 +1962 778 -2640387140.55 +779 779 378409406715 +783 779 518761990.626 +784 779 -62014989109.5 +785 779 -65428822609.4 +1812 779 -31883309053.6 +1813 779 -86095983314.9 +1816 779 4739587528.12 +1944 779 72997163583.6 +1945 779 38167793755.8 +1949 779 557059721.109 +1950 779 -61283235231.9 +1951 779 -262454774918 +1962 779 -4809869747.12 +780 780 1.4189041972e11 +782 780 -1226583549.78 +784 780 8.64e7 +786 780 75781818181.8 +781 781 301111029.669 +782 781 29176040.5878 +783 781 -2.22e7 +785 781 1305699377.05 +786 781 -1239059209.48 +787 781 -190171746.389 +788 781 -42505562.3714 +791 781 -328206264.107 +792 781 -1418080808.08 +1938 781 8213349.69126 +1942 781 -24750997.7534 +1943 781 535039.859226 +1947 781 166808702.411 +1948 781 38135975.8205 +1958 781 -102905709.513 +782 782 539496114.007 +783 782 3.7875e7 +784 782 -1498649350.65 +786 782 -1226583549.78 +787 782 -26872229.038 +788 782 -416288917.858 +789 782 -2.525e7 +1938 782 -188408781.048 +1942 782 535039.859226 +1943 782 -414008.199328 +1947 782 38135975.8205 +1948 782 279246381.412 +1958 782 8213349.69126 +783 783 634575691.776 +784 783 5169422994.23 +785 783 3943267682.02 +788 783 -1.2625e7 +789 783 -417221924.698 +790 783 4598157448.33 +791 783 -3481576371.41 +1939 783 1908044748.2 +1940 783 -3481576371.41 +1944 783 -910552566.301 +1945 783 -1043499133.86 +1949 783 239938693.987 +1950 783 2465995272.73 +1951 783 2381006557.54 +1960 783 -155884505.273 +1962 783 -3987050.08293 +784 784 214217606771 +785 784 115322986287 +786 784 1.0656e9 +789 784 -5830215573.66 +790 784 46307092540.2 +791 784 -83566669049.2 +1939 784 -808751586.85 +1940 784 -83921949516.6 +1944 784 -337772947.737 +1945 784 -64229793663.7 +1949 784 -4635427771.54 +1950 784 92619441499.1 +1951 784 108370823464 +1960 784 -539774711.96 +1962 784 3563476451.34 +785 785 729777702212 +786 785 -12056804927.2 +787 785 -671091575.778 +789 785 -2108666346.25 +790 785 -82545291271.4 +791 785 -431586589147 +792 785 -11473648364 +1939 785 -83921949516.6 +1940 785 -413789312093 +1944 785 -64229793663.7 +1945 785 -2.4982802656e11 +1949 785 -16958135034.7 +1950 785 108370823464 +1951 785 491968465415 +1960 785 7656577199.33 +1962 785 9756990400.69 +786 786 1.0390133581e11 +787 786 1052030857.66 +791 786 5278869317.09 +792 786 13381555437.8 +787 787 485556884.922 +788 787 46246653.2626 +791 787 2278495164.51 +792 787 -111291599.578 +811 787 -263271601.478 +812 787 -19374424.2245 +815 787 -1615036176.25 +816 787 -2316401434.47 +1916 787 18358618.1389 +1927 787 -106709625.602 +1938 787 20328032.1698 +1947 787 -131207433.651 +1948 787 -38686650.3087 +1958 787 205572231.667 +788 788 808630896.616 +789 788 27831993.9664 +811 788 -3741090.8912 +812 788 -351858593.178 +813 788 -15206993.9664 +1916 788 -189215037.943 +1927 788 18358618.1389 +1938 788 376006577.612 +1947 788 -38686650.3087 +1948 788 -199729470.703 +1958 788 20328032.1698 +789 789 859782518.269 +790 789 388293350.568 +791 789 6165566513.53 +812 789 -2581993.96645 +813 789 -361972789.797 +814 789 4853771168.07 +815 789 -3036897602.5 +1917 789 2259630095.72 +1918 789 -3036897602.5 +1929 789 -153052396.914 +1939 789 484264978.348 +1940 789 6165566513.53 +1949 789 -192466747.323 +1950 789 -3140102873.53 +1951 789 -2108666346.25 +1960 789 333794976.825 +790 790 213994957492 +791 790 86553871624.8 +813 790 -5264732993.11 +814 790 57762329410.7 +815 790 -28219131250.3 +1917 790 12063971529.2 +1918 790 -29021946987.3 +1929 790 -1401750695.44 +1939 790 89732242275.7 +1940 790 85669212273.7 +1949 790 3204388868.37 +1950 790 -1548369977.65 +1951 790 -80857816183.3 +1960 790 -1524355978.71 +791 791 922600037465 +792 791 16087811266.9 +811 791 -1728519857.58 +813 791 -2592152049.77 +814 791 -27197753472.5 +815 791 -470286505924 +816 791 -11995727465.4 +1917 791 -29021946987.3 +1918 791 -415963783607 +1929 791 7068860576.47 +1939 791 85669212273.7 +1940 791 837478860309 +1949 791 5846832166.18 +1950 791 -80857816183.3 +1951 791 -4.1563835807e11 +1960 791 -13007530835 +792 792 72442634660.6 +811 792 1324052269.4 +815 792 -11389727465.4 +816 792 29363788011.9 +793 793 273806062.981 +794 793 -11929478.2252 +797 793 2892561.98347 +799 793 -74685988.69 +800 793 23897070.0505 +801 793 -1.8e6 +1722 793 -54478629.0589 +1723 793 -26696652.5769 +1763 793 63272580.0029 +1764 793 -6383085.21366 +1855 793 -69222923.7339 +1856 793 34732842.9447 +794 794 295963458.921 +796 794 -2489646280.99 +799 794 8263736.71718 +800 794 -61931801.2676 +802 794 778790082.645 +804 794 1278076121.21 +1722 794 -26696652.5769 +1723 794 -53108290.2488 +1763 794 -6383085.21366 +1764 794 -11803186.2079 +1855 794 34732842.9447 +1856 794 -86055365.17 +795 795 254863924.367 +796 795 -2574324768.04 +797 795 281540558.037 +799 795 1.8e6 +801 795 -14507607.8482 +802 795 790505563.926 +803 795 -1654393492.64 +1710 795 59870990.2152 +1724 795 1049497863.54 +1725 795 -390212896.671 +1765 795 -2570795717.23 +1766 795 103685233.437 +1783 795 -122375786.197 +1840 795 45773247.3806 +1857 795 758310885.751 +1858 795 -33813180.2156 +796 796 2.9102552911e11 +797 796 -22602361110.5 +800 796 778790082.645 +801 796 1075416257.56 +802 796 -106316908718 +803 796 36867181661.9 +804 796 -8.64e7 +1710 796 -2598238469.74 +1724 796 -89018012675.8 +1725 796 -11212602212.7 +1765 796 182588271455 +1766 796 -19483659081.8 +1783 796 5375689983.68 +1840 796 -2335177205.23 +1857 796 -83093782566.6 +1858 796 36934531513.8 +797 797 140750653768 +801 797 714644025.111 +802 797 35845803884.1 +803 797 35860763625.9 +1710 797 1237591203.96 +1724 797 -11212602212.7 +1725 797 -37603683721.2 +1765 797 -19483659081.8 +1766 797 -45177760648.2 +1783 797 -760541353.44 +1840 797 -462268944.728 +1857 797 36934531513.8 +1858 797 -51638319682 +798 798 121846550629 +800 798 -1278076121.21 +802 798 8.64e7 +804 798 55674647272.7 +799 799 303371136.528 +800 799 -58005138.754 +801 799 -1.19209289551e-7 +803 799 2892561.98347 +805 799 -74286282.1388 +806 799 48668308.2424 +807 799 -1.8e6 +1763 799 -38389891.2905 +1764 799 -13144006.9154 +1855 799 91344980.2365 +1856 799 -38539865.9883 +1860 799 -127640846.706 +1861 799 52756966.6982 +800 800 395303951.574 +802 800 -2340579929.16 +804 800 -51492571.4289 +805 800 33034974.909 +806 800 -111159608.783 +808 800 458351829.988 +810 800 1226583549.78 +1763 800 -13144006.9154 +1764 800 -17097452.6524 +1855 800 -38539865.9883 +1856 800 57756948.5089 +1860 800 52756966.6982 +1861 800 -228334521.727 +801 801 301816069.048 +802 801 -2278761642.33 +803 801 825653013.063 +805 801 1.8e6 +807 801 3213695.31288 +808 801 -611576847.057 +809 801 -1580151672.11 +1765 801 1109889127.29 +1766 801 -1020613388.63 +1783 801 62299792.209 +1840 801 -31249885.8877 +1857 801 -2251018875.46 +1858 801 -119763478.835 +1862 801 -72934790.107 +1863 801 -618306949.912 +1864 801 -790310750.274 +802 802 268255682815 +803 802 -102411056422 +804 802 -1.14440917969e-5 +806 802 458351829.988 +807 802 691120765.853 +808 802 -67457423182.5 +809 802 86327944172.4 +810 802 -8.64e7 +1765 802 -78495637100.3 +1766 802 40064147138.7 +1783 802 -2679616480.34 +1840 802 4468651651.38 +1857 802 1.6124298771e11 +1858 802 -99811285919.9 +1862 802 -991899858.482 +1863 802 -61500776892.3 +1864 802 84600844581.9 +803 803 253582242121 +807 803 400547172.812 +808 803 85306566394.6 +809 803 -47330020266.4 +1765 803 40064147138.7 +1766 803 -49598433001.1 +1783 803 2746838996.77 +1840 803 -3440624621.9 +1857 803 -99811285919.9 +1858 803 51692131575.2 +1862 803 1121978931.89 +1863 803 84600844581.9 +1864 803 -154413233568 +804 804 1.4189041972e11 +806 804 -1226583549.78 +808 804 8.64e7 +810 804 75781818181.8 +805 805 274874299.095 +806 805 -37123050.8425 +807 805 -2.22e7 +809 805 1770070838.25 +810 805 1303360131.93 +817 805 -161522840.031 +818 805 51039191.2601 +821 805 -1066641086.19 +822 805 1303360131.93 +1855 805 -41383282.5242 +1856 805 3749290.46057 +1860 805 137361278.768 +1861 805 -52075802.4949 +1890 805 1375396.70772 +1894 805 -66608938.258 +806 806 344266708.161 +807 806 -1.89375e7 +808 806 -1498649350.65 +810 806 -1226583549.78 +817 806 35405857.9267 +818 806 -222942446.78 +819 806 6.3125e6 +1855 806 3749290.46057 +1856 806 -16956557.107 +1860 806 -52075802.4949 +1861 806 197765640.152 +1890 806 -134037295.623 +1894 806 1375396.70772 +807 807 337093259.906 +808 807 -2719480863.47 +809 807 1857587733.65 +818 807 -6.3125e6 +819 807 -108326424.407 +820 807 -1858449050.22 +821 807 -1791234255.54 +1840 807 8770108.56014 +1857 807 698590638.265 +1858 807 -476112670.15 +1862 807 66421535.5488 +1863 807 -1439193366.73 +1864 807 980927890.691 +1891 807 -585631425.899 +1892 807 -1791234255.54 +1896 807 -45089220.3753 +808 808 247792926247 +809 808 -160072842216 +810 808 1.0656e9 +819 808 3041854053.21 +820 808 10916139545.7 +821 808 112775388295 +1840 808 -3179669661.39 +1857 808 -47509367914.5 +1858 808 87691432935 +1862 808 5438133904.18 +1863 808 127192920087 +1864 808 -154963557148 +1891 808 -40937332819.8 +1892 808 113234312002 +1896 808 -1969260585.48 +809 809 522159247906 +810 809 9.09e8 +817 809 -1066641086.19 +819 809 -471228694.144 +820 809 111754010518 +821 809 -307748337607 +822 809 3.03e8 +1840 809 5476719544.89 +1857 809 87691432935 +1858 809 -148687870739 +1862 809 -11249422657.5 +1863 809 -154963557148 +1864 809 344431647527 +1891 809 113234312002 +1892 809 -265075516925 +1896 809 5966495745.17 +810 810 125488743723 +817 810 -1303360131.93 +821 810 -3.03e8 +822 810 38746835497.8 +811 811 473189344.482 +812 811 -3515621.69203 +815 811 3340177700.65 +816 811 946694491.883 +817 811 -154468222.825 +818 811 7256712.58323 +821 811 -1196491953.02 +822 811 -1348023167.97 +1890 811 31831158.8504 +1894 811 -93228370.251 +1916 811 -3289776.98928 +1927 811 167593168.267 +1938 811 -28541381.8611 +1958 811 -116143533.648 +812 812 642233387.659 +813 812 8894493.96645 +814 812 -2892561.98347 +817 812 22890045.9166 +818 812 -236946101.38 +819 812 -6.3125e6 +1890 812 -150071860.209 +1894 812 31831158.8504 +1916 812 326348967.118 +1927 812 -3289776.98928 +1938 812 -192988601.161 +1958 812 -28541381.8611 +813 813 591237767.899 +814 813 -2490670308.04 +815 813 4729430503.07 +818 813 6.3125e6 +819 813 -117248276.816 +820 813 2775206263.62 +821 813 -1176195668.68 +1891 813 1451974631.95 +1892 813 -1176195668.68 +1896 813 -58892139.6926 +1917 813 -1219760867.36 +1918 813 4729430503.07 +1929 813 212748194.876 +1939 813 -2670591920.77 +1940 813 -2592152049.77 +1960 813 -164902983.742 +814 814 180835802669 +815 814 -9143637803.89 +819 814 -2338119079.65 +820 814 44990947534.8 +821 814 38514806168.8 +1891 814 -2156958141.04 +1892 814 37301801930.8 +1896 814 -993978391.374 +1917 814 64157784869.5 +1918 814 -9170573384.43 +1929 814 -1321792737.03 +1939 814 11817432065.6 +1940 814 -25957813653.9 +1960 814 2290789348.03 +815 815 8.4274956408e11 +816 815 10977162902.9 +817 815 -1196491953.02 +819 815 -1615863248.79 +820 815 39536183946.6 +821 815 -340521000353 +822 815 -3.03e8 +1891 815 37301801930.8 +1892 815 -2.9551518867e11 +1896 815 5044542522.21 +1917 815 -9170573384.43 +1918 815 7.1603603658e11 +1929 815 -11603817249.1 +1939 815 -25957813653.9 +1940 815 -416580132266 +1960 815 6482605075.15 +816 816 8.59856584e10 +817 816 1348023167.97 +821 816 3.03e8 +822 816 35905258373.2 +817 817 388113656.04 +818 817 -58295903.8433 +821 817 2839166097.06 +822 817 44663036.0362 +1860 817 -125907788.833 +1861 817 48275396.7077 +1890 817 -33206555.5581 +1894 817 146360297.015 +1916 817 -15068841.1496 +1927 817 -74360554.159 +818 818 528168510.854 +819 818 -1.19209289551e-7 +820 818 -2892561.98347 +1860 818 48275396.7077 +1861 818 -157756835.853 +1890 818 278718351.234 +1894 818 -33206555.5581 +1916 818 -142524733.773 +1927 818 -15068841.1496 +819 819 364227878.655 +820 819 -547960239.103 +821 819 3148452015.85 +1862 819 -83265132.0508 +1863 819 1769036428.89 +1864 819 -471228694.144 +1891 819 -497546231.758 +1892 819 3148452015.85 +1896 819 117410736.713 +1917 819 -1014887447.99 +1918 819 -1615863248.79 +1929 819 -46345145.73 +820 820 195489598052 +821 820 -119204857701 +1862 820 -2123162612.31 +1863 820 -42487009448.2 +1864 820 110170178669 +1891 820 78471522697 +1892 820 -1.1845077717e11 +1896 820 2156830105.63 +1917 820 -1663879213.84 +1918 820 40365935264.1 +1929 820 -402464467.608 +821 821 692885706814 +822 821 1.90734863281e-5 +1862 821 3965196990.8 +1863 821 110170178669 +1864 821 -268949708496 +1891 821 -1.1845077717e11 +1892 821 575459129482 +1896 821 -9842682499.27 +1917 821 40365935264.1 +1918 821 -294282491352 +1929 821 5696463416.84 +822 822 86500876553.3 +823 823 233204326.923 +824 823 -4.76837158203e-7 +828 823 -96397836.5385 +829 823 -2.98023223877e-7 +842 823 -12006181.3187 +843 823 -4.75e7 +846 823 -3583791.20879 +847 823 3.8743019104e-7 +850 823 -96397836.5384 +851 823 -5.06639480591e-7 +863 823 -12006181.3187 +864 823 4.75e7 +824 824 3319145922.1 +825 824 -1.09672546387e-5 +828 824 -5.96046447754e-8 +829 824 360859731.255 +830 824 -65306122.449 +842 824 -4.75e7 +843 824 -555114468.864 +846 824 -4.17232513428e-7 +847 824 -1649386446.89 +850 824 1.49011611939e-7 +851 824 360859731.255 +852 824 65306122.449 +863 824 4.75e7 +864 824 -555114468.864 +825 825 914285714.286 +829 825 65306122.449 +830 825 228571428.571 +851 825 -65306122.449 +852 825 228571428.571 +826 826 7642608697.71 +831 826 -3779212001.1 +832 826 1.16415321827e-9 +844 826 -1184775903.35 +845 826 247395.833333 +848 826 2398297800.29 +849 826 2.32830643654e-10 +853 826 -3779212001.1 +854 826 4.19095158577e-9 +855 826 -289095.794921 +857 826 -1156383.18034 +860 826 -289095.794922 +866 826 -1184775903.35 +867 826 -247395.833333 +868 826 -60643366.3825 +870 826 123497963.041 +873 826 -60643366.3825 +827 827 14858933933 +831 827 2.67755240202e-9 +832 827 3714705378.9 +844 827 247395.833333 +845 827 -4234.15560134 +848 827 4.88944351673e-9 +849 827 -93709.4589438 +853 827 -1.86264514923e-9 +854 827 3714705378.9 +855 827 1061339725.19 +857 827 .000190751161426 +860 827 -1061339725.19 +866 827 -247395.833333 +867 827 -4234.15560135 +868 827 1978.67608582 +870 827 2.67755240202e-9 +873 827 -1978.67608582 +828 828 233204326.923 +829 828 2.38418579102e-7 +833 828 -96397836.5385 +834 828 1.19209289551e-7 +838 828 -12006181.3187 +839 828 -4.75e7 +842 828 -3583791.20879 +843 828 -5.06639480591e-7 +846 828 -12006181.3187 +847 828 4.75e7 +829 829 3319145922.1 +830 829 5.48362731934e-6 +833 829 -1.78813934326e-7 +834 829 360859731.255 +835 829 -65306122.449 +838 829 -4.75e7 +839 829 -555114468.864 +842 829 2.68220901489e-7 +843 829 -1649386446.89 +846 829 4.75e7 +847 829 -555114468.864 +830 830 914285714.286 +834 830 65306122.449 +835 830 228571428.571 +831 831 7642608697.7 +832 831 -5.58793544769e-9 +836 831 -3779212001.09 +837 831 -2.32830643654e-10 +840 831 -1184775903.35 +841 831 247395.833333 +844 831 2398297800.29 +845 831 5.23868948221e-9 +848 831 -1184775903.35 +849 831 -247395.833333 +857 831 -289095.794921 +860 831 -1156383.18044 +870 831 -60643366.3825 +873 831 123497963.041 +881 831 -289095.794822 +893 831 -60643366.3825 +832 832 14858933933 +836 832 4.3073669076e-9 +837 832 3714705378.9 +840 832 247395.833333 +841 832 -4234.15560134 +844 832 -2.79396772385e-9 +845 832 -93709.4589438 +848 832 -247395.833333 +849 832 -4234.15560134 +857 832 1061339725.19 +860 832 -9.9188182503e-5 +870 832 1978.67608582 +873 832 -1.45519152284e-9 +881 832 -1061339725.19 +893 832 -1978.67608582 +833 833 233204326.923 +838 833 -3583791.20879 +839 833 2.98023223877e-7 +842 833 -12006181.3187 +843 833 4.75e7 +876 833 -96397836.5385 +877 833 -1.49011611939e-7 +886 833 -12006181.3187 +887 833 -4.75e7 +834 834 3319145922.1 +835 834 -2.86102294922e-6 +838 834 -4.76837158203e-7 +839 834 -1649386446.89 +842 834 4.75e7 +843 834 -555114468.864 +876 834 -5.96046447754e-8 +877 834 360859731.255 +878 834 -65306122.449 +886 834 -4.75e7 +887 834 -555114468.864 +835 835 914285714.286 +877 835 65306122.449 +878 835 228571428.571 +836 836 7642608697.71 +837 836 -2.79396772385e-9 +840 836 2398297800.29 +841 836 5.82076609135e-10 +844 836 -1184775903.35 +845 836 -247395.833333 +860 836 -289095.794822 +873 836 -60643366.3825 +879 836 -3779212001.1 +880 836 1.16415321827e-9 +881 836 -1156383.18034 +884 836 -289095.795022 +889 836 -1184775903.35 +890 836 247395.833333 +891 836 -60643366.3825 +893 836 123497963.041 +837 837 14858933933 +840 837 8.38190317154e-9 +841 837 -93709.4589438 +844 837 -247395.833333 +845 837 -4234.15560134 +860 837 1061339725.19 +873 837 1978.67608582 +879 837 3.37604433298e-9 +880 837 3714705378.9 +881 837 5.34071587026e-5 +884 837 -1061339725.19 +889 837 247395.833333 +890 837 -4234.15560134 +891 837 -1978.67608582 +893 837 1.04773789644e-9 +838 838 68453296.7033 +839 838 2.38418579102e-7 +842 838 -6630494.50549 +843 838 -1.19209289551e-7 +876 838 -12006181.3187 +877 838 4.75e7 +886 838 -6630494.5055 +887 838 2.98023223877e-8 +1183 838 -12006181.3187 +1184 838 -4.75e7 +1191 838 -3583791.20879 +1192 838 2.98023223877e-7 +1197 838 -12006181.3187 +1198 838 4.75e7 +839 839 4060201465.2 +843 839 729514652.015 +876 839 4.75e7 +877 839 -555114468.864 +886 839 -3.8743019104e-7 +887 839 729514652.015 +1183 839 -4.75e7 +1184 839 -555114468.864 +1191 839 -4.76837158203e-7 +1192 839 -1649386446.89 +1197 839 4.75e7 +1198 839 -555114468.864 +840 840 4840211290.44 +841 840 -6.51925802231e-9 +844 840 -2362613658.04 +845 840 1.97906047106e-9 +860 840 60643366.3825 +873 840 4.76837158203e-7 +879 840 -1184775903.35 +880 840 -247395.833333 +881 840 -123497963.041 +884 840 60643366.3825 +889 840 -2362613658.04 +890 840 -2.32830643654e-10 +891 840 -4.76837158203e-7 +1181 840 -60643366.3825 +1186 840 -1184775903.35 +1187 840 247395.833333 +1188 840 123497963.041 +1194 840 2398297800.29 +1195 840 5.82076609135e-10 +1196 840 -60643366.3825 +1200 840 -1184775903.35 +1201 840 -247395.833333 +841 841 1464204.63217 +844 841 1.16415321827e-9 +845 841 327664.739774 +860 841 1978.67608582 +873 841 87241.6274202 +879 841 -247395.833333 +880 841 -4234.15560134 +881 841 9.31322574615e-10 +884 841 -1978.67608582 +889 841 3.49245965481e-9 +890 841 327664.739774 +891 841 -87241.6274202 +893 841 9.31322574615e-10 +1181 841 -1978.67608582 +1186 841 247395.833333 +1187 841 -4234.15560134 +1188 841 1.04773789644e-9 +1194 841 8.38190317154e-9 +1195 841 -93709.4589438 +1196 841 1978.67608582 +1200 841 -247395.833333 +1201 841 -4234.15560134 +842 842 68453296.7033 +846 842 -6630494.5055 +847 842 -2.08616256714e-7 +1191 842 -12006181.3187 +1192 842 -4.75e7 +1197 842 -3583791.20879 +1198 842 -5.06639480591e-7 +1202 842 -12006181.3187 +1203 842 4.75e7 +843 843 4060201465.2 +846 843 -1.78813934326e-7 +847 843 729514652.014 +1191 843 -4.75e7 +1192 843 -555114468.864 +1197 843 2.68220901489e-7 +1198 843 -1649386446.89 +1202 843 4.75e7 +1203 843 -555114468.864 +844 844 4840211290.44 +845 844 -1.86264514923e-9 +848 844 -2362613658.04 +849 844 2.67755240202e-9 +857 844 60643366.3825 +860 844 -123497963.041 +870 844 -4.76837158203e-7 +881 844 60643366.3825 +893 844 -4.76837158203e-7 +1188 844 -60643366.3825 +1194 844 -1184775903.35 +1195 844 247395.833333 +1196 844 123497963.041 +1200 844 2398297800.29 +1201 844 5.23868948221e-9 +1205 844 -1184775903.35 +1206 844 -247395.833333 +1207 844 -60643366.3825 +845 845 1464204.63217 +848 845 1.39698386192e-9 +849 845 327664.739774 +857 845 1978.67608582 +860 845 -1.22236087918e-9 +870 845 87241.6274202 +873 845 -3.95812094212e-9 +881 845 -1978.67608582 +893 845 -87241.6274202 +1188 845 -1978.67608582 +1194 845 247395.833333 +1195 845 -4234.15560134 +1196 845 -1.45519152284e-9 +1200 845 -2.79396772385e-9 +1201 845 -93709.4589438 +1205 845 -247395.833333 +1206 845 -4234.15560134 +1207 845 1978.67608582 +846 846 68453296.7033 +847 846 -2.38418579102e-7 +850 846 -12006181.3187 +851 846 -4.75e7 +863 846 -6630494.50549 +864 846 -1.78813934326e-7 +1197 846 -12006181.3187 +1198 846 -4.75e7 +1202 846 -3583791.20879 +1203 846 3.8743019104e-7 +1212 846 -12006181.3187 +1213 846 4.75e7 +847 847 4060201465.2 +850 847 -4.75e7 +851 847 -555114468.864 +863 847 -1.49011611939e-7 +864 847 729514652.015 +1197 847 -4.75e7 +1198 847 -555114468.864 +1202 847 -4.17232513428e-7 +1203 847 -1649386446.89 +1212 847 4.75e7 +1213 847 -555114468.864 +848 848 4840211290.44 +849 848 -7.45058059692e-9 +853 848 -1184775903.35 +854 848 247395.833333 +855 848 60643366.3825 +857 848 -123497963.041 +860 848 60643366.3825 +866 848 -2362613658.04 +867 848 2.09547579288e-9 +873 848 -4.76837158203e-7 +1196 848 -60643366.3825 +1200 848 -1184775903.35 +1201 848 247395.833333 +1205 848 2398297800.29 +1206 848 2.32830643654e-10 +1207 848 123497963.041 +1210 848 -60643366.3825 +1215 848 -1184775903.35 +1216 848 -247395.833333 +849 849 1464204.63217 +853 849 247395.833333 +854 849 -4234.15560135 +855 849 1978.67608582 +857 849 2.73576006293e-9 +860 849 -1978.67608582 +866 849 2.32830643654e-9 +867 849 327664.739774 +868 849 87241.6274202 +870 849 1.09430402517e-8 +873 849 -87241.6274202 +1196 849 -1978.67608582 +1200 849 247395.833333 +1201 849 -4234.15560134 +1205 849 4.88944351673e-9 +1206 849 -93709.4589438 +1207 849 2.67755240202e-9 +1210 849 1978.67608582 +1215 849 -247395.833333 +1216 849 -4234.15560135 +850 850 147598129.623 +852 850 2562001.36132 +853 850 174683.657818 +854 850 554380714.595 +855 850 4784105.78784 +856 850 280000.184637 +857 850 -204298.717158 +858 850 -1343478.78703 +859 850 279999.068872 +863 850 -2363771.71167 +864 850 3494907.88039 +865 850 21808454.335 +866 850 1486954.93769 +867 850 -12150.427044 +868 850 -1922423.0928 +869 850 -279999.069115 +870 850 -102149.352812 +871 850 -671739.626715 +872 850 -280000.18488 +896 850 430162.444039 +897 850 -28341135.7388 +898 850 3.25962901115e-8 +899 850 1281000.68065 +900 850 87341.8289085 +901 850 554380714.595 +902 850 283731.322713 +903 850 140000.095434 +904 850 306334.006225 +905 850 -651864.881328 +906 850 139999.531685 +910 850 -2090613.66726 +911 850 1056679.10951 +912 850 3486258.96796 +913 850 -16909407.8294 +914 850 -12150.427044 +915 850 141865.647053 +916 850 -139999.531442 +917 850 153167.003112 +918 850 -325932.561084 +919 850 -140000.095191 +851 851 7743369817.35 +852 851 -60880441.1474 +853 851 -64909343.3301 +855 851 -9.53674316406e-7 +863 851 -3494907.88039 +864 851 -4892898280.46 +868 851 3741313.67444 +896 851 -5.36441802978e-7 +897 851 -3.632158041e-8 +898 851 2910480292.36 +899 851 4425681.3016 +900 851 -64909343.3301 +910 851 51131286.8839 +911 851 3486258.96796 +912 851 -2074228117.67 +852 852 1790495697.71 +853 852 -27655487.1416 +854 852 -1.86264514923e-9 +855 852 -174683.657818 +863 852 -21808454.335 +865 852 403989431.255 +866 852 27545009.3966 +867 852 -19486.008721 +868 852 1486954.93769 +896 852 -87341.8289084 +897 852 1281000.68065 +898 852 -4425681.3016 +899 852 -1134768980.85 +900 852 -136654794.633 +901 852 -1.62981450558e-9 +910 852 -1152925.69933 +911 852 16909407.8294 +913 852 -340301826.683 +914 852 -266308.785854 +853 853 5558381324.48 +854 853 -8.38190317154e-9 +855 853 -590101.958668 +857 853 -289095.794921 +863 853 -1486954.93769 +865 853 27545009.3966 +866 853 1201026987.75 +867 853 18202.6452104 +868 853 61850365.8256 +870 853 -60643366.3825 +896 853 -5955.18424955 +897 853 87341.8289084 +898 853 64909343.3301 +899 853 -136654794.633 +900 853 860163832.404 +901 853 -1.16415321827e-10 +910 853 -78609.3564946 +911 853 1152925.69933 +913 853 -23202629.2978 +914 853 -18157.5987915 +854 854 22282052661.7 +855 854 1023540662.12 +857 854 -1061339725.19 +863 854 -12150.427044 +865 854 19486.008721 +866 854 -18202.6452104 +867 854 -627593.209969 +868 854 2807.12257775 +870 854 -1978.67608582 +896 854 37799063.0729 +897 854 -554380714.595 +899 854 3.95812094212e-9 +900 854 2.69210431725e-10 +901 854 7426163484.31 +910 854 -828.44649193 +911 854 12150.427044 +913 854 -266308.785854 +914 854 -202023.574818 +855 855 311400170.514 +856 855 -92591.1640687 +857 855 -206676506.746 +858 855 341699.463249 +859 855 -51068.1292996 +863 855 -1922423.0928 +864 855 -3741313.67444 +865 855 -1486954.93769 +866 855 -61850365.8256 +867 855 2807.12257775 +868 855 -29911692.8109 +869 855 92590.7891601 +870 855 3131604.235 +871 855 170849.737392 +872 855 51068.034595 +896 855 -22049344.6707 +897 855 167895.586345 +898 855 4.76837158203e-7 +899 855 -87341.8289085 +900 855 -5955.18424955 +901 855 -37799063.0729 +902 855 -120693.387045 +903 855 -87818.243235 +904 855 -80567.6036584 +905 855 306334.006225 +906 855 -46295.39324 +910 855 -29456737.5236 +911 855 -2221747.11041 +912 855 51131286.8839 +913 855 1152925.69933 +914 855 828.44649193 +915 855 -60346.9344636 +916 855 87818.5227136 +917 855 -40283.9222492 +918 855 153167.003112 +919 855 46295.5833745 +856 856 103778.872564 +857 856 -22431.9247326 +858 856 -279999.064879 +859 856 51886.3775901 +863 856 279999.069115 +868 856 -92590.7891601 +869 856 -103774.433202 +870 856 -22431.7154827 +871 856 -280000.188872 +872 856 -51890.2752931 +896 856 -9464.00618148 +897 856 140000.091442 +902 856 78191.1414477 +903 856 53520.9365327 +904 856 46295.397988 +905 856 -139999.531198 +906 856 26758.9554962 +910 856 -9463.96859533 +911 856 139999.535434 +915 856 78191.4501587 +916 856 -53519.2806113 +917 856 46295.5786264 +918 856 -140000.095678 +919 856 -26761.1530758 +857 857 413761287.325 +858 857 -91599.9942204 +859 857 -147000.102756 +860 857 -206673383.968 +861 857 295898.706582 +862 857 -41522.6110201 +863 857 -102149.352812 +866 857 60643366.3825 +867 857 -1978.67608582 +868 857 3131604.235 +869 857 22431.7154827 +870 857 -6234841.38352 +871 857 -45799.9976099 +872 857 146999.505464 +873 857 3133165.62453 +874 857 147949.355218 +875 857 41522.4783151 +896 857 16201.4458132 +897 857 -239666.358184 +902 857 -40928.115521 +903 857 -31977.2909564 +904 857 -201485.302105 +905 857 -44444.8694186 +906 857 -156545.023639 +907 857 -60438.3113562 +908 857 284111.233065 +909 857 -41522.459226 +910 857 8100.72290661 +911 857 -119833.179092 +915 857 -20464.1781805 +916 857 31977.4238183 +917 857 -100743.132382 +918 857 -22222.442903 +919 857 156545.65914 +920 857 -30219.2760976 +921 857 142055.616532 +922 857 41522.6301091 +858 858 2686961.80528 +859 858 -.0029877871275 +860 858 -250099.473825 +861 858 -1343481.8225 +862 858 279999.067543 +863 858 -671739.626716 +868 858 170849.737392 +869 858 280000.188872 +870 858 -45799.9976098 +871 858 1343480.43563 +872 858 -.0029877088964 +873 858 -125049.734986 +874 858 -671741.144715 +875 858 -280000.186209 +896 858 44066.0584281 +897 858 -651864.769646 +902 858 -283732.416612 +903 858 -139999.53519 +904 858 -44444.8694187 +905 858 1303732.16117 +906 858 .00266292784363 +907 858 284111.233065 +908 858 -651867.643472 +909 858 139999.532852 +910 858 22033.0373544 +911 858 -325932.505243 +915 858 -141866.216446 +916 858 140000.091685 +917 858 -22222.4429031 +918 858 651865.839396 +919 858 .00266295205802 +920 858 142055.616532 +921 858 -325933.942156 +922 858 -140000.094024 +859 859 207557.389548 +860 859 -31977.4428303 +861 859 -279999.066209 +862 859 51886.2625117 +863 859 280000.18488 +868 859 -51068.034595 +869 859 -51890.2752931 +870 859 -146999.505464 +871 859 .00298773124814 +872 859 -207548.743351 +873 859 -31977.2719444 +874 859 -280000.187543 +875 859 -51890.1510547 +896 859 -9463.96861179 +897 859 139999.535677 +902 859 41441.2643163 +903 859 26759.0392574 +904 859 156545.033185 +905 859 -.00266300886869 +906 859 107041.631392 +907 859 41522.4639959 +908 859 -139999.53269 +909 859 26758.8661155 +910 859 -9464.00616503 +911 859 140000.091199 +915 859 41441.4252353 +916 859 -26761.0693146 +917 859 156545.649595 +918 859 .00266294460744 +919 859 -107038.324262 +920 859 41522.6253393 +921 859 -140000.094186 +922 859 -26761.0031396 +860 860 413758164.547 +862 860 -147000.102857 +870 860 3133165.62453 +871 860 -125049.734986 +872 860 31977.2719444 +873 860 -6236402.77289 +874 860 -2.70083546639e-8 +875 860 146999.505363 +881 860 -206673383.968 +882 860 250099.473825 +883 860 -31977.4428303 +893 860 3133165.62453 +894 860 125049.734986 +895 860 31977.2719444 +904 860 -41825.1217072 +905 860 -261889.131344 +906 860 -36749.8751311 +907 860 -203000.039569 +908 860 1.58324837685e-8 +909 860 -156544.67355 +917 860 -20912.6812731 +918 860 -130944.565672 +919 860 36750.0269238 +920 860 -101500.501393 +921 860 -4.19095158577e-9 +922 860 156545.309231 +925 860 -41825.1217072 +926 860 261889.131344 +927 860 -36749.8751311 +936 860 -20912.6812731 +937 860 130944.565672 +938 860 36750.0269238 +861 861 2686964.84092 +862 861 -5.21540641785e-8 +870 861 147949.355218 +871 861 -671741.144715 +872 861 280000.187543 +873 861 7.45058059692e-9 +874 861 1343481.95346 +881 861 -295898.706582 +882 861 -1343481.8225 +883 861 279999.066209 +893 861 -147949.355218 +894 861 -671741.144715 +895 861 -280000.187543 +904 861 -261889.131344 +905 861 -651867.606246 +906 861 -139999.534023 +907 861 -2.04890966415e-8 +908 861 1303734.96036 +909 861 -2.14204192162e-8 +917 861 -130944.565672 +918 861 -325933.923542 +919 861 140000.092853 +920 861 -1.58324837685e-8 +921 861 651867.239269 +922 861 -8.38190317154e-9 +925 861 261889.131344 +926 861 -651867.606246 +927 861 139999.534023 +936 861 130944.565672 +937 861 -325933.923542 +938 861 -140000.092853 +862 862 207557.145651 +870 862 -41522.4783151 +871 862 280000.186209 +872 862 -51890.1510547 +873 862 -146999.505363 +874 862 2.04890966415e-8 +875 862 -207548.508614 +881 862 -41522.6110201 +882 862 -279999.067543 +883 862 51886.2625117 +893 862 -41522.4783151 +894 862 -280000.186209 +895 862 -51890.1510547 +904 862 36749.879901 +905 862 139999.534186 +906 862 26758.8940352 +907 862 156544.683095 +908 862 -4.28408384323e-8 +909 862 107041.38972 +917 862 36750.022154 +918 862 140000.09269 +919 862 -26760.9752199 +920 862 156545.299685 +921 862 -1.11758708954e-8 +922 862 -107038.087301 +925 862 36749.879901 +926 862 -139999.534186 +927 862 26758.8940352 +936 862 36750.022154 +937 862 -140000.09269 +938 862 -26760.9752199 +863 863 39438284.0243 +864 863 -2.38418579102e-7 +867 863 30541.4657061 +868 863 3364363.97384 +869 863 -3.91155481339e-8 +870 863 -408597.434317 +871 863 -2686957.57405 +872 863 4.65661287308e-8 +896 863 -2090613.66726 +897 863 1056679.10951 +898 863 -3486258.96796 +899 863 16909407.8294 +900 863 1152925.69933 +901 863 -12150.427044 +902 863 141865.647053 +903 863 139999.531442 +904 863 153167.003112 +905 863 -325932.561084 +906 863 140000.095191 +910 863 3504409.72802 +911 863 -195209.9648 +912 863 -1.39698386192e-8 +913 863 1.19209289551e-7 +914 863 30541.4657061 +915 863 567462.645425 +916 863 -4.47034835815e-8 +917 863 612668.01245 +918 863 -1303729.76266 +919 863 6.51925802231e-9 +1202 863 -12006181.3187 +1203 863 -4.75e7 +1207 863 -102149.352812 +1208 863 -671739.626716 +1209 863 -280000.18488 +1210 863 -1922423.0928 +1211 863 -279999.069115 +1212 863 -2363771.71167 +1213 863 3494907.88039 +1214 863 21808454.335 +1215 863 1486954.93769 +1216 863 -12150.427044 +1217 863 153167.003112 +1218 863 -325932.561084 +1219 863 -140000.095191 +1220 863 141865.647053 +1221 863 -139999.531442 +1222 863 -2090613.66726 +1223 863 1056679.10951 +1224 863 3486258.96796 +1225 863 -16909407.8294 +1226 863 -1152925.69933 +1227 863 -12150.427044 +864 864 10273512417.7 +868 864 -2.38418579102e-7 +896 864 -51131286.8839 +897 864 -3486258.96796 +898 864 -2074228117.67 +910 864 -5.96046447754e-8 +911 864 -3.72529029846e-9 +912 864 4041454664.25 +1202 864 -4.75e7 +1203 864 -555114468.864 +1210 864 3741313.67444 +1212 864 -3494907.88039 +1213 864 -4892898280.46 +1222 864 51131286.8839 +1223 864 3486258.96796 +1224 864 -2074228117.67 +865 865 893635296.65 +866 865 60930288.6138 +867 865 3.72529029846e-9 +896 865 1152925.69933 +897 865 -16909407.8294 +899 865 -340301826.683 +900 865 -23202629.2978 +901 865 266308.785854 +910 865 7.45058059692e-9 +911 865 -1.19209289551e-7 +913 865 -638884878.362 +914 865 2.44472175837e-9 +1210 865 1486954.93769 +1212 865 -21808454.335 +1214 865 403989431.255 +1215 865 27545009.3966 +1216 865 -19486.008721 +1222 865 -1152925.69933 +1223 865 16909407.8294 +1225 865 -340301826.683 +1226 865 -23202629.2978 +1227 865 -266308.785854 +866 866 2424260024.62 +867 866 -2.79396772385e-9 +896 866 78609.3564946 +897 866 -1152925.69933 +899 866 -23202629.2978 +900 866 -1582013.2721 +901 866 18157.5987915 +910 866 4.65661287308e-10 +911 866 -7.45058059692e-9 +913 866 -43560768.2189 +914 866 1.67347025126e-10 +1205 866 -1184775903.35 +1206 866 247395.833333 +1207 866 -60643366.3825 +1210 866 61850365.8256 +1212 866 -1486954.93769 +1214 866 27545009.3966 +1215 866 1201026987.75 +1216 866 18202.6452104 +1222 866 -78609.3564946 +1223 866 1152925.69933 +1225 866 -23202629.2978 +1226 866 -1582013.2721 +1227 866 -18157.5987915 +867 867 2060769.23191 +868 867 85159.2339347 +870 867 -87241.6274202 +896 867 -828.44649193 +897 867 12150.427044 +899 867 266308.785854 +900 867 18157.5987915 +901 867 -202023.574818 +910 867 2082.39348551 +911 867 -30541.4657061 +913 867 -6.98491930962e-10 +914 867 487642.127049 +1205 867 247395.833333 +1206 867 -4234.15560135 +1207 867 -1978.67608582 +1210 867 2807.12257775 +1212 867 -12150.427044 +1214 867 19486.008721 +1215 867 -18202.6452104 +1216 867 -627593.209969 +1222 867 -828.44649193 +1223 867 12150.427044 +1225 867 -266308.785854 +1226 867 -18157.5987915 +1227 867 -202023.574818 +868 868 68238010.6623 +869 868 4.65661287308e-9 +870 868 -6148189.81572 +871 868 683398.926498 +872 868 -1.51339918375e-8 +896 868 -29456737.5236 +897 868 -2221747.11041 +898 868 -51131286.8839 +899 868 -1152925.69933 +900 868 -78609.3564946 +901 868 828.44649193 +902 868 -60346.9344636 +903 868 -87818.5227136 +904 868 -40283.9222492 +905 868 153167.003112 +906 868 -46295.5833745 +910 868 50987615.0473 +911 868 2979876.01263 +912 868 -2.08616256714e-7 +913 868 -7.45058059692e-9 +914 868 -2082.39348551 +915 868 -241386.77409 +916 868 2.09547579288e-8 +917 868 -161135.207317 +918 868 612668.01245 +919 868 -9.0803951025e-9 +1205 868 60643366.3825 +1206 868 1978.67608582 +1207 868 3131604.235 +1208 868 170849.737392 +1209 868 51068.034595 +1210 868 -29911692.8109 +1211 868 92590.7891601 +1212 868 -1922423.0928 +1213 868 -3741313.67444 +1214 868 -1486954.93769 +1215 868 -61850365.8256 +1216 868 2807.12257775 +1217 868 -40283.9222492 +1218 868 153167.003112 +1219 868 46295.5833745 +1220 868 -60346.9344636 +1221 868 87818.5227136 +1222 868 -29456737.5236 +1223 868 -2221747.11041 +1224 868 51131286.8839 +1225 868 1152925.69933 +1226 868 78609.3564946 +1227 868 828.44649193 +869 869 207557.745128 +870 869 2.91038304567e-9 +871 869 9.31322574615e-9 +872 869 103772.75518 +896 869 9463.96859533 +897 869 -139999.535434 +902 869 -78191.4501587 +903 869 -53519.2806113 +904 869 -46295.5786264 +905 869 140000.095678 +906 869 -26761.1530759 +910 869 3.77744436264e-10 +911 869 -5.58793544769e-9 +915 869 -1.77472829819e-9 +916 869 107041.873065 +917 869 -3.49245965481e-9 +918 869 -1.86264514923e-9 +919 869 53517.9109923 +1207 869 -22431.7154827 +1208 869 -280000.188872 +1209 869 -51890.2752931 +1210 869 -92590.7891601 +1211 869 -103774.433202 +1212 869 279999.069115 +1217 869 46295.5786264 +1218 869 -140000.095678 +1219 869 -26761.1530758 +1220 869 78191.4501587 +1221 869 -53519.2806113 +1222 869 -9463.96859533 +1223 869 139999.535434 +870 870 13090229.4162 +871 870 -183199.988441 +872 870 -6.75208866596e-9 +873 870 -6141944.25863 +874 870 591797.413165 +875 870 -1.30385160446e-8 +896 870 8100.72290661 +897 870 -119833.179092 +902 870 -20464.1781805 +903 870 -31977.4238183 +904 870 -100743.132382 +905 870 -22222.442903 +906 870 -156545.65914 +907 870 -30219.2760976 +908 870 142055.616532 +909 870 -41522.6301091 +910 870 32402.8916265 +911 870 -479332.716368 +915 870 -81856.231042 +916 870 1.22236087918e-8 +917 870 -402970.60421 +918 870 -88889.7388373 +919 870 1.39698386192e-8 +920 870 -120876.622712 +921 870 568222.46613 +922 870 -7.21774995327e-9 +1113 870 23626.2904729 +1114 870 147949.355218 +1115 870 41522.4783151 +1116 870 -30219.2760976 +1117 870 142055.616532 +1118 870 41522.6301091 +1196 870 3109539.33406 +1200 870 60643366.3825 +1201 870 1978.67608582 +1205 870 -123497963.041 +1206 870 2.73576006293e-9 +1207 870 -6234841.38352 +1208 870 -45799.9976099 +1209 870 146999.505464 +1210 870 3131604.235 +1211 870 22431.7154827 +1212 870 -102149.352812 +1215 870 60643366.3825 +1216 870 -1978.67608582 +1217 870 -100743.132382 +1218 870 -22222.4429031 +1219 870 156545.65914 +1220 870 -20464.1781805 +1221 870 31977.4238183 +1222 870 8100.72290661 +1223 870 -119833.179092 +871 871 5373923.61057 +872 871 -1.22934579849e-7 +873 871 -500198.94765 +874 871 -2686963.64501 +875 871 4.47034835815e-8 +896 871 22033.0373544 +897 871 -325932.505243 +902 871 -141866.216446 +903 871 -140000.091685 +904 871 -22222.442903 +905 871 651865.839396 +906 871 -.00266295578331 +907 871 142055.616532 +908 871 -325933.942156 +909 871 140000.094024 +910 871 88132.1168561 +911 871 -1303729.53929 +915 871 -567464.833224 +916 871 3.53902578354e-8 +917 871 -88889.7388373 +918 871 2607464.32234 +919 871 -6.89178705216e-8 +920 871 568222.46613 +921 871 -1303735.28694 +922 871 -9.31322574615e-10 +1113 871 -125049.734986 +1114 871 -671741.144715 +1115 871 -280000.186209 +1116 871 142055.616532 +1117 871 -325933.942156 +1118 871 -140000.094024 +1207 871 -45799.9976098 +1208 871 1343480.43563 +1209 871 -.00298771634698 +1210 871 170849.737392 +1211 871 280000.188872 +1212 871 -671739.626716 +1217 871 -22222.4429031 +1218 871 651865.839396 +1219 871 .00266295019537 +1220 871 -141866.216446 +1221 871 140000.091685 +1222 871 22033.0373544 +1223 871 -325932.505243 +872 872 415114.779096 +873 872 5.23868948221e-9 +874 872 3.72529029846e-9 +875 872 103772.525023 +896 872 9464.00616503 +897 872 -140000.091199 +902 872 -41441.4252353 +903 872 -26761.0693146 +904 872 -156545.649595 +905 872 -.00266294460744 +906 872 -107038.324262 +907 872 -41522.6253393 +908 872 140000.094186 +909 872 -26761.0031396 +910 872 -2.83308327198e-9 +911 872 4.19095158577e-8 +915 872 1.33104622364e-8 +916 872 53518.0785148 +917 872 1.58324837685e-8 +918 872 -6.79865479469e-8 +919 872 214083.262785 +920 872 -4.65661287308e-9 +921 872 -1.86264514923e-9 +922 872 53517.732231 +1113 872 -31977.2719444 +1114 872 -280000.187543 +1115 872 -51890.1510547 +1116 872 41522.6253393 +1117 872 -140000.094186 +1118 872 -26761.0031396 +1207 872 -146999.505464 +1208 872 .00298772193492 +1209 872 -207548.743351 +1210 872 -51068.034595 +1211 872 -51890.2752931 +1212 872 280000.18488 +1217 872 156545.649595 +1218 872 .00266294460744 +1219 872 -107038.324262 +1220 872 41441.4252353 +1221 872 -26761.0693146 +1222 872 -9464.00616503 +1223 872 140000.091199 +873 873 13083983.8588 +874 873 -2.60770320892e-8 +875 873 -1.62981450558e-8 +881 873 3133165.62453 +882 873 125049.734986 +883 873 -31977.2719444 +893 873 -6141944.25863 +894 873 500198.94765 +895 873 -9.77888703346e-9 +904 873 -20912.6812731 +905 873 -130944.565672 +906 873 -36750.0269238 +907 873 -101500.501393 +908 873 1.30385160446e-8 +909 873 -156545.30923 +917 873 -83650.2434145 +918 873 -523778.262688 +919 873 1.60653144121e-8 +920 873 -406000.079139 +921 873 2.60770320892e-8 +922 873 1.210719347e-8 +925 873 -20912.6812731 +926 873 130944.565672 +927 873 -36750.0269238 +936 873 -83650.2434145 +937 873 523778.262688 +938 873 -6.053596735e-9 +1113 873 96072.319643 +1114 873 -2.32830643654e-8 +1115 873 146999.505363 +1116 873 -101500.501393 +1117 873 -6.98491930962e-9 +1118 873 156545.309231 +1172 873 -20912.6812731 +1173 873 130944.565672 +1174 873 36750.0269238 +1188 873 3133165.62453 +1189 873 125049.734986 +1190 873 31977.2719444 +1194 873 60643366.3825 +1195 873 1978.67608582 +1196 873 -6332475.09254 +1200 873 -123497963.041 +1201 873 -1.22236087918e-9 +1205 873 60643366.3825 +1206 873 -1978.67608582 +1207 873 3133165.62453 +1208 873 -125049.734986 +1209 873 31977.2719444 +1217 873 -20912.6812731 +1218 873 -130944.565672 +1219 873 36750.0269238 +874 874 5373929.68184 +875 874 -1.210719347e-7 +881 874 -147949.355218 +882 874 -671741.144715 +883 874 280000.187543 +893 874 -591797.413165 +894 874 -2686963.645 +895 874 4.28408384323e-8 +904 874 -130944.565672 +905 874 -325933.923542 +906 874 -140000.092853 +907 874 1.95577740669e-8 +908 874 651867.239269 +909 874 7.45058059692e-9 +917 874 -523778.262688 +918 874 -1303735.21249 +919 874 3.72529029846e-8 +920 874 1.86264514923e-9 +921 874 2607469.92071 +922 874 -5.68106770515e-8 +925 874 130944.565672 +926 874 -325933.923542 +927 874 140000.092853 +936 874 523778.262688 +937 874 -1303735.21249 +1113 874 3.72529029846e-9 +1114 874 1343481.95346 +1115 874 -7.45058059692e-9 +1116 874 -1.02445483208e-8 +1117 874 651867.239269 +1118 874 -8.38190317154e-9 +1172 874 130944.565672 +1173 874 -325933.923542 +1174 874 -140000.092853 +1188 874 -147949.355218 +1189 874 -671741.144715 +1190 874 -280000.187543 +1207 874 147949.355218 +1208 874 -671741.144715 +1209 874 280000.187543 +1217 874 -130944.565672 +1218 874 -325933.923542 +1219 874 140000.092853 +875 875 415114.291302 +881 875 41522.4783151 +882 875 280000.186209 +883 875 -51890.1510547 +893 875 3.49245965481e-9 +894 875 9.31322574615e-9 +895 875 103772.525023 +904 875 -36750.022154 +905 875 -140000.09269 +906 875 -26760.9752199 +907 875 -156545.299685 +908 875 3.72529029846e-9 +909 875 -107038.087301 +917 875 1.11758708954e-8 +918 875 4.56348061562e-8 +919 875 53517.7880705 +920 875 2.14204192162e-8 +921 875 -6.98491930962e-8 +922 875 214082.779439 +925 875 -36750.022154 +926 875 140000.09269 +927 875 -26760.9752199 +936 875 -3.49245965481e-9 +937 875 -3.72529029846e-9 +938 875 53517.7880705 +1113 875 -146999.505363 +1114 875 1.11758708954e-8 +1115 875 -207548.508614 +1116 875 156545.299685 +1117 875 -9.31322574615e-9 +1118 875 -107038.087301 +1172 875 36750.022154 +1173 875 -140000.09269 +1174 875 -26760.9752199 +1188 875 -41522.4783151 +1189 875 -280000.186209 +1190 875 -51890.1510547 +1207 875 -41522.4783151 +1208 875 280000.186209 +1209 875 -51890.1510547 +1217 875 36750.022154 +1218 875 140000.09269 +1219 875 -26760.9752199 +876 876 149163575.186 +877 876 -546703.165553 +878 876 2413922.01047 +879 876 -174683.657818 +880 876 554380714.595 +881 876 204298.717158 +882 876 -1343478.78703 +883 876 -279999.068872 +884 876 -4784105.78784 +885 876 -280000.184637 +886 876 -2363771.71167 +887 876 -3494907.88039 +888 876 21808454.335 +889 876 -1486954.93769 +890 876 -12150.427044 +891 876 1922423.0928 +892 876 279999.069115 +893 876 102149.352812 +894 876 -671739.626716 +895 876 280000.18488 +923 876 -283731.322713 +924 876 -140000.095434 +925 876 -306334.006225 +926 876 -651864.881328 +927 876 -139999.531685 +928 876 -430162.444039 +929 876 -28341135.7388 +930 876 6.51925802231e-9 +931 876 1281000.68065 +932 876 -87341.8289083 +933 876 554380714.595 +934 876 -141865.647053 +935 876 139999.531442 +936 876 -153167.003112 +937 876 -325932.561084 +938 876 140000.095191 +939 876 2090613.66726 +940 876 1056679.10951 +941 876 -3486258.96796 +942 876 -16909407.8294 +943 876 -12150.427044 +877 877 7743579224.67 +878 877 60460882.9866 +879 877 -64909343.3301 +884 877 -4.76837158203e-7 +886 877 3494907.88039 +887 877 -4892898280.46 +891 877 3741313.67444 +928 877 2.98023223877e-7 +929 877 -2.04890966415e-8 +930 877 2910480292.36 +931 877 -4425681.3016 +932 877 -64909343.3301 +939 877 51131286.8839 +940 877 -3486258.96796 +941 877 -2074228117.67 +878 878 1806537627.38 +879 878 27655487.1416 +880 878 7.45058059692e-9 +884 878 174683.657818 +886 878 -21808454.335 +888 878 403989431.255 +889 878 -27545009.3966 +890 878 -19486.008721 +891 878 -1486954.93769 +928 878 87341.8289083 +929 878 1281000.68065 +930 878 4425681.3016 +931 878 -1134768980.85 +932 878 136654794.633 +933 878 -4.65661287308e-10 +939 878 1152925.69933 +940 878 16909407.8294 +942 878 -340301826.683 +943 878 -266308.785854 +879 879 5560158276.69 +880 879 5034697.92872 +881 879 -289095.795021 +884 879 -442022.607724 +886 879 1486954.93769 +888 879 -27545009.3966 +889 879 1201026987.75 +890 879 -18202.6452104 +891 879 61850365.8256 +893 879 -60643366.3825 +928 879 -5955.18424954 +929 879 -87341.8289083 +930 879 64909343.3301 +931 879 136654794.633 +932 879 860163832.404 +933 879 2.91038304567e-11 +939 879 -78609.3564946 +940 879 -1152925.69933 +942 879 23202629.2978 +943 879 18157.5987915 +880 880 22296317639.2 +881 880 1061339725.19 +884 880 -1023121103.96 +886 880 -12150.427044 +888 880 19486.008721 +889 880 18202.6452104 +890 880 -627593.209969 +891 880 -2807.12257775 +893 880 1978.67608582 +928 880 -37799063.0729 +929 880 -554380714.595 +931 880 -2.91038304567e-9 +932 880 2.03726813197e-10 +933 880 7426163484.31 +939 880 828.44649193 +940 880 12150.427044 +942 880 -266308.785854 +943 880 -202023.574818 +881 881 413761287.325 +882 881 91599.9942204 +883 881 -147000.102756 +884 881 -206676506.746 +885 881 -22431.9247326 +886 881 102149.352812 +889 881 60643366.3825 +890 881 1978.67608582 +891 881 3131604.235 +892 881 22431.7154827 +893 881 -6234841.38352 +894 881 45799.9976098 +895 881 146999.505464 +907 881 -60438.3113562 +908 881 -284111.233065 +909 881 -41522.459226 +920 881 -30219.2760976 +921 881 -142055.616532 +922 881 41522.6301091 +923 881 -40928.115521 +924 881 -31977.2909564 +925 881 -201485.302105 +926 881 44444.8694187 +927 881 -156545.023639 +928 881 16201.4458132 +929 881 239666.358184 +934 881 -20464.1781805 +935 881 31977.4238183 +936 881 -100743.132382 +937 881 22222.442903 +938 881 156545.65914 +939 881 8100.72290661 +940 881 119833.179092 +882 882 2686961.80528 +883 882 .0029876679182 +884 882 -341699.463249 +885 882 279999.064879 +886 882 -671739.626716 +891 882 -170849.737392 +892 882 -280000.188872 +893 882 45799.9976098 +894 882 1343480.43563 +895 882 .00298772193492 +907 882 -284111.233065 +908 882 -651867.643472 +909 882 -139999.532852 +920 882 -142055.616532 +921 882 -325933.942156 +922 882 140000.094024 +923 882 283732.416612 +924 882 139999.53519 +925 882 44444.8694187 +926 882 1303732.16117 +927 882 -.00266298651695 +928 882 -44066.0584281 +929 882 -651864.769646 +934 882 141866.216446 +935 882 -140000.091685 +936 882 22222.442903 +937 882 651865.839396 +938 882 -.00266296509653 +939 882 -22033.0373544 +940 882 -325932.505243 +883 883 207557.389548 +884 883 -51068.1292996 +885 883 51886.3775901 +886 883 -280000.18488 +891 883 -51068.034595 +892 883 -51890.2752931 +893 883 -146999.505464 +894 883 -.00298771820962 +895 883 -207548.743351 +907 883 41522.4639959 +908 883 139999.53269 +909 883 26758.8661155 +920 883 41522.6253393 +921 883 140000.094186 +922 883 -26761.0031396 +923 883 41441.2643163 +924 883 26759.0392574 +925 883 156545.033185 +926 883 .00266292504966 +927 883 107041.631392 +928 883 -9463.96861178 +929 883 -139999.535677 +934 883 41441.4252353 +935 883 -26761.0693146 +936 883 156545.649595 +937 883 -.00266297068447 +938 883 -107038.324262 +939 883 -9464.00616503 +940 883 -140000.091199 +884 884 311416623.775 +885 884 -92591.1640687 +886 884 1922423.0928 +887 884 -3741313.67444 +888 884 1486954.93769 +889 884 -61850365.8256 +890 884 -2807.12257775 +891 884 -29911692.8109 +892 884 92590.7891601 +893 884 3131604.235 +894 884 -170849.737392 +895 884 51068.034595 +923 884 -120693.387045 +924 884 -87818.243235 +925 884 -80567.6036584 +926 884 -306334.006225 +927 884 -46295.3932399 +928 884 -22049344.6707 +929 884 -167895.586345 +930 884 -8.94069671631e-8 +931 884 87341.8289083 +932 884 -5955.18424954 +933 884 37799063.0729 +934 884 -60346.9344636 +935 884 87818.5227136 +936 884 -40283.9222492 +937 884 -153167.003112 +938 884 46295.5833745 +939 884 -29456737.5236 +940 884 2221747.11041 +941 884 51131286.8839 +942 884 -1152925.69933 +943 884 -828.44649193 +885 885 103778.872564 +886 885 -279999.069115 +891 885 -92590.7891601 +892 885 -103774.433202 +893 885 -22431.7154827 +894 885 280000.188872 +895 885 -51890.2752931 +923 885 78191.1414478 +924 885 53520.9365327 +925 885 46295.397988 +926 885 139999.531198 +927 885 26758.9554962 +928 885 -9464.00618149 +929 885 -140000.091442 +934 885 78191.4501587 +935 885 -53519.2806113 +936 885 46295.5786264 +937 885 140000.095678 +938 885 -26761.1530759 +939 885 -9463.96859533 +940 885 -139999.535434 +886 886 39438284.0243 +887 886 2.38418579102e-7 +890 886 30541.4657061 +891 886 -3364363.97384 +892 886 -7.07805156708e-8 +893 886 408597.434317 +894 886 -2686957.57405 +895 886 9.31322574615e-9 +923 886 -141865.647053 +924 886 -139999.531442 +925 886 -153167.003112 +926 886 -325932.561084 +927 886 -140000.095191 +928 886 2090613.66726 +929 886 1056679.10951 +930 886 3486258.96796 +931 886 16909407.8294 +932 886 -1152925.69933 +933 886 -12150.427044 +934 886 -567462.645425 +935 886 -1.49011611938e-8 +936 886 -612668.01245 +937 886 -1303729.76266 +938 886 3.44589352608e-8 +939 886 -3504409.72802 +940 886 -195209.9648 +941 886 4.65661287308e-9 +942 886 -1.19209289551e-7 +943 886 30541.4657061 +1170 886 -141865.647053 +1171 886 139999.531442 +1172 886 -153167.003112 +1173 886 -325932.561084 +1174 886 140000.095191 +1175 886 2090613.66726 +1176 886 1056679.10951 +1177 886 -3486258.96796 +1178 886 -16909407.8294 +1179 886 1152925.69933 +1180 886 -12150.427044 +1181 886 1922423.0928 +1182 886 279999.069115 +1183 886 -2363771.71167 +1184 886 -3494907.88039 +1185 886 21808454.335 +1186 886 -1486954.93769 +1187 886 -12150.427044 +1188 886 102149.352812 +1189 886 -671739.626716 +1190 886 280000.18488 +1191 886 -12006181.3187 +1192 886 4.75e7 +887 887 10273512417.7 +891 887 -4.76837158203e-7 +928 887 -51131286.8839 +929 887 3486258.96796 +930 887 -2074228117.67 +939 887 4.17232513428e-7 +940 887 -2.88709998131e-8 +941 887 4041454664.25 +1175 887 51131286.8839 +1176 887 -3486258.96796 +1177 887 -2074228117.67 +1181 887 3741313.67444 +1183 887 3494907.88039 +1184 887 -4892898280.46 +1191 887 4.75e7 +1192 887 -555114468.864 +888 888 893635296.65 +889 888 -60930288.6138 +890 888 7.45058059692e-9 +928 888 -1152925.69933 +929 888 -16909407.8294 +931 888 -340301826.683 +932 888 23202629.2978 +933 888 266308.785854 +939 888 -7.45058059692e-9 +942 888 -638884878.362 +943 888 -4.65661287308e-10 +1175 888 1152925.69933 +1176 888 16909407.8294 +1178 888 -340301826.683 +1179 888 23202629.2978 +1180 888 -266308.785854 +1181 888 -1486954.93769 +1183 888 -21808454.335 +1185 888 403989431.255 +1186 888 -27545009.3966 +1187 888 -19486.008721 +889 889 2424260024.62 +890 889 3.72529029846e-9 +928 889 78609.3564946 +929 889 1152925.69933 +931 889 23202629.2978 +932 889 -1582013.2721 +933 889 -18157.5987915 +940 889 -7.45058059692e-9 +942 889 43560768.2189 +943 889 2.91038304567e-11 +1175 889 -78609.3564946 +1176 889 -1152925.69933 +1178 889 23202629.2978 +1179 889 -1582013.2721 +1180 889 18157.5987915 +1181 889 61850365.8256 +1183 889 1486954.93769 +1185 889 -27545009.3966 +1186 889 1201026987.75 +1187 889 -18202.6452104 +1188 889 -60643366.3825 +1194 889 -1184775903.35 +1195 889 -247395.833333 +890 890 2060769.23191 +891 890 -85159.2339347 +893 890 87241.6274202 +928 890 828.44649193 +929 890 12150.427044 +931 890 266308.785854 +932 890 -18157.5987915 +933 890 -202023.574818 +939 890 -2082.39348551 +940 890 -30541.4657061 +942 890 -4.7730281949e-9 +943 890 487642.127049 +1175 890 828.44649193 +1176 890 12150.427044 +1178 890 -266308.785854 +1179 890 18157.5987915 +1180 890 -202023.574818 +1181 890 -2807.12257775 +1183 890 -12150.427044 +1185 890 19486.008721 +1186 890 18202.6452104 +1187 890 -627593.209969 +1188 890 1978.67608582 +1194 890 -247395.833333 +1195 890 -4234.15560134 +891 891 68238010.6623 +892 891 -1.53668224812e-8 +893 891 -6148189.81572 +894 891 -683398.926498 +895 891 2.79396772385e-9 +923 891 -60346.9344636 +924 891 -87818.5227136 +925 891 -40283.9222492 +926 891 -153167.003112 +927 891 -46295.5833745 +928 891 -29456737.5236 +929 891 2221747.11041 +930 891 -51131286.8839 +931 891 1152925.69933 +932 891 -78609.3564946 +933 891 -828.44649193 +934 891 -241386.77409 +935 891 -1.86264514923e-9 +936 891 -161135.207317 +937 891 -612668.01245 +938 891 1.1408701539e-8 +939 891 50987615.0473 +940 891 -2979876.01263 +941 891 -5.96046447754e-8 +943 891 2082.39348551 +1170 891 -60346.9344636 +1171 891 87818.5227136 +1172 891 -40283.9222492 +1173 891 -153167.003112 +1174 891 46295.5833745 +1175 891 -29456737.5236 +1176 891 2221747.11041 +1177 891 51131286.8839 +1178 891 -1152925.69933 +1179 891 78609.3564946 +1180 891 -828.44649193 +1181 891 -29911692.8109 +1182 891 92590.7891601 +1183 891 1922423.0928 +1184 891 -3741313.67444 +1185 891 1486954.93769 +1186 891 -61850365.8256 +1187 891 -2807.12257775 +1188 891 3131604.235 +1189 891 -170849.737392 +1190 891 51068.034595 +1194 891 60643366.3825 +1195 891 -1978.67608582 +892 892 207557.745128 +893 892 -1.1408701539e-8 +894 892 3.91155481339e-8 +895 892 103772.75518 +923 892 -78191.4501587 +924 892 -53519.2806113 +925 892 -46295.5786264 +926 892 -140000.095678 +927 892 -26761.1530758 +928 892 9463.96859533 +929 892 139999.535434 +934 892 1.36442482471e-8 +935 892 107041.873065 +936 892 1.46683305502e-8 +937 892 3.91155481339e-8 +938 892 53517.9109923 +939 892 -3.39969992638e-9 +940 892 -5.02914190292e-8 +1170 892 78191.4501587 +1171 892 -53519.2806113 +1172 892 46295.5786264 +1173 892 140000.095678 +1174 892 -26761.1530759 +1175 892 -9463.96859533 +1176 892 -139999.535434 +1181 892 -92590.7891601 +1182 892 -103774.433202 +1183 892 -279999.069115 +1188 892 -22431.7154827 +1189 892 280000.188872 +1190 892 -51890.2752931 +893 893 13090229.4162 +894 893 183199.988441 +895 893 -1.35041773319e-8 +907 893 -30219.2760976 +908 893 -142055.616532 +909 893 -41522.6301091 +920 893 -120876.622712 +921 893 -568222.46613 +922 893 1.1408701539e-8 +923 893 -20464.1781805 +924 893 -31977.4238183 +925 893 -100743.132382 +926 893 22222.4429031 +927 893 -156545.65914 +928 893 8100.72290661 +929 893 119833.179092 +934 893 -81856.231042 +935 893 -7.68341124058e-9 +936 893 -402970.60421 +937 893 88889.7388374 +938 893 1.39698386192e-8 +939 893 32402.8916265 +940 893 479332.716368 +1113 893 23626.2904729 +1114 893 -147949.355218 +1115 893 41522.4783151 +1116 893 -30219.2760976 +1117 893 -142055.616532 +1118 893 41522.6301091 +1170 893 -20464.1781805 +1171 893 31977.4238183 +1172 893 -100743.132382 +1173 893 22222.442903 +1174 893 156545.65914 +1175 893 8100.72290661 +1176 893 119833.179092 +1181 893 3131604.235 +1182 893 22431.7154827 +1183 893 102149.352812 +1186 893 60643366.3825 +1187 893 1978.67608582 +1188 893 -6234841.38352 +1189 893 45799.9976098 +1190 893 146999.505464 +1194 893 -123497963.041 +1195 893 9.31322574615e-10 +1196 893 3109539.33406 +1200 893 60643366.3825 +1201 893 -1978.67608582 +894 894 5373923.61057 +895 894 -1.09896063805e-7 +907 894 -142055.616532 +908 894 -325933.942156 +909 894 -140000.094024 +920 894 -568222.46613 +921 894 -1303735.28694 +922 894 2.98023223877e-8 +923 894 141866.216446 +924 894 140000.091685 +925 894 22222.4429031 +926 894 651865.839396 +927 894 .00266295764595 +928 894 -22033.0373544 +929 894 -325932.505243 +934 894 567464.833224 +935 894 3.72529029846e-9 +936 894 88889.7388374 +937 894 2607464.32234 +938 894 -5.68106770515e-8 +939 894 -88132.1168562 +940 894 -1303729.53929 +1113 894 125049.734986 +1114 894 -671741.144715 +1115 894 280000.186209 +1116 894 -142055.616532 +1117 894 -325933.942156 +1118 894 140000.094024 +1170 894 141866.216446 +1171 894 -140000.091685 +1172 894 22222.442903 +1173 894 651865.839396 +1174 894 -.00266296323389 +1175 894 -22033.0373544 +1176 894 -325932.505243 +1181 894 -170849.737392 +1182 894 -280000.188872 +1183 894 -671739.626716 +1188 894 45799.9976098 +1189 894 1343480.43563 +1190 894 .00298772007227 +895 895 415114.779096 +907 895 -41522.6253393 +908 895 -140000.094186 +909 895 -26761.0031396 +920 895 1.11758708954e-8 +921 895 3.35276126862e-8 +922 895 53517.732231 +923 895 -41441.4252353 +924 895 -26761.0693146 +925 895 -156545.649595 +926 895 .00266296509653 +927 895 -107038.324262 +928 895 9464.00616503 +929 895 140000.091199 +934 895 -2.6585534215e-9 +935 895 53518.0785148 +936 895 1.11758708954e-8 +937 895 -5.12227416039e-8 +938 895 214083.262785 +939 895 -2.51829624176e-10 +940 895 -3.72529029846e-9 +1113 895 -31977.2719444 +1114 895 280000.187543 +1115 895 -51890.1510547 +1116 895 41522.6253393 +1117 895 140000.094186 +1118 895 -26761.0031396 +1170 895 41441.4252353 +1171 895 -26761.0693146 +1172 895 156545.649595 +1173 895 -.00266296975315 +1174 895 -107038.324262 +1175 895 -9464.00616503 +1176 895 -140000.091199 +1181 895 -51068.034595 +1182 895 -51890.2752931 +1183 895 -280000.18488 +1188 895 -146999.505464 +1189 895 -.0029877256602 +1190 895 -207548.743351 +896 896 211035722.822 +897 896 9727211.24683 +899 896 -336262.694232 +900 896 -22927.0018819 +901 896 -6376945.39325 +902 896 -2637.74835038 +903 896 -36436.4242707 +904 896 -8192.82976161 +905 896 160215.571168 +906 896 -36436.2785884 +910 896 -51403789.8076 +911 896 -3427559.15644 +912 896 -.360276088119 +913 896 -3059684.37739 +914 896 -11.9831591097 +915 896 -1318.8719359 +916 896 36436.27862 +917 896 -4096.41572877 +918 896 80107.8187207 +919 896 36436.4243024 +944 896 -30311798.6282 +945 896 381839.369939 +946 896 -3.27825546265e-7 +947 896 -80789.5182072 +948 896 -5508.31669139 +949 896 -44176008.4661 +950 896 -19055.0856041 +951 896 -8754.20599346 +952 896 -20319.499369 +953 896 36465.0155792 +954 896 -8754.17069031 +1079 896 -10159.7496845 +1080 896 18232.5162033 +1081 896 8754.20597824 +1082 896 -9527.54180266 +1083 896 8754.17067509 +1084 896 -27462935.4358 +1085 896 -1955922.70006 +1086 896 51131291.8077 +1087 896 1263758.79445 +1088 896 816.463332821 +897 897 69053491.2539 +898 897 2.98023223877e-8 +899 897 4931852.84874 +900 897 336262.694232 +901 897 93541080.8014 +902 897 39019.9460115 +903 897 539000.359034 +904 897 121195.706533 +905 897 -2370052.82793 +906 897 538998.20397 +910 897 -3427559.15644 +911 897 -1356464.42966 +912 897 5.2840567017 +913 897 44875402.1562 +914 897 175.502037358 +915 897 19509.9398802 +916 897 -538998.204438 +917 897 60597.8658102 +918 897 -1185026.90415 +919 897 -539000.359503 +944 897 381839.369939 +945 897 -35881517.2269 +946 897 -2.32830643654e-8 +947 897 1184925.74371 +948 897 80789.5182072 +949 897 647921795.397 +950 897 281879.964557 +951 897 129500.088661 +952 897 300584.310192 +953 897 -539423.307384 +954 897 129499.566425 +1079 897 150292.155096 +1080 897 -269711.778155 +1081 897 -129500.088435 +1082 897 140939.967495 +1083 897 -129499.5662 +1084 897 -1955922.70006 +1085 897 1093193.28007 +1086 897 3486186.75252 +1087 897 -18535329.3672 +1088 897 -11974.9250067 +898 898 11725575044.4 +899 898 746666.957293 +900 898 -10952584.596 +910 898 .36027623713 +911 898 -5.28405669145 +912 898 -7827119137 +944 898 2.68220901489e-7 +945 898 2.04890966415e-8 +946 898 2677927373.19 +947 898 5172348.25889 +948 898 -75861927.9261 +1084 898 51131291.8077 +1085 898 3486186.75252 +1086 898 -1922836059.47 +899 899 2755407890.98 +900 899 -58875924.1925 +901 899 3.72529029846e-9 +910 899 3059684.37739 +911 899 -44875402.1562 +913 899 834107925.586 +914 899 -.00187643989921 +944 899 -80789.5182071 +945 899 1184925.74371 +946 899 -5172348.25889 +947 899 -1236481579.17 +948 899 -148393494.677 +949 899 5.93718141317e-9 +1084 899 -1263758.79445 +1085 899 18535329.3672 +1087 899 -371207454.429 +1088 899 -266308.811499 +900 900 3614908076.62 +901 900 1.16415321827e-10 +910 900 208614.698486 +911 900 -3059684.37739 +913 900 56870953.333 +914 900 .0275211285189 +944 900 -5508.31669138 +945 900 80789.5182072 +946 900 75861927.9261 +947 900 -148393494.677 +948 900 929862243.18 +949 900 4.0017766878e-10 +1084 900 -86164.4408314 +1085 900 1263758.79445 +1087 900 -25309325.5483 +1088 900 -18157.2226694 +901 901 30909297546.8 +910 901 -11.9831591097 +911 901 175.502037358 +913 901 .00187644374091 +914 901 -1113572.3197 +944 901 44176008.4661 +945 901 -647921795.397 +947 901 -1.86264514923e-9 +948 901 -1.16415321827e-10 +949 901 8028236264.76 +1084 901 -816.463332821 +1085 901 11974.9250067 +1087 901 -266308.811499 +1088 901 -184697.186945 +902 902 225548.52075 +903 902 -313.604814631 +904 902 114099.081576 +905 902 -39019.8646358 +906 902 8873.86583706 +910 902 -1318.8719359 +911 902 19509.9398801 +915 902 112773.76837 +916 902 313.594349568 +917 902 57049.2961113 +918 902 -19509.9529106 +919 902 -8873.91051248 +944 902 17854.3913915 +945 902 -264118.21585 +950 902 -122717.476744 +951 902 -87535.4063366 +952 902 -70524.2865263 +953 902 264119.294613 +954 902 -41598.0591961 +1079 902 -35262.2677262 +1080 902 132059.638893 +1081 902 41598.2299375 +1082 902 -61358.9884017 +1083 902 87535.7603657 +1084 902 8927.19669511 +1085 902 -132059.122709 +903 903 218149.593557 +904 903 27562.4035398 +905 903 -538998.203501 +906 903 109069.450167 +910 903 -36436.27862 +911 903 538998.204438 +915 903 -313.594349577 +916 903 -218141.790724 +917 903 27562.5230014 +918 903 -539000.359971 +919 903 -109076.241974 +944 903 -8754.20569191 +945 903 129500.0842 +950 903 87384.9106508 +951 903 55317.6404752 +952 903 50352.2342779 +953 903 -129499.565974 +954 903 27657.5611273 +1079 903 50352.4315243 +1080 903 -129500.088886 +1081 903 -27659.4522377 +1082 903 87385.2564527 +1083 903 -55316.386255 +1084 903 -8754.17097664 +1085 903 129499.57066 +904 904 456697.961472 +905 904 -161594.514205 +906 904 -.00914757000282 +907 904 111414.204197 +908 904 40398.7964679 +909 904 -9187.47397695 +910 904 -4096.41572877 +911 904 60597.8658102 +915 904 57049.2961113 +916 904 -27562.5230014 +917 904 228348.001203 +918 904 -80797.2570305 +919 904 -.00914756022394 +920 904 55706.857145 +921 904 20199.4024249 +922 904 9187.50153679 +944 904 16590.125265 +945 904 -245416.054217 +950 904 -51592.7189658 +951 904 -37107.9240244 +952 904 -244159.595698 +953 904 -36779.1127669 +954 904 -174919.962774 +955 904 -70976.2415495 +956 904 282195.172629 +957 904 -45937.3446904 +1042 904 -35488.2452373 +1043 904 141097.586315 +1044 904 45937.5328783 +1079 904 -122080.295339 +1080 904 -18389.5648524 +1081 904 174920.671033 +1082 904 -25796.4839459 +1083 904 37108.0770763 +1084 904 8295.06263252 +1085 904 -122708.027108 +905 905 4740123.32619 +906 905 -.000937920063734 +907 905 40398.7964679 +908 905 -2370067.84183 +909 905 538998.203814 +910 905 80107.8187207 +911 905 -1185026.90415 +915 905 -19509.9529105 +916 905 539000.359971 +917 905 -80797.2570304 +918 905 2370060.68145 +919 905 -.000937785953283 +920 905 20199.4024249 +921 905 -1185034.41167 +922 905 -539000.359659 +944 905 36465.0080294 +945 905 -539423.195702 +950 905 -281881.062246 +951 905 -129499.570435 +952 905 -36779.1127669 +953 905 1078848.32958 +954 905 .0029755611904 +955 905 282195.172629 +956 905 -539425.502016 +957 905 129499.56776 +1042 905 141097.586315 +1043 905 -269712.875471 +1044 905 -129500.0871 +1079 905 -18389.5648524 +1080 905 539423.915505 +1081 905 .00297557096928 +1082 905 -140940.539537 +1083 905 129500.084425 +1084 905 18232.5124284 +1085 905 -269711.722314 +906 906 436297.797013 +907 906 9187.46478676 +908 906 -538998.203657 +909 906 109068.767183 +910 906 -36436.4243024 +911 906 539000.359503 +915 906 8873.91051248 +916 906 -109076.241974 +917 906 .00914755044505 +918 906 .000937758013606 +919 906 -436282.207438 +920 906 9187.51072696 +921 906 -539000.359815 +922 906 -109075.542903 +944 906 -8754.17099186 +945 906 129499.570885 +950 906 45862.0994078 +951 906 27657.644889 +952 906 174919.971603 +953 906 -.00297561660409 +954 906 110635.057599 +955 906 45937.3491027 +956 906 -129499.56761 +957 906 27657.4803478 +1042 906 45937.5284659 +1043 906 -129500.087251 +1044 906 -27659.3116492 +1079 906 174920.662203 +1080 906 .00297557516024 +1081 906 -110632.553125 +1082 906 45862.2783615 +1083 906 -27659.3684761 +1084 906 -8754.20567669 +1085 906 129500.083975 +907 907 451187.168022 +908 907 -2.421438694e-8 +909 907 -.0091795232147 +917 907 55706.857145 +918 907 20199.4024249 +919 907 -9187.51072697 +920 907 225592.604482 +921 907 -2.79396772385e-8 +922 907 -.00917950691655 +925 907 111414.204197 +926 907 -40398.7964679 +927 907 9187.46478676 +936 907 55706.857145 +937 907 -20199.4024249 +938 907 -9187.51072696 +952 907 -52362.0189248 +953 907 -263805.191779 +954 907 -41522.4594034 +955 907 -245412.917227 +956 907 1.86264514923e-8 +957 907 -174919.612674 +1010 907 -52362.0189248 +1011 907 263805.191779 +1012 907 -41522.4594034 +1039 907 -26181.1339249 +1040 907 131902.59589 +1041 907 41522.6299317 +1042 907 -122706.956391 +1043 907 -1.86264514923e-9 +1044 907 174920.321134 +1079 907 -26181.1339249 +1080 907 -131902.59589 +1081 907 41522.6299317 +908 908 4740138.34046 +909 908 -1.12690031529e-7 +917 908 20199.4024249 +918 908 -1185034.41167 +919 908 539000.359815 +920 908 -1.67638063431e-8 +921 908 2370068.18858 +922 908 -7.45058059692e-9 +925 908 -40398.7964679 +926 908 -2370067.84183 +927 908 538998.203657 +936 908 -20199.4024249 +937 908 -1185034.41167 +938 908 -539000.359815 +952 908 -263805.191779 +953 908 -539425.464788 +954 908 -129499.5691 +955 908 -1.86264514923e-9 +956 908 1078850.56125 +957 908 -2.09547579288e-8 +1010 908 263805.191779 +1011 908 -539425.464788 +1012 908 129499.5691 +1039 908 131902.59589 +1040 908 -269712.856857 +1041 908 -129500.08576 +1042 908 -4.65661287308e-9 +1043 908 539425.031628 +1044 908 -8.38190317154e-9 +1079 908 -131902.59589 +1080 908 -269712.856857 +1081 908 129500.08576 +909 909 436296.406911 +917 909 -9187.5015368 +918 909 539000.359659 +919 909 -109075.542903 +920 909 .0091794822365 +921 909 -1.210719347e-8 +922 909 -436280.833431 +925 909 -9187.47397695 +926 909 -538998.203814 +927 909 109068.767183 +936 909 -9187.50153679 +937 909 -539000.359659 +938 909 -109075.542903 +952 909 41522.4638158 +953 909 129499.56925 +954 909 27657.508269 +955 909 174919.621504 +956 909 -3.67872416973e-8 +957 909 110634.834248 +1010 909 41522.4638158 +1011 909 -129499.56925 +1012 909 27657.508269 +1039 909 41522.6255194 +1040 909 -129500.08561 +1041 909 -27659.283728 +1042 909 174920.312304 +1043 909 -1.35041773319e-8 +1044 909 -110632.33374 +1079 909 41522.6255194 +1080 909 129500.08561 +1081 909 -27659.283728 +910 910 119463717.139 +911 910 7507852.71688 +912 910 -4.76837158203e-7 +913 910 1.49011611938e-8 +914 910 -47.8208583169 +915 910 -5275.49670076 +916 910 9.06586647034e-9 +917 910 -16385.6595232 +918 910 320431.142337 +919 910 -5.60320913792e-9 +944 910 -27462935.4358 +945 910 -1955922.70006 +946 910 -51131291.8077 +947 910 -1263758.79445 +948 910 -86164.4408314 +949 910 816.463332821 +950 910 -9527.54180266 +951 910 -8754.17067509 +952 910 -10159.7496845 +953 910 18232.5162033 +954 910 -8754.20597824 +1079 910 -40638.998738 +1080 910 72930.0311583 +1081 910 4.40701842308e-10 +1082 910 -38110.1712081 +1083 910 2.89604067802e-9 +1084 910 46297604.4952 +1085 910 3213688.56774 +1086 910 -3.8743019104e-7 +1088 910 -2130.21434382 +1207 910 8100.72290661 +1208 910 22033.0373544 +1209 910 9464.00616503 +1210 910 -29456737.5236 +1211 910 9463.96859533 +1212 910 -2090613.66726 +1213 910 -51131286.8839 +1214 910 1152925.69933 +1215 910 78609.3564946 +1216 910 -828.44649193 +1217 910 -4096.41572877 +1218 910 80107.8187207 +1219 910 36436.4243024 +1220 910 -1318.8719359 +1221 910 36436.27862 +1222 910 -51403789.8076 +1223 910 -3427559.15644 +1224 910 -.360276088119 +1225 910 -3059684.37739 +1226 910 -208614.698486 +1227 910 -11.9831591097 +1228 910 -10159.7496845 +1229 910 18232.5162033 +1230 910 8754.20597824 +1231 910 -9527.54180266 +1232 910 8754.17067509 +1233 910 -27462935.4358 +1234 910 -1955922.70006 +1235 910 51131291.8077 +1236 910 1263758.79445 +1237 910 86164.4408314 +1238 910 816.463332821 +911 911 9901072.56295 +912 911 -2.98023223877e-8 +913 911 -1.19209289551e-7 +914 911 702.015770667 +915 911 78039.892023 +916 911 -1.34110450745e-7 +917 911 242391.413065 +918 911 -4740105.65587 +919 911 8.28877091408e-8 +944 911 -1955922.70006 +945 911 1093193.28007 +946 911 -3486186.75252 +947 911 18535329.3672 +948 911 1263758.79445 +949 911 -11974.9250067 +950 911 140939.967495 +951 911 129499.5662 +952 911 150292.155096 +953 911 -269711.778155 +954 911 129500.088435 +1079 911 601168.620385 +1080 911 -1078846.61477 +1081 911 -6.51925802231e-9 +1082 911 563759.929115 +1083 911 -4.28408384323e-8 +1084 911 3213688.56774 +1085 911 -608654.332957 +1086 911 -2.60770320892e-8 +1088 911 31243.4814768 +1207 911 -119833.179092 +1208 911 -325932.505243 +1209 911 -140000.091199 +1210 911 -2221747.11041 +1211 911 -139999.535434 +1212 911 1056679.10951 +1213 911 -3486258.96796 +1214 911 -16909407.8294 +1215 911 -1152925.69933 +1216 911 12150.427044 +1217 911 60597.8658102 +1218 911 -1185026.90415 +1219 911 -539000.359503 +1220 911 19509.9398802 +1221 911 -538998.204438 +1222 911 -3427559.15644 +1223 911 -1356464.42966 +1224 911 5.2840567017 +1225 911 44875402.1562 +1226 911 3059684.37739 +1227 911 175.502037358 +1228 911 150292.155096 +1229 911 -269711.778155 +1230 911 -129500.088435 +1231 911 140939.967495 +1232 911 -129499.5662 +1233 911 -1955922.70006 +1234 911 1093193.28007 +1235 911 3486186.75252 +1236 911 -18535329.3672 +1237 911 -1263758.79445 +1238 911 -11974.9250067 +912 912 15876917230.4 +944 912 -51131291.8077 +945 912 -3486186.75252 +946 912 -1922836059.47 +1084 912 2.98023223877e-7 +1085 912 2.04890966415e-8 +1086 912 3729994733.66 +1210 912 -51131286.8839 +1212 912 -3486258.96796 +1213 912 -2074228117.67 +1222 912 .36027623713 +1223 912 -5.28405669145 +1224 912 -7827119137 +1233 912 51131291.8077 +1234 912 3486186.75252 +1235 912 -1922836059.47 +913 913 1833219936.63 +914 913 -1.86264514923e-9 +944 913 1263758.79445 +945 913 -18535329.3672 +947 913 -371207454.429 +948 913 -25309325.5483 +949 913 266308.811499 +1087 913 -703940480.373 +1088 913 4.07453626394e-9 +1210 913 -1152925.69933 +1212 913 16909407.8294 +1214 913 -340301826.683 +1215 913 -23202629.2978 +1216 913 266308.785854 +1222 913 3059684.37739 +1223 913 -44875402.1562 +1225 913 834107925.586 +1226 913 56870953.333 +1227 913 -.00187643989921 +1233 913 -1263758.79445 +1234 913 18535329.3672 +1236 913 -371207454.429 +1237 913 -25309325.5483 +1238 913 -266308.811499 +914 914 2575080.50874 +944 914 -816.463332821 +945 914 11974.9250067 +947 914 266308.811499 +948 914 18157.2226694 +949 914 -184697.186945 +1084 914 2130.21434382 +1085 914 -31243.4814768 +1088 914 459767.331148 +1210 914 828.44649193 +1212 914 -12150.427044 +1214 914 266308.785854 +1215 914 18157.5987915 +1216 914 -202023.574818 +1222 914 -11.9831591097 +1223 914 175.502037358 +1225 914 .00187644374091 +1226 914 -.0275211282569 +1227 914 -1113572.3197 +1233 914 -816.463332821 +1234 914 11974.9250067 +1236 914 -266308.811499 +1237 914 -18157.2226694 +1238 914 -184697.186945 +915 915 451097.0415 +916 915 -1.4653801918e-8 +917 915 228198.163151 +918 915 -78039.7292716 +919 915 -6.73681497574e-9 +944 915 8927.1966951 +945 915 -132059.122709 +950 915 -61358.9884017 +951 915 -87535.7603657 +952 915 -35262.2677262 +953 915 132059.638893 +954 915 -41598.2299375 +1079 915 -141048.573053 +1080 915 528238.589226 +1081 915 -7.65845179558e-9 +1082 915 -245434.953487 +1083 915 1.85243785381e-8 +1084 915 35708.7827829 +1085 915 -528236.4317 +1207 915 -20464.1781805 +1208 915 -141866.216446 +1209 915 -41441.4252353 +1210 915 -60346.9344636 +1211 915 -78191.4501587 +1212 915 141865.647053 +1217 915 57049.2961113 +1218 915 -19509.9529106 +1219 915 -8873.91051248 +1220 915 112773.76837 +1221 915 313.594349568 +1222 915 -1318.8719359 +1223 915 19509.9398801 +1228 915 -35262.2677262 +1229 915 132059.638893 +1230 915 41598.2299375 +1231 915 -61358.9884017 +1232 915 87535.7603657 +1233 915 8927.19669511 +1234 915 -132059.122709 +916 916 436299.187114 +917 916 -1.58324837685e-8 +918 916 8.475035429e-8 +919 916 218138.900333 +944 916 8754.17097664 +945 916 -129499.57066 +950 916 -87385.2564527 +951 916 -55316.386255 +952 916 -50352.4315243 +953 916 129500.088886 +954 916 -27659.4522378 +1079 916 -3.95812094212e-9 +1080 916 -9.31322574615e-10 +1081 916 55315.1222547 +1082 916 -3.98363918066e-9 +1083 916 110635.28095 +1084 916 7.24010169506e-10 +1085 916 -1.07102096081e-8 +1207 916 -31977.4238183 +1208 916 -140000.091685 +1209 916 -26761.0693146 +1210 916 -87818.5227136 +1211 916 -53519.2806113 +1212 916 139999.531442 +1217 916 27562.5230014 +1218 916 -539000.359971 +1219 916 -109076.241974 +1220 916 -313.594349577 +1221 916 -218141.790724 +1222 916 -36436.27862 +1223 916 538998.204438 +1228 916 50352.4315243 +1229 916 -129500.088886 +1230 916 -27659.4522377 +1231 916 87385.2564527 +1232 916 -55316.386255 +1233 916 -8754.17097664 +1234 916 129499.57066 +917 917 913395.922943 +918 917 -323189.02841 +919 917 -1.58324837685e-8 +920 917 222828.408394 +921 917 80797.5929358 +922 917 -1.51339918375e-8 +944 917 8295.06263252 +945 917 -122708.027108 +950 917 -25796.4839459 +951 917 -37108.0770763 +952 917 -122080.295339 +953 917 -18389.5648524 +954 917 -174920.671033 +955 917 -35488.2452373 +956 917 141097.586315 +957 917 -45937.5328783 +1042 917 -141952.483099 +1043 917 564390.345259 +1044 917 -1.09430402517e-8 +1079 917 -488319.191395 +1080 917 -73558.2255337 +1081 917 2.37487256527e-8 +1082 917 -103185.437932 +1083 917 1.07102096081e-8 +1084 917 33180.2505301 +1085 917 -490832.108433 +1113 917 -20912.6812731 +1114 917 -130944.565672 +1115 917 -36750.022154 +1116 917 55706.857145 +1117 917 20199.4024249 +1118 917 9187.50153679 +1119 917 -35488.2452373 +1120 917 141097.586315 +1121 917 45937.5328783 +1207 917 -100743.132382 +1208 917 -22222.442903 +1209 917 -156545.649595 +1210 917 -40283.9222492 +1211 917 -46295.5786264 +1212 917 153167.003112 +1217 917 228348.001203 +1218 917 -80797.2570304 +1219 917 -.00914756022394 +1220 917 57049.2961113 +1221 917 -27562.5230014 +1222 917 -4096.41572877 +1223 917 60597.8658102 +1228 917 -122080.295339 +1229 917 -18389.5648524 +1230 917 174920.671033 +1231 917 -25796.4839459 +1232 917 37108.0770763 +1233 917 8295.06263252 +1234 917 -122708.027108 +918 918 9480246.65238 +919 918 -2.77534127235e-7 +920 918 80797.5929358 +921 918 -4740135.68366 +922 918 8.19563865662e-8 +944 918 18232.5124284 +945 918 -269711.722314 +950 918 -140940.539537 +951 918 -129500.084425 +952 918 -18389.5648524 +953 918 539423.915505 +954 918 -.00297558028251 +955 918 141097.586315 +956 918 -269712.875471 +957 918 129500.0871 +1042 918 564390.345259 +1043 918 -1078851.00403 +1044 918 4.65661287308e-10 +1079 918 -73558.2255337 +1080 918 2157696.65917 +1081 918 -6.053596735e-8 +1082 918 -563762.124492 +1083 918 3.0267983675e-8 +1084 918 72930.0160589 +1085 918 -1078846.3914 +1113 918 -130944.565672 +1114 918 -325933.923542 +1115 918 -140000.09269 +1116 918 20199.4024249 +1117 918 -1185034.41167 +1118 918 -539000.359659 +1119 918 141097.586315 +1120 918 -269712.875471 +1121 918 -129500.0871 +1207 918 -22222.442903 +1208 918 651865.839396 +1209 918 -.00266294647008 +1210 918 153167.003112 +1211 918 140000.095678 +1212 918 -325932.561084 +1217 918 -80797.2570304 +1218 918 2370060.68145 +1219 918 -.00093778129667 +1220 918 -19509.9529105 +1221 918 539000.359971 +1222 918 80107.8187207 +1223 918 -1185026.90415 +1228 918 -18389.5648524 +1229 918 539423.915505 +1230 918 .00297557143495 +1231 918 -140940.539537 +1232 918 129500.084425 +1233 918 18232.5124284 +1234 918 -269711.722314 +919 919 872595.594027 +920 919 -1.1408701539e-8 +921 919 8.84756445885e-8 +922 919 218137.534365 +944 919 8754.20567669 +945 919 -129500.083975 +950 919 -45862.2783615 +951 919 -27659.3684761 +952 919 -174920.662203 +953 919 -.00297558261082 +954 919 -110632.553125 +955 919 -45937.5284659 +956 919 129500.087251 +957 919 -27659.3116492 +1042 919 -6.51925802231e-9 +1043 919 4.65661287308e-9 +1044 919 55314.9606955 +1079 919 1.44354999065e-8 +1080 919 -6.33299350738e-8 +1081 919 221270.115198 +1082 919 1.65006145835e-8 +1083 919 55315.2897779 +1084 919 -2.29794532061e-9 +1085 919 3.39932739735e-8 +1113 919 -36750.0269238 +1114 919 -140000.092853 +1115 919 -26760.9752199 +1116 919 9187.51072696 +1117 919 -539000.359815 +1118 919 -109075.542903 +1119 919 45937.5284659 +1120 919 -129500.087251 +1121 919 -27659.3116492 +1207 919 -156545.65914 +1208 919 -.00266295671463 +1209 919 -107038.324262 +1210 919 -46295.5833745 +1211 919 -26761.1530759 +1212 919 140000.095191 +1217 919 .00914755091071 +1218 919 .000937759876251 +1219 919 -436282.207438 +1220 919 8873.91051247 +1221 919 -109076.241974 +1222 919 -36436.4243024 +1223 919 539000.359503 +1228 919 174920.662203 +1229 919 .0029755756259 +1230 919 -110632.553125 +1231 919 45862.2783615 +1232 919 -27659.3684761 +1233 919 -8754.20567669 +1234 919 129500.083975 +920 920 902374.336044 +921 920 -5.21540641785e-8 +922 920 -4.09781932831e-8 +925 920 55706.857145 +926 920 -20199.4024249 +927 920 9187.51072696 +936 920 222828.408394 +937 920 -80797.5929358 +938 920 -6.053596735e-9 +952 920 -26181.1339249 +953 920 -131902.59589 +954 920 -41522.6299317 +955 920 -122706.956391 +956 920 1.39698386192e-8 +957 920 -174920.321134 +1010 920 -26181.1339249 +1011 920 131902.59589 +1012 920 -41522.6299317 +1039 920 -104724.03785 +1040 920 527610.383559 +1041 920 -6.98491930962e-10 +1042 920 -490825.834455 +1043 920 3.35276126862e-8 +1044 920 1.58324837685e-8 +1079 920 -104724.03785 +1080 920 -527610.383559 +1081 920 2.00234353542e-8 +1113 920 -101500.501393 +1114 920 1.76951289177e-8 +1115 920 -156545.299685 +1116 920 225592.604482 +1117 920 -1.86264514923e-8 +1118 920 -.00917950598523 +1119 920 -122706.956391 +1120 920 -7.45058059692e-9 +1121 920 174920.321134 +1161 920 -26181.1339249 +1162 920 131902.59589 +1163 920 41522.6299317 +1172 920 55706.857145 +1173 920 -20199.4024249 +1174 920 -9187.51072697 +1188 920 -30219.2760976 +1189 920 -142055.616532 +1190 920 -41522.6253393 +1207 920 -30219.2760976 +1208 920 142055.616532 +1209 920 -41522.6253393 +1217 920 55706.857145 +1218 920 20199.4024249 +1219 920 -9187.51072697 +1228 920 -26181.1339249 +1229 920 -131902.59589 +1230 920 41522.6299317 +921 921 9480276.68092 +922 921 -2.16066837311e-7 +925 921 -20199.4024249 +926 921 -1185034.41167 +927 921 539000.359815 +936 921 -80797.5929358 +937 921 -4740135.68366 +938 921 5.02914190292e-8 +952 921 -131902.59589 +953 921 -269712.856857 +954 921 -129500.08576 +955 921 2.70083546639e-8 +956 921 539425.031628 +957 921 3.25962901115e-9 +1010 921 131902.59589 +1011 921 -269712.856857 +1012 921 129500.08576 +1039 921 527610.383559 +1040 921 -1078850.92958 +1041 921 -2.28174030781e-8 +1042 921 2.23517417908e-8 +1043 921 2157701.1225 +1044 921 -5.26197254658e-8 +1079 921 -527610.383559 +1080 921 -1078850.92958 +1081 921 4.2375177145e-8 +1113 921 1.30385160446e-8 +1114 921 651867.239269 +1115 921 3.72529029846e-9 +1116 921 -1.39698386192e-8 +1117 921 2370068.18858 +1118 921 -9.31322574615e-10 +1119 921 -3.72529029846e-9 +1120 921 539425.031628 +1121 921 -7.91624188423e-9 +1161 921 131902.59589 +1162 921 -269712.856857 +1163 921 -129500.08576 +1172 921 -20199.4024249 +1173 921 -1185034.41167 +1174 921 -539000.359815 +1188 921 -142055.616532 +1189 921 -325933.942156 +1190 921 -140000.094186 +1207 921 142055.616532 +1208 921 -325933.942156 +1209 921 140000.094186 +1217 921 20199.4024249 +1218 921 -1185034.41167 +1219 921 539000.359815 +1228 921 -131902.59589 +1229 921 -269712.856857 +1230 921 129500.08576 +922 922 872592.813821 +925 922 9187.50153678 +926 922 539000.359659 +927 922 -109075.542903 +936 922 -1.42026692629e-8 +937 922 3.16649675369e-8 +938 922 218137.534365 +952 922 -41522.6255193 +953 922 -129500.08561 +954 922 -27659.2837279 +955 922 -174920.312304 +956 922 9.31322574615e-9 +957 922 -110632.33374 +1010 922 -41522.6255194 +1011 922 129500.08561 +1012 922 -27659.2837279 +1039 922 3.25962901115e-9 +1040 922 -2.84053385258e-8 +1041 922 55315.0165381 +1042 922 3.49245965481e-8 +1043 922 -4.98257577419e-8 +1044 922 221269.668496 +1079 922 1.93249434233e-8 +1080 922 5.54136931896e-8 +1081 922 55315.0165381 +1113 922 -156545.30923 +1114 922 7.45058059692e-9 +1115 922 -107038.087301 +1116 922 .00917948409915 +1117 922 -3.72529029846e-9 +1118 922 -436280.833431 +1119 922 174920.312304 +1120 922 -1.25728547573e-8 +1121 922 -110632.33374 +1161 922 41522.6255194 +1162 922 -129500.08561 +1163 922 -27659.283728 +1172 922 -9187.50153679 +1173 922 -539000.359659 +1174 922 -109075.542903 +1188 922 -41522.6301091 +1189 922 -140000.094024 +1190 922 -26761.0031396 +1207 922 -41522.6301091 +1208 922 140000.094024 +1209 922 -26761.0031396 +1217 922 -9187.5015368 +1218 922 539000.359659 +1219 922 -109075.542903 +1228 922 41522.6255194 +1229 922 129500.08561 +1230 922 -27659.283728 +923 923 225548.52075 +924 923 -313.604814633 +925 923 114099.081576 +926 923 39019.8646357 +927 923 8873.86583705 +928 923 -2637.74835038 +929 923 -39019.9460115 +934 923 112773.76837 +935 923 313.59434957 +936 923 57049.2961113 +937 923 19509.9529105 +938 923 -8873.91051248 +939 923 -1318.8719359 +940 923 -19509.9398802 +1006 923 -122717.476744 +1007 923 -87535.4063366 +1010 923 -70524.2865263 +1011 923 -264119.294613 +1012 923 -41598.0591961 +1026 923 17854.3913915 +1027 923 264118.21585 +1032 923 -61358.9884017 +1033 923 87535.7603657 +1034 923 8927.1966951 +1035 923 132059.122709 +1039 923 -35262.2677262 +1040 923 -132059.638893 +1041 923 41598.2299375 +924 924 218149.593557 +925 924 27562.4035398 +926 924 538998.203501 +927 924 109069.450167 +928 924 -36436.4242707 +929 924 -539000.359034 +934 924 -313.594349579 +935 924 -218141.790724 +936 924 27562.5230014 +937 924 539000.359971 +938 924 -109076.241974 +939 924 -36436.27862 +940 924 -538998.204438 +1006 924 87384.9106508 +1007 924 55317.6404752 +1010 924 50352.2342779 +1011 924 129499.565974 +1012 924 27657.5611273 +1026 924 -8754.20569192 +1027 924 -129500.0842 +1032 924 87385.2564527 +1033 924 -55316.386255 +1034 924 -8754.17097664 +1035 924 -129499.57066 +1039 924 50352.4315243 +1040 924 129500.088886 +1041 924 -27659.4522378 +925 925 456697.961472 +926 925 161594.514205 +927 925 -.00914757419378 +928 925 -8192.82976161 +929 925 -121195.706533 +934 925 57049.2961113 +935 925 -27562.5230014 +936 925 228348.001203 +937 925 80797.2570304 +938 925 -.00914757372811 +939 925 -4096.41572877 +940 925 -60597.8658102 +955 925 -70976.2415495 +956 925 -282195.172629 +957 925 -45937.3446904 +1006 925 -51592.7189658 +1007 925 -37107.9240244 +1010 925 -244159.595698 +1011 925 36779.1127669 +1012 925 -174919.962774 +1026 925 16590.125265 +1027 925 245416.054217 +1032 925 -25796.4839459 +1033 925 37108.0770763 +1034 925 8295.06263252 +1035 925 122708.027108 +1039 925 -122080.295339 +1040 925 18389.5648524 +1041 925 174920.671033 +1042 925 -35488.2452373 +1043 925 -141097.586315 +1044 925 45937.5328783 +926 926 4740123.32619 +927 926 .000937662087381 +928 926 -160215.571168 +929 926 -2370052.82793 +934 926 19509.9529105 +935 926 -539000.359971 +936 926 80797.2570304 +937 926 2370060.68145 +938 926 .000937785953283 +939 926 -80107.8187207 +940 926 -1185026.90415 +955 926 -282195.172629 +956 926 -539425.502016 +957 926 -129499.56776 +1006 926 281881.062246 +1007 926 129499.570435 +1010 926 36779.1127669 +1011 926 1078848.32958 +1012 926 -.00297559099272 +1026 926 -36465.0080294 +1027 926 -539423.195702 +1032 926 140940.539537 +1033 926 -129500.084425 +1034 926 -18232.5124284 +1035 926 -269711.722314 +1039 926 18389.5648524 +1040 926 539423.915505 +1041 926 -.00297558819875 +1042 926 -141097.586315 +1043 926 -269712.875471 +1044 926 129500.0871 +927 927 436297.797013 +928 927 -36436.2785883 +929 927 -538998.20397 +934 927 8873.91051247 +935 927 -109076.241974 +936 927 .00914755184203 +937 927 -.000937792472541 +938 927 -436282.207438 +939 927 -36436.4243024 +940 927 -539000.359503 +955 927 45937.3491027 +956 927 129499.56761 +957 927 27657.4803478 +1006 927 45862.0994078 +1007 927 27657.644889 +1010 927 174919.971603 +1011 927 .00297554722056 +1012 927 110635.057599 +1026 927 -8754.17099186 +1027 927 -129499.570885 +1032 927 45862.2783615 +1033 927 -27659.3684761 +1034 927 -8754.20567669 +1035 927 -129500.083975 +1039 927 174920.662203 +1040 927 -.00297559658065 +1041 927 -110632.553125 +1042 927 45937.5284659 +1043 927 129500.087251 +1044 927 -27659.3116492 +928 928 211035722.822 +929 928 -9727211.24683 +930 928 -7.15255737305e-7 +931 928 336262.694232 +932 928 -22927.0018819 +933 928 6376945.39325 +934 928 -1318.8719359 +935 928 36436.27862 +936 928 -4096.41572877 +937 928 -80107.8187207 +938 928 36436.4243024 +939 928 -51403789.8076 +940 928 3427559.15644 +941 928 -.360276475549 +942 928 3059684.37739 +943 928 11.9831591097 +1006 928 -19055.0856041 +1007 928 -8754.20599346 +1010 928 -20319.499369 +1011 928 -36465.0155792 +1012 928 -8754.17069031 +1026 928 -30311798.6282 +1027 928 -381839.369939 +1028 928 -2.68220901489e-7 +1029 928 80789.5182072 +1030 928 -5508.31669138 +1031 928 44176008.4661 +1032 928 -9527.54180266 +1033 928 8754.17067509 +1034 928 -27462935.4358 +1035 928 1955922.70006 +1036 928 51131291.8077 +1037 928 -1263758.79445 +1038 928 -816.463332821 +1039 928 -10159.7496845 +1040 928 -18232.5162033 +1041 928 8754.20597824 +929 929 69053491.2539 +930 929 2.98023223877e-8 +931 929 4931852.84874 +932 929 -336262.694232 +933 929 93541080.8014 +934 929 -19509.9398802 +935 929 538998.204438 +936 929 -60597.8658102 +937 929 -1185026.90415 +938 929 539000.359503 +939 929 3427559.15644 +940 929 -1356464.42966 +941 929 -5.28405669518 +942 929 44875402.1562 +943 929 175.502037358 +1006 929 -281879.964557 +1007 929 -129500.088661 +1010 929 -300584.310192 +1011 929 -539423.307384 +1012 929 -129499.566425 +1026 929 -381839.369939 +1027 929 -35881517.2269 +1028 929 2.04890966415e-8 +1029 929 1184925.74371 +1030 929 -80789.5182072 +1031 929 647921795.397 +1032 929 -140939.967495 +1033 929 129499.5662 +1034 929 1955922.70006 +1035 929 1093193.28007 +1036 929 -3486186.75252 +1037 929 -18535329.3672 +1038 929 -11974.9250067 +1039 929 -150292.155096 +1040 929 -269711.778155 +1041 929 129500.088435 +930 930 11725575044.4 +931 930 -746666.957293 +932 930 -10952584.596 +939 930 .360276713967 +940 930 5.28405667935 +941 930 -7827119137 +1026 930 3.27825546265e-7 +1027 930 -2.32830643654e-8 +1028 930 2677927373.19 +1029 930 -5172348.2589 +1030 930 -75861927.9261 +1034 930 51131291.8077 +1035 930 -3486186.75252 +1036 930 -1922836059.47 +931 931 2755407890.98 +932 931 58875924.1925 +933 931 5.58793544769e-9 +939 931 -3059684.37739 +940 931 -44875402.1562 +942 931 834107925.586 +943 931 -.00187644385733 +1026 931 80789.5182072 +1027 931 1184925.74371 +1028 931 5172348.2589 +1029 931 -1236481579.17 +1030 931 148393494.677 +1031 931 1.86264514923e-9 +1034 931 1263758.79445 +1035 931 18535329.3672 +1037 931 -371207454.429 +1038 931 -266308.811499 +932 932 3614908076.62 +933 932 -2.32830643654e-10 +939 932 208614.698486 +940 932 3059684.37739 +942 932 -56870953.333 +943 932 -.0275211283588 +1026 932 -5508.31669139 +1027 932 -80789.5182072 +1028 932 75861927.9261 +1029 932 148393494.677 +1030 932 929862243.18 +1031 932 -1.23691279441e-10 +1034 932 -86164.4408315 +1035 932 -1263758.79445 +1037 932 25309325.5483 +1038 932 18157.2226694 +933 933 30909297546.8 +939 933 11.9831591097 +940 933 175.502037358 +942 933 .00187643768731 +943 933 -1113572.3197 +1026 933 -44176008.4661 +1027 933 -647921795.397 +1029 933 -5.93718141317e-9 +1030 933 3.92901711166e-10 +1031 933 8028236264.76 +1034 933 816.463332821 +1035 933 11974.9250067 +1037 933 -266308.811499 +1038 933 -184697.186945 +934 934 451097.0415 +935 934 -1.15752220154e-8 +936 934 228198.163151 +937 934 78039.7292715 +938 934 -1.33045017719e-8 +939 934 -5275.49670076 +940 934 -78039.892023 +1006 934 -61358.9884017 +1007 934 -87535.7603657 +1010 934 -35262.2677262 +1011 934 -132059.638893 +1012 934 -41598.2299375 +1026 934 8927.19669511 +1027 934 132059.122709 +1032 934 -245434.953487 +1033 934 6.6701322794e-9 +1034 934 35708.7827829 +1035 934 528236.4317 +1039 934 -141048.573053 +1040 934 -528238.589226 +1041 934 1.25277787447e-8 +1159 934 -61358.9884017 +1160 934 87535.7603657 +1161 934 -35262.2677262 +1162 934 -132059.638893 +1163 934 41598.2299375 +1164 934 8927.1966951 +1165 934 132059.122709 +1170 934 112773.76837 +1171 934 313.59434957 +1172 934 57049.2961113 +1173 934 19509.9529105 +1174 934 -8873.91051248 +1175 934 -1318.8719359 +1176 934 -19509.9398802 +1181 934 -60346.9344636 +1182 934 -78191.4501587 +1183 934 -141865.647053 +1188 934 -20464.1781805 +1189 934 141866.216446 +1190 934 -41441.4252353 +935 935 436299.187114 +936 935 -5.82076609135e-9 +937 935 5.12227416039e-8 +938 935 218138.900333 +939 935 -7.05122947693e-9 +940 935 -1.04308128357e-7 +1006 935 -87385.2564527 +1007 935 -55316.386255 +1010 935 -50352.4315242 +1011 935 -129500.088886 +1012 935 -27659.4522377 +1026 935 8754.17097664 +1027 935 129499.57066 +1032 935 1.78666785359e-8 +1033 935 110635.28095 +1034 935 -3.4311786294e-9 +1035 935 -5.07570803165e-8 +1039 935 1.58324837685e-8 +1040 935 4.00468707085e-8 +1041 935 55315.1222547 +1159 935 87385.2564527 +1160 935 -55316.386255 +1161 935 50352.4315243 +1162 935 129500.088886 +1163 935 -27659.4522378 +1164 935 -8754.17097664 +1165 935 -129499.57066 +1170 935 -313.594349578 +1171 935 -218141.790724 +1172 935 27562.5230014 +1173 935 539000.359971 +1174 935 -109076.241974 +1175 935 -36436.27862 +1176 935 -538998.204438 +1181 935 -87818.5227136 +1182 935 -53519.2806113 +1183 935 -139999.531442 +1188 935 -31977.4238183 +1189 935 140000.091685 +1190 935 -26761.0693146 +936 936 913395.922943 +937 936 323189.02841 +938 936 -4.14438545704e-8 +939 936 -16385.6595232 +940 936 -242391.413065 +955 936 -35488.2452373 +956 936 -141097.586315 +957 936 -45937.5328783 +1006 936 -25796.4839459 +1007 936 -37108.0770763 +1010 936 -122080.295339 +1011 936 18389.5648524 +1012 936 -174920.671033 +1026 936 8295.06263252 +1027 936 122708.027108 +1032 936 -103185.437932 +1033 936 -2.56113708019e-9 +1034 936 33180.2505301 +1035 936 490832.108433 +1039 936 -488319.191395 +1040 936 73558.2255338 +1041 936 2.84053385258e-8 +1042 936 -141952.483099 +1043 936 -564390.345259 +1044 936 1.2805685401e-8 +1113 936 -20912.6812731 +1114 936 130944.565672 +1115 936 -36750.022154 +1116 936 55706.857145 +1117 936 -20199.4024249 +1118 936 9187.50153679 +1119 936 -35488.2452373 +1120 936 -141097.586315 +1121 936 45937.5328783 +1159 936 -25796.4839459 +1160 936 37108.0770763 +1161 936 -122080.295339 +1162 936 18389.5648524 +1163 936 174920.671033 +1164 936 8295.06263252 +1165 936 122708.027108 +1170 936 57049.2961113 +1171 936 -27562.5230014 +1172 936 228348.001203 +1173 936 80797.2570304 +1174 936 -.00914757465944 +1175 936 -4096.41572877 +1176 936 -60597.8658102 +1181 936 -40283.9222492 +1182 936 -46295.5786264 +1183 936 -153167.003112 +1188 936 -100743.132382 +1189 936 22222.4429031 +1190 936 -156545.649595 +937 937 9480246.65238 +938 937 -1.94646418095e-7 +939 937 -320431.142337 +940 937 -4740105.65587 +955 937 -141097.586315 +956 937 -269712.875471 +957 937 -129500.0871 +1006 937 140940.539537 +1007 937 129500.084425 +1010 937 18389.5648524 +1011 937 539423.915505 +1012 937 .00297559564933 +1026 937 -18232.5124284 +1027 937 -269711.722314 +1032 937 563762.124492 +1033 937 -1.76951289177e-8 +1034 937 -72930.0160589 +1035 937 -1078846.3914 +1039 937 73558.2255338 +1040 937 2157696.65917 +1041 937 -3.53902578354e-8 +1042 937 -564390.345259 +1043 937 -1078851.00403 +1044 937 2.88709998131e-8 +1113 937 130944.565672 +1114 937 -325933.923542 +1115 937 140000.09269 +1116 937 -20199.4024249 +1117 937 -1185034.41167 +1118 937 539000.359659 +1119 937 -141097.586315 +1120 937 -269712.875471 +1121 937 129500.0871 +1159 937 140940.539537 +1160 937 -129500.084425 +1161 937 18389.5648524 +1162 937 539423.915505 +1163 937 -.00297558680177 +1164 937 -18232.5124284 +1165 937 -269711.722314 +1170 937 19509.9529105 +1171 937 -539000.359971 +1172 937 80797.2570304 +1173 937 2370060.68145 +1174 937 .000937791541219 +1175 937 -80107.8187207 +1176 937 -1185026.90415 +1181 937 -153167.003112 +1182 937 -140000.095678 +1183 937 -325932.561084 +1188 937 22222.4429031 +1189 937 651865.839396 +1190 937 .00266296695918 +938 938 872595.594027 +939 938 3.52561473846e-9 +940 938 5.21540641785e-8 +955 938 -45937.5284659 +956 938 -129500.087251 +957 938 -27659.3116492 +1006 938 -45862.2783615 +1007 938 -27659.3684761 +1010 938 -174920.662203 +1011 938 .00297560077161 +1012 938 -110632.553125 +1026 938 8754.20567669 +1027 938 129500.083975 +1032 938 2.50525772572e-9 +1033 938 55315.2897779 +1034 938 -1.5739351511e-9 +1035 938 -2.32830643654e-8 +1039 938 2.28174030781e-8 +1040 938 -3.77185642719e-8 +1041 938 221270.115198 +1042 938 1.2805685401e-8 +1043 938 4.05125319958e-8 +1044 938 55314.9606955 +1113 938 -36750.0269238 +1114 938 140000.092853 +1115 938 -26760.9752199 +1116 938 9187.51072696 +1117 938 539000.359815 +1118 938 -109075.542903 +1119 938 45937.5284659 +1120 938 129500.087251 +1121 938 -27659.3116492 +1159 938 45862.2783615 +1160 938 -27659.3684761 +1161 938 174920.662203 +1162 938 -.00297559564933 +1163 938 -110632.553125 +1164 938 -8754.20567669 +1165 938 -129500.083975 +1170 938 8873.91051247 +1171 938 -109076.241974 +1172 938 .00914755277336 +1173 938 -.000937786884606 +1174 938 -436282.207438 +1175 938 -36436.4243024 +1176 938 -539000.359503 +1181 938 -46295.5833745 +1182 938 -26761.1530758 +1183 938 -140000.095191 +1188 938 -156545.65914 +1189 938 .00266295857727 +1190 938 -107038.324262 +939 939 119463717.139 +940 939 -7507852.71688 +941 939 -2.38418579102e-7 +943 939 47.8208583167 +1006 939 -9527.54180266 +1007 939 -8754.17067509 +1010 939 -10159.7496845 +1011 939 -18232.5162033 +1012 939 -8754.20597824 +1026 939 -27462935.4358 +1027 939 1955922.70006 +1028 939 -51131291.8077 +1029 939 1263758.79445 +1030 939 -86164.4408315 +1031 939 -816.463332821 +1032 939 -38110.1712081 +1033 939 3.1478703022e-10 +1034 939 46297604.4952 +1035 939 -3213688.56774 +1036 939 -2.98023223877e-7 +1038 939 2130.21434382 +1039 939 -40638.998738 +1040 939 -72930.0311583 +1041 939 2.1405518055e-9 +1159 939 -9527.54180266 +1160 939 8754.17067509 +1161 939 -10159.7496845 +1162 939 -18232.5162033 +1163 939 8754.20597824 +1164 939 -27462935.4358 +1165 939 1955922.70006 +1166 939 51131291.8077 +1167 939 -1263758.79445 +1168 939 86164.4408315 +1169 939 -816.463332821 +1170 939 -1318.8719359 +1171 939 36436.27862 +1172 939 -4096.41572877 +1173 939 -80107.8187207 +1174 939 36436.4243024 +1175 939 -51403789.8076 +1176 939 3427559.15644 +1177 939 -.360276475549 +1178 939 3059684.37739 +1179 939 -208614.698486 +1180 939 11.9831591097 +1181 939 -29456737.5236 +1182 939 9463.96859533 +1183 939 2090613.66726 +1184 939 -51131286.8839 +1185 939 -1152925.69933 +1186 939 78609.3564946 +1187 939 828.44649193 +1188 939 8100.72290661 +1189 939 -22033.0373544 +1190 939 9464.00616503 +940 940 9901072.56295 +941 940 1.49011611938e-8 +942 940 -1.19209289551e-7 +943 940 702.015770667 +1006 940 -140939.967495 +1007 940 -129499.5662 +1010 940 -150292.155096 +1011 940 -269711.778155 +1012 940 -129500.088435 +1026 940 1955922.70006 +1027 940 1093193.28007 +1028 940 3486186.75252 +1029 940 18535329.3672 +1030 940 -1263758.79445 +1031 940 -11974.9250067 +1032 940 -563759.929115 +1033 940 4.65661287308e-9 +1034 940 -3213688.56774 +1035 940 -608654.332957 +1036 940 2.04890966415e-8 +1038 940 31243.4814768 +1039 940 -601168.620385 +1040 940 -1078846.61477 +1041 940 3.16649675369e-8 +1159 940 -140939.967495 +1160 940 129499.5662 +1161 940 -150292.155096 +1162 940 -269711.778155 +1163 940 129500.088435 +1164 940 1955922.70006 +1165 940 1093193.28007 +1166 940 -3486186.75252 +1167 940 -18535329.3672 +1168 940 1263758.79445 +1169 940 -11974.9250067 +1170 940 -19509.9398802 +1171 940 538998.204438 +1172 940 -60597.8658102 +1173 940 -1185026.90415 +1174 940 539000.359503 +1175 940 3427559.15644 +1176 940 -1356464.42966 +1177 940 -5.28405669518 +1178 940 44875402.1562 +1179 940 -3059684.37739 +1180 940 175.502037358 +1181 940 2221747.11041 +1182 940 139999.535434 +1183 940 1056679.10951 +1184 940 3486258.96796 +1185 940 -16909407.8294 +1186 940 1152925.69933 +1187 940 12150.427044 +1188 940 119833.179092 +1189 940 -325932.505243 +1190 940 140000.091199 +941 941 15876917230.4 +1026 941 -51131291.8077 +1027 941 3486186.75252 +1028 941 -1922836059.47 +1034 941 3.8743019104e-7 +1035 941 -2.60770320892e-8 +1036 941 3729994733.66 +1164 941 51131291.8077 +1165 941 -3486186.75252 +1166 941 -1922836059.47 +1175 941 .360276713967 +1176 941 5.28405667935 +1177 941 -7827119137 +1181 941 -51131286.8839 +1183 941 3486258.96796 +1184 941 -2074228117.67 +942 942 1833219936.63 +943 942 1.86264514923e-9 +1026 942 -1263758.79445 +1027 942 -18535329.3672 +1029 942 -371207454.429 +1030 942 25309325.5483 +1031 942 266308.811499 +1037 942 -703940480.373 +1164 942 1263758.79445 +1165 942 18535329.3672 +1167 942 -371207454.429 +1168 942 25309325.5483 +1169 942 -266308.811499 +1175 942 -3059684.37739 +1176 942 -44875402.1562 +1178 942 834107925.586 +1179 942 -56870953.333 +1180 942 -.00187644385733 +1181 942 1152925.69933 +1183 942 16909407.8294 +1185 942 -340301826.683 +1186 942 23202629.2978 +1187 942 266308.785854 +943 943 2575080.50874 +1026 943 816.463332821 +1027 943 11974.9250067 +1029 943 266308.811499 +1030 943 -18157.2226694 +1031 943 -184697.186945 +1034 943 -2130.21434382 +1035 943 -31243.4814768 +1037 943 -4.07453626394e-9 +1038 943 459767.331148 +1164 943 816.463332821 +1165 943 11974.9250067 +1167 943 -266308.811499 +1168 943 18157.2226694 +1169 943 -184697.186945 +1175 943 11.9831591097 +1176 943 175.502037358 +1178 943 .00187643768731 +1179 943 .0275211287735 +1180 943 -1113572.3197 +1181 943 -828.44649193 +1183 943 -12150.427044 +1185 943 266308.785854 +1186 943 -18157.5987915 +1187 943 -202023.574818 +944 944 213097600.937 +945 944 9384964.60477 +946 944 4.76837158203e-7 +947 944 -323177.198914 +948 944 -22035.8810581 +949 944 -5180.48342362 +950 944 -2285.53981122 +951 944 -35016.8233251 +952 944 -7100.06875312 +953 944 138840.272789 +954 944 -35016.6833187 +958 944 -30311972.9554 +959 944 385237.532642 +960 944 -3.8743019104e-7 +961 944 -80799.0812491 +962 944 -5509.62383761 +963 944 -44181188.9496 +964 944 -18999.8166094 +965 944 -8754.2060087 +966 944 -20148.3847364 +967 944 33116.1463095 +968 944 -8754.17067508 +1079 944 -3550.03527816 +1080 944 69420.1717023 +1081 944 35016.8233555 +1082 944 -1142.7675157 +1083 944 35016.6833491 +1084 944 -49186373.3679 +1085 944 -3261366.33219 +1086 944 2.0588221848 +1087 944 -3145643.53872 +1088 944 .0967358672315 +1089 944 -10074.1923682 +1090 944 16558.0824179 +1091 944 8754.20599347 +1095 944 -9499.90720441 +1096 944 8754.17065986 +1103 944 -27463030.8839 +1104 944 -1954477.44277 +1105 944 51131263.6705 +1106 944 1263906.88098 +1107 944 816.560068688 +945 945 76115770.9542 +946 945 4.47034835815e-8 +947 945 4739701.67074 +948 945 323177.198914 +949 945 -1069.62030636 +950 945 33809.7605211 +951 945 518000.345045 +952 945 105030.602857 +953 945 -2053850.18919 +954 945 517998.273945 +958 945 385237.532642 +959 945 -35930991.2841 +960 945 -2.79396772385e-8 +961 945 1184925.09164 +962 945 80799.0812491 +963 945 647920725.776 +964 945 281062.375879 +965 945 129500.088886 +966 945 298053.028645 +967 945 -489883.821147 +968 945 129499.566199 +1079 945 52515.3147657 +1080 945 -1026925.6169 +1081 945 -518000.345496 +1082 945 16904.8449068 +1083 945 -517998.274396 +1084 945 -3261366.33219 +1085 945 -1568850.86985 +1086 945 -30.194589261 +1087 945 46133860.8866 +1088 945 .00525184947765 +1089 945 149026.514323 +1090 945 -244942.047602 +1091 945 -129500.088661 +1095 945 140531.171663 +1096 945 -129499.565974 +1103 945 -1954477.44277 +1104 945 1068391.56416 +1105 945 3486599.41191 +1106 945 -18535297.1051 +1107 945 -11974.9197548 +946 946 11283559371.5 +947 946 606.556768 +948 946 125.238990307 +958 946 -2.98023223877e-8 +959 946 -9.31322574615e-10 +960 946 2677928956.25 +961 946 5172954.81566 +962 946 -75861802.6871 +1084 946 -2.05882242322 +1085 946 30.1945892442 +1086 946 -7517830260.3 +1103 946 51131263.6705 +1104 946 3486599.41191 +1105 946 -1922837085.77 +947 947 2844109948.82 +948 947 -62444526.6634 +949 947 -5.58793544769e-9 +958 947 -80799.0812491 +959 947 1184925.09164 +960 947 -5172954.81566 +961 947 -1236478440.07 +962 947 -148410892.337 +963 947 4.7730281949e-9 +1084 947 3145643.53872 +1085 947 -46133860.8866 +1087 947 860236321.812 +1088 947 .0107230338035 +1103 947 -1263906.88098 +1104 947 18535297.1051 +1106 947 -371206819.998 +1107 947 -266308.66495 +948 948 3755660665.26 +949 948 -4.65661287308e-10 +958 948 -5509.62383761 +959 948 80799.0812491 +960 948 75861802.6871 +961 948 -148410892.337 +962 948 929859336.392 +963 948 3.20142135024e-10 +1084 948 214486.130523 +1085 948 -3145643.53872 +1087 948 58655329.8482 +1088 948 -.15726348562 +1103 948 -86184.7854247 +1104 948 1263906.88098 +1106 948 -25312292.0771 +1107 948 -18159.371937 +949 949 32113414868.2 +958 949 44181188.9496 +959 949 -647920725.776 +961 949 -2.32830643654e-10 +963 949 8028231847.19 +1084 949 .0967358672387 +1085 949 .00525184936123 +1087 949 -.010723029729 +1088 949 -1065668.00477 +1103 949 -816.560068688 +1104 949 11974.9197548 +1106 949 -266308.66495 +1107 949 -184697.30516 +950 950 259007.315256 +951 950 -303.104628498 +952 950 130649.07256 +953 950 -33809.6699328 +954 950 8527.01717148 +958 950 17909.6603861 +959 950 -264935.804528 +964 950 -135145.8507 +965 950 -96366.5769059 +966 950 -76768.3304095 +967 950 264936.882336 +968 950 -46013.6444839 +1079 950 65324.2750074 +1080 950 -16904.8569366 +1081 950 -8527.06010246 +1082 950 129503.132254 +1083 950 303.094563698 +1084 950 -1142.7675157 +1085 950 16904.8449068 +1089 950 -38384.3022338 +1090 950 132468.431905 +1091 950 46013.8328814 +1095 950 -67573.2006234 +1096 950 96366.9662598 +1103 950 8954.83129336 +1104 950 -132467.918541 +951 951 232440.657713 +952 951 26489.657294 +953 951 -517998.273494 +954 951 116215.695657 +958 951 -8754.20567668 +959 951 129500.083975 +964 951 96213.9812196 +965 951 60902.4434524 +966 951 54767.8195516 +967 951 -129499.565749 +968 951 30450.0743651 +1079 951 26489.7721063 +1080 951 -518000.345947 +1081 951 -116221.485887 +1082 951 -303.094563709 +1083 951 -232433.705374 +1084 951 -35016.6833491 +1085 951 517998.274395 +1089 951 54768.0344823 +1090 951 -129500.089111 +1091 951 -30451.8350938 +1095 951 96214.3623527 +1096 951 -60901.3754654 +1103 951 -8754.17099187 +1104 951 129499.570886 +952 952 522860.487041 +953 952 -140040.484693 +954 952 -.00879158498719 +955 952 128323.351879 +956 952 35009.8699739 +957 952 -8829.77499011 +958 952 16761.2398976 +959 952 -247947.335764 +964 952 -57832.3358102 +965 952 -41522.4593004 +966 952 -269132.620652 +967 952 -33403.4066527 +968 952 -192579.853933 +969 952 -77161.6337148 +970 952 281350.748632 +971 952 -50352.2299761 +1042 952 64161.4143731 +1043 952 17504.939443 +1044 952 8829.80147696 +1045 952 -38580.9538854 +1046 952 140675.374316 +1047 952 50352.4358261 +1079 952 261429.197556 +1080 952 -70020.2423466 +1081 952 -.00879156962037 +1082 952 65324.2750074 +1083 952 -26489.7721063 +1084 952 -3550.03527816 +1085 952 52515.3147657 +1089 952 -134566.858043 +1090 952 -16701.7126509 +1091 952 192580.632807 +1095 952 -28916.3049341 +1096 952 41522.6300347 +1103 952 8380.61994881 +1104 952 -123973.667882 +953 953 4107709.07809 +954 953 -.000901577994227 +955 953 35009.8699739 +956 953 -2053855.94532 +957 953 517998.273795 +958 953 33116.1387592 +959 953 -489883.709456 +964 953 -281063.474523 +965 953 -129499.57066 +966 953 -33403.4066527 +967 953 979770.538892 +968 953 .00327617162839 +969 953 281350.748632 +970 953 -489887.238492 +971 953 129499.567685 +1042 953 17504.939443 +1043 953 -1026928.49556 +1044 953 -518000.345646 +1045 953 140675.374316 +1046 953 -244943.756274 +1047 953 -129500.087176 +1079 953 -70020.2423466 +1080 953 2053853.49308 +1081 953 -.000901475548744 +1082 953 -16904.8569366 +1083 953 518000.345947 +1084 953 69420.1717023 +1085 953 -1026925.6169 +1089 953 -16701.7126509 +1090 953 489884.994991 +1091 953 .0032761930488 +1095 953 -140531.746524 +1096 953 129500.0842 +1103 953 16558.0786428 +1104 953 -244941.991757 +954 954 464880.644381 +955 954 8829.76615773 +956 954 -517998.273644 +957 954 116215.370532 +958 954 -8754.1710071 +959 954 129499.571111 +964 954 50276.6347001 +965 954 30450.1581334 +966 954 192579.862763 +967 954 -.00327622704208 +968 954 121804.44235 +969 954 50352.2343884 +970 954 -129499.567534 +971 954 30449.8827418 +1042 954 8829.81030933 +1043 954 -518000.345796 +1044 954 -116221.146907 +1045 954 50352.4314138 +1046 954 -129500.087326 +1047 954 -30451.5839809 +1079 954 .00879155099392 +1080 954 .000901446677744 +1081 954 -464866.753585 +1082 954 8527.06010246 +1083 954 -116221.485887 +1084 954 -35016.8233555 +1085 954 518000.345496 +1089 954 192580.623976 +1090 954 .00327618932352 +1091 954 -121802.310014 +1095 954 50276.8313036 +1096 954 -30451.7513255 +1103 954 -8754.20566145 +1104 954 129500.083749 +955 955 518086.138562 +956 955 -2.421438694e-8 +957 955 -.00882212538272 +966 955 -58547.4110901 +967 955 -264649.615776 +968 955 -45937.3446891 +969 955 -270270.527889 +970 955 9.31322574615e-9 +971 955 -192579.153824 +1010 955 128323.351879 +1011 955 -35009.8699739 +1012 955 8829.76615773 +1013 955 -58547.4110901 +1014 955 264649.615776 +1015 955 -45937.3446891 +1039 955 64161.4143731 +1040 955 -17504.939443 +1041 955 -8829.81030933 +1042 955 259042.023319 +1043 955 -2.51457095146e-8 +1044 955 -.00882212212309 +1045 955 -135135.811977 +1046 955 -6.51925802231e-9 +1047 955 192579.932918 +1050 955 -29273.8425731 +1051 955 132324.807888 +1052 955 45937.5328796 +1079 955 64161.4143731 +1080 955 17504.939443 +1081 955 -8829.81030934 +1089 955 -29273.8425731 +1090 955 -132324.807888 +1091 955 45937.5328796 +956 956 4107714.83461 +957 956 -1.13621354103e-7 +966 956 -264649.615776 +967 956 -489887.201263 +968 956 -129499.569175 +969 956 -1.67638063431e-8 +970 956 979773.993258 +971 956 -1.72294676304e-8 +1010 956 -35009.8699739 +1011 956 -2053855.94532 +1012 956 517998.273645 +1013 956 264649.615776 +1014 956 -489887.201263 +1015 956 129499.569175 +1039 956 -17504.939443 +1040 956 -1026928.49556 +1041 956 -518000.345796 +1042 956 -1.30385160446e-8 +1043 956 2053856.37134 +1044 956 6.51925802231e-9 +1045 956 -1.02445483208e-8 +1046 956 489886.722493 +1047 956 -6.053596735e-9 +1050 956 132324.807888 +1051 956 -244943.73766 +1052 956 -129500.085685 +1079 956 17504.939443 +1080 956 -1026928.49556 +1081 956 518000.345796 +1089 956 -132324.807888 +1090 956 -244943.73766 +1091 956 129500.085685 +957 957 464879.973349 +966 957 45937.3491015 +967 957 129499.569326 +968 957 30449.910663 +969 957 192579.162654 +970 957 -2.79396772385e-8 +971 957 121803.997794 +1010 957 -8829.77499011 +1011 957 -517998.273795 +1012 957 116215.370532 +1013 957 45937.3491015 +1014 957 -129499.569326 +1015 957 30449.910663 +1039 957 -8829.80147696 +1040 957 -518000.345646 +1041 957 -116221.146907 +1042 957 .00882210349664 +1043 957 -2.32830643654e-8 +1044 957 -464866.096408 +1045 957 192579.924088 +1046 957 -4.65661287308e-9 +1047 957 -121801.869096 +1050 957 45937.5284672 +1051 957 -129500.085535 +1052 957 -30451.5560596 +1079 957 -8829.80147696 +1080 957 518000.345646 +1081 957 -116221.146907 +1089 957 45937.5284672 +1090 957 129500.085535 +1091 957 -30451.5560596 +958 958 266826831.559 +959 958 -5359968.57272 +960 958 4.76837158203e-7 +961 958 -240187.638698 +962 958 -16376.4303029 +963 958 -142432920.585 +964 958 -1566.96058292 +965 958 -26026.0173363 +966 958 -4866.99472259 +967 958 95176.7353923 +968 958 -26025.9132774 +972 958 12531335.1012 +973 958 -4.61935997009e-7 +974 958 -39294.7380987 +975 958 -2678.59131373 +976 958 -186614109.535 +977 958 -123209173.027 +978 958 -4258.80301967 +979 958 -19225.5235142 +980 958 15074.2726142 +981 958 -4258.7856373 +1079 958 8380.61994881 +1080 958 16558.0786428 +1081 958 8754.20566145 +1082 958 8954.83129336 +1083 958 8754.17099187 +1084 958 -27463030.8839 +1085 958 -1954477.44277 +1086 958 -51131263.6705 +1087 958 1263906.88098 +1088 958 -816.560068688 +1089 958 -2433.49809579 +1090 958 47588.3961363 +1091 958 26026.0173589 +1092 958 -9612.7617571 +1093 958 7537.14112063 +1094 958 4258.80301227 +1095 958 -783.478382969 +1096 958 26025.9133 +1097 958 -15620637.1762 +1098 958 4258.7856299 +1103 958 -34306883.8082 +1104 958 -2155930.95226 +1105 958 -5.71835443378 +1106 958 -4481942.51795 +1107 958 -267.530688355 +1108 958 -1213933.89026 +1109 958 51131341.8213 +1110 958 2758750.0059 +1111 958 188054.792069 +1112 958 549.029380333 +959 959 345126746.207 +960 959 1.49011611938e-8 +961 959 3522752.03463 +962 959 240187.638698 +963 959 2089694573.02 +964 959 23179.8902799 +965 959 385000.256453 +966 959 71996.963352 +967 959 -1407939.87267 +968 959 384998.717121 +972 959 -306168155.146 +973 959 -3.25962901115e-8 +974 959 576450.925653 +975 959 39294.7380987 +976 959 2737615298.79 +977 959 12808007.3556 +978 959 63000.0446696 +979 959 284401.235417 +980 959 -222992.198435 +981 959 62999.787534 +1079 959 -123973.667882 +1080 959 -244941.991757 +1081 959 -129500.083749 +1082 959 -132467.918541 +1083 959 -129499.570886 +1084 959 -1954477.44277 +1085 959 1068391.56416 +1086 959 -3486599.41191 +1087 959 -18535297.1051 +1088 959 11974.9197548 +1089 959 35998.4925413 +1090 959 -703970.357045 +1091 959 -385000.256788 +1092 959 142200.617709 +1093 959 -111496.170423 +1094 959 -63000.0445602 +1095 959 11589.9169078 +1096 959 -384998.717455 +1097 959 -1075597.77151 +1098 959 -62999.7874245 +1103 959 -2155930.95226 +1104 959 -2828387.98827 +1105 959 83.8739820281 +1106 959 65742146.5948 +1107 959 3920.69901645 +1108 959 2115216.77646 +1109 959 3485453.13416 +1110 959 -40470660.2332 +1111 959 -2758750.0059 +1112 959 -8054.22073838 +960 960 8563158682.22 +961 960 16677256.7023 +962 960 -244679197.577 +972 960 2.60770320892e-8 +973 960 1126042869.36 +974 960 21850211.518 +975 960 -320541000.264 +977 960 3.72529029846e-7 +1084 960 -51131263.6705 +1085 960 -3486599.41191 +1086 960 -1922837085.77 +1097 960 51131341.8213 +1103 960 5.71835422516 +1104 960 -83.8739820421 +1105 960 -5542198771.68 +1108 960 3485453.13416 +1109 960 -980809367.397 +961 961 4164699145.37 +962 961 -107688086.738 +963 961 -3.72529029846e-9 +972 961 576450.925653 +973 961 -21850211.518 +974 961 -2631902782.65 +975 961 -311118496.331 +976 961 4.7730281949e-9 +977 961 -39294.7380987 +1084 961 -1263906.88098 +1085 961 18535297.1051 +1087 961 -371206819.998 +1088 961 266308.66495 +1097 961 -2758750.0059 +1103 961 4481942.51795 +1104 961 -65742146.5948 +1106 961 1252629003.91 +1107 961 -.0297830894124 +1108 961 40470660.2332 +1110 961 -793851723.575 +1111 961 -54114225.8237 +1112 961 -266309.071986 +962 962 5736982744.64 +963 962 -2.32830643654e-10 +972 962 39294.7380987 +973 962 320541000.264 +974 962 -311118496.331 +975 962 1910974827.26 +976 962 3.20142135024e-10 +977 962 -2678.59131373 +1084 962 -86184.7854247 +1085 962 1263906.88098 +1087 962 -25312292.0771 +1088 962 18159.371937 +1097 962 -188054.792069 +1103 962 305554.507633 +1104 962 -4481942.51795 +1106 962 85397231.1047 +1107 962 .43684365684 +1108 962 2758750.0059 +1110 962 -54114225.8237 +1111 962 -3688786.39365 +1112 962 -18153.4017404 +963 963 49060905115.8 +972 963 -2737615298.79 +974 963 9.31322574615e-10 +975 963 6.54836185277e-11 +976 963 16502042836.2 +977 963 186614109.535 +1084 963 816.560068688 +1085 963 -11974.9197548 +1087 963 266308.66495 +1088 963 -184697.30516 +1097 963 -549.029380333 +1103 963 -267.530688355 +1104 963 3920.69901645 +1106 963 .029783097445 +1107 963 -744783.162124 +1108 963 8054.22073838 +1110 963 -266309.071986 +1111 963 -18153.4017404 +1112 963 -66218.9915486 +964 964 432971.330232 +965 964 -224.003439063 +966 964 217278.569794 +967 964 -23179.7720403 +968 964 6338.47559791 +972 964 -269325.925988 +977 964 -278842.686222 +978 964 -102888.45614 +979 964 -157861.417167 +980 964 269326.962803 +981 964 -50388.6310429 +1079 964 -28916.3049341 +1080 964 -140531.746524 +1081 964 -50276.8313036 +1082 964 -67573.2006234 +1083 964 -96214.3623527 +1084 964 -9499.90720441 +1085 964 140531.171663 +1089 964 108639.076841 +1090 964 -11589.903595 +1091 964 -6338.50750889 +1092 964 -78930.7797894 +1093 964 134663.476588 +1094 964 50388.8346623 +1095 964 216485.246741 +1096 964 223.995963952 +1097 964 -139421.485583 +1098 964 102888.869643 +1103 964 -783.478382969 +1104 964 11589.9169078 +1108 964 -134662.971451 +965 965 187233.162693 +966 965 19687.4310999 +967 965 -384998.716787 +968 965 93613.4056133 +972 965 63000.0394247 +977 965 98558.2555744 +978 965 31647.0821115 +979 965 54647.4188159 +980 965 -62999.7873151 +981 965 15822.9956317 +1079 965 -41522.6300347 +1080 965 -129500.0842 +1081 965 -30451.7513255 +1082 965 -96366.9662598 +1083 965 -60901.3754654 +1084 965 -8754.17065986 +1085 965 129499.565974 +1089 965 19687.5164295 +1090 965 -385000.257122 +1091 965 -93616.9912427 +1092 965 54647.6355389 +1093 965 -63000.0447791 +1094 965 -15824.1964766 +1095 965 -223.995963973 +1096 965 -187227.63102 +1097 965 98558.68175 +1098 965 -31647.3021052 +1103 965 -26025.9133 +1104 965 384998.717455 +1108 965 62999.7926695 +966 966 869288.716736 +967 966 -95996.1855538 +968 966 -.00653407350182 +969 966 215681.164358 +970 966 23999.2123204 +971 966 -6562.48141212 +972 966 -261599.128991 +977 966 -121255.258422 +978 966 -48205.338149 +979 966 -593569.521206 +980 966 -15201.8402713 +981 966 -205704.81247 +987 966 -157958.263758 +988 966 276800.972492 +989 966 -52499.8239511 +1042 966 -29273.8425731 +1043 966 -132324.807888 +1044 966 -45937.5284672 +1045 966 107840.373884 +1046 966 11999.6097904 +1047 966 6562.50109771 +1072 966 -78979.2030845 +1073 966 138400.486246 +1074 966 52500.0361274 +1079 966 -134566.858043 +1080 966 -16701.7126509 +1081 966 -192580.623976 +1082 966 -38384.3022338 +1083 966 -54768.0344823 +1084 966 -10074.1923682 +1085 966 149026.514323 +1089 966 434643.525417 +1090 966 -47998.0924504 +1091 966 -.00653404602781 +1092 966 -296785.04522 +1093 966 -7600.92498008 +1094 966 205705.639289 +1095 966 108639.076841 +1096 966 -19687.5164295 +1097 966 -60627.7004169 +1098 966 48205.533375 +1103 966 -2433.49809579 +1104 966 35998.4925413 +1108 966 -130799.564496 +967 967 2815898.26988 +968 967 -.000669155735523 +969 967 23999.2123205 +970 967 -1407954.6795 +971 967 384998.71701 +972 967 -222992.086772 +977 967 -261599.128991 +978 967 -62999.79256 +979 967 -15201.8402713 +980 967 445984.231479 +981 967 .00349874794483 +987 967 276800.972492 +988 967 -222993.700251 +989 967 62999.7892073 +1042 967 -132324.807888 +1043 967 -244943.73766 +1044 967 -129500.085535 +1045 967 11999.6097904 +1046 967 -703977.760952 +1047 967 -385000.256899 +1072 967 138400.486246 +1073 967 -111496.921331 +1074 967 -63000.0428868 +1079 967 -16701.7126509 +1080 967 489884.994991 +1081 967 -.00327618792653 +1082 967 132468.431905 +1083 967 129500.089111 +1084 967 16558.0824179 +1085 967 -244942.047602 +1089 967 -47998.0924504 +1090 967 1407948.29242 +1091 967 -.000669104978442 +1092 967 -7600.92498008 +1093 967 222991.973122 +1094 967 .00349872931838 +1095 967 -11589.903595 +1096 967 385000.257122 +1097 967 -130799.564496 +1098 967 63000.0395342 +1103 967 47588.3961363 +1104 967 -703970.357045 +1108 967 -111496.114592 +968 968 374464.346538 +969 968 6562.47484769 +970 968 -384998.716898 +971 968 93612.4229372 +972 968 62999.792779 +977 968 48205.3402848 +978 968 15823.0793791 +979 968 205704.816765 +980 968 -.0034987712279 +981 968 63293.947808 +987 968 52499.8260974 +988 968 -62999.7891341 +989 968 15822.9168878 +1042 968 -45937.5328795 +1043 968 -129500.085685 +1044 968 -30451.5560596 +1045 968 6562.50766212 +1046 968 -385000.257011 +1047 968 -93615.9995546 +1072 968 52500.0339811 +1073 968 -63000.04296 +1074 968 -15824.0598354 +1079 968 -192580.632807 +1080 968 -.00327619630843 +1081 968 -121802.310014 +1082 968 -46013.8328814 +1083 968 -30451.8350938 +1084 968 -8754.20599347 +1085 968 129500.088661 +1089 968 .00653401948512 +1090 968 .000669091939926 +1091 968 -374453.292157 +1092 968 205705.634995 +1093 968 .00349873746745 +1094 968 -63294.389855 +1095 968 6338.50750888 +1096 968 -93616.9912427 +1097 968 48205.5312393 +1098 968 -15824.1127293 +1103 968 -26026.0173589 +1104 968 385000.256788 +1108 968 63000.0393152 +969 969 866010.109068 +970 969 -6.51925802231e-8 +971 969 -.00655683130026 +979 969 -139345.680777 +980 969 -269199.391916 +981 969 -50352.2311081 +987 969 -594085.615039 +988 969 3.35276126862e-8 +989 969 -205704.112353 +1010 969 -77161.6337148 +1011 969 -281350.748632 +1012 969 50352.2343884 +1013 969 215681.164358 +1014 969 -23999.2123204 +1015 969 6562.47484768 +1016 969 -139345.680777 +1017 969 269199.391916 +1018 969 -50352.2311081 +1039 969 -38580.9538854 +1040 969 -140675.374316 +1041 969 -50352.4314138 +1042 969 -135135.811977 +1043 969 2.04890966415e-8 +1044 969 -192579.924088 +1045 969 433004.221597 +1046 969 -4.56348061562e-8 +1047 969 -.00655680755153 +1050 969 107840.373884 +1051 969 -11999.6097904 +1052 969 -6562.50766212 +1060 969 -69672.9115941 +1061 969 134599.695958 +1062 969 50352.4346941 +1072 969 -297043.0923 +1073 969 1.86264514923e-9 +1074 969 205704.939408 +1079 969 -38580.9538854 +1080 969 140675.374316 +1081 969 -50352.4314138 +1089 969 107840.373884 +1090 969 11999.6097904 +1091 969 -6562.50766212 +1092 969 -69672.9115941 +1093 969 -134599.695958 +1094 969 50352.4346941 +970 970 2815913.07702 +971 970 -6.89178705216e-8 +979 970 -269199.391916 +980 970 -222993.663026 +981 970 -62999.7908867 +987 970 1.30385160446e-8 +988 970 445985.770409 +989 970 -1.02445483208e-8 +1010 970 -281350.748632 +1011 970 -489887.238492 +1012 970 129499.567534 +1013 970 -23999.2123204 +1014 970 -1407954.6795 +1015 970 384998.716898 +1016 970 269199.391916 +1017 970 -222993.663026 +1018 970 62999.7908867 +1039 970 -140675.374316 +1040 970 -244943.756274 +1041 970 -129500.087326 +1042 970 9.31322574615e-9 +1043 970 489886.722493 +1044 970 5.58793544769e-9 +1045 970 -3.25962901115e-8 +1046 970 1407955.69599 +1047 970 -5.12227416038e-9 +1050 970 -11999.6097904 +1051 970 -703977.760952 +1052 970 -385000.257011 +1060 970 134599.695958 +1061 970 -111496.902718 +1062 970 -63000.0412075 +1072 970 9.31322574615e-10 +1073 970 222992.742752 +1074 970 -1.32713466883e-8 +1079 970 140675.374316 +1080 970 -244943.756274 +1081 970 129500.087326 +1089 970 11999.6097904 +1090 970 -703977.760952 +1091 970 385000.257011 +1092 970 -134599.695958 +1093 970 -111496.902718 +1094 970 63000.0412075 +971 971 374462.367655 +979 971 50352.2332545 +980 971 62999.7909599 +981 971 15822.9448066 +987 971 205704.116648 +988 971 -2.93366611004e-8 +989 971 63293.7313929 +1010 971 -50352.2299761 +1011 971 -129499.567685 +1012 971 30449.8827418 +1013 971 -6562.4814121 +1014 971 -384998.71701 +1015 971 93612.4229372 +1016 971 50352.2332545 +1017 971 -62999.7909599 +1018 971 15822.9448066 +1039 971 -50352.4358261 +1040 971 -129500.087176 +1041 971 -30451.5839809 +1042 971 -192579.932918 +1043 971 3.25962901115e-9 +1044 971 -121801.869096 +1045 971 .00655677169561 +1046 971 -6.053596735e-9 +1047 971 -374451.322313 +1050 971 -6562.50109771 +1051 971 -385000.256899 +1052 971 -93615.9995546 +1060 971 50352.4325477 +1061 971 -63000.0411343 +1062 971 -15824.0319165 +1072 971 205704.935113 +1073 971 -1.30385160446e-8 +1074 971 -63294.1754996 +1079 971 -50352.4358261 +1080 971 129500.087176 +1081 971 -30451.5839809 +1089 971 -6562.50109772 +1090 971 385000.256899 +1091 971 -93615.9995546 +1092 971 50352.4325477 +1093 971 63000.0411343 +1094 971 -15824.0319165 +972 972 441166802.309 +974 972 1152901.85131 +975 972 78589.4761979 +976 972 -2737615298.79 +977 972 -9776540.06169 +978 972 126000.086607 +979 972 295563.203947 +980 972 -441328.34097 +981 972 125999.577471 +982 972 -103062362.637 +983 972 2.98023223877e-8 +1089 972 -130799.564496 +1090 972 -111496.114592 +1091 972 -63000.0393152 +1092 972 147781.60568 +1093 972 -220664.314194 +1094 972 -126000.086717 +1095 972 -134662.971451 +1096 972 -62999.7926694 +1097 972 -387056.881921 +1098 972 -125999.577581 +1099 972 -14151923.0769 +1100 972 -5.125e7 +1103 972 -1213933.89026 +1104 972 2115216.77646 +1105 972 -3485453.13416 +1106 972 -40470660.2332 +1107 972 8054.22073838 +1108 972 -9015716.20552 +1109 972 4005033.15616 +1110 972 42675233.5294 +1111 972 2909028.41892 +1112 972 8054.22073838 +973 973 5421491638.03 +974 973 -256250211.518 +975 973 320541000.264 +982 973 1.78813934326e-7 +983 973 864927069.597 +984 973 -2.344e8 +1097 973 -3741317.69424 +1099 973 -5.125e7 +1100 973 -837525641.026 +1103 973 -51131341.8213 +1104 973 -3485453.13416 +1105 973 -980809367.397 +1108 973 -4005033.15616 +1109 973 -3243833873.42 +974 974 5086644246.96 +975 974 -76463997.1258 +976 974 -9.31322574615e-9 +977 974 -78589.4761978 +983 974 2.344e8 +984 974 1.172e9 +1097 974 2909028.41892 +1103 974 -2758750.0059 +1104 974 40470660.2332 +1106 974 -793851723.575 +1107 974 266309.071986 +1108 974 -42675233.5294 +1110 974 822511176.425 +1111 974 56067845.193 +1112 974 19486.0296575 +975 975 6990817815.22 +976 975 -1.86264514923e-9 +977 975 -968338.29795 +979 975 -481490.557409 +985 975 -3061559609.65 +986 975 -4.65661287308e-9 +1092 975 -49177864.0697 +1097 975 51217570.6312 +1101 975 -962833934.294 +1102 975 266927.083333 +1103 975 -188054.792069 +1104 975 2758750.0059 +1106 975 -54114225.8237 +1107 975 18153.4017404 +1108 975 -2909028.41892 +1110 975 56067845.193 +1111 975 990594193.69 +1112 975 20859.5476883 +976 976 50989005305.3 +977 976 1985080448.25 +979 976 -1798466338.71 +986 976 8992353204.17 +1092 976 5773.23717949 +1097 976 -6322.26655982 +1101 976 266927.083333 +1102 976 -43556.3568376 +1103 976 549.029380333 +1104 976 -8054.22073838 +1106 976 266309.071986 +1107 976 -66218.9915486 +1108 976 8054.22073838 +1110 976 -19486.0296575 +1111 976 -20859.5476883 +1112 976 -365167.479462 +977 977 404147350.162 +978 977 96411.0631442 +979 977 -243349349.076 +980 977 -250434.976461 +981 977 46057.9555688 +985 977 -481490.557408 +986 977 1798466338.71 +1089 977 -60627.7004169 +1090 977 -130799.564496 +1091 977 -48205.5312393 +1092 977 2597946.48393 +1093 977 -125217.484523 +1094 977 -46057.721679 +1095 977 -139421.485583 +1096 977 -98558.68175 +1097 977 -12198059.7609 +1098 977 -96410.6799039 +1101 977 49177864.0697 +1102 977 -5773.23717949 +1103 977 -15620637.1762 +1104 977 -1075597.77151 +1105 977 -51131341.8213 +1106 977 2758750.0059 +1107 977 -549.029380333 +1108 977 -387056.881921 +1109 977 3741317.69424 +1110 977 -2909028.41892 +1111 977 -51217570.6312 +1112 977 -6322.26655982 +978 978 63956.0332584 +979 978 58942.1126311 +980 978 -125999.582716 +981 978 31977.0493047 +1089 978 -48205.533375 +1090 978 -63000.0395342 +1091 978 -15824.1127293 +1092 978 58941.9302781 +1093 978 -126000.081472 +1094 978 -31977.9212894 +1095 978 -102888.869643 +1096 978 -31647.3021051 +1097 978 96410.6799039 +1098 978 -63953.9079298 +1103 978 -4258.7856299 +1104 978 62999.7874245 +1108 978 125999.577581 +979 979 487815439.507 +980 979 -30086.3311084 +981 979 210000.137867 +985 979 -1925962.23064 +987 979 -243348323.662 +988 979 -265476.876203 +989 979 50352.4411375 +993 979 -481490.557408 +994 979 1798466338.71 +1045 979 -69672.9115941 +1046 979 -134599.695958 +1047 979 -50352.4325477 +1072 979 2598459.19106 +1073 979 -132738.436863 +1074 979 -50352.2246647 +1077 979 49177864.0697 +1078 979 -5773.23717949 +1089 979 -296785.04522 +1090 979 -7600.92498005 +1091 979 -205705.634995 +1092 979 -4930267.0838 +1093 979 -15043.165453 +1094 979 -209999.302447 +1095 979 -78930.7797894 +1096 979 -54647.6355389 +1097 979 2597946.48393 +1098 979 -58941.9302781 +1101 979 -102038543.721 +1103 979 -9612.76175711 +1104 979 142200.617709 +1108 979 147781.60568 +1111 979 49177864.0697 +1112 979 5773.23717949 +980 980 882660.379516 +981 980 .00335264252499 +987 980 280521.304205 +988 980 -441329.834959 +989 980 125999.579218 +1045 980 -134599.695958 +1046 980 -111496.902718 +1047 980 -63000.0411343 +1072 980 140260.653341 +1073 980 -220665.061356 +1074 980 -126000.084971 +1089 980 -7600.92498006 +1090 980 222991.973122 +1091 980 -.00349873560481 +1092 980 -15043.1654531 +1093 980 441329.901966 +1094 980 .00335268164054 +1095 980 134663.476588 +1096 980 63000.0447791 +1097 980 -125217.484523 +1098 980 126000.081472 +1103 980 7537.14112063 +1104 980 -111496.170423 +1108 980 -220664.314194 +981 981 127911.9615 +987 981 54647.6268234 +988 981 -125999.58097 +989 981 31976.9429005 +1045 981 -50352.4346941 +1046 981 -63000.0412075 +1047 981 -15824.0319165 +1072 981 54647.4275314 +1073 981 -126000.083218 +1074 981 -31977.8123084 +1089 981 -205705.639289 +1090 981 -.00349873676896 +1091 981 -63294.3898549 +1092 981 209999.302447 +1093 981 -.0033526904881 +1094 981 -127907.490106 +1095 981 -50388.8346623 +1096 981 -15824.1964766 +1097 981 46057.721679 +1098 981 -31977.9212894 +1103 981 -4258.80301227 +1104 981 63000.0445602 +1108 981 126000.086717 +982 982 268075274.725 +990 982 -103062362.637 +991 982 2.98023223877e-8 +1075 982 -14151923.0769 +1076 982 -5.125e7 +1099 982 -14003846.1539 +1100 982 5.96046447754e-8 +1108 982 -14151923.0769 +1109 982 5.125e7 +983 983 5000228278.39 +990 983 1.78813934326e-7 +991 983 864927069.597 +992 983 -2.344e8 +1075 983 -5.125e7 +1076 983 -837525641.026 +1099 983 5.96046447754e-8 +1100 983 -2921102564.1 +1108 983 5.125e7 +1109 983 -837525641.026 +984 984 4.688e9 +991 984 2.344e8 +992 984 1.172e9 +985 985 6263329269.67 +986 985 3.72529029846e-9 +987 985 -481490.557409 +993 985 -3061559609.65 +994 985 -4.65661287308e-9 +1072 985 -49177864.0697 +1077 985 -962833934.294 +1078 985 266927.083333 +1092 985 102038543.721 +1097 985 -49177864.0697 +1101 985 1973544471.15 +1102 985 -2.91038304567e-9 +1111 985 -962833934.294 +1112 985 -266927.083333 +986 986 35969606412.2 +987 986 -1798466338.71 +994 986 8992353204.17 +1072 986 5773.23717949 +1077 986 266927.083333 +1078 986 -43556.3568376 +1097 986 -5773.23717949 +1101 986 -2.09547579288e-9 +1102 986 -306436.965812 +1111 986 -266927.083333 +1112 986 -43556.3568376 +987 987 488761263.697 +988 987 -6.51925802231e-8 +989 987 210000.137981 +991 987 97754.1792891 +993 987 -1908929.39469 +998 987 -481490.557408 +999 987 1798466338.71 +1013 987 -157958.263758 +1014 987 -276800.972492 +1015 987 52499.8260974 +1016 987 -243348323.662 +1017 987 -280521.304205 +1018 987 54647.6268234 +1045 987 -297043.0923 +1046 987 3.16649675369e-8 +1047 987 -205704.935113 +1050 987 -78979.2030845 +1051 987 -138400.486246 +1052 987 -52500.0339811 +1060 987 2598459.19106 +1061 987 -140260.653341 +1062 987 -54647.4275314 +1070 987 49177864.0697 +1071 987 -5773.23717949 +1072 987 -4930779.79082 +1073 987 -1.49011611938e-8 +1074 987 -209999.302333 +1077 987 -102038543.721 +1089 987 -78979.2030845 +1090 987 138400.486246 +1091 987 -52500.0339811 +1092 987 2598459.19106 +1093 987 140260.653341 +1094 987 -54647.4275314 +1101 987 49177864.0697 +1102 987 5773.23717949 +988 988 882661.873619 +989 988 -4.51691448689e-8 +1013 988 -276800.972492 +1014 988 -222993.700251 +1015 988 62999.7891341 +1016 988 265476.876203 +1017 988 -441329.834959 +1018 988 125999.58097 +1045 988 2.14204192162e-8 +1046 988 222992.742752 +1047 988 1.46683305502e-8 +1050 988 -138400.486246 +1051 988 -111496.921331 +1052 988 -63000.04296 +1060 988 132738.436863 +1061 988 -220665.061356 +1062 988 -126000.083218 +1072 988 -3.44589352608e-8 +1073 988 441330.649014 +1074 988 9.77888703346e-9 +1089 988 138400.486246 +1090 988 -111496.921331 +1091 988 63000.04296 +1092 988 -132738.436863 +1093 988 -220665.061356 +1094 988 126000.083218 +989 989 127911.744827 +1013 989 -52499.823951 +1014 989 -62999.7892073 +1015 989 15822.9168878 +1016 989 50352.4411375 +1017 989 -125999.579218 +1018 989 31976.9429005 +1045 989 -205704.939408 +1046 989 3.25962901115e-9 +1047 989 -63294.1754996 +1050 989 -52500.0361274 +1051 989 -63000.0428868 +1052 989 -15824.0598353 +1060 989 50352.2246647 +1061 989 -126000.084971 +1062 989 -31977.8123084 +1072 989 209999.302333 +1073 989 -1.8160790205e-8 +1074 989 -127907.276009 +1089 989 -52500.0361274 +1090 989 63000.0428868 +1091 989 -15824.0598354 +1092 989 50352.2246647 +1093 989 126000.084971 +1094 989 -31977.8123084 +990 990 268077167.263 +992 990 -17032.8359503 +994 990 164650.747519 +995 990 -103062362.637 +996 990 2.98023223877e-8 +1068 990 -14151923.0769 +1069 990 -5.125e7 +1075 990 -14003846.1539 +1076 990 5.96046447754e-8 +1099 990 -14151923.0769 +1100 990 5.125e7 +991 991 5000240283.43 +993 991 -164650.747519 +995 991 1.78813934326e-7 +996 991 864927069.597 +997 991 -2.344e8 +1068 991 -5.125e7 +1069 991 -837525641.026 +1075 991 5.96046447754e-8 +1076 991 -2921102564.1 +1099 991 5.125e7 +1100 991 -837525641.026 +992 992 4688204394.03 +994 992 -1975808.97023 +996 992 2.344e8 +997 992 1.172e9 +993 993 6282633150.41 +994 993 3.72529029846e-9 +998 993 -3061559609.65 +999 993 -4.65661287308e-9 +1016 993 -481490.557409 +1060 993 -49177864.0697 +1070 993 -962833934.294 +1071 993 266927.083333 +1072 993 102038543.721 +1077 993 1973544471.15 +1078 993 -2.91038304567e-9 +1092 993 -49177864.0697 +1101 993 -962833934.294 +1102 993 -266927.083333 +994 994 35988705898.9 +999 994 8992353204.17 +1016 994 -1798466338.71 +1060 994 5773.23717949 +1070 994 266927.083333 +1071 994 -43556.3568376 +1077 994 -2.09547579288e-9 +1078 994 -306436.965812 +1092 994 -5773.23717949 +1101 994 -266927.083333 +1102 994 -43556.3568376 +995 995 268075274.725 +1021 995 -103062362.637 +1022 995 2.98023223877e-8 +1063 995 -14151923.0769 +1064 995 -5.125e7 +1068 995 -14003846.1539 +1069 995 5.96046447754e-8 +1075 995 -14151923.0769 +1076 995 5.125e7 +996 996 5000228278.39 +1021 996 1.78813934326e-7 +1022 996 864927069.597 +1023 996 -2.344e8 +1063 996 -5.125e7 +1064 996 -837525641.026 +1068 996 5.96046447754e-8 +1069 996 -2921102564.1 +1075 996 5.125e7 +1076 996 -837525641.026 +997 997 4.688e9 +1022 997 2.344e8 +1023 997 1.172e9 +998 998 6263329269.67 +999 998 3.72529029846e-9 +1016 998 -1925962.23064 +1019 998 -481490.557409 +1024 998 -3061559609.65 +1025 998 -4.65661287308e-9 +1058 998 -49177864.0697 +1060 998 102038543.721 +1066 998 -962833934.294 +1067 998 266927.083333 +1070 998 1973544471.15 +1071 998 -2.91038304567e-9 +1072 998 -49177864.0697 +1077 998 -962833934.294 +1078 998 -266927.083333 +999 999 35969606412.2 +1019 999 -1798466338.71 +1025 999 8992353204.17 +1058 999 5773.23717949 +1066 999 266927.083333 +1067 999 -43556.3568376 +1070 999 -2.09547579288e-9 +1071 999 -306436.965812 +1072 999 -5773.23717949 +1077 999 -266927.083333 +1078 999 -43556.3568376 +1000 1000 267217286.99 +1001 1000 6033473.42029 +1002 1000 -279228.326422 +1003 1000 240187.638736 +1004 1000 144426.186724 +1005 1000 142869264.825 +1006 1000 17909.5203601 +1007 1000 -8754.2056767 +1008 1000 -1566.99380739 +1009 1000 -26026.0173362 +1010 1000 16761.3562246 +1011 1000 -33116.489338 +1012 1000 -8754.17100708 +1013 1000 -4867.06304421 +1014 1000 -95178.2375535 +1015 1000 -26025.9132774 +1016 1000 -19225.6571138 +1017 1000 -15074.4286921 +1018 1000 -4258.78563728 +1019 1000 -123209404.768 +1020 1000 -4258.80301969 +1021 1000 -12534316.1042 +1022 1000 -2.08616256714e-7 +1023 1000 39304.3011618 +1024 1000 -2679.89826754 +1025 1000 186659103.127 +1026 1000 -30312024.9881 +1027 1000 -385187.890013 +1028 1000 3.27825546265e-7 +1029 1000 80789.5182072 +1030 1000 -5508.31669139 +1031 1000 -44176008.4661 +1032 1000 8954.7612803 +1033 1000 8754.17099186 +1034 1000 -27463048.6159 +1035 1000 1954248.43917 +1036 1000 -51131291.8077 +1037 1000 -1263758.79445 +1038 1000 816.463332821 +1039 1000 8380.67811227 +1040 1000 -16558.2539321 +1041 1000 8754.20566147 +1048 1000 -783.494995224 +1049 1000 26025.9133 +1050 1000 -2433.53225658 +1051 1000 -47589.1472164 +1052 1000 26026.0173588 +1053 1000 -34306895.0629 +1054 1000 2155868.06755 +1055 1000 .571871310472 +1056 1000 4482459.4665 +1057 1000 267.299544403 +1058 1000 -15620608.0643 +1059 1000 4258.78562987 +1060 1000 -9612.82855692 +1061 1000 -7537.21915954 +1062 1000 4258.80301229 +1063 1000 1214226.78384 +1064 1000 51131283.9922 +1065 1000 -2759415.04091 +1066 1000 188146.115539 +1067 1000 -549.163788417 +1001 1001 346351044.258 +1002 1001 -502928.609781 +1003 1001 3361949.41816 +1004 1001 -240187.638736 +1005 1001 2089469811.29 +1006 1001 264933.733137 +1007 1001 -129500.083975 +1008 1001 -23180.3817661 +1009 1001 -385000.256453 +1010 1001 247949.056576 +1011 1001 -489888.895533 +1012 1001 -129499.571111 +1013 1001 -71997.9740267 +1014 1001 -1407962.09399 +1015 1001 -384998.717121 +1016 1001 -284403.211743 +1017 1001 -222994.50728 +1018 1001 -62999.7875337 +1019 1001 -12810986.5383 +1020 1001 -63000.04467 +1021 1001 -306166704.834 +1022 1001 1.39698386192e-8 +1023 1001 576450.273699 +1024 1001 -39304.3011617 +1025 1001 2737606010.18 +1026 1001 -385187.890013 +1027 1001 -35931051.5475 +1028 1001 -2.32830643654e-8 +1029 1001 1184925.74371 +1030 1001 -80789.5182072 +1031 1001 -647921795.397 +1032 1001 132466.882845 +1033 1001 129499.570885 +1034 1001 1954248.43917 +1035 1001 1068426.10716 +1036 1001 3486186.75252 +1037 1001 -18535329.3672 +1038 1001 11974.9250067 +1039 1001 123974.528288 +1040 1001 -244944.584794 +1041 1001 129500.08375 +1048 1001 -11590.1626512 +1049 1001 384998.717456 +1050 1001 -35998.9978784 +1051 1001 -703981.467699 +1052 1001 385000.256788 +1053 1001 2155868.06755 +1054 1001 -2828366.30382 +1055 1001 8.38739082776 +1056 1001 65742039.8791 +1057 1001 3920.7017593 +1058 1001 1075891.57521 +1059 1001 62999.7874241 +1060 1001 -142201.605872 +1061 1001 -111497.324845 +1062 1001 63000.0445605 +1063 1001 2115175.41558 +1064 1001 -3486301.3802 +1065 1001 -40470521.2551 +1066 1001 2759415.04091 +1067 1001 -8054.22324738 +1002 1002 8563385694.05 +1003 1002 -17069301.6177 +1004 1002 -244463581.262 +1019 1002 5.06639480591e-7 +1021 1002 -3.44589352608e-8 +1022 1002 1126044728.11 +1023 1002 -21855479.7126 +1024 1002 -320539912.677 +1026 1002 -2.68220901489e-7 +1027 1002 2.04890966415e-8 +1028 1002 2677927373.19 +1029 1002 5172348.25889 +1030 1002 75861927.9261 +1034 1002 -51131291.8077 +1035 1002 3486186.75252 +1036 1002 -1922836059.47 +1053 1002 -.571871221065 +1054 1002 -8.38739083428 +1055 1002 -5542198822.7 +1058 1002 51131283.9922 +1063 1002 -3486301.3802 +1064 1002 -980810342.222 +1003 1003 4177757219.76 +1004 1003 101524138.774 +1005 1003 2572841.86627 +1019 1003 39304.3011617 +1021 1003 576450.273699 +1022 1003 21855479.7126 +1023 1003 -2631889418.83 +1024 1003 311193504.233 +1026 1003 80789.5182071 +1027 1003 1184925.74371 +1028 1003 -5172348.25889 +1029 1003 -1236481579.17 +1030 1003 148393494.677 +1031 1003 -5.93718141317e-9 +1034 1003 1263758.79445 +1035 1003 18535329.3672 +1037 1003 -371207454.429 +1038 1003 266308.811499 +1053 1003 -4482459.4665 +1054 1003 -65742039.8791 +1056 1003 1252626923.21 +1057 1003 .00297848985065 +1058 1003 2759415.04091 +1063 1003 40470521.2551 +1065 1003 -793849008.447 +1066 1003 54127271.5593 +1067 1003 -266308.770792 +1004 1004 5742337467.2 +1005 1004 4634041.9669 +1019 1004 -2679.89826754 +1021 1004 -39304.3011617 +1022 1004 320539912.677 +1023 1004 311193504.233 +1024 1004 1910962342.38 +1026 1004 -5508.31669138 +1027 1004 -80789.5182072 +1028 1004 -75861927.9261 +1029 1004 148393494.677 +1030 1004 929862243.18 +1031 1004 4.0017766878e-10 +1034 1004 -86164.4408314 +1035 1004 -1263758.79445 +1037 1004 25309325.5483 +1038 1004 -18157.2226694 +1053 1004 305625.485774 +1054 1004 4482459.4665 +1056 1004 -85407310.3125 +1057 1004 .0436843276766 +1058 1004 -188146.115539 +1063 1004 -2759415.04091 +1065 1004 54127271.5593 +1066 1004 -3690577.79915 +1067 1004 18157.8196885 +1005 1005 49075435809.1 +1019 1005 -186659103.127 +1021 1005 -2737606010.18 +1023 1005 -5.58793544769e-9 +1024 1005 3.78349795938e-10 +1025 1005 16502024172.8 +1026 1005 44176008.4661 +1027 1005 647921795.397 +1029 1005 1.86264514923e-9 +1030 1005 -1.16415321827e-10 +1031 1005 8028236264.76 +1034 1005 -816.463332821 +1035 1005 -11974.9250067 +1037 1005 266308.811499 +1038 1005 -184697.186945 +1053 1005 267.299544403 +1054 1005 3920.7017593 +1056 1005 -.00297849369235 +1057 1005 -744783.215535 +1058 1005 549.163788417 +1063 1005 8054.22324738 +1065 1005 -266308.770792 +1066 1005 18157.8196885 +1067 1005 -66219.1364756 +1006 1006 259002.977854 +1007 1006 -301.00462658 +1008 1006 -135144.330284 +1009 1006 -96364.4769092 +1010 1006 130649.263722 +1011 1006 33813.8237905 +1012 1006 8528.06716851 +1013 1006 -76765.283764 +1014 1006 -264934.810945 +1015 1006 -46012.5944879 +1026 1006 -2285.82061197 +1027 1006 -33813.9143783 +1032 1006 129500.963556 +1033 1006 300.994571214 +1034 1006 -1142.90791609 +1035 1006 -16906.9218356 +1039 1006 65324.3705898 +1040 1006 16906.9338658 +1041 1006 -8528.11010263 +1048 1006 -67572.4404121 +1049 1006 96364.8662621 +1050 1006 -38382.7789096 +1051 1006 -132467.396209 +1052 1006 46012.7828802 +1053 1006 8954.76128029 +1054 1006 132466.882845 +1007 1007 232439.99361 +1008 1007 96213.9812233 +1009 1007 60901.7793577 +1010 1007 26488.607298 +1011 1007 517998.273495 +1012 1007 116215.363597 +1013 1007 54766.7695546 +1014 1007 129499.565749 +1015 1007 30449.7423099 +1026 1007 -35016.8233251 +1027 1007 -518000.345046 +1032 1007 -300.994571227 +1033 1007 -232433.041269 +1034 1007 -35016.6833491 +1035 1007 -517998.274395 +1039 1007 26488.722105 +1040 1007 518000.345946 +1041 1007 -116221.153843 +1048 1007 96214.3623491 +1049 1007 -60900.7113514 +1050 1007 54766.9844821 +1051 1007 129500.089111 +1052 1007 -30451.5030446 +1053 1007 -8754.17099186 +1054 1007 -129499.570885 +1008 1008 432975.850098 +1009 1008 -224.003439036 +1010 1008 -57833.7162035 +1011 1008 281065.545914 +1012 1008 50276.6346996 +1013 1008 217274.083148 +1014 1008 23180.2635268 +1015 1008 6338.47559789 +1016 1008 -157864.534324 +1017 1008 -269328.783051 +1018 1008 -50388.6310423 +1019 1008 -278839.569066 +1020 1008 -102888.456144 +1021 1008 269327.746235 +1026 1008 -18999.9566355 +1027 1008 -281064.44727 +1032 1008 -67572.4404121 +1033 1008 -96214.3623491 +1034 1008 -9499.97721747 +1035 1008 -140532.207359 +1039 1008 -28916.9951293 +1040 1008 140532.78222 +1041 1008 -50276.8313041 +1048 1008 216487.506679 +1049 1008 223.995963975 +1050 1008 108636.83352 +1051 1008 11590.149338 +1052 1008 -6338.50750891 +1053 1008 -783.494995224 +1054 1008 -11590.1626512 +1058 1008 -139419.927003 +1059 1008 102888.86964 +1060 1008 -78932.3383675 +1061 1008 -134664.386712 +1062 1008 50388.8346629 +1063 1008 134663.881575 +1009 1009 187230.201186 +1010 1009 -41522.459301 +1011 1009 129499.57066 +1012 1009 30449.8260716 +1013 1009 19687.4310999 +1014 1009 384998.716787 +1015 1009 93611.9248001 +1016 1009 54647.4188164 +1017 1009 62999.7873146 +1018 1009 15822.8340844 +1019 1009 98556.1555778 +1020 1009 31646.7590422 +1021 1009 -63000.0394243 +1026 1009 -8754.20600868 +1027 1009 -129500.088886 +1032 1009 -96364.8662621 +1033 1009 -60900.7113514 +1034 1009 -8754.17065987 +1035 1009 -129499.565974 +1039 1009 -41522.6300342 +1040 1009 129500.0842 +1041 1009 -30451.419283 +1048 1009 -223.995963991 +1049 1009 -187224.669433 +1050 1009 19687.5164295 +1051 1009 385000.257122 +1052 1009 -93615.5105096 +1053 1009 -26025.9133 +1054 1009 -384998.717456 +1058 1009 98556.5817522 +1059 1009 -31646.9790189 +1060 1009 54647.6355384 +1061 1009 63000.0447796 +1062 1009 -15824.0349462 +1063 1009 -62999.7926699 +1010 1010 522860.040268 +1011 1010 140036.703506 +1012 1010 -.00879109604284 +1013 1010 -269131.356588 +1014 1010 33401.6858404 +1015 1010 -192578.803937 +1026 1010 -7099.81314493 +1027 1010 -105026.821671 +1032 1010 65324.3705898 +1033 1010 -26488.722105 +1034 1010 -3549.90747404 +1035 1010 -52513.4241721 +1039 1010 261428.974172 +1040 1010 70018.3517532 +1041 1010 -.00879107601941 +1042 1010 64161.4143731 +1043 1010 -17504.939443 +1044 1010 8829.80147696 +1045 1010 -38580.9538854 +1046 1010 -140675.374316 +1047 1010 50352.4358261 +1048 1010 -28916.9951293 +1049 1010 41522.6300342 +1050 1010 -134566.226008 +1051 1010 16700.8522441 +1052 1010 192579.582806 +1053 1010 8380.67811227 +1054 1010 123974.528288 +1011 1011 4107714.59098 +1012 1011 .000901086255908 +1013 1011 33401.6858404 +1014 1011 979775.724966 +1015 1011 -.00327599979937 +1026 1011 -138840.645461 +1027 1011 -2053855.70209 +1032 1011 16906.9338658 +1033 1011 -518000.345946 +1034 1011 -69420.358038 +1035 1011 -1026928.37334 +1039 1011 70018.3517532 +1040 1011 2053856.24953 +1041 1011 .000901201739907 +1042 1011 -17504.939443 +1043 1011 -1026928.49556 +1044 1011 518000.345646 +1045 1011 -140675.374316 +1046 1011 -244943.756274 +1047 1011 129500.087176 +1048 1011 140532.78222 +1049 1011 -129500.0842 +1050 1011 16700.8522441 +1051 1011 489887.588031 +1052 1011 -.00327597977593 +1053 1011 -16558.2539321 +1054 1011 -244944.584794 +1012 1012 464879.980284 +1013 1012 192578.812766 +1014 1012 .00327596114948 +1015 1012 121803.778255 +1026 1012 -35016.6833187 +1027 1012 -517998.273945 +1032 1012 8528.11010263 +1033 1012 -116221.153842 +1034 1012 -35016.8233555 +1035 1012 -518000.345496 +1039 1012 .00879105180502 +1040 1012 -.000901181250811 +1041 1012 -464866.089473 +1042 1012 8829.81030933 +1043 1012 518000.345796 +1044 1012 -116221.146907 +1045 1012 50352.4314138 +1046 1012 129500.087326 +1047 1012 -30451.5839809 +1048 1012 50276.8313041 +1049 1012 -30451.419283 +1050 1012 192579.573976 +1051 1012 -.00327596766874 +1052 1012 -121801.6459 +1053 1012 -8754.20566147 +1054 1012 -129500.08375 +1013 1013 869279.744637 +1014 1013 95997.1962282 +1015 1013 -.00653401343152 +1016 1013 -593566.27045 +1017 1013 15203.8165969 +1018 1013 -205703.762473 +1019 1013 -121249.409155 +1020 1013 -48204.288152 +1021 1013 261597.152666 +1026 1013 -20148.2684095 +1027 1013 -298051.307833 +1032 1013 -38382.7789096 +1033 1013 -54766.9844821 +1034 1013 -10074.1342047 +1035 1013 -149025.653916 +1039 1013 -134566.226008 +1040 1013 16700.8522442 +1041 1013 -192579.573976 +1042 1013 -29273.8425731 +1043 1013 132324.807888 +1044 1013 -45937.5284672 +1045 1013 107840.373884 +1046 1013 -11999.6097904 +1047 1013 6562.50109771 +1048 1013 108636.83352 +1049 1013 -19687.5164296 +1050 1013 434639.039371 +1051 1013 47998.5977878 +1052 1013 -.0065339980647 +1053 1013 -2433.53225658 +1054 1013 -35998.9978784 +1058 1013 -60624.7757827 +1059 1013 48204.4833749 +1060 1013 -296783.41984 +1061 1013 7601.91314343 +1062 1013 205704.589289 +1063 1013 130798.576333 +1072 1013 -78979.2030845 +1073 1013 -138400.486246 +1074 1013 52500.0361274 +1014 1014 2815920.49116 +1015 1014 .000669653527439 +1016 1014 15203.8165969 +1017 1014 445986.540323 +1018 1014 -.00349915539846 +1019 1014 261597.152666 +1020 1014 62999.7925603 +1021 1014 -222994.395599 +1026 1014 -33116.4968877 +1027 1014 -489889.007215 +1032 1014 -132467.396209 +1033 1014 -129500.089111 +1034 1014 -16558.2577069 +1035 1014 -244944.640635 +1039 1014 16700.8522441 +1040 1014 489887.588031 +1041 1014 .00327597931027 +1042 1014 132324.807888 +1043 1014 -244943.73766 +1044 1014 129500.085535 +1045 1014 -11999.6097904 +1046 1014 -703977.760952 +1047 1014 385000.256899 +1048 1014 11590.149338 +1049 1014 -385000.257122 +1050 1014 47998.5977878 +1051 1014 1407959.40307 +1052 1014 .000669693574309 +1053 1014 -47589.1472164 +1054 1014 -703981.467699 +1058 1014 130798.576333 +1059 1014 -63000.0395339 +1060 1014 7601.91314343 +1061 1014 222993.127544 +1062 1014 -.00349915586412 +1063 1014 -111497.269005 +1072 1014 -138400.486246 +1073 1014 -111496.921331 +1074 1014 63000.0428869 +1015 1015 374461.385012 +1016 1015 205703.766769 +1017 1015 .00349912745878 +1018 1015 63293.6247386 +1019 1015 48204.2902887 +1020 1015 15822.9178454 +1021 1015 -62999.7927794 +1026 1015 -8754.17067509 +1027 1015 -129499.5662 +1032 1015 -46012.7828802 +1033 1015 -30451.5030446 +1034 1015 -8754.20599346 +1035 1015 -129500.088661 +1039 1015 -192579.582806 +1040 1015 .00327597372234 +1041 1015 -121801.6459 +1042 1015 -45937.5328796 +1043 1015 129500.085685 +1044 1015 -30451.5560596 +1045 1015 6562.50766211 +1046 1015 385000.257011 +1047 1015 -93615.9995546 +1048 1015 6338.5075089 +1049 1015 -93615.5105096 +1050 1015 .00653395941481 +1051 1015 -.000669706147164 +1052 1015 -374450.330591 +1053 1015 -26026.0173588 +1054 1015 -385000.256788 +1058 1015 48204.4812381 +1059 1015 -15823.9511852 +1060 1015 205704.584994 +1061 1015 -.00349915353581 +1062 1015 -63294.0667688 +1063 1015 -63000.0393148 +1072 1015 52500.0339811 +1073 1015 63000.04296 +1074 1015 -15824.0598354 +1016 1016 487815439.931 +1017 1016 30090.1236651 +1018 1016 210000.137867 +1019 1016 -243349349.5 +1020 1016 58943.1626271 +1021 1016 -295566.996503 +1024 1016 -481490.557408 +1025 1016 1798466338.71 +1045 1016 -69672.9115941 +1046 1016 134599.695958 +1047 1016 -50352.4325477 +1048 1016 -78932.3383675 +1049 1016 -54647.6355384 +1050 1016 -296783.41984 +1051 1016 7601.91314346 +1052 1016 -205704.584994 +1053 1016 -9612.82855692 +1054 1016 -142201.605872 +1058 1016 2597946.27194 +1059 1016 -58942.9802793 +1060 1016 -4930266.87181 +1061 1016 15045.0617314 +1062 1016 -209999.302447 +1063 1016 -147783.501959 +1066 1016 49177864.0697 +1067 1016 -5773.23717949 +1070 1016 -102038543.721 +1072 1016 2598459.19106 +1073 1016 132738.436863 +1074 1016 -50352.2246647 +1077 1016 49177864.0697 +1078 1016 5773.23717949 +1017 1017 882662.624978 +1018 1017 -.00335303647444 +1019 1017 250431.183904 +1020 1017 125999.582717 +1021 1017 -441330.586434 +1045 1017 134599.695958 +1046 1017 -111496.902718 +1047 1017 63000.0411343 +1048 1017 -134664.386712 +1049 1017 -63000.0447796 +1050 1017 7601.91314345 +1051 1017 222993.127544 +1052 1017 .00349915819243 +1053 1017 -7537.21915954 +1054 1017 -111497.324845 +1058 1017 125215.588245 +1059 1017 -126000.081471 +1060 1017 15045.0617314 +1061 1017 441331.024698 +1062 1017 -.0033529959619 +1063 1017 -220665.436925 +1072 1017 -140260.653341 +1073 1017 -220665.061356 +1074 1017 126000.084971 +1018 1018 127911.638426 +1019 1018 46056.9055718 +1020 1018 31976.8877619 +1021 1018 -125999.577471 +1045 1018 -50352.4346941 +1046 1018 63000.0412075 +1047 1018 -15824.0319165 +1048 1018 -50388.8346629 +1049 1018 -15824.0349462 +1050 1018 -205704.589289 +1051 1018 .00349914841354 +1052 1018 -63294.0667687 +1053 1018 -4258.80301229 +1054 1018 -63000.0445605 +1058 1018 46056.6716788 +1059 1018 -31977.7597544 +1060 1018 209999.302447 +1061 1018 .00335298990831 +1062 1018 -127907.167024 +1063 1018 -126000.086717 +1072 1018 54647.4275314 +1073 1018 126000.083218 +1074 1018 -31977.8123084 +1019 1019 404147531.7 +1020 1019 96408.9631423 +1021 1019 9778911.86509 +1023 1019 78608.6023222 +1024 1019 -968340.911856 +1025 1019 -1985125441.84 +1048 1019 -139419.927003 +1049 1019 -98556.5817522 +1050 1019 -60624.7757827 +1051 1019 130798.576333 +1052 1019 -48204.4812381 +1053 1019 -15620608.0643 +1054 1019 1075891.57521 +1055 1019 -51131283.9922 +1056 1019 -2759415.04091 +1057 1019 549.163788417 +1058 1019 -12198064.757 +1059 1019 -96408.5799114 +1060 1019 2597946.27194 +1061 1019 125215.588245 +1062 1019 -46056.6716788 +1063 1019 387184.231513 +1064 1019 3741313.46284 +1065 1019 2909730.02681 +1066 1019 -51217666.9529 +1067 1019 6322.4009679 +1070 1019 49177864.0697 +1071 1019 5773.23717949 +1020 1020 63955.7101708 +1021 1020 -126000.086608 +1048 1020 -102888.86964 +1049 1020 -31646.9790189 +1050 1020 -48204.4833749 +1051 1020 63000.0395338 +1052 1020 -15823.9511852 +1053 1020 -4258.78562987 +1054 1020 -62999.7874241 +1058 1020 96408.5799114 +1059 1020 -63953.5848618 +1060 1020 58942.9802793 +1061 1020 126000.081471 +1062 1020 -31977.7597544 +1063 1020 -125999.577581 +1021 1021 441165440.49 +1022 1021 -2.38418579102e-7 +1023 1021 1152900.54738 +1024 1021 -78608.6023222 +1025 1021 -2737606010.18 +1048 1021 134663.881575 +1049 1021 62999.7926699 +1050 1021 130798.576333 +1051 1021 -111497.269005 +1052 1021 63000.0393147 +1053 1021 1214226.78384 +1054 1021 2115175.41558 +1055 1021 3486301.3802 +1056 1021 -40470521.2551 +1057 1021 8054.22324738 +1058 1021 387184.231513 +1059 1021 125999.577581 +1060 1021 -147783.501959 +1061 1021 -220665.436925 +1062 1021 126000.086717 +1063 1021 -9015729.85944 +1064 1021 -4005095.22294 +1065 1021 42675092.0579 +1066 1021 -2909730.02681 +1067 1021 8054.22324738 +1068 1021 -14151923.0769 +1069 1021 5.125e7 +1022 1022 5421494356.89 +1023 1022 256255479.713 +1024 1022 320539912.677 +1053 1022 -51131283.9922 +1054 1022 3486301.3802 +1055 1022 -980810342.222 +1058 1022 -3741313.46284 +1063 1022 4005095.22294 +1064 1022 -3243836024.77 +1068 1022 5.125e7 +1069 1022 -837525641.026 +1023 1023 5086643808.93 +1024 1023 76482424.3459 +1025 1023 -3.72529029846e-9 +1053 1023 2759415.04091 +1054 1023 40470521.2551 +1056 1023 -793849008.447 +1057 1023 266308.770792 +1058 1023 -2909730.02681 +1063 1023 -42675092.0579 +1065 1023 822508428.883 +1066 1023 -56081366.376 +1067 1023 19486.007619 +1024 1024 6990810913.82 +1025 1024 5.58793544769e-9 +1053 1024 -188146.115539 +1054 1024 -2759415.04091 +1056 1024 54127271.5593 +1057 1024 -18157.8196885 +1058 1024 51217666.9529 +1060 1024 -49177864.0697 +1063 1024 2909730.02681 +1065 1024 -56081366.376 +1066 1024 990596050.074 +1067 1024 -20859.8709528 +1070 1024 -962833934.294 +1071 1024 -266927.083333 +1025 1025 50988967978.7 +1053 1025 -549.163788417 +1054 1025 -8054.22324738 +1056 1025 266308.770792 +1057 1025 -66219.1364756 +1058 1025 6322.4009679 +1060 1025 -5773.23717949 +1063 1025 8054.22324738 +1065 1025 -19486.007619 +1066 1025 20859.8709528 +1067 1025 -365167.859242 +1070 1025 -266927.083333 +1071 1025 -43556.3568376 +1026 1026 213097694.684 +1027 1026 -9384400.37724 +1029 1026 323158.072828 +1030 1026 -22033.2667655 +1031 1026 -4.05327955377e-6 +1032 1026 -1142.90791609 +1033 1026 35016.6833491 +1034 1026 -49186384.0026 +1035 1026 3261177.42942 +1037 1026 3145458.87938 +1038 1026 7.27595761418e-11 +1039 1026 -3549.90747404 +1040 1026 -69420.358038 +1041 1026 35016.8233555 +1048 1026 -9499.97721747 +1049 1026 8754.17065987 +1050 1026 -10074.1342048 +1051 1026 -16558.2577069 +1052 1026 8754.20599346 +1053 1026 -27463048.6159 +1054 1026 1954248.43917 +1055 1026 51131291.8077 +1056 1026 -1263758.79445 +1057 1026 -816.463332821 +1027 1027 76115757.9659 +1029 1027 4739702.97484 +1030 1027 -323158.072828 +1032 1027 -16906.9218356 +1033 1027 517998.274395 +1034 1027 3261177.42942 +1035 1027 -1568822.76298 +1036 1027 -2.32830643654e-8 +1037 1027 46133895.6425 +1039 1027 -52513.4241721 +1040 1027 -1026928.37334 +1041 1027 518000.345496 +1048 1027 -140532.207359 +1049 1027 129499.565974 +1050 1027 -149025.653916 +1051 1027 -244944.640635 +1052 1027 129500.088661 +1053 1027 1954248.43917 +1054 1027 1068426.10716 +1055 1027 -3486186.75252 +1056 1027 -18535329.3672 +1057 1027 -11974.9250067 +1028 1028 11283556376.3 +1029 1028 4.76837158203e-7 +1035 1028 2.32830643654e-8 +1036 1028 -7517828159.96 +1053 1028 51131291.8077 +1054 1028 -3486186.75252 +1055 1028 -1922836059.47 +1029 1029 2844110100.82 +1030 1029 62440874.1017 +1031 1029 3.72529029846e-9 +1034 1029 -3145458.87938 +1035 1029 -46133895.6425 +1037 1029 860236988.662 +1038 1029 -3.14321368933e-9 +1053 1029 1263758.79445 +1054 1029 18535329.3672 +1056 1029 -371207454.429 +1057 1029 -266308.811499 +1030 1030 3755662201.99 +1031 1030 -3.49245965481e-10 +1034 1030 214460.786893 +1035 1030 3145458.87938 +1037 1030 -58651887.8729 +1038 1030 9.45874489844e-11 +1053 1030 -86164.4408314 +1054 1030 -1263758.79445 +1056 1030 25309325.5483 +1057 1030 18157.2226694 +1031 1031 32113423703.2 +1034 1031 7.27595761418e-11 +1037 1031 -1.16415321827e-9 +1038 1031 -1065667.6784 +1053 1031 816.463332821 +1054 1031 11974.9250067 +1056 1031 -266308.811499 +1057 1031 -184697.186945 +1032 1032 518005.955707 +1033 1032 -2.43380665779e-8 +1034 1032 -4571.64122395 +1035 1032 -67627.8287567 +1039 1032 261298.527443 +1040 1032 67627.647581 +1041 1032 -1.53239816427e-8 +1048 1032 -270288.660567 +1049 1032 5.61289489269e-9 +1050 1032 -153530.567528 +1051 1032 -529869.62189 +1052 1032 1.00985169411e-8 +1053 1032 35819.0407201 +1054 1032 529867.466274 +1148 1032 -67572.4404121 +1149 1032 96364.8662621 +1150 1032 -38382.7789096 +1151 1032 -132467.396209 +1152 1032 46012.7828802 +1153 1032 8954.76128029 +1154 1032 132466.882845 +1159 1032 129500.963556 +1160 1032 300.994571214 +1161 1032 65324.3705898 +1162 1032 16906.9338658 +1163 1032 -8528.11010263 +1164 1032 -1142.90791609 +1165 1032 -16906.9218356 +1170 1032 -61358.9884017 +1171 1032 -87385.2564527 +1172 1032 -25796.4839459 +1173 1032 140940.539537 +1174 1032 -45862.2783615 +1175 1032 -9527.54180266 +1176 1032 -140939.967495 +1033 1033 464879.98722 +1034 1033 -4.53293323517e-9 +1035 1033 -6.70552253723e-8 +1039 1033 -1.23400241137e-8 +1040 1033 2.98023223877e-8 +1041 1033 232430.727193 +1048 1033 1.83572992683e-8 +1049 1033 121803.558715 +1050 1033 1.55996531248e-8 +1051 1033 3.25962901115e-8 +1052 1033 60899.4846199 +1053 1033 -2.99047678709e-9 +1054 1033 -4.42378222942e-8 +1148 1033 96214.3623491 +1149 1033 -60900.7113514 +1150 1033 54766.9844821 +1151 1033 129500.089111 +1152 1033 -30451.5030446 +1153 1033 -8754.17099186 +1154 1033 -129499.570885 +1159 1033 -300.994571226 +1160 1033 -232433.041269 +1161 1033 26488.722105 +1162 1033 518000.345946 +1163 1033 -116221.153843 +1164 1033 -35016.6833491 +1165 1033 -517998.274395 +1170 1033 -87535.7603657 +1171 1033 -55316.386255 +1172 1033 -37108.0770763 +1173 1033 129500.084425 +1174 1033 -27659.3684761 +1175 1033 -8754.17067509 +1176 1033 -129499.5662 +1034 1034 115672247.857 +1035 1034 -7283356.40459 +1037 1034 -7.45058059692e-9 +1038 1034 -1.89174897969e-10 +1039 1034 -14199.6262899 +1040 1034 -277681.290922 +1041 1034 2.51829624176e-9 +1048 1034 -37999.9132709 +1049 1034 4.40701842308e-10 +1050 1034 -40296.536819 +1051 1034 -66232.9937755 +1052 1034 2.70716845989e-9 +1053 1034 46297151.7753 +1054 1034 -3220385.60788 +1055 1034 -2.98023223877e-7 +1057 1034 2130.21434382 +1148 1034 -9499.97721747 +1149 1034 8754.17065987 +1150 1034 -10074.1342048 +1151 1034 -16558.2577069 +1152 1034 8754.20599346 +1153 1034 -27463048.6159 +1154 1034 1954248.43917 +1155 1034 51131291.8077 +1156 1034 -1263758.79445 +1157 1034 86164.4408314 +1158 1034 -816.463332821 +1159 1034 -1142.90791609 +1160 1034 35016.6833491 +1161 1034 -3549.90747404 +1162 1034 -69420.358038 +1163 1034 35016.8233555 +1164 1034 -49186384.0026 +1165 1034 3261177.42942 +1167 1034 3145458.87938 +1168 1034 -214460.786893 +1169 1034 7.27595761418e-11 +1170 1034 8927.19669511 +1171 1034 8754.17097664 +1172 1034 8295.06263252 +1173 1034 -18232.5124284 +1174 1034 8754.20567669 +1175 1034 -27462935.4358 +1176 1034 1955922.70006 +1177 1034 -51131291.8077 +1178 1034 -1263758.79445 +1179 1034 86164.4408315 +1180 1034 816.463332821 +1035 1035 9380289.34125 +1037 1035 -1.19209289551e-7 +1039 1035 -210053.643341 +1040 1035 -4107711.40417 +1041 1035 3.72529029846e-8 +1048 1035 -562128.89454 +1049 1035 6.51925802231e-9 +1050 1035 -596102.615665 +1051 1035 -979778.01443 +1052 1035 4.00468707085e-8 +1053 1035 -3220385.60788 +1054 1035 -707722.974197 +1055 1035 2.04890966415e-8 +1057 1035 31243.4814768 +1148 1035 -140532.207359 +1149 1035 129499.565974 +1150 1035 -149025.653916 +1151 1035 -244944.640635 +1152 1035 129500.088661 +1153 1035 1954248.43917 +1154 1035 1068426.10716 +1155 1035 -3486186.75252 +1156 1035 -18535329.3672 +1157 1035 1263758.79445 +1158 1035 -11974.9250067 +1159 1035 -16906.9218356 +1160 1035 517998.274395 +1161 1035 -52513.4241721 +1162 1035 -1026928.37334 +1163 1035 518000.345496 +1164 1035 3261177.42942 +1165 1035 -1568822.76298 +1166 1035 -2.32830643654e-8 +1167 1035 46133895.6425 +1168 1035 -3145458.87938 +1170 1035 132059.122709 +1171 1035 129499.57066 +1172 1035 122708.027108 +1173 1035 -269711.722314 +1174 1035 129500.083975 +1175 1035 1955922.70006 +1176 1035 1093193.28007 +1177 1035 3486186.75252 +1178 1035 -18535329.3672 +1179 1035 1263758.79445 +1180 1035 11974.9250067 +1036 1036 15267011090.5 +1053 1036 3.8743019104e-7 +1054 1036 -2.60770320892e-8 +1055 1036 3729994733.66 +1153 1036 51131291.8077 +1154 1036 -3486186.75252 +1155 1036 -1922836059.47 +1165 1036 2.32830643654e-8 +1166 1036 -7517828159.96 +1175 1036 -51131291.8077 +1176 1036 3486186.75252 +1177 1036 -1922836059.47 +1037 1037 1879169279.96 +1038 1037 1.86264514923e-9 +1056 1037 -703940480.373 +1153 1037 1263758.79445 +1154 1037 18535329.3672 +1156 1037 -371207454.429 +1157 1037 25309325.5483 +1158 1037 -266308.811499 +1164 1037 -3145458.87938 +1165 1037 -46133895.6425 +1167 1037 860236988.662 +1168 1037 -58651887.8729 +1169 1037 -3.14321368933e-9 +1175 1037 1263758.79445 +1176 1037 18535329.3672 +1178 1037 -371207454.429 +1179 1037 25309325.5483 +1180 1037 266308.811499 +1038 1038 2492827.18583 +1053 1038 -2130.21434382 +1054 1038 -31243.4814768 +1056 1038 -4.07453626394e-9 +1057 1038 459767.331148 +1153 1038 816.463332821 +1154 1038 11974.9250067 +1156 1038 -266308.811499 +1157 1038 18157.2226694 +1158 1038 -184697.186945 +1164 1038 7.27595761418e-11 +1167 1038 -1.16415321827e-9 +1168 1038 1.96450855583e-10 +1169 1038 -1065667.6784 +1175 1038 -816.463332821 +1176 1038 -11974.9250067 +1178 1038 266308.811499 +1179 1038 -18157.2226694 +1180 1038 -184697.186945 +1039 1039 1045720.08054 +1040 1039 280073.407013 +1041 1039 -5.16884028912e-8 +1042 1039 256646.703759 +1043 1039 -70019.7399479 +1044 1039 -1.18743628263e-8 +1045 1039 -154323.26743 +1046 1039 -562701.497265 +1047 1039 1.02445483208e-8 +1048 1039 -115667.432407 +1049 1039 -2.32830643654e-9 +1050 1039 -538262.713177 +1051 1039 66803.3716809 +1052 1039 1.95577740669e-8 +1053 1039 33522.7124491 +1054 1039 495898.113152 +1116 1039 -26181.1339249 +1117 1039 131902.59589 +1118 1039 -41522.6255194 +1119 1039 64161.4143731 +1120 1039 -17504.939443 +1121 1039 8829.80147696 +1122 1039 -38580.9538854 +1123 1039 -140675.374316 +1124 1039 50352.4358261 +1148 1039 -28916.9951293 +1149 1039 41522.6300342 +1150 1039 -134566.226008 +1151 1039 16700.8522441 +1152 1039 192579.582806 +1153 1039 8380.67811227 +1154 1039 123974.528288 +1159 1039 65324.3705898 +1160 1039 -26488.722105 +1161 1039 261428.974172 +1162 1039 70018.3517532 +1163 1039 -.00879107741639 +1164 1039 -3549.90747404 +1165 1039 -52513.4241721 +1170 1039 -35262.2677262 +1171 1039 -50352.4315242 +1172 1039 -122080.295339 +1173 1039 18389.5648524 +1174 1039 -174920.662203 +1175 1039 -10159.7496845 +1176 1039 -150292.155096 +1040 1040 8215429.18195 +1041 1040 -1.31316483021e-7 +1042 1040 -70019.7399479 +1043 1040 -4107711.89064 +1044 1040 4.28408384323e-8 +1045 1040 -562701.497265 +1046 1040 -979774.476984 +1047 1040 2.46800482273e-8 +1048 1040 562131.091828 +1049 1040 -1.86264514923e-8 +1050 1040 66803.3716809 +1051 1040 1959551.44993 +1052 1040 -6.10016286373e-8 +1053 1040 -66232.978676 +1054 1040 -979777.791065 +1116 1040 131902.59589 +1117 1040 -269712.856857 +1118 1040 129500.08561 +1119 1040 -17504.939443 +1120 1040 -1026928.49556 +1121 1040 518000.345646 +1122 1040 -140675.374316 +1123 1040 -244943.756274 +1124 1040 129500.087176 +1148 1040 140532.78222 +1149 1040 -129500.0842 +1150 1040 16700.8522441 +1151 1040 489887.588031 +1152 1040 -.00327597931027 +1153 1040 -16558.2539321 +1154 1040 -244944.584794 +1159 1040 16906.9338658 +1160 1040 -518000.345946 +1161 1040 70018.3517532 +1162 1040 2053856.24953 +1163 1040 .000901201739907 +1164 1040 -69420.358038 +1165 1040 -1026928.37334 +1170 1040 -132059.638893 +1171 1040 -129500.088886 +1172 1040 18389.5648524 +1173 1040 539423.915505 +1174 1040 .00297560077161 +1175 1040 -18232.5162033 +1176 1040 -269711.778155 +1041 1041 929759.960568 +1042 1041 -1.51339918375e-8 +1043 1041 9.31322574615e-9 +1044 1041 232430.741065 +1045 1041 1.23400241137e-8 +1046 1041 2.23517417908e-8 +1047 1041 60899.7654835 +1048 1041 3.12831252813e-9 +1049 1041 60899.6521431 +1050 1041 2.04890966415e-8 +1051 1041 -1.95577740669e-8 +1052 1041 243607.55651 +1053 1041 -1.73132866621e-9 +1054 1041 -2.56113708019e-8 +1116 1041 -41522.6299317 +1117 1041 129500.08576 +1118 1041 -27659.2837279 +1119 1041 8829.81030933 +1120 1041 518000.345796 +1121 1041 -116221.146907 +1122 1041 50352.4314138 +1123 1041 129500.087326 +1124 1041 -30451.5839809 +1148 1041 50276.8313041 +1149 1041 -30451.419283 +1150 1041 192579.573976 +1151 1041 -.00327596720308 +1152 1041 -121801.6459 +1153 1041 -8754.20566147 +1154 1041 -129500.08375 +1159 1041 8528.11010263 +1160 1041 -116221.153842 +1161 1041 .00879105040804 +1162 1041 -.000901176594198 +1163 1041 -464866.089473 +1164 1041 -35016.8233555 +1165 1041 -518000.345496 +1170 1041 -41598.2299375 +1171 1041 -27659.4522377 +1172 1041 -174920.671033 +1173 1041 .00297559704632 +1174 1041 -110632.553125 +1175 1041 -8754.20597824 +1176 1041 -129500.088435 +1042 1042 1036172.27712 +1043 1042 -6.14672899246e-8 +1044 1042 -3.53902578354e-8 +1045 1042 -540541.055778 +1046 1042 1.67638063431e-8 +1047 1042 1.67638063431e-8 +1050 1042 -117094.82218 +1051 1042 529299.231553 +1052 1042 -5.12227416038e-9 +1079 1042 256646.703759 +1080 1042 70019.7399479 +1081 1042 -1.93249434233e-8 +1089 1042 -117094.82218 +1090 1042 -529299.231553 +1091 1042 1.37370079756e-8 +1116 1042 -122706.956391 +1117 1042 2.421438694e-8 +1118 1042 -174920.312304 +1119 1042 259042.023319 +1120 1042 -1.58324837685e-8 +1121 1042 -.00882212305441 +1122 1042 -135135.811977 +1123 1042 -1.210719347e-8 +1124 1042 192579.932918 +1150 1042 -29273.8425731 +1151 1042 132324.807888 +1152 1042 45937.5328796 +1161 1042 64161.4143731 +1162 1042 -17504.939443 +1163 1042 -8829.81030933 +1172 1042 -35488.2452373 +1173 1042 -141097.586315 +1174 1042 -45937.5284659 +1217 1042 -35488.2452373 +1218 1042 141097.586315 +1219 1042 -45937.5284659 +1228 1042 64161.4143731 +1229 1042 17504.939443 +1230 1042 -8829.81030934 +1239 1042 -29273.8425731 +1240 1042 -132324.807888 +1241 1042 45937.5328796 +1043 1043 8215429.66922 +1044 1043 -1.97440385819e-7 +1045 1043 3.72529029846e-9 +1046 1043 1959547.98652 +1047 1043 -4.51691448689e-8 +1050 1043 529299.231553 +1051 1043 -979774.402527 +1052 1043 -3.72529029846e-9 +1079 1043 70019.7399479 +1080 1043 -4107711.89064 +1081 1043 8.10250639916e-8 +1089 1043 -529299.231553 +1090 1043 -979774.402527 +1091 1043 2.79396772385e-8 +1116 1043 1.49011611938e-8 +1117 1043 539425.031628 +1118 1043 9.31322574615e-9 +1119 1043 -1.11758708954e-8 +1120 1043 2053856.37134 +1121 1043 4.65661287308e-9 +1122 1043 -8.38190317154e-9 +1123 1043 489886.722493 +1124 1043 -4.65661287308e-9 +1150 1043 132324.807888 +1151 1043 -244943.73766 +1152 1043 -129500.085685 +1161 1043 -17504.939443 +1162 1043 -1026928.49556 +1163 1043 -518000.345796 +1172 1043 -141097.586315 +1173 1043 -269712.875471 +1174 1043 -129500.087251 +1217 1043 141097.586315 +1218 1043 -269712.875471 +1219 1043 129500.087251 +1228 1043 17504.939443 +1229 1043 -1026928.49556 +1230 1043 518000.345796 +1239 1043 -132324.807888 +1240 1043 -244943.73766 +1241 1043 129500.085685 +1044 1044 929759.946697 +1045 1044 2.14204192162e-8 +1046 1044 -4.47034835815e-8 +1047 1044 243607.995588 +1050 1044 6.98491930962e-10 +1051 1044 -1.30385160446e-8 +1052 1044 60899.8213261 +1079 1044 -5.12227416038e-9 +1080 1044 6.98491930962e-8 +1081 1044 232430.741065 +1089 1044 1.30385160446e-8 +1090 1044 3.49245965481e-8 +1091 1044 60899.8213261 +1116 1044 -174920.321134 +1117 1044 3.72529029846e-9 +1118 1044 -110632.33374 +1119 1044 .00882210349664 +1120 1044 -2.04890966415e-8 +1121 1044 -464866.096408 +1122 1044 192579.924088 +1123 1044 -5.58793544769e-9 +1124 1044 -121801.869096 +1150 1044 45937.5284672 +1151 1044 -129500.085535 +1152 1044 -30451.5560596 +1161 1044 -8829.80147696 +1162 1044 -518000.345646 +1163 1044 -116221.146907 +1172 1044 -45937.5328783 +1173 1044 -129500.0871 +1174 1044 -27659.3116492 +1217 1044 -45937.5328783 +1218 1044 129500.0871 +1219 1044 -27659.3116492 +1228 1044 -8829.80147696 +1229 1044 518000.345646 +1230 1044 -116221.146907 +1239 1044 45937.5284672 +1240 1044 129500.085535 +1241 1044 -30451.5560596 +1045 1045 1732020.21814 +1046 1045 -1.35973095894e-7 +1047 1045 -7.68341124058e-8 +1050 1045 431362.328716 +1051 1045 -47998.4246409 +1052 1045 -1.8160790205e-8 +1060 1045 -278691.361554 +1061 1045 538398.783833 +1062 1045 -1.86264514923e-9 +1072 1045 -1188171.23008 +1073 1045 5.58793544769e-8 +1074 1045 5.02914190292e-8 +1079 1045 -154323.26743 +1080 1045 562701.497265 +1081 1045 -3.0267983675e-9 +1089 1045 431362.328716 +1090 1045 47998.4246409 +1091 1045 -1.210719347e-8 +1092 1045 -278691.361554 +1093 1045 -538398.783833 +1094 1045 2.37487256527e-8 +1119 1045 -135135.811977 +1120 1045 1.76951289177e-8 +1121 1045 -192579.924088 +1122 1045 433004.221597 +1123 1045 -3.632158041e-8 +1124 1045 -.00655680848286 +1125 1045 -297043.0923 +1126 1045 -2.79396772385e-9 +1127 1045 205704.939408 +1140 1045 -69672.9115941 +1141 1045 134599.695958 +1142 1045 50352.4346941 +1150 1045 107840.373884 +1151 1045 -11999.6097904 +1152 1045 -6562.50766212 +1161 1045 -38580.9538854 +1162 1045 -140675.374316 +1163 1045 -50352.4314138 +1228 1045 -38580.9538854 +1229 1045 140675.374316 +1230 1045 -50352.4314138 +1239 1045 107840.373884 +1240 1045 11999.6097904 +1241 1045 -6562.50766212 +1242 1045 -69672.9115941 +1243 1045 -134599.695958 +1244 1045 50352.4346941 +1046 1046 5631826.15405 +1047 1046 -1.31316483021e-7 +1050 1046 -47998.4246409 +1051 1046 -2815909.359 +1052 1046 4.28408384323e-8 +1060 1046 538398.783833 +1061 1046 -445987.326051 +1062 1046 -1.53668224812e-8 +1072 1046 4.47034835815e-8 +1073 1046 891971.540819 +1074 1046 -3.84170562029e-8 +1079 1046 562701.497265 +1080 1046 -979774.476984 +1081 1046 -4.65661287308e-9 +1089 1046 47998.4246409 +1090 1046 -2815909.359 +1091 1046 4.65661287308e-8 +1092 1046 -538398.783833 +1093 1046 -445987.326051 +1094 1046 3.39932739735e-8 +1119 1046 1.02445483208e-8 +1120 1046 489886.722493 +1121 1046 6.51925802231e-9 +1122 1046 -3.16649675369e-8 +1123 1046 1407955.69599 +1124 1046 -2.79396772385e-9 +1125 1046 1.86264514923e-9 +1126 1046 222992.742752 +1127 1046 -1.30385160446e-8 +1140 1046 134599.695958 +1141 1046 -111496.902718 +1142 1046 -63000.0412075 +1150 1046 -11999.6097904 +1151 1046 -703977.760952 +1152 1046 -385000.257011 +1161 1046 -140675.374316 +1162 1046 -244943.756274 +1163 1046 -129500.087326 +1228 1046 140675.374316 +1229 1046 -244943.756274 +1230 1046 129500.087326 +1239 1046 11999.6097904 +1240 1046 -703977.760952 +1241 1046 385000.257011 +1242 1046 -134599.695958 +1243 1046 -111496.902718 +1244 1046 63000.0412075 +1047 1047 748924.735309 +1050 1047 -1.1408701539e-8 +1051 1047 2.70083546639e-8 +1052 1047 187224.845875 +1060 1047 3.49245965481e-9 +1061 1047 -1.53668224812e-8 +1062 1047 31645.8896132 +1072 1047 5.82076609135e-8 +1073 1047 -3.05008143187e-8 +1074 1047 126587.462786 +1079 1047 -7.45058059692e-9 +1080 1047 -2.79396772385e-9 +1081 1047 60899.7654835 +1089 1047 -2.44472175837e-8 +1090 1047 5.07570803165e-8 +1091 1047 187224.845875 +1092 1047 2.9569491744e-8 +1093 1047 3.18977981806e-8 +1094 1047 31645.8896132 +1119 1047 -192579.932918 +1120 1047 3.72529029846e-9 +1121 1047 -121801.869096 +1122 1047 .00655677122995 +1123 1047 -3.25962901115e-9 +1124 1047 -374451.322313 +1125 1047 205704.935113 +1126 1047 -1.32713466883e-8 +1127 1047 -63294.1754996 +1140 1047 50352.4325477 +1141 1047 -63000.0411343 +1142 1047 -15824.0319165 +1150 1047 -6562.50109771 +1151 1047 -385000.256899 +1152 1047 -93615.9995546 +1161 1047 -50352.4358261 +1162 1047 -129500.087176 +1163 1047 -30451.5839809 +1228 1047 -50352.4358261 +1229 1047 129500.087176 +1230 1047 -30451.5839809 +1239 1047 -6562.50109772 +1240 1047 385000.256899 +1241 1047 -93615.9995546 +1242 1047 50352.4325477 +1243 1047 63000.0411343 +1244 1047 -15824.0319165 +1048 1048 865951.700196 +1049 1048 -3.0379742384e-8 +1050 1048 434548.166296 +1051 1048 46360.5270536 +1052 1048 -1.93510204554e-8 +1053 1048 -3133.98761478 +1054 1048 -46360.7635322 +1058 1048 -557679.138131 +1059 1048 1.00491568446e-8 +1060 1048 -315729.068649 +1061 1048 -538657.566102 +1062 1048 1.9864924252e-8 +1063 1048 538655.492471 +1138 1048 -139419.927003 +1139 1048 102888.86964 +1140 1048 -78932.3383675 +1141 1048 -134664.386712 +1142 1048 50388.8346629 +1143 1048 134663.881575 +1148 1048 216487.506679 +1149 1048 223.995963976 +1150 1048 108636.83352 +1151 1048 11590.149338 +1152 1048 -6338.50750891 +1153 1048 -783.494995224 +1154 1048 -11590.1626512 +1159 1048 -67572.4404121 +1160 1048 -96214.3623491 +1161 1048 -28916.9951293 +1162 1048 140532.78222 +1163 1048 -50276.8313041 +1164 1048 -9499.97721747 +1165 1048 -140532.207359 +1049 1049 374460.402373 +1050 1049 -2.21189111471e-8 +1051 1049 2.14204192162e-8 +1052 1049 187223.8496 +1053 1049 -3.1478703022e-9 +1054 1049 -4.65661287308e-8 +1058 1049 2.28174030781e-8 +1059 1049 63293.5180843 +1060 1049 2.37487256527e-8 +1061 1049 2.46800482273e-8 +1062 1049 31645.6681688 +1063 1049 -3.0966475606e-8 +1138 1049 98556.5817522 +1139 1049 -31646.9790189 +1140 1049 54647.6355384 +1141 1049 63000.0447796 +1142 1049 -15824.0349462 +1143 1049 -62999.7926699 +1148 1049 -223.99596399 +1149 1049 -187224.669433 +1150 1049 19687.5164295 +1151 1049 385000.257122 +1152 1049 -93615.5105096 +1153 1049 -26025.9133 +1154 1049 -384998.717456 +1159 1049 -96364.8662621 +1160 1049 -60900.7113514 +1161 1049 -41522.6300342 +1162 1049 129500.0842 +1163 1049 -30451.419283 +1164 1049 -8754.17065987 +1165 1049 -129499.565974 +1050 1050 1738559.48927 +1051 1050 191994.392456 +1052 1050 -8.10250639916e-8 +1053 1050 -9734.12608842 +1054 1050 -143995.948053 +1058 1050 -242498.818309 +1059 1050 1.62981450558e-9 +1060 1050 -1187132.5409 +1061 1050 30407.6331939 +1062 1050 5.12227416039e-8 +1063 1050 523194.305331 +1072 1050 -315916.527516 +1073 1050 -553601.944985 +1074 1050 2.30502337217e-8 +1119 1050 -29273.8425731 +1120 1050 132324.807888 +1121 1050 -45937.5284672 +1122 1050 107840.373884 +1123 1050 -11999.6097904 +1124 1050 6562.50109771 +1125 1050 -78979.2030845 +1126 1050 -138400.486246 +1127 1050 52500.0361274 +1138 1050 -60624.7757827 +1139 1050 48204.4833749 +1140 1050 -296783.41984 +1141 1050 7601.91314343 +1142 1050 205704.589289 +1143 1050 130798.576333 +1148 1050 108636.83352 +1149 1050 -19687.5164296 +1150 1050 434639.039371 +1151 1050 47998.5977878 +1152 1050 -.00653399759904 +1153 1050 -2433.53225658 +1154 1050 -35998.9978784 +1159 1050 -38382.7789096 +1160 1050 -54766.9844821 +1161 1050 -134566.226008 +1162 1050 16700.8522442 +1163 1050 -192579.573976 +1164 1050 -10074.1342047 +1165 1050 -149025.653916 +1051 1051 5631840.98232 +1052 1051 -1.25728547573e-7 +1053 1051 -190356.475107 +1054 1051 -2815924.18798 +1058 1051 523194.305331 +1059 1051 -1.32713466883e-8 +1060 1051 30407.6331939 +1061 1051 891973.080646 +1062 1051 -2.63098627329e-8 +1063 1051 -445988.791197 +1072 1051 -553601.944985 +1073 1051 -445987.400502 +1074 1051 4.00468707085e-8 +1119 1051 132324.807888 +1120 1051 -244943.73766 +1121 1051 129500.085535 +1122 1051 -11999.6097904 +1123 1051 -703977.760952 +1124 1051 385000.256899 +1125 1051 -138400.486246 +1126 1051 -111496.921331 +1127 1051 63000.0428869 +1138 1051 130798.576333 +1139 1051 -63000.0395339 +1140 1051 7601.91314343 +1141 1051 222993.127544 +1142 1051 -.00349915586412 +1143 1051 -111497.269005 +1148 1051 11590.149338 +1149 1051 -385000.257122 +1150 1051 47998.5977878 +1151 1051 1407959.40307 +1152 1051 .000669699162245 +1153 1051 -47589.1472164 +1154 1051 -703981.467699 +1159 1051 -132467.396209 +1160 1051 -129500.089111 +1161 1051 16700.8522441 +1162 1051 489887.588031 +1163 1051 .00327597884461 +1164 1051 -16558.2577069 +1165 1051 -244944.640635 +1052 1052 748922.770023 +1053 1052 1.88872218132e-9 +1054 1052 2.79396772385e-8 +1058 1052 7.21774995327e-9 +1059 1052 31645.8356908 +1060 1052 5.40167093277e-8 +1061 1052 -2.00234353542e-8 +1062 1052 126587.249477 +1063 1052 -2.02562659979e-8 +1072 1052 2.23517417908e-8 +1073 1052 2.58442014456e-8 +1074 1052 31645.8337756 +1119 1052 -45937.5328796 +1120 1052 129500.085685 +1121 1052 -30451.5560596 +1122 1052 6562.50766211 +1123 1052 385000.257011 +1124 1052 -93615.9995546 +1125 1052 52500.0339811 +1126 1052 63000.04296 +1127 1052 -15824.0598354 +1138 1052 48204.4812381 +1139 1052 -15823.9511852 +1140 1052 205704.584994 +1141 1052 -.00349915307015 +1142 1052 -63294.0667688 +1143 1052 -63000.0393148 +1148 1052 6338.5075089 +1149 1052 -93615.5105096 +1150 1052 .00653395988047 +1151 1052 -.000669701956212 +1152 1052 -374450.330591 +1153 1052 -26026.0173588 +1154 1052 -385000.256788 +1159 1052 -46012.7828802 +1160 1052 -30451.5030446 +1161 1052 -192579.582806 +1162 1052 .003275974188 +1163 1052 -121801.6459 +1164 1052 -8754.20599346 +1165 1052 -129500.088661 +1053 1053 95019839.6514 +1054 1053 -5825057.68941 +1055 1053 -2.38418579102e-7 +1056 1053 -2.98023223877e-8 +1057 1053 1069.37560319 +1058 1053 13437078.567 +1059 1053 6.61052763462e-10 +1060 1053 -38451.3142277 +1061 1053 -30148.8573842 +1062 1053 2.48681753874e-9 +1063 1053 -1173135.73206 +1064 1053 -1.19209289551e-7 +1066 1053 9.31322574615e-10 +1067 1053 3199.58994701 +1138 1053 -15620608.0643 +1139 1053 4258.78562987 +1140 1053 -9612.82855692 +1141 1053 -7537.21915954 +1142 1053 4258.80301229 +1143 1053 1214226.78384 +1144 1053 51131283.9922 +1145 1053 -2759415.04091 +1146 1053 188146.115539 +1147 1053 -549.163788417 +1148 1053 -783.494995224 +1149 1053 26025.9133 +1150 1053 -2433.53225658 +1151 1053 -47589.1472164 +1152 1053 26026.0173588 +1153 1053 -34306895.0629 +1154 1053 2155868.06755 +1155 1053 .571871310472 +1156 1053 4482459.4665 +1157 1053 -305625.485774 +1158 1053 267.299544403 +1159 1053 8954.7612803 +1160 1053 8754.17099186 +1161 1053 8380.67811227 +1162 1053 -16558.2539321 +1163 1053 8754.20566147 +1164 1053 -27463048.6159 +1165 1053 1954248.43917 +1166 1053 -51131291.8077 +1167 1053 -1263758.79445 +1168 1053 86164.4408314 +1169 1053 816.463332821 +1054 1054 10007092.789 +1055 1054 1.49011611938e-8 +1056 1054 -2.38418579102e-7 +1057 1054 15682.7949399 +1058 1054 -1726476.6004 +1059 1054 9.77888703346e-9 +1060 1054 -568806.423487 +1061 1054 -445989.01456 +1062 1054 3.67872416973e-8 +1063 1054 -3647302.50439 +1064 1054 7.45058059692e-9 +1065 1054 -2.38418579102e-7 +1066 1054 2.98023223877e-8 +1067 1054 46926.2764167 +1138 1054 1075891.57521 +1139 1054 62999.7874241 +1140 1054 -142201.605872 +1141 1054 -111497.324845 +1142 1054 63000.0445605 +1143 1054 2115175.41558 +1144 1054 -3486301.3802 +1145 1054 -40470521.2551 +1146 1054 2759415.04091 +1147 1054 -8054.22324738 +1148 1054 -11590.1626512 +1149 1054 384998.717456 +1150 1054 -35998.9978784 +1151 1054 -703981.467699 +1152 1054 385000.256788 +1153 1054 2155868.06755 +1154 1054 -2828366.30382 +1155 1054 8.38739082776 +1156 1054 65742039.8791 +1157 1054 -4482459.4665 +1158 1054 3920.7017593 +1159 1054 132466.882845 +1160 1054 129499.570885 +1161 1054 123974.528288 +1162 1054 -244944.584794 +1163 1054 129500.08375 +1164 1054 1954248.43917 +1165 1054 1068426.10716 +1166 1054 3486186.75252 +1167 1054 -18535329.3672 +1168 1054 1263758.79445 +1169 1054 11974.9250067 +1055 1055 11437856286.3 +1058 1055 3.27825546265e-7 +1063 1055 -2.23517417908e-8 +1064 1055 1723839428.81 +1138 1055 51131283.9922 +1143 1055 -3486301.3802 +1144 1055 -980810342.222 +1153 1055 -.571871221065 +1154 1055 -8.38739083428 +1155 1055 -5542198822.7 +1164 1055 -51131291.8077 +1165 1055 3486186.75252 +1166 1055 -1922836059.47 +1056 1056 2624457675.93 +1057 1056 5.58793544769e-9 +1058 1056 -2.98023223877e-8 +1063 1056 -2.38418579102e-7 +1065 1056 -1570235354.2 +1066 1056 107063880.567 +1067 1056 -4.65661287308e-10 +1138 1056 2759415.04091 +1143 1056 40470521.2551 +1145 1056 -793849008.447 +1146 1056 54127271.5593 +1147 1056 -266308.770792 +1153 1056 -4482459.4665 +1154 1056 -65742039.8791 +1156 1056 1252626923.21 +1157 1056 -85407310.3125 +1158 1056 .00297848985065 +1164 1056 1263758.79445 +1165 1056 18535329.3672 +1167 1056 -371207454.429 +1168 1056 25309325.5483 +1169 1056 266308.811499 +1057 1057 2041845.55752 +1058 1057 -3199.58994701 +1063 1057 -46926.2764167 +1065 1057 -4.7730281949e-9 +1066 1057 3.27418092638e-10 +1067 1057 318204.878919 +1138 1057 549.163788417 +1143 1057 8054.22324738 +1145 1057 -266308.770792 +1146 1057 18157.8196885 +1147 1057 -66219.1364756 +1153 1057 267.299544403 +1154 1057 3920.7017593 +1156 1057 -.00297849369235 +1157 1057 -.0436843274074 +1158 1057 -744783.215535 +1164 1057 -816.463332821 +1165 1057 -11974.9250067 +1167 1057 266308.811499 +1168 1057 -18157.2226694 +1169 1057 -184697.186945 +1058 1058 42955083.9264 +1059 1058 -1.02445483208e-8 +1060 1058 -4750442.03273 +1061 1058 500862.367809 +1062 1058 -1.83936208487e-8 +1063 1058 -2735760.01534 +1064 1058 2.38418579102e-7 +1067 1058 -59433.564306 +1070 1058 -4.76837158203e-7 +1071 1058 -56233.974359 +1136 1058 49177864.0697 +1137 1058 5773.23717949 +1138 1058 -12198064.757 +1139 1058 -96408.5799114 +1140 1058 2597946.27194 +1141 1058 125215.588245 +1142 1058 -46056.6716788 +1143 1058 387184.231513 +1144 1058 3741313.46284 +1145 1058 2909730.02681 +1146 1058 -51217666.9529 +1147 1058 6322.4009679 +1148 1058 -139419.927003 +1149 1058 -98556.5817522 +1150 1058 -60624.7757827 +1151 1058 130798.576333 +1152 1058 -48204.4812381 +1153 1058 -15620608.0643 +1154 1058 1075891.57521 +1155 1058 -51131283.9922 +1156 1058 -2759415.04091 +1157 1058 188146.115539 +1158 1058 549.163788417 +1059 1059 127911.420342 +1060 1059 -3.25962901115e-9 +1061 1059 -3.72529029846e-9 +1062 1059 63953.7755238 +1063 1059 -5.58793544769e-9 +1138 1059 96408.5799114 +1139 1059 -63953.5848618 +1140 1059 58942.9802793 +1141 1059 126000.081471 +1142 1059 -31977.7597544 +1143 1059 -125999.577581 +1148 1059 -102888.86964 +1149 1059 -31646.9790189 +1150 1059 -48204.4833749 +1151 1059 63000.0395338 +1152 1059 -15823.9511852 +1153 1059 -4258.78562987 +1154 1059 -62999.7874241 +1060 1060 11696562.4893 +1061 1060 60180.2473303 +1062 1060 -5.16884028912e-8 +1063 1060 -591133.993006 +1067 1060 56233.974359 +1072 1060 -4748390.35692 +1073 1060 530953.752405 +1074 1060 -2.21189111471e-8 +1077 1060 -4.76837158203e-7 +1078 1060 -56233.974359 +1122 1060 -69672.9115941 +1123 1060 134599.695958 +1124 1060 -50352.4325477 +1125 1060 2598459.19106 +1126 1060 132738.436863 +1127 1060 -50352.2246647 +1131 1060 49177864.0697 +1132 1060 5773.23717949 +1136 1060 -102038543.721 +1138 1060 2597946.27194 +1139 1060 -58942.9802793 +1140 1060 -4930266.87181 +1141 1060 15045.0617314 +1142 1060 -209999.302447 +1143 1060 -147783.501959 +1146 1060 49177864.0697 +1147 1060 -5773.23717949 +1148 1060 -78932.3383675 +1149 1060 -54647.6355384 +1150 1060 -296783.41984 +1151 1060 7601.91314346 +1152 1060 -205704.584994 +1153 1060 -9612.82855692 +1154 1060 -142201.605872 +1061 1061 1765325.24996 +1062 1061 -5.63450157642e-8 +1063 1061 -882661.172868 +1072 1061 -561042.608409 +1073 1061 -882659.669918 +1074 1061 4.00468707085e-8 +1122 1061 134599.695958 +1123 1061 -111496.902718 +1124 1061 63000.0411343 +1125 1061 -140260.653341 +1126 1061 -220665.061356 +1127 1061 126000.084971 +1138 1061 125215.588245 +1139 1061 -126000.081471 +1140 1061 15045.0617314 +1141 1061 441331.024698 +1142 1061 -.00335299223661 +1143 1061 -220665.436925 +1148 1061 -134664.386712 +1149 1061 -63000.0447796 +1150 1061 7601.91314345 +1151 1061 222993.127544 +1152 1061 .0034991579596 +1153 1061 -7537.21915954 +1154 1061 -111497.324845 +1062 1062 255823.276853 +1063 1062 3.44589352608e-8 +1073 1062 -1.39698386192e-9 +1074 1062 63953.885801 +1122 1062 -50352.4346941 +1123 1062 63000.0412075 +1124 1062 -15824.0319165 +1125 1062 54647.4275314 +1126 1062 126000.083218 +1127 1062 -31977.8123084 +1138 1062 46056.6716788 +1139 1062 -31977.7597544 +1140 1062 209999.302447 +1141 1062 .00335299177095 +1142 1062 -127907.167024 +1143 1062 -126000.086717 +1148 1062 -50388.8346629 +1149 1062 -15824.0349462 +1150 1062 -205704.589289 +1151 1062 .00349914841354 +1152 1062 -63294.0667687 +1153 1062 -4258.80301229 +1154 1062 -63000.0445605 +1063 1063 40891386.768 +1064 1063 -4.76837158203e-7 +1067 1063 -46926.2764167 +1068 1063 6853846.15385 +1069 1063 5.96046447754e-8 +1133 1063 -14151923.0769 +1134 1063 5.125e7 +1138 1063 387184.231513 +1139 1063 125999.577581 +1140 1063 -147783.501959 +1141 1063 -220665.436925 +1142 1063 126000.086717 +1143 1063 -9015729.85944 +1144 1063 -4005095.22294 +1145 1063 42675092.0579 +1146 1063 -2909730.02681 +1147 1063 8054.22324738 +1148 1063 134663.881575 +1149 1063 62999.7926699 +1150 1063 130798.576333 +1151 1063 -111497.269005 +1152 1063 63000.0393147 +1153 1063 1214226.78384 +1154 1063 2115175.41558 +1155 1063 3486301.3802 +1156 1063 -40470521.2551 +1157 1063 2759415.04091 +1158 1063 8054.22324738 +1064 1064 7011453305.17 +1068 1064 2.38418579102e-7 +1069 1064 1389051282.05 +1133 1064 5.125e7 +1134 1064 -837525641.026 +1138 1064 -3741313.46284 +1143 1064 4005095.22294 +1144 1064 -3243836024.77 +1153 1064 -51131283.9922 +1154 1064 3486301.3802 +1155 1064 -980810342.222 +1065 1065 1684873035.94 +1066 1065 -114880259.834 +1067 1065 -3.72529029846e-9 +1138 1065 -2909730.02681 +1143 1065 -42675092.0579 +1145 1065 822508428.883 +1146 1065 -56081366.376 +1147 1065 19486.007619 +1153 1065 2759415.04091 +1154 1065 40470521.2551 +1156 1065 -793849008.447 +1157 1065 54127271.5593 +1158 1065 266308.770792 +1066 1066 2015281236.36 +1067 1066 9.31322574615e-9 +1070 1066 -1911695112.18 +1071 1066 -2.32830643654e-10 +1136 1066 -962833934.294 +1137 1066 -266927.083333 +1138 1066 51217666.9529 +1140 1066 -49177864.0697 +1143 1066 2909730.02681 +1145 1066 -56081366.376 +1146 1066 990596050.074 +1147 1066 -20859.8709528 +1153 1066 -188146.115539 +1154 1066 -2759415.04091 +1156 1066 54127271.5593 +1157 1066 -3690577.79915 +1158 1066 -18157.8196885 +1067 1067 1548743.93042 +1070 1067 -6.17001205683e-9 +1071 1067 310550.213675 +1136 1067 -266927.083333 +1137 1067 -43556.3568376 +1138 1067 6322.4009679 +1140 1067 -5773.23717949 +1143 1067 8054.22324738 +1145 1067 -19486.007619 +1146 1067 20859.8709528 +1147 1067 -365167.859242 +1153 1067 -549.163788417 +1154 1067 -8054.22324738 +1156 1067 266308.770792 +1157 1067 -18157.8196885 +1158 1067 -66219.1364756 +1068 1068 70907692.3077 +1069 1068 -2.38418579102e-7 +1075 1068 6853846.15385 +1076 1068 5.96046447754e-8 +1128 1068 -14151923.0769 +1129 1068 5.125e7 +1133 1068 -14003846.1539 +1134 1068 5.96046447754e-8 +1143 1068 -14151923.0769 +1144 1068 -5.125e7 +1069 1069 6414205128.2 +1075 1069 2.38418579102e-7 +1076 1069 1389051282.05 +1128 1069 5.125e7 +1129 1069 -837525641.026 +1133 1069 5.96046447754e-8 +1134 1069 -2921102564.1 +1143 1069 -5.125e7 +1144 1069 -837525641.026 +1070 1070 4014896634.61 +1071 1070 5.58793544769e-9 +1077 1070 -1911695112.18 +1078 1070 -2.32830643654e-10 +1125 1070 -49177864.0697 +1131 1070 -962833934.294 +1132 1070 -266927.083333 +1136 1070 1973544471.15 +1137 1070 -2.91038304567e-9 +1138 1070 -49177864.0697 +1140 1070 102038543.721 +1146 1070 -962833934.294 +1147 1070 266927.083333 +1071 1071 1506623.93162 +1072 1071 56233.974359 +1077 1071 -6.17001205683e-9 +1078 1071 310550.213675 +1125 1071 -5773.23717949 +1131 1071 -266927.083333 +1132 1071 -43556.3568376 +1136 1071 -2.09547579288e-9 +1137 1071 -306436.965812 +1138 1071 5773.23717949 +1146 1071 266927.083333 +1147 1071 -43556.3568376 +1072 1072 11694510.8133 +1073 1072 -1.09896063805e-7 +1074 1072 -5.30853867531e-8 +1089 1072 -315916.527516 +1090 1072 553601.944985 +1091 1072 -6.98491930962e-10 +1092 1072 -4748390.35692 +1093 1072 561042.608409 +1094 1072 -2.53785401583e-8 +1101 1072 -4.76837158203e-7 +1102 1072 -56233.974359 +1122 1072 -297043.0923 +1123 1072 2.98023223877e-8 +1124 1072 -205704.935113 +1125 1072 -4930779.79082 +1126 1072 -1.11758708954e-8 +1127 1072 -209999.302333 +1131 1072 -102038543.721 +1136 1072 49177864.0697 +1137 1072 -5773.23717949 +1140 1072 2598459.19106 +1141 1072 -140260.653341 +1142 1072 -54647.4275314 +1150 1072 -78979.2030845 +1151 1072 -138400.486246 +1152 1072 -52500.0339811 +1239 1072 -78979.2030845 +1240 1072 138400.486246 +1241 1072 -52500.0339811 +1242 1072 2598459.19106 +1243 1072 140260.653341 +1244 1072 -54647.4275314 +1263 1072 49177864.0697 +1264 1072 5773.23717949 +1073 1073 1765323.74724 +1074 1073 -6.14672899246e-8 +1089 1073 553601.944985 +1090 1073 -445987.400502 +1091 1073 -1.72294676304e-8 +1092 1073 -530953.752405 +1093 1073 -882659.669918 +1094 1073 4.33064997196e-8 +1122 1073 2.04890966415e-8 +1123 1073 222992.742752 +1124 1073 1.51339918375e-8 +1125 1073 -3.44589352608e-8 +1126 1073 441330.649014 +1127 1073 1.39698386192e-8 +1140 1073 132738.436863 +1141 1073 -220665.061356 +1142 1073 -126000.083218 +1150 1073 -138400.486246 +1151 1073 -111496.921331 +1152 1073 -63000.04296 +1239 1073 138400.486246 +1240 1073 -111496.921331 +1241 1073 63000.04296 +1242 1073 -132738.436863 +1243 1073 -220665.061356 +1244 1073 126000.083218 +1074 1074 255823.489653 +1089 1074 -2.79396772385e-9 +1090 1074 -9.54605638981e-9 +1091 1074 31645.8337756 +1092 1074 2.56113708019e-9 +1093 1074 -4.65661287308e-10 +1094 1074 63953.885801 +1122 1074 -205704.939408 +1123 1074 3.49245965481e-9 +1124 1074 -63294.1754996 +1125 1074 209999.302333 +1126 1074 -1.58324837685e-8 +1127 1074 -127907.276009 +1140 1074 50352.2246647 +1141 1074 -126000.084971 +1142 1074 -31977.8123084 +1150 1074 -52500.0361274 +1151 1074 -63000.0428868 +1152 1074 -15824.0598353 +1239 1074 -52500.0361274 +1240 1074 63000.0428868 +1241 1074 -15824.0598354 +1242 1074 50352.2246647 +1243 1074 126000.084971 +1244 1074 -31977.8123084 +1075 1075 70907692.3077 +1076 1075 -2.38418579102e-7 +1099 1075 6853846.15385 +1100 1075 5.96046447754e-8 +1128 1075 -14003846.1539 +1129 1075 5.96046447754e-8 +1133 1075 -14151923.0769 +1134 1075 -5.125e7 +1260 1075 -14151923.0769 +1261 1075 5.125e7 +1076 1076 6414205128.2 +1099 1076 2.38418579102e-7 +1100 1076 1389051282.05 +1128 1076 5.96046447754e-8 +1129 1076 -2921102564.1 +1133 1076 -5.125e7 +1134 1076 -837525641.026 +1260 1076 5.125e7 +1261 1076 -837525641.026 +1077 1077 4014896634.61 +1078 1077 5.58793544769e-9 +1101 1077 -1911695112.18 +1102 1077 -2.32830643654e-10 +1125 1077 102038543.721 +1131 1077 1973544471.15 +1132 1077 -2.91038304567e-9 +1136 1077 -962833934.294 +1137 1077 266927.083333 +1140 1077 -49177864.0697 +1242 1077 -49177864.0697 +1263 1077 -962833934.294 +1264 1077 -266927.083333 +1078 1078 1506623.93162 +1092 1078 56233.974359 +1101 1078 -6.17001205683e-9 +1102 1078 310550.213675 +1131 1078 -2.09547579288e-9 +1132 1078 -306436.965812 +1136 1078 266927.083333 +1137 1078 -43556.3568376 +1140 1078 5773.23717949 +1242 1078 -5773.23717949 +1263 1078 -266927.083333 +1264 1078 -43556.3568376 +1079 1079 1045720.97408 +1080 1079 -280080.969386 +1081 1079 -2.46800482273e-8 +1082 1079 261298.14512 +1083 1079 -1.53668224812e-8 +1084 1079 -14200.1375062 +1085 1079 210061.205714 +1089 1079 -538265.241304 +1090 1079 -66806.8133053 +1091 1079 1.72294676304e-8 +1095 1079 -115664.67162 +1096 1079 1.16415321827e-8 +1103 1079 33522.4797952 +1104 1079 -495894.671527 +1116 1079 -26181.1339249 +1117 1079 -131902.59589 +1118 1079 -41522.6255193 +1119 1079 64161.4143731 +1120 1079 17504.939443 +1121 1079 8829.80147696 +1122 1079 -38580.9538854 +1123 1079 140675.374316 +1124 1079 50352.4358261 +1217 1079 -122080.295339 +1218 1079 -18389.5648524 +1219 1079 -174920.662203 +1220 1079 -35262.2677262 +1221 1079 -50352.4315243 +1222 1079 -10159.7496845 +1223 1079 150292.155096 +1228 1079 261429.197556 +1229 1079 -70020.2423466 +1230 1079 -.00879156962037 +1231 1079 65324.2750074 +1232 1079 -26489.7721063 +1233 1079 -3550.03527816 +1234 1079 52515.3147657 +1239 1079 -134566.858043 +1240 1079 -16701.7126509 +1241 1079 192580.632807 +1245 1079 -28916.3049341 +1246 1079 41522.6300347 +1249 1079 8380.61994881 +1250 1079 -123973.667882 +1080 1080 8215418.15617 +1081 1080 -2.27242708206e-7 +1082 1080 -67619.3398655 +1083 1080 5.40167093277e-8 +1084 1080 277680.545579 +1085 1080 -4107700.37839 +1089 1080 -66806.8133053 +1090 1080 1959541.07778 +1091 1080 -4.70317900181e-8 +1095 1080 -562126.949045 +1096 1080 3.53902578354e-8 +1103 1080 66232.2775184 +1104 1080 -979767.418912 +1116 1080 -131902.59589 +1117 1080 -269712.856857 +1118 1080 -129500.08561 +1119 1080 17504.939443 +1120 1080 -1026928.49556 +1121 1080 -518000.345646 +1122 1080 140675.374316 +1123 1080 -244943.756274 +1124 1080 -129500.087176 +1217 1080 -18389.5648524 +1218 1080 539423.915505 +1219 1080 -.00297558261082 +1220 1080 132059.638893 +1221 1080 129500.088886 +1222 1080 18232.5162033 +1223 1080 -269711.778155 +1228 1080 -70020.2423466 +1229 1080 2053853.49308 +1230 1080 -.000901471823454 +1231 1080 -16904.8569365 +1232 1080 518000.345947 +1233 1080 69420.1717023 +1234 1080 -1026925.6169 +1239 1080 -16701.7126509 +1240 1080 489884.994991 +1241 1080 .00327619444579 +1245 1080 -140531.746524 +1246 1080 129500.0842 +1249 1080 16558.0786428 +1250 1080 -244941.991757 +1081 1081 929761.288762 +1082 1081 -9.75169241428e-9 +1083 1081 232431.391313 +1084 1081 -4.21814620495e-9 +1085 1081 6.23986124992e-8 +1089 1081 1.62981450558e-8 +1090 1081 -5.49480319023e-8 +1091 1081 243608.884699 +1095 1081 1.8067471683e-8 +1096 1081 60900.3162667 +1103 1081 -2.23498791456e-9 +1104 1081 3.30619513988e-8 +1116 1081 -41522.6299317 +1117 1081 -129500.08576 +1118 1081 -27659.2837279 +1119 1081 8829.81030933 +1120 1081 -518000.345796 +1121 1081 -116221.146907 +1122 1081 50352.4314138 +1123 1081 -129500.087326 +1124 1081 -30451.5839809 +1217 1081 -174920.671033 +1218 1081 -.00297558121383 +1219 1081 -110632.553125 +1220 1081 -41598.2299375 +1221 1081 -27659.4522378 +1222 1081 -8754.20597824 +1223 1081 129500.088435 +1228 1081 .00879155052826 +1229 1081 .000901445746422 +1230 1081 -464866.753585 +1231 1081 8527.06010246 +1232 1081 -116221.485887 +1233 1081 -35016.8233555 +1234 1081 518000.345496 +1239 1081 192580.623976 +1240 1081 .00327619025484 +1241 1081 -121802.310014 +1245 1081 50276.8313036 +1246 1081 -30451.7513255 +1249 1081 -8754.20566145 +1250 1081 129500.083749 +1082 1082 518014.630513 +1083 1082 -1.79752707481e-8 +1084 1082 -4571.07962245 +1085 1082 67619.5210421 +1089 1082 -153536.660819 +1090 1082 529873.764672 +1091 1082 -6.6451728344e-9 +1095 1082 -270291.7014 +1096 1082 1.96695327759e-8 +1103 1082 35819.3207722 +1104 1082 -529871.609056 +1217 1082 -25796.4839459 +1218 1082 -140940.539537 +1219 1082 -45862.2783615 +1220 1082 -61358.9884017 +1221 1082 -87385.2564527 +1222 1082 -9527.54180266 +1223 1082 140939.967495 +1228 1082 65324.2750074 +1229 1082 -16904.8569366 +1230 1082 -8527.06010246 +1231 1082 129503.132254 +1232 1082 303.094563698 +1233 1082 -1142.7675157 +1234 1082 16904.8449068 +1239 1082 -38384.3022338 +1240 1082 132468.431905 +1241 1082 46013.8328814 +1245 1082 -67573.2006234 +1246 1082 96366.9662598 +1249 1082 8954.83129336 +1250 1082 -132467.918541 +1083 1083 464881.315426 +1084 1083 6.79939985275e-9 +1085 1083 -1.00582838059e-7 +1089 1083 -2.32830643654e-10 +1090 1083 -9.31322574615e-9 +1091 1083 60900.1487302 +1095 1083 -2.83308327198e-10 +1096 1083 121804.886905 +1103 1083 2.83308327198e-10 +1104 1083 -4.19095158577e-9 +1217 1083 -37108.0770763 +1218 1083 -129500.084425 +1219 1083 -27659.3684761 +1220 1083 -87535.7603657 +1221 1083 -55316.386255 +1222 1083 -8754.17067509 +1223 1083 129499.5662 +1228 1083 26489.7721063 +1229 1083 -518000.345947 +1230 1083 -116221.485887 +1231 1083 -303.094563708 +1232 1083 -232433.705374 +1233 1083 -35016.6833491 +1234 1083 517998.274396 +1239 1083 54768.0344823 +1240 1083 -129500.089111 +1241 1083 -30451.8350938 +1245 1083 96214.3623527 +1246 1083 -60901.3754654 +1249 1083 -8754.17099187 +1250 1083 129499.570886 +1084 1084 115672212.256 +1085 1084 7283804.37176 +1087 1084 7.45058059692e-9 +1088 1084 -.251788226677 +1089 1084 -40296.7694729 +1090 1084 66232.2926191 +1091 1084 1.25914812088e-10 +1095 1084 -37999.6332189 +1096 1084 3.1478703022e-9 +1103 1084 46297130.4962 +1104 1084 3220775.62319 +1105 1084 -4.47034835815e-7 +1107 1084 -2130.46613205 +1217 1084 8295.06263252 +1218 1084 18232.5124284 +1219 1084 8754.20567669 +1220 1084 8927.1966951 +1221 1084 8754.17097664 +1222 1084 -27462935.4358 +1223 1084 -1955922.70006 +1224 1084 -51131291.8077 +1225 1084 1263758.79445 +1226 1084 86164.4408314 +1227 1084 -816.463332821 +1228 1084 -3550.03527816 +1229 1084 69420.1717023 +1230 1084 35016.8233555 +1231 1084 -1142.7675157 +1232 1084 35016.6833491 +1233 1084 -49186373.3679 +1234 1084 -3261366.33219 +1235 1084 2.0588221848 +1236 1084 -3145643.53872 +1237 1084 -214486.130523 +1238 1084 .0967358672315 +1239 1084 -10074.1923682 +1240 1084 16558.0824179 +1241 1084 8754.20599347 +1245 1084 -9499.90720441 +1246 1084 8754.17065986 +1249 1084 -27463030.8839 +1250 1084 -1954477.44277 +1251 1084 51131263.6705 +1252 1084 1263906.88098 +1253 1084 86184.7854247 +1254 1084 816.560068688 +1085 1085 9380338.49747 +1087 1085 -1.19209289551e-7 +1088 1085 -.022544613923 +1089 1085 596106.057291 +1090 1085 -979767.642294 +1091 1085 -1.86264514923e-9 +1095 1085 562124.751759 +1096 1085 -4.65661287308e-8 +1103 1085 3220775.62319 +1104 1085 -707678.927545 +1105 1085 -2.98023223877e-8 +1107 1085 31243.4589322 +1217 1085 -122708.027108 +1218 1085 -269711.722314 +1219 1085 -129500.083975 +1220 1085 -132059.122709 +1221 1085 -129499.57066 +1222 1085 -1955922.70006 +1223 1085 1093193.28007 +1224 1085 -3486186.75252 +1225 1085 -18535329.3672 +1226 1085 -1263758.79445 +1227 1085 11974.9250067 +1228 1085 52515.3147657 +1229 1085 -1026925.6169 +1230 1085 -518000.345496 +1231 1085 16904.8449068 +1232 1085 -517998.274396 +1233 1085 -3261366.33219 +1234 1085 -1568850.86985 +1235 1085 -30.194589261 +1236 1085 46133860.8866 +1237 1085 3145643.53872 +1238 1085 .00525184947765 +1239 1085 149026.514323 +1240 1085 -244942.047602 +1241 1085 -129500.088661 +1245 1085 140531.171663 +1246 1085 -129499.565974 +1249 1085 -1954477.44277 +1250 1085 1068391.56416 +1251 1085 3486599.41191 +1252 1085 -18535297.1051 +1253 1085 -1263906.88098 +1254 1085 -11974.9197548 +1086 1086 15267015227.5 +1103 1086 5.96046447754e-8 +1104 1086 3.72529029846e-9 +1105 1086 3729996849.91 +1222 1086 -51131291.8077 +1223 1086 -3486186.75252 +1224 1086 -1922836059.47 +1233 1086 -2.05882242322 +1234 1086 30.1945892442 +1235 1086 -7517830260.3 +1249 1086 51131263.6705 +1250 1086 3486599.41191 +1251 1086 -1922837085.77 +1087 1087 1879167901.72 +1088 1087 -1.86264514923e-9 +1103 1087 -7.45058059692e-9 +1104 1087 1.19209289551e-7 +1106 1087 -703939231.802 +1107 1087 5.47152012587e-9 +1222 1087 -1263758.79445 +1223 1087 18535329.3672 +1225 1087 -371207454.429 +1226 1087 -25309325.5483 +1227 1087 266308.811499 +1233 1087 3145643.53872 +1234 1087 -46133860.8866 +1236 1087 860236321.812 +1237 1087 58655329.8482 +1238 1087 .0107230338035 +1249 1087 -1263906.88098 +1250 1087 18535297.1051 +1252 1087 -371206819.998 +1253 1087 -25312292.0771 +1254 1087 -266308.66495 +1088 1088 2492827.7391 +1103 1088 2130.46613205 +1104 1088 -31243.4589322 +1106 1088 -4.65661287308e-10 +1107 1088 459767.517846 +1222 1088 816.463332821 +1223 1088 -11974.9250067 +1225 1088 266308.811499 +1226 1088 18157.2226694 +1227 1088 -184697.186945 +1233 1088 .0967358672387 +1234 1088 .00525184936123 +1236 1088 -.010723029729 +1237 1088 .157263485897 +1238 1088 -1065668.00477 +1249 1088 -816.560068688 +1250 1088 11974.9197548 +1252 1088 -266308.66495 +1253 1088 -18159.371937 +1254 1088 -184697.30516 +1089 1089 1738577.43347 +1090 1089 -191992.371108 +1091 1089 -5.40167093277e-8 +1092 1089 -1187139.04241 +1093 1089 -30403.6805426 +1094 1089 5.58793544769e-8 +1095 1089 434557.139589 +1096 1089 -1.79279595613e-8 +1097 1089 -242510.516843 +1098 1089 1.62981450558e-8 +1103 1089 -9733.98944519 +1104 1089 143993.926704 +1108 1089 -523198.257983 +1119 1089 -29273.8425731 +1120 1089 -132324.807888 +1121 1089 -45937.5284672 +1122 1089 107840.373884 +1123 1089 11999.6097904 +1124 1089 6562.50109771 +1125 1089 -78979.2030845 +1126 1089 138400.486246 +1127 1089 52500.0361274 +1228 1089 -134566.858043 +1229 1089 -16701.7126509 +1230 1089 -192580.623976 +1231 1089 -38384.3022338 +1232 1089 -54768.0344823 +1233 1089 -10074.1923682 +1234 1089 149026.514323 +1239 1089 434643.525417 +1240 1089 -47998.0924504 +1241 1089 -.00653404789046 +1242 1089 -296785.04522 +1243 1089 -7600.92498008 +1244 1089 205705.639289 +1245 1089 108639.076841 +1246 1089 -19687.5164295 +1247 1089 -60627.7004169 +1248 1089 48205.533375 +1249 1089 -2433.49809579 +1250 1089 35998.4925413 +1255 1089 -130799.564496 +1090 1090 5631796.53975 +1091 1090 -1.42958015203e-7 +1092 1090 -30403.6805426 +1093 1090 891968.462958 +1094 1090 -3.11993062496e-8 +1095 1090 -46359.5440805 +1096 1090 4.51691448689e-8 +1097 1090 -523198.257983 +1098 1090 2.93366611004e-8 +1103 1090 190353.470785 +1104 1090 -2815879.74533 +1108 1090 -445984.173543 +1119 1090 -132324.807888 +1120 1090 -244943.73766 +1121 1090 -129500.085535 +1122 1090 11999.6097904 +1123 1090 -703977.760952 +1124 1090 -385000.256899 +1125 1090 138400.486246 +1126 1090 -111496.921331 +1127 1090 -63000.0428868 +1228 1090 -16701.7126509 +1229 1090 489884.994991 +1230 1090 -.00327618792653 +1231 1090 132468.431905 +1232 1090 129500.089111 +1233 1090 16558.0824179 +1234 1090 -244942.047602 +1239 1090 -47998.0924504 +1240 1090 1407948.29242 +1241 1090 -.000669105444104 +1242 1090 -7600.92498008 +1243 1090 222991.973122 +1244 1090 .00349872908555 +1245 1090 -11589.903595 +1246 1090 385000.257122 +1247 1090 -130799.564496 +1248 1090 63000.0395342 +1249 1090 47588.3961363 +1250 1090 -703970.357045 +1255 1090 -111496.114592 +1091 1091 748928.693076 +1092 1091 4.14438545704e-8 +1093 1091 -2.25845724344e-8 +1094 1091 126587.895616 +1095 1091 -1.50823965669e-8 +1096 1091 187226.811227 +1097 1091 1.93249434233e-8 +1098 1091 31646.1587581 +1103 1091 -2.61273235083e-9 +1104 1091 3.86498868465e-8 +1108 1091 2.58442014456e-8 +1119 1091 -45937.5328796 +1120 1091 -129500.085685 +1121 1091 -30451.5560596 +1122 1091 6562.50766212 +1123 1091 -385000.257011 +1124 1091 -93615.9995545 +1125 1091 52500.0339811 +1126 1091 -63000.04296 +1127 1091 -15824.0598354 +1228 1091 -192580.632807 +1229 1091 -.00327619537711 +1230 1091 -121802.310014 +1231 1091 -46013.8328814 +1232 1091 -30451.8350938 +1233 1091 -8754.20599347 +1234 1091 129500.088661 +1239 1091 .0065340208821 +1240 1091 .000669092871249 +1241 1091 -374453.292157 +1242 1091 205705.634995 +1243 1091 .00349873723462 +1244 1091 -63294.389855 +1245 1091 6338.50750888 +1246 1091 -93616.9912427 +1247 1091 48205.5312393 +1248 1091 -15824.1127293 +1249 1091 -26026.0173589 +1250 1091 385000.256788 +1255 1091 63000.0393152 +1092 1092 11696561.6414 +1093 1092 -60172.6622167 +1094 1092 -5.49480319023e-8 +1095 1092 -315722.834333 +1096 1092 3.72529029846e-9 +1097 1092 -4750441.18476 +1098 1092 -1.90921127796e-8 +1103 1092 -38451.0470284 +1104 1092 568802.470835 +1108 1092 591126.407893 +1111 1092 -4.76837158203e-7 +1112 1092 -56233.974359 +1122 1092 -69672.9115941 +1123 1092 -134599.695958 +1124 1092 -50352.4325477 +1125 1092 2598459.19106 +1126 1092 -132738.436863 +1127 1092 -50352.2246647 +1131 1092 49177864.0697 +1132 1092 -5773.23717949 +1239 1092 -296785.04522 +1240 1092 -7600.92498005 +1241 1092 -205705.634995 +1242 1092 -4930267.0838 +1243 1092 -15043.165453 +1244 1092 -209999.302447 +1245 1092 -78930.7797894 +1246 1092 -54647.6355389 +1247 1092 2597946.48393 +1248 1092 -58941.9302781 +1249 1092 -9612.76175711 +1250 1092 142200.617709 +1255 1092 147781.60568 +1258 1092 49177864.0697 +1259 1092 5773.23717949 +1263 1092 -102038543.721 +1093 1093 1765320.75903 +1094 1093 -4.42378222942e-8 +1095 1093 538653.925606 +1096 1093 -1.90921127796e-8 +1097 1093 -500869.952922 +1098 1093 3.16649675369e-8 +1103 1093 30148.5452284 +1104 1093 -445984.39687 +1108 1093 -882656.681941 +1122 1093 -134599.695958 +1123 1093 -111496.902718 +1124 1093 -63000.0411343 +1125 1093 140260.653341 +1126 1093 -220665.061356 +1127 1093 -126000.084971 +1239 1093 -7600.92498006 +1240 1093 222991.973122 +1241 1093 -.00349873537198 +1242 1093 -15043.1654531 +1243 1093 441329.901966 +1244 1093 .00335268303752 +1245 1093 134663.476588 +1246 1093 63000.0447791 +1247 1093 -125217.484523 +1248 1093 126000.081472 +1249 1093 7537.14112063 +1250 1093 -111496.170423 +1255 1093 -220664.314194 +1094 1094 255823.923 +1095 1094 4.10247594118e-9 +1096 1094 31645.9912634 +1097 1094 -4.19095158577e-9 +1098 1094 63954.0986094 +1103 1094 7.8696757555e-10 +1104 1094 -1.16415321827e-8 +1108 1094 -1.49011611938e-8 +1122 1094 -50352.4346941 +1123 1094 -63000.0412075 +1124 1094 -15824.0319165 +1125 1094 54647.4275314 +1126 1094 -126000.083218 +1127 1094 -31977.8123084 +1239 1094 -205705.639289 +1240 1094 -.00349873676896 +1241 1094 -63294.3898549 +1242 1094 209999.302447 +1243 1094 -.00335268769413 +1244 1094 -127907.490106 +1245 1094 -50388.8346623 +1246 1094 -15824.1964766 +1247 1094 46057.721679 +1248 1094 -31977.9212894 +1249 1094 -4258.80301227 +1250 1094 63000.0445602 +1255 1094 126000.086717 +1095 1095 865942.660463 +1096 1095 -3.93066555262e-8 +1097 1095 -557685.372444 +1098 1095 3.12611460686e-8 +1103 1095 -3133.92116584 +1104 1095 46359.7805598 +1108 1095 -538651.851975 +1228 1095 -28916.3049341 +1229 1095 -140531.746524 +1230 1095 -50276.8313036 +1231 1095 -67573.2006234 +1232 1095 -96214.3623527 +1233 1095 -9499.90720441 +1234 1095 140531.171663 +1239 1095 108639.076841 +1240 1095 -11589.903595 +1241 1095 -6338.50750889 +1242 1095 -78930.7797894 +1243 1095 134663.476588 +1244 1095 50388.8346623 +1245 1095 216485.246741 +1246 1095 223.995963951 +1247 1095 -139421.485583 +1248 1095 102888.869643 +1249 1095 -783.478382969 +1250 1095 11589.9169078 +1255 1095 -134662.971451 +1096 1096 374466.325385 +1097 1096 1.76951289177e-8 +1098 1096 63294.164223 +1103 1096 4.84772026539e-9 +1104 1096 -7.17118382454e-8 +1108 1096 1.18743628263e-8 +1228 1096 -41522.6300347 +1229 1096 -129500.0842 +1230 1096 -30451.7513255 +1231 1096 -96366.9662598 +1232 1096 -60901.3754654 +1233 1096 -8754.17065986 +1234 1096 129499.565974 +1239 1096 19687.5164295 +1240 1096 -385000.257122 +1241 1096 -93616.9912427 +1242 1096 54647.6355389 +1243 1096 -63000.0447791 +1244 1096 -15824.1964766 +1245 1096 -223.995963972 +1246 1096 -187227.63102 +1247 1096 98558.68175 +1248 1096 -31647.3021052 +1249 1096 -26025.9133 +1250 1096 384998.717455 +1255 1096 62999.7926695 +1097 1097 42955160.1837 +1098 1097 -2.88709998131e-8 +1102 1097 56233.974359 +1103 1097 13437076.1686 +1104 1097 1726186.61204 +1105 1097 5.96046447754e-8 +1106 1097 -1.49011611938e-8 +1107 1097 3198.81462816 +1108 1097 2735225.00377 +1109 1097 2.38418579102e-7 +1112 1097 59432.7889871 +1239 1097 -60627.7004169 +1240 1097 -130799.564496 +1241 1097 -48205.5312393 +1242 1097 2597946.48393 +1243 1097 -125217.484523 +1244 1097 -46057.721679 +1245 1097 -139421.485583 +1246 1097 -98558.68175 +1247 1097 -12198059.7609 +1248 1097 -96410.6799039 +1249 1097 -15620637.1762 +1250 1097 -1075597.77151 +1251 1097 -51131341.8213 +1252 1097 2758750.0059 +1253 1097 188054.792069 +1254 1097 -549.029380333 +1255 1097 -387056.881921 +1256 1097 3741317.69424 +1257 1097 -2909028.41892 +1258 1097 -51217570.6312 +1259 1097 -6322.26655982 +1263 1097 49177864.0697 +1264 1097 -5773.23717949 +1098 1098 127912.066517 +1103 1098 2.26646661758e-9 +1104 1098 -3.35276126862e-8 +1108 1098 -4.28408384323e-8 +1239 1098 -48205.533375 +1240 1098 -63000.0395342 +1241 1098 -15824.1127293 +1242 1098 58941.9302781 +1243 1098 -126000.081472 +1244 1098 -31977.9212894 +1245 1098 -102888.869643 +1246 1098 -31647.3021051 +1247 1098 96410.6799039 +1248 1098 -63953.9079298 +1249 1098 -4258.7856299 +1250 1098 62999.7874245 +1255 1098 125999.577581 +1099 1099 70907692.3077 +1100 1099 -2.38418579102e-7 +1108 1099 6853846.15385 +1109 1099 5.96046447754e-8 +1128 1099 -14151923.0769 +1129 1099 -5.125e7 +1255 1099 -14151923.0769 +1256 1099 5.125e7 +1260 1099 -14003846.1539 +1261 1099 5.96046447754e-8 +1100 1100 6414205128.2 +1108 1100 2.38418579102e-7 +1109 1100 1389051282.05 +1128 1100 -5.125e7 +1129 1100 -837525641.026 +1255 1100 5.125e7 +1256 1100 -837525641.026 +1260 1100 5.96046447754e-8 +1261 1100 -2921102564.1 +1101 1101 4014896634.61 +1102 1101 5.58793544769e-9 +1111 1101 -1911695112.18 +1112 1101 -2.32830643654e-10 +1125 1101 -49177864.0697 +1131 1101 -962833934.294 +1132 1101 266927.083333 +1242 1101 102038543.721 +1247 1101 -49177864.0697 +1258 1101 -962833934.294 +1259 1101 -266927.083333 +1263 1101 1973544471.15 +1264 1101 -2.91038304567e-9 +1102 1102 1506623.93162 +1111 1102 -6.17001205683e-9 +1112 1102 310550.213675 +1125 1102 5773.23717949 +1131 1102 266927.083333 +1132 1102 -43556.3568376 +1247 1102 -5773.23717949 +1258 1102 -266927.083333 +1259 1102 -43556.3568376 +1263 1102 -2.09547579288e-9 +1264 1102 -306436.965812 +1103 1103 95019862.8029 +1104 1103 5824965.31888 +1105 1103 2.38418579102e-7 +1106 1103 7.45058059692e-9 +1107 1103 -1068.34849611 +1108 1103 1172842.1032 +1109 1103 -2.98023223877e-7 +1110 1103 -1.49011611938e-8 +1111 1103 -9.31322574615e-10 +1112 1103 -3198.81462816 +1228 1103 8380.61994881 +1229 1103 16558.0786428 +1230 1103 8754.20566145 +1231 1103 8954.83129336 +1232 1103 8754.17099187 +1233 1103 -27463030.8839 +1234 1103 -1954477.44277 +1235 1103 -51131263.6705 +1236 1103 1263906.88098 +1237 1103 86184.7854247 +1238 1103 -816.560068688 +1239 1103 -2433.49809579 +1240 1103 47588.3961363 +1241 1103 26026.0173589 +1242 1103 -9612.76175711 +1243 1103 7537.14112063 +1244 1103 4258.80301227 +1245 1103 -783.478382969 +1246 1103 26025.9133 +1247 1103 -15620637.1762 +1248 1103 4258.7856299 +1249 1103 -34306883.8082 +1250 1103 -2155930.95226 +1251 1103 -5.71835443378 +1252 1103 -4481942.51795 +1253 1103 -305554.507633 +1254 1103 -267.530688355 +1255 1103 -1213933.89026 +1256 1103 51131341.8213 +1257 1103 2758750.0059 +1258 1103 188054.792069 +1259 1103 549.029380333 +1104 1104 10007038.9349 +1105 1104 1.49011611938e-8 +1107 1104 15682.917031 +1108 1104 -3647352.11252 +1109 1104 -2.04890966415e-8 +1110 1104 2.38418579102e-7 +1111 1104 1.49011611938e-8 +1112 1104 46926.3759632 +1228 1104 -123973.667882 +1229 1104 -244941.991757 +1230 1104 -129500.083749 +1231 1104 -132467.918541 +1232 1104 -129499.570886 +1233 1104 -1954477.44277 +1234 1104 1068391.56416 +1235 1104 -3486599.41191 +1236 1104 -18535297.1051 +1237 1104 -1263906.88098 +1238 1104 11974.9197548 +1239 1104 35998.4925413 +1240 1104 -703970.357045 +1241 1104 -385000.256788 +1242 1104 142200.617709 +1243 1104 -111496.170423 +1244 1104 -63000.0445602 +1245 1104 11589.9169078 +1246 1104 -384998.717455 +1247 1104 -1075597.77151 +1248 1104 -62999.7874245 +1249 1104 -2155930.95226 +1250 1104 -2828387.98827 +1251 1104 83.8739820281 +1252 1104 65742146.5948 +1253 1104 4481942.51795 +1254 1104 3920.69901645 +1255 1104 2115216.77646 +1256 1104 3485453.13416 +1257 1104 -40470660.2332 +1258 1104 -2758750.0059 +1259 1104 -8054.22073838 +1105 1105 11437856389.6 +1108 1105 4.65661287308e-9 +1109 1105 1723837210.23 +1233 1105 -51131263.6705 +1234 1105 -3486599.41191 +1235 1105 -1922837085.77 +1247 1105 51131341.8213 +1249 1105 5.71835422516 +1250 1105 -83.8739820421 +1251 1105 -5542198771.68 +1255 1105 3485453.13416 +1256 1105 -980809367.397 +1106 1106 2624461841.56 +1107 1106 -5.58793544769e-9 +1108 1106 2.38418579102e-7 +1110 1106 -1570240768.42 +1111 1106 -107038079.047 +1112 1106 4.54019755125e-9 +1233 1106 -1263906.88098 +1234 1106 18535297.1051 +1236 1106 -371206819.998 +1237 1106 -25312292.0771 +1238 1106 266308.66495 +1247 1106 -2758750.0059 +1249 1106 4481942.51795 +1250 1106 -65742146.5948 +1252 1106 1252629003.91 +1253 1106 85397231.1047 +1254 1106 -.0297830894124 +1255 1106 40470660.2332 +1257 1106 -793851723.575 +1258 1106 -54114225.8237 +1259 1106 -266309.071986 +1107 1107 2041845.77144 +1108 1107 -46926.3759632 +1110 1107 1.39698386192e-9 +1111 1107 9.45874489844e-11 +1112 1107 318204.799166 +1233 1107 816.560068688 +1234 1107 -11974.9197548 +1236 1107 266308.66495 +1237 1107 18159.371937 +1238 1107 -184697.30516 +1247 1107 -549.029380333 +1249 1107 -267.530688355 +1250 1107 3920.69901645 +1252 1107 .029783097445 +1253 1107 -.436843656302 +1254 1107 -744783.162124 +1255 1107 8054.22073838 +1257 1107 -266309.071986 +1258 1107 -18153.4017404 +1259 1107 -66218.9915486 +1108 1108 40891312.6837 +1109 1108 2.38418579102e-7 +1112 1108 -46926.3759632 +1239 1108 -130799.564496 +1240 1108 -111496.114592 +1241 1108 -63000.0393152 +1242 1108 147781.60568 +1243 1108 -220664.314194 +1244 1108 -126000.086717 +1245 1108 -134662.971451 +1246 1108 -62999.7926694 +1247 1108 -387056.881921 +1248 1108 -125999.577581 +1249 1108 -1213933.89026 +1250 1108 2115216.77646 +1251 1108 -3485453.13416 +1252 1108 -40470660.2332 +1253 1108 -2758750.0059 +1254 1108 8054.22073838 +1255 1108 -9015716.20552 +1256 1108 4005033.15616 +1257 1108 42675233.5294 +1258 1108 2909028.41892 +1259 1108 8054.22073838 +1260 1108 -14151923.0769 +1261 1108 -5.125e7 +1109 1109 7011449271.41 +1247 1109 -3741317.69424 +1249 1109 -51131341.8213 +1250 1109 -3485453.13416 +1251 1109 -980809367.397 +1255 1109 -4005033.15616 +1256 1109 -3243833873.42 +1260 1109 -5.125e7 +1261 1109 -837525641.026 +1110 1110 1684878579.82 +1111 1110 114852556.525 +1112 1110 -7.45058059692e-9 +1247 1110 2909028.41892 +1249 1110 -2758750.0059 +1250 1110 40470660.2332 +1252 1110 -793851723.575 +1253 1110 -54114225.8237 +1254 1110 266309.071986 +1255 1110 -42675233.5294 +1257 1110 822511176.425 +1258 1110 56067845.193 +1259 1110 19486.0296575 +1111 1111 2015277433.24 +1112 1111 -3.72529029846e-9 +1242 1111 -49177864.0697 +1247 1111 51217570.6312 +1249 1111 -188054.792069 +1250 1111 2758750.0059 +1252 1111 -54114225.8237 +1253 1111 -3688786.39365 +1254 1111 18153.4017404 +1255 1111 -2909028.41892 +1257 1111 56067845.193 +1258 1111 990594193.69 +1259 1111 20859.5476883 +1263 1111 -962833934.294 +1264 1111 266927.083333 +1112 1112 1548743.59106 +1242 1112 5773.23717949 +1247 1112 -6322.26655982 +1249 1112 549.029380333 +1250 1112 -8054.22073838 +1252 1112 266309.071986 +1253 1112 18153.4017404 +1254 1112 -66218.9915486 +1255 1112 8054.22073838 +1257 1112 -19486.0296575 +1258 1112 -20859.5476883 +1259 1112 -365167.479462 +1263 1112 266927.083333 +1264 1112 -43556.3568376 +1113 1113 384291.205266 +1114 1113 -4.09781932831e-8 +1115 1113 -1.86264514923e-8 +1116 1113 -406000.079139 +1118 1113 1.11758708954e-8 +1172 1113 -83650.2434145 +1173 1113 523778.262688 +1174 1113 -3.0267983675e-9 +1188 1113 94505.6437007 +1189 1113 500198.94765 +1190 1113 -7.68341124058e-9 +1207 1113 94505.6437007 +1208 1113 -500198.94765 +1209 1113 5.47152012587e-9 +1217 1113 -83650.2434145 +1218 1113 -523778.262688 +1219 1113 1.62981450558e-8 +1347 1113 -20912.6812731 +1348 1113 130944.565672 +1349 1113 36750.0269238 +1350 1113 23626.2904729 +1351 1113 125049.734986 +1352 1113 31977.2719444 +1360 1113 -101500.501393 +1361 1113 -3.25962901115e-9 +1362 1113 156545.309231 +1363 1113 96072.319643 +1364 1113 -1.86264514923e-8 +1365 1113 146999.505363 +1380 1113 23626.2904729 +1381 1113 -125049.734986 +1382 1113 31977.2719444 +1383 1113 -20912.6812731 +1384 1113 -130944.565672 +1385 1113 36750.0269238 +1114 1114 5373929.68184 +1115 1114 -9.685754776e-8 +1116 1114 1.67638063431e-8 +1117 1114 2607469.92071 +1118 1114 -4.74974513054e-8 +1172 1114 523778.262688 +1173 1114 -1303735.21249 +1174 1114 -5.58793544769e-9 +1188 1114 -591797.413165 +1189 1114 -2686963.645 +1190 1114 3.35276126862e-8 +1207 1114 591797.413165 +1208 1114 -2686963.645 +1209 1114 9.31322574615e-9 +1217 1114 -523778.262688 +1218 1114 -1303735.21249 +1219 1114 3.81842255592e-8 +1347 1114 130944.565672 +1348 1114 -325933.923542 +1349 1114 -140000.092853 +1350 1114 -147949.355218 +1351 1114 -671741.144715 +1352 1114 -280000.187543 +1360 1114 -9.31322574615e-10 +1361 1114 651867.239269 +1362 1114 -1.210719347e-8 +1363 1114 -3.72529029846e-9 +1364 1114 1343481.95346 +1365 1114 -1.30385160446e-8 +1380 1114 147949.355218 +1381 1114 -671741.144715 +1382 1114 280000.187543 +1383 1114 -130944.565672 +1384 1114 -325933.923542 +1385 1114 140000.092853 +1115 1115 415114.291302 +1116 1115 2.18860805035e-8 +1117 1115 -6.14672899246e-8 +1118 1115 214082.779439 +1172 1115 -1.62981450558e-9 +1173 1115 -5.58793544769e-9 +1174 1115 53517.7880705 +1188 1115 2.09547579288e-9 +1189 1115 5.58793544769e-9 +1190 1115 103772.525023 +1207 1115 -1.25728547573e-8 +1208 1115 4.842877388e-8 +1209 1115 103772.525023 +1217 1115 1.11758708954e-8 +1218 1115 4.74974513054e-8 +1219 1115 53517.7880705 +1347 1115 36750.022154 +1348 1115 -140000.09269 +1349 1115 -26760.9752199 +1350 1115 -41522.4783151 +1351 1115 -280000.186209 +1352 1115 -51890.1510547 +1360 1115 156545.299685 +1361 1115 -1.30385160446e-8 +1362 1115 -107038.087301 +1363 1115 -146999.505363 +1364 1115 7.45058059692e-9 +1365 1115 -207548.508614 +1380 1115 -41522.4783151 +1381 1115 280000.186209 +1382 1115 -51890.1510547 +1383 1115 36750.022154 +1384 1115 140000.09269 +1385 1115 -26760.9752199 +1116 1116 902374.336044 +1117 1116 -3.72529029846e-8 +1118 1116 -4.00468707085e-8 +1119 1116 -490825.834455 +1120 1116 2.79396772385e-8 +1121 1116 1.58324837685e-8 +1161 1116 -104724.03785 +1162 1116 527610.383559 +1163 1116 -9.31322574615e-10 +1172 1116 222828.408394 +1173 1116 -80797.5929358 +1174 1116 -9.31322574615e-9 +1188 1116 -120876.622712 +1189 1116 -568222.46613 +1190 1116 9.54605638981e-9 +1207 1116 -120876.622712 +1208 1116 568222.46613 +1209 1116 -4.88944351673e-9 +1217 1116 222828.408394 +1218 1116 80797.5929358 +1219 1116 -1.1408701539e-8 +1228 1116 -104724.03785 +1229 1116 -527610.383559 +1230 1116 2.00234353542e-8 +1344 1116 -26181.1339249 +1345 1116 131902.59589 +1346 1116 41522.6299317 +1347 1116 55706.857145 +1348 1116 -20199.4024249 +1349 1116 -9187.51072697 +1350 1116 -30219.2760976 +1351 1116 -142055.616532 +1352 1116 -41522.6253393 +1357 1116 -122706.956391 +1358 1116 2.79396772385e-9 +1359 1116 174920.321134 +1360 1116 225592.604482 +1361 1116 -1.49011611938e-8 +1362 1116 -.00917950598523 +1363 1116 -101500.501393 +1364 1116 1.49011611938e-8 +1365 1116 -156545.299685 +1370 1116 -26181.1339249 +1371 1116 -131902.59589 +1372 1116 41522.6299317 +1380 1116 -30219.2760976 +1381 1116 142055.616532 +1382 1116 -41522.6253393 +1383 1116 55706.8571449 +1384 1116 20199.4024249 +1385 1116 -9187.51072697 +1117 1117 9480276.68092 +1118 1117 -1.96509063244e-7 +1119 1117 2.79396772385e-8 +1120 1117 2157701.1225 +1121 1117 -4.88944351673e-8 +1161 1117 527610.383559 +1162 1117 -1078850.92958 +1163 1117 -2.18860805035e-8 +1172 1117 -80797.5929358 +1173 1117 -4740135.68366 +1174 1117 4.47034835815e-8 +1188 1117 -568222.46613 +1189 1117 -1303735.28694 +1190 1117 2.70083546639e-8 +1207 1117 568222.46613 +1208 1117 -1303735.28694 +1209 1117 -9.31322574615e-10 +1217 1117 80797.5929358 +1218 1117 -4740135.68366 +1219 1117 9.685754776e-8 +1228 1117 -527610.383559 +1229 1117 -1078850.92958 +1230 1117 4.33064997196e-8 +1344 1117 131902.59589 +1345 1117 -269712.856857 +1346 1117 -129500.08576 +1347 1117 -20199.4024249 +1348 1117 -1185034.41167 +1349 1117 -539000.359815 +1350 1117 -142055.616532 +1351 1117 -325933.942156 +1352 1117 -140000.094186 +1358 1117 539425.031628 +1359 1117 -1.210719347e-8 +1360 1117 -6.51925802231e-9 +1361 1117 2370068.18858 +1362 1117 -1.86264514923e-8 +1363 1117 2.79396772385e-9 +1364 1117 651867.239269 +1370 1117 -131902.59589 +1371 1117 -269712.856857 +1372 1117 129500.08576 +1380 1117 142055.616532 +1381 1117 -325933.942156 +1382 1117 140000.094186 +1383 1117 20199.4024249 +1384 1117 -1185034.41167 +1385 1117 539000.359815 +1118 1118 872592.813821 +1119 1118 3.58559191227e-8 +1120 1118 -4.61004674435e-8 +1121 1118 221269.668496 +1161 1118 3.49245965481e-9 +1162 1118 -2.74740159512e-8 +1163 1118 55315.0165381 +1172 1118 -1.2805685401e-8 +1173 1118 2.421438694e-8 +1174 1118 218137.534365 +1188 1118 1.00117176771e-8 +1189 1118 2.70083546639e-8 +1190 1118 53517.732231 +1207 1118 -6.98491930962e-9 +1208 1118 9.31322574615e-10 +1209 1118 53517.732231 +1217 1118 -1.55996531248e-8 +1218 1118 8.84756445885e-8 +1219 1118 218137.534365 +1228 1118 1.93249434233e-8 +1229 1118 5.68106770515e-8 +1230 1118 55315.0165381 +1344 1118 41522.6255194 +1345 1118 -129500.08561 +1346 1118 -27659.283728 +1347 1118 -9187.50153679 +1348 1118 -539000.359659 +1349 1118 -109075.542903 +1350 1118 -41522.6301091 +1351 1118 -140000.094024 +1352 1118 -26761.0031396 +1357 1118 174920.312304 +1358 1118 -1.62981450558e-8 +1359 1118 -110632.33374 +1360 1118 .00917948363349 +1361 1118 -1.58324837685e-8 +1362 1118 -436280.833431 +1363 1118 -156545.30923 +1364 1118 3.72529029846e-9 +1365 1118 -107038.087301 +1370 1118 41522.6255194 +1371 1118 129500.08561 +1372 1118 -27659.283728 +1380 1118 -41522.6301091 +1381 1118 140000.094024 +1382 1118 -26761.0031396 +1383 1118 -9187.5015368 +1384 1118 539000.359659 +1385 1118 -109075.542903 +1119 1119 1036172.27712 +1120 1119 -5.96046447754e-8 +1121 1119 -3.67872416973e-8 +1122 1119 -540541.055778 +1123 1119 1.11758708954e-8 +1124 1119 1.86264514923e-8 +1150 1119 -117094.82218 +1151 1119 529299.231553 +1152 1119 -5.12227416038e-9 +1161 1119 256646.703759 +1162 1119 -70019.7399479 +1163 1119 -1.46683305502e-8 +1172 1119 -141952.483099 +1173 1119 -564390.345259 +1174 1119 1.32713466883e-8 +1217 1119 -141952.483099 +1218 1119 564390.345259 +1219 1119 -6.51925802231e-9 +1228 1119 256646.703759 +1229 1119 70019.7399479 +1230 1119 -1.8859282136e-8 +1239 1119 -117094.82218 +1240 1119 -529299.231553 +1241 1119 1.39698386192e-8 +1307 1119 -29273.8425731 +1308 1119 132324.807888 +1309 1119 45937.5328796 +1310 1119 -135135.811977 +1311 1119 -9.31322574615e-10 +1312 1119 192579.932918 +1313 1119 -29273.8425731 +1314 1119 -132324.807888 +1315 1119 45937.5328796 +1344 1119 64161.4143731 +1345 1119 -17504.939443 +1346 1119 -8829.81030933 +1347 1119 -35488.2452373 +1348 1119 -141097.586315 +1349 1119 -45937.5284659 +1357 1119 259042.023319 +1358 1119 -2.14204192162e-8 +1359 1119 -.00882212352008 +1360 1119 -122706.956391 +1361 1119 1.67638063431e-8 +1362 1119 -174920.312304 +1370 1119 64161.4143731 +1371 1119 17504.939443 +1372 1119 -8829.81030934 +1383 1119 -35488.2452373 +1384 1119 141097.586315 +1385 1119 -45937.5284659 +1120 1120 8215429.66922 +1121 1120 -1.83470547199e-7 +1122 1120 5.58793544769e-9 +1123 1120 1959547.98652 +1124 1120 -4.00468707085e-8 +1150 1120 529299.231553 +1151 1120 -979774.402527 +1152 1120 -2.79396772385e-9 +1161 1120 -70019.7399479 +1162 1120 -4107711.89064 +1163 1120 1.02445483208e-8 +1172 1120 -564390.345259 +1173 1120 -1078851.00403 +1174 1120 4.05125319958e-8 +1217 1120 564390.345259 +1218 1120 -1078851.00403 +1219 1120 4.65661287308e-9 +1228 1120 70019.7399479 +1229 1120 -4107711.89064 +1230 1120 8.19563865662e-8 +1239 1120 -529299.231553 +1240 1120 -979774.402527 +1241 1120 3.0267983675e-8 +1307 1120 132324.807888 +1308 1120 -244943.73766 +1309 1120 -129500.085685 +1310 1120 -6.51925802231e-9 +1311 1120 489886.722493 +1312 1120 -8.38190317154e-9 +1313 1120 -132324.807888 +1314 1120 -244943.73766 +1315 1120 129500.085685 +1344 1120 -17504.939443 +1345 1120 -1026928.49556 +1346 1120 -518000.345796 +1347 1120 -141097.586315 +1348 1120 -269712.875471 +1349 1120 -129500.087251 +1357 1120 -1.30385160446e-8 +1358 1120 2053856.37134 +1359 1120 -9.31322574615e-9 +1360 1120 1.11758708954e-8 +1361 1120 539425.031628 +1362 1120 5.58793544769e-9 +1370 1120 17504.939443 +1371 1120 -1026928.49556 +1372 1120 518000.345796 +1383 1120 141097.586315 +1384 1120 -269712.875471 +1385 1120 129500.087251 +1121 1121 929759.946697 +1122 1121 2.23517417908e-8 +1123 1121 -4.28408384323e-8 +1124 1121 243607.995588 +1150 1121 6.98491930962e-10 +1151 1121 -1.25728547573e-8 +1152 1121 60899.8213261 +1161 1121 -1.18743628263e-8 +1162 1121 4.842877388e-8 +1163 1121 232430.741065 +1172 1121 1.30385160446e-8 +1173 1121 2.98023223877e-8 +1174 1121 55314.9606955 +1217 1121 -1.07102096081e-8 +1218 1121 9.31322574615e-10 +1219 1121 55314.9606955 +1228 1121 -5.35510480404e-9 +1229 1121 6.70552253723e-8 +1230 1121 232430.741065 +1239 1121 1.32713466883e-8 +1240 1121 3.49245965481e-8 +1241 1121 60899.8213261 +1307 1121 45937.5284672 +1308 1121 -129500.085535 +1309 1121 -30451.5560596 +1310 1121 192579.924088 +1311 1121 -8.38190317154e-9 +1312 1121 -121801.869096 +1313 1121 45937.5284672 +1314 1121 129500.085535 +1315 1121 -30451.5560596 +1344 1121 -8829.80147696 +1345 1121 -518000.345646 +1346 1121 -116221.146907 +1347 1121 -45937.5328783 +1348 1121 -129500.0871 +1349 1121 -27659.3116492 +1357 1121 .0088221039623 +1358 1121 -3.16649675369e-8 +1359 1121 -464866.096408 +1360 1121 -174920.321134 +1362 1121 -110632.33374 +1370 1121 -8829.80147696 +1371 1121 518000.345646 +1372 1121 -116221.146907 +1383 1121 -45937.5328783 +1384 1121 129500.0871 +1385 1121 -27659.3116492 +1122 1122 1732020.21814 +1123 1122 -1.34110450745e-7 +1124 1122 -7.72997736931e-8 +1125 1122 -1188171.23008 +1126 1122 4.65661287308e-8 +1127 1122 5.35510480404e-8 +1140 1122 -278691.361554 +1141 1122 538398.783833 +1142 1122 -1.62981450558e-9 +1150 1122 431362.328716 +1151 1122 -47998.4246409 +1152 1122 -1.8160790205e-8 +1161 1122 -154323.26743 +1162 1122 -562701.497265 +1163 1122 1.23400241137e-8 +1228 1122 -154323.26743 +1229 1122 562701.497265 +1230 1122 -3.25962901115e-9 +1239 1122 431362.328716 +1240 1122 47998.4246409 +1241 1122 -1.2805685401e-8 +1242 1122 -278691.361554 +1243 1122 -538398.783833 +1244 1122 2.39815562963e-8 +1284 1122 -69672.9115941 +1285 1122 134599.695958 +1286 1122 50352.4346941 +1287 1122 -297043.0923 +1288 1122 7.45058059692e-9 +1289 1122 205704.939408 +1290 1122 -69672.9115941 +1291 1122 -134599.695958 +1292 1122 50352.4346941 +1307 1122 107840.373884 +1308 1122 -11999.6097904 +1309 1122 -6562.50766212 +1310 1122 433004.221597 +1311 1122 -4.09781932831e-8 +1312 1122 -.00655680801719 +1313 1122 107840.373884 +1314 1122 11999.6097904 +1315 1122 -6562.50766212 +1344 1122 -38580.9538854 +1345 1122 -140675.374316 +1346 1122 -50352.4314138 +1357 1122 -135135.811977 +1358 1122 1.210719347e-8 +1359 1122 -192579.924088 +1370 1122 -38580.9538854 +1371 1122 140675.374316 +1372 1122 -50352.4314138 +1123 1123 5631826.15405 +1124 1123 -1.25262886286e-7 +1125 1123 5.02914190292e-8 +1126 1123 891971.540819 +1127 1123 -3.65544110537e-8 +1140 1123 538398.783833 +1141 1123 -445987.326051 +1142 1123 -1.53668224812e-8 +1150 1123 -47998.4246409 +1151 1123 -2815909.359 +1152 1123 4.28408384323e-8 +1161 1123 -562701.497265 +1162 1123 -979774.476984 +1163 1123 2.421438694e-8 +1228 1123 562701.497265 +1229 1123 -979774.476984 +1230 1123 -3.72529029846e-9 +1239 1123 47998.4246409 +1240 1123 -2815909.359 +1241 1123 5.12227416039e-8 +1242 1123 -538398.783833 +1243 1123 -445987.326051 +1244 1123 3.42261046171e-8 +1284 1123 134599.695958 +1285 1123 -111496.902718 +1286 1123 -63000.0412075 +1287 1123 5.58793544769e-9 +1288 1123 222992.742752 +1289 1123 -1.46683305502e-8 +1290 1123 -134599.695958 +1291 1123 -111496.902718 +1292 1123 63000.0412075 +1307 1123 -11999.6097904 +1308 1123 -703977.760952 +1309 1123 -385000.257011 +1310 1123 -3.25962901115e-8 +1311 1123 1407955.69599 +1312 1123 -1.35041773319e-8 +1313 1123 11999.6097904 +1314 1123 -703977.760952 +1315 1123 385000.257011 +1344 1123 -140675.374316 +1345 1123 -244943.756274 +1346 1123 -129500.087326 +1357 1123 6.51925802231e-9 +1358 1123 489886.722493 +1359 1123 2.79396772385e-9 +1370 1123 140675.374316 +1371 1123 -244943.756274 +1372 1123 129500.087326 +1124 1124 748924.735309 +1125 1124 5.72763383389e-8 +1126 1124 -2.86381691694e-8 +1127 1124 126587.462786 +1140 1124 3.25962901115e-9 +1141 1124 -1.55996531248e-8 +1142 1124 31645.8896132 +1150 1124 -1.16415321827e-8 +1151 1124 2.98023223877e-8 +1152 1124 187224.845875 +1161 1124 1.04773789644e-8 +1162 1124 2.60770320892e-8 +1163 1124 60899.7654835 +1228 1124 -7.45058059692e-9 +1229 1124 -2.79396772385e-9 +1230 1124 60899.7654835 +1239 1124 -2.51457095146e-8 +1240 1124 5.30853867531e-8 +1241 1124 187224.845875 +1242 1124 2.93366611004e-8 +1243 1124 3.16649675369e-8 +1244 1124 31645.8896132 +1284 1124 50352.4325477 +1285 1124 -63000.0411343 +1286 1124 -15824.0319165 +1287 1124 205704.935113 +1288 1124 -1.49011611938e-8 +1289 1124 -63294.1754996 +1290 1124 50352.4325477 +1291 1124 63000.0411343 +1292 1124 -15824.0319165 +1307 1124 -6562.50109771 +1308 1124 -385000.256899 +1309 1124 -93615.9995546 +1310 1124 .00655676983297 +1311 1124 -1.8160790205e-8 +1312 1124 -374451.322313 +1313 1124 -6562.50109772 +1314 1124 385000.256899 +1315 1124 -93615.9995546 +1344 1124 -50352.4358261 +1345 1124 -129500.087176 +1346 1124 -30451.5839809 +1357 1124 -192579.932918 +1358 1124 4.65661287308e-10 +1359 1124 -121801.869096 +1370 1124 -50352.4358261 +1371 1124 129500.087176 +1372 1124 -30451.5839809 +1125 1125 492229913.112 +1126 1125 -1.00582838059e-7 +1127 1125 -5.54136931896e-8 +1137 1125 1798456233.97 +1140 1125 -244535057.024 +1141 1125 -561042.608409 +1142 1125 -9.31322574615e-10 +1150 1125 -315916.527516 +1151 1125 -553601.944985 +1152 1125 2.23517417908e-8 +1239 1125 -315916.527516 +1240 1125 553601.944985 +1241 1125 -6.98491930962e-10 +1242 1125 -244535057.024 +1243 1125 561042.608409 +1244 1125 -2.58442014456e-8 +1263 1125 -4.76837158203e-7 +1264 1125 -1798456233.97 +1267 1125 49177864.0697 +1268 1125 5773.23717949 +1271 1125 -102038543.721 +1275 1125 49177864.0697 +1276 1125 -5773.23717949 +1284 1125 2598459.19106 +1285 1125 -140260.653341 +1286 1125 -54647.4275314 +1287 1125 -4930779.79082 +1288 1125 -2.23517417908e-8 +1289 1125 -209999.302333 +1290 1125 2598459.19106 +1291 1125 140260.653341 +1292 1125 -54647.4275314 +1307 1125 -78979.2030845 +1308 1125 -138400.486246 +1309 1125 -52500.0339811 +1310 1125 -297043.0923 +1311 1125 2.32830643654e-8 +1312 1125 -205704.935113 +1313 1125 -78979.2030845 +1314 1125 138400.486246 +1315 1125 -52500.0339811 +1126 1126 1765323.74724 +1127 1126 -5.96046447754e-8 +1140 1126 530953.752405 +1141 1126 -882659.669918 +1142 1126 -9.31322574615e-10 +1150 1126 -553601.944985 +1151 1126 -445987.400502 +1152 1126 2.63098627329e-8 +1239 1126 553601.944985 +1240 1126 -445987.400502 +1241 1126 -1.67638063431e-8 +1242 1126 -530953.752405 +1243 1126 -882659.669918 +1244 1126 4.37721610069e-8 +1284 1126 132738.436863 +1285 1126 -220665.061356 +1286 1126 -126000.083218 +1287 1126 -2.98023223877e-8 +1288 1126 441330.649014 +1289 1126 8.38190317154e-9 +1290 1126 -132738.436863 +1291 1126 -220665.061356 +1292 1126 126000.083218 +1307 1126 -138400.486246 +1308 1126 -111496.921331 +1309 1126 -63000.04296 +1310 1126 1.67638063431e-8 +1311 1126 222992.742752 +1312 1126 1.2805685401e-8 +1313 1126 138400.486246 +1314 1126 -111496.921331 +1315 1126 63000.04296 +1127 1127 255823.489653 +1140 1127 -2.21189111471e-8 +1141 1127 4.09781932831e-8 +1142 1127 63953.885801 +1150 1127 2.32830643654e-8 +1151 1127 4.00468707085e-8 +1152 1127 31645.8337756 +1239 1127 -2.56113708019e-9 +1240 1127 -9.31322574615e-9 +1241 1127 31645.8337756 +1242 1127 2.32830643654e-9 +1243 1127 -1.39698386192e-9 +1244 1127 63953.885801 +1284 1127 50352.2246647 +1285 1127 -126000.084971 +1286 1127 -31977.8123084 +1287 1127 209999.302333 +1288 1127 -2.09547579288e-8 +1289 1127 -127907.276009 +1290 1127 50352.2246647 +1291 1127 126000.084971 +1292 1127 -31977.8123084 +1307 1127 -52500.0361274 +1308 1127 -63000.0428868 +1309 1127 -15824.0598353 +1310 1127 -205704.939408 +1311 1127 1.86264514923e-9 +1312 1127 -63294.1754996 +1313 1127 -52500.0361274 +1314 1127 63000.0428868 +1315 1127 -15824.0598354 +1128 1128 262909615.306 +1129 1128 -2.38418579102e-7 +1132 1128 167300.832342 +1133 1128 -89146153.8461 +1134 1128 2.38418579102e-7 +1260 1128 -89146153.8461 +1261 1128 5.96046447754e-8 +1265 1128 -14151923.0769 +1266 1128 5.125e7 +1269 1128 -14003846.1539 +1270 1128 5.96046447754e-8 +1273 1128 -14151923.0769 +1274 1128 -5.125e7 +1129 1129 6476713717.87 +1131 1129 -167300.832342 +1133 1129 5.96046447754e-8 +1134 1129 1357797948.72 +1135 1129 -2.344e8 +1260 1129 2.38418579102e-7 +1261 1129 1357797948.72 +1262 1129 2.344e8 +1265 1129 5.125e7 +1266 1129 -837525641.026 +1269 1129 5.96046447754e-8 +1270 1129 -2921102564.1 +1273 1129 -5.125e7 +1274 1129 -837525641.026 +1130 1130 4.688e9 +1134 1130 2.344e8 +1135 1130 1.172e9 +1261 1130 -2.344e8 +1262 1130 1.172e9 +1131 1131 4074303531.16 +1132 1131 5.58793544769e-9 +1136 1131 -1931695112.18 +1137 1131 -6.17001205683e-9 +1140 1131 -4.76837158203e-7 +1263 1131 -1931695112.18 +1264 1131 -2.32830643654e-10 +1267 1131 -962833934.294 +1268 1131 -266927.083333 +1271 1131 1973544471.15 +1272 1131 -2.91038304567e-9 +1275 1131 -962833934.294 +1276 1131 266927.083333 +1284 1131 -49177864.0697 +1287 1131 102038543.721 +1290 1131 -49177864.0697 +1132 1132 35988913520.5 +1136 1132 -2.32830643654e-10 +1137 1132 8992310550.21 +1140 1132 -1798456233.97 +1242 1132 1798456233.97 +1263 1132 -6.17001205683e-9 +1264 1132 8992310550.21 +1267 1132 -266927.083333 +1268 1132 -43556.3568376 +1271 1132 -2.09547579288e-9 +1272 1132 -306436.965812 +1275 1132 266927.083333 +1276 1132 -43556.3568376 +1284 1132 5773.23717949 +1290 1132 -5773.23717949 +1133 1133 262907692.308 +1134 1133 -2.38418579102e-7 +1143 1133 -89146153.8461 +1144 1133 2.38418579102e-7 +1269 1133 -14151923.0769 +1270 1133 5.125e7 +1273 1133 -14003846.1539 +1274 1133 5.96046447754e-8 +1279 1133 -14151923.0769 +1280 1133 -5.125e7 +1134 1134 6476711794.87 +1143 1134 5.96046447754e-8 +1144 1134 1357797948.72 +1145 1134 -2.344e8 +1269 1134 5.125e7 +1270 1134 -837525641.026 +1273 1134 5.96046447754e-8 +1274 1134 -2921102564.1 +1279 1134 -5.125e7 +1280 1134 -837525641.026 +1135 1135 4.688e9 +1144 1135 2.344e8 +1145 1135 1.172e9 +1136 1136 4054896634.61 +1137 1136 5.58793544769e-9 +1138 1136 -4.76837158203e-7 +1146 1136 -1931695112.18 +1147 1136 -6.17001205683e-9 +1271 1136 -962833934.294 +1272 1136 -266927.083333 +1275 1136 1973544471.15 +1276 1136 -2.91038304567e-9 +1277 1136 -49177864.0697 +1282 1136 -962833934.294 +1283 1136 266927.083333 +1284 1136 102038543.721 +1287 1136 -49177864.0697 +1137 1137 35969506623.9 +1138 1137 -1798456233.97 +1146 1137 -2.32830643654e-10 +1147 1137 8992310550.21 +1271 1137 -266927.083333 +1272 1137 -43556.3568376 +1275 1137 -2.09547579288e-9 +1276 1137 -306436.965812 +1277 1137 5773.23717949 +1282 1137 266927.083333 +1283 1137 -43556.3568376 +1287 1137 -5773.23717949 +1138 1138 405799985.539 +1139 1138 -1.02445483208e-8 +1140 1138 -244537108.699 +1141 1138 500862.367809 +1142 1138 -1.83936208487e-8 +1143 1138 9613227.90607 +1144 1138 2.38418579102e-7 +1147 1138 -1985115010.73 +1148 1138 -557679.138131 +1149 1138 2.23517417908e-8 +1150 1138 -242498.818309 +1151 1138 523194.305331 +1152 1138 6.75208866596e-9 +1153 1138 -109621156.379 +1154 1138 -14075464.5218 +1155 1138 3.27825546265e-7 +1156 1138 -2.98023223877e-8 +1157 1138 9.31322574615e-10 +1158 1138 -186658776.757 +1275 1138 49177864.0697 +1276 1138 5773.23717949 +1277 1138 -12198064.757 +1278 1138 -96408.5799114 +1279 1138 387184.231513 +1280 1138 3741313.46284 +1281 1138 2909730.02681 +1282 1138 -51217666.9529 +1283 1138 6322.4009679 +1284 1138 2597946.27194 +1285 1138 125215.588245 +1286 1138 -46056.6716788 +1300 1138 -139419.927003 +1301 1138 -98556.5817522 +1302 1138 -15620608.0643 +1303 1138 1075891.57521 +1304 1138 -51131283.9922 +1305 1138 -2759415.04091 +1306 1138 549.163788417 +1307 1138 -60624.7757827 +1308 1138 130798.576333 +1309 1138 -48204.4812381 +1139 1139 127911.420342 +1140 1139 -3.25962901115e-9 +1141 1139 -4.19095158577e-9 +1142 1139 63953.7755238 +1143 1139 -3.72529029846e-9 +1148 1139 9.98619943857e-9 +1149 1139 63293.5180843 +1150 1139 1.86264514923e-9 +1151 1139 -1.30385160446e-8 +1152 1139 31645.8356908 +1153 1139 7.24010169506e-10 +1154 1139 1.07102096081e-8 +1277 1139 96408.5799114 +1278 1139 -63953.5848618 +1279 1139 -125999.577581 +1284 1139 58942.9802793 +1285 1139 126000.081471 +1286 1139 -31977.7597544 +1300 1139 -102888.86964 +1301 1139 -31646.9790189 +1302 1139 -4258.78562987 +1303 1139 -62999.7874241 +1307 1139 -48204.4833749 +1308 1139 63000.0395338 +1309 1139 -15823.9511852 +1140 1140 491269895.823 +1141 1140 60180.2473303 +1142 1140 -5.4482370615e-8 +1143 1140 -591133.993006 +1147 1140 1798456233.97 +1148 1140 -315729.068649 +1149 1140 2.37487256527e-8 +1150 1140 -1187132.5409 +1151 1140 30407.6331939 +1152 1140 5.4482370615e-8 +1153 1140 -38451.3142277 +1154 1140 -568806.423487 +1271 1140 49177864.0697 +1272 1140 5773.23717949 +1275 1140 -102038543.721 +1277 1140 2597946.27194 +1278 1140 -58942.9802793 +1279 1140 -147783.501959 +1282 1140 49177864.0697 +1283 1140 -5773.23717949 +1284 1140 -4930266.87181 +1285 1140 15045.0617314 +1286 1140 -209999.302447 +1287 1140 2598459.19106 +1288 1140 132738.436863 +1289 1140 -50352.2246647 +1300 1140 -78932.3383675 +1301 1140 -54647.6355384 +1302 1140 -9612.82855692 +1303 1140 -142201.605872 +1307 1140 -296783.41984 +1308 1140 7601.91314346 +1309 1140 -205704.584994 +1310 1140 -69672.9115941 +1311 1140 134599.695958 +1312 1140 -50352.4325477 +1141 1141 1765325.24996 +1142 1141 -5.21540641785e-8 +1143 1141 -882661.172868 +1148 1141 -538657.566102 +1149 1141 2.37487256527e-8 +1150 1141 30407.6331939 +1151 1141 891973.080646 +1152 1141 -1.83936208487e-8 +1153 1141 -30148.8573842 +1154 1141 -445989.01456 +1277 1141 125215.588245 +1278 1141 -126000.081471 +1279 1141 -220665.436925 +1284 1141 15045.0617314 +1285 1141 441331.024698 +1286 1141 -.00335299829021 +1287 1141 -140260.653341 +1288 1141 -220665.061356 +1289 1141 126000.084971 +1300 1141 -134664.386712 +1301 1141 -63000.0447796 +1302 1141 -7537.21915954 +1303 1141 -111497.324845 +1307 1141 7601.91314345 +1308 1141 222993.127544 +1309 1141 .00349915609695 +1310 1141 134599.695958 +1311 1141 -111496.902718 +1312 1141 63000.0411343 +1142 1142 255823.276853 +1143 1142 3.53902578354e-8 +1148 1142 1.9801966846e-8 +1149 1142 31645.6681688 +1150 1142 5.30853867531e-8 +1151 1142 -2.53785401583e-8 +1152 1142 126587.249477 +1153 1142 2.54977494478e-9 +1154 1142 3.77185642719e-8 +1277 1142 46056.6716788 +1278 1142 -31977.7597544 +1279 1142 -126000.086717 +1284 1142 209999.302447 +1285 1142 .00335298664868 +1286 1142 -127907.167024 +1287 1142 54647.4275314 +1288 1142 126000.083218 +1289 1142 -31977.8123084 +1300 1142 -50388.8346629 +1301 1142 -15824.0349462 +1302 1142 -4258.80301229 +1303 1142 -63000.0445605 +1307 1142 -205704.589289 +1308 1142 .00349914655089 +1309 1142 -63294.0667687 +1310 1142 -50352.4346941 +1311 1142 63000.0412075 +1312 1142 -15824.0319165 +1143 1143 440222091.302 +1144 1143 -4.76837158203e-7 +1147 1143 -2737601223.52 +1148 1143 538655.492471 +1149 1143 -3.00351530314e-8 +1150 1143 523194.305331 +1151 1143 -445988.791197 +1152 1143 -2.00234353542e-8 +1153 1143 -13522123.6535 +1154 1143 -306978007.039 +1155 1143 -2.23517417908e-8 +1156 1143 -2.38418579102e-7 +1158 1143 -2737601223.52 +1273 1143 -14151923.0769 +1274 1143 5.125e7 +1277 1143 387184.231513 +1278 1143 125999.577581 +1279 1143 -9015729.85944 +1280 1143 -4005095.22294 +1281 1143 42675092.0579 +1282 1143 -2909730.02681 +1283 1143 8054.22324738 +1284 1143 -147783.501959 +1285 1143 -220665.436925 +1286 1143 126000.086717 +1300 1143 134663.881575 +1301 1143 62999.7926699 +1302 1143 1214226.78384 +1303 1143 2115175.41558 +1304 1143 3486301.3802 +1305 1143 -40470521.2551 +1306 1143 8054.22324738 +1307 1143 130798.576333 +1308 1143 -111497.269005 +1309 1143 63000.0393147 +1144 1144 7078322184.36 +1145 1144 256255479.713 +1146 1144 320539912.677 +1153 1144 -1.19209289551e-7 +1154 1144 7.45058059692e-9 +1155 1144 1688223882.95 +1156 1144 21855479.7126 +1157 1144 320539912.677 +1273 1144 5.125e7 +1274 1144 -837525641.026 +1277 1144 -3741313.46284 +1279 1144 4005095.22294 +1280 1144 -3243836024.77 +1302 1144 -51131283.9922 +1303 1144 3486301.3802 +1304 1144 -980810342.222 +1145 1145 4179164103.46 +1146 1145 138357415.597 +1147 1145 -3.72529029846e-9 +1154 1145 -2.38418579102e-7 +1155 1145 -21855479.7126 +1156 1145 -1693703191.46 +1157 1145 247224839.964 +1158 1145 -4.7730281949e-9 +1277 1145 -2909730.02681 +1279 1145 -42675092.0579 +1281 1145 822508428.883 +1282 1145 -56081366.376 +1283 1145 19486.007619 +1302 1145 2759415.04091 +1303 1145 40470521.2551 +1305 1145 -793849008.447 +1306 1145 266308.770792 +1146 1146 5882375753.14 +1147 1146 9.31322574615e-9 +1153 1146 9.31322574615e-10 +1154 1146 2.98023223877e-8 +1155 1146 -320539912.677 +1156 1146 247224839.964 +1157 1146 1915323939.14 +1158 1146 3.27418092638e-10 +1275 1146 -962833934.294 +1276 1146 -266927.083333 +1277 1146 51217666.9529 +1279 1146 2909730.02681 +1281 1146 -56081366.376 +1282 1146 990596050.074 +1283 1146 -20859.8709528 +1284 1146 -49177864.0697 +1302 1146 -188146.115539 +1303 1146 -2759415.04091 +1305 1146 54127271.5593 +1306 1146 -18157.8196885 +1147 1147 50988921904.1 +1153 1147 186658776.757 +1154 1147 2737601223.52 +1156 1147 -4.65661287308e-10 +1157 1147 3.63797880709e-11 +1158 1147 16502004785 +1275 1147 -266927.083333 +1276 1147 -43556.3568376 +1277 1147 6322.4009679 +1279 1147 8054.22324738 +1281 1147 -19486.007619 +1282 1147 20859.8709528 +1283 1147 -365167.859242 +1284 1147 -5773.23717949 +1302 1147 -549.163788417 +1303 1147 -8054.22324738 +1305 1147 266308.770792 +1306 1147 -66219.1364756 +1148 1148 865951.700196 +1149 1148 -3.02918255329e-8 +1150 1148 434548.166296 +1151 1148 46360.5270536 +1152 1148 -1.92001461983e-8 +1153 1148 -3133.98761478 +1154 1148 -46360.7635322 +1159 1148 -270288.660567 +1160 1148 1.82313844562e-8 +1161 1148 -115667.432407 +1162 1148 562131.091828 +1163 1148 3.06535512209e-9 +1164 1148 -37999.9132709 +1165 1148 -562128.89454 +1277 1148 -139419.927003 +1278 1148 102888.86964 +1279 1148 134663.881575 +1284 1148 -78932.3383675 +1285 1148 -134664.386712 +1286 1148 50388.8346629 +1300 1148 216487.506679 +1301 1148 223.995963975 +1302 1148 -783.494995224 +1303 1148 -11590.1626512 +1307 1148 108636.83352 +1308 1148 11590.149338 +1309 1148 -6338.50750891 +1323 1148 -67572.4404121 +1324 1148 -96214.3623491 +1325 1148 -9499.97721747 +1326 1148 -140532.207359 +1344 1148 -28916.9951293 +1345 1148 140532.78222 +1346 1148 -50276.8313041 +1149 1149 374460.402373 +1150 1149 -2.21189111471e-8 +1151 1149 1.8160790205e-8 +1152 1149 187223.8496 +1153 1149 -2.77012586594e-9 +1154 1149 -4.09781932831e-8 +1159 1149 5.95264136791e-9 +1160 1149 121803.558715 +1161 1149 -2.09547579288e-9 +1162 1149 -1.76951289177e-8 +1163 1149 60899.6521431 +1164 1149 5.66616654396e-10 +1165 1149 8.38190317154e-9 +1277 1149 98556.5817522 +1278 1149 -31646.9790189 +1279 1149 -62999.7926699 +1284 1149 54647.6355384 +1285 1149 63000.0447796 +1286 1149 -15824.0349462 +1300 1149 -223.995963991 +1301 1149 -187224.669433 +1302 1149 -26025.9133 +1303 1149 -384998.717456 +1307 1149 19687.5164295 +1308 1149 385000.257122 +1309 1149 -93615.5105096 +1323 1149 -96364.8662621 +1324 1149 -60900.7113514 +1325 1149 -8754.17065987 +1326 1149 -129499.565974 +1344 1149 -41522.6300342 +1345 1149 129500.0842 +1346 1149 -30451.419283 +1150 1150 1738559.48927 +1151 1150 191994.392456 +1152 1150 -7.96280801296e-8 +1153 1150 -9734.12608842 +1154 1150 -143995.948053 +1159 1150 -153530.567528 +1160 1150 1.55996531248e-8 +1161 1150 -538262.713177 +1162 1150 66803.3716809 +1163 1150 1.95577740669e-8 +1164 1150 -40296.536819 +1165 1150 -596102.615665 +1277 1150 -60624.7757827 +1278 1150 48204.4833749 +1279 1150 130798.576333 +1284 1150 -296783.41984 +1285 1150 7601.91314344 +1286 1150 205704.589289 +1287 1150 -78979.2030845 +1288 1150 -138400.486246 +1289 1150 52500.0361274 +1300 1150 108636.83352 +1301 1150 -19687.5164296 +1302 1150 -2433.53225658 +1303 1150 -35998.9978784 +1307 1150 434639.039371 +1308 1150 47998.5977878 +1309 1150 -.00653399946168 +1310 1150 107840.373884 +1311 1150 -11999.6097904 +1312 1150 6562.50109771 +1323 1150 -38382.7789096 +1324 1150 -54766.9844821 +1325 1150 -10074.1342047 +1326 1150 -149025.653916 +1344 1150 -134566.226008 +1345 1150 16700.8522442 +1346 1150 -192579.573976 +1357 1150 -29273.8425731 +1358 1150 132324.807888 +1359 1150 -45937.5284672 +1151 1151 5631840.98232 +1152 1151 -1.18743628264e-7 +1153 1151 -190356.475107 +1154 1151 -2815924.18798 +1159 1151 -529869.62189 +1160 1151 3.35276126862e-8 +1161 1151 66803.3716808 +1162 1151 1959551.44993 +1163 1151 -1.62981450558e-8 +1164 1151 -66232.9937755 +1165 1151 -979778.01443 +1277 1151 130798.576333 +1278 1151 -63000.0395339 +1279 1151 -111497.269005 +1284 1151 7601.91314344 +1285 1151 222993.127544 +1286 1151 -.00349915702827 +1287 1151 -138400.486246 +1288 1151 -111496.921331 +1289 1151 63000.0428869 +1300 1151 11590.149338 +1301 1151 -385000.257122 +1302 1151 -47589.1472164 +1303 1151 -703981.467699 +1307 1151 47998.5977878 +1308 1151 1407959.40307 +1309 1151 .000669685658067 +1310 1151 -11999.6097904 +1311 1151 -703977.760952 +1312 1151 385000.256899 +1323 1151 -132467.396209 +1324 1151 -129500.089111 +1325 1151 -16558.2577069 +1326 1151 -244944.640635 +1344 1151 16700.8522441 +1345 1151 489887.588031 +1346 1151 .00327597698197 +1357 1151 132324.807888 +1358 1151 -244943.73766 +1359 1151 129500.085535 +1152 1152 748922.770023 +1153 1152 2.20350921154e-9 +1154 1152 3.25962901115e-8 +1159 1152 1.03313475847e-8 +1160 1152 60899.4846199 +1161 1152 2.04890966415e-8 +1162 1152 -5.77419996262e-8 +1163 1152 243607.55651 +1164 1152 2.70716845989e-9 +1165 1152 4.00468707085e-8 +1277 1152 48204.4812381 +1278 1152 -15823.9511852 +1279 1152 -63000.0393148 +1284 1152 205704.584994 +1285 1152 -.00349915539846 +1286 1152 -63294.0667688 +1287 1152 52500.0339811 +1288 1152 63000.04296 +1289 1152 -15824.0598354 +1300 1152 6338.5075089 +1301 1152 -93615.5105096 +1302 1152 -26026.0173588 +1303 1152 -385000.256788 +1307 1152 .00653395801783 +1308 1152 -.000669714063406 +1309 1152 -374450.330591 +1310 1152 6562.50766211 +1311 1152 385000.257011 +1312 1152 -93615.9995546 +1323 1152 -46012.7828802 +1324 1152 -30451.5030446 +1325 1152 -8754.20599346 +1326 1152 -129500.088661 +1344 1152 -192579.582806 +1345 1152 .00327597046271 +1346 1152 -121801.6459 +1357 1152 -45937.5328796 +1358 1152 129500.085685 +1359 1152 -30451.5560596 +1153 1153 277891229.259 +1154 1153 5672759.20315 +1155 1153 -2.38418579102e-7 +1156 1153 -2.98023223877e-8 +1157 1153 1.86264514923e-9 +1158 1153 142947910.948 +1159 1153 35819.0407201 +1160 1153 -2.864561975e-9 +1161 1153 33522.7124491 +1162 1153 -66232.978676 +1163 1153 -1.66837126017e-9 +1164 1153 -13046340.9895 +1165 1153 -1562075.02303 +1166 1153 3.8743019104e-7 +1169 1153 -44176298.9934 +1277 1153 -15620608.0643 +1278 1153 4258.78562987 +1279 1153 1214226.78384 +1280 1153 51131283.9922 +1281 1153 -2759415.04091 +1282 1153 188146.115539 +1283 1153 -549.163788417 +1284 1153 -9612.82855692 +1285 1153 -7537.21915954 +1286 1153 4258.80301229 +1300 1153 -783.494995223 +1301 1153 26025.9133 +1302 1153 -34306895.0629 +1303 1153 2155868.06755 +1304 1153 .571871310472 +1305 1153 4482459.4665 +1306 1153 267.299544403 +1307 1153 -2433.53225658 +1308 1153 -47589.1472164 +1309 1153 26026.0173588 +1323 1153 8954.7612803 +1324 1153 8754.17099186 +1325 1153 -27463048.6159 +1326 1153 1954248.43917 +1327 1153 -51131291.8077 +1328 1153 -1263758.79445 +1329 1153 816.463332821 +1344 1153 8380.67811227 +1345 1153 -16558.2539321 +1346 1153 8754.20566147 +1154 1154 349947507.523 +1155 1154 1.49011611938e-8 +1156 1154 -2.38418579102e-7 +1157 1154 2.98023223877e-8 +1158 1154 2089416756.32 +1159 1154 529867.466274 +1160 1154 -4.2375177145e-8 +1161 1154 495898.113152 +1162 1154 -979777.791065 +1163 1154 -2.46800482273e-8 +1164 1154 -1562075.02303 +1165 1154 -35842129.6274 +1166 1154 -2.60770320892e-8 +1169 1154 -647926056.509 +1277 1154 1075891.57521 +1278 1154 62999.7874241 +1279 1154 2115175.41558 +1280 1154 -3486301.3802 +1281 1154 -40470521.2551 +1282 1154 2759415.04091 +1283 1154 -8054.22324738 +1284 1154 -142201.605872 +1285 1154 -111497.324845 +1286 1154 63000.0445605 +1300 1154 -11590.1626512 +1301 1154 384998.717456 +1302 1154 2155868.06755 +1303 1154 -2828366.30382 +1304 1154 8.38739082776 +1305 1154 65742039.8791 +1306 1154 3920.7017593 +1307 1154 -35998.9978784 +1308 1154 -703981.467699 +1309 1154 385000.256788 +1323 1154 132466.882845 +1324 1154 129499.570885 +1325 1154 1954248.43917 +1326 1154 1068426.10716 +1327 1154 3486186.75252 +1328 1154 -18535329.3672 +1329 1154 11974.9250067 +1344 1154 123974.528288 +1345 1154 -244944.584794 +1346 1154 129500.08375 +1155 1155 11477594011.2 +1156 1155 -17148564.6377 +1157 1155 -244419574.061 +1164 1155 -2.98023223877e-7 +1165 1155 2.04890966415e-8 +1166 1155 3725894088.9 +1167 1155 5172348.25889 +1168 1155 75861927.9261 +1277 1155 51131283.9922 +1279 1155 -3486301.3802 +1280 1155 -980810342.222 +1302 1155 -.571871221065 +1303 1155 -8.38739083428 +1304 1155 -5542198822.7 +1325 1155 -51131291.8077 +1326 1155 3486186.75252 +1327 1155 -1922836059.47 +1156 1156 2861275722.22 +1157 1156 190041282.121 +1158 1156 5.58793544769e-9 +1166 1156 -5172348.25889 +1167 1156 -764006229.618 +1168 1156 116179614.56 +1169 1156 -4.07453626394e-9 +1277 1156 2759415.04091 +1279 1156 40470521.2551 +1281 1156 -793849008.447 +1282 1156 54127271.5593 +1283 1156 -266308.770792 +1302 1156 -4482459.4665 +1303 1156 -65742039.8791 +1305 1156 1252626923.21 +1306 1156 .00297848985065 +1325 1156 1263758.79445 +1326 1156 18535329.3672 +1328 1156 -371207454.429 +1329 1156 266308.811499 +1157 1157 5734990149.32 +1158 1157 -3.49245965481e-10 +1166 1157 -75861927.9261 +1167 1157 116179614.56 +1168 1157 932058620.352 +1169 1157 2.76486389339e-10 +1277 1157 -188146.115539 +1279 1157 -2759415.04091 +1281 1157 54127271.5593 +1282 1157 -3690577.79915 +1283 1157 18157.8196885 +1302 1157 305625.485774 +1303 1157 4482459.4665 +1305 1157 -85407310.3125 +1306 1157 .0436843276766 +1325 1157 -86164.4408314 +1326 1157 -1263758.79445 +1328 1157 25309325.5483 +1329 1157 -18157.2226694 +1158 1158 49078660028.4 +1164 1158 44176298.9934 +1165 1158 647926056.509 +1169 1158 8028308519.87 +1277 1158 549.163788417 +1279 1158 8054.22324738 +1281 1158 -266308.770792 +1282 1158 18157.8196885 +1283 1158 -66219.1364756 +1302 1158 267.299544403 +1303 1158 3920.7017593 +1305 1158 -.00297849369235 +1306 1158 -744783.215535 +1325 1158 -816.463332821 +1326 1158 -11974.9250067 +1328 1158 266308.811499 +1329 1158 -184697.186945 +1159 1159 518005.955707 +1160 1159 -2.50935554504e-8 +1161 1159 261298.527443 +1162 1159 67627.647581 +1163 1159 -1.54059380293e-8 +1164 1159 -4571.64122395 +1165 1159 -67627.8287567 +1170 1159 -245434.953487 +1171 1159 1.67779624462e-8 +1172 1159 -103185.437932 +1173 1159 563762.124492 +1174 1159 2.67513096332e-9 +1175 1159 -38110.1712081 +1176 1159 -563759.929115 +1300 1159 -67572.4404121 +1301 1159 96364.8662621 +1302 1159 8954.7612803 +1303 1159 132466.882845 +1307 1159 -38382.7789096 +1308 1159 -132467.396209 +1309 1159 46012.7828802 +1323 1159 129500.963556 +1324 1159 300.994571214 +1325 1159 -1142.90791609 +1326 1159 -16906.9218356 +1330 1159 -61358.9884017 +1331 1159 -87385.2564527 +1332 1159 -9527.54180266 +1333 1159 -140939.967495 +1344 1159 65324.3705898 +1345 1159 16906.9338658 +1346 1159 -8528.11010263 +1347 1159 -25796.4839459 +1348 1159 140940.539537 +1349 1159 -45862.2783615 +1160 1160 464879.98722 +1161 1160 -1.25728547573e-8 +1162 1160 2.60770320892e-8 +1163 1160 232430.727193 +1164 1160 -3.77744436264e-9 +1165 1160 -5.58793544769e-8 +1170 1160 7.47554004192e-9 +1171 1160 110635.28095 +1172 1160 -2.09547579288e-9 +1173 1160 -1.67638063431e-8 +1174 1160 55315.2897779 +1175 1160 4.40701842308e-10 +1176 1160 6.51925802231e-9 +1300 1160 96214.3623491 +1301 1160 -60900.7113514 +1302 1160 -8754.17099186 +1303 1160 -129499.570885 +1307 1160 54766.9844821 +1308 1160 129500.089111 +1309 1160 -30451.5030446 +1323 1160 -300.994571227 +1324 1160 -232433.041269 +1325 1160 -35016.6833491 +1326 1160 -517998.274395 +1330 1160 -87535.7603657 +1331 1160 -55316.386255 +1332 1160 -8754.17067509 +1333 1160 -129499.5662 +1344 1160 26488.722105 +1345 1160 518000.345946 +1346 1160 -116221.153843 +1347 1160 -37108.0770763 +1348 1160 129500.084425 +1349 1160 -27659.3684761 +1161 1161 1045720.08054 +1162 1161 280073.407013 +1163 1161 -5.07570803165e-8 +1164 1161 -14199.6262899 +1165 1161 -210053.643341 +1170 1161 -141048.573053 +1171 1161 1.60653144121e-8 +1172 1161 -488319.191395 +1173 1161 73558.2255338 +1174 1161 2.28174030781e-8 +1175 1161 -40638.998738 +1176 1161 -601168.620385 +1300 1161 -28916.9951293 +1301 1161 41522.6300342 +1302 1161 8380.67811227 +1303 1161 123974.528288 +1307 1161 -134566.226008 +1308 1161 16700.8522441 +1309 1161 192579.582806 +1310 1161 -38580.9538854 +1311 1161 -140675.374316 +1312 1161 50352.4358261 +1323 1161 65324.3705898 +1324 1161 -26488.722105 +1325 1161 -3549.90747404 +1326 1161 -52513.4241721 +1330 1161 -35262.2677262 +1331 1161 -50352.4315242 +1332 1161 -10159.7496845 +1333 1161 -150292.155096 +1344 1161 261428.974172 +1345 1161 70018.3517532 +1346 1161 -.00879107695073 +1347 1161 -122080.295339 +1348 1161 18389.5648524 +1349 1161 -174920.662203 +1357 1161 64161.4143731 +1358 1161 -17504.939443 +1359 1161 8829.80147696 +1360 1161 -26181.1339249 +1361 1161 131902.59589 +1362 1161 -41522.6255194 +1162 1162 8215429.18195 +1163 1162 -1.210719347e-7 +1164 1162 -277681.290922 +1165 1162 -4107711.40417 +1170 1162 -528238.589226 +1171 1162 4.09781932831e-8 +1172 1162 73558.2255338 +1173 1162 2157696.65917 +1174 1162 -3.632158041e-8 +1175 1162 -72930.0311583 +1176 1162 -1078846.61477 +1300 1162 140532.78222 +1301 1162 -129500.0842 +1302 1162 -16558.2539321 +1303 1162 -244944.584794 +1307 1162 16700.8522441 +1308 1162 489887.588031 +1309 1162 -.00327598303556 +1310 1162 -140675.374316 +1311 1162 -244943.756274 +1312 1162 129500.087176 +1323 1162 16906.9338658 +1324 1162 -518000.345946 +1325 1162 -69420.358038 +1326 1162 -1026928.37334 +1330 1162 -132059.638893 +1331 1162 -129500.088886 +1332 1162 -18232.5162033 +1333 1162 -269711.778155 +1344 1162 70018.3517532 +1345 1162 2053856.24953 +1346 1162 .000901185907423 +1347 1162 18389.5648524 +1348 1162 539423.915505 +1349 1162 .00297559658065 +1357 1162 -17504.939443 +1358 1162 -1026928.49556 +1359 1162 518000.345646 +1360 1162 131902.59589 +1361 1162 -269712.856857 +1362 1162 129500.08561 +1163 1163 929759.960568 +1164 1163 2.83308327198e-9 +1165 1163 4.19095158577e-8 +1170 1163 1.24648213386e-8 +1171 1163 55315.1222547 +1172 1163 2.65426933765e-8 +1173 1163 -3.25962901115e-8 +1174 1163 221270.115198 +1175 1163 2.20350921154e-9 +1176 1163 3.25962901115e-8 +1300 1163 50276.8313041 +1301 1163 -30451.419283 +1302 1163 -8754.20566147 +1303 1163 -129500.08375 +1307 1163 192579.573976 +1308 1163 -.00327597139403 +1309 1163 -121801.6459 +1310 1163 50352.4314138 +1311 1163 129500.087326 +1312 1163 -30451.5839809 +1323 1163 8528.11010263 +1324 1163 -116221.153842 +1325 1163 -35016.8233555 +1326 1163 -518000.345496 +1330 1163 -41598.2299375 +1331 1163 -27659.4522377 +1332 1163 -8754.20597824 +1333 1163 -129500.088435 +1344 1163 .00879105133936 +1345 1163 -.000901188701391 +1346 1163 -464866.089473 +1347 1163 -174920.671033 +1348 1163 .0029755923897 +1349 1163 -110632.553125 +1357 1163 8829.81030933 +1358 1163 518000.345796 +1359 1163 -116221.146907 +1360 1163 -41522.6299317 +1361 1163 129500.08576 +1362 1163 -27659.2837279 +1164 1164 234359233.387 +1165 1164 -10599977.5743 +1167 1164 -7.45058059692e-9 +1169 1164 -4.05330501962e-6 +1170 1164 35708.7827829 +1171 1164 -3.27378511429e-9 +1172 1164 33180.2505301 +1173 1164 -72930.0160589 +1174 1164 -1.51097774506e-9 +1175 1164 -13045888.2696 +1176 1164 -1555377.98288 +1177 1164 3.8743019104e-7 +1180 1164 -44176298.9934 +1300 1164 -9499.97721747 +1301 1164 8754.17065987 +1302 1164 -27463048.6159 +1303 1164 1954248.43917 +1304 1164 51131291.8077 +1305 1164 -1263758.79445 +1306 1164 -816.463332821 +1307 1164 -10074.1342048 +1308 1164 -16558.2577069 +1309 1164 8754.20599346 +1323 1164 -1142.90791609 +1324 1164 35016.6833491 +1325 1164 -49186384.0026 +1326 1164 3261177.42942 +1328 1164 3145458.87938 +1329 1164 7.27595761418e-11 +1330 1164 8927.19669511 +1331 1164 8754.17097664 +1332 1164 -27462935.4358 +1333 1164 1955922.70006 +1334 1164 -51131291.8077 +1335 1164 -1263758.79445 +1336 1164 816.463332821 +1344 1164 -3549.90747404 +1345 1164 -69420.358038 +1346 1164 35016.8233555 +1347 1164 8295.06263252 +1348 1164 -18232.5124284 +1349 1164 8754.20567669 +1165 1165 79649102.6476 +1167 1165 -1.19209289551e-7 +1168 1165 7.45058059692e-9 +1170 1165 528236.4317 +1171 1165 -4.842877388e-8 +1172 1165 490832.108433 +1173 1165 -1078846.3914 +1174 1165 -2.23517417908e-8 +1175 1165 -1555377.98288 +1176 1165 -35743060.9861 +1177 1165 -2.60770320892e-8 +1180 1165 -647926056.509 +1300 1165 -140532.207359 +1301 1165 129499.565974 +1302 1165 1954248.43917 +1303 1165 1068426.10716 +1304 1165 -3486186.75252 +1305 1165 -18535329.3672 +1306 1165 -11974.9250067 +1307 1165 -149025.653916 +1308 1165 -244944.640635 +1309 1165 129500.088661 +1323 1165 -16906.9218356 +1324 1165 517998.274395 +1325 1165 3261177.42942 +1326 1165 -1568822.76298 +1327 1165 -2.32830643654e-8 +1328 1165 46133895.6425 +1330 1165 132059.122709 +1331 1165 129499.57066 +1332 1165 1955922.70006 +1333 1165 1093193.28007 +1334 1165 3486186.75252 +1335 1165 -18535329.3672 +1336 1165 11974.9250067 +1344 1165 -52513.4241721 +1345 1165 -1026928.37334 +1346 1165 518000.345496 +1347 1165 122708.027108 +1348 1165 -269711.722314 +1349 1165 129500.083975 +1166 1166 1.527521238e10 +1167 1166 4.76837158203e-7 +1175 1166 -2.98023223877e-7 +1176 1166 2.04890966415e-8 +1177 1166 3725894088.9 +1178 1166 5172348.2589 +1179 1166 75861927.9261 +1302 1166 51131291.8077 +1303 1166 -3486186.75252 +1304 1166 -1922836059.47 +1326 1166 2.32830643654e-8 +1327 1166 -7517828159.96 +1332 1166 -51131291.8077 +1333 1166 3486186.75252 +1334 1166 -1922836059.47 +1167 1167 2025397344.36 +1168 1167 118261594.932 +1169 1167 1.86264514923e-9 +1177 1167 -5172348.2589 +1178 1167 -764006229.618 +1179 1167 116179614.56 +1180 1167 -4.07453626394e-9 +1302 1167 1263758.79445 +1303 1167 18535329.3672 +1305 1167 -371207454.429 +1306 1167 -266308.811499 +1325 1167 -3145458.87938 +1326 1167 -46133895.6425 +1328 1167 860236988.662 +1329 1167 -3.14321368933e-9 +1332 1167 1263758.79445 +1333 1167 18535329.3672 +1335 1167 -371207454.429 +1336 1167 266308.811499 +1168 1168 3751856284.9 +1169 1168 -1.16415321827e-10 +1177 1168 -75861927.9261 +1178 1168 116179614.56 +1179 1168 932058620.352 +1180 1168 2.76486389339e-10 +1302 1168 -86164.4408314 +1303 1168 -1263758.79445 +1305 1168 25309325.5483 +1306 1168 18157.2226694 +1325 1168 214460.786893 +1326 1168 3145458.87938 +1328 1168 -58651887.8729 +1329 1168 9.45874489844e-11 +1332 1168 -86164.4408315 +1333 1168 -1263758.79445 +1335 1168 25309325.5483 +1336 1168 -18157.2226694 +1169 1169 32113887837.3 +1175 1169 44176298.9934 +1176 1169 647926056.509 +1180 1169 8028308519.87 +1302 1169 816.463332821 +1303 1169 11974.9250067 +1305 1169 -266308.811499 +1306 1169 -184697.186945 +1325 1169 7.27595761418e-11 +1328 1169 -1.16415321827e-9 +1329 1169 -1065667.6784 +1332 1169 -816.463332821 +1333 1169 -11974.9250067 +1335 1169 266308.811499 +1336 1169 -184697.186945 +1170 1170 451097.0415 +1171 1170 -1.4067441225e-8 +1172 1170 228198.163151 +1173 1170 78039.7292715 +1174 1170 -1.3342499733e-8 +1175 1170 -5275.49670076 +1176 1170 -78039.892023 +1181 1170 -241386.77409 +1182 1170 1.4978274703e-8 +1183 1170 -567462.645425 +1188 1170 -81856.231042 +1189 1170 567464.833224 +1190 1170 -2.6585534215e-9 +1323 1170 -61358.9884017 +1324 1170 87535.7603657 +1325 1170 8927.1966951 +1326 1170 132059.122709 +1330 1170 112773.76837 +1331 1170 313.59434957 +1332 1170 -1318.8719359 +1333 1170 -19509.9398802 +1337 1170 -60346.9344636 +1338 1170 -78191.4501587 +1339 1170 -141865.647053 +1344 1170 -35262.2677262 +1345 1170 -132059.638893 +1346 1170 41598.2299375 +1347 1170 57049.2961113 +1348 1170 19509.9529105 +1349 1170 -8873.91051248 +1350 1170 -20464.1781805 +1351 1170 141866.216446 +1352 1170 -41441.4252353 +1171 1171 436299.187114 +1172 1171 -5.82076609135e-9 +1173 1171 5.68106770515e-8 +1174 1171 218138.900333 +1175 1171 -6.42165541649e-9 +1176 1171 -9.49949026108e-8 +1181 1171 -1.39698386192e-9 +1182 1171 107041.873065 +1183 1171 -1.210719347e-8 +1188 1171 -7.21774995327e-9 +1189 1171 4.65661287308e-9 +1190 1171 53518.0785148 +1323 1171 87385.2564527 +1324 1171 -55316.386255 +1325 1171 -8754.17097664 +1326 1171 -129499.57066 +1330 1171 -313.594349578 +1331 1171 -218141.790724 +1332 1171 -36436.27862 +1333 1171 -538998.204438 +1337 1171 -87818.5227136 +1338 1171 -53519.2806113 +1339 1171 -139999.531442 +1344 1171 50352.4315243 +1345 1171 129500.088886 +1346 1171 -27659.4522378 +1347 1171 27562.5230014 +1348 1171 539000.359971 +1349 1171 -109076.241974 +1350 1171 -31977.4238183 +1351 1171 140000.091685 +1352 1171 -26761.0693146 +1172 1172 913395.922943 +1173 1172 323189.02841 +1174 1172 -4.42378222942e-8 +1175 1172 -16385.6595232 +1176 1172 -242391.413065 +1181 1172 -161135.207317 +1182 1172 1.53668224812e-8 +1183 1172 -612668.01245 +1188 1172 -402970.60421 +1189 1172 88889.7388374 +1190 1172 1.02445483208e-8 +1323 1172 -25796.4839459 +1324 1172 37108.0770763 +1325 1172 8295.06263252 +1326 1172 122708.027108 +1330 1172 57049.2961113 +1331 1172 -27562.5230014 +1332 1172 -4096.41572877 +1333 1172 -60597.8658102 +1337 1172 -40283.9222492 +1338 1172 -46295.5786264 +1339 1172 -153167.003112 +1344 1172 -122080.295339 +1345 1172 18389.5648524 +1346 1172 174920.671033 +1347 1172 228348.001203 +1348 1172 80797.2570304 +1349 1172 -.00914757419378 +1350 1172 -100743.132382 +1351 1172 22222.4429031 +1352 1172 -156545.649595 +1357 1172 -35488.2452373 +1358 1172 -141097.586315 +1359 1172 45937.5328783 +1360 1172 55706.857145 +1361 1172 -20199.4024249 +1362 1172 9187.50153679 +1363 1172 -20912.6812731 +1364 1172 130944.565672 +1365 1172 -36750.022154 +1173 1173 9480246.65238 +1174 1173 -1.64844095707e-7 +1175 1173 -320431.142337 +1176 1173 -4740105.65587 +1181 1173 -612668.01245 +1182 1173 4.09781932831e-8 +1183 1173 -1303729.76266 +1188 1173 88889.7388373 +1189 1173 2607464.32234 +1190 1173 -4.00468707085e-8 +1323 1173 140940.539537 +1324 1173 -129500.084425 +1325 1173 -18232.5124284 +1326 1173 -269711.722314 +1330 1173 19509.9529105 +1331 1173 -539000.359971 +1332 1173 -80107.8187207 +1333 1173 -1185026.90415 +1337 1173 -153167.003112 +1338 1173 -140000.095678 +1339 1173 -325932.561084 +1344 1173 18389.5648524 +1345 1173 539423.915505 +1346 1173 -.00297559192404 +1347 1173 80797.2570304 +1348 1173 2370060.68145 +1349 1173 .00093777384609 +1350 1173 22222.4429031 +1351 1173 651865.839396 +1352 1173 .00266296416521 +1357 1173 -141097.586315 +1358 1173 -269712.875471 +1359 1173 129500.0871 +1360 1173 -20199.4024249 +1361 1173 -1185034.41167 +1362 1173 539000.359659 +1363 1173 130944.565672 +1364 1173 -325933.923542 +1365 1173 140000.09269 +1174 1174 872595.594027 +1175 1174 4.02927398682e-9 +1176 1174 5.96046447754e-8 +1181 1174 1.16415321827e-8 +1182 1174 53517.9109923 +1183 1174 3.72529029846e-8 +1188 1174 1.8160790205e-8 +1189 1174 -4.74974513054e-8 +1190 1174 214083.262785 +1323 1174 45862.2783615 +1324 1174 -27659.3684761 +1325 1174 -8754.20567669 +1326 1174 -129500.083975 +1330 1174 8873.91051247 +1331 1174 -109076.241974 +1332 1174 -36436.4243024 +1333 1174 -539000.359503 +1337 1174 -46295.5833745 +1338 1174 -26761.1530758 +1339 1174 -140000.095191 +1344 1174 174920.662203 +1345 1174 -.00297559937462 +1346 1174 -110632.553125 +1347 1174 .00914754811674 +1348 1174 -.000937800854445 +1349 1174 -436282.207438 +1350 1174 -156545.65914 +1351 1174 .00266295671463 +1352 1174 -107038.324262 +1357 1174 45937.5284659 +1358 1174 129500.087251 +1359 1174 -27659.3116492 +1360 1174 9187.51072696 +1361 1174 539000.359815 +1362 1174 -109075.542903 +1363 1174 -36750.0269238 +1364 1174 140000.092853 +1365 1174 -26760.9752199 +1175 1175 233678289.036 +1176 1175 -11017545.7134 +1177 1175 -2.38418579102e-7 +1180 1175 6376917.77282 +1181 1175 -3883464.08563 +1182 1175 -3.33674252033e-9 +1183 1175 -1653027.31639 +1184 1175 4.17232513428e-7 +1185 1175 -7.45058059692e-9 +1187 1175 -37799381.2206 +1188 1175 32402.8916265 +1189 1175 -88132.1168562 +1190 1175 -2.51829624176e-10 +1323 1175 -9527.54180266 +1324 1175 8754.17067509 +1325 1175 -27462935.4358 +1326 1175 1955922.70006 +1327 1175 51131291.8077 +1328 1175 -1263758.79445 +1329 1175 -816.463332821 +1330 1175 -1318.8719359 +1331 1175 36436.27862 +1332 1175 -51403789.8076 +1333 1175 3427559.15644 +1334 1175 -.360276475549 +1335 1175 3059684.37739 +1336 1175 11.9831591097 +1337 1175 -29456737.5236 +1338 1175 9463.96859533 +1339 1175 2090613.66726 +1340 1175 -51131286.8839 +1341 1175 -1152925.69933 +1342 1175 78609.3564946 +1343 1175 828.44649193 +1344 1175 -10159.7496845 +1345 1175 -18232.5162033 +1346 1175 8754.20597824 +1347 1175 -4096.41572877 +1348 1175 -80107.8187207 +1349 1175 36436.4243024 +1350 1175 8100.72290661 +1351 1175 -22033.0373544 +1352 1175 9464.00616503 +1176 1176 72879453.0599 +1177 1176 1.49011611938e-8 +1178 1176 -1.19209289551e-7 +1180 1176 93540675.7944 +1181 1176 -1128493.601 +1182 1176 -4.93600964546e-8 +1183 1176 -28039183.8085 +1184 1176 -2.88709998131e-8 +1186 1176 -7.45058059692e-9 +1187 1176 -554385380.715 +1188 1176 479332.716368 +1189 1176 -1303729.53929 +1190 1176 -3.72529029846e-9 +1323 1176 -140939.967495 +1324 1176 129499.5662 +1325 1176 1955922.70006 +1326 1176 1093193.28007 +1327 1176 -3486186.75252 +1328 1176 -18535329.3672 +1329 1176 -11974.9250067 +1330 1176 -19509.9398802 +1331 1176 538998.204438 +1332 1176 3427559.15644 +1333 1176 -1356464.42966 +1334 1176 -5.28405669518 +1335 1176 44875402.1562 +1336 1176 175.502037358 +1337 1176 2221747.11041 +1338 1176 139999.535434 +1339 1176 1056679.10951 +1340 1176 3486258.96796 +1341 1176 -16909407.8294 +1342 1176 1152925.69933 +1343 1176 12150.427044 +1344 1176 -150292.155096 +1345 1176 -269711.778155 +1346 1176 129500.088435 +1347 1176 -60597.8658102 +1348 1176 -1185026.90415 +1349 1176 539000.359503 +1350 1176 119833.179092 +1351 1176 -325932.505243 +1352 1176 140000.091199 +1177 1177 15884263342.3 +1178 1177 -746666.957293 +1179 1177 -10952584.596 +1181 1177 -5.96046447754e-8 +1183 1177 4.65661287308e-9 +1184 1177 4038209197.08 +1185 1177 4425681.3016 +1186 1177 64909343.3301 +1325 1177 51131291.8077 +1326 1177 -3486186.75252 +1327 1177 -1922836059.47 +1332 1177 .360276713967 +1333 1177 5.28405667935 +1334 1177 -7827119137 +1337 1177 -51131286.8839 +1339 1177 3486258.96796 +1340 1177 -2074228117.67 +1178 1178 1973964763.99 +1179 1178 112156089.355 +1180 1178 1.86264514923e-9 +1183 1178 -1.19209289551e-7 +1184 1178 -4425681.3016 +1185 1178 -694445512.907 +1186 1178 106632439.78 +1187 1178 -4.7730281949e-9 +1325 1178 1263758.79445 +1326 1178 18535329.3672 +1328 1178 -371207454.429 +1329 1178 -266308.811499 +1332 1178 -3059684.37739 +1333 1178 -44875402.1562 +1335 1178 834107925.586 +1336 1178 -.00187644385733 +1337 1178 1152925.69933 +1339 1178 16909407.8294 +1341 1178 -340301826.683 +1342 1178 23202629.2978 +1343 1178 266308.785854 +1179 1179 3611275341.36 +1180 1179 -1.16415321827e-10 +1181 1179 9.31322574615e-10 +1183 1179 1.49011611938e-8 +1184 1179 -64909343.3301 +1185 1179 106632439.78 +1186 1179 862210831.613 +1187 1179 3.27418092638e-10 +1325 1179 -86164.4408315 +1326 1179 -1263758.79445 +1328 1179 25309325.5483 +1329 1179 18157.2226694 +1332 1179 208614.698486 +1333 1179 3059684.37739 +1335 1179 -56870953.333 +1336 1179 -.0275211283588 +1337 1179 -78609.3564946 +1339 1179 -1152925.69933 +1341 1179 23202629.2978 +1342 1179 -1582013.2721 +1343 1179 -18157.5987915 +1180 1180 30909791347.6 +1181 1180 37799381.2206 +1183 1180 554385380.715 +1185 1180 -4.65661287308e-10 +1186 1180 2.91038304567e-11 +1187 1180 7426247023.15 +1325 1180 816.463332821 +1326 1180 11974.9250067 +1328 1180 -266308.811499 +1329 1180 -184697.186945 +1332 1180 11.9831591097 +1333 1180 175.502037358 +1335 1180 .00187643768731 +1336 1180 -1113572.3197 +1337 1180 -828.44649193 +1339 1180 -12150.427044 +1341 1180 266308.785854 +1342 1180 -18157.5987915 +1343 1180 -202023.574818 +1181 1181 363266495.756 +1182 1181 -1.62981450558e-8 +1183 1181 -5215746.38546 +1184 1181 -4.76837158203e-7 +1186 1181 -191271235.442 +1187 1181 -1171014781.42 +1188 1181 -246110348.194 +1189 1181 -683398.926498 +1190 1181 2.79396772385e-9 +1194 1181 187846525.136 +1195 1181 -1209314508.66 +1330 1181 -60346.9344636 +1331 1181 87818.5227136 +1332 1181 -29456737.5236 +1333 1181 2221747.11041 +1334 1181 51131286.8839 +1335 1181 -1152925.69933 +1336 1181 -828.44649193 +1337 1181 -38441706.87 +1338 1181 92590.7891601 +1339 1181 1922423.0928 +1340 1181 -3741313.67444 +1341 1181 1486954.93769 +1342 1181 -253121601.267 +1343 1181 -6716335.162 +1347 1181 -40283.9222492 +1348 1181 -153167.003112 +1349 1181 46295.5833745 +1350 1181 11485992.1246 +1351 1181 -170849.737392 +1352 1181 51068.034595 +1355 1181 248489891.519 +1356 1181 -6715506.71551 +1182 1182 207557.745128 +1183 1182 -6.89178705216e-8 +1188 1182 -1.09430402517e-8 +1189 1182 4.65661287308e-8 +1190 1182 103772.75518 +1330 1182 78191.4501587 +1331 1182 -53519.2806113 +1332 1182 -9463.96859533 +1333 1182 -139999.535434 +1337 1182 -92590.7891601 +1338 1182 -103774.433202 +1339 1182 -279999.069115 +1347 1182 46295.5786264 +1348 1182 140000.095678 +1349 1182 -26761.1530759 +1350 1182 -22431.7154827 +1351 1182 280000.188872 +1352 1182 -51890.2752931 +1183 1183 8994909097.45 +1184 1183 -1.34e9 +1187 1183 554385380.715 +1188 1183 408597.434317 +1189 1183 -2686957.57405 +1190 1183 1.49011611938e-8 +1191 1183 -8542344551.28 +1192 1183 1.0875e8 +1330 1183 -141865.647053 +1331 1183 139999.531442 +1332 1183 2090613.66726 +1333 1183 1056679.10951 +1334 1183 -3486258.96796 +1335 1183 -16909407.8294 +1336 1183 -12150.427044 +1337 1183 1922423.0928 +1338 1183 279999.069115 +1339 1183 4130838380.3 +1340 1183 -112244907.88 +1341 1183 21808454.335 +1342 1183 -1486954.93769 +1343 1183 -12150.427044 +1347 1183 -153167.003112 +1348 1183 -325932.561084 +1349 1183 140000.095191 +1350 1183 102149.352812 +1351 1183 -671739.626716 +1352 1183 280000.18488 +1353 1183 -4535256410.26 +1354 1183 1.3875e9 +1184 1184 13002188379.5 +1185 1184 60380095.1266 +1186 1184 -64909343.3301 +1191 1184 -1.0875e8 +1192 1184 -1962242374.97 +1193 1184 65306122.449 +1332 1184 51131286.8839 +1333 1184 -3486258.96796 +1334 1184 -2074228117.67 +1337 1184 3741313.67444 +1339 1184 112244907.88 +1340 1184 -2224798463.61 +1353 1184 1.3875e9 +1354 1184 -3256868131.87 +1185 1185 1435420713.66 +1186 1185 53025291.8887 +1187 1185 7.45058059692e-9 +1192 1185 -65306122.449 +1193 1185 228571428.571 +1332 1185 1152925.69933 +1333 1185 16909407.8294 +1335 1185 -340301826.683 +1336 1185 -266308.785854 +1337 1185 -1486954.93769 +1339 1185 -21808454.335 +1341 1185 403989431.255 +1342 1185 -27545009.3966 +1343 1185 -19486.008721 +1186 1186 8071704966.57 +1187 1186 28658854.1667 +1188 1186 187846525.136 +1194 1186 -6189823312.53 +1195 1186 2324218.75 +1332 1186 -78609.3564946 +1333 1186 -1152925.69933 +1335 1186 23202629.2978 +1336 1186 18157.5987915 +1337 1186 253121601.267 +1339 1186 1486954.93769 +1341 1186 -27545009.3966 +1342 1186 4896795670.02 +1343 1186 -2342421.39521 +1350 1186 -248489891.519 +1355 1186 -4836023351.64 +1356 1186 -2.890625e7 +1187 1187 23266411523.8 +1188 1187 1209314508.66 +1194 1187 -2324218.75 +1195 1187 4309735337.25 +1332 1187 828.44649193 +1333 1187 12150.427044 +1335 1187 -266308.785854 +1336 1187 -202023.574818 +1337 1187 -6716335.162 +1339 1187 -12150.427044 +1341 1187 19486.008721 +1342 1187 2342421.39521 +1343 1187 115137744.425 +1350 1187 6715506.71551 +1355 1187 -2.890625e7 +1356 1187 -53619123.9316 +1188 1188 493365798.513 +1189 1188 183199.988441 +1190 1188 -1.11758708954e-8 +1194 1188 -382542470.883 +1195 1188 5.53138088435e-5 +1196 1188 -246198608.281 +1200 1188 187846525.136 +1201 1188 -1209314508.66 +1330 1188 -20464.1781805 +1331 1188 31977.4238183 +1332 1188 8100.72290661 +1333 1188 119833.179092 +1337 1188 11485992.1246 +1338 1188 22431.7154827 +1339 1188 102149.352812 +1342 1188 248489891.519 +1343 1188 6715506.71551 +1347 1188 -100743.132382 +1348 1188 22222.442903 +1349 1188 156545.65914 +1350 1188 -23294869.5017 +1351 1188 45799.9976098 +1352 1188 146999.505464 +1355 1188 -506040433.924 +1356 1188 2.14576721191e-6 +1360 1188 -30219.2760976 +1361 1188 -142055.616532 +1362 1188 41522.6301091 +1363 1188 11487553.5141 +1364 1188 -147949.355218 +1365 1188 41522.4783151 +1368 1188 248489891.519 +1369 1188 -6715506.71551 +1189 1189 5373923.61057 +1190 1189 -8.94069671631e-8 +1330 1189 141866.216446 +1331 1189 -140000.091685 +1332 1189 -22033.0373544 +1333 1189 -325932.505243 +1337 1189 -170849.737392 +1338 1189 -280000.188872 +1339 1189 -671739.626716 +1347 1189 22222.442903 +1348 1189 651865.839396 +1349 1189 -.00266296602786 +1350 1189 45799.9976098 +1351 1189 1343480.43563 +1352 1189 .00298771820962 +1360 1189 -142055.616532 +1361 1189 -325933.942156 +1362 1189 140000.094024 +1363 1189 125049.734986 +1364 1189 -671741.144715 +1365 1189 280000.186209 +1190 1190 415114.779096 +1330 1190 41441.4252353 +1331 1190 -26761.0693146 +1332 1190 -9464.00616503 +1333 1190 -140000.091199 +1337 1190 -51068.034595 +1338 1190 -51890.2752931 +1339 1190 -280000.18488 +1347 1190 156545.649595 +1348 1190 -.00266297161579 +1349 1190 -107038.324262 +1350 1190 -146999.505464 +1351 1190 -.00298772379756 +1352 1190 -207548.743351 +1360 1190 41522.6253393 +1361 1190 140000.094186 +1362 1190 -26761.0031396 +1363 1190 -31977.2719444 +1364 1190 280000.187543 +1365 1190 -51890.1510547 +1191 1191 17919977564.1 +1192 1191 7.86781311035e-6 +1197 1191 -8542344551.28 +1198 1191 1.0875e8 +1339 1191 -4535256410.26 +1340 1191 -1.3875e9 +1353 1191 8262820512.82 +1354 1191 7.62939453125e-6 +1366 1191 -4535256410.26 +1367 1191 1.3875e9 +1192 1192 9511023211.48 +1193 1192 -2.86102294922e-6 +1197 1192 -1.0875e8 +1198 1192 -1962242374.97 +1199 1192 65306122.449 +1339 1192 -1.3875e9 +1340 1192 -3256868131.87 +1353 1192 -1.23977661133e-5 +1354 1192 3686813186.81 +1366 1192 1.3875e9 +1367 1192 -3256868131.87 +1193 1193 914285714.286 +1198 1193 -65306122.449 +1199 1193 228571428.571 +1194 1194 12672715535.3 +1195 1194 3.50177288055e-7 +1196 1194 187846525.136 +1200 1194 -6189823312.53 +1201 1194 2324218.75 +1337 1194 -248489891.519 +1342 1194 -4836023351.64 +1343 1194 2.890625e7 +1350 1194 506040433.924 +1355 1194 9789835164.83 +1356 1194 1.49011611938e-8 +1363 1194 -248489891.519 +1368 1194 -4836023351.64 +1369 1194 -2.890625e7 +1195 1195 16793104660.3 +1196 1195 1209314508.66 +1200 1195 -2324218.75 +1201 1195 4309735337.25 +1337 1195 -6715506.71551 +1342 1195 2.890625e7 +1343 1195 -53619123.9316 +1350 1195 2.38418579102e-6 +1355 1195 8.04662704468e-7 +1356 1195 231436965.812 +1363 1195 6715506.71551 +1368 1195 -2.890625e7 +1369 1195 -53619123.9316 +1196 1196 492975261.75 +1200 1196 -382542470.883 +1201 1196 -.000107767060399 +1205 1196 187846525.136 +1206 1196 -1209314508.66 +1207 1196 -246198608.281 +1350 1196 11463927.2236 +1355 1196 248489891.519 +1356 1196 6715506.71551 +1363 1196 -23392503.2107 +1368 1196 -506040433.925 +1369 1196 -4.05311584473e-6 +1380 1196 11463927.2236 +1397 1196 248489891.519 +1398 1196 -6715506.71551 +1197 1197 17919977564.1 +1198 1197 -7.39097595215e-6 +1202 1197 -8542344551.28 +1203 1197 1.0875e8 +1353 1197 -4535256410.26 +1354 1197 -1.3875e9 +1366 1197 8262820512.82 +1367 1197 -8.58306884766e-6 +1395 1197 -4535256410.26 +1396 1197 1.3875e9 +1198 1198 9511023211.48 +1199 1198 5.48362731934e-6 +1202 1198 -1.0875e8 +1203 1198 -1962242374.97 +1204 1198 65306122.449 +1353 1198 -1.3875e9 +1354 1198 -3256868131.87 +1366 1198 6.67572021484e-6 +1367 1198 3686813186.81 +1395 1198 1.3875e9 +1396 1198 -3256868131.87 +1199 1199 914285714.286 +1203 1199 -65306122.449 +1204 1199 228571428.571 +1200 1200 12672715535.3 +1201 1200 -8.29808413982e-7 +1205 1200 -6189823312.53 +1206 1200 2324218.75 +1207 1200 187846525.136 +1350 1200 -248489891.519 +1355 1200 -4836023351.64 +1356 1200 2.890625e7 +1363 1200 506040433.925 +1368 1200 9789835164.83 +1369 1200 7.59959220886e-7 +1380 1200 -248489891.519 +1397 1200 -4836023351.64 +1398 1200 -2.890625e7 +1201 1201 16793104660.3 +1205 1201 -2324218.75 +1206 1201 4309735337.25 +1207 1201 1209314508.66 +1350 1201 -6715506.71551 +1355 1201 2.890625e7 +1356 1201 -53619123.9316 +1363 1201 -3.57627868652e-6 +1368 1201 -2.98023223877e-8 +1369 1201 231436965.812 +1380 1201 6715506.71551 +1397 1201 -2.890625e7 +1398 1201 -53619123.9316 +1202 1202 17919977564.1 +1203 1202 -1.50203704834e-5 +1212 1202 -8542344551.28 +1213 1202 1.0875e8 +1366 1202 -4535256410.26 +1367 1202 -1.3875e9 +1390 1202 -4535256410.26 +1391 1202 1.3875e9 +1395 1202 8262820512.82 +1396 1202 5.72204589844e-6 +1203 1203 9511023211.48 +1204 1203 -1.09672546387e-5 +1212 1203 -1.0875e8 +1213 1203 -1962242374.97 +1214 1203 65306122.449 +1366 1203 -1.3875e9 +1367 1203 -3256868131.87 +1390 1203 1.3875e9 +1391 1203 -3256868131.87 +1395 1203 -8.58306884766e-6 +1396 1203 3686813186.81 +1204 1204 914285714.286 +1213 1204 -65306122.449 +1214 1204 228571428.571 +1205 1205 12672715535.3 +1206 1205 1.10827386379e-7 +1207 1205 -382542470.883 +1210 1205 187846525.136 +1215 1205 -6189823312.53 +1216 1205 2324218.75 +1363 1205 -248489891.519 +1368 1205 -4836023351.64 +1369 1205 2.890625e7 +1380 1205 506040433.924 +1386 1205 -248489891.518 +1393 1205 -4836023351.64 +1394 1205 -2.890625e7 +1397 1205 9789835164.83 +1398 1205 7.45058059692e-8 +1206 1206 16793104660.3 +1207 1206 .000210767379031 +1210 1206 1209314508.66 +1215 1206 -2324218.75 +1216 1206 4309735337.25 +1363 1206 -6715506.71551 +1368 1206 2.890625e7 +1369 1206 -53619123.9316 +1380 1206 8.34465026856e-6 +1386 1206 6715506.7155 +1393 1206 -2.890625e7 +1394 1206 -53619123.9316 +1397 1206 3.57627868652e-7 +1398 1206 231436965.812 +1207 1207 493365798.513 +1208 1207 -183199.988441 +1209 1207 -1.18743628263e-8 +1210 1207 -246110348.194 +1211 1207 5.23868948221e-9 +1212 1207 -408597.434317 +1215 1207 187846525.136 +1216 1207 -1209314508.66 +1217 1207 -402970.60421 +1218 1207 -88889.7388373 +1219 1207 1.30385160446e-8 +1220 1207 -81856.231042 +1221 1207 1.43190845847e-8 +1222 1207 32402.8916265 +1223 1207 -479332.716368 +1360 1207 -30219.2760976 +1361 1207 142055.616532 +1362 1207 41522.6301091 +1363 1207 11487553.5141 +1364 1207 147949.355218 +1365 1207 41522.4783151 +1368 1207 248489891.519 +1369 1207 6715506.71551 +1380 1207 -23294869.5017 +1381 1207 -45799.9976098 +1382 1207 146999.505464 +1383 1207 -100743.132382 +1384 1207 -22222.442903 +1385 1207 156545.65914 +1386 1207 11485992.1246 +1387 1207 22431.7154827 +1388 1207 -20464.1781805 +1389 1207 31977.4238183 +1390 1207 -102149.352812 +1393 1207 248489891.518 +1394 1207 -6715506.7155 +1397 1207 -506040433.924 +1398 1207 8.82148742676e-6 +1399 1207 8100.72290661 +1400 1207 -119833.179092 +1208 1208 5373923.61057 +1209 1208 -1.22934579849e-7 +1210 1208 683398.926498 +1211 1208 2.79396772385e-8 +1212 1208 -2686957.57405 +1217 1208 -88889.7388373 +1218 1208 2607464.32234 +1219 1208 -6.79865479469e-8 +1220 1208 -567464.833224 +1221 1208 4.00468707085e-8 +1222 1208 88132.1168561 +1223 1208 -1303729.53929 +1360 1208 142055.616532 +1361 1208 -325933.942156 +1362 1208 -140000.094024 +1363 1208 -125049.734986 +1364 1208 -671741.144715 +1365 1208 -280000.186209 +1380 1208 -45799.9976098 +1381 1208 1343480.43563 +1382 1208 -.00298773124814 +1383 1208 -22222.4429031 +1384 1208 651865.839396 +1385 1208 .00266294367611 +1386 1208 170849.737392 +1387 1208 280000.188872 +1388 1208 -141866.216446 +1389 1208 140000.091685 +1390 1208 -671739.626716 +1399 1208 22033.0373544 +1400 1208 -325932.505243 +1209 1209 415114.779096 +1210 1209 -1.79279595613e-8 +1211 1209 103772.75518 +1212 1209 6.51925802231e-8 +1217 1209 2.00234353542e-8 +1218 1209 -6.98491930962e-8 +1219 1209 214083.262785 +1220 1209 1.60165131092e-8 +1221 1209 53518.0785148 +1222 1209 -3.21082770824e-9 +1223 1209 4.74974513054e-8 +1360 1209 41522.6253393 +1361 1209 -140000.094186 +1362 1209 -26761.0031396 +1363 1209 -31977.2719444 +1364 1209 -280000.187543 +1365 1209 -51890.1510547 +1380 1209 -146999.505464 +1381 1209 .0029877088964 +1382 1209 -207548.743351 +1383 1209 156545.649595 +1384 1209 .00266293529421 +1385 1209 -107038.324262 +1386 1209 -51068.034595 +1387 1209 -51890.2752931 +1388 1209 41441.4252353 +1389 1209 -26761.0693146 +1390 1209 280000.18488 +1399 1209 -9464.00616503 +1400 1209 140000.091199 +1210 1210 363246874.343 +1211 1210 5.12227416038e-9 +1212 1210 5215746.38546 +1213 1210 -2.38418579102e-7 +1215 1210 -191271235.442 +1216 1210 1171515127.43 +1217 1210 -161135.207317 +1218 1210 612668.01245 +1219 1210 -1.07102096081e-8 +1220 1210 -241386.77409 +1221 1210 2.18860805035e-8 +1222 1210 -3883464.08563 +1223 1210 1128493.601 +1224 1210 -2.08616256714e-7 +1225 1210 -7.45058059692e-9 +1226 1210 -4.65661287308e-10 +1227 1210 -37799381.2206 +1380 1210 11485992.1246 +1381 1210 170849.737392 +1382 1210 51068.034595 +1383 1210 -40283.9222492 +1384 1210 153167.003112 +1385 1210 46295.5833745 +1386 1210 -38441706.87 +1387 1210 92590.7891601 +1388 1210 -60346.9344636 +1389 1210 87818.5227136 +1390 1210 -1922423.0928 +1391 1210 -3741313.67444 +1392 1210 -1486954.93769 +1393 1210 -253121601.267 +1394 1210 6716335.16199 +1397 1210 248489891.518 +1398 1210 6715506.7155 +1399 1210 -29456737.5236 +1400 1210 -2221747.11041 +1401 1210 51131286.8839 +1402 1210 1152925.69933 +1403 1210 828.44649193 +1211 1211 207557.745128 +1212 1211 -4.842877388e-8 +1217 1211 -6.51925802231e-9 +1218 1211 9.31322574615e-10 +1219 1211 53517.9109923 +1220 1211 -2.95788049698e-9 +1221 1211 107041.873065 +1222 1211 6.2957406044e-10 +1223 1211 -9.31322574615e-9 +1380 1211 -22431.7154827 +1381 1211 -280000.188872 +1382 1211 -51890.2752931 +1383 1211 46295.5786264 +1384 1211 -140000.095678 +1385 1211 -26761.1530758 +1386 1211 -92590.7891601 +1387 1211 -103774.433202 +1388 1211 78191.4501587 +1389 1211 -53519.2806113 +1390 1211 279999.069115 +1399 1211 -9463.96859533 +1400 1211 139999.535434 +1212 1212 8993044391.57 +1213 1212 1.34e9 +1216 1212 554385380.715 +1217 1212 612668.01245 +1218 1212 -1303729.76266 +1219 1212 1.39698386192e-8 +1220 1212 567462.645425 +1221 1212 -4.74974513054e-8 +1222 1212 1653027.31639 +1223 1212 -28039183.8085 +1224 1212 -1.39698386192e-8 +1225 1212 1.19209289551e-7 +1226 1212 7.45058059692e-9 +1227 1212 554385380.715 +1380 1212 -102149.352812 +1381 1212 -671739.626716 +1382 1212 -280000.18488 +1383 1212 153167.003112 +1384 1212 -325932.561084 +1385 1212 -140000.095191 +1386 1212 -1922423.0928 +1387 1212 -279999.069115 +1388 1212 141865.647053 +1389 1212 -139999.531442 +1390 1212 4130838380.3 +1391 1212 112244907.88 +1392 1212 21808454.335 +1393 1212 1486954.93769 +1394 1212 -12150.427044 +1395 1212 -4535256410.26 +1396 1212 -1.3875e9 +1399 1212 -2090613.66726 +1400 1212 1056679.10951 +1401 1212 3486258.96796 +1402 1212 -16909407.8294 +1403 1212 -12150.427044 +1213 1213 13002168758 +1214 1213 -60880441.1474 +1215 1213 -64909343.3301 +1222 1213 -5.96046447754e-8 +1223 1213 -3.72529029846e-9 +1224 1213 4038209197.08 +1225 1213 4425681.3016 +1226 1213 -64909343.3301 +1386 1213 3741313.67444 +1390 1213 -112244907.88 +1391 1213 -2224798463.61 +1395 1213 -1.3875e9 +1396 1213 -3256868131.87 +1399 1213 51131286.8839 +1400 1213 3486258.96796 +1401 1213 -2074228117.67 +1214 1214 1418408948.95 +1215 1214 -53025291.8887 +1216 1214 3.72529029846e-9 +1222 1214 7.45058059692e-9 +1223 1214 -1.19209289551e-7 +1224 1214 -4425681.3016 +1225 1214 -694445512.907 +1226 1214 -106632439.78 +1227 1214 2.44472175837e-9 +1386 1214 1486954.93769 +1390 1214 -21808454.335 +1392 1214 403989431.255 +1393 1214 27545009.3966 +1394 1214 -19486.008721 +1399 1214 -1152925.69933 +1400 1214 16909407.8294 +1402 1214 -340301826.683 +1403 1214 -266308.785854 +1215 1215 8071704966.57 +1216 1215 -28658854.1667 +1222 1215 4.65661287308e-10 +1223 1215 -7.45058059692e-9 +1224 1215 64909343.3301 +1225 1215 -106632439.78 +1226 1215 862210831.613 +1227 1215 1.67347025126e-10 +1380 1215 -248489891.518 +1386 1215 253121601.267 +1390 1215 -1486954.93769 +1392 1215 27545009.3966 +1393 1215 4896795670.01 +1394 1215 2342421.39521 +1397 1215 -4836023351.64 +1398 1215 2.890625e7 +1399 1215 -78609.3564946 +1400 1215 1152925.69933 +1402 1215 -23202629.2978 +1403 1215 -18157.5987915 +1216 1216 23249399759.1 +1222 1216 37799381.2206 +1223 1216 -554385380.715 +1225 1216 -6.98491930962e-10 +1226 1216 -5.09317032993e-11 +1227 1216 7426247023.15 +1380 1216 -6715506.7155 +1386 1216 6716335.16199 +1390 1216 -12150.427044 +1392 1216 19486.008721 +1393 1216 -2342421.39521 +1394 1216 115137744.425 +1397 1216 2.890625e7 +1398 1216 -53619123.9316 +1399 1216 -828.44649193 +1400 1216 12150.427044 +1402 1216 -266308.785854 +1403 1216 -202023.574818 +1217 1217 913395.922943 +1218 1217 -323189.02841 +1219 1217 -1.39698386192e-8 +1220 1217 228198.163151 +1221 1217 -1.86264514923e-8 +1222 1217 -16385.6595232 +1223 1217 242391.413065 +1228 1217 -488319.191395 +1229 1217 -73558.2255337 +1230 1217 2.28174030781e-8 +1231 1217 -103185.437932 +1232 1217 1.11758708954e-8 +1233 1217 33180.2505301 +1234 1217 -490832.108433 +1357 1217 -35488.2452373 +1358 1217 141097.586315 +1359 1217 45937.5328783 +1360 1217 55706.8571449 +1361 1217 20199.4024249 +1362 1217 9187.50153679 +1363 1217 -20912.6812731 +1364 1217 -130944.565672 +1365 1217 -36750.022154 +1370 1217 -122080.295339 +1371 1217 -18389.5648524 +1372 1217 174920.671033 +1373 1217 -25796.4839459 +1374 1217 37108.0770763 +1375 1217 8295.06263252 +1376 1217 -122708.027108 +1380 1217 -100743.132382 +1381 1217 -22222.442903 +1382 1217 -156545.649595 +1383 1217 228348.001203 +1384 1217 -80797.2570305 +1385 1217 -.00914755975828 +1386 1217 -40283.9222492 +1387 1217 -46295.5786264 +1388 1217 57049.2961113 +1389 1217 -27562.5230014 +1390 1217 153167.003112 +1399 1217 -4096.41572877 +1400 1217 60597.8658102 +1218 1218 9480246.65238 +1219 1218 -2.6635825634e-7 +1220 1218 -78039.7292715 +1221 1218 9.31322574615e-8 +1222 1218 320431.142337 +1223 1218 -4740105.65587 +1228 1218 -73558.2255337 +1229 1218 2157696.65917 +1230 1218 -5.49480319023e-8 +1231 1218 -563762.124492 +1232 1218 3.25962901115e-8 +1233 1218 72930.0160589 +1234 1218 -1078846.3914 +1357 1218 141097.586315 +1358 1218 -269712.875471 +1359 1218 -129500.0871 +1360 1218 20199.4024249 +1361 1218 -1185034.41167 +1362 1218 -539000.359659 +1363 1218 -130944.565672 +1364 1218 -325933.923542 +1365 1218 -140000.09269 +1370 1218 -18389.5648524 +1371 1218 539423.915505 +1372 1218 .00297556770965 +1373 1218 -140940.539537 +1374 1218 129500.084425 +1375 1218 18232.5124284 +1376 1218 -269711.722314 +1380 1218 -22222.442903 +1381 1218 651865.839396 +1382 1218 -.00266295205802 +1383 1218 -80797.2570304 +1384 1218 2370060.68145 +1385 1218 -.000937803648412 +1386 1218 153167.003112 +1387 1218 140000.095678 +1388 1218 -19509.9529105 +1389 1218 539000.359971 +1390 1218 -325932.561084 +1399 1218 80107.8187207 +1400 1218 -1185026.90415 +1219 1219 872595.594027 +1220 1219 -4.41446900368e-9 +1221 1219 218138.900333 +1222 1219 -6.2957406044e-9 +1223 1219 9.31322574615e-8 +1228 1219 1.44354999065e-8 +1229 1219 -5.91389834881e-8 +1230 1219 221270.115198 +1231 1219 1.62992626429e-8 +1232 1219 55315.2897779 +1233 1219 -2.32942402363e-9 +1234 1219 3.44589352608e-8 +1357 1219 45937.5284659 +1358 1219 -129500.087251 +1359 1219 -27659.3116492 +1360 1219 9187.51072696 +1361 1219 -539000.359815 +1362 1219 -109075.542903 +1363 1219 -36750.0269238 +1364 1219 -140000.092853 +1365 1219 -26760.9752199 +1370 1219 174920.662203 +1371 1219 .00297557190061 +1372 1219 -110632.553125 +1373 1219 45862.2783615 +1374 1219 -27659.3684761 +1375 1219 -8754.20567669 +1376 1219 129500.083975 +1380 1219 -156545.65914 +1381 1219 -.00266296602786 +1382 1219 -107038.324262 +1383 1219 .00914755370468 +1384 1219 .000937730073929 +1385 1219 -436282.207438 +1386 1219 -46295.5833745 +1387 1219 -26761.1530759 +1388 1219 8873.91051248 +1389 1219 -109076.241974 +1390 1219 140000.095191 +1399 1219 -36436.4243024 +1400 1219 539000.359503 +1220 1220 451097.0415 +1221 1220 -1.59248709679e-8 +1222 1220 -5275.49670076 +1223 1220 78039.892023 +1228 1220 -141048.573053 +1229 1220 528238.589226 +1230 1220 -8.06115567684e-9 +1231 1220 -245434.953487 +1232 1220 1.99213624e-8 +1233 1220 35708.7827829 +1234 1220 -528236.4317 +1370 1220 -35262.2677262 +1371 1220 132059.638893 +1372 1220 41598.2299375 +1373 1220 -61358.9884017 +1374 1220 87535.7603657 +1375 1220 8927.1966951 +1376 1220 -132059.122709 +1380 1220 -20464.1781805 +1381 1220 -141866.216446 +1382 1220 -41441.4252353 +1383 1220 57049.2961113 +1384 1220 -19509.9529106 +1385 1220 -8873.91051248 +1386 1220 -60346.9344636 +1387 1220 -78191.4501587 +1388 1220 112773.76837 +1389 1220 313.594349566 +1390 1220 141865.647053 +1399 1220 -1318.8719359 +1400 1220 19509.9398801 +1221 1221 436299.187114 +1222 1221 8.93995165825e-9 +1223 1221 -1.32247805595e-7 +1228 1221 -4.19095158577e-9 +1230 1221 55315.1222547 +1231 1221 -4.32338565588e-9 +1232 1221 110635.28095 +1233 1221 5.98095357418e-10 +1234 1221 -8.84756445885e-9 +1370 1221 50352.4315243 +1371 1221 -129500.088886 +1372 1221 -27659.4522377 +1373 1221 87385.2564527 +1374 1221 -55316.386255 +1375 1221 -8754.17097664 +1376 1221 129499.57066 +1380 1221 -31977.4238183 +1381 1221 -140000.091685 +1382 1221 -26761.0693146 +1383 1221 27562.5230014 +1384 1221 -539000.359971 +1385 1221 -109076.241974 +1386 1221 -87818.5227136 +1387 1221 -53519.2806113 +1388 1221 -313.594349578 +1389 1221 -218141.790724 +1390 1221 139999.531442 +1399 1221 -36436.27862 +1400 1221 538998.204438 +1222 1222 233678289.036 +1223 1222 11017545.7134 +1224 1222 -4.76837158203e-7 +1225 1222 1.49011611938e-8 +1227 1222 -6376917.77282 +1228 1222 -40638.998738 +1229 1222 72930.0311583 +1230 1222 3.77744436264e-10 +1231 1222 -38110.1712081 +1232 1222 2.89604067802e-9 +1233 1222 -13045888.2696 +1234 1222 1555377.98288 +1235 1222 -3.8743019104e-7 +1238 1222 -44176298.9934 +1370 1222 -10159.7496845 +1371 1222 18232.5162033 +1372 1222 8754.20597824 +1373 1222 -9527.54180266 +1374 1222 8754.17067509 +1375 1222 -27462935.4358 +1376 1222 -1955922.70006 +1377 1222 51131291.8077 +1378 1222 1263758.79445 +1379 1222 816.463332821 +1380 1222 8100.72290661 +1381 1222 22033.0373544 +1382 1222 9464.00616503 +1383 1222 -4096.41572877 +1384 1222 80107.8187207 +1385 1222 36436.4243024 +1386 1222 -29456737.5236 +1387 1222 9463.96859533 +1388 1222 -1318.8719359 +1389 1222 36436.27862 +1390 1222 -2090613.66726 +1391 1222 -51131286.8839 +1392 1222 1152925.69933 +1393 1222 78609.3564946 +1394 1222 -828.44649193 +1399 1222 -51403789.8076 +1400 1222 -3427559.15644 +1401 1222 -.360276088119 +1402 1222 -3059684.37739 +1403 1222 -11.9831591097 +1223 1223 72879453.0599 +1224 1223 -2.98023223877e-8 +1225 1223 -1.19209289551e-7 +1226 1223 -1.49011611938e-8 +1227 1223 93540675.7944 +1228 1223 601168.620385 +1229 1223 -1078846.61477 +1230 1223 -5.58793544769e-9 +1231 1223 563759.929115 +1232 1223 -4.28408384323e-8 +1233 1223 1555377.98288 +1234 1223 -35743060.9861 +1235 1223 -2.60770320892e-8 +1238 1223 647926056.509 +1370 1223 150292.155096 +1371 1223 -269711.778155 +1372 1223 -129500.088435 +1373 1223 140939.967495 +1374 1223 -129499.5662 +1375 1223 -1955922.70006 +1376 1223 1093193.28007 +1377 1223 3486186.75252 +1378 1223 -18535329.3672 +1379 1223 -11974.9250067 +1380 1223 -119833.179092 +1381 1223 -325932.505243 +1382 1223 -140000.091199 +1383 1223 60597.8658102 +1384 1223 -1185026.90415 +1385 1223 -539000.359503 +1386 1223 -2221747.11041 +1387 1223 -139999.535434 +1388 1223 19509.9398801 +1389 1223 -538998.204438 +1390 1223 1056679.10951 +1391 1223 -3486258.96796 +1392 1223 -16909407.8294 +1393 1223 -1152925.69933 +1394 1223 12150.427044 +1399 1223 -3427559.15644 +1400 1223 -1356464.42966 +1401 1223 5.2840567017 +1402 1223 44875402.1562 +1403 1223 175.502037358 +1224 1224 15884263342.3 +1225 1224 746666.957293 +1226 1224 -10952584.596 +1233 1224 2.98023223877e-7 +1234 1224 2.04890966415e-8 +1235 1224 3725894088.9 +1236 1224 5172348.25889 +1237 1224 -75861927.9261 +1375 1224 51131291.8077 +1376 1224 3486186.75252 +1377 1224 -1922836059.47 +1386 1224 -51131286.8839 +1390 1224 -3486258.96796 +1391 1224 -2074228117.67 +1399 1224 .36027623713 +1400 1224 -5.28405669145 +1401 1224 -7827119137 +1225 1225 1973964763.99 +1226 1225 -112156089.355 +1227 1225 -1.86264514923e-9 +1235 1225 -5172348.25889 +1236 1225 -764006229.618 +1237 1225 -116179614.56 +1238 1225 4.07453626394e-9 +1375 1225 -1263758.79445 +1376 1225 18535329.3672 +1378 1225 -371207454.429 +1379 1225 -266308.811499 +1386 1225 -1152925.69933 +1390 1225 16909407.8294 +1392 1225 -340301826.683 +1393 1225 -23202629.2978 +1394 1225 266308.785854 +1399 1225 3059684.37739 +1400 1225 -44875402.1562 +1402 1225 834107925.586 +1403 1225 -.00187643989921 +1226 1226 3611275341.36 +1227 1226 -1.16415321827e-10 +1235 1226 75861927.9261 +1236 1226 -116179614.56 +1237 1226 932058620.352 +1238 1226 2.76486389339e-10 +1375 1226 -86164.4408314 +1376 1226 1263758.79445 +1378 1226 -25309325.5483 +1379 1226 -18157.2226694 +1386 1226 -78609.3564946 +1390 1226 1152925.69933 +1392 1226 -23202629.2978 +1393 1226 -1582013.2721 +1394 1226 18157.5987915 +1399 1226 208614.698486 +1400 1226 -3059684.37739 +1402 1226 56870953.333 +1403 1226 .0275211285189 +1227 1227 30909791347.6 +1233 1227 44176298.9934 +1234 1227 -647926056.509 +1238 1227 8028308519.87 +1375 1227 -816.463332821 +1376 1227 11974.9250067 +1378 1227 -266308.811499 +1379 1227 -184697.186945 +1386 1227 828.44649193 +1390 1227 -12150.427044 +1392 1227 266308.785854 +1393 1227 18157.5987915 +1394 1227 -202023.574818 +1399 1227 -11.9831591097 +1400 1227 175.502037358 +1402 1227 .00187644374091 +1403 1227 -1113572.3197 +1228 1228 1045720.97408 +1229 1228 -280080.969386 +1230 1228 -2.56113708019e-8 +1231 1228 261298.14512 +1232 1228 -1.58324837685e-8 +1233 1228 -14200.1375062 +1234 1228 210061.205714 +1239 1228 -538265.241304 +1240 1228 -66806.8133053 +1241 1228 1.86264514923e-8 +1245 1228 -115664.67162 +1246 1228 1.23400241137e-8 +1249 1228 33522.4797952 +1250 1228 -495894.671527 +1310 1228 -38580.9538854 +1311 1228 140675.374316 +1312 1228 50352.4358261 +1313 1228 -134566.858043 +1314 1228 -16701.7126509 +1315 1228 192580.632807 +1316 1228 -28916.3049341 +1317 1228 41522.6300347 +1318 1228 8380.61994881 +1319 1228 -123973.667882 +1357 1228 64161.4143731 +1358 1228 17504.939443 +1359 1228 8829.80147696 +1360 1228 -26181.1339249 +1361 1228 -131902.59589 +1362 1228 -41522.6255193 +1370 1228 261429.197556 +1371 1228 -70020.2423466 +1372 1228 -.00879156915471 +1373 1228 65324.2750074 +1374 1228 -26489.7721063 +1375 1228 -3550.03527816 +1376 1228 52515.3147657 +1383 1228 -122080.295339 +1384 1228 -18389.5648524 +1385 1228 -174920.662203 +1388 1228 -35262.2677262 +1389 1228 -50352.4315243 +1399 1228 -10159.7496845 +1400 1228 150292.155096 +1229 1229 8215418.15617 +1230 1229 -2.04890966415e-7 +1231 1229 -67619.3398655 +1232 1229 5.96046447754e-8 +1233 1229 277680.545579 +1234 1229 -4107700.37839 +1239 1229 -66806.8133053 +1240 1229 1959541.07778 +1241 1229 -4.00468707085e-8 +1245 1229 -562126.949045 +1246 1229 3.67872416973e-8 +1249 1229 66232.2775184 +1250 1229 -979767.418912 +1310 1229 140675.374316 +1311 1229 -244943.756274 +1312 1229 -129500.087176 +1313 1229 -16701.7126509 +1314 1229 489884.994991 +1315 1229 .00327618978918 +1316 1229 -140531.746524 +1317 1229 129500.0842 +1318 1229 16558.0786428 +1319 1229 -244941.991757 +1357 1229 17504.939443 +1358 1229 -1026928.49556 +1359 1229 -518000.345646 +1360 1229 -131902.59589 +1361 1229 -269712.856857 +1362 1229 -129500.08561 +1370 1229 -70020.2423466 +1371 1229 2053853.49308 +1372 1229 -.000901493243873 +1373 1229 -16904.8569365 +1374 1229 518000.345947 +1375 1229 69420.1717023 +1376 1229 -1026925.6169 +1383 1229 -18389.5648524 +1384 1229 539423.915505 +1385 1229 -.00297558726743 +1388 1229 132059.638893 +1389 1229 129500.088886 +1399 1229 18232.5162033 +1400 1229 -269711.778155 +1230 1230 929761.288762 +1231 1230 -1.03432685137e-8 +1232 1230 232431.391313 +1233 1230 -4.09223139286e-9 +1234 1230 6.053596735e-8 +1239 1230 1.49011611938e-8 +1240 1230 -5.35510480404e-8 +1241 1230 243608.884699 +1245 1230 1.803599298e-8 +1246 1230 60900.3162667 +1249 1230 -2.20350921154e-9 +1250 1230 3.25962901115e-8 +1310 1230 50352.4314138 +1311 1230 -129500.087326 +1312 1230 -30451.5839809 +1313 1230 192580.623976 +1314 1230 .00327618699521 +1315 1230 -121802.310014 +1316 1230 50276.8313036 +1317 1230 -30451.7513255 +1318 1230 -8754.20566145 +1319 1230 129500.083749 +1357 1230 8829.81030933 +1358 1230 -518000.345796 +1359 1230 -116221.146907 +1360 1230 -41522.6299317 +1361 1230 -129500.08576 +1362 1230 -27659.2837279 +1370 1230 .00879155052826 +1371 1230 .000901435501874 +1372 1230 -464866.753585 +1373 1230 8527.06010246 +1374 1230 -116221.485887 +1375 1230 -35016.8233555 +1376 1230 518000.345496 +1383 1230 -174920.671033 +1384 1230 -.0029755840078 +1385 1230 -110632.553125 +1388 1230 -41598.2299375 +1389 1230 -27659.4522378 +1399 1230 -8754.20597824 +1400 1230 129500.088435 +1231 1231 518014.630513 +1232 1231 -1.88685953617e-8 +1233 1231 -4571.07962245 +1234 1231 67619.5210421 +1239 1231 -153536.660819 +1240 1231 529873.764672 +1241 1231 -6.17951154709e-9 +1245 1231 -270291.7014 +1246 1231 2.01981514692e-8 +1249 1231 35819.3207722 +1250 1231 -529871.609056 +1313 1231 -38384.3022338 +1314 1231 132468.431905 +1315 1231 46013.8328814 +1316 1231 -67573.2006234 +1317 1231 96366.9662598 +1318 1231 8954.83129336 +1319 1231 -132467.918541 +1370 1231 65324.2750074 +1371 1231 -16904.8569366 +1372 1231 -8527.06010246 +1373 1231 129503.132254 +1374 1231 303.094563698 +1375 1231 -1142.7675157 +1376 1231 16904.8449068 +1383 1231 -25796.4839459 +1384 1231 -140940.539537 +1385 1231 -45862.2783615 +1388 1231 -61358.9884017 +1389 1231 -87385.2564527 +1399 1231 -9527.54180266 +1400 1231 140939.967495 +1232 1232 464881.315426 +1233 1232 6.2957406044e-9 +1234 1232 -9.31322574615e-8 +1239 1232 -4.65661287308e-10 +1240 1232 -7.45058059692e-9 +1241 1232 60900.1487302 +1245 1232 -2.83308327198e-10 +1246 1232 121804.886905 +1249 1232 2.83308327198e-10 +1250 1232 -4.19095158577e-9 +1313 1232 54768.0344823 +1314 1232 -129500.089111 +1315 1232 -30451.8350938 +1316 1232 96214.3623527 +1317 1232 -60901.3754654 +1318 1232 -8754.17099187 +1319 1232 129499.570886 +1370 1232 26489.7721063 +1371 1232 -518000.345947 +1372 1232 -116221.485887 +1373 1232 -303.094563709 +1374 1232 -232433.705374 +1375 1232 -35016.6833491 +1376 1232 517998.274395 +1383 1232 -37108.0770763 +1384 1232 -129500.084425 +1385 1232 -27659.3684761 +1388 1232 -87535.7603657 +1389 1232 -55316.386255 +1399 1232 -8754.17067509 +1400 1232 129499.5662 +1233 1233 234359138.183 +1234 1233 10600622.6262 +1236 1233 7.45058059692e-9 +1237 1233 9.31322574615e-10 +1238 1233 -5180.51802382 +1239 1233 -40296.7694729 +1240 1233 66232.2926191 +1241 1233 1.25914812088e-10 +1245 1233 -37999.6332189 +1246 1233 3.08491289616e-9 +1249 1233 -13046302.6652 +1250 1233 1562267.95358 +1251 1233 -4.47034835815e-7 +1254 1233 -44181479.5114 +1313 1233 -10074.1923682 +1314 1233 16558.0824179 +1315 1233 8754.20599347 +1316 1233 -9499.90720441 +1317 1233 8754.17065986 +1318 1233 -27463030.8839 +1319 1233 -1954477.44277 +1320 1233 51131263.6705 +1321 1233 1263906.88098 +1322 1233 816.560068688 +1370 1233 -3550.03527816 +1371 1233 69420.1717023 +1372 1233 35016.8233555 +1373 1233 -1142.7675157 +1374 1233 35016.6833491 +1375 1233 -49186373.3679 +1376 1233 -3261366.33219 +1377 1233 2.0588221848 +1378 1233 -3145643.53872 +1379 1233 .0967358672315 +1383 1233 8295.06263252 +1384 1233 18232.5124284 +1385 1233 8754.20567669 +1388 1233 8927.1966951 +1389 1233 8754.17097664 +1399 1233 -27462935.4358 +1400 1233 -1955922.70006 +1401 1233 -51131291.8077 +1402 1233 1263758.79445 +1403 1233 -816.463332821 +1234 1234 79649120.8726 +1236 1234 -1.19209289551e-7 +1237 1234 -7.45058059692e-9 +1238 1234 -1069.61956381 +1239 1234 596106.057291 +1240 1234 -979767.642294 +1241 1234 -1.86264514923e-9 +1245 1234 562124.751759 +1246 1234 -4.56348061562e-8 +1249 1234 1562267.95358 +1250 1234 -35842054.6495 +1251 1234 -2.98023223877e-8 +1254 1234 647924986.89 +1313 1234 149026.514323 +1314 1234 -244942.047602 +1315 1234 -129500.088661 +1316 1234 140531.171663 +1317 1234 -129499.565974 +1318 1234 -1954477.44277 +1319 1234 1068391.56416 +1320 1234 3486599.41191 +1321 1234 -18535297.1051 +1322 1234 -11974.9197548 +1370 1234 52515.3147657 +1371 1234 -1026925.6169 +1372 1234 -518000.345496 +1373 1234 16904.8449068 +1374 1234 -517998.274396 +1375 1234 -3261366.33219 +1376 1234 -1568850.86985 +1377 1234 -30.194589261 +1378 1234 46133860.8866 +1379 1234 .00525184947765 +1383 1234 -122708.027108 +1384 1234 -269711.722314 +1385 1234 -129500.083975 +1388 1234 -132059.122709 +1389 1234 -129499.57066 +1399 1234 -1955922.70006 +1400 1234 1093193.28007 +1401 1234 -3486186.75252 +1402 1234 -18535329.3672 +1403 1234 11974.9250067 +1235 1235 15275216510.3 +1236 1235 606.556768 +1237 1235 125.238990307 +1249 1235 5.96046447754e-8 +1250 1235 3.72529029846e-9 +1251 1235 3725896211.93 +1252 1235 5172954.81566 +1253 1235 -75861802.6871 +1318 1235 51131263.6705 +1319 1235 3486599.41191 +1320 1235 -1922837085.77 +1375 1235 -2.05882242322 +1376 1235 30.1945892442 +1377 1235 -7517830260.3 +1399 1235 -51131291.8077 +1400 1235 -3486186.75252 +1401 1235 -1922836059.47 +1236 1236 2025397914.47 +1237 1236 -118268517.36 +1238 1236 -1.86264514923e-9 +1249 1236 -7.45058059692e-9 +1250 1236 1.19209289551e-7 +1251 1236 -5172954.81566 +1252 1236 -764003847.357 +1253 1236 -116193232.948 +1254 1236 5.47152012587e-9 +1318 1236 -1263906.88098 +1319 1236 18535297.1051 +1321 1236 -371206819.998 +1322 1236 -266308.66495 +1375 1236 3145643.53872 +1376 1236 -46133860.8866 +1378 1236 860236321.812 +1379 1236 .0107230338035 +1399 1236 -1263758.79445 +1400 1236 18535329.3672 +1402 1236 -371207454.429 +1403 1236 266308.811499 +1237 1237 3751854298.89 +1238 1237 -1.16415321827e-10 +1249 1237 -4.65661287308e-10 +1250 1237 7.45058059692e-9 +1251 1237 75861802.6871 +1252 1237 -116193232.948 +1253 1237 932056232.463 +1254 1237 3.78349795938e-10 +1318 1237 -86184.7854247 +1319 1237 1263906.88098 +1321 1237 -25312292.0771 +1322 1237 -18159.371937 +1375 1237 214486.130523 +1376 1237 -3145643.53872 +1378 1237 58655329.8482 +1379 1237 -.15726348562 +1399 1237 -86164.4408314 +1400 1237 1263758.79445 +1402 1237 -25309325.5483 +1403 1237 18157.2226694 +1238 1238 32113879002.5 +1249 1238 44181479.5114 +1250 1238 -647924986.89 +1252 1238 -4.65661287308e-10 +1253 1238 -2.91038304567e-11 +1254 1238 8028304102.38 +1318 1238 -816.560068688 +1319 1238 11974.9197548 +1321 1238 -266308.66495 +1322 1238 -184697.30516 +1375 1238 .0967358672387 +1376 1238 .00525184936123 +1378 1238 -.010723029729 +1379 1238 -1065668.00477 +1399 1238 816.463332821 +1400 1238 -11974.9250067 +1402 1238 266308.811499 +1403 1238 -184697.186945 +1239 1239 1738577.43347 +1240 1239 -191992.371108 +1241 1239 -5.58793544769e-8 +1242 1239 -1187139.04241 +1243 1239 -30403.6805426 +1244 1239 5.63450157642e-8 +1245 1239 434557.139589 +1246 1239 -1.86264514923e-8 +1247 1239 -242510.516843 +1248 1239 1.62981450558e-8 +1249 1239 -9733.98944519 +1250 1239 143993.926704 +1255 1239 -523198.257983 +1287 1239 -78979.2030845 +1288 1239 138400.486246 +1289 1239 52500.0361274 +1290 1239 -296785.04522 +1291 1239 -7600.92498007 +1292 1239 205705.639289 +1293 1239 -60627.7004169 +1294 1239 48205.533375 +1295 1239 -130799.564496 +1310 1239 107840.373884 +1311 1239 11999.6097904 +1312 1239 6562.50109771 +1313 1239 434643.525417 +1314 1239 -47998.0924504 +1315 1239 -.00653404695913 +1316 1239 108639.076841 +1317 1239 -19687.5164295 +1318 1239 -2433.49809579 +1319 1239 35998.4925413 +1357 1239 -29273.8425731 +1358 1239 -132324.807888 +1359 1239 -45937.5284672 +1370 1239 -134566.858043 +1371 1239 -16701.7126509 +1372 1239 -192580.623976 +1373 1239 -38384.3022338 +1374 1239 -54768.0344823 +1375 1239 -10074.1923682 +1376 1239 149026.514323 +1240 1240 5631796.53975 +1241 1240 -1.3830140233e-7 +1242 1240 -30403.6805426 +1243 1240 891968.462958 +1244 1240 -2.9569491744e-8 +1245 1240 -46359.5440805 +1246 1240 4.79631125927e-8 +1247 1240 -523198.257983 +1248 1240 2.9569491744e-8 +1249 1240 190353.470785 +1250 1240 -2815879.74533 +1255 1240 -445984.173543 +1287 1240 138400.486246 +1288 1240 -111496.921331 +1289 1240 -63000.0428868 +1290 1240 -7600.92498008 +1291 1240 222991.973122 +1292 1240 .00349872699007 +1293 1240 -130799.564496 +1294 1240 63000.0395342 +1295 1240 -111496.114592 +1310 1240 11999.6097904 +1311 1240 -703977.760952 +1312 1240 -385000.256899 +1313 1240 -47998.0924504 +1314 1240 1407948.29242 +1315 1240 -.000669119413942 +1316 1240 -11589.903595 +1317 1240 385000.257122 +1318 1240 47588.3961363 +1319 1240 -703970.357045 +1357 1240 -132324.807888 +1358 1240 -244943.73766 +1359 1240 -129500.085535 +1370 1240 -16701.7126509 +1371 1240 489884.994991 +1372 1240 -.00327619118616 +1373 1240 132468.431905 +1374 1240 129500.089111 +1375 1240 16558.0824179 +1376 1240 -244942.047602 +1241 1241 748928.693076 +1242 1241 4.05125319958e-8 +1243 1241 -2.04890966415e-8 +1244 1241 126587.895616 +1245 1241 -1.55165791511e-8 +1246 1241 187226.811227 +1247 1241 1.90921127796e-8 +1248 1241 31646.1587581 +1249 1241 -2.64421105385e-9 +1250 1241 3.91155481339e-8 +1255 1241 2.56113708019e-8 +1287 1241 52500.0339811 +1288 1241 -63000.04296 +1289 1241 -15824.0598354 +1290 1241 205705.634995 +1291 1241 .00349873583764 +1292 1241 -63294.389855 +1293 1241 48205.5312393 +1294 1241 -15824.1127293 +1295 1241 63000.0393152 +1310 1241 6562.50766212 +1311 1241 -385000.257011 +1312 1241 -93615.9995546 +1313 1241 .0065340208821 +1314 1241 .000669084023684 +1315 1241 -374453.292157 +1316 1241 6338.50750888 +1317 1241 -93616.9912427 +1318 1241 -26026.0173589 +1319 1241 385000.256788 +1357 1241 -45937.5328795 +1358 1241 -129500.085685 +1359 1241 -30451.5560596 +1370 1241 -192580.632807 +1371 1241 -.0032761991024 +1372 1241 -121802.310014 +1373 1241 -46013.8328814 +1374 1241 -30451.8350938 +1375 1241 -8754.20599347 +1376 1241 129500.088661 +1242 1242 491269894.975 +1243 1242 -60172.6622167 +1244 1242 -5.68106770515e-8 +1245 1242 -315722.834333 +1246 1242 3.72529029846e-9 +1247 1242 -244537107.851 +1248 1242 -1.93249434233e-8 +1249 1242 -38451.0470284 +1250 1242 568802.470835 +1255 1242 591126.407893 +1258 1242 -4.76837158203e-7 +1259 1242 -1798456233.97 +1267 1242 -102038543.721 +1271 1242 49177864.0697 +1272 1242 -5773.23717949 +1287 1242 2598459.19106 +1288 1242 -132738.436863 +1289 1242 -50352.2246647 +1290 1242 -4930267.0838 +1291 1242 -15043.165453 +1292 1242 -209999.302447 +1293 1242 2597946.48393 +1294 1242 -58941.9302781 +1295 1242 147781.60568 +1298 1242 49177864.0697 +1299 1242 5773.23717949 +1310 1242 -69672.9115941 +1311 1242 -134599.695958 +1312 1242 -50352.4325477 +1313 1242 -296785.04522 +1314 1242 -7600.92498006 +1315 1242 -205705.634995 +1316 1242 -78930.7797894 +1317 1242 -54647.6355389 +1318 1242 -9612.76175711 +1319 1242 142200.617709 +1243 1243 1765320.75903 +1244 1243 -4.37721610069e-8 +1245 1243 538653.925606 +1246 1243 -1.86264514923e-8 +1247 1243 -500869.952922 +1248 1243 3.21306288242e-8 +1249 1243 30148.5452284 +1250 1243 -445984.39687 +1255 1243 -882656.681941 +1287 1243 140260.653341 +1288 1243 -220665.061356 +1289 1243 -126000.084971 +1290 1243 -15043.1654531 +1291 1243 441329.901966 +1292 1243 .00335267884657 +1293 1243 -125217.484523 +1294 1243 126000.081472 +1295 1243 -220664.314194 +1310 1243 -134599.695958 +1311 1243 -111496.902718 +1312 1243 -63000.0411343 +1313 1243 -7600.92498006 +1314 1243 222991.973122 +1315 1243 -.00349873676896 +1316 1243 134663.476588 +1317 1243 63000.0447791 +1318 1243 7537.14112063 +1319 1243 -111496.170423 +1244 1244 255823.923 +1245 1244 3.93260270357e-9 +1246 1244 31645.9912634 +1247 1244 -4.19095158577e-9 +1248 1244 63954.0986094 +1249 1244 7.24010169506e-10 +1250 1244 -1.07102096081e-8 +1255 1244 -1.44354999065e-8 +1287 1244 54647.4275314 +1288 1244 -126000.083218 +1289 1244 -31977.8123084 +1290 1244 209999.302447 +1291 1244 -.00335269235075 +1292 1244 -127907.490106 +1293 1244 46057.721679 +1294 1244 -31977.9212894 +1295 1244 126000.086717 +1310 1244 -50352.4346941 +1311 1244 -63000.0412075 +1312 1244 -15824.0319165 +1313 1244 -205705.639289 +1314 1244 -.00349873863161 +1315 1244 -63294.3898549 +1316 1244 -50388.8346623 +1317 1244 -15824.1964766 +1318 1244 -4258.80301227 +1319 1244 63000.0445602 +1245 1245 865942.660463 +1246 1245 -4.02379781008e-8 +1247 1245 -557685.372444 +1248 1245 3.1852722168e-8 +1249 1245 -3133.92116584 +1250 1245 46359.7805598 +1255 1245 -538651.851975 +1290 1245 -78930.7797894 +1291 1245 134663.476588 +1292 1245 50388.8346623 +1293 1245 -139421.485583 +1294 1245 102888.869643 +1295 1245 -134662.971451 +1313 1245 108639.076841 +1314 1245 -11589.903595 +1315 1245 -6338.50750889 +1316 1245 216485.246741 +1317 1245 223.995963951 +1318 1245 -783.478382969 +1319 1245 11589.9169078 +1370 1245 -28916.3049341 +1371 1245 -140531.746524 +1372 1245 -50276.8313036 +1373 1245 -67573.2006234 +1374 1245 -96214.3623527 +1375 1245 -9499.90720441 +1376 1245 140531.171663 +1246 1246 374466.325385 +1247 1246 1.76951289177e-8 +1248 1246 63294.164223 +1249 1246 4.84772026539e-9 +1250 1246 -7.17118382454e-8 +1255 1246 1.30385160446e-8 +1290 1246 54647.6355389 +1291 1246 -63000.0447791 +1292 1246 -15824.1964766 +1293 1246 98558.68175 +1294 1246 -31647.3021052 +1295 1246 62999.7926695 +1313 1246 19687.5164295 +1314 1246 -385000.257122 +1315 1246 -93616.9912427 +1316 1246 -223.995963972 +1317 1246 -187227.63102 +1318 1246 -26025.9133 +1319 1246 384998.717455 +1370 1246 -41522.6300347 +1371 1246 -129500.0842 +1372 1246 -30451.7513255 +1373 1246 -96366.9662598 +1374 1246 -60901.3754654 +1375 1246 -8754.17065986 +1376 1246 129499.565974 +1247 1247 405799794.477 +1248 1247 -2.93366611004e-8 +1249 1247 -109620891.458 +1250 1247 14072244.5329 +1251 1247 5.96046447754e-8 +1252 1247 -1.49011611938e-8 +1253 1247 -9.31322574615e-10 +1254 1247 186613783.242 +1255 1247 -9610832.91714 +1256 1247 2.38418579102e-7 +1259 1247 1985070017.22 +1264 1247 1798456233.97 +1267 1247 49177864.0697 +1268 1247 -5773.23717949 +1290 1247 2597946.48393 +1291 1247 -125217.484523 +1292 1247 -46057.721679 +1293 1247 -12198059.7609 +1294 1247 -96410.6799039 +1295 1247 -387056.881921 +1296 1247 3741317.69424 +1297 1247 -2909028.41892 +1298 1247 -51217570.6312 +1299 1247 -6322.26655982 +1313 1247 -60627.7004169 +1314 1247 -130799.564496 +1315 1247 -48205.5312393 +1316 1247 -139421.485583 +1317 1247 -98558.68175 +1318 1247 -15620637.1762 +1319 1247 -1075597.77151 +1320 1247 -51131341.8213 +1321 1247 2758750.0059 +1322 1247 -549.029380333 +1248 1248 127912.066517 +1249 1248 2.1405518055e-9 +1250 1248 -3.16649675369e-8 +1255 1248 -4.19095158577e-8 +1290 1248 58941.9302781 +1291 1248 -126000.081472 +1292 1248 -31977.9212894 +1293 1248 96410.6799039 +1294 1248 -63953.9079298 +1295 1248 125999.577581 +1313 1248 -48205.533375 +1314 1248 -63000.0395342 +1315 1248 -15824.1127293 +1316 1248 -102888.869643 +1317 1248 -31647.3021051 +1318 1248 -4258.7856299 +1319 1248 62999.7874245 +1249 1249 277421263.591 +1250 1249 -4862584.93242 +1251 1249 2.38418579102e-7 +1252 1249 7.45058059692e-9 +1253 1249 1.86264514923e-9 +1254 1249 -142432303.731 +1255 1249 13518900.0241 +1256 1249 -2.98023223877e-7 +1257 1249 -1.49011611938e-8 +1258 1249 -9.31322574615e-10 +1259 1249 -186613783.242 +1290 1249 -9612.7617571 +1291 1249 7537.14112063 +1292 1249 4258.80301227 +1293 1249 -15620637.1762 +1294 1249 4258.7856299 +1295 1249 -1213933.89026 +1296 1249 51131341.8213 +1297 1249 2758750.0059 +1298 1249 188054.792069 +1299 1249 549.029380333 +1313 1249 -2433.49809579 +1314 1249 47588.3961363 +1315 1249 26026.0173589 +1316 1249 -783.478382969 +1317 1249 26025.9133 +1318 1249 -34306883.8082 +1319 1249 -2155930.95226 +1320 1249 -5.71835443378 +1321 1249 -4481942.51795 +1322 1249 -267.530688355 +1370 1249 8380.61994881 +1371 1249 16558.0786428 +1372 1249 8754.20566145 +1373 1249 8954.83129336 +1374 1249 8754.17099187 +1375 1249 -27463030.8839 +1376 1249 -1954477.44277 +1377 1249 -51131263.6705 +1378 1249 1263906.88098 +1379 1249 -816.560068688 +1250 1250 348473556.79 +1251 1250 1.49011611938e-8 +1253 1250 -1.49011611938e-8 +1254 1250 2089685525.22 +1255 1250 -306979494.245 +1256 1250 -2.04890966415e-8 +1257 1250 2.38418579102e-7 +1258 1250 1.49011611938e-8 +1259 1250 2737610512.11 +1290 1250 142200.617709 +1291 1250 -111496.170423 +1292 1250 -63000.0445602 +1293 1250 -1075597.77151 +1294 1250 -62999.7874245 +1295 1250 2115216.77646 +1296 1250 3485453.13416 +1297 1250 -40470660.2332 +1298 1250 -2758750.0059 +1299 1250 -8054.22073838 +1313 1250 35998.4925413 +1314 1250 -703970.357045 +1315 1250 -385000.256788 +1316 1250 11589.9169078 +1317 1250 -384998.717455 +1318 1250 -2155930.95226 +1319 1250 -2828387.98827 +1320 1250 83.8739820281 +1321 1250 65742146.5948 +1322 1250 3920.69901645 +1370 1250 -123973.667882 +1371 1250 -244941.991757 +1372 1250 -129500.083749 +1373 1250 -132467.918541 +1374 1250 -129499.570886 +1375 1250 -1954477.44277 +1376 1250 1068391.56416 +1377 1250 -3486599.41191 +1378 1250 -18535297.1051 +1379 1250 11974.9197548 +1251 1251 11477572694.3 +1252 1251 16677256.7023 +1253 1251 -244679197.577 +1255 1251 4.65661287308e-9 +1256 1251 1688221543.53 +1257 1251 21850211.518 +1258 1251 -320541000.264 +1293 1251 51131341.8213 +1295 1251 3485453.13416 +1296 1251 -980809367.397 +1318 1251 5.71835422516 +1319 1251 -83.8739820421 +1320 1251 -5542198771.68 +1375 1251 -51131263.6705 +1376 1251 -3486599.41191 +1377 1251 -1922837085.77 +1252 1252 2847860658.41 +1253 1252 -197461796.655 +1254 1252 -5.58793544769e-9 +1255 1252 2.38418579102e-7 +1256 1252 -21850211.518 +1257 1252 -1693713395.19 +1258 1252 -247165253.085 +1259 1252 4.54019755125e-9 +1293 1252 -2758750.0059 +1295 1252 40470660.2332 +1297 1252 -793851723.575 +1298 1252 -54114225.8237 +1299 1252 -266309.071986 +1318 1252 4481942.51795 +1319 1252 -65742146.5948 +1321 1252 1252629003.91 +1322 1252 -.0297830894124 +1375 1252 -1263906.88098 +1376 1252 18535297.1051 +1378 1252 -371206819.998 +1379 1252 266308.66495 +1253 1253 5730862541.4 +1254 1253 -3.49245965481e-10 +1255 1253 1.49011611938e-8 +1256 1253 320541000.264 +1257 1253 -247165253.085 +1258 1253 1915334306.68 +1259 1253 3.05590219796e-10 +1293 1253 -188054.792069 +1295 1253 2758750.0059 +1297 1253 -54114225.8237 +1298 1253 -3688786.39365 +1299 1253 -18153.4017404 +1318 1253 305554.507633 +1319 1253 -4481942.51795 +1321 1253 85397231.1047 +1322 1253 .43684365684 +1375 1253 -86184.7854247 +1376 1253 1263906.88098 +1378 1253 -25312292.0771 +1379 1253 18159.371937 +1254 1254 49061141002.3 +1255 1254 -2737610512.11 +1257 1254 1.39698386192e-9 +1258 1254 9.45874489844e-11 +1259 1254 16502023448.2 +1293 1254 -549.029380333 +1295 1254 8054.22073838 +1297 1254 -266309.071986 +1298 1254 -18153.4017404 +1299 1254 -66218.9915486 +1318 1254 -267.530688355 +1319 1254 3920.69901645 +1321 1254 .029783097445 +1322 1254 -744783.162124 +1375 1254 816.560068688 +1376 1254 -11974.9197548 +1378 1254 266308.66495 +1379 1254 -184697.30516 +1255 1255 440223454.816 +1256 1255 2.38418579102e-7 +1259 1255 -2737610512.11 +1260 1255 -89146153.8461 +1261 1255 2.38418579102e-7 +1265 1255 -14151923.0769 +1266 1255 -5.125e7 +1290 1255 147781.60568 +1291 1255 -220664.314194 +1292 1255 -126000.086717 +1293 1255 -387056.881921 +1294 1255 -125999.577581 +1295 1255 -9015716.20552 +1296 1255 4005033.15616 +1297 1255 42675233.5294 +1298 1255 2909028.41892 +1299 1255 8054.22073838 +1313 1255 -130799.564496 +1314 1255 -111496.114592 +1315 1255 -63000.0393152 +1316 1255 -134662.971451 +1317 1255 -62999.7926694 +1318 1255 -1213933.89026 +1319 1255 2115216.77646 +1320 1255 -3485453.13416 +1321 1255 -40470660.2332 +1322 1255 8054.22073838 +1256 1256 7078318271.44 +1257 1256 -256250211.518 +1258 1256 320541000.264 +1260 1256 5.96046447754e-8 +1261 1256 1357797948.72 +1262 1256 -2.344e8 +1265 1256 -5.125e7 +1266 1256 -837525641.026 +1293 1256 -3741317.69424 +1295 1256 -4005033.15616 +1296 1256 -3243833873.42 +1318 1256 -51131341.8213 +1319 1256 -3485453.13416 +1320 1256 -980809367.397 +1257 1257 4179161416.12 +1258 1257 -138324076.761 +1259 1257 -7.45058059692e-9 +1261 1257 2.344e8 +1262 1257 1.172e9 +1293 1257 2909028.41892 +1295 1257 -42675233.5294 +1297 1257 822511176.425 +1298 1257 56067845.193 +1299 1257 19486.0296575 +1318 1257 -2758750.0059 +1319 1257 40470660.2332 +1321 1257 -793851723.575 +1322 1257 266309.071986 +1258 1258 5882384702.26 +1259 1258 -3.72529029846e-9 +1263 1258 -1931695112.18 +1264 1258 -6.17001205683e-9 +1267 1258 -962833934.294 +1268 1258 266927.083333 +1290 1258 -49177864.0697 +1293 1258 51217570.6312 +1295 1258 -2909028.41892 +1297 1258 56067845.193 +1298 1258 990594193.69 +1299 1258 20859.5476883 +1318 1258 -188054.792069 +1319 1258 2758750.0059 +1321 1258 -54114225.8237 +1322 1258 18153.4017404 +1259 1259 50988959230.4 +1263 1259 -2.32830643654e-10 +1264 1259 8992310550.21 +1267 1259 266927.083333 +1268 1259 -43556.3568376 +1290 1259 5773.23717949 +1293 1259 -6322.26655982 +1295 1259 8054.22073838 +1297 1259 -19486.0296575 +1298 1259 -20859.5476883 +1299 1259 -365167.479462 +1318 1259 549.029380333 +1319 1259 -8054.22073838 +1321 1259 266309.071986 +1322 1259 -66218.9915486 +1260 1260 262907692.308 +1261 1260 -2.38418579102e-7 +1265 1260 -14003846.1539 +1266 1260 5.96046447754e-8 +1269 1260 -14151923.0769 +1270 1260 -5.125e7 +1295 1260 -14151923.0769 +1296 1260 5.125e7 +1261 1261 6476711794.87 +1265 1261 5.96046447754e-8 +1266 1261 -2921102564.1 +1269 1261 -5.125e7 +1270 1261 -837525641.026 +1295 1261 5.125e7 +1296 1261 -837525641.026 +1262 1262 4.688e9 +1263 1263 4054896634.61 +1264 1263 5.58793544769e-9 +1267 1263 1973544471.15 +1268 1263 -2.91038304567e-9 +1271 1263 -962833934.294 +1272 1263 266927.083333 +1287 1263 -49177864.0697 +1290 1263 102038543.721 +1293 1263 -49177864.0697 +1298 1263 -962833934.294 +1299 1263 -266927.083333 +1264 1264 35969506623.9 +1267 1264 -2.09547579288e-9 +1268 1264 -306436.965812 +1271 1264 266927.083333 +1272 1264 -43556.3568376 +1287 1264 5773.23717949 +1293 1264 -5773.23717949 +1298 1264 -266927.083333 +1299 1264 -43556.3568376 +1265 1265 70907692.3077 +1266 1265 -2.38418579102e-7 +1269 1265 6853846.15385 +1270 1265 2.38418579102e-7 +1295 1265 6853846.15385 +1296 1265 5.96046447754e-8 +1505 1265 -14151923.0769 +1506 1265 5.125e7 +1513 1265 -14003846.1539 +1514 1265 5.96046447754e-8 +1524 1265 -14151923.0769 +1525 1265 -5.125e7 +1266 1266 6414205128.2 +1269 1266 5.96046447754e-8 +1270 1266 1389051282.05 +1295 1266 2.38418579102e-7 +1296 1266 1389051282.05 +1505 1266 5.125e7 +1506 1266 -837525641.026 +1513 1266 5.96046447754e-8 +1514 1266 -2921102564.1 +1524 1266 -5.125e7 +1525 1266 -837525641.026 +1267 1267 4014896634.61 +1268 1267 5.58793544769e-9 +1271 1267 -1911695112.18 +1272 1267 -6.17001205683e-9 +1287 1267 -4.76837158203e-7 +1298 1267 -1911695112.18 +1299 1267 -2.32830643654e-10 +1503 1267 -49177864.0697 +1508 1267 -962833934.294 +1509 1267 -266927.083333 +1510 1267 102038543.721 +1516 1267 1973544471.15 +1517 1267 -2.91038304567e-9 +1521 1267 -49177864.0697 +1527 1267 -962833934.294 +1528 1267 266927.083333 +1268 1268 1506623.93162 +1271 1268 -2.32830643654e-10 +1272 1268 310550.213675 +1287 1268 -56233.974359 +1293 1268 56233.974359 +1298 1268 -6.17001205683e-9 +1299 1268 310550.213675 +1503 1268 -5773.23717949 +1508 1268 -266927.083333 +1509 1268 -43556.3568376 +1516 1268 -2.09547579288e-9 +1517 1268 -306436.965812 +1521 1268 5773.23717949 +1527 1268 266927.083333 +1528 1268 -43556.3568376 +1269 1269 70907692.3077 +1270 1269 -2.38418579102e-7 +1273 1269 6853846.15385 +1274 1269 2.38418579102e-7 +1513 1269 -14151923.0769 +1514 1269 5.125e7 +1524 1269 -14003846.1539 +1525 1269 5.96046447754e-8 +1545 1269 -14151923.0769 +1546 1269 -5.125e7 +1270 1270 6414205128.2 +1273 1270 5.96046447754e-8 +1274 1270 1389051282.05 +1513 1270 5.125e7 +1514 1270 -837525641.026 +1524 1270 5.96046447754e-8 +1525 1270 -2921102564.1 +1545 1270 -5.125e7 +1546 1270 -837525641.026 +1271 1271 4014896634.61 +1272 1271 5.58793544769e-9 +1275 1271 -1911695112.18 +1276 1271 -6.17001205683e-9 +1284 1271 -4.76837158203e-7 +1510 1271 -49177864.0697 +1516 1271 -962833934.294 +1517 1271 -266927.083333 +1521 1271 102038543.721 +1527 1271 1973544471.15 +1528 1271 -2.91038304567e-9 +1529 1271 -49177864.0697 +1548 1271 -962833934.294 +1549 1271 266927.083333 +1272 1272 1506623.93162 +1275 1272 -2.32830643654e-10 +1276 1272 310550.213675 +1284 1272 -56233.974359 +1290 1272 56233.974359 +1510 1272 -5773.23717949 +1516 1272 -266927.083333 +1517 1272 -43556.3568376 +1527 1272 -2.09547579288e-9 +1528 1272 -306436.965812 +1529 1272 5773.23717949 +1548 1272 266927.083333 +1549 1272 -43556.3568376 +1273 1273 70907692.3077 +1274 1273 -2.38418579102e-7 +1279 1273 6853846.15385 +1280 1273 2.38418579102e-7 +1524 1273 -14151923.0769 +1525 1273 5.125e7 +1545 1273 -14003846.1539 +1546 1273 5.96046447754e-8 +1550 1273 -14151923.0769 +1551 1273 -5.125e7 +1274 1274 6414205128.2 +1279 1274 5.96046447754e-8 +1280 1274 1389051282.05 +1524 1274 5.125e7 +1525 1274 -837525641.026 +1545 1274 5.96046447754e-8 +1546 1274 -2921102564.1 +1550 1274 -5.125e7 +1551 1274 -837525641.026 +1275 1275 4014896634.61 +1276 1275 5.58793544769e-9 +1277 1275 -4.76837158203e-7 +1282 1275 -1911695112.18 +1283 1275 -6.17001205683e-9 +1521 1275 -49177864.0697 +1527 1275 -962833934.294 +1528 1275 -266927.083333 +1529 1275 102038543.721 +1532 1275 -49177864.0697 +1548 1275 1973544471.15 +1549 1275 -2.91038304567e-9 +1553 1275 -962833934.294 +1554 1275 266927.083333 +1276 1276 1506623.93162 +1277 1276 -56233.974359 +1282 1276 -2.32830643654e-10 +1283 1276 310550.213675 +1287 1276 56233.974359 +1521 1276 -5773.23717949 +1527 1276 -266927.083333 +1528 1276 -43556.3568376 +1532 1276 5773.23717949 +1548 1276 -2.09547579288e-9 +1549 1276 -306436.965812 +1553 1276 266927.083333 +1554 1276 -43556.3568376 +1277 1277 42955083.9264 +1278 1277 -9.77888703346e-9 +1279 1277 -2735760.01534 +1280 1277 2.38418579102e-7 +1283 1277 -59433.564306 +1284 1277 -4750442.03273 +1285 1277 500862.367809 +1286 1277 -1.83936208487e-8 +1300 1277 -557679.138131 +1301 1277 2.18860805035e-8 +1302 1277 13437078.567 +1303 1277 -1726476.6004 +1304 1277 3.27825546265e-7 +1305 1277 -2.98023223877e-8 +1306 1277 -3199.58994701 +1307 1277 -242498.818309 +1308 1277 523194.305331 +1309 1277 6.75208866596e-9 +1529 1277 2597946.27194 +1530 1277 125215.588245 +1531 1277 -46056.6716788 +1532 1277 -12198064.757 +1533 1277 -96408.5799114 +1534 1277 -15620608.0643 +1535 1277 1075891.57521 +1536 1277 -51131283.9922 +1537 1277 -2759415.04091 +1538 1277 188146.115539 +1539 1277 549.163788417 +1540 1277 -60624.7757827 +1541 1277 130798.576333 +1542 1277 -48204.4812381 +1543 1277 -139419.927003 +1544 1277 -98556.5817522 +1548 1277 49177864.0697 +1549 1277 5773.23717949 +1550 1277 387184.231513 +1551 1277 3741313.46284 +1552 1277 2909730.02681 +1553 1277 -51217666.9529 +1554 1277 6322.4009679 +1278 1278 127911.420342 +1279 1278 -4.65661287308e-10 +1284 1278 -3.49245965481e-9 +1285 1278 -2.79396772385e-9 +1286 1278 63953.7755238 +1300 1278 9.4261020422e-9 +1301 1278 63293.5180843 +1302 1278 8.18446278572e-10 +1303 1278 1.210719347e-8 +1307 1278 1.39698386192e-9 +1308 1278 -1.25728547573e-8 +1309 1278 31645.8356908 +1529 1278 58942.9802793 +1530 1278 126000.081471 +1531 1278 -31977.7597544 +1532 1278 96408.5799114 +1533 1278 -63953.5848618 +1534 1278 -4258.78562987 +1535 1278 -62999.7874241 +1540 1278 -48204.4833749 +1541 1278 63000.0395338 +1542 1278 -15823.9511852 +1543 1278 -102888.86964 +1544 1278 -31646.9790189 +1550 1278 -125999.577581 +1279 1279 40891386.768 +1280 1279 -4.76837158203e-7 +1283 1279 -46926.2764167 +1284 1279 -591133.993006 +1285 1279 -882661.172868 +1286 1279 3.53902578354e-8 +1300 1279 538655.492471 +1301 1279 -2.84053385258e-8 +1302 1279 -1173135.73206 +1303 1279 -3647302.50439 +1304 1279 -2.23517417908e-8 +1305 1279 -2.38418579102e-7 +1306 1279 -46926.2764167 +1307 1279 523194.305331 +1308 1279 -445988.791197 +1309 1279 -1.95577740669e-8 +1529 1279 -147783.501959 +1530 1279 -220665.436925 +1531 1279 126000.086717 +1532 1279 387184.231513 +1533 1279 125999.577581 +1534 1279 1214226.78384 +1535 1279 2115175.41558 +1536 1279 3486301.3802 +1537 1279 -40470521.2551 +1538 1279 2759415.04091 +1539 1279 8054.22324738 +1540 1279 130798.576333 +1541 1279 -111497.269005 +1542 1279 63000.0393147 +1543 1279 134663.881575 +1544 1279 62999.7926699 +1545 1279 -14151923.0769 +1546 1279 5.125e7 +1550 1279 -9015729.85944 +1551 1279 -4005095.22294 +1552 1279 42675092.0579 +1553 1279 -2909730.02681 +1554 1279 8054.22324738 +1280 1280 7011453305.17 +1302 1280 -1.19209289551e-7 +1303 1280 7.45058059692e-9 +1304 1280 1723839428.81 +1532 1280 -3741313.46284 +1534 1280 -51131283.9922 +1535 1280 3486301.3802 +1536 1280 -980810342.222 +1545 1280 5.125e7 +1546 1280 -837525641.026 +1550 1280 4005095.22294 +1551 1280 -3243836024.77 +1281 1281 1684873035.94 +1282 1281 -114880259.834 +1283 1281 -3.72529029846e-9 +1303 1281 -2.38418579102e-7 +1305 1281 -1570235354.2 +1306 1281 -4.7730281949e-9 +1532 1281 -2909730.02681 +1534 1281 2759415.04091 +1535 1281 40470521.2551 +1537 1281 -793849008.447 +1538 1281 54127271.5593 +1539 1281 266308.770792 +1550 1281 -42675092.0579 +1552 1281 822508428.883 +1553 1281 -56081366.376 +1554 1281 19486.007619 +1282 1282 2015281236.36 +1283 1282 9.31322574615e-9 +1302 1282 9.31322574615e-10 +1303 1282 2.98023223877e-8 +1305 1282 107063880.567 +1306 1282 3.27418092638e-10 +1529 1282 -49177864.0697 +1532 1282 51217666.9529 +1534 1282 -188146.115539 +1535 1282 -2759415.04091 +1537 1282 54127271.5593 +1538 1282 -3690577.79915 +1539 1282 -18157.8196885 +1548 1282 -962833934.294 +1549 1282 -266927.083333 +1550 1282 2909730.02681 +1552 1282 -56081366.376 +1553 1282 990596050.074 +1554 1282 -20859.8709528 +1283 1283 1548743.93042 +1284 1283 56233.974359 +1302 1283 3199.58994701 +1303 1283 46926.2764167 +1305 1283 -4.65661287308e-10 +1306 1283 318204.878919 +1529 1283 -5773.23717949 +1532 1283 6322.4009679 +1534 1283 -549.163788417 +1535 1283 -8054.22324738 +1537 1283 266308.770792 +1538 1283 -18157.8196885 +1539 1283 -66219.1364756 +1548 1283 -266927.083333 +1549 1283 -43556.3568376 +1550 1283 8054.22324738 +1552 1283 -19486.007619 +1553 1283 20859.8709528 +1554 1283 -365167.859242 +1284 1284 11696562.4893 +1285 1284 60180.2473303 +1286 1284 -5.30853867531e-8 +1287 1284 -4748390.35692 +1288 1284 530953.752405 +1289 1284 -2.18860805035e-8 +1300 1284 -315729.068649 +1301 1284 2.39815562963e-8 +1302 1284 -38451.3142277 +1303 1284 -568806.423487 +1307 1284 -1187132.5409 +1308 1284 30407.6331939 +1309 1284 5.49480319023e-8 +1310 1284 -278691.361554 +1311 1284 538398.783833 +1312 1284 3.25962901115e-9 +1518 1284 -69672.9115941 +1519 1284 134599.695958 +1520 1284 -50352.4325477 +1521 1284 2598459.19106 +1522 1284 132738.436863 +1523 1284 -50352.2246647 +1527 1284 49177864.0697 +1528 1284 5773.23717949 +1529 1284 -4930266.87181 +1530 1284 15045.0617314 +1531 1284 -209999.302447 +1532 1284 2597946.27194 +1533 1284 -58942.9802793 +1534 1284 -9612.82855692 +1535 1284 -142201.605872 +1540 1284 -296783.41984 +1541 1284 7601.91314345 +1542 1284 -205704.584994 +1543 1284 -78932.3383675 +1544 1284 -54647.6355384 +1548 1284 -102038543.721 +1550 1284 -147783.501959 +1553 1284 49177864.0697 +1554 1284 -5773.23717949 +1285 1285 1765325.24996 +1286 1285 -4.47034835815e-8 +1287 1285 -561042.608409 +1288 1285 -882659.669918 +1289 1285 4.00468707085e-8 +1300 1285 -538657.566102 +1301 1285 2.421438694e-8 +1302 1285 -30148.8573842 +1303 1285 -445989.01456 +1307 1285 30407.6331939 +1308 1285 891973.080646 +1309 1285 -1.55996531248e-8 +1310 1285 538398.783833 +1311 1285 -445987.326051 +1312 1285 -1.51339918375e-8 +1518 1285 134599.695958 +1519 1285 -111496.902718 +1520 1285 63000.0411343 +1521 1285 -140260.653341 +1522 1285 -220665.061356 +1523 1285 126000.084971 +1529 1285 15045.0617314 +1530 1285 441331.024698 +1531 1285 -.00335299922153 +1532 1285 125215.588245 +1533 1285 -126000.081471 +1534 1285 -7537.21915954 +1535 1285 -111497.324845 +1540 1285 7601.91314345 +1541 1285 222993.127544 +1542 1285 .00349915586412 +1543 1285 -134664.386712 +1544 1285 -63000.0447796 +1550 1285 -220665.436925 +1286 1286 255823.276853 +1287 1286 -4.65661287308e-10 +1288 1286 -4.65661287308e-10 +1289 1286 63953.885801 +1300 1286 2.00347974896e-8 +1301 1286 31645.6681688 +1302 1286 2.54977494478e-9 +1303 1286 3.77185642719e-8 +1307 1286 5.16884028912e-8 +1308 1286 -2.21189111471e-8 +1309 1286 126587.249477 +1310 1286 -1.62981450558e-9 +1311 1286 -1.49011611938e-8 +1312 1286 31645.8896132 +1518 1286 -50352.4346941 +1519 1286 63000.0412075 +1520 1286 -15824.0319165 +1521 1286 54647.4275314 +1522 1286 126000.083218 +1523 1286 -31977.8123084 +1529 1286 209999.302447 +1530 1286 .00335298758 +1531 1286 -127907.167024 +1532 1286 46056.6716788 +1533 1286 -31977.7597544 +1534 1286 -4258.80301229 +1535 1286 -63000.0445605 +1540 1286 -205704.589289 +1541 1286 .00349914655089 +1542 1286 -63294.0667687 +1543 1286 -50388.8346629 +1544 1286 -15824.0349462 +1550 1286 -126000.086717 +1287 1287 11694510.8133 +1288 1287 -1.00582838059e-7 +1289 1287 -5.30853867531e-8 +1290 1287 -4748390.35692 +1291 1287 561042.608409 +1292 1287 -2.51457095146e-8 +1307 1287 -315916.527516 +1308 1287 -553601.944985 +1309 1287 2.23517417908e-8 +1310 1287 -1188171.23008 +1311 1287 5.21540641785e-8 +1312 1287 5.82076609135e-8 +1313 1287 -315916.527516 +1314 1287 553601.944985 +1315 1287 -1.16415321827e-9 +1500 1287 -78979.2030845 +1501 1287 138400.486246 +1502 1287 -52500.0339811 +1510 1287 2598459.19106 +1511 1287 140260.653341 +1512 1287 -54647.4275314 +1516 1287 49177864.0697 +1517 1287 5773.23717949 +1518 1287 -297043.0923 +1519 1287 2.421438694e-8 +1520 1287 -205704.935113 +1521 1287 -4930779.79082 +1522 1287 -2.04890966415e-8 +1523 1287 -209999.302333 +1527 1287 -102038543.721 +1529 1287 2598459.19106 +1530 1287 -140260.653341 +1531 1287 -54647.4275314 +1540 1287 -78979.2030845 +1541 1287 -138400.486246 +1542 1287 -52500.0339811 +1548 1287 49177864.0697 +1549 1287 -5773.23717949 +1288 1288 1765323.74724 +1289 1288 -5.26197254658e-8 +1290 1288 -530953.752405 +1291 1288 -882659.669918 +1292 1288 4.51691448689e-8 +1307 1288 -553601.944985 +1308 1288 -445987.400502 +1309 1288 2.65426933765e-8 +1310 1288 4.28408384323e-8 +1311 1288 891971.540819 +1312 1288 -2.65426933765e-8 +1313 1288 553601.944985 +1314 1288 -445987.400502 +1315 1288 -1.60653144121e-8 +1500 1288 138400.486246 +1501 1288 -111496.921331 +1502 1288 63000.04296 +1510 1288 -132738.436863 +1511 1288 -220665.061356 +1512 1288 126000.083218 +1518 1288 1.49011611938e-8 +1519 1288 222992.742752 +1520 1288 1.2805685401e-8 +1521 1288 -2.88709998131e-8 +1522 1288 441330.649014 +1523 1288 7.45058059692e-9 +1529 1288 132738.436863 +1530 1288 -220665.061356 +1531 1288 -126000.083218 +1540 1288 -138400.486246 +1541 1288 -111496.921331 +1542 1288 -63000.04296 +1289 1289 255823.489653 +1290 1289 2.56113708019e-9 +1291 1289 9.31322574615e-10 +1292 1289 63953.885801 +1307 1289 2.28174030781e-8 +1308 1289 4.07453626394e-8 +1309 1289 31645.8337756 +1310 1289 5.07570803165e-8 +1311 1289 -3.35276126862e-8 +1312 1289 126587.462786 +1313 1289 -2.79396772385e-9 +1314 1289 -8.38190317154e-9 +1315 1289 31645.8337756 +1500 1289 -52500.0361274 +1501 1289 63000.0428868 +1502 1289 -15824.0598354 +1510 1289 50352.2246647 +1511 1289 126000.084971 +1512 1289 -31977.8123084 +1518 1289 -205704.939408 +1519 1289 1.62981450558e-9 +1520 1289 -63294.1754996 +1521 1289 209999.302333 +1522 1289 -2.18860805035e-8 +1523 1289 -127907.276009 +1529 1289 50352.2246647 +1530 1289 -126000.084971 +1531 1289 -31977.8123084 +1540 1289 -52500.0361274 +1541 1289 -63000.0428868 +1542 1289 -15824.0598353 +1290 1290 11696561.6414 +1291 1290 -60172.6622167 +1292 1290 -5.68106770515e-8 +1293 1290 -4750441.18476 +1294 1290 -1.93249434233e-8 +1295 1290 591126.407893 +1298 1290 -4.76837158203e-7 +1299 1290 -56233.974359 +1310 1290 -278691.361554 +1311 1290 -538398.783833 +1312 1290 2.98023223877e-8 +1313 1290 -1187139.04241 +1314 1290 -30403.6805426 +1315 1290 4.2375177145e-8 +1316 1290 -315722.834333 +1317 1290 3.25962901115e-9 +1318 1290 -38451.0470284 +1319 1290 568802.470835 +1492 1290 -9612.76175711 +1493 1290 142200.617709 +1498 1290 -78930.7797894 +1499 1290 -54647.6355389 +1500 1290 -296785.04522 +1501 1290 -7600.92498006 +1502 1290 -205705.634995 +1503 1290 2597946.48393 +1504 1290 -58941.9302781 +1505 1290 147781.60568 +1508 1290 49177864.0697 +1509 1290 5773.23717949 +1510 1290 -4930267.0838 +1511 1290 -15043.165453 +1512 1290 -209999.302447 +1516 1290 -102038543.721 +1518 1290 -69672.9115941 +1519 1290 -134599.695958 +1520 1290 -50352.4325477 +1521 1290 2598459.19106 +1522 1290 -132738.436863 +1523 1290 -50352.2246647 +1527 1290 49177864.0697 +1528 1290 -5773.23717949 +1291 1291 1765320.75903 +1292 1291 -3.67872416973e-8 +1293 1291 -500869.952922 +1294 1291 3.49245965481e-8 +1295 1291 -882656.681941 +1310 1291 -538398.783833 +1311 1291 -445987.326051 +1312 1291 3.23634594679e-8 +1313 1291 -30403.6805426 +1314 1291 891968.462958 +1315 1291 -1.8859282136e-8 +1316 1291 538653.925606 +1317 1291 -1.8160790205e-8 +1318 1291 30148.5452284 +1319 1291 -445984.39687 +1492 1291 7537.14112063 +1493 1291 -111496.170423 +1498 1291 134663.476588 +1499 1291 63000.0447791 +1500 1291 -7600.92498006 +1501 1291 222991.973122 +1502 1291 -.00349873746745 +1503 1291 -125217.484523 +1504 1291 126000.081472 +1505 1291 -220664.314194 +1510 1291 -15043.1654531 +1511 1291 441329.901966 +1512 1291 .00335267791525 +1518 1291 -134599.695958 +1519 1291 -111496.902718 +1520 1291 -63000.0411343 +1521 1291 140260.653341 +1522 1291 -220665.061356 +1523 1291 -126000.084971 +1292 1292 255823.923 +1293 1292 -3.49245965481e-9 +1294 1292 63954.0986094 +1295 1292 -1.44354999065e-8 +1310 1292 2.32830643654e-8 +1311 1292 3.49245965481e-8 +1312 1292 31645.8896132 +1313 1292 5.49480319023e-8 +1314 1292 -2.77068465948e-8 +1315 1292 126587.895616 +1316 1292 4.16543334723e-9 +1317 1292 31645.9912634 +1318 1292 7.24010169506e-10 +1319 1292 -1.07102096081e-8 +1492 1292 -4258.80301227 +1493 1292 63000.0445602 +1498 1292 -50388.8346623 +1499 1292 -15824.1964766 +1500 1292 -205705.639289 +1501 1292 -.00349873863161 +1502 1292 -63294.3898549 +1503 1292 46057.721679 +1504 1292 -31977.9212894 +1505 1292 126000.086717 +1510 1292 209999.302447 +1511 1292 -.0033526904881 +1512 1292 -127907.490106 +1518 1292 -50352.4346941 +1519 1292 -63000.0412075 +1520 1292 -15824.0319165 +1521 1292 54647.4275314 +1522 1292 -126000.083218 +1523 1292 -31977.8123084 +1293 1293 42955160.1837 +1294 1293 -2.98023223877e-8 +1295 1293 2735225.00377 +1296 1293 2.38418579102e-7 +1299 1293 59432.7889871 +1313 1293 -242510.516843 +1314 1293 -523198.257983 +1315 1293 1.93249434233e-8 +1316 1293 -557685.372444 +1317 1293 1.72294676304e-8 +1318 1293 13437076.1686 +1319 1293 1726186.61204 +1320 1293 5.96046447754e-8 +1321 1293 -1.49011611938e-8 +1322 1293 3198.81462816 +1492 1293 -15620637.1762 +1493 1293 -1075597.77151 +1494 1293 -51131341.8213 +1495 1293 2758750.0059 +1496 1293 188054.792069 +1497 1293 -549.029380333 +1498 1293 -139421.485583 +1499 1293 -98558.68175 +1500 1293 -60627.7004169 +1501 1293 -130799.564496 +1502 1293 -48205.5312393 +1503 1293 -12198059.7609 +1504 1293 -96410.6799039 +1505 1293 -387056.881921 +1506 1293 3741317.69424 +1507 1293 -2909028.41892 +1508 1293 -51217570.6312 +1509 1293 -6322.26655982 +1510 1293 2597946.48393 +1511 1293 -125217.484523 +1512 1293 -46057.721679 +1516 1293 49177864.0697 +1517 1293 -5773.23717949 +1294 1294 127912.066517 +1295 1294 -4.00468707085e-8 +1313 1294 1.65309756994e-8 +1314 1294 3.07336449623e-8 +1315 1294 31646.1587581 +1316 1294 3.24128195643e-8 +1317 1294 63294.164223 +1318 1294 2.04611569643e-9 +1319 1294 -3.0267983675e-8 +1492 1294 -4258.7856299 +1493 1294 62999.7874245 +1498 1294 -102888.869643 +1499 1294 -31647.3021051 +1500 1294 -48205.533375 +1501 1294 -63000.0395342 +1502 1294 -15824.1127293 +1503 1294 96410.6799039 +1504 1294 -63953.9079298 +1505 1294 125999.577581 +1510 1294 58941.9302781 +1511 1294 -126000.081472 +1512 1294 -31977.9212894 +1295 1295 40891312.6837 +1296 1295 2.38418579102e-7 +1299 1295 -46926.3759632 +1313 1295 -523198.257983 +1314 1295 -445984.173543 +1315 1295 2.58442014456e-8 +1316 1295 -538651.851975 +1317 1295 1.35041773319e-8 +1318 1295 1172842.1032 +1319 1295 -3647352.11252 +1320 1295 4.65661287308e-9 +1321 1295 2.38418579102e-7 +1322 1295 -46926.3759632 +1492 1295 -1213933.89026 +1493 1295 2115216.77646 +1494 1295 -3485453.13416 +1495 1295 -40470660.2332 +1496 1295 -2758750.0059 +1497 1295 8054.22073838 +1498 1295 -134662.971451 +1499 1295 -62999.7926694 +1500 1295 -130799.564496 +1501 1295 -111496.114592 +1502 1295 -63000.0393152 +1503 1295 -387056.881921 +1504 1295 -125999.577581 +1505 1295 -9015716.20552 +1506 1295 4005033.15616 +1507 1295 42675233.5294 +1508 1295 2909028.41892 +1509 1295 8054.22073838 +1510 1295 147781.60568 +1511 1295 -220664.314194 +1512 1295 -126000.086717 +1513 1295 -14151923.0769 +1514 1295 -5.125e7 +1296 1296 7011449271.41 +1318 1296 -2.98023223877e-7 +1319 1296 -2.04890966415e-8 +1320 1296 1723837210.23 +1492 1296 -51131341.8213 +1493 1296 -3485453.13416 +1494 1296 -980809367.397 +1503 1296 -3741317.69424 +1505 1296 -4005033.15616 +1506 1296 -3243833873.42 +1513 1296 -5.125e7 +1514 1296 -837525641.026 +1297 1297 1684878579.82 +1298 1297 114852556.525 +1299 1297 -7.45058059692e-9 +1318 1297 -1.49011611938e-8 +1319 1297 2.38418579102e-7 +1321 1297 -1570240768.42 +1322 1297 1.39698386192e-9 +1492 1297 -2758750.0059 +1493 1297 40470660.2332 +1495 1297 -793851723.575 +1496 1297 -54114225.8237 +1497 1297 266309.071986 +1503 1297 2909028.41892 +1505 1297 -42675233.5294 +1507 1297 822511176.425 +1508 1297 56067845.193 +1509 1297 19486.0296575 +1298 1298 2015277433.24 +1299 1298 -3.72529029846e-9 +1318 1298 -9.31322574615e-10 +1319 1298 1.49011611938e-8 +1321 1298 -107038079.047 +1322 1298 9.45874489844e-11 +1492 1298 -188054.792069 +1493 1298 2758750.0059 +1495 1298 -54114225.8237 +1496 1298 -3688786.39365 +1497 1298 18153.4017404 +1503 1298 51217570.6312 +1505 1298 -2909028.41892 +1507 1298 56067845.193 +1508 1298 990594193.69 +1509 1298 20859.5476883 +1510 1298 -49177864.0697 +1516 1298 -962833934.294 +1517 1298 266927.083333 +1299 1299 1548743.59106 +1318 1299 -3198.81462816 +1319 1299 46926.3759632 +1321 1299 4.54019755125e-9 +1322 1299 318204.799166 +1492 1299 549.029380333 +1493 1299 -8054.22073838 +1495 1299 266309.071986 +1496 1299 18153.4017404 +1497 1299 -66218.9915486 +1503 1299 -6322.26655982 +1505 1299 8054.22073838 +1507 1299 -19486.0296575 +1508 1299 -20859.5476883 +1509 1299 -365167.479462 +1510 1299 5773.23717949 +1516 1299 266927.083333 +1517 1299 -43556.3568376 +1300 1300 865951.700196 +1301 1300 -2.92725861072e-8 +1302 1300 -3133.98761478 +1303 1300 -46360.7635322 +1307 1300 434548.166296 +1308 1300 46360.5270536 +1309 1300 -1.89987942576e-8 +1323 1300 -270288.660567 +1324 1300 1.81054696441e-8 +1325 1300 -37999.9132709 +1326 1300 -562128.89454 +1344 1300 -115667.432407 +1345 1300 562131.091828 +1346 1300 3.26670706272e-9 +1470 1300 -28916.9951293 +1471 1300 140532.78222 +1472 1300 -50276.8313041 +1473 1300 -9499.97721747 +1474 1300 -140532.207359 +1479 1300 -67572.4404121 +1480 1300 -96214.3623491 +1529 1300 -78932.3383675 +1530 1300 -134664.386712 +1531 1300 50388.8346629 +1532 1300 -139419.927003 +1533 1300 102888.86964 +1534 1300 -783.494995224 +1535 1300 -11590.1626512 +1540 1300 108636.83352 +1541 1300 11590.149338 +1542 1300 -6338.50750891 +1543 1300 216487.506679 +1544 1300 223.995963975 +1550 1300 134663.881575 +1301 1301 374460.402373 +1302 1301 -2.39238142967e-9 +1303 1301 -3.53902578354e-8 +1307 1301 -2.16532498598e-8 +1308 1301 2.28174030781e-8 +1309 1301 187223.8496 +1323 1301 6.75804913044e-9 +1324 1301 121803.558715 +1325 1301 6.92531466484e-10 +1326 1301 1.02445483208e-8 +1344 1301 -2.09547579288e-9 +1345 1301 -1.62981450558e-8 +1346 1301 60899.6521431 +1470 1301 -41522.6300342 +1471 1301 129500.0842 +1472 1301 -30451.419283 +1473 1301 -8754.17065987 +1474 1301 -129499.565974 +1479 1301 -96364.8662621 +1480 1301 -60900.7113514 +1529 1301 54647.6355384 +1530 1301 63000.0447796 +1531 1301 -15824.0349462 +1532 1301 98556.5817522 +1533 1301 -31646.9790189 +1534 1301 -26025.9133 +1535 1301 -384998.717456 +1540 1301 19687.5164295 +1541 1301 385000.257122 +1542 1301 -93615.5105096 +1543 1301 -223.99596399 +1544 1301 -187224.669433 +1550 1301 -62999.7926699 +1302 1302 95019839.6514 +1303 1302 -5825057.68941 +1304 1302 -2.38418579102e-7 +1305 1302 -2.98023223877e-8 +1306 1302 1069.37560319 +1307 1302 -9734.12608841 +1308 1302 -190356.475107 +1309 1302 2.23498791456e-9 +1323 1302 35819.0407201 +1324 1302 -2.73864716291e-9 +1325 1302 46297151.7753 +1326 1302 -3220385.60788 +1327 1302 3.8743019104e-7 +1329 1302 -2130.21434382 +1344 1302 33522.7124491 +1345 1302 -66232.978676 +1346 1302 -1.63689255714e-9 +1470 1302 8380.67811227 +1471 1302 -16558.2539321 +1472 1302 8754.20566147 +1473 1302 -27463048.6159 +1474 1302 1954248.43917 +1475 1302 -51131291.8077 +1476 1302 -1263758.79445 +1477 1302 86164.4408314 +1478 1302 816.463332821 +1479 1302 8954.7612803 +1480 1302 8754.17099186 +1529 1302 -9612.82855692 +1530 1302 -7537.21915954 +1531 1302 4258.80301229 +1532 1302 -15620608.0643 +1533 1302 4258.78562987 +1534 1302 -34306895.0629 +1535 1302 2155868.06755 +1536 1302 .571871310472 +1537 1302 4482459.4665 +1538 1302 -305625.485774 +1539 1302 267.299544403 +1540 1302 -2433.53225658 +1541 1302 -47589.1472164 +1542 1302 26026.0173588 +1543 1302 -783.494995224 +1544 1302 26025.9133 +1550 1302 1214226.78384 +1551 1302 51131283.9922 +1552 1302 -2759415.04091 +1553 1302 188146.115539 +1554 1302 -549.163788417 +1303 1303 10007092.789 +1304 1303 1.49011611938e-8 +1305 1303 -2.38418579102e-7 +1306 1303 15682.7949399 +1307 1303 -143995.948053 +1308 1303 -2815924.18797 +1309 1303 3.30619513988e-8 +1323 1303 529867.466274 +1324 1303 -4.05125319958e-8 +1325 1303 -3220385.60788 +1326 1303 -707722.974197 +1327 1303 -2.60770320892e-8 +1329 1303 -31243.4814768 +1344 1303 495898.113152 +1345 1303 -979777.791065 +1346 1303 -2.421438694e-8 +1470 1303 123974.528288 +1471 1303 -244944.584794 +1472 1303 129500.08375 +1473 1303 1954248.43917 +1474 1303 1068426.10716 +1475 1303 3486186.75252 +1476 1303 -18535329.3672 +1477 1303 1263758.79445 +1478 1303 11974.9250067 +1479 1303 132466.882845 +1480 1303 129499.570885 +1529 1303 -142201.605872 +1530 1303 -111497.324845 +1531 1303 63000.0445605 +1532 1303 1075891.57521 +1533 1303 62999.7874241 +1534 1303 2155868.06755 +1535 1303 -2828366.30382 +1536 1303 8.38739082776 +1537 1303 65742039.8791 +1538 1303 -4482459.4665 +1539 1303 3920.7017593 +1540 1303 -35998.9978784 +1541 1303 -703981.467699 +1542 1303 385000.256788 +1543 1303 -11590.1626512 +1544 1303 384998.717456 +1550 1303 2115175.41558 +1551 1303 -3486301.3802 +1552 1303 -40470521.2551 +1553 1303 2759415.04091 +1554 1303 -8054.22324738 +1304 1304 11437856286.3 +1325 1304 -2.98023223877e-7 +1326 1304 2.04890966415e-8 +1327 1304 3729994733.66 +1473 1304 -51131291.8077 +1474 1304 3486186.75252 +1475 1304 -1922836059.47 +1532 1304 51131283.9922 +1534 1304 -.571871221065 +1535 1304 -8.38739083428 +1536 1304 -5542198822.7 +1550 1304 -3486301.3802 +1551 1304 -980810342.222 +1305 1305 2624457675.93 +1306 1305 5.58793544769e-9 +1328 1305 -703940480.373 +1329 1305 -4.07453626394e-9 +1473 1305 1263758.79445 +1474 1305 18535329.3672 +1476 1305 -371207454.429 +1477 1305 25309325.5483 +1478 1305 266308.811499 +1532 1305 2759415.04091 +1534 1305 -4482459.4665 +1535 1305 -65742039.8791 +1537 1305 1252626923.21 +1538 1305 -85407310.3125 +1539 1305 .00297848985065 +1550 1305 40470521.2551 +1552 1305 -793849008.447 +1553 1305 54127271.5593 +1554 1305 -266308.770792 +1306 1306 2041845.55752 +1325 1306 2130.21434382 +1326 1306 31243.4814768 +1329 1306 459767.331148 +1473 1306 -816.463332821 +1474 1306 -11974.9250067 +1476 1306 266308.811499 +1477 1306 -18157.2226694 +1478 1306 -184697.186945 +1532 1306 549.163788417 +1534 1306 267.299544403 +1535 1306 3920.7017593 +1537 1306 -.00297849369235 +1538 1306 -.0436843274074 +1539 1306 -744783.215535 +1550 1306 8054.22324738 +1552 1306 -266308.770792 +1553 1306 18157.8196885 +1554 1306 -66219.1364756 +1307 1307 1738559.48927 +1308 1307 191994.392456 +1309 1307 -7.72997736931e-8 +1310 1307 431362.328716 +1311 1307 -47998.4246409 +1312 1307 -1.16415321827e-8 +1323 1307 -153530.567528 +1324 1307 1.58324837685e-8 +1325 1307 -40296.536819 +1326 1307 -596102.615665 +1344 1307 -538262.713177 +1345 1307 66803.3716809 +1346 1307 2.00234353542e-8 +1357 1307 -117094.82218 +1358 1307 529299.231553 +1359 1307 9.31322574615e-10 +1467 1307 -29273.8425731 +1468 1307 132324.807888 +1469 1307 -45937.5284672 +1470 1307 -134566.226008 +1471 1307 16700.8522442 +1472 1307 -192579.573976 +1473 1307 -10074.1342047 +1474 1307 -149025.653916 +1479 1307 -38382.7789096 +1480 1307 -54766.9844821 +1518 1307 107840.373884 +1519 1307 -11999.6097904 +1520 1307 6562.50109771 +1521 1307 -78979.2030845 +1522 1307 -138400.486246 +1523 1307 52500.0361274 +1529 1307 -296783.41984 +1530 1307 7601.91314344 +1531 1307 205704.589289 +1532 1307 -60624.7757827 +1533 1307 48204.4833749 +1534 1307 -2433.53225658 +1535 1307 -35998.9978784 +1540 1307 434639.039371 +1541 1307 47998.5977878 +1542 1307 -.00653399853036 +1543 1307 108636.83352 +1544 1307 -19687.5164296 +1550 1307 130798.576333 +1308 1308 5631840.98232 +1309 1308 -1.02911144495e-7 +1310 1308 -47998.4246409 +1311 1308 -2815909.359 +1312 1308 3.21306288242e-8 +1323 1308 -529869.62189 +1324 1308 3.44589352608e-8 +1325 1308 -66232.9937755 +1326 1308 -979778.01443 +1344 1308 66803.3716808 +1345 1308 1959551.44993 +1346 1308 -1.16415321827e-8 +1357 1308 529299.231553 +1358 1308 -979774.402527 +1359 1308 -1.16415321827e-8 +1467 1308 132324.807888 +1468 1308 -244943.73766 +1469 1308 129500.085535 +1470 1308 16700.8522441 +1471 1308 489887.58803 +1472 1308 .00327597605065 +1473 1308 -16558.2577069 +1474 1308 -244944.640635 +1479 1308 -132467.396209 +1480 1308 -129500.089111 +1518 1308 -11999.6097904 +1519 1308 -703977.760952 +1520 1308 385000.256899 +1521 1308 -138400.486246 +1522 1308 -111496.921331 +1523 1308 63000.0428869 +1529 1308 7601.91314344 +1530 1308 222993.127544 +1531 1308 -.00349915865809 +1532 1308 130798.576333 +1533 1308 -63000.0395339 +1534 1308 -47589.1472164 +1535 1308 -703981.467699 +1540 1308 47998.5977878 +1541 1308 1407959.40307 +1542 1308 .000669685192406 +1543 1308 11590.149338 +1544 1308 -385000.257122 +1550 1308 -111497.269005 +1309 1309 748922.770023 +1310 1309 -1.79279595613e-8 +1311 1309 4.74974513054e-8 +1312 1309 187224.845875 +1323 1309 1.03943049908e-8 +1324 1309 60899.4846199 +1325 1309 2.64421105385e-9 +1326 1309 3.91155481339e-8 +1344 1309 2.00234353542e-8 +1345 1309 -5.26197254658e-8 +1346 1309 243607.55651 +1357 1309 -5.35510480404e-9 +1358 1309 -1.86264514923e-9 +1359 1309 60899.8213261 +1467 1309 -45937.5328796 +1468 1309 129500.085685 +1469 1309 -30451.5560596 +1470 1309 -192579.582806 +1471 1309 .0032759681344 +1472 1309 -121801.6459 +1473 1309 -8754.20599346 +1474 1309 -129500.088661 +1479 1309 -46012.7828802 +1480 1309 -30451.5030446 +1518 1309 6562.50766211 +1519 1309 385000.257011 +1520 1309 -93615.9995546 +1521 1309 52500.0339811 +1522 1309 63000.04296 +1523 1309 -15824.0598354 +1529 1309 205704.584994 +1530 1309 -.0034991549328 +1531 1309 -63294.0667688 +1532 1309 48204.4812381 +1533 1309 -15823.9511852 +1534 1309 -26026.0173588 +1535 1309 -385000.256788 +1540 1309 .00653395801783 +1541 1309 -.000669718254358 +1542 1309 -374450.330591 +1543 1309 6338.5075089 +1544 1309 -93615.5105096 +1550 1309 -63000.0393148 +1310 1310 1732020.21814 +1311 1310 -1.37835741043e-7 +1312 1310 -7.49714672565e-8 +1313 1310 431362.328716 +1314 1310 47998.4246409 +1315 1310 -1.23400241137e-8 +1344 1310 -154323.26743 +1345 1310 -562701.497265 +1346 1310 1.25728547573e-8 +1357 1310 -540541.055778 +1358 1310 7.45058059692e-9 +1359 1310 2.28174030781e-8 +1370 1310 -154323.26743 +1371 1310 562701.497265 +1372 1310 -3.25962901115e-9 +1467 1310 -135135.811977 +1468 1310 1.210719347e-8 +1469 1310 -192579.924088 +1470 1310 -38580.9538854 +1471 1310 -140675.374316 +1472 1310 -50352.4314138 +1487 1310 -38580.9538854 +1488 1310 140675.374316 +1489 1310 -50352.4314138 +1500 1310 107840.373884 +1501 1310 11999.6097904 +1502 1310 -6562.50766212 +1510 1310 -69672.9115941 +1511 1310 -134599.695958 +1512 1310 50352.4346941 +1518 1310 433004.221597 +1519 1310 -4.09781932831e-8 +1520 1310 -.00655680708587 +1521 1310 -297043.0923 +1522 1310 8.38190317154e-9 +1523 1310 205704.939408 +1529 1310 -69672.9115941 +1530 1310 134599.695958 +1531 1310 50352.4346941 +1540 1310 107840.373884 +1541 1310 -11999.6097904 +1542 1310 -6562.50766212 +1311 1311 5631826.15405 +1312 1311 -1.06636434793e-7 +1313 1311 47998.4246409 +1314 1311 -2815909.359 +1315 1311 5.54136931896e-8 +1344 1311 -562701.497265 +1345 1311 -979774.476984 +1346 1311 2.46800482273e-8 +1357 1311 9.31322574615e-9 +1358 1311 1959547.98652 +1359 1311 -3.81842255592e-8 +1370 1311 562701.497265 +1371 1311 -979774.476984 +1372 1311 -3.72529029846e-9 +1467 1311 5.58793544769e-9 +1468 1311 489886.722493 +1469 1311 9.31322574615e-10 +1470 1311 -140675.374316 +1471 1311 -244943.756274 +1472 1311 -129500.087326 +1487 1311 140675.374316 +1488 1311 -244943.756274 +1489 1311 129500.087326 +1500 1311 11999.6097904 +1501 1311 -703977.760952 +1502 1311 385000.257011 +1510 1311 -134599.695958 +1511 1311 -111496.902718 +1512 1311 63000.0412075 +1518 1311 -3.632158041e-8 +1519 1311 1407955.69599 +1520 1311 -1.30385160446e-8 +1521 1311 7.45058059692e-9 +1522 1311 222992.742752 +1523 1311 -1.51339918375e-8 +1529 1311 134599.695958 +1530 1311 -111496.902718 +1531 1311 -63000.0412075 +1540 1311 -11999.6097904 +1541 1311 -703977.760952 +1542 1311 -385000.257011 +1312 1312 748924.735309 +1313 1312 -2.46800482273e-8 +1314 1312 5.54136931896e-8 +1315 1312 187224.845875 +1344 1312 1.02445483208e-8 +1345 1312 2.79396772385e-8 +1346 1312 60899.7654835 +1357 1312 1.86264514923e-8 +1358 1312 -3.632158041e-8 +1359 1312 243607.995588 +1370 1312 -7.68341124058e-9 +1371 1312 -2.32830643654e-9 +1372 1312 60899.7654835 +1467 1312 -192579.932918 +1468 1312 1.39698386192e-9 +1469 1312 -121801.869096 +1470 1312 -50352.4358261 +1471 1312 -129500.087176 +1472 1312 -30451.5839809 +1487 1312 -50352.4358261 +1488 1312 129500.087176 +1489 1312 -30451.5839809 +1500 1312 -6562.50109772 +1501 1312 385000.256899 +1502 1312 -93615.9995546 +1510 1312 50352.4325477 +1511 1312 63000.0411343 +1512 1312 -15824.0319165 +1518 1312 .00655677029863 +1519 1312 -1.62981450558e-8 +1520 1312 -374451.322313 +1521 1312 205704.935113 +1522 1312 -1.51339918375e-8 +1523 1312 -63294.1754996 +1529 1312 50352.4325477 +1530 1312 -63000.0411343 +1531 1312 -15824.0319165 +1540 1312 -6562.50109771 +1541 1312 -385000.256899 +1542 1312 -93615.9995546 +1313 1313 1738577.43347 +1314 1313 -191992.371108 +1315 1313 -5.54136931896e-8 +1316 1313 434557.139589 +1317 1313 -1.8160790205e-8 +1318 1313 -9733.98944519 +1319 1313 143993.926704 +1357 1313 -117094.82218 +1358 1313 -529299.231553 +1359 1313 1.2805685401e-8 +1370 1313 -538265.241303 +1371 1313 -66806.8133053 +1372 1313 1.62981450558e-8 +1373 1313 -153536.660819 +1374 1313 -2.32830643654e-10 +1375 1313 -40296.7694729 +1376 1313 596106.057291 +1467 1313 -29273.8425731 +1468 1313 -132324.807888 +1469 1313 -45937.5284672 +1481 1313 -10074.1923682 +1482 1313 149026.514323 +1487 1313 -134566.858043 +1488 1313 -16701.7126509 +1489 1313 -192580.623976 +1490 1313 -38384.3022338 +1491 1313 -54768.0344823 +1492 1313 -2433.49809579 +1493 1313 35998.4925413 +1498 1313 108639.076841 +1499 1313 -19687.5164295 +1500 1313 434643.525417 +1501 1313 -47998.0924504 +1502 1313 -.00653404742479 +1503 1313 -60627.7004169 +1504 1313 48205.533375 +1505 1313 -130799.564496 +1510 1313 -296785.04522 +1511 1313 -7600.92498007 +1512 1313 205705.639289 +1518 1313 107840.373884 +1519 1313 11999.6097904 +1520 1313 6562.50109771 +1521 1313 -78979.2030845 +1522 1313 138400.486246 +1523 1313 52500.0361274 +1314 1314 5631796.53975 +1315 1314 -1.2619420886e-7 +1316 1314 -46359.5440805 +1317 1314 5.02914190292e-8 +1318 1314 190353.470785 +1319 1314 -2815879.74533 +1357 1314 -529299.231553 +1358 1314 -979774.402527 +1359 1314 3.58559191227e-8 +1370 1314 -66806.8133053 +1371 1314 1959541.07778 +1372 1314 -4.842877388e-8 +1373 1314 529873.764672 +1374 1314 -8.38190317154e-9 +1375 1314 66232.2926191 +1376 1314 -979767.642294 +1467 1314 -132324.807888 +1468 1314 -244943.73766 +1469 1314 -129500.085535 +1481 1314 16558.0824179 +1482 1314 -244942.047602 +1487 1314 -16701.7126509 +1488 1314 489884.994991 +1489 1314 -.00327619258314 +1490 1314 132468.431905 +1491 1314 129500.089111 +1492 1314 47588.3961363 +1493 1314 -703970.357045 +1498 1314 -11589.903595 +1499 1314 385000.257122 +1500 1314 -47998.0924504 +1501 1314 1407948.29242 +1502 1314 -.00066911522299 +1503 1314 -130799.564496 +1504 1314 63000.0395342 +1505 1314 -111496.114592 +1510 1314 -7600.92498008 +1511 1314 222991.973122 +1512 1314 .00349872675724 +1518 1314 11999.6097904 +1519 1314 -703977.760952 +1520 1314 -385000.256899 +1521 1314 138400.486246 +1522 1314 -111496.921331 +1523 1314 -63000.0428869 +1315 1315 748928.693076 +1316 1315 -1.57743692398e-8 +1317 1315 187226.811227 +1318 1315 -3.08491289616e-9 +1319 1315 4.56348061562e-8 +1357 1315 1.37370079756e-8 +1358 1315 3.07336449623e-8 +1359 1315 60899.8213261 +1370 1315 1.62981450558e-8 +1371 1315 -3.72529029846e-8 +1372 1315 243608.884699 +1373 1315 -5.82076609135e-9 +1374 1315 60900.1487302 +1467 1315 -45937.5328796 +1468 1315 -129500.085685 +1469 1315 -30451.5560596 +1481 1315 -8754.20599347 +1482 1315 129500.088661 +1487 1315 -192580.632807 +1488 1315 -.00327620049939 +1489 1315 -121802.310014 +1490 1315 -46013.8328814 +1491 1315 -30451.8350938 +1492 1315 -26026.0173589 +1493 1315 385000.256788 +1498 1315 6338.50750888 +1499 1315 -93616.9912427 +1500 1315 .00653402134776 +1501 1315 .000669079367071 +1502 1315 -374453.292157 +1503 1315 48205.5312393 +1504 1315 -15824.1127293 +1505 1315 63000.0393152 +1510 1315 205705.634995 +1511 1315 .00349873583764 +1512 1315 -63294.389855 +1518 1315 6562.50766212 +1519 1315 -385000.257011 +1520 1315 -93615.9995546 +1521 1315 52500.0339811 +1522 1315 -63000.04296 +1523 1315 -15824.0598354 +1316 1316 865942.660463 +1317 1316 -3.94824892283e-8 +1318 1316 -3133.92116584 +1319 1316 46359.7805598 +1370 1316 -115664.67162 +1371 1316 -562126.949045 +1372 1316 1.81619077921e-8 +1373 1316 -270291.7014 +1374 1316 -6.2957406044e-11 +1375 1316 -37999.6332189 +1376 1316 562124.751759 +1481 1316 -9499.90720441 +1482 1316 140531.171663 +1487 1316 -28916.3049341 +1488 1316 -140531.746524 +1489 1316 -50276.8313036 +1490 1316 -67573.2006234 +1491 1316 -96214.3623527 +1492 1316 -783.478382969 +1493 1316 11589.9169078 +1498 1316 216485.246741 +1499 1316 223.995963952 +1500 1316 108639.076841 +1501 1316 -11589.903595 +1502 1316 -6338.50750889 +1503 1316 -139421.485583 +1504 1316 102888.869643 +1505 1316 -134662.971451 +1510 1316 -78930.7797894 +1511 1316 134663.476588 +1512 1316 50388.8346623 +1317 1317 374466.325385 +1318 1317 4.09223139286e-9 +1319 1317 -6.053596735e-8 +1370 1317 1.210719347e-8 +1371 1317 3.67872416973e-8 +1372 1317 60900.3162667 +1373 1317 1.95186585188e-8 +1374 1317 121804.886905 +1375 1317 2.83308327198e-9 +1376 1317 -4.19095158577e-8 +1481 1317 -8754.17065986 +1482 1317 129499.565974 +1487 1317 -41522.6300347 +1488 1317 -129500.0842 +1489 1317 -30451.7513255 +1490 1317 -96366.9662598 +1491 1317 -60901.3754654 +1492 1317 -26025.9133 +1493 1317 384998.717455 +1498 1317 -223.995963972 +1499 1317 -187227.63102 +1500 1317 19687.5164295 +1501 1317 -385000.257122 +1502 1317 -93616.9912427 +1503 1317 98558.68175 +1504 1317 -31647.3021052 +1505 1317 62999.7926695 +1510 1317 54647.6355389 +1511 1317 -63000.0447791 +1512 1317 -15824.1964766 +1318 1318 95019862.8029 +1319 1318 5824965.31888 +1320 1318 2.38418579102e-7 +1321 1318 7.45058059692e-9 +1322 1318 -1068.34849611 +1370 1318 33522.4797952 +1371 1318 66232.2775184 +1372 1318 -2.32942402363e-9 +1373 1318 35819.3207722 +1374 1318 6.2957406044e-11 +1375 1318 46297130.4962 +1376 1318 3220775.62319 +1377 1318 5.96046447754e-8 +1378 1318 -7.45058059692e-9 +1379 1318 2130.46613205 +1481 1318 -27463030.8839 +1482 1318 -1954477.44277 +1483 1318 -51131263.6705 +1484 1318 1263906.88098 +1485 1318 86184.7854247 +1486 1318 -816.560068688 +1487 1318 8380.61994881 +1488 1318 16558.0786428 +1489 1318 8754.20566145 +1490 1318 8954.83129336 +1491 1318 8754.17099187 +1492 1318 -34306883.8082 +1493 1318 -2155930.95226 +1494 1318 -5.71835443378 +1495 1318 -4481942.51795 +1496 1318 -305554.507633 +1497 1318 -267.530688355 +1498 1318 -783.478382969 +1499 1318 26025.9133 +1500 1318 -2433.49809579 +1501 1318 47588.3961363 +1502 1318 26026.0173589 +1503 1318 -15620637.1762 +1504 1318 4258.7856299 +1505 1318 -1213933.89026 +1506 1318 51131341.8213 +1507 1318 2758750.0059 +1508 1318 188054.792069 +1509 1318 549.029380333 +1510 1318 -9612.7617571 +1511 1318 7537.14112063 +1512 1318 4258.80301227 +1319 1319 10007038.9349 +1320 1319 1.49011611938e-8 +1322 1319 15682.917031 +1370 1319 -495894.671527 +1371 1319 -979767.418912 +1372 1319 3.44589352608e-8 +1373 1319 -529871.609056 +1374 1319 -9.31322574615e-10 +1375 1319 3220775.62319 +1376 1319 -707678.927545 +1377 1319 3.72529029846e-9 +1378 1319 1.19209289551e-7 +1379 1319 -31243.4589322 +1481 1319 -1954477.44277 +1482 1319 1068391.56416 +1483 1319 -3486599.41191 +1484 1319 -18535297.1051 +1485 1319 -1263906.88098 +1486 1319 11974.9197548 +1487 1319 -123973.667882 +1488 1319 -244941.991757 +1489 1319 -129500.083749 +1490 1319 -132467.918541 +1491 1319 -129499.570886 +1492 1319 -2155930.95226 +1493 1319 -2828387.98827 +1494 1319 83.8739820281 +1495 1319 65742146.5948 +1496 1319 4481942.51795 +1497 1319 3920.69901645 +1498 1319 11589.9169078 +1499 1319 -384998.717455 +1500 1319 35998.4925413 +1501 1319 -703970.357045 +1502 1319 -385000.256788 +1503 1319 -1075597.77151 +1504 1319 -62999.7874245 +1505 1319 2115216.77646 +1506 1319 3485453.13416 +1507 1319 -40470660.2332 +1508 1319 -2758750.0059 +1509 1319 -8054.22073838 +1510 1319 142200.617709 +1511 1319 -111496.170423 +1512 1319 -63000.0445602 +1320 1320 11437856389.6 +1375 1320 -4.47034835815e-7 +1376 1320 -2.98023223877e-8 +1377 1320 3729996849.91 +1481 1320 -51131263.6705 +1482 1320 -3486599.41191 +1483 1320 -1922837085.77 +1492 1320 5.71835422516 +1493 1320 -83.8739820421 +1494 1320 -5542198771.68 +1503 1320 51131341.8213 +1505 1320 3485453.13416 +1506 1320 -980809367.397 +1321 1321 2624461841.56 +1322 1321 -5.58793544769e-9 +1378 1321 -703939231.802 +1379 1321 -4.65661287308e-10 +1481 1321 -1263906.88098 +1482 1321 18535297.1051 +1484 1321 -371206819.998 +1485 1321 -25312292.0771 +1486 1321 266308.66495 +1492 1321 4481942.51795 +1493 1321 -65742146.5948 +1495 1321 1252629003.91 +1496 1321 85397231.1047 +1497 1321 -.0297830894124 +1503 1321 -2758750.0059 +1505 1321 40470660.2332 +1507 1321 -793851723.575 +1508 1321 -54114225.8237 +1509 1321 -266309.071986 +1322 1322 2041845.77144 +1375 1322 -2130.46613205 +1376 1322 31243.4589322 +1378 1322 5.47152012587e-9 +1379 1322 459767.517846 +1481 1322 816.560068688 +1482 1322 -11974.9197548 +1484 1322 266308.66495 +1485 1322 18159.371937 +1486 1322 -184697.30516 +1492 1322 -267.530688355 +1493 1322 3920.69901645 +1495 1322 .029783097445 +1496 1322 -.436843656302 +1497 1322 -744783.162124 +1503 1322 -549.029380333 +1505 1322 8054.22073838 +1507 1322 -266309.071986 +1508 1322 -18153.4017404 +1509 1322 -66218.9915486 +1323 1323 518005.955707 +1324 1323 -2.36086547375e-8 +1325 1323 -4571.64122395 +1326 1323 -67627.8287567 +1330 1323 -245434.953487 +1331 1323 1.798607409e-8 +1332 1323 -38110.1712081 +1333 1323 -563759.929115 +1344 1323 261298.527443 +1345 1323 67627.647581 +1346 1323 -1.53809785843e-8 +1347 1323 -103185.437932 +1348 1323 563762.124492 +1349 1323 2.51773744821e-9 +1456 1323 -9527.54180266 +1457 1323 -140939.967495 +1462 1323 -61358.9884017 +1463 1323 -87385.2564527 +1464 1323 -25796.4839459 +1465 1323 140940.539537 +1466 1323 -45862.2783615 +1470 1323 65324.3705898 +1471 1323 16906.9338658 +1472 1323 -8528.11010263 +1473 1323 -1142.90791609 +1474 1323 -16906.9218356 +1479 1323 129500.963556 +1480 1323 300.994571214 +1534 1323 8954.76128029 +1535 1323 132466.882845 +1540 1323 -38382.7789096 +1541 1323 -132467.396209 +1542 1323 46012.7828802 +1543 1323 -67572.4404121 +1544 1323 96364.8662621 +1324 1324 464879.98722 +1325 1324 -3.39969992638e-9 +1326 1324 -5.02914190292e-8 +1330 1324 6.94692134857e-9 +1331 1324 110635.28095 +1332 1324 5.03659248352e-10 +1333 1324 7.45058059692e-9 +1344 1324 -1.25728547573e-8 +1345 1324 3.25962901115e-8 +1346 1324 232430.727193 +1347 1324 -2.09547579288e-9 +1348 1324 -1.53668224812e-8 +1349 1324 55315.2897779 +1456 1324 -8754.17067509 +1457 1324 -129499.5662 +1462 1324 -87535.7603657 +1463 1324 -55316.386255 +1464 1324 -37108.0770763 +1465 1324 129500.084425 +1466 1324 -27659.3684761 +1470 1324 26488.722105 +1471 1324 518000.345946 +1472 1324 -116221.153843 +1473 1324 -35016.6833491 +1474 1324 -517998.274395 +1479 1324 -300.994571226 +1480 1324 -232433.041269 +1534 1324 -8754.17099186 +1535 1324 -129499.570885 +1540 1324 54766.9844821 +1541 1324 129500.089111 +1542 1324 -30451.5030446 +1543 1324 96214.3623491 +1544 1324 -60900.7113514 +1325 1325 115672247.857 +1326 1325 -7283356.40459 +1328 1325 -7.45058059692e-9 +1329 1325 -1.89174897969e-10 +1330 1325 35708.7827829 +1331 1325 -3.08491289616e-9 +1332 1325 46297604.4952 +1333 1325 -3213688.56774 +1334 1325 3.8743019104e-7 +1336 1325 -2130.21434382 +1344 1325 -14199.6262899 +1345 1325 -277681.290922 +1346 1325 3.27378511429e-9 +1347 1325 33180.2505301 +1348 1325 -72930.0160589 +1349 1325 -1.35358422995e-9 +1456 1325 -27462935.4358 +1457 1325 1955922.70006 +1458 1325 -51131291.8077 +1459 1325 -1263758.79445 +1460 1325 86164.4408315 +1461 1325 816.463332821 +1462 1325 8927.1966951 +1463 1325 8754.17097664 +1464 1325 8295.06263252 +1465 1325 -18232.5124284 +1466 1325 8754.20567669 +1470 1325 -3549.90747404 +1471 1325 -69420.358038 +1472 1325 35016.8233555 +1473 1325 -49186384.0026 +1474 1325 3261177.42942 +1476 1325 3145458.87938 +1477 1325 -214460.786893 +1478 1325 7.27595761418e-11 +1479 1325 -1142.90791609 +1480 1325 35016.6833491 +1534 1325 -27463048.6159 +1535 1325 1954248.43917 +1536 1325 51131291.8077 +1537 1325 -1263758.79445 +1538 1325 86164.4408314 +1539 1325 -816.463332821 +1540 1325 -10074.1342047 +1541 1325 -16558.2577069 +1542 1325 8754.20599346 +1543 1325 -9499.97721747 +1544 1325 8754.17065987 +1326 1326 9380289.34125 +1328 1326 -1.19209289551e-7 +1330 1326 528236.4317 +1331 1326 -4.56348061562e-8 +1332 1326 -3213688.56774 +1333 1326 -608654.332957 +1334 1326 -2.60770320892e-8 +1336 1326 -31243.4814768 +1344 1326 -210053.643341 +1345 1326 -4107711.40417 +1346 1326 4.842877388e-8 +1347 1326 490832.108433 +1348 1326 -1078846.3914 +1349 1326 -2.00234353542e-8 +1456 1326 1955922.70006 +1457 1326 1093193.28007 +1458 1326 3486186.75252 +1459 1326 -18535329.3672 +1460 1326 1263758.79445 +1461 1326 11974.9250067 +1462 1326 132059.122709 +1463 1326 129499.57066 +1464 1326 122708.027108 +1465 1326 -269711.722314 +1466 1326 129500.083975 +1470 1326 -52513.4241721 +1471 1326 -1026928.37334 +1472 1326 518000.345496 +1473 1326 3261177.42942 +1474 1326 -1568822.76298 +1475 1326 -2.32830643654e-8 +1476 1326 46133895.6425 +1477 1326 -3145458.87938 +1479 1326 -16906.9218356 +1480 1326 517998.274395 +1534 1326 1954248.43917 +1535 1326 1068426.10716 +1536 1326 -3486186.75252 +1537 1326 -18535329.3672 +1538 1326 1263758.79445 +1539 1326 -11974.9250067 +1540 1326 -149025.653916 +1541 1326 -244944.640635 +1542 1326 129500.088661 +1543 1326 -140532.207359 +1544 1326 129499.565974 +1327 1327 15267011090.5 +1332 1327 -2.98023223877e-7 +1333 1327 2.04890966415e-8 +1334 1327 3729994733.66 +1456 1327 -51131291.8077 +1457 1327 3486186.75252 +1458 1327 -1922836059.47 +1474 1327 2.32830643654e-8 +1475 1327 -7517828159.96 +1534 1327 51131291.8077 +1535 1327 -3486186.75252 +1536 1327 -1922836059.47 +1328 1328 1879169279.96 +1329 1328 1.86264514923e-9 +1335 1328 -703940480.373 +1336 1328 -4.07453626394e-9 +1456 1328 1263758.79445 +1457 1328 18535329.3672 +1459 1328 -371207454.429 +1460 1328 25309325.5483 +1461 1328 266308.811499 +1473 1328 -3145458.87938 +1474 1328 -46133895.6425 +1476 1328 860236988.662 +1477 1328 -58651887.8729 +1478 1328 -3.14321368933e-9 +1534 1328 1263758.79445 +1535 1328 18535329.3672 +1537 1328 -371207454.429 +1538 1328 25309325.5483 +1539 1328 -266308.811499 +1329 1329 2492827.18583 +1332 1329 2130.21434382 +1333 1329 31243.4814768 +1336 1329 459767.331148 +1456 1329 -816.463332821 +1457 1329 -11974.9250067 +1459 1329 266308.811499 +1460 1329 -18157.2226694 +1461 1329 -184697.186945 +1473 1329 7.27595761418e-11 +1476 1329 -1.16415321827e-9 +1477 1329 1.96450855583e-10 +1478 1329 -1065667.6784 +1534 1329 816.463332821 +1535 1329 11974.9250067 +1537 1329 -266308.811499 +1538 1329 18157.2226694 +1539 1329 -184697.186945 +1330 1330 451097.0415 +1331 1330 -1.37656927109e-8 +1332 1330 -5275.49670076 +1333 1330 -78039.892023 +1337 1330 -241386.77409 +1338 1330 1.52550637722e-8 +1339 1330 -567462.645425 +1344 1330 -141048.573053 +1345 1330 -528238.589226 +1346 1330 1.24018639326e-8 +1347 1330 228198.163151 +1348 1330 78039.7292715 +1349 1330 -1.36382877827e-8 +1350 1330 -81856.231042 +1351 1330 567464.833224 +1352 1330 -2.48868018389e-9 +1432 1330 -60346.9344636 +1433 1330 -78191.4501587 +1434 1330 -20464.1781805 +1435 1330 141866.216446 +1436 1330 -41441.4252353 +1437 1330 -141865.647053 +1456 1330 -1318.8719359 +1457 1330 -19509.9398802 +1462 1330 112773.76837 +1463 1330 313.594349571 +1464 1330 57049.2961113 +1465 1330 19509.9529105 +1466 1330 -8873.91051248 +1470 1330 -35262.2677262 +1471 1330 -132059.638893 +1472 1330 41598.2299375 +1473 1330 8927.1966951 +1474 1330 132059.122709 +1479 1330 -61358.9884017 +1480 1330 87535.7603657 +1331 1331 436299.187114 +1332 1331 -5.79208135605e-9 +1333 1331 -8.56816768646e-8 +1337 1331 -9.31322574615e-10 +1338 1331 107041.873065 +1339 1331 -1.11758708954e-8 +1344 1331 1.62981450558e-8 +1345 1331 4.28408384323e-8 +1346 1331 55315.1222547 +1347 1331 -5.12227416038e-9 +1348 1331 6.23986124992e-8 +1349 1331 218138.900333 +1350 1331 -7.21774995327e-9 +1351 1331 5.58793544769e-9 +1352 1331 53518.0785148 +1432 1331 -87818.5227136 +1433 1331 -53519.2806113 +1434 1331 -31977.4238183 +1435 1331 140000.091685 +1436 1331 -26761.0693146 +1437 1331 -139999.531442 +1456 1331 -36436.27862 +1457 1331 -538998.204438 +1462 1331 -313.594349578 +1463 1331 -218141.790724 +1464 1331 27562.5230014 +1465 1331 539000.359971 +1466 1331 -109076.241974 +1470 1331 50352.4315243 +1471 1331 129500.088886 +1472 1331 -27659.4522378 +1473 1331 -8754.17097664 +1474 1331 -129499.57066 +1479 1331 87385.2564527 +1480 1331 -55316.386255 +1332 1332 119463717.139 +1333 1332 -7507852.71688 +1334 1332 -2.38418579102e-7 +1336 1332 47.8208583167 +1337 1332 50987615.0473 +1338 1332 -3.1478703022e-9 +1339 1332 -3504409.72802 +1340 1332 4.17232513428e-7 +1341 1332 -7.45058059692e-9 +1343 1332 -2082.39348551 +1344 1332 -40638.998738 +1345 1332 -72930.0311583 +1346 1332 2.26646661758e-9 +1347 1332 -16385.6595232 +1348 1332 -320431.142337 +1349 1332 4.09223139286e-9 +1350 1332 32402.8916265 +1351 1332 -88132.1168562 +1352 1332 -1.88872218132e-10 +1432 1332 -29456737.5236 +1433 1332 9463.96859533 +1434 1332 8100.72290661 +1435 1332 -22033.0373544 +1436 1332 9464.00616503 +1437 1332 2090613.66726 +1438 1332 -51131286.8839 +1439 1332 -1152925.69933 +1440 1332 78609.3564946 +1441 1332 828.44649193 +1456 1332 -51403789.8076 +1457 1332 3427559.15644 +1458 1332 -.360276475549 +1459 1332 3059684.37739 +1460 1332 -208614.698486 +1461 1332 11.9831591097 +1462 1332 -1318.8719359 +1463 1332 36436.27862 +1464 1332 -4096.41572877 +1465 1332 -80107.8187207 +1466 1332 36436.4243024 +1470 1332 -10159.7496845 +1471 1332 -18232.5162033 +1472 1332 8754.20597824 +1473 1332 -27462935.4358 +1474 1332 1955922.70006 +1475 1332 51131291.8077 +1476 1332 -1263758.79445 +1477 1332 86164.4408315 +1478 1332 -816.463332821 +1479 1332 -9527.54180266 +1480 1332 8754.17067509 +1333 1333 9901072.56295 +1334 1333 1.49011611938e-8 +1335 1333 -1.19209289551e-7 +1336 1333 702.015770667 +1337 1333 -2979876.01263 +1338 1333 -4.65661287308e-8 +1339 1333 -195209.9648 +1340 1333 -2.88709998131e-8 +1342 1333 -7.45058059692e-9 +1343 1333 -30541.4657061 +1344 1333 -601168.620385 +1345 1333 -1078846.61477 +1346 1333 3.35276126862e-8 +1347 1333 -242391.413065 +1348 1333 -4740105.65587 +1349 1333 6.053596735e-8 +1350 1333 479332.716368 +1351 1333 -1303729.53929 +1352 1333 -2.79396772385e-9 +1432 1333 2221747.11041 +1433 1333 139999.535434 +1434 1333 119833.179092 +1435 1333 -325932.505243 +1436 1333 140000.091199 +1437 1333 1056679.10951 +1438 1333 3486258.96796 +1439 1333 -16909407.8294 +1440 1333 1152925.69933 +1441 1333 12150.427044 +1456 1333 3427559.15644 +1457 1333 -1356464.42966 +1458 1333 -5.28405669518 +1459 1333 44875402.1562 +1460 1333 -3059684.37739 +1461 1333 175.502037358 +1462 1333 -19509.9398802 +1463 1333 538998.204438 +1464 1333 -60597.8658102 +1465 1333 -1185026.90415 +1466 1333 539000.359503 +1470 1333 -150292.155096 +1471 1333 -269711.778155 +1472 1333 129500.088435 +1473 1333 1955922.70006 +1474 1333 1093193.28007 +1475 1333 -3486186.75252 +1476 1333 -18535329.3672 +1477 1333 1263758.79445 +1478 1333 -11974.9250067 +1479 1333 -140939.967495 +1480 1333 129499.5662 +1334 1334 15876917230.4 +1337 1334 -5.96046447754e-8 +1339 1334 4.65661287308e-9 +1340 1334 4041454664.25 +1432 1334 -51131286.8839 +1437 1334 3486258.96796 +1438 1334 -2074228117.67 +1456 1334 .360276713967 +1457 1334 5.28405667935 +1458 1334 -7827119137 +1473 1334 51131291.8077 +1474 1334 -3486186.75252 +1475 1334 -1922836059.47 +1335 1335 1833219936.63 +1336 1335 1.86264514923e-9 +1339 1335 -1.19209289551e-7 +1341 1335 -638884878.362 +1342 1335 43560768.2189 +1343 1335 -4.7730281949e-9 +1432 1335 1152925.69933 +1437 1335 16909407.8294 +1439 1335 -340301826.683 +1440 1335 23202629.2978 +1441 1335 266308.785854 +1456 1335 -3059684.37739 +1457 1335 -44875402.1562 +1459 1335 834107925.586 +1460 1335 -56870953.333 +1461 1335 -.00187644385733 +1473 1335 1263758.79445 +1474 1335 18535329.3672 +1476 1335 -371207454.429 +1477 1335 25309325.5483 +1478 1335 -266308.811499 +1336 1336 2575080.50874 +1337 1336 2082.39348551 +1339 1336 30541.4657061 +1341 1336 -4.65661287308e-10 +1342 1336 2.91038304567e-11 +1343 1336 487642.127049 +1432 1336 -828.44649193 +1437 1336 -12150.427044 +1439 1336 266308.785854 +1440 1336 -18157.5987915 +1441 1336 -202023.574818 +1456 1336 11.9831591097 +1457 1336 175.502037358 +1459 1336 .00187643768731 +1460 1336 .0275211287735 +1461 1336 -1113572.3197 +1473 1336 816.463332821 +1474 1336 11974.9250067 +1476 1336 -266308.811499 +1477 1336 18157.2226694 +1478 1336 -184697.186945 +1337 1337 144237583.646 +1338 1337 -1.67638063431e-8 +1339 1337 -3364363.97384 +1340 1337 -4.76837158203e-7 +1343 1337 -296090713.699 +1347 1337 -161135.207317 +1348 1337 -612668.01245 +1349 1337 1.16415321827e-8 +1350 1337 -81796510.4604 +1351 1337 -683398.926498 +1352 1337 2.79396772385e-9 +1356 1337 -296092796.093 +1407 1337 248489891.519 +1408 1337 -6715506.71551 +1432 1337 -38441706.87 +1433 1337 92590.7891601 +1434 1337 11485992.1246 +1435 1337 -170849.737392 +1436 1337 51068.034595 +1437 1337 1922423.0928 +1438 1337 -3741313.67444 +1439 1337 1486954.93769 +1440 1337 -253121601.267 +1441 1337 -6716335.162 +1456 1337 -29456737.5236 +1457 1337 2221747.11041 +1458 1337 51131286.8839 +1459 1337 -1152925.69933 +1460 1337 78609.3564946 +1461 1337 -828.44649193 +1462 1337 -60346.9344636 +1463 1337 87818.5227136 +1464 1337 -40283.9222492 +1465 1337 -153167.003112 +1466 1337 46295.5833745 +1338 1338 207557.745128 +1339 1338 -6.33299350738e-8 +1347 1338 1.46683305502e-8 +1348 1338 4.09781932831e-8 +1349 1338 53517.9109923 +1350 1338 -1.07102096081e-8 +1351 1338 4.842877388e-8 +1352 1338 103772.75518 +1432 1338 -92590.7891601 +1433 1338 -103774.433202 +1434 1338 -22431.7154827 +1435 1338 280000.188872 +1436 1338 -51890.2752931 +1437 1338 -279999.069115 +1456 1338 -9463.96859533 +1457 1338 -139999.535434 +1462 1338 78191.4501587 +1463 1338 -53519.2806113 +1464 1338 46295.5786264 +1465 1338 140000.095678 +1466 1338 -26761.1530759 +1339 1339 17742391122.8 +1340 1339 7.62939453125e-6 +1343 1339 30541.4657061 +1347 1339 -612668.01245 +1348 1339 -1303729.76266 +1349 1339 3.632158041e-8 +1350 1339 408597.434317 +1351 1339 -2686957.57405 +1352 1339 1.67638063431e-8 +1353 1339 -16929487179.5 +1354 1339 -6.67572021484e-6 +1404 1339 -4535256410.26 +1405 1339 1.3875e9 +1432 1339 1922423.0928 +1433 1339 279999.069115 +1434 1339 102149.352812 +1435 1339 -671739.626716 +1436 1339 280000.18488 +1437 1339 4130838380.3 +1438 1339 -112244907.88 +1439 1339 21808454.335 +1440 1339 -1486954.93769 +1441 1339 -12150.427044 +1456 1339 2090613.66726 +1457 1339 1056679.10951 +1458 1339 -3486258.96796 +1459 1339 -16909407.8294 +1460 1339 1152925.69933 +1461 1339 -12150.427044 +1462 1339 -141865.647053 +1463 1339 139999.531442 +1464 1339 -153167.003112 +1465 1339 -325932.561084 +1466 1339 140000.095191 +1340 1340 15699455641.2 +1353 1340 3.81469726563e-6 +1354 1340 -4629120879.12 +1404 1340 1.3875e9 +1405 1340 -3256868131.87 +1432 1340 3741313.67444 +1437 1340 112244907.88 +1438 1340 -2224798463.61 +1456 1340 51131286.8839 +1457 1340 -3486258.96796 +1458 1340 -2074228117.67 +1341 1341 893635296.65 +1342 1341 -60930288.6138 +1343 1341 7.45058059692e-9 +1432 1341 -1486954.93769 +1437 1341 -21808454.335 +1439 1341 403989431.255 +1440 1341 -27545009.3966 +1441 1341 -19486.008721 +1456 1341 1152925.69933 +1457 1341 16909407.8294 +1459 1341 -340301826.683 +1460 1341 23202629.2978 +1461 1341 -266308.785854 +1342 1342 10182038994.8 +1343 1342 2.38418579102e-7 +1350 1342 1.90734863281e-6 +1355 1342 -9942307692.3 +1356 1342 2.53319740295e-7 +1407 1342 -4836023351.64 +1408 1342 -2.890625e7 +1432 1342 253121601.267 +1434 1342 -248489891.519 +1437 1342 1486954.93769 +1439 1342 -27545009.3966 +1440 1342 4896795670.02 +1441 1342 -2342421.39521 +1456 1342 -78609.3564946 +1457 1342 -1152925.69933 +1459 1342 23202629.2978 +1460 1342 -1582013.2721 +1461 1342 18157.5987915 +1343 1343 1936558367.77 +1350 1343 296092796.093 +1355 1343 -1.78813934326e-7 +1356 1343 1190571581.2 +1407 1343 -2.890625e7 +1408 1343 -53619123.9316 +1432 1343 -6716335.162 +1434 1343 6715506.71551 +1437 1343 -12150.427044 +1439 1343 19486.008721 +1440 1343 2342421.39521 +1441 1343 115137744.425 +1456 1343 828.44649193 +1457 1343 12150.427044 +1459 1343 -266308.785854 +1460 1343 18157.5987915 +1461 1343 -202023.574818 +1344 1344 1045720.08054 +1345 1344 280073.407013 +1346 1344 -5.16884028912e-8 +1347 1344 -488319.191395 +1348 1344 73558.2255338 +1349 1344 2.28174030781e-8 +1357 1344 256646.703759 +1358 1344 -70019.7399479 +1359 1344 -1.16415321827e-8 +1360 1344 -104724.03785 +1361 1344 527610.383559 +1362 1344 3.72529029846e-9 +1453 1344 -26181.1339249 +1454 1344 131902.59589 +1455 1344 -41522.6255194 +1456 1344 -10159.7496845 +1457 1344 -150292.155096 +1462 1344 -35262.2677262 +1463 1344 -50352.4315242 +1464 1344 -122080.295339 +1465 1344 18389.5648524 +1466 1344 -174920.662203 +1467 1344 64161.4143731 +1468 1344 -17504.939443 +1469 1344 8829.80147696 +1470 1344 261428.974172 +1471 1344 70018.3517532 +1472 1344 -.00879107508808 +1473 1344 -3549.90747404 +1474 1344 -52513.4241721 +1479 1344 65324.3705898 +1480 1344 -26488.722105 +1518 1344 -38580.9538854 +1519 1344 -140675.374316 +1520 1344 50352.4358261 +1534 1344 8380.67811227 +1535 1344 123974.528288 +1540 1344 -134566.226008 +1541 1344 16700.8522441 +1542 1344 192579.582806 +1543 1344 -28916.9951293 +1544 1344 41522.6300342 +1345 1345 8215429.18195 +1346 1345 -1.03376805782e-7 +1347 1345 73558.2255338 +1348 1345 2157696.65917 +1349 1345 -3.11993062496e-8 +1357 1345 -70019.7399479 +1358 1345 -4107711.89064 +1359 1345 5.40167093277e-8 +1360 1345 527610.383559 +1361 1345 -1078850.92958 +1362 1345 -2.56113708019e-8 +1453 1345 131902.59589 +1454 1345 -269712.856857 +1455 1345 129500.08561 +1456 1345 -18232.5162033 +1457 1345 -269711.778155 +1462 1345 -132059.638893 +1463 1345 -129500.088886 +1464 1345 18389.5648524 +1465 1345 539423.915505 +1466 1345 .00297559611499 +1467 1345 -17504.939443 +1468 1345 -1026928.49556 +1469 1345 518000.345646 +1470 1345 70018.3517532 +1471 1345 2053856.24953 +1472 1345 .000901185907423 +1473 1345 -69420.358038 +1474 1345 -1026928.37334 +1479 1345 16906.9338658 +1480 1345 -518000.345946 +1518 1345 -140675.374316 +1519 1345 -244943.756274 +1520 1345 129500.087176 +1534 1345 -16558.2539321 +1535 1345 -244944.584794 +1540 1345 16700.8522441 +1541 1345 489887.58803 +1542 1345 -.00327598350123 +1543 1345 140532.78222 +1544 1345 -129500.0842 +1346 1346 929759.960569 +1347 1346 2.84053385258e-8 +1348 1346 -2.88709998131e-8 +1349 1346 221270.115198 +1357 1346 -1.44354999065e-8 +1358 1346 1.39698386192e-8 +1359 1346 232430.741065 +1360 1346 -4.65661287308e-10 +1361 1346 -2.14204192162e-8 +1362 1346 55315.0165381 +1453 1346 -41522.6299317 +1454 1346 129500.08576 +1455 1346 -27659.2837279 +1456 1346 -8754.20597824 +1457 1346 -129500.088435 +1462 1346 -41598.2299375 +1463 1346 -27659.4522377 +1464 1346 -174920.671033 +1465 1346 .00297559285536 +1466 1346 -110632.553125 +1467 1346 8829.81030933 +1468 1346 518000.345796 +1469 1346 -116221.146907 +1470 1346 .00879104994237 +1471 1346 -.000901197083294 +1472 1346 -464866.089473 +1473 1346 -35016.8233555 +1474 1346 -518000.345496 +1479 1346 8528.11010263 +1480 1346 -116221.153842 +1518 1346 50352.4314138 +1519 1346 129500.087326 +1520 1346 -30451.5839809 +1534 1346 -8754.20566147 +1535 1346 -129500.08375 +1540 1346 192579.573976 +1541 1346 -.00327597279102 +1542 1346 -121801.6459 +1543 1346 50276.8313041 +1544 1346 -30451.419283 +1347 1347 913395.922943 +1348 1347 323189.02841 +1349 1347 -4.19095158577e-8 +1350 1347 -402970.60421 +1351 1347 88889.7388374 +1352 1347 8.84756445885e-9 +1357 1347 -141952.483099 +1358 1347 -564390.345259 +1359 1347 1.30385160446e-8 +1360 1347 222828.408394 +1361 1347 -80797.5929358 +1362 1347 -1.09430402517e-8 +1363 1347 -83650.2434145 +1364 1347 523778.262688 +1365 1347 -9.31322574615e-10 +1429 1347 -20912.6812731 +1430 1347 130944.565672 +1431 1347 -36750.022154 +1432 1347 -40283.9222492 +1433 1347 -46295.5786264 +1434 1347 -100743.132382 +1435 1347 22222.4429031 +1436 1347 -156545.649595 +1437 1347 -153167.003112 +1453 1347 55706.857145 +1454 1347 -20199.4024249 +1455 1347 9187.50153679 +1456 1347 -4096.41572877 +1457 1347 -60597.8658102 +1462 1347 57049.2961113 +1463 1347 -27562.5230014 +1464 1347 228348.001203 +1465 1347 80797.2570304 +1466 1347 -.00914757372811 +1467 1347 -35488.2452373 +1468 1347 -141097.586315 +1469 1347 45937.5328783 +1470 1347 -122080.295339 +1471 1347 18389.5648524 +1472 1347 174920.671033 +1473 1347 8295.06263252 +1474 1347 122708.027108 +1479 1347 -25796.4839459 +1480 1347 37108.0770763 +1348 1348 9480246.65238 +1349 1348 -1.48080289364e-7 +1350 1348 88889.7388373 +1351 1348 2607464.32234 +1352 1348 -3.91155481339e-8 +1357 1348 -564390.345259 +1358 1348 -1078851.00403 +1359 1348 3.16649675369e-8 +1360 1348 -80797.5929358 +1361 1348 -4740135.68366 +1362 1348 2.70083546639e-8 +1363 1348 523778.262688 +1364 1348 -1303735.21249 +1365 1348 -5.58793544769e-9 +1429 1348 130944.565672 +1430 1348 -325933.923542 +1431 1348 140000.09269 +1432 1348 -153167.003112 +1433 1348 -140000.095678 +1434 1348 22222.4429031 +1435 1348 651865.839396 +1436 1348 .00266296230257 +1437 1348 -325932.561084 +1453 1348 -20199.4024249 +1454 1348 -1185034.41167 +1455 1348 539000.359659 +1456 1348 -80107.8187207 +1457 1348 -1185026.90415 +1462 1348 19509.9529105 +1463 1348 -539000.359971 +1464 1348 80797.2570304 +1465 1348 2370060.68145 +1466 1348 .000937772914767 +1467 1348 -141097.586315 +1468 1348 -269712.875471 +1469 1348 129500.0871 +1470 1348 18389.5648524 +1471 1348 539423.915505 +1472 1348 -.00297559192404 +1473 1348 -18232.5124284 +1474 1348 -269711.722314 +1479 1348 140940.539537 +1480 1348 -129500.084425 +1349 1349 872595.594027 +1350 1349 1.67638063431e-8 +1351 1349 -4.37721610069e-8 +1352 1349 214083.262785 +1357 1349 1.30385160446e-8 +1358 1349 4.2375177145e-8 +1359 1349 55314.9606955 +1360 1349 -7.91624188423e-9 +1361 1349 4.93600964546e-8 +1362 1349 218137.534365 +1363 1349 -4.88944351673e-9 +1364 1349 -1.86264514923e-9 +1365 1349 53517.7880705 +1429 1349 -36750.0269238 +1430 1349 140000.092853 +1431 1349 -26760.9752199 +1432 1349 -46295.5833745 +1433 1349 -26761.1530758 +1434 1349 -156545.65914 +1435 1349 .00266295485199 +1436 1349 -107038.324262 +1437 1349 -140000.095191 +1453 1349 9187.51072696 +1454 1349 539000.359815 +1455 1349 -109075.542903 +1456 1349 -36436.4243024 +1457 1349 -539000.359503 +1462 1349 8873.91051247 +1463 1349 -109076.241974 +1464 1349 .00914755091071 +1465 1349 -.000937803648412 +1466 1349 -436282.207438 +1467 1349 45937.5284659 +1468 1349 129500.087251 +1469 1349 -27659.3116492 +1470 1349 174920.662203 +1471 1349 -.00297560123727 +1472 1349 -110632.553125 +1473 1349 -8754.20567669 +1474 1349 -129500.083975 +1479 1349 45862.2783615 +1480 1349 -27659.3684761 +1350 1350 165089375.384 +1351 1350 183199.988441 +1352 1350 -9.31322574615e-9 +1356 1350 2.86102294922e-6 +1360 1350 -120876.622712 +1361 1350 -568222.46613 +1362 1350 8.38190317154e-9 +1363 1350 -81790264.9033 +1364 1350 -591797.413165 +1365 1350 1.86264514923e-9 +1368 1350 3.81469726563e-6 +1369 1350 -296092796.093 +1407 1350 -506040433.924 +1408 1350 2.14576721191e-6 +1412 1350 248489891.519 +1413 1350 -6715506.71551 +1429 1350 11487553.5141 +1430 1350 -147949.355218 +1431 1350 41522.4783151 +1432 1350 11485992.1246 +1433 1350 22431.7154827 +1434 1350 -23294869.5017 +1435 1350 45799.9976098 +1436 1350 146999.505464 +1437 1350 102149.352812 +1440 1350 248489891.519 +1441 1350 6715506.71551 +1453 1350 -30219.2760976 +1454 1350 -142055.616532 +1455 1350 41522.6301091 +1456 1350 8100.72290661 +1457 1350 119833.179092 +1462 1350 -20464.1781805 +1463 1350 31977.4238183 +1464 1350 -100743.132382 +1465 1350 22222.442903 +1466 1350 156545.65914 +1351 1351 5373923.61057 +1352 1351 -8.56816768646e-8 +1360 1351 -568222.46613 +1361 1351 -1303735.28694 +1362 1351 2.70083546639e-8 +1363 1351 500198.94765 +1364 1351 -2686963.645 +1365 1351 5.58793544769e-9 +1429 1351 125049.734986 +1430 1351 -671741.144715 +1431 1351 280000.186209 +1432 1351 -170849.737392 +1433 1351 -280000.188872 +1434 1351 45799.9976098 +1435 1351 1343480.43563 +1436 1351 .00298771075904 +1437 1351 -671739.626716 +1453 1351 -142055.616532 +1454 1351 -325933.942156 +1455 1351 140000.094024 +1456 1351 -22033.0373544 +1457 1351 -325932.505243 +1462 1351 141866.216446 +1463 1351 -140000.091685 +1464 1351 22222.442903 +1465 1351 651865.839396 +1466 1351 -.00266296695918 +1352 1352 415114.779096 +1360 1352 1.02445483208e-8 +1361 1352 2.98023223877e-8 +1362 1352 53517.732231 +1363 1352 -9.0803951025e-9 +1364 1352 4.09781932831e-8 +1365 1352 103772.525023 +1429 1352 -31977.2719444 +1430 1352 280000.187543 +1431 1352 -51890.1510547 +1432 1352 -51068.034595 +1433 1352 -51890.2752931 +1434 1352 -146999.505464 +1435 1352 -.00298773124814 +1436 1352 -207548.743351 +1437 1352 -280000.18488 +1453 1352 41522.6253393 +1454 1352 140000.094186 +1455 1352 -26761.0031396 +1456 1352 -9464.00616503 +1457 1352 -140000.091199 +1462 1352 41441.4252353 +1463 1352 -26761.0693146 +1464 1352 156545.649595 +1465 1352 -.00266297347844 +1466 1352 -107038.324262 +1353 1353 35474358974.4 +1354 1353 -7.62939453125e-6 +1366 1353 -16929487179.5 +1367 1353 -3.81469726563e-6 +1404 1353 8262820512.82 +1405 1353 7.62939453125e-6 +1409 1353 -4535256410.26 +1410 1353 1.3875e9 +1437 1353 -4535256410.26 +1438 1353 -1.3875e9 +1354 1354 14912087912.1 +1366 1354 9.53674316406e-7 +1367 1354 -4629120879.12 +1404 1354 -1.23977661133e-5 +1405 1354 3686813186.81 +1409 1354 1.3875e9 +1410 1354 -3256868131.87 +1437 1354 -1.3875e9 +1438 1354 -3256868131.87 +1355 1355 20355769230.8 +1356 1355 -4.76837158203e-7 +1368 1355 -9942307692.3 +1369 1355 4.91738319397e-7 +1407 1355 9789835164.83 +1408 1355 1.49011611938e-8 +1412 1355 -4836023351.64 +1413 1355 -2.890625e7 +1429 1355 -248489891.519 +1432 1355 -248489891.519 +1434 1355 506040433.924 +1440 1355 -4836023351.64 +1441 1355 2.890625e7 +1356 1356 3870459401.71 +1363 1356 296092796.093 +1368 1356 2.08616256714e-7 +1369 1356 1190571581.2 +1407 1356 8.04662704468e-7 +1408 1356 231436965.812 +1412 1356 -2.890625e7 +1413 1356 -53619123.9316 +1429 1356 6715506.71551 +1432 1356 -6715506.71551 +1434 1356 2.38418579102e-6 +1440 1356 2.890625e7 +1441 1356 -53619123.9316 +1357 1357 1036172.27712 +1358 1357 -5.96046447754e-8 +1359 1357 -3.632158041e-8 +1360 1357 -490825.834455 +1361 1357 2.79396772385e-8 +1362 1357 3.58559191227e-8 +1370 1357 256646.703759 +1371 1357 70019.7399479 +1372 1357 -1.8859282136e-8 +1383 1357 -141952.483099 +1384 1357 564390.345259 +1385 1357 -6.51925802231e-9 +1450 1357 -35488.2452373 +1451 1357 141097.586315 +1452 1357 -45937.5284659 +1453 1357 -122706.956391 +1454 1357 1.67638063431e-8 +1455 1357 -174920.312304 +1464 1357 -35488.2452373 +1465 1357 -141097.586315 +1466 1357 -45937.5284659 +1467 1357 259042.023319 +1468 1357 -1.95577740669e-8 +1469 1357 -.00882212398574 +1470 1357 64161.4143731 +1471 1357 -17504.939443 +1472 1357 -8829.81030933 +1487 1357 64161.4143731 +1488 1357 17504.939443 +1489 1357 -8829.81030934 +1500 1357 -29273.8425731 +1501 1357 -132324.807888 +1502 1357 45937.5328796 +1518 1357 -135135.811977 +1520 1357 192579.932918 +1540 1357 -29273.8425731 +1541 1357 132324.807888 +1542 1357 45937.5328796 +1358 1358 8215429.66922 +1359 1358 -1.67638063431e-7 +1360 1358 2.04890966415e-8 +1361 1358 2157701.1225 +1362 1358 -4.37721610069e-8 +1370 1358 70019.7399479 +1371 1358 -4107711.89064 +1372 1358 8.94069671631e-8 +1383 1358 564390.345259 +1384 1358 -1078851.00403 +1385 1358 6.98491930962e-9 +1450 1358 141097.586315 +1451 1358 -269712.875471 +1452 1358 129500.087251 +1453 1358 1.02445483208e-8 +1454 1358 539425.031628 +1455 1358 5.58793544769e-9 +1464 1358 -141097.586315 +1465 1358 -269712.875471 +1466 1358 -129500.087251 +1467 1358 -1.210719347e-8 +1468 1358 2053856.37134 +1469 1358 -1.11758708954e-8 +1470 1358 -17504.939443 +1471 1358 -1026928.49556 +1472 1358 -518000.345796 +1487 1358 17504.939443 +1488 1358 -1026928.49556 +1489 1358 518000.345796 +1500 1358 -132324.807888 +1501 1358 -244943.73766 +1502 1358 129500.085685 +1518 1358 -3.72529029846e-9 +1519 1358 489886.722493 +1520 1358 -9.77888703346e-9 +1540 1358 132324.807888 +1541 1358 -244943.73766 +1542 1358 -129500.085685 +1359 1359 929759.946697 +1360 1359 1.53668224812e-8 +1361 1359 -4.47034835815e-8 +1362 1359 221269.668496 +1370 1359 -4.88944351673e-9 +1371 1359 7.54371285438e-8 +1372 1359 232430.741065 +1383 1359 -1.09430402517e-8 +1384 1359 2.79396772385e-9 +1385 1359 55314.9606955 +1450 1359 -45937.5328783 +1451 1359 129500.0871 +1452 1359 -27659.3116492 +1453 1359 -174920.321134 +1454 1359 4.65661287308e-10 +1455 1359 -110632.33374 +1464 1359 -45937.5328783 +1465 1359 -129500.0871 +1466 1359 -27659.3116492 +1467 1359 .00882210442796 +1468 1359 -3.72529029846e-8 +1469 1359 -464866.096408 +1470 1359 -8829.80147696 +1471 1359 -518000.345646 +1472 1359 -116221.146907 +1487 1359 -8829.80147696 +1488 1359 518000.345646 +1489 1359 -116221.146907 +1500 1359 45937.5284672 +1501 1359 129500.085535 +1502 1359 -30451.5560596 +1518 1359 192579.924088 +1519 1359 -9.31322574615e-9 +1520 1359 -121801.869096 +1540 1359 45937.5284672 +1541 1359 -129500.085535 +1542 1359 -30451.5560596 +1360 1360 902374.336044 +1361 1360 -3.72529029846e-8 +1362 1360 -4.00468707085e-8 +1363 1360 -406000.079139 +1364 1360 1.67638063431e-8 +1365 1360 2.18860805035e-8 +1370 1360 -104724.03785 +1371 1360 -527610.383559 +1372 1360 2.02562659979e-8 +1380 1360 -120876.622712 +1381 1360 568222.46613 +1382 1360 -5.35510480404e-9 +1383 1360 222828.408394 +1384 1360 80797.5929358 +1385 1360 -1.1408701539e-8 +1426 1360 -30219.2760976 +1427 1360 142055.616532 +1428 1360 -41522.6253393 +1429 1360 -101500.501393 +1430 1360 8.38190317154e-9 +1431 1360 -156545.299685 +1434 1360 -30219.2760976 +1435 1360 -142055.616532 +1436 1360 -41522.6253393 +1450 1360 55706.8571449 +1451 1360 20199.4024249 +1452 1360 -9187.51072697 +1453 1360 225592.604482 +1454 1360 -2.14204192162e-8 +1455 1360 -.00917950551957 +1464 1360 55706.857145 +1465 1360 -20199.4024249 +1466 1360 -9187.51072697 +1467 1360 -122706.956391 +1468 1360 4.65661287308e-9 +1469 1360 174920.321134 +1470 1360 -26181.1339249 +1471 1360 131902.59589 +1472 1360 41522.6299317 +1487 1360 -26181.1339249 +1488 1360 -131902.59589 +1489 1360 41522.6299317 +1361 1361 9480276.68092 +1362 1361 -1.71363353729e-7 +1363 1361 3.72529029846e-9 +1364 1361 2607469.92071 +1365 1361 -5.40167093277e-8 +1370 1361 -527610.383559 +1371 1361 -1078850.92958 +1372 1361 4.56348061562e-8 +1380 1361 568222.46613 +1381 1361 -1303735.28694 +1382 1361 2.79396772385e-9 +1383 1361 80797.5929358 +1384 1361 -4740135.68366 +1385 1361 9.77888703346e-8 +1426 1361 142055.616532 +1427 1361 -325933.942156 +1428 1361 140000.094186 +1429 1361 5.58793544769e-9 +1430 1361 651867.239269 +1431 1361 -2.79396772385e-9 +1434 1361 -142055.616532 +1435 1361 -325933.942156 +1436 1361 -140000.094186 +1450 1361 20199.4024249 +1451 1361 -1185034.41167 +1452 1361 539000.359815 +1453 1361 -1.39698386192e-8 +1454 1361 2370068.18858 +1455 1361 -1.95577740669e-8 +1464 1361 -20199.4024249 +1465 1361 -1185034.41167 +1466 1361 -539000.359815 +1467 1361 1.86264514923e-9 +1468 1361 539425.031628 +1469 1361 -1.35041773319e-8 +1470 1361 131902.59589 +1471 1361 -269712.856857 +1472 1361 -129500.08576 +1487 1361 -131902.59589 +1488 1361 -269712.856857 +1489 1361 129500.08576 +1362 1362 872592.813821 +1363 1362 9.31322574615e-9 +1364 1362 -4.19095158577e-8 +1365 1362 214082.779439 +1370 1362 1.95577740669e-8 +1371 1362 5.86733222008e-8 +1372 1362 55315.0165381 +1380 1362 -7.21774995327e-9 +1381 1362 1.86264514923e-9 +1382 1362 53517.732231 +1383 1362 -1.55996531248e-8 +1384 1362 9.40635800362e-8 +1385 1362 218137.534365 +1426 1362 -41522.6301091 +1427 1362 140000.094024 +1428 1362 -26761.0031396 +1429 1362 -156545.30923 +1430 1362 9.31322574615e-10 +1431 1362 -107038.087301 +1434 1362 -41522.6301091 +1435 1362 -140000.094024 +1436 1362 -26761.0031396 +1450 1362 -9187.5015368 +1451 1362 539000.359659 +1452 1362 -109075.542903 +1453 1362 .00917948363349 +1454 1362 -2.14204192162e-8 +1455 1362 -436280.833431 +1464 1362 -9187.50153679 +1465 1362 -539000.359659 +1466 1362 -109075.542903 +1467 1362 174920.312304 +1468 1362 -1.67638063431e-8 +1469 1362 -110632.33374 +1470 1362 41522.6255194 +1471 1362 -129500.08561 +1472 1362 -27659.283728 +1487 1362 41522.6255194 +1488 1362 129500.08561 +1489 1362 -27659.283728 +1363 1363 165083129.826 +1364 1363 -3.35276126862e-8 +1365 1363 -1.72294676304e-8 +1369 1363 -1.52587890625e-5 +1380 1363 -81790264.9034 +1381 1363 -500198.94765 +1382 1363 5.47152012587e-9 +1383 1363 -83650.2434145 +1384 1363 -523778.262688 +1385 1363 1.60653144121e-8 +1397 1363 1.90734863281e-6 +1398 1363 -296092796.093 +1407 1363 248489891.519 +1408 1363 6715506.71551 +1412 1363 -506040433.925 +1413 1363 -4.05311584473e-6 +1417 1363 248489891.519 +1418 1363 -6715506.71551 +1426 1363 11487553.5141 +1427 1363 -125049.734986 +1428 1363 31977.2719444 +1429 1363 -23296430.8911 +1430 1363 -1.39698386192e-8 +1431 1363 146999.505363 +1434 1363 11487553.5141 +1435 1363 125049.734986 +1436 1363 31977.2719444 +1450 1363 -20912.6812731 +1451 1363 -130944.565672 +1452 1363 36750.0269238 +1453 1363 -101500.501393 +1454 1363 2.32830643654e-9 +1455 1363 156545.309231 +1464 1363 -20912.6812731 +1465 1363 130944.565672 +1466 1363 36750.0269238 +1364 1364 5373929.68184 +1365 1364 -8.94069671631e-8 +1380 1364 591797.413165 +1381 1364 -2686963.645 +1382 1364 1.67638063431e-8 +1383 1364 -523778.262688 +1384 1364 -1303735.21249 +1385 1364 4.00468707085e-8 +1426 1364 147949.355218 +1427 1364 -671741.144715 +1428 1364 280000.187543 +1429 1364 -2.79396772385e-9 +1430 1364 1343481.95346 +1431 1364 -2.23517417908e-8 +1434 1364 -147949.355218 +1435 1364 -671741.144715 +1436 1364 -280000.187543 +1450 1364 -130944.565672 +1451 1364 -325933.923542 +1452 1364 140000.092853 +1453 1364 -3.72529029846e-9 +1454 1364 651867.239269 +1455 1364 -1.39698386192e-8 +1464 1364 130944.565672 +1465 1364 -325933.923542 +1466 1364 -140000.092853 +1365 1365 415114.291302 +1380 1365 -1.25728547573e-8 +1381 1365 5.02914190292e-8 +1382 1365 103772.525023 +1383 1365 1.11758708954e-8 +1384 1365 5.02914190292e-8 +1385 1365 53517.7880705 +1426 1365 -41522.4783151 +1427 1365 280000.186209 +1428 1365 -51890.1510547 +1429 1365 -146999.505363 +1430 1365 1.86264514923e-9 +1431 1365 -207548.508614 +1434 1365 -41522.4783151 +1435 1365 -280000.186209 +1436 1365 -51890.1510547 +1450 1365 36750.022154 +1451 1365 140000.09269 +1452 1365 -26760.9752199 +1453 1365 156545.299685 +1454 1365 -1.58324837685e-8 +1455 1365 -107038.087301 +1464 1365 36750.022154 +1465 1365 -140000.09269 +1466 1365 -26760.9752199 +1366 1366 35474358974.4 +1395 1366 -16929487179.5 +1396 1366 -2.86102294922e-6 +1404 1366 -4535256410.26 +1405 1366 -1.3875e9 +1409 1366 8262820512.82 +1410 1366 -8.58306884766e-6 +1414 1366 -4535256410.26 +1415 1366 1.3875e9 +1367 1367 14912087912.1 +1395 1367 1.90734863281e-6 +1396 1367 -4629120879.12 +1404 1367 -1.3875e9 +1405 1367 -3256868131.87 +1409 1367 6.67572021484e-6 +1410 1367 3686813186.81 +1414 1367 1.3875e9 +1415 1367 -3256868131.87 +1368 1368 20355769230.8 +1369 1368 -4.76837158203e-7 +1397 1368 -9942307692.3 +1398 1368 1.63912773132e-7 +1407 1368 -4836023351.64 +1408 1368 2.890625e7 +1412 1368 9789835164.83 +1413 1368 7.59959220886e-7 +1417 1368 -4836023351.64 +1418 1368 -2.890625e7 +1426 1368 -248489891.519 +1429 1368 506040433.925 +1434 1368 -248489891.519 +1369 1369 3870459401.71 +1380 1369 296092796.093 +1397 1369 2.68220901489e-7 +1398 1369 1190571581.2 +1407 1369 2.890625e7 +1408 1369 -53619123.9316 +1412 1369 -2.98023223877e-8 +1413 1369 231436965.812 +1417 1369 -2.890625e7 +1418 1369 -53619123.9316 +1426 1369 6715506.71551 +1429 1369 -3.57627868652e-6 +1434 1369 -6715506.71551 +1370 1370 1045720.97408 +1371 1370 -280080.969386 +1372 1370 -2.60770320892e-8 +1373 1370 261298.14512 +1374 1370 -1.55996531248e-8 +1375 1370 -14200.1375062 +1376 1370 210061.205714 +1383 1370 -488319.191395 +1384 1370 -73558.2255337 +1385 1370 1.44354999065e-8 +1388 1370 -141048.573053 +1389 1370 -3.95812094212e-9 +1399 1370 -40638.998738 +1400 1370 601168.620385 +1442 1370 -35262.2677262 +1443 1370 -50352.4315243 +1444 1370 -10159.7496845 +1445 1370 150292.155096 +1450 1370 -122080.295339 +1451 1370 -18389.5648524 +1452 1370 -174920.662203 +1453 1370 -26181.1339249 +1454 1370 -131902.59589 +1455 1370 -41522.6255193 +1467 1370 64161.4143731 +1468 1370 17504.939443 +1469 1370 8829.80147696 +1481 1370 -3550.03527816 +1482 1370 52515.3147657 +1487 1370 261429.197556 +1488 1370 -70020.2423466 +1489 1370 -.00879156962037 +1490 1370 65324.2750074 +1491 1370 -26489.7721063 +1492 1370 8380.61994881 +1493 1370 -123973.667882 +1498 1370 -28916.3049341 +1499 1370 41522.6300347 +1500 1370 -134566.858043 +1501 1370 -16701.7126509 +1502 1370 192580.632807 +1518 1370 -38580.9538854 +1519 1370 140675.374316 +1520 1370 50352.4358261 +1371 1371 8215418.15617 +1372 1371 -1.9371509552e-7 +1373 1371 -67619.3398655 +1374 1371 6.42612576485e-8 +1375 1371 277680.545579 +1376 1371 -4107700.37839 +1383 1371 -73558.2255337 +1384 1371 2157696.65917 +1385 1371 -5.40167093277e-8 +1388 1371 528238.589226 +1389 1371 1.86264514923e-9 +1399 1371 72930.0311583 +1400 1371 -1078846.61477 +1442 1371 132059.638893 +1443 1371 129500.088886 +1444 1371 18232.5162033 +1445 1371 -269711.778155 +1450 1371 -18389.5648524 +1451 1371 539423.915505 +1452 1371 -.00297558866441 +1453 1371 -131902.59589 +1454 1371 -269712.856857 +1455 1371 -129500.08561 +1467 1371 17504.939443 +1468 1371 -1026928.49556 +1469 1371 -518000.345646 +1481 1371 69420.1717023 +1482 1371 -1026925.6169 +1487 1371 -70020.2423466 +1488 1371 2053853.49308 +1489 1371 -.000901494175196 +1490 1371 -16904.8569365 +1491 1371 518000.345947 +1492 1371 16558.0786428 +1493 1371 -244941.991757 +1498 1371 -140531.746524 +1499 1371 129500.0842 +1500 1371 -16701.7126509 +1501 1371 489884.994991 +1502 1371 .00327618885785 +1518 1371 140675.374316 +1519 1371 -244943.756274 +1520 1371 -129500.087176 +1372 1372 929761.288762 +1373 1372 -9.6257776022e-9 +1374 1372 232431.391313 +1375 1372 -4.34406101704e-9 +1376 1372 6.42612576485e-8 +1383 1372 2.37487256527e-8 +1384 1372 -5.07570803165e-8 +1385 1372 221270.115198 +1388 1372 -7.82832503319e-9 +1389 1372 55315.1222547 +1399 1372 3.77744436264e-10 +1400 1372 -5.58793544769e-9 +1442 1372 -41598.2299375 +1443 1372 -27659.4522378 +1444 1372 -8754.20597824 +1445 1372 129500.088435 +1450 1372 -174920.671033 +1451 1372 -.0029755840078 +1452 1372 -110632.553125 +1453 1372 -41522.6299317 +1454 1372 -129500.08576 +1455 1372 -27659.2837279 +1467 1372 8829.81030933 +1468 1372 -518000.345796 +1469 1372 -116221.146907 +1481 1372 -35016.8233555 +1482 1372 518000.345496 +1487 1372 .00879154959694 +1488 1372 .000901431776583 +1489 1372 -464866.753585 +1490 1372 8527.06010246 +1491 1372 -116221.485887 +1492 1372 -8754.20566145 +1493 1372 129500.083749 +1498 1372 50276.8313036 +1499 1372 -30451.7513255 +1500 1372 192580.623976 +1501 1372 .00327618606389 +1502 1372 -121802.310014 +1518 1372 50352.4314138 +1519 1372 -129500.087326 +1520 1372 -30451.5839809 +1373 1373 518014.630513 +1374 1373 -1.71817839146e-8 +1375 1373 -4571.07962245 +1376 1373 67619.5210421 +1383 1373 -103185.437932 +1384 1373 -563762.124492 +1385 1373 1.65635719895e-8 +1388 1373 -245434.953487 +1389 1373 -5.22322952747e-9 +1399 1373 -38110.1712081 +1400 1373 563759.929115 +1442 1373 -61358.9884017 +1443 1373 -87385.2564527 +1444 1373 -9527.54180266 +1445 1373 140939.967495 +1450 1373 -25796.4839459 +1451 1373 -140940.539537 +1452 1373 -45862.2783615 +1481 1373 -1142.7675157 +1482 1373 16904.8449068 +1487 1373 65324.2750074 +1488 1373 -16904.8569366 +1489 1373 -8527.06010246 +1490 1373 129503.132254 +1491 1373 303.094563698 +1492 1373 8954.83129336 +1493 1373 -132467.918541 +1498 1373 -67573.2006234 +1499 1373 96366.9662598 +1500 1373 -38384.3022338 +1501 1373 132468.431905 +1502 1373 46013.8328814 +1374 1374 464881.315426 +1375 1374 5.54025173187e-9 +1376 1374 -8.19563865662e-8 +1383 1374 1.11758708954e-8 +1384 1374 3.39932739735e-8 +1385 1374 55315.2897779 +1388 1374 1.91789120436e-8 +1389 1374 110635.28095 +1399 1374 2.70716845989e-9 +1400 1374 -4.00468707085e-8 +1442 1374 -87535.7603657 +1443 1374 -55316.386255 +1444 1374 -8754.17067509 +1445 1374 129499.5662 +1450 1374 -37108.0770763 +1451 1374 -129500.084425 +1452 1374 -27659.3684761 +1481 1374 -35016.6833491 +1482 1374 517998.274395 +1487 1374 26489.7721063 +1488 1374 -518000.345947 +1489 1374 -116221.485887 +1490 1374 -303.094563709 +1491 1374 -232433.705374 +1492 1374 -8754.17099187 +1493 1374 129499.570886 +1498 1374 96214.3623527 +1499 1374 -60901.3754654 +1500 1374 54768.0344823 +1501 1374 -129500.089111 +1502 1374 -30451.8350938 +1375 1375 115672212.256 +1376 1375 7283804.37176 +1378 1375 7.45058059692e-9 +1379 1375 -.251788226677 +1383 1375 33180.2505301 +1384 1375 72930.0160589 +1385 1375 -2.36090272665e-9 +1388 1375 35708.7827829 +1389 1375 5.66616654396e-10 +1399 1375 46297604.4952 +1400 1375 3213688.56774 +1401 1375 2.98023223877e-7 +1403 1375 2130.21434382 +1442 1375 8927.1966951 +1443 1375 8754.17097664 +1444 1375 -27462935.4358 +1445 1375 -1955922.70006 +1446 1375 -51131291.8077 +1447 1375 1263758.79445 +1448 1375 86164.4408314 +1449 1375 -816.463332821 +1450 1375 8295.06263252 +1451 1375 18232.5124284 +1452 1375 8754.20567669 +1481 1375 -49186373.3679 +1482 1375 -3261366.33219 +1483 1375 2.0588221848 +1484 1375 -3145643.53872 +1485 1375 -214486.130523 +1486 1375 .0967358672315 +1487 1375 -3550.03527816 +1488 1375 69420.1717023 +1489 1375 35016.8233555 +1490 1375 -1142.7675157 +1491 1375 35016.6833491 +1492 1375 -27463030.8839 +1493 1375 -1954477.44277 +1494 1375 51131263.6705 +1495 1375 1263906.88098 +1496 1375 86184.7854247 +1497 1375 816.560068688 +1498 1375 -9499.90720441 +1499 1375 8754.17065986 +1500 1375 -10074.1923682 +1501 1375 16558.0824179 +1502 1375 8754.20599347 +1376 1376 9380338.49747 +1378 1376 -1.19209289551e-7 +1379 1376 -.022544613923 +1383 1376 -490832.108433 +1384 1376 -1078846.3914 +1385 1376 3.49245965481e-8 +1388 1376 -528236.4317 +1389 1376 -8.38190317154e-9 +1399 1376 3213688.56774 +1400 1376 -608654.332957 +1401 1376 2.04890966415e-8 +1403 1376 -31243.4814768 +1442 1376 -132059.122709 +1443 1376 -129499.57066 +1444 1376 -1955922.70006 +1445 1376 1093193.28007 +1446 1376 -3486186.75252 +1447 1376 -18535329.3672 +1448 1376 -1263758.79445 +1449 1376 11974.9250067 +1450 1376 -122708.027108 +1451 1376 -269711.722314 +1452 1376 -129500.083975 +1481 1376 -3261366.33219 +1482 1376 -1568850.86985 +1483 1376 -30.194589261 +1484 1376 46133860.8866 +1485 1376 3145643.53872 +1486 1376 .00525184947765 +1487 1376 52515.3147657 +1488 1376 -1026925.6169 +1489 1376 -518000.345496 +1490 1376 16904.8449068 +1491 1376 -517998.274396 +1492 1376 -1954477.44277 +1493 1376 1068391.56416 +1494 1376 3486599.41191 +1495 1376 -18535297.1051 +1496 1376 -1263906.88098 +1497 1376 -11974.9197548 +1498 1376 140531.171663 +1499 1376 -129499.565974 +1500 1376 149026.514323 +1501 1376 -244942.047602 +1502 1376 -129500.088661 +1377 1377 15267015227.5 +1399 1377 -3.8743019104e-7 +1400 1377 -2.60770320892e-8 +1401 1377 3729994733.66 +1444 1377 -51131291.8077 +1445 1377 -3486186.75252 +1446 1377 -1922836059.47 +1481 1377 -2.05882242322 +1482 1377 30.1945892442 +1483 1377 -7517830260.3 +1492 1377 51131263.6705 +1493 1377 3486599.41191 +1494 1377 -1922837085.77 +1378 1378 1879167901.72 +1379 1378 -1.86264514923e-9 +1402 1378 -703940480.373 +1444 1378 -1263758.79445 +1445 1378 18535329.3672 +1447 1378 -371207454.429 +1448 1378 -25309325.5483 +1449 1378 266308.811499 +1481 1378 3145643.53872 +1482 1378 -46133860.8866 +1484 1378 860236321.812 +1485 1378 58655329.8482 +1486 1378 .0107230338035 +1492 1378 -1263906.88098 +1493 1378 18535297.1051 +1495 1378 -371206819.998 +1496 1378 -25312292.0771 +1497 1378 -266308.66495 +1379 1379 2492827.7391 +1399 1379 -2130.21434382 +1400 1379 31243.4814768 +1402 1379 4.07453626394e-9 +1403 1379 459767.331148 +1444 1379 816.463332821 +1445 1379 -11974.9250067 +1447 1379 266308.811499 +1448 1379 18157.2226694 +1449 1379 -184697.186945 +1481 1379 .0967358672387 +1482 1379 .00525184936123 +1484 1379 -.010723029729 +1485 1379 .157263485897 +1486 1379 -1065668.00477 +1492 1379 -816.560068688 +1493 1379 11974.9197548 +1495 1379 -266308.66495 +1496 1379 -18159.371937 +1497 1379 -184697.30516 +1380 1380 165089375.384 +1381 1380 -183199.988441 +1382 1380 -1.23400241137e-8 +1383 1380 -402970.604209 +1384 1380 -88889.7388373 +1385 1380 1.11758708954e-8 +1386 1380 -81796510.4604 +1387 1380 4.7730281949e-9 +1388 1380 -81856.231042 +1389 1380 1.52504071593e-8 +1390 1380 -408597.434317 +1394 1380 -296092796.093 +1398 1380 3.81469726563e-5 +1399 1380 32402.8916265 +1400 1380 -479332.716368 +1412 1380 248489891.519 +1413 1380 6715506.71551 +1417 1380 -506040433.924 +1418 1380 8.82148742676e-6 +1419 1380 11485992.1246 +1420 1380 22431.7154827 +1421 1380 -102149.352812 +1424 1380 248489891.518 +1425 1380 -6715506.7155 +1426 1380 -23294869.5017 +1427 1380 -45799.9976098 +1428 1380 146999.505464 +1429 1380 11487553.5141 +1430 1380 147949.355218 +1431 1380 41522.4783151 +1442 1380 -20464.1781805 +1443 1380 31977.4238183 +1444 1380 8100.72290661 +1445 1380 -119833.179092 +1450 1380 -100743.132382 +1451 1380 -22222.442903 +1452 1380 156545.65914 +1453 1380 -30219.2760976 +1454 1380 142055.616532 +1455 1380 41522.6301091 +1381 1381 5373923.61057 +1382 1381 -1.09896063805e-7 +1383 1381 -88889.7388373 +1384 1381 2607464.32234 +1385 1381 -6.51925802231e-8 +1386 1381 683398.926498 +1387 1381 3.16649675369e-8 +1388 1381 -567464.833224 +1389 1381 4.56348061562e-8 +1390 1381 -2686957.57405 +1399 1381 88132.1168561 +1400 1381 -1303729.53929 +1419 1381 170849.737392 +1420 1381 280000.188872 +1421 1381 -671739.626716 +1426 1381 -45799.9976098 +1427 1381 1343480.43563 +1428 1381 -.0029877293855 +1429 1381 -125049.734986 +1430 1381 -671741.144715 +1431 1381 -280000.186209 +1442 1381 -141866.216446 +1443 1381 140000.091685 +1444 1381 22033.0373544 +1445 1381 -325932.505243 +1450 1381 -22222.442903 +1451 1381 651865.839396 +1452 1381 .00266294274479 +1453 1381 142055.616532 +1454 1381 -325933.942156 +1455 1381 -140000.094024 +1382 1382 415114.779096 +1383 1382 2.04890966415e-8 +1384 1382 -6.42612576485e-8 +1385 1382 214083.262785 +1386 1382 -1.8859282136e-8 +1387 1382 103772.75518 +1388 1382 1.6438215971e-8 +1389 1382 53518.0785148 +1390 1382 6.51925802231e-8 +1399 1382 -3.39969992638e-9 +1400 1382 5.02914190292e-8 +1419 1382 -51068.034595 +1420 1382 -51890.2752931 +1421 1382 280000.18488 +1426 1382 -146999.505464 +1427 1382 .00298771075904 +1428 1382 -207548.743351 +1429 1382 -31977.2719444 +1430 1382 -280000.187543 +1431 1382 -51890.1510547 +1442 1382 41441.4252353 +1443 1382 -26761.0693146 +1444 1382 -9464.00616503 +1445 1382 140000.091199 +1450 1382 156545.649595 +1451 1382 .00266293715686 +1452 1382 -107038.324262 +1453 1382 41522.6253393 +1454 1382 -140000.094186 +1455 1382 -26761.0031396 +1383 1383 913395.922943 +1384 1383 -323189.02841 +1385 1383 -1.39698386192e-8 +1386 1383 -161135.207317 +1387 1383 -8.14907252789e-9 +1388 1383 228198.163151 +1389 1383 -2.14204192162e-8 +1390 1383 612668.01245 +1399 1383 -16385.6595232 +1400 1383 242391.413065 +1419 1383 -40283.9222492 +1420 1383 -46295.5786264 +1421 1383 153167.003112 +1426 1383 -100743.132382 +1427 1383 -22222.442903 +1428 1383 -156545.649595 +1429 1383 -20912.6812731 +1430 1383 -130944.565672 +1431 1383 -36750.022154 +1442 1383 57049.2961113 +1443 1383 -27562.5230014 +1444 1383 -4096.41572877 +1445 1383 60597.8658102 +1450 1383 228348.001203 +1451 1383 -80797.2570305 +1452 1383 -.00914755975828 +1453 1383 55706.857145 +1454 1383 20199.4024249 +1455 1383 9187.50153679 +1467 1383 -35488.2452373 +1468 1383 141097.586315 +1469 1383 45937.5328783 +1481 1383 8295.06263252 +1482 1383 -122708.027108 +1487 1383 -122080.295339 +1488 1383 -18389.5648524 +1489 1383 174920.671033 +1490 1383 -25796.4839459 +1491 1383 37108.0770763 +1384 1384 9480246.65238 +1385 1384 -2.52388417721e-7 +1386 1384 612668.01245 +1387 1384 8.38190317154e-9 +1388 1384 -78039.7292715 +1389 1384 1.12690031529e-7 +1390 1384 -1303729.76266 +1399 1384 320431.142337 +1400 1384 -4740105.65587 +1419 1384 153167.003112 +1420 1384 140000.095678 +1421 1384 -325932.561084 +1426 1384 -22222.442903 +1427 1384 651865.839396 +1428 1384 -.00266295392066 +1429 1384 -130944.565672 +1430 1384 -325933.923542 +1431 1384 -140000.09269 +1442 1384 -19509.9529105 +1443 1384 539000.359971 +1444 1384 80107.8187207 +1445 1384 -1185026.90415 +1450 1384 -80797.2570304 +1451 1384 2370060.68145 +1452 1384 -.000937809236348 +1453 1384 20199.4024249 +1454 1384 -1185034.41167 +1455 1384 -539000.359659 +1467 1384 141097.586315 +1468 1384 -269712.875471 +1469 1384 -129500.0871 +1481 1384 18232.5124284 +1482 1384 -269711.722314 +1487 1384 -18389.5648524 +1488 1384 539423.915505 +1489 1384 .00297556677833 +1490 1384 -140940.539537 +1491 1384 129500.084425 +1385 1385 872595.594027 +1386 1385 -1.30385160446e-8 +1387 1385 53517.9109923 +1388 1385 -2.11708247662e-9 +1389 1385 218138.900333 +1390 1385 1.76951289177e-8 +1399 1385 -7.42897391319e-9 +1400 1385 1.09896063805e-7 +1419 1385 -46295.5833745 +1420 1385 -26761.1530759 +1421 1385 140000.095191 +1426 1385 -156545.65914 +1427 1385 -.00266296416521 +1428 1385 -107038.324262 +1429 1385 -36750.0269238 +1430 1385 -140000.092853 +1431 1385 -26760.9752199 +1442 1385 8873.91051248 +1443 1385 -109076.241974 +1444 1385 -36436.4243024 +1445 1385 539000.359503 +1450 1385 .00914755370468 +1451 1385 .000937731936574 +1452 1385 -436282.207438 +1453 1385 9187.51072696 +1454 1385 -539000.359815 +1455 1385 -109075.542903 +1467 1385 45937.5284659 +1468 1385 -129500.087251 +1469 1385 -27659.3116492 +1481 1385 -8754.20567669 +1482 1385 129500.083975 +1487 1385 174920.662203 +1488 1385 .00297557143495 +1489 1385 -110632.553125 +1490 1385 45862.2783615 +1491 1385 -27659.3684761 +1386 1386 144237583.646 +1387 1386 6.98491930962e-9 +1388 1386 -241386.77409 +1389 1386 2.60770320892e-8 +1390 1386 3364363.97384 +1391 1386 -2.38418579102e-7 +1394 1386 296090713.699 +1398 1386 296092796.093 +1399 1386 50987615.0473 +1400 1386 2979876.01263 +1401 1386 -2.08616256714e-7 +1402 1386 -7.45058059692e-9 +1403 1386 -2082.39348551 +1417 1386 248489891.518 +1418 1386 6715506.7155 +1419 1386 -38441706.87 +1420 1386 92590.7891601 +1421 1386 -1922423.0928 +1422 1386 -3741313.67444 +1423 1386 -1486954.93769 +1424 1386 -253121601.267 +1425 1386 6716335.16199 +1426 1386 11485992.1246 +1427 1386 170849.737392 +1428 1386 51068.034595 +1442 1386 -60346.9344636 +1443 1386 87818.5227136 +1444 1386 -29456737.5236 +1445 1386 -2221747.11041 +1446 1386 51131286.8839 +1447 1386 1152925.69933 +1448 1386 78609.3564946 +1449 1386 828.44649193 +1450 1386 -40283.9222492 +1451 1386 153167.003112 +1452 1386 46295.5833745 +1387 1387 207557.745128 +1388 1387 -3.54945659637e-9 +1389 1387 107041.873065 +1390 1387 -4.842877388e-8 +1399 1387 7.55488872528e-10 +1400 1387 -1.11758708954e-8 +1419 1387 -92590.7891601 +1420 1387 -103774.433202 +1421 1387 279999.069115 +1426 1387 -22431.7154827 +1427 1387 -280000.188872 +1428 1387 -51890.2752931 +1442 1387 78191.4501587 +1443 1387 -53519.2806113 +1444 1387 -9463.96859533 +1445 1387 139999.535434 +1450 1387 46295.5786264 +1451 1387 -140000.095678 +1452 1387 -26761.1530758 +1388 1388 451097.0415 +1389 1388 -1.86309218407e-8 +1390 1388 567462.645425 +1399 1388 -5275.49670075 +1400 1388 78039.892023 +1419 1388 -60346.9344636 +1420 1388 -78191.4501587 +1421 1388 141865.647053 +1426 1388 -20464.1781805 +1427 1388 -141866.216446 +1428 1388 -41441.4252353 +1442 1388 112773.76837 +1443 1388 313.594349565 +1444 1388 -1318.8719359 +1445 1388 19509.9398801 +1450 1388 57049.2961113 +1451 1388 -19509.9529106 +1452 1388 -8873.91051248 +1481 1388 8927.1966951 +1482 1388 -132059.122709 +1487 1388 -35262.2677262 +1488 1388 132059.638893 +1489 1388 41598.2299375 +1490 1388 -61358.9884017 +1491 1388 87535.7603657 +1389 1389 436299.187114 +1390 1389 -4.74974513054e-8 +1399 1389 9.31769609451e-9 +1400 1389 -1.37835741043e-7 +1419 1389 -87818.5227136 +1420 1389 -53519.2806113 +1421 1389 139999.531442 +1426 1389 -31977.4238183 +1427 1389 -140000.091685 +1428 1389 -26761.0693146 +1442 1389 -313.594349578 +1443 1389 -218141.790724 +1444 1389 -36436.27862 +1445 1389 538998.204438 +1450 1389 27562.5230014 +1451 1389 -539000.359971 +1452 1389 -109076.241974 +1481 1389 -8754.17097664 +1482 1389 129499.57066 +1487 1389 50352.4315243 +1488 1389 -129500.088886 +1489 1389 -27659.4522377 +1490 1389 87385.2564527 +1491 1389 -55316.386255 +1390 1390 17742391122.8 +1391 1390 -7.62939453125e-6 +1394 1390 30541.4657061 +1395 1390 -16929487179.5 +1399 1390 3504409.72802 +1400 1390 -195209.9648 +1401 1390 -1.39698386192e-8 +1402 1390 1.19209289551e-7 +1403 1390 30541.4657061 +1414 1390 -4535256410.26 +1415 1390 -1.3875e9 +1419 1390 -1922423.0928 +1420 1390 -279999.069115 +1421 1390 4130838380.3 +1422 1390 112244907.88 +1423 1390 21808454.335 +1424 1390 1486954.93769 +1425 1390 -12150.427044 +1426 1390 -102149.352812 +1427 1390 -671739.626716 +1428 1390 -280000.18488 +1442 1390 141865.647053 +1443 1390 -139999.531442 +1444 1390 -2090613.66726 +1445 1390 1056679.10951 +1446 1390 3486258.96796 +1447 1390 -16909407.8294 +1448 1390 -1152925.69933 +1449 1390 -12150.427044 +1450 1390 153167.003112 +1451 1390 -325932.561084 +1452 1390 -140000.095191 +1391 1391 15699455641.2 +1395 1391 -9.53674316406e-7 +1396 1391 -4629120879.12 +1399 1391 -5.96046447754e-8 +1400 1391 -3.72529029846e-9 +1401 1391 4041454664.25 +1414 1391 -1.3875e9 +1415 1391 -3256868131.87 +1419 1391 3741313.67444 +1421 1391 -112244907.88 +1422 1391 -2224798463.61 +1444 1391 51131286.8839 +1445 1391 3486258.96796 +1446 1391 -2074228117.67 +1392 1392 893635296.65 +1393 1392 60930288.6138 +1394 1392 3.72529029846e-9 +1399 1392 7.45058059692e-9 +1400 1392 -1.19209289551e-7 +1402 1392 -638884878.362 +1403 1392 2.44472175837e-9 +1419 1392 1486954.93769 +1421 1392 -21808454.335 +1423 1392 403989431.255 +1424 1392 27545009.3966 +1425 1392 -19486.008721 +1444 1392 -1152925.69933 +1445 1392 16909407.8294 +1447 1392 -340301826.683 +1448 1392 -23202629.2978 +1449 1392 -266308.785854 +1393 1393 10182038994.8 +1394 1393 -3.57627868652e-7 +1397 1393 -9942307692.29 +1398 1393 8.94069671631e-8 +1399 1393 4.65661287308e-10 +1400 1393 -7.45058059692e-9 +1402 1393 -43560768.2189 +1403 1393 1.67347025126e-10 +1417 1393 -4836023351.64 +1418 1393 2.890625e7 +1419 1393 253121601.267 +1421 1393 -1486954.93769 +1423 1393 27545009.3966 +1424 1393 4896795670.01 +1425 1393 2342421.39521 +1426 1393 -248489891.518 +1444 1393 -78609.3564946 +1445 1393 1152925.69933 +1447 1393 -23202629.2978 +1448 1393 -1582013.2721 +1449 1393 -18157.5987915 +1394 1394 1936558367.77 +1397 1394 1.63912773132e-7 +1398 1394 1190571581.2 +1399 1394 2082.39348551 +1400 1394 -30541.4657061 +1402 1394 -6.98491930962e-10 +1403 1394 487642.127049 +1417 1394 2.890625e7 +1418 1394 -53619123.9316 +1419 1394 6716335.16199 +1421 1394 -12150.427044 +1423 1394 19486.008721 +1424 1394 -2342421.39521 +1425 1394 115137744.425 +1426 1394 -6715506.7155 +1444 1394 -828.44649193 +1445 1394 12150.427044 +1447 1394 -266308.785854 +1448 1394 -18157.5987915 +1449 1394 -202023.574818 +1395 1395 35474358974.4 +1396 1395 -7.62939453125e-6 +1409 1395 -4535256410.26 +1410 1395 -1.3875e9 +1414 1395 8262820512.82 +1415 1395 5.72204589844e-6 +1421 1395 -4535256410.26 +1422 1395 1.3875e9 +1396 1396 14912087912.1 +1409 1396 -1.3875e9 +1410 1396 -3256868131.87 +1414 1396 -8.58306884766e-6 +1415 1396 3686813186.81 +1421 1396 1.3875e9 +1422 1396 -3256868131.87 +1397 1397 20355769230.8 +1398 1397 -4.76837158203e-7 +1412 1397 -4836023351.64 +1413 1397 2.890625e7 +1417 1397 9789835164.83 +1418 1397 7.45058059692e-8 +1419 1397 -248489891.518 +1424 1397 -4836023351.64 +1425 1397 -2.890625e7 +1426 1397 506040433.924 +1429 1397 -248489891.519 +1398 1398 3870459401.71 +1412 1398 2.890625e7 +1413 1398 -53619123.9316 +1417 1398 3.57627868652e-7 +1418 1398 231436965.812 +1419 1398 6715506.7155 +1424 1398 -2.890625e7 +1425 1398 -53619123.9316 +1426 1398 8.34465026856e-6 +1429 1398 -6715506.71551 +1399 1399 119463717.139 +1400 1399 7507852.71688 +1401 1399 -4.76837158203e-7 +1402 1399 1.49011611938e-8 +1403 1399 -47.8208583169 +1419 1399 -29456737.5236 +1420 1399 9463.96859533 +1421 1399 -2090613.66726 +1422 1399 -51131286.8839 +1423 1399 1152925.69933 +1424 1399 78609.3564946 +1425 1399 -828.44649193 +1426 1399 8100.72290661 +1427 1399 22033.0373544 +1428 1399 9464.00616503 +1442 1399 -1318.8719359 +1443 1399 36436.27862 +1444 1399 -51403789.8076 +1445 1399 -3427559.15644 +1446 1399 -.360276088119 +1447 1399 -3059684.37739 +1448 1399 -208614.698486 +1449 1399 -11.9831591097 +1450 1399 -4096.41572877 +1451 1399 80107.8187207 +1452 1399 36436.4243024 +1481 1399 -27462935.4358 +1482 1399 -1955922.70006 +1483 1399 51131291.8077 +1484 1399 1263758.79445 +1485 1399 86164.4408314 +1486 1399 816.463332821 +1487 1399 -10159.7496845 +1488 1399 18232.5162033 +1489 1399 8754.20597824 +1490 1399 -9527.54180266 +1491 1399 8754.17067509 +1400 1400 9901072.56295 +1401 1400 -2.98023223877e-8 +1402 1400 -1.19209289551e-7 +1403 1400 702.015770667 +1419 1400 -2221747.11041 +1420 1400 -139999.535434 +1421 1400 1056679.10951 +1422 1400 -3486258.96796 +1423 1400 -16909407.8294 +1424 1400 -1152925.69933 +1425 1400 12150.427044 +1426 1400 -119833.179092 +1427 1400 -325932.505243 +1428 1400 -140000.091199 +1442 1400 19509.9398801 +1443 1400 -538998.204438 +1444 1400 -3427559.15644 +1445 1400 -1356464.42966 +1446 1400 5.2840567017 +1447 1400 44875402.1562 +1448 1400 3059684.37739 +1449 1400 175.502037358 +1450 1400 60597.8658102 +1451 1400 -1185026.90415 +1452 1400 -539000.359503 +1481 1400 -1955922.70006 +1482 1400 1093193.28007 +1483 1400 3486186.75252 +1484 1400 -18535329.3672 +1485 1400 -1263758.79445 +1486 1400 -11974.9250067 +1487 1400 150292.155096 +1488 1400 -269711.778155 +1489 1400 -129500.088435 +1490 1400 140939.967495 +1491 1400 -129499.5662 +1401 1401 15876917230.4 +1419 1401 -51131286.8839 +1421 1401 -3486258.96796 +1422 1401 -2074228117.67 +1444 1401 .36027623713 +1445 1401 -5.28405669145 +1446 1401 -7827119137 +1481 1401 51131291.8077 +1482 1401 3486186.75252 +1483 1401 -1922836059.47 +1402 1402 1833219936.63 +1403 1402 -1.86264514923e-9 +1419 1402 -1152925.69933 +1421 1402 16909407.8294 +1423 1402 -340301826.683 +1424 1402 -23202629.2978 +1425 1402 266308.785854 +1444 1402 3059684.37739 +1445 1402 -44875402.1562 +1447 1402 834107925.586 +1448 1402 56870953.333 +1449 1402 -.00187643989921 +1481 1402 -1263758.79445 +1482 1402 18535329.3672 +1484 1402 -371207454.429 +1485 1402 -25309325.5483 +1486 1402 -266308.811499 +1403 1403 2575080.50874 +1419 1403 828.44649193 +1421 1403 -12150.427044 +1423 1403 266308.785854 +1424 1403 18157.5987915 +1425 1403 -202023.574818 +1444 1403 -11.9831591097 +1445 1403 175.502037358 +1447 1403 .00187644374091 +1448 1403 -.0275211282569 +1449 1403 -1113572.3197 +1481 1403 -816.463332821 +1482 1403 11974.9250067 +1484 1403 -266308.811499 +1485 1403 -18157.2226694 +1486 1403 -184697.186945 +1404 1404 36927417582.4 +1405 1404 -1.52587890625e-5 +1409 1404 -17684862637.4 +1437 1404 -17684862637.4 +1438 1404 1.23977661133e-5 +1567 1404 -4854166666.67 +1568 1404 1.3875e9 +1575 1404 8958333333.33 +1576 1404 -6.67572021484e-6 +1581 1404 -4854166666.67 +1582 1404 -1.3875e9 +1405 1405 15230922478.9 +1406 1405 -2.86102294922e-6 +1409 1405 -3.81469726563e-6 +1410 1405 -4889499700.98 +1411 1405 65306122.449 +1437 1405 -1.23977661133e-5 +1438 1405 -4889499700.98 +1439 1405 -65306122.449 +1567 1405 1.3875e9 +1568 1405 -3.4375e9 +1575 1405 -9.53674316406e-7 +1576 1405 4.25e9 +1581 1405 -1.3875e9 +1582 1405 -3.4375e9 +1406 1406 914285714.286 +1410 1406 -65306122.449 +1411 1406 228571428.571 +1438 1406 65306122.449 +1439 1406 228571428.571 +1407 1407 21190109890.1 +1408 1407 -7.15255737305e-7 +1412 1407 -10367891483.5 +1413 1407 5.8114528656e-7 +1429 1407 208025.148163 +1432 1407 208025.148163 +1434 1407 832100.591238 +1440 1407 -10367891483.5 +1441 1407 -2.38418579102e-7 +1569 1407 -5.2109375e9 +1570 1407 -2.890625e7 +1577 1407 1.053125e10 +1578 1407 1.49011611938e-8 +1579 1407 -248697916.667 +1584 1407 -5.2109375e9 +1585 1407 2.890625e7 +1599 1407 505208333.333 +1602 1407 -248697916.667 +1408 1408 18803657280.2 +1412 1408 2.98023223877e-8 +1413 1408 4915908310.44 +1429 1408 1362048665.62 +1432 1408 -1362048665.62 +1434 1408 5.34057617188e-5 +1440 1408 6.10947608948e-7 +1441 1408 4915908310.44 +1569 1408 -2.890625e7 +1570 1408 -23003472.2222 +1577 1408 5.36441802978e-7 +1578 1408 322048611.111 +1579 1408 -13888888.8889 +1584 1408 2.890625e7 +1585 1408 -23003472.2222 +1599 1408 2.38418579102e-6 +1602 1408 13888888.8889 +1409 1409 36927417582.4 +1414 1409 -17684862637.4 +1415 1409 -2.86102294922e-6 +1559 1409 -4854166666.67 +1560 1409 1.3875e9 +1567 1409 8958333333.33 +1568 1409 -5.72204589844e-6 +1575 1409 -4854166666.67 +1576 1409 -1.3875e9 +1410 1410 15230922478.9 +1411 1410 5.48362731934e-6 +1414 1410 9.53674316406e-7 +1415 1410 -4889499700.98 +1416 1410 65306122.449 +1559 1410 1.3875e9 +1560 1410 -3.4375e9 +1567 1410 3.81469726563e-6 +1568 1410 4.25e9 +1575 1410 -1.3875e9 +1576 1410 -3.4375e9 +1411 1411 914285714.286 +1415 1411 -65306122.449 +1416 1411 228571428.571 +1412 1412 21190109890.1 +1413 1412 -4.76837158203e-7 +1417 1412 -10367891483.5 +1418 1412 1.63912773132e-7 +1426 1412 208025.147963 +1429 1412 832100.591442 +1434 1412 208025.148167 +1561 1412 -5.2109375e9 +1562 1412 -2.890625e7 +1569 1412 1.053125e10 +1570 1412 5.8114528656e-7 +1577 1412 -5.2109375e9 +1578 1412 2.890625e7 +1599 1412 -248697916.667 +1602 1412 505208333.333 +1636 1412 -248697916.667 +1413 1413 18803657280.2 +1417 1413 8.94069671631e-8 +1418 1413 4915908310.44 +1426 1413 1362048665.62 +1429 1413 -.000112533569336 +1434 1413 -1362048665.62 +1561 1413 -2.890625e7 +1562 1413 -23003472.2222 +1569 1413 -2.98023223877e-8 +1570 1413 322048611.111 +1577 1413 2.890625e7 +1578 1413 -23003472.2222 +1599 1413 -13888888.8889 +1602 1413 -5.00679016113e-6 +1636 1413 13888888.8889 +1414 1414 36927417582.4 +1415 1414 7.62939453125e-6 +1421 1414 -17684862637.4 +1422 1414 9.53674316406e-7 +1559 1414 8958333333.33 +1560 1414 2.86102294922e-6 +1567 1414 -4854166666.67 +1568 1414 -1.3875e9 +1629 1414 -4854166666.67 +1630 1414 1.3875e9 +1415 1415 15230922478.9 +1416 1415 -1.09672546387e-5 +1421 1415 -4.76837158203e-6 +1422 1415 -4889499700.98 +1423 1415 65306122.449 +1559 1415 -1.90734863281e-6 +1560 1415 4.25e9 +1567 1415 -1.3875e9 +1568 1415 -3.4375e9 +1629 1415 1.3875e9 +1630 1415 -3.4375e9 +1416 1416 914285714.286 +1422 1416 -65306122.449 +1423 1416 228571428.571 +1417 1417 21190109890.1 +1418 1417 -4.76837158203e-7 +1419 1417 208025.148369 +1424 1417 -10367891483.5 +1425 1417 1.63912773132e-7 +1426 1417 832100.591242 +1429 1417 208025.147961 +1561 1417 1.053125e10 +1562 1417 1.63912773132e-7 +1569 1417 -5.2109375e9 +1570 1417 2.890625e7 +1602 1417 -248697916.667 +1632 1417 -5.2109375e9 +1633 1417 -2.890625e7 +1636 1417 505208333.333 +1648 1417 -248697916.667 +1418 1418 18803657280.2 +1419 1418 1362048665.62 +1424 1418 2.68220901489e-7 +1425 1418 4915908310.44 +1426 1418 .00023078918457 +1429 1418 -1362048665.62 +1561 1418 5.96046447754e-8 +1562 1418 322048611.111 +1569 1418 2.890625e7 +1570 1418 -23003472.2222 +1602 1418 -13888888.8889 +1632 1418 -2.890625e7 +1633 1418 -23003472.2222 +1636 1418 1.00135803223e-5 +1648 1418 13888888.8889 +1419 1419 399406107.754 +1420 1419 6.053596735e-9 +1421 1419 5073291.18915 +1422 1419 7.15255737305e-7 +1423 1419 30676.1545436 +1424 1419 418141.872326 +1425 1419 1324249337.73 +1426 1419 -283932015.674 +1427 1419 709683.501164 +1428 1419 -2.02562659979e-8 +1442 1419 -250670.904615 +1443 1419 2.56113708019e-8 +1444 1419 -6096438.26863 +1445 1419 950423.117745 +1446 1419 -8.04662704468e-7 +1447 1419 15338.0772717 +1448 1419 1045.78845358 +1449 1419 -37799327.8906 +1450 1419 -167332.7272 +1451 1419 636232.166775 +1452 1419 -1.210719347e-8 +1561 1419 248697916.667 +1562 1419 13888888.8889 +1629 1419 -1798447.98155 +1630 1419 -3741313.67444 +1631 1419 -1456278.78315 +1632 1419 -252703459.395 +1633 1419 13889647.64 +1636 1419 9221017.50396 +1637 1419 183992.024313 +1638 1419 51068.034595 +1648 1419 -34010608.7924 +1649 1419 92590.7891601 +1719 1419 -43382.6735895 +1720 1419 164949.080275 +1721 1419 46295.5833745 +1730 1419 -27548604.1098 +1731 1419 -2099969.63517 +1732 1419 51131286.8839 +1733 1419 1168263.7766 +1734 1419 758.751125708 +1737 1419 -64988.982516 +1738 1419 87818.5227136 +1420 1420 200145.297809 +1421 1420 -3.91155481339e-8 +1426 1420 1.04773789644e-9 +1427 1420 1.86264514923e-8 +1428 1420 100066.296237 +1442 1420 -5.28618693352e-10 +1443 1420 103219.071857 +1444 1420 6.2957406044e-11 +1445 1420 -9.31322574615e-10 +1450 1420 -5.82076609135e-9 +1451 1420 2.79396772385e-9 +1452 1420 51606.394021 +1629 1420 279999.069115 +1636 1420 -22431.7154827 +1637 1420 -280000.188872 +1638 1420 -48184.1161732 +1648 1420 -92590.7891601 +1649 1420 -96361.6443948 +1719 1420 46295.5786264 +1720 1420 -140000.095678 +1721 1420 -24849.8051491 +1730 1420 -9463.96859533 +1731 1420 139999.535434 +1737 1420 78191.4501587 +1738 1420 -49696.352024 +1421 1421 18496758005.6 +1423 1421 -449912.434182 +1424 1421 -30676.1545436 +1425 1421 554384598.55 +1426 1421 -424312.719682 +1427 1421 -2790302.1192 +1428 1421 6.33299350738e-8 +1442 1421 589288.130373 +1443 1421 -4.28408384323e-8 +1444 1421 1495131.20822 +1445 1421 -27948070.7398 +1446 1421 -5.40167093277e-8 +1447 1421 -224956.21709 +1448 1421 -15338.0772717 +1449 1421 554384598.55 +1450 1421 636232.166775 +1451 1421 -1353873.22698 +1452 1421 1.95577740669e-8 +1559 1421 -4854166666.67 +1560 1421 -1.3875e9 +1629 1421 4478757642.79 +1630 1421 112244907.88 +1631 1421 21358541.9008 +1632 1421 1456278.78315 +1633 1421 -11128.2385613 +1636 1421 -110006.995906 +1637 1421 -723411.88263 +1638 1421 -280000.18488 +1648 1421 -1798447.98155 +1649 1421 -279999.069115 +1719 1421 164949.080275 +1720 1421 -351004.284642 +1721 1421 -140000.095191 +1730 1421 -1958749.00549 +1731 1421 1039340.97362 +1732 1421 3486258.96796 +1733 1421 -17134364.0465 +1734 1421 -11128.2385613 +1737 1421 152778.390549 +1738 1421 -139999.531442 +1422 1422 15571679296.4 +1423 1422 -60880441.1474 +1424 1422 -64909343.3301 +1444 1422 5.96046447754e-7 +1445 1422 4.09781932831e-8 +1446 1422 3889903065.64 +1447 1422 4425681.3016 +1448 1422 -64909343.3301 +1559 1422 -1.3875e9 +1560 1422 -3.4375e9 +1629 1422 -112244907.88 +1630 1422 -1648650516.66 +1648 1422 3741313.67444 +1730 1422 51131286.8839 +1731 1422 3486258.96796 +1732 1422 -1930037431.27 +1423 1423 1440181989.13 +1424 1423 -51540751.5769 +1425 1423 7.45058059692e-9 +1444 1423 15338.0772717 +1445 1423 -224956.21709 +1446 1423 -4425681.3016 +1447 1423 -725316782.307 +1448 1423 -108737320.106 +1449 1423 8.03265720606e-9 +1629 1423 -21358541.9008 +1631 1423 428766767.273 +1632 1423 29234390.1096 +1633 1423 -19486.008721 +1648 1423 1456278.78315 +1730 1423 -1168263.7766 +1731 1423 17134364.0465 +1733 1423 -369628277.313 +1734 1423 -266308.785854 +1424 1424 12330503363.6 +1425 1424 -3.57627868652e-7 +1426 1424 208025.148369 +1444 1424 1045.78845358 +1445 1424 -15338.0772717 +1446 1424 64909343.3301 +1447 1424 -108737320.106 +1448 1424 862067315.611 +1449 1424 5.52972778678e-10 +1561 1424 -5.2109375e9 +1562 1424 2.890625e7 +1629 1424 -1456278.78315 +1631 1424 29234390.1096 +1632 1424 5267618273.8 +1633 1424 2342421.39521 +1636 1424 -248697916.667 +1648 1424 252703459.395 +1730 1424 -79655.1449482 +1731 1424 1168263.7766 +1733 1424 -25202180.0179 +1734 1424 -18157.5987915 +1425 1425 24254636884.3 +1426 1425 -1362048665.62 +1444 1425 37799327.8906 +1445 1425 -554384598.55 +1447 1425 -3.49245965481e-9 +1448 1425 -2.40106601268e-10 +1449 1425 7426233741.17 +1561 1425 2.890625e7 +1562 1425 -23003472.2222 +1629 1425 -11128.2385613 +1631 1425 19486.008721 +1632 1425 -2342421.39521 +1633 1425 160489182.213 +1636 1425 -13888888.8889 +1648 1425 13889647.64 +1730 1425 -758.751125708 +1731 1425 11128.2385613 +1733 1425 -266308.785854 +1734 1425 -185526.410692 +1426 1426 569289570.667 +1427 1426 -190246.141892 +1428 1426 -9.54605638981e-9 +1429 1426 -283925529.903 +1430 1426 614558.852323 +1431 1426 -1.23400241137e-8 +1442 1426 -85004.5595302 +1443 1426 1.33877620101e-8 +1444 1426 33649.156689 +1445 1426 -497768.590074 +1450 1426 -418469.521206 +1451 1426 -92308.5757568 +1452 1426 1.16415321827e-8 +1453 1426 -125525.735496 +1454 1426 590077.176366 +1455 1426 -5.35510480404e-9 +1561 1426 -505208333.333 +1562 1426 9.29832458496e-6 +1569 1426 248697916.667 +1570 1426 13888888.8889 +1602 1426 9222699.00034 +1603 1426 159330.07466 +1604 1426 41522.4783151 +1629 1426 -110006.995906 +1632 1426 248697916.667 +1633 1426 -13888888.8889 +1636 1426 -18661390.3496 +1637 1426 -49323.0742996 +1638 1426 146999.505464 +1648 1426 9221017.50396 +1649 1426 22431.7154827 +1692 1426 -32543.8238878 +1693 1426 152982.97165 +1694 1426 41522.6301091 +1719 1426 -108492.5565 +1720 1426 -23931.8607775 +1721 1426 156545.65914 +1730 1426 8723.85543789 +1731 1426 -129051.115945 +1737 1426 -22038.3338232 +1738 1426 31977.4238183 +1427 1427 5580612.93402 +1428 1427 -1.04308128357e-7 +1429 1427 -519437.368523 +1430 1427 -2790308.42367 +1431 1427 5.58793544769e-8 +1442 1427 -589290.404537 +1443 1427 3.91155481339e-8 +1444 1427 91521.8144634 +1445 1427 -1353872.99502 +1450 1427 -92308.5757568 +1451 1427 2707751.38781 +1452 1427 -6.33299350738e-8 +1453 1427 590077.176366 +1454 1427 -1353878.96374 +1455 1427 1.86264514923e-9 +1602 1427 -134668.94556 +1603 1427 -723413.517372 +1604 1427 -280000.186209 +1629 1427 -723411.88263 +1636 1427 -49323.0742996 +1637 1427 1446825.13071 +1638 1427 -.00298773311078 +1648 1427 183992.024313 +1649 1427 280000.188872 +1692 1427 152982.97165 +1693 1427 -351005.77195 +1694 1427 -140000.094024 +1719 1427 -23931.8607775 +1720 1427 702009.389358 +1721 1427 .00266294181347 +1730 1427 23727.8855766 +1731 1427 -351004.224506 +1737 1427 -152779.001522 +1738 1427 140000.091685 +1428 1428 400289.89261 +1429 1428 4.42378222942e-9 +1430 1428 1.86264514923e-8 +1431 1428 100066.074979 +1442 1428 1.63942575455e-8 +1443 1428 51606.5679867 +1444 1428 -3.58857214451e-9 +1445 1428 5.30853867531e-8 +1450 1428 1.90921127796e-8 +1451 1428 -5.40167093277e-8 +1452 1428 206437.67728 +1453 1428 -4.42378222942e-9 +1454 1428 1.86264514923e-9 +1455 1428 51606.2261358 +1602 1428 -31977.2719444 +1603 1428 -280000.187543 +1604 1428 -48184.0001295 +1629 1428 280000.18488 +1636 1428 -146999.505464 +1637 1428 .00298769772053 +1638 1428 -192723.191773 +1648 1428 -51068.034595 +1649 1428 -48184.1161733 +1692 1428 41522.6253393 +1693 1428 -140000.094186 +1694 1428 -24849.6614309 +1719 1428 156545.649595 +1720 1428 .00266293995082 +1721 1428 -99392.4843625 +1730 1428 -9464.00616503 +1731 1428 140000.091199 +1737 1428 41441.4252353 +1738 1428 -24849.7149448 +1429 1429 569283084.896 +1430 1429 -3.91155481339e-8 +1431 1429 -1.86264514923e-8 +1434 1429 -283925529.903 +1435 1429 519437.368523 +1436 1429 -1.07102096081e-8 +1450 1429 -86867.5723785 +1451 1429 -543923.580483 +1452 1429 1.46683305502e-8 +1453 1429 -421615.514429 +1454 1429 4.65661287308e-9 +1455 1429 9.31322574615e-9 +1464 1429 -86867.5723785 +1465 1429 543923.580483 +1466 1429 -4.19095158577e-9 +1561 1429 248697916.667 +1562 1429 -13888888.8889 +1569 1429 -505208333.333 +1570 1429 -5.00679016113e-6 +1577 1429 248697916.667 +1578 1429 13888888.8889 +1599 1429 9222699.00035 +1600 1429 134668.94556 +1601 1429 31977.2719444 +1602 1429 -18663071.8458 +1603 1429 -1.210719347e-8 +1604 1429 146999.505363 +1636 1429 9222699.00034 +1637 1429 -134668.94556 +1638 1429 31977.2719444 +1665 1429 -22521.3371537 +1666 1429 141017.22457 +1667 1429 36750.0269238 +1692 1429 -109308.184637 +1693 1429 1.86264514923e-9 +1694 1429 156545.309231 +1719 1429 -22521.3371537 +1720 1429 -141017.22457 +1721 1429 36750.0269238 +1430 1430 5580619.2388 +1431 1430 -9.12696123123e-8 +1434 1430 -614558.852323 +1435 1430 -2790308.42367 +1436 1430 4.47034835815e-8 +1450 1430 -543923.580483 +1451 1430 -1353878.88642 +1452 1430 4.00468707085e-8 +1454 1430 2707757.20153 +1455 1430 -4.00468707085e-8 +1464 1430 543923.580483 +1465 1430 -1353878.88642 +1466 1430 -9.31322574615e-10 +1599 1430 -159330.07466 +1600 1430 -723413.517372 +1601 1430 -280000.187543 +1602 1430 -5.58793544769e-9 +1603 1430 1446826.7653 +1604 1430 -2.421438694e-8 +1636 1430 159330.07466 +1637 1430 -723413.517372 +1638 1430 280000.187543 +1665 1430 141017.22457 +1666 1430 -351005.751905 +1667 1430 -140000.092853 +1693 1430 702010.896885 +1694 1430 -1.39698386192e-8 +1719 1430 -141017.22457 +1720 1430 -351005.751905 +1721 1430 140000.092853 +1431 1431 400289.421558 +1434 1431 3.72529029846e-9 +1435 1431 1.49011611938e-8 +1436 1431 100066.074979 +1450 1431 1.2805685401e-8 +1451 1431 5.02914190292e-8 +1452 1431 51606.2841229 +1453 1431 1.90921127796e-8 +1454 1431 -5.02914190292e-8 +1455 1431 206437.210847 +1464 1431 -2.56113708019e-9 +1465 1431 -4.65661287308e-9 +1466 1431 51606.2841229 +1599 1431 -41522.4783151 +1600 1431 -280000.186209 +1601 1431 -48184.0001295 +1602 1431 -146999.505363 +1603 1431 -5.58793544769e-9 +1604 1431 -192722.974483 +1636 1431 -41522.4783151 +1637 1431 280000.186209 +1638 1431 -48184.0001295 +1665 1431 36750.022154 +1666 1431 -140000.09269 +1667 1431 -24849.6313635 +1692 1431 156545.299685 +1693 1431 -1.11758708954e-8 +1694 1431 -99392.2646769 +1719 1431 36750.022154 +1720 1431 140000.09269 +1721 1431 -24849.6313635 +1432 1432 399425729.167 +1433 1432 -1.35041773319e-8 +1434 1432 -283932015.674 +1435 1432 -709683.501164 +1436 1432 4.65661287308e-9 +1437 1432 -5073291.18915 +1438 1432 -4.76837158203e-7 +1439 1432 -30676.1545436 +1440 1432 418141.872532 +1441 1432 -1323748991.71 +1456 1432 -6096438.26863 +1457 1432 -950423.117745 +1458 1432 -5.96046447754e-8 +1459 1432 -15338.0772718 +1460 1432 1045.78845359 +1461 1432 37799327.8906 +1462 1432 -250670.904615 +1463 1432 9.31322574615e-10 +1464 1432 -167332.7272 +1465 1432 -636232.166775 +1466 1432 1.25728547573e-8 +1577 1432 248697916.667 +1578 1432 -13888888.8889 +1579 1432 -34010608.7924 +1580 1432 92590.7891601 +1581 1432 1798447.98155 +1582 1432 -3741313.67444 +1583 1432 1456278.78315 +1584 1432 -252703459.395 +1585 1432 -13889647.64 +1599 1432 9221017.50395 +1600 1432 -183992.024313 +1601 1432 51068.034595 +1658 1432 -64988.982516 +1659 1432 87818.5227136 +1660 1432 -27548604.1098 +1661 1432 2099969.63517 +1662 1432 51131286.8839 +1663 1432 -1168263.7766 +1664 1432 -758.751125708 +1665 1432 -43382.6735895 +1666 1432 -164949.080275 +1667 1432 46295.5833745 +1433 1433 200145.297809 +1434 1433 -9.19681042433e-9 +1435 1433 4.47034835815e-8 +1436 1433 100066.296237 +1437 1433 -5.58793544769e-8 +1456 1433 -2.83308327198e-9 +1457 1433 -4.19095158577e-8 +1462 1433 1.30776315927e-8 +1463 1433 103219.071857 +1464 1433 1.210719347e-8 +1465 1433 3.72529029846e-8 +1466 1433 51606.394021 +1579 1433 -92590.7891601 +1580 1433 -96361.6443948 +1581 1433 -279999.069115 +1599 1433 -22431.7154827 +1600 1433 280000.188872 +1601 1433 -48184.1161733 +1658 1433 78191.4501587 +1659 1433 -49696.352024 +1660 1433 -9463.96859533 +1661 1433 -139999.535434 +1665 1433 46295.5786264 +1666 1433 140000.095678 +1667 1433 -24849.8051492 +1434 1434 569289570.667 +1435 1434 190246.141892 +1436 1434 -1.30385160446e-8 +1437 1434 424312.719682 +1440 1434 208025.148161 +1441 1434 1362048665.62 +1453 1434 -125525.735496 +1454 1434 -590077.176366 +1455 1434 9.77888703346e-9 +1456 1434 33649.156689 +1457 1434 497768.590074 +1462 1434 -85004.5595302 +1463 1434 -5.23868948221e-9 +1464 1434 -418469.521206 +1465 1434 92308.5757568 +1466 1434 1.67638063431e-8 +1569 1434 248697916.667 +1570 1434 -13888888.8889 +1577 1434 -505208333.333 +1578 1434 2.86102294922e-6 +1579 1434 9221017.50395 +1580 1434 22431.7154827 +1581 1434 110006.995906 +1584 1434 248697916.667 +1585 1434 13888888.8889 +1599 1434 -18661390.3496 +1600 1434 49323.0742996 +1601 1434 146999.505464 +1602 1434 9222699.00035 +1603 1434 -159330.07466 +1604 1434 41522.4783151 +1658 1434 -22038.3338232 +1659 1434 31977.4238183 +1660 1434 8723.85543789 +1661 1434 129051.115945 +1665 1434 -108492.5565 +1666 1434 23931.8607775 +1667 1434 156545.65914 +1692 1434 -32543.8238878 +1693 1434 -152982.97165 +1694 1434 41522.6301091 +1435 1435 5580612.93402 +1436 1435 -7.82310962677e-8 +1437 1435 -2790302.1192 +1453 1435 -590077.176366 +1454 1435 -1353878.96374 +1455 1435 2.98023223877e-8 +1456 1435 -91521.8144634 +1457 1435 -1353872.99502 +1462 1435 589290.404537 +1463 1435 2.79396772385e-9 +1464 1435 92308.5757568 +1465 1435 2707751.38781 +1466 1435 -4.19095158577e-8 +1579 1435 -183992.024313 +1580 1435 -280000.188872 +1581 1435 -723411.88263 +1599 1435 49323.0742996 +1600 1435 1446825.13071 +1601 1435 .00298771262169 +1602 1435 134668.94556 +1603 1435 -723413.517372 +1604 1435 280000.186209 +1658 1435 152779.001522 +1659 1435 -140000.091685 +1660 1435 -23727.8855766 +1661 1435 -351004.224506 +1665 1435 23931.8607775 +1666 1435 702009.389358 +1667 1435 -.00266296509653 +1692 1435 -152982.97165 +1693 1435 -351005.77195 +1694 1435 140000.094024 +1436 1436 400289.89261 +1437 1436 1.30385160446e-8 +1453 1436 1.09430402517e-8 +1454 1436 3.53902578354e-8 +1455 1436 51606.2261358 +1456 1436 -3.1478703022e-10 +1457 1436 -4.65661287308e-9 +1462 1436 -2.82842665911e-9 +1463 1436 51606.5679867 +1464 1436 1.25728547573e-8 +1465 1436 -3.53902578354e-8 +1466 1436 206437.67728 +1579 1436 -51068.034595 +1580 1436 -48184.1161732 +1581 1436 -280000.18488 +1599 1436 -146999.505464 +1600 1436 -.00298773683608 +1601 1436 -192723.191773 +1602 1436 -31977.2719444 +1603 1436 280000.187543 +1604 1436 -48184.0001295 +1658 1436 41441.4252353 +1659 1436 -24849.7149447 +1660 1436 -9464.00616503 +1661 1436 -140000.091199 +1665 1436 156545.649595 +1666 1436 -.00266297254711 +1667 1436 -99392.4843625 +1692 1436 41522.6253393 +1693 1436 140000.094186 +1694 1436 -24849.6614309 +1437 1437 18498622711.4 +1438 1437 7.62939453125e-6 +1439 1437 -449912.434182 +1440 1437 30676.1545436 +1441 1437 554384598.55 +1456 1437 -1495131.20822 +1457 1437 -27948070.7398 +1458 1437 4.65661287308e-9 +1459 1437 -224956.217091 +1460 1437 15338.0772718 +1461 1437 554384598.55 +1462 1437 -589288.130373 +1463 1437 -5.58793544769e-9 +1464 1437 -636232.166775 +1465 1437 -1353873.22698 +1466 1437 3.44589352608e-8 +1575 1437 -4854166666.67 +1576 1437 1.3875e9 +1579 1437 1798447.98155 +1580 1437 279999.069115 +1581 1437 4478757642.79 +1582 1437 -112244907.88 +1583 1437 21358541.9008 +1584 1437 -1456278.78315 +1585 1437 -11128.2385613 +1599 1437 110006.995906 +1600 1437 -723411.88263 +1601 1437 280000.18488 +1658 1437 -152778.390549 +1659 1437 139999.531442 +1660 1437 1958749.00549 +1661 1437 1039340.97362 +1662 1437 -3486258.96796 +1663 1437 -17134364.0465 +1664 1437 -11128.2385613 +1665 1437 -164949.080275 +1666 1437 -351004.284642 +1667 1437 140000.095191 +1438 1438 15571698917.8 +1439 1438 60380095.1266 +1440 1438 -64909343.3301 +1456 1438 2.98023223877e-7 +1457 1438 -2.04890966415e-8 +1458 1438 3889903065.64 +1459 1438 -4425681.3016 +1460 1438 -64909343.3301 +1575 1438 1.3875e9 +1576 1438 -3.4375e9 +1579 1438 3741313.67444 +1581 1438 112244907.88 +1582 1438 -1648650516.66 +1660 1438 51131286.8839 +1661 1438 -3486258.96796 +1662 1438 -1930037431.27 +1439 1439 1457193753.83 +1440 1439 51540751.5769 +1441 1439 7.45058059692e-9 +1456 1439 -15338.0772718 +1457 1439 -224956.217091 +1458 1439 4425681.3016 +1459 1439 -725316782.307 +1460 1439 108737320.106 +1461 1439 9.31322574615e-10 +1579 1439 -1456278.78315 +1581 1439 -21358541.9008 +1583 1439 428766767.273 +1584 1439 -29234390.1096 +1585 1439 -19486.008721 +1660 1439 1168263.7766 +1661 1439 17134364.0465 +1663 1439 -369628277.314 +1664 1439 -266308.785854 +1440 1440 12330503363.6 +1441 1440 3.57627868652e-7 +1456 1440 1045.78845359 +1457 1440 15338.0772718 +1458 1440 64909343.3301 +1459 1440 108737320.106 +1460 1440 862067315.611 +1461 1440 -6.54836185277e-11 +1577 1440 -5.2109375e9 +1578 1440 -2.890625e7 +1579 1440 252703459.395 +1581 1440 1456278.78315 +1583 1440 -29234390.1096 +1584 1440 5267618273.8 +1585 1440 -2342421.39521 +1599 1440 -248697916.667 +1660 1440 -79655.1449482 +1661 1440 -1168263.7766 +1663 1440 25202180.0179 +1664 1440 18157.5987915 +1441 1441 24271648649 +1456 1441 -37799327.8906 +1457 1441 -554384598.55 +1459 1441 -5.70435076952e-9 +1460 1441 3.85625753552e-10 +1461 1441 7426233741.17 +1577 1441 -2.890625e7 +1578 1441 -23003472.2222 +1579 1441 -13889647.64 +1581 1441 -11128.2385613 +1583 1441 19486.008721 +1584 1441 2342421.39521 +1585 1441 160489182.213 +1599 1441 13888888.8889 +1660 1441 758.751125708 +1661 1441 11128.2385613 +1663 1441 -266308.785854 +1664 1441 -185526.410691 +1442 1442 468446.879051 +1443 1442 -1.65283679962e-8 +1444 1442 -5478.40019855 +1445 1442 81041.4230554 +1450 1442 236974.991382 +1451 1442 -81041.2593571 +1452 1442 -5.67249953747e-9 +1481 1442 37082.1976042 +1482 1442 -548553.218997 +1487 1442 -146473.53048 +1488 1442 548555.45721 +1489 1442 -8.16807150841e-9 +1490 1442 -254874.784119 +1491 1442 1.93048268557e-8 +1629 1442 152778.390549 +1636 1442 -22038.3338232 +1637 1442 -152779.001522 +1638 1442 -41441.4252353 +1648 1442 -64988.982516 +1649 1442 -78191.4501587 +1719 1442 61437.7277033 +1720 1442 -21010.7164824 +1721 1442 -8873.91051248 +1730 1442 -1420.32384474 +1731 1442 21010.7077625 +1737 1442 121448.722289 +1738 1442 313.594349566 +1770 1442 -66078.8858582 +1771 1442 87535.7603657 +1777 1442 9613.90403435 +1778 1442 -142217.515301 +1790 1442 -37974.7375495 +1791 1442 142218.073486 +1792 1442 41598.2299375 +1443 1443 420717.65207 +1444 1443 7.68080353737e-9 +1445 1443 -1.13621354103e-7 +1450 1443 -2.09547579288e-8 +1451 1443 1.00582838059e-7 +1452 1443 210347.721533 +1481 1443 3.46265733242e-10 +1482 1443 -5.12227416038e-9 +1487 1443 -3.72529029846e-9 +1488 1443 9.31322574615e-10 +1489 1443 53339.4418995 +1490 1443 -5.00287860632e-9 +1491 1443 106684.113949 +1629 1443 139999.531442 +1636 1443 -31977.4238183 +1637 1443 -140000.091685 +1638 1443 -24849.7149447 +1648 1443 -87818.5227136 +1649 1443 -49696.352024 +1719 1443 27562.5230014 +1720 1443 -539000.359971 +1721 1443 -101285.585621 +1730 1443 -36436.27862 +1731 1443 538998.204438 +1737 1443 -313.594349575 +1738 1443 -202559.655462 +1770 1443 87385.2564527 +1771 1443 -51365.1227754 +1777 1443 -8754.17097664 +1778 1443 129499.57066 +1790 1443 50352.4315243 +1791 1443 -129500.088886 +1792 1443 -25683.9173526 +1444 1444 230235191.138 +1445 1444 10784498.1441 +1446 1444 -4.76837158203e-7 +1447 1444 59051.0097188 +1448 1444 4026.20520853 +1449 1444 -6376919.61485 +1450 1444 -17015.877281 +1451 1444 332755.420319 +1452 1444 -7.36601650715e-9 +1481 1444 -15126092.7201 +1482 1444 1406754.744 +1483 1444 -2.68220901489e-7 +1484 1444 14187.4275877 +1485 1444 967.314150686 +1486 1444 -44176247.5055 +1487 1444 -42202.037151 +1488 1444 75735.0331888 +1489 1444 2.51829624176e-10 +1490 1444 -39575.946925 +1491 1444 2.5812536478e-9 +1629 1444 -1958749.00549 +1630 1444 -51131286.8839 +1631 1444 1168263.7766 +1632 1444 79655.1449482 +1633 1444 -758.751125708 +1636 1444 8723.85543789 +1637 1444 23727.8855766 +1638 1444 9464.00616503 +1648 1444 -27548604.1098 +1649 1444 9463.96859533 +1719 1444 -4411.52454712 +1720 1444 86269.9553451 +1721 1444 36436.4243024 +1730 1444 -47320071.2354 +1731 1444 -3169406.41779 +1732 1444 -.360276773572 +1733 1444 -3000633.36767 +1734 1444 -12.902176835 +1737 1444 -1420.32384474 +1738 1444 36436.27862 +1770 1444 -10260.4297325 +1771 1444 8754.17067509 +1777 1444 -25714587.3844 +1778 1444 -1834151.64705 +1779 1444 51131291.8077 +1780 1444 1277946.22204 +1781 1444 745.848948873 +1790 1444 -10941.268891 +1791 1444 19635.0166176 +1792 1444 8754.20597824 +1445 1445 72840059.0061 +1446 1445 -5.96046447754e-8 +1447 1445 -866081.475876 +1448 1445 -59051.0097188 +1449 1445 93540702.7948 +1450 1445 251714.160962 +1451 1445 -4922417.46035 +1452 1445 1.0896474123e-7 +1481 1445 1406754.744 +1482 1445 -35653212.3926 +1483 1445 -1.67638063431e-8 +1484 1445 -208084.520848 +1485 1445 -14187.4275877 +1486 1445 647925301.345 +1487 1445 624290.490399 +1488 1445 -1120340.72765 +1489 1445 -3.72529029846e-9 +1490 1445 585443.001849 +1491 1445 -3.81842255592e-8 +1629 1445 1039340.97362 +1630 1445 -3486258.96796 +1631 1445 -17134364.0465 +1632 1445 -1168263.7766 +1633 1445 11128.2385613 +1636 1445 -129051.115945 +1637 1445 -351004.224506 +1638 1445 -140000.091199 +1648 1445 -2099969.63517 +1649 1445 -139999.535434 +1719 1445 65259.2388627 +1720 1445 -1276182.77138 +1721 1445 -539000.359503 +1730 1445 -3169406.41779 +1731 1445 -1040603.31037 +1732 1445 5.28405665327 +1733 1445 44009320.6803 +1734 1445 189.002382517 +1737 1445 21010.7077625 +1738 1445 -538998.204438 +1770 1445 151781.504918 +1771 1445 -129499.5662 +1777 1445 -1834151.64705 +1778 1445 1064026.69524 +1779 1445 3486186.75252 +1780 1445 -18743413.8881 +1781 1445 -10939.2361788 +1790 1445 161853.090103 +1791 1445 -290458.825704 +1792 1445 -129500.088435 +1446 1446 15325489281.6 +1447 1446 746666.957293 +1448 1446 -10952584.596 +1481 1446 2.08616256714e-7 +1482 1446 1.210719347e-8 +1483 1446 3588389758.58 +1484 1446 5172348.25889 +1485 1446 -75861927.9261 +1629 1446 -3486258.96796 +1630 1446 -1930037431.27 +1648 1446 -51131286.8839 +1730 1446 .360276684165 +1731 1446 -5.28405665886 +1732 1446 -7259780501.08 +1777 1446 51131291.8077 +1778 1446 3486186.75252 +1779 1446 -1789780859.35 +1447 1447 2020222941.76 +1448 1447 -109002125.891 +1449 1447 -9.31322574615e-9 +1481 1447 14187.4275877 +1482 1447 -208084.520848 +1483 1447 -5172348.25889 +1484 1447 -796907230.063 +1485 1447 -118422840.339 +1486 1447 4.07453626394e-9 +1629 1447 17134364.0465 +1631 1447 -369628277.313 +1632 1447 -25202180.0179 +1633 1447 266308.785854 +1648 1447 -1168263.7766 +1730 1447 3000633.36767 +1731 1447 -44009320.6803 +1733 1447 886144933.046 +1734 1447 -.00187643477693 +1777 1447 -1277946.22204 +1778 1447 18743413.8881 +1780 1447 -402675057.292 +1781 1447 -266308.811499 +1448 1448 3611490384.11 +1449 1448 -4.65661287308e-10 +1481 1448 967.314150686 +1482 1448 -14187.4275877 +1483 1448 75861927.9261 +1484 1448 -118422840.339 +1485 1448 931905674.793 +1486 1448 2.83762346953e-10 +1629 1448 1168263.7766 +1631 1448 -25202180.0179 +1632 1448 -1718347.63907 +1633 1448 18157.5987915 +1648 1448 -79655.1449482 +1730 1448 204588.493277 +1731 1448 -3000633.36767 +1733 1448 60418927.9149 +1734 1448 .0275211288608 +1777 1448 -87131.7549821 +1778 1448 1277946.22204 +1780 1448 -27454820.7306 +1781 1448 -18157.2226694 +1449 1449 30909716586.1 +1481 1449 44176247.5055 +1482 1449 -647925301.345 +1484 1449 9.31322574615e-10 +1485 1449 5.82076609135e-11 +1486 1449 8028296568.6 +1629 1449 -11128.2385613 +1631 1449 266308.785854 +1632 1449 18157.5987915 +1633 1449 -185526.410692 +1648 1449 758.751125708 +1730 1449 -12.902176835 +1731 1449 189.002382516 +1733 1449 .00187643861864 +1734 1449 -1025428.62976 +1777 1449 -745.848948873 +1778 1449 10939.2361788 +1780 1449 -266308.811499 +1781 1449 -169270.034539 +1450 1450 948526.438487 +1451 1450 -335619.37565 +1452 1450 -9.77888703346e-9 +1453 1450 231398.707567 +1454 1450 83905.1930786 +1455 1450 -1.44354999065e-8 +1467 1450 -147412.206297 +1468 1450 586097.66623 +1469 1450 -1.07102096081e-8 +1481 1450 34456.414012 +1482 1450 -509710.26645 +1487 1450 -507100.747959 +1488 1450 -76387.3888918 +1489 1450 2.32830643654e-8 +1490 1450 -107154.120931 +1491 1450 1.07102096081e-8 +1602 1450 -22521.3371537 +1603 1450 -141017.22457 +1604 1450 -36750.022154 +1629 1450 164949.080275 +1636 1450 -108492.5565 +1637 1450 -23931.8607775 +1638 1450 -156545.649595 +1648 1450 -43382.6735895 +1649 1450 -46295.5786264 +1692 1450 59992.0242284 +1693 1450 21753.2021969 +1694 1450 9187.50153679 +1719 1450 245913.328941 +1720 1450 -87012.4306553 +1721 1450 -.00914756208658 +1730 1450 -4411.52454712 +1731 1450 65259.2388627 +1737 1450 61437.7277033 +1738 1450 -27562.5230014 +1770 1450 -27780.8165553 +1771 1450 37108.0770763 +1777 1450 8933.14437348 +1778 1450 -132147.106117 +1790 1450 -131471.038086 +1791 1450 -19804.1459265 +1792 1450 174920.671033 +1796 1450 -38218.0979461 +1797 1450 151951.2468 +1798 1450 45937.5328783 +1451 1451 9844871.42654 +1452 1451 -2.47731804848e-7 +1453 1451 83905.1930786 +1454 1451 -4922448.64311 +1455 1451 8.94069671631e-8 +1467 1451 586097.66623 +1468 1451 -1120345.28573 +1469 1451 2.32830643654e-9 +1481 1451 75735.0175087 +1482 1451 -1120340.49569 +1487 1451 -76387.3888918 +1488 1451 2240684.96756 +1489 1451 -5.02914190292e-8 +1490 1451 -585445.283958 +1491 1451 3.35276126862e-8 +1602 1451 -141017.22457 +1603 1451 -351005.751905 +1604 1451 -140000.09269 +1629 1451 -351004.284642 +1636 1451 -23931.8607775 +1637 1451 702009.389358 +1638 1451 -.00266295764595 +1648 1451 164949.080275 +1649 1451 140000.095678 +1692 1451 21753.2021969 +1693 1451 -1276190.85634 +1694 1451 -539000.359659 +1719 1451 -87012.4306553 +1720 1451 2552373.13864 +1721 1451 -.00093781016767 +1730 1451 86269.9553451 +1731 1451 -1276182.77138 +1737 1451 -21010.7164824 +1738 1451 539000.359971 +1770 1451 -151782.118669 +1771 1451 129500.084425 +1777 1451 19635.0125523 +1778 1451 -290458.765567 +1790 1451 -19804.1459265 +1791 1451 580918.087506 +1792 1451 .00297556538135 +1796 1451 151951.2468 +1797 1451 -290460.007428 +1798 1451 -129500.0871 +1452 1452 841432.622038 +1453 1452 -1.02445483208e-8 +1454 1452 9.87201929092e-8 +1455 1452 210346.405543 +1467 1452 -6.75208866596e-9 +1468 1452 6.98491930962e-9 +1469 1452 53339.2905467 +1481 1452 -2.54977494478e-9 +1482 1452 3.77185642719e-8 +1487 1452 1.30385160446e-8 +1488 1452 -5.30853867531e-8 +1489 1452 213367.796855 +1490 1452 1.60539522767e-8 +1491 1452 53339.615866 +1602 1452 -36750.0269238 +1603 1452 -140000.092853 +1604 1452 -24849.6313635 +1629 1452 140000.095191 +1636 1452 -156545.65914 +1637 1452 -.00266296975315 +1638 1452 -99392.4843625 +1648 1452 -46295.5833745 +1649 1452 -24849.8051492 +1692 1452 9187.51072696 +1693 1452 -539000.359815 +1694 1452 -101284.93529 +1719 1452 .00914755556732 +1720 1452 .000937725417316 +1721 1452 -405118.036251 +1730 1452 -36436.4243024 +1731 1452 539000.359503 +1737 1452 8873.91051248 +1738 1452 -101285.585621 +1770 1452 45862.2783615 +1771 1452 -25683.8271478 +1777 1452 -8754.20567669 +1778 1452 129500.083975 +1790 1452 174920.662203 +1791 1452 .00297556910664 +1792 1452 -102730.042131 +1796 1452 45937.5284659 +1797 1452 -129500.087251 +1798 1452 -25683.7823697 +1453 1453 937080.9444 +1454 1453 -5.77419996262e-8 +1455 1453 -4.33064997196e-8 +1464 1453 231398.707567 +1465 1453 -83905.1930786 +1466 1453 -9.77888703346e-9 +1467 1453 -509703.800395 +1468 1453 2.421438694e-8 +1469 1453 1.72294676304e-8 +1470 1453 -108751.897769 +1471 1453 547903.090619 +1472 1453 -4.65661287308e-10 +1487 1453 -108751.897769 +1488 1453 -547903.090619 +1489 1453 2.02562659979e-8 +1599 1453 -32543.8238878 +1600 1453 -152982.97165 +1601 1453 -41522.6253393 +1602 1453 -109308.184637 +1603 1453 6.51925802231e-9 +1604 1453 -156545.299685 +1636 1453 -32543.8238878 +1637 1453 152982.97165 +1638 1453 -41522.6253393 +1665 1453 59992.0242284 +1666 1453 -21753.202197 +1667 1453 -9187.51072697 +1692 1453 242945.978627 +1693 1453 -1.58324837685e-8 +1694 1453 -.00917950551957 +1719 1453 59992.0242284 +1720 1453 21753.2021969 +1721 1453 -9187.51072697 +1790 1453 -28195.0549943 +1791 1453 -142048.94942 +1792 1453 41522.6299317 +1796 1453 -132145.903806 +1797 1453 5.58793544769e-9 +1798 1453 174920.321134 +1817 1453 -28195.0549943 +1818 1453 142048.94942 +1819 1453 41522.6299317 +1454 1454 9844902.61002 +1455 1454 -1.51805579662e-7 +1464 1454 -83905.1930786 +1465 1454 -4922448.64311 +1466 1454 4.47034835815e-8 +1467 1454 3.35276126862e-8 +1468 1454 2240689.60259 +1469 1454 -4.37721610069e-8 +1470 1454 547903.090619 +1471 1454 -1120345.20841 +1472 1454 -2.00234353542e-8 +1487 1454 -547903.090619 +1488 1454 -1120345.20841 +1489 1454 4.51691448689e-8 +1599 1454 -152982.97165 +1600 1454 -351005.77195 +1601 1454 -140000.094186 +1602 1454 2.79396772385e-9 +1603 1454 702010.896885 +1604 1454 -3.72529029846e-9 +1636 1454 152982.97165 +1637 1454 -351005.77195 +1638 1454 140000.094186 +1665 1454 -21753.2021969 +1666 1454 -1276190.85634 +1667 1454 -539000.359815 +1692 1454 -1.210719347e-8 +1693 1454 2552381.22325 +1694 1454 -3.16649675369e-8 +1719 1454 21753.2021969 +1720 1454 -1276190.85634 +1721 1454 539000.359815 +1790 1454 -142048.94942 +1791 1454 -290459.987382 +1792 1454 129500.08576 +1796 1454 4.65661287308e-9 +1797 1454 580919.289456 +1798 1454 -1.44354999065e-8 +1817 1454 142048.94942 +1818 1454 -290459.987382 +1819 1454 -129500.08576 +1455 1455 841429.939932 +1464 1455 -1.210719347e-8 +1465 1455 2.70083546639e-8 +1466 1455 210346.405543 +1467 1455 3.58559191227e-8 +1468 1455 -3.95812094212e-8 +1469 1455 213367.365812 +1470 1455 3.49245965481e-9 +1471 1455 -2.56113708019e-8 +1472 1455 53339.348537 +1487 1455 1.90921127796e-8 +1488 1455 5.86733222008e-8 +1489 1455 53339.348537 +1599 1455 -41522.6301091 +1600 1455 -140000.094024 +1601 1455 -24849.6614309 +1602 1455 -156545.30923 +1603 1455 9.31322574615e-10 +1604 1455 -99392.2646769 +1636 1455 -41522.6301091 +1637 1455 140000.094024 +1638 1455 -24849.6614309 +1665 1455 -9187.50153679 +1666 1455 -539000.359659 +1667 1455 -101284.93529 +1692 1455 .00917948270217 +1693 1455 -2.51457095146e-8 +1694 1455 -405116.761581 +1719 1455 -9187.50153679 +1720 1455 539000.359659 +1721 1455 -101284.93529 +1790 1455 41522.6255194 +1791 1455 129500.08561 +1792 1455 -25683.7523007 +1796 1455 174920.312304 +1797 1455 -1.86264514923e-8 +1798 1455 -102729.83871 +1817 1455 41522.6255194 +1818 1455 -129500.08561 +1819 1455 -25683.7523007 +1456 1456 230235191.138 +1457 1456 -10784498.1441 +1458 1456 2.38418579102e-7 +1459 1456 -59051.0097187 +1460 1456 4026.20520853 +1461 1456 6376919.61484 +1462 1456 -5478.40019855 +1463 1456 -4.91067767143e-9 +1464 1456 -17015.877281 +1465 1456 -332755.420319 +1466 1456 3.84040176868e-9 +1470 1456 -42202.037151 +1471 1456 -75735.0331888 +1472 1456 2.32942402363e-9 +1473 1456 -15126092.7201 +1474 1456 -1406754.744 +1475 1456 -2.08616256714e-7 +1476 1456 -14187.4275877 +1477 1456 967.314150686 +1478 1456 44176247.5055 +1479 1456 -39575.946925 +1480 1456 6.2957406044e-10 +1579 1456 -27548604.1098 +1580 1456 9463.96859533 +1581 1456 1958749.00549 +1582 1456 -51131286.8839 +1583 1456 -1168263.7766 +1584 1456 79655.1449482 +1585 1456 758.751125708 +1599 1456 8723.85543789 +1600 1456 -23727.8855766 +1601 1456 9464.00616503 +1658 1456 -1420.32384474 +1659 1456 36436.27862 +1660 1456 -47320071.2354 +1661 1456 3169406.4178 +1662 1456 -.360276475549 +1663 1456 3000633.36767 +1664 1456 12.9021768349 +1665 1456 -4411.52454712 +1666 1456 -86269.9553451 +1667 1456 36436.4243024 +1802 1456 -10260.4297325 +1803 1456 8754.17067509 +1817 1456 -10941.268891 +1818 1456 -19635.0166176 +1819 1456 8754.20597824 +1827 1456 -25714587.3844 +1828 1456 1834151.64705 +1829 1456 51131291.8077 +1830 1456 -1277946.22204 +1831 1456 -745.848948873 +1457 1457 72840059.0061 +1458 1457 1.49011611938e-8 +1459 1457 -866081.475875 +1460 1457 59051.0097187 +1461 1457 93540702.7948 +1462 1457 -81041.4230555 +1463 1457 -7.264316082e-8 +1464 1457 -251714.160962 +1465 1457 -4922417.46035 +1466 1457 5.68106770515e-8 +1470 1457 -624290.490399 +1471 1457 -1120340.72765 +1472 1457 3.44589352608e-8 +1473 1457 -1406754.744 +1474 1457 -35653212.3926 +1475 1457 1.210719347e-8 +1476 1457 -208084.520848 +1477 1457 14187.4275877 +1478 1457 647925301.345 +1479 1457 -585443.001849 +1480 1457 9.31322574615e-9 +1579 1457 2099969.63517 +1580 1457 139999.535434 +1581 1457 1039340.97362 +1582 1457 3486258.96796 +1583 1457 -17134364.0465 +1584 1457 1168263.7766 +1585 1457 11128.2385613 +1599 1457 129051.115945 +1600 1457 -351004.224506 +1601 1457 140000.091199 +1658 1457 -21010.7077625 +1659 1457 538998.204438 +1660 1457 3169406.4178 +1661 1457 -1040603.31037 +1662 1457 -5.28405669332 +1663 1457 44009320.6803 +1664 1457 189.002382515 +1665 1457 -65259.2388627 +1666 1457 -1276182.77138 +1667 1457 539000.359503 +1802 1457 -151781.504918 +1803 1457 129499.5662 +1817 1457 -161853.090103 +1818 1457 -290458.825703 +1819 1457 129500.088435 +1827 1457 1834151.64705 +1828 1457 1064026.69524 +1829 1457 -3486186.75252 +1830 1457 -18743413.8881 +1831 1457 -10939.2361788 +1458 1458 15325489281.6 +1459 1458 -746666.957293 +1460 1458 -10952584.596 +1473 1458 2.68220901489e-7 +1474 1458 -1.67638063431e-8 +1475 1458 3588389758.58 +1476 1458 -5172348.2589 +1477 1458 -75861927.9261 +1579 1458 -51131286.8839 +1581 1458 3486258.96796 +1582 1458 -1930037431.27 +1660 1458 .360276684165 +1661 1458 5.28405667935 +1662 1458 -7259780501.08 +1827 1458 51131291.8077 +1828 1458 -3486186.75252 +1829 1458 -1789780859.35 +1459 1459 2020222941.76 +1460 1459 109002125.891 +1473 1459 -14187.4275877 +1474 1459 -208084.520848 +1475 1459 5172348.2589 +1476 1459 -796907230.063 +1477 1459 118422840.339 +1478 1459 -9.31322574615e-10 +1579 1459 1168263.7766 +1581 1459 17134364.0465 +1583 1459 -369628277.314 +1584 1459 25202180.0179 +1585 1459 266308.785854 +1660 1459 -3000633.36767 +1661 1459 -44009320.6803 +1663 1459 886144933.046 +1664 1459 -.0018764405977 +1827 1459 1277946.22204 +1828 1459 18743413.8881 +1830 1459 -402675057.292 +1831 1459 -266308.811499 +1460 1460 3611490384.11 +1461 1460 -1.16415321827e-10 +1473 1460 967.314150687 +1474 1460 14187.4275877 +1475 1460 75861927.9261 +1476 1460 118422840.339 +1477 1460 931905674.793 +1478 1460 5.82076609135e-11 +1579 1460 -79655.1449482 +1581 1460 -1168263.7766 +1583 1460 25202180.0179 +1584 1460 -1718347.63907 +1585 1460 -18157.5987915 +1660 1460 204588.493277 +1661 1460 3000633.36767 +1663 1460 -60418927.9149 +1664 1460 -.0275211285698 +1827 1460 -87131.7549822 +1828 1460 -1277946.22204 +1830 1460 27454820.7306 +1831 1460 18157.2226694 +1461 1461 30909716586.1 +1473 1461 -44176247.5055 +1474 1461 -647925301.345 +1476 1461 -4.07453626394e-9 +1477 1461 2.91038304567e-10 +1478 1461 8028296568.6 +1579 1461 -758.751125708 +1581 1461 -11128.2385613 +1583 1461 266308.785854 +1584 1461 -18157.5987915 +1585 1461 -185526.410691 +1660 1461 12.9021768349 +1661 1461 189.002382515 +1663 1461 .00187643722165 +1664 1461 -1025428.62976 +1827 1461 745.848948873 +1828 1461 10939.2361788 +1830 1461 -266308.811499 +1831 1461 -169270.034539 +1462 1462 468446.879051 +1463 1462 -1.55784189701e-8 +1464 1462 236974.991382 +1465 1462 81041.259357 +1466 1462 -1.26879662275e-8 +1470 1462 -146473.53048 +1471 1462 -548555.45721 +1472 1462 1.21060758829e-8 +1473 1462 37082.1976042 +1474 1462 548553.218997 +1479 1462 -254874.784119 +1480 1462 6.82100653648e-9 +1579 1462 -64988.982516 +1580 1462 -78191.4501587 +1581 1462 -152778.390549 +1599 1462 -22038.3338232 +1600 1462 152779.001522 +1601 1462 -41441.4252353 +1658 1462 121448.722289 +1659 1462 313.594349571 +1660 1462 -1420.32384474 +1661 1462 -21010.7077625 +1665 1462 61437.7277033 +1666 1462 21010.7164824 +1667 1462 -8873.91051248 +1802 1462 -66078.8858582 +1803 1462 87535.7603657 +1817 1462 -37974.7375495 +1818 1462 -142218.073486 +1819 1462 41598.2299375 +1827 1462 9613.90403435 +1828 1462 142217.515301 +1463 1463 420717.65207 +1464 1463 -8.61473381519e-9 +1465 1463 6.14672899246e-8 +1466 1463 210347.721533 +1470 1463 1.58324837685e-8 +1471 1463 4.37721610069e-8 +1472 1463 53339.4418995 +1473 1463 -3.08491289616e-9 +1474 1463 -4.56348061562e-8 +1479 1463 1.75204128027e-8 +1480 1463 106684.113949 +1579 1463 -87818.5227136 +1580 1463 -49696.352024 +1581 1463 -139999.531442 +1599 1463 -31977.4238183 +1600 1463 140000.091685 +1601 1463 -24849.7149447 +1658 1463 -313.594349581 +1659 1463 -202559.655462 +1660 1463 -36436.27862 +1661 1463 -538998.204438 +1665 1463 27562.5230014 +1666 1463 539000.359971 +1667 1463 -101285.585621 +1802 1463 87385.2564527 +1803 1463 -51365.1227754 +1817 1463 50352.4315243 +1818 1463 129500.088886 +1819 1463 -25683.9173526 +1827 1463 -8754.17097664 +1828 1463 -129499.57066 +1464 1464 948526.438487 +1465 1464 335619.37565 +1466 1464 -4.42378222942e-8 +1467 1464 -147412.206297 +1468 1464 -586097.66623 +1469 1464 1.2805685401e-8 +1470 1464 -507100.747959 +1471 1464 76387.3888919 +1472 1464 2.70083546639e-8 +1473 1464 34456.414012 +1474 1464 509710.26645 +1479 1464 -107154.120931 +1480 1464 -2.09547579288e-9 +1579 1464 -43382.6735895 +1580 1464 -46295.5786264 +1581 1464 -164949.080275 +1599 1464 -108492.5565 +1600 1464 23931.8607775 +1601 1464 -156545.649595 +1602 1464 -22521.3371537 +1603 1464 141017.22457 +1604 1464 -36750.022154 +1658 1464 61437.7277033 +1659 1464 -27562.5230014 +1660 1464 -4411.52454712 +1661 1464 -65259.2388627 +1665 1464 245913.328941 +1666 1464 87012.4306553 +1667 1464 -.00914757279679 +1692 1464 59992.0242284 +1693 1464 -21753.202197 +1694 1464 9187.50153679 +1796 1464 -38218.0979461 +1797 1464 -151951.2468 +1798 1464 45937.5328783 +1802 1464 -27780.8165553 +1803 1464 37108.0770763 +1817 1464 -131471.038086 +1818 1464 19804.1459265 +1819 1464 174920.671033 +1827 1464 8933.14437348 +1828 1464 132147.106117 +1465 1465 9844871.42654 +1466 1465 -1.19209289551e-7 +1467 1465 -586097.66623 +1468 1465 -1120345.28573 +1469 1465 3.25962901115e-8 +1470 1465 76387.3888919 +1471 1465 2240684.96756 +1472 1465 -2.56113708019e-8 +1473 1465 -75735.0175087 +1474 1465 -1120340.49569 +1479 1465 585445.283958 +1480 1465 -1.35041773319e-8 +1579 1465 -164949.080275 +1580 1465 -140000.095678 +1581 1465 -351004.284642 +1599 1465 23931.8607775 +1600 1465 702009.389358 +1601 1465 .00266295857727 +1602 1465 141017.22457 +1603 1465 -351005.751905 +1604 1465 140000.09269 +1658 1465 21010.7164824 +1659 1465 -539000.359971 +1660 1465 -86269.9553451 +1661 1465 -1276182.77138 +1665 1465 87012.4306553 +1666 1465 2552373.13864 +1667 1465 .000937768258154 +1692 1465 -21753.202197 +1693 1465 -1276190.85634 +1694 1465 539000.359659 +1796 1465 -151951.2468 +1797 1465 -290460.007428 +1798 1465 129500.0871 +1802 1465 151782.118669 +1803 1465 -129500.084425 +1817 1465 19804.1459265 +1818 1465 580918.087506 +1819 1465 -.00297559378669 +1827 1465 -19635.0125523 +1828 1465 -290458.765567 +1466 1466 841432.622038 +1467 1466 1.32713466883e-8 +1468 1466 4.33064997196e-8 +1469 1466 53339.2905467 +1470 1466 2.46800482273e-8 +1471 1466 -2.74740159512e-8 +1472 1466 213367.796855 +1473 1466 -1.32210552692e-9 +1474 1466 -1.95577740669e-8 +1479 1466 2.48625874519e-9 +1480 1466 53339.615866 +1579 1466 -46295.5833745 +1580 1466 -24849.8051491 +1581 1466 -140000.095191 +1599 1466 -156545.65914 +1600 1466 .00266295205802 +1601 1466 -99392.4843625 +1602 1466 -36750.0269238 +1603 1466 140000.092853 +1604 1466 -24849.6313635 +1658 1466 8873.91051247 +1659 1466 -101285.585621 +1660 1466 -36436.4243024 +1661 1466 -539000.359503 +1665 1466 .00914755184203 +1666 1466 -.000937803648412 +1667 1466 -405118.036251 +1692 1466 9187.51072696 +1693 1466 539000.359815 +1694 1466 -101284.93529 +1796 1466 45937.5284659 +1797 1466 129500.087251 +1798 1466 -25683.7823697 +1802 1466 45862.2783615 +1803 1466 -25683.8271478 +1817 1466 174920.662203 +1818 1466 -.00297560216859 +1819 1466 -102730.042131 +1827 1466 -8754.20567669 +1828 1466 -129500.083975 +1467 1467 1076024.95357 +1468 1467 -5.96046447754e-8 +1469 1467 -3.72529029846e-8 +1470 1467 266517.704957 +1471 1467 -72712.8073096 +1472 1467 -1.44354999065e-8 +1487 1467 266517.704957 +1488 1467 72712.8073096 +1489 1467 -1.90921127796e-8 +1500 1467 -121598.482739 +1501 1467 -549656.894305 +1502 1467 1.44354999065e-8 +1518 1467 -561331.150586 +1519 1467 7.45058059692e-9 +1520 1467 1.90921127796e-8 +1540 1467 -121598.482739 +1541 1467 549656.894305 +1542 1467 -5.58793544769e-9 +1665 1467 -38218.0979461 +1666 1467 -151951.2468 +1667 1467 -45937.5284659 +1692 1467 -132145.903806 +1693 1467 1.30385160446e-8 +1694 1467 -174920.312304 +1719 1467 -38218.0979461 +1720 1467 151951.2468 +1721 1467 -45937.5284659 +1790 1467 69096.9336557 +1791 1467 18851.4728056 +1792 1467 -8829.81030934 +1796 1467 278968.436252 +1797 1467 -1.95577740669e-8 +1798 1467 -.00882212165743 +1817 1467 69096.9336557 +1818 1467 -18851.4728056 +1819 1467 -8829.81030933 +1876 1467 -31525.6630649 +1877 1467 -142503.639264 +1878 1467 45937.5328796 +1909 1467 -145530.820236 +1911 1467 192579.932918 +1935 1467 -31525.6630649 +1936 1467 142503.639264 +1937 1467 45937.5328796 +1468 1468 8531407.62998 +1469 1468 -1.5739351511e-7 +1470 1468 -72712.8073096 +1471 1468 -4265700.86122 +1472 1468 2.04890966415e-8 +1487 1468 72712.8073096 +1488 1468 -4265700.86122 +1489 1468 8.75443220138e-8 +1500 1468 -549656.894305 +1501 1468 -1017458.04694 +1502 1468 3.11993062496e-8 +1518 1468 5.58793544769e-9 +1519 1468 2034915.18965 +1520 1468 -3.53902578354e-8 +1540 1468 549656.894305 +1541 1468 -1017458.04694 +1542 1468 -1.39698386192e-9 +1665 1468 -151951.2468 +1666 1468 -290460.007428 +1667 1468 -129500.087251 +1692 1468 8.38190317154e-9 +1693 1468 580919.289456 +1694 1468 3.25962901115e-9 +1719 1468 151951.2468 +1720 1468 -290460.007428 +1721 1468 129500.087251 +1790 1468 18851.4728056 +1791 1468 -1105922.94351 +1792 1468 518000.345796 +1796 1468 -1.76951289177e-8 +1797 1468 2211845.42643 +1798 1468 -1.67638063431e-8 +1817 1468 -18851.4728056 +1818 1468 -1105922.94351 +1819 1468 -518000.345796 +1876 1468 -142503.639264 +1877 1468 -263785.550081 +1878 1468 129500.085685 +1909 1468 9.31322574615e-10 +1910 1468 527570.343643 +1911 1468 -1.07102096081e-8 +1935 1468 142503.639264 +1936 1468 -263785.550081 +1937 1468 -129500.085685 +1469 1469 896555.263649 +1470 1469 -1.210719347e-8 +1471 1469 5.30853867531e-8 +1472 1469 224129.214702 +1487 1469 -5.58793544769e-9 +1488 1469 7.63684511185e-8 +1489 1469 224129.214702 +1500 1469 1.32713466883e-8 +1501 1469 3.77185642719e-8 +1502 1469 58724.7056587 +1518 1469 2.37487256527e-8 +1519 1469 -3.632158041e-8 +1520 1469 234907.86793 +1540 1469 9.31322574615e-10 +1541 1469 -1.02445483208e-8 +1542 1469 58724.7056587 +1665 1469 -45937.5328783 +1666 1469 -129500.0871 +1667 1469 -25683.7823697 +1692 1469 -174920.321134 +1693 1469 -1.39698386192e-9 +1694 1469 -102729.83871 +1719 1469 -45937.5328783 +1720 1469 129500.0871 +1721 1469 -25683.7823697 +1790 1469 -8829.80147696 +1791 1469 518000.345646 +1792 1469 -107920.064881 +1796 1469 .00882210349664 +1797 1469 -4.56348061562e-8 +1798 1469 -431660.345903 +1817 1469 -8829.80147696 +1818 1469 -518000.345646 +1819 1469 -107920.064881 +1876 1469 45937.5284672 +1877 1469 129500.085535 +1878 1469 -28276.5669612 +1909 1469 192579.924088 +1910 1469 -1.02445483208e-8 +1911 1469 -113101.577692 +1935 1469 45937.5284672 +1936 1469 -129500.085535 +1937 1469 -28276.5669612 +1470 1470 1085939.98019 +1471 1470 290845.461129 +1472 1470 -4.98257577419e-8 +1473 1470 -14745.7658517 +1474 1470 -218132.630943 +1479 1470 271348.444966 +1480 1470 -1.1408701539e-8 +1518 1470 -160258.791268 +1519 1470 -584343.862544 +1520 1470 1.02445483208e-8 +1534 1470 34812.0475433 +1535 1470 514971.117504 +1540 1470 -558965.179391 +1541 1470 69372.7330522 +1542 1470 2.00234353542e-8 +1543 1470 -120116.193359 +1544 1470 -2.32830643654e-9 +1658 1470 -37974.7375495 +1659 1470 -50352.4315242 +1660 1470 -10941.268891 +1661 1470 -161853.090103 +1665 1470 -131471.038086 +1666 1470 19804.1459266 +1667 1470 -174920.662203 +1692 1470 -28195.0549943 +1693 1470 142048.94942 +1694 1470 -41522.6255194 +1796 1470 69096.9336557 +1797 1470 -18851.4728056 +1798 1470 8829.80147696 +1802 1470 70349.3480136 +1803 1470 -26488.722105 +1817 1470 281538.998709 +1818 1470 75404.3788111 +1819 1470 -.00879107788205 +1827 1470 -3822.97719056 +1828 1470 -56552.9170202 +1909 1470 -41548.7060167 +1910 1470 -151496.556956 +1911 1470 50352.4358261 +1935 1470 -144917.419993 +1936 1470 17985.5322638 +1937 1470 192579.582806 +1953 1470 9025.34565937 +1954 1470 133511.030464 +1992 1470 -31141.3658178 +1993 1470 41522.6300342 +1471 1471 8531407.12397 +1472 1471 -9.31322574615e-8 +1473 1471 -288361.344065 +1474 1471 -4265700.35599 +1479 1471 70228.7131224 +1480 1471 4.09781932831e-8 +1518 1471 -584343.862544 +1519 1471 -1017458.12427 +1520 1471 2.74740159512e-8 +1534 1471 -68780.4018489 +1535 1471 -1017461.56581 +1540 1471 69372.7330523 +1541 1471 2034918.78625 +1542 1471 -4.93600964546e-8 +1543 1471 583751.519353 +1544 1471 -1.67638063431e-8 +1658 1471 -142218.073486 +1659 1471 -129500.088886 +1660 1471 -19635.0166176 +1661 1471 -290458.825703 +1665 1471 19804.1459265 +1666 1471 580918.087506 +1667 1471 .00297559425235 +1692 1471 142048.94942 +1693 1471 -290459.987382 +1694 1471 129500.08561 +1796 1471 -18851.4728056 +1797 1471 -1105922.94351 +1798 1471 518000.345646 +1802 1471 18207.4650672 +1803 1471 -518000.345946 +1817 1471 75404.3788111 +1818 1471 2211845.29524 +1819 1471 .00090117752552 +1827 1471 -74760.3820874 +1828 1471 -1105922.81194 +1909 1471 -151496.556956 +1910 1471 -263785.570127 +1911 1471 129500.087176 +1935 1471 17985.5322638 +1936 1471 527571.275792 +1937 1471 -.00327598582953 +1953 1471 -17831.9648569 +1954 1471 -263786.46238 +1992 1471 151342.995321 +1993 1471 -129500.0842 +1472 1472 896555.278053 +1473 1472 3.08491289616e-9 +1474 1472 4.56348061562e-8 +1479 1472 -1.51921063662e-8 +1480 1472 224129.200298 +1518 1472 1.23400241137e-8 +1519 1472 2.46800482273e-8 +1520 1472 58724.6476683 +1534 1472 -1.66837126017e-9 +1535 1472 -2.46800482273e-8 +1540 1472 2.09547579288e-8 +1541 1472 -8.38190317154e-9 +1542 1472 234907.444803 +1543 1472 3.06535512209e-9 +1544 1472 58724.5463888 +1658 1472 -41598.2299375 +1659 1472 -25683.9173526 +1660 1472 -8754.20597824 +1661 1472 -129500.088435 +1665 1472 -174920.671033 +1666 1472 .00297559099272 +1667 1472 -102730.042131 +1692 1472 -41522.6299317 +1693 1472 129500.08576 +1694 1472 -25683.7523007 +1796 1472 8829.81030933 +1797 1472 518000.345796 +1798 1472 -107920.064881 +1802 1472 8528.11010263 +1803 1472 -107920.07235 +1817 1472 .00879105180502 +1818 1472 -.000901204533875 +1819 1472 -431660.338434 +1827 1472 -35016.8233555 +1828 1472 -518000.345496 +1909 1472 50352.4314138 +1910 1472 129500.087326 +1911 1472 -28276.5970302 +1935 1472 192579.573976 +1936 1472 -.00327597325668 +1937 1472 -113101.370166 +1953 1472 -8754.20566147 +1954 1472 -129500.08375 +1992 1472 50276.8313041 +1993 1472 -28276.4360834 +1473 1473 231083366.211 +1474 1473 -10380192.0144 +1476 1473 -56749.7103502 +1477 1473 3869.25660271 +1478 1473 -4.05330501962e-6 +1479 1473 -4747.47334235 +1480 1473 -3.1478703022e-9 +1534 1473 -15126562.8523 +1535 1473 -1413709.3627 +1536 1473 -2.08616256714e-7 +1537 1473 -14187.4275877 +1538 1473 967.314150686 +1539 1473 44176247.5055 +1540 1473 -41846.4036197 +1541 1473 -68780.4175291 +1542 1473 2.70716845989e-9 +1543 1473 -39461.4482879 +1544 1473 8.18446278572e-10 +1658 1473 9613.90403435 +1659 1473 8754.17097664 +1660 1473 -25714587.3844 +1661 1473 1834151.64705 +1662 1473 -51131291.8077 +1663 1473 -1277946.22204 +1664 1473 745.848948873 +1665 1473 8933.14437348 +1666 1473 -19635.0125523 +1667 1473 8754.20567669 +1802 1473 -1230.824146 +1803 1473 35016.6833491 +1817 1473 -3822.97719056 +1818 1473 -74760.3820874 +1819 1473 35016.8233555 +1827 1473 -45245152.2173 +1828 1473 3012122.57934 +1829 1473 8.94069671631e-8 +1830 1473 3088709.16904 +1831 1473 6.91215973347e-11 +1935 1473 -10849.0676051 +1936 1473 -17831.9689221 +1937 1473 8754.20599346 +1953 1473 -25714709.2706 +1954 1473 1832348.59694 +1955 1473 51131291.8077 +1956 1473 -1277946.22204 +1957 1473 -745.848948873 +1992 1473 -10230.7448046 +1993 1473 8754.17065987 +1474 1474 79583159.3339 +1475 1474 -1.49011611938e-8 +1476 1474 -832338.083386 +1477 1474 56749.7103502 +1479 1474 -70228.895597 +1480 1474 -4.65661287308e-8 +1534 1474 -1413709.3627 +1535 1474 -35756091.3674 +1536 1474 1.210719347e-8 +1537 1474 -208084.520848 +1538 1474 14187.4275877 +1539 1474 647925301.345 +1540 1474 -619029.639345 +1541 1474 -1017461.79777 +1542 1474 4.00468707085e-8 +1543 1474 -583749.235029 +1544 1474 1.210719347e-8 +1658 1474 142217.515301 +1659 1474 129499.57066 +1660 1474 1834151.64705 +1661 1474 1064026.69524 +1662 1474 3486186.75252 +1663 1474 -18743413.8881 +1664 1474 10939.2361788 +1665 1474 132147.106117 +1666 1474 -290458.765567 +1667 1474 129500.083975 +1802 1474 -18207.457781 +1803 1474 517998.274395 +1817 1474 -56552.9170202 +1818 1474 -1105922.81194 +1819 1474 518000.345496 +1827 1474 3012122.57934 +1828 1474 -1262777.76403 +1829 1474 -2.98023223877e-8 +1830 1474 45301557.5591 +1935 1474 -160489.165756 +1936 1474 -263786.522516 +1937 1474 129500.088661 +1953 1474 1832348.59694 +1954 1474 1037354.35644 +1955 1474 -3486186.75252 +1956 1474 -18743413.8881 +1957 1474 -10939.2361788 +1992 1474 -151342.378766 +1993 1474 129499.565974 +1475 1475 14738542449.3 +1476 1475 4.76837158203e-7 +1534 1475 2.68220901489e-7 +1535 1475 -1.67638063431e-8 +1536 1475 3588389758.58 +1537 1475 -5172348.25889 +1538 1475 -75861927.9261 +1660 1475 -51131291.8077 +1661 1475 3486186.75252 +1662 1475 -1789780859.35 +1827 1475 2.98023223877e-8 +1828 1475 2.14204192162e-8 +1829 1475 -6972259968.86 +1953 1475 51131291.8077 +1954 1475 -3486186.75252 +1955 1475 -1789780859.35 +1476 1476 2074367619.56 +1477 1476 114922748.628 +1478 1476 3.72529029846e-9 +1534 1476 -14187.4275877 +1535 1476 -208084.520848 +1536 1476 5172348.25889 +1537 1476 -796907230.063 +1538 1476 118422840.339 +1539 1476 -9.31322574615e-10 +1660 1476 1277946.22204 +1661 1476 18743413.8881 +1663 1476 -402675057.292 +1664 1476 266308.811499 +1827 1476 -3088709.16904 +1828 1476 -45301557.5591 +1830 1476 914756331.546 +1831 1476 -2.91038304567e-9 +1953 1476 1277946.22204 +1954 1476 18743413.8881 +1956 1476 -402675057.292 +1957 1476 -266308.811499 +1477 1477 3752083931.05 +1478 1477 -2.32830643654e-10 +1534 1477 967.314150686 +1535 1477 14187.4275877 +1536 1477 75861927.9261 +1537 1477 118422840.339 +1538 1477 931905674.793 +1539 1477 5.82076609135e-11 +1660 1477 -87131.7549822 +1661 1477 -1277946.22204 +1663 1477 27454820.7306 +1664 1477 -18157.2226694 +1827 1477 210591.53029 +1828 1477 3088709.16904 +1830 1477 -62369075.6105 +1831 1477 8.0035533756e-11 +1953 1477 -87131.7549821 +1954 1477 -1277946.22204 +1956 1477 27454820.7306 +1957 1477 18157.2226694 +1478 1478 32113816683.8 +1534 1478 -44176247.5055 +1535 1478 -647925301.345 +1537 1478 -4.07453626394e-9 +1538 1478 2.83762346953e-10 +1539 1478 8028296568.6 +1660 1478 -745.848948873 +1661 1478 -10939.2361788 +1663 1478 266308.811499 +1664 1478 -169270.034539 +1827 1478 6.91215973347e-11 +1830 1478 -1.62981450558e-9 +1831 1478 -980610.573729 +1953 1478 745.848948873 +1954 1478 10939.2361788 +1956 1478 -266308.811499 +1957 1478 -169270.034539 +1479 1479 537929.209736 +1480 1479 -2.24635004997e-8 +1534 1479 37196.6962413 +1535 1479 550246.985818 +1540 1479 -159435.602908 +1541 1479 -550249.221816 +1542 1479 1.05641782284e-8 +1543 1479 -280684.405506 +1544 1479 6.16647303104e-9 +1658 1479 -66078.8858582 +1659 1479 -87385.2564527 +1660 1479 -10260.4297325 +1661 1479 -151781.504918 +1665 1479 -27780.8165553 +1666 1479 151782.118669 +1667 1479 -45862.2783615 +1802 1479 139462.628097 +1803 1479 300.994571214 +1817 1479 70349.3480136 +1818 1479 18207.4650672 +1819 1479 -8528.11010263 +1827 1479 -1230.824146 +1828 1479 -18207.457781 +1935 1479 -41335.286812 +1936 1479 -142657.196834 +1937 1479 46012.7828802 +1953 1479 9643.58896227 +1954 1479 142656.641454 +1992 1479 -72770.2932193 +1993 1479 96364.8662621 +1480 1480 448277.646229 +1534 1480 -2.51829624176e-9 +1535 1480 -3.72529029846e-8 +1540 1480 1.55996531248e-8 +1541 1480 3.44589352608e-8 +1542 1480 58724.3724224 +1543 1480 1.74194574356e-8 +1544 1480 117453.510839 +1658 1480 -87535.7603657 +1659 1480 -51365.1227754 +1660 1480 -8754.17067509 +1661 1480 -129499.5662 +1665 1480 -37108.0770763 +1666 1480 129500.084425 +1667 1480 -25683.8271477 +1802 1480 -300.994571225 +1803 1480 -215830.165482 +1817 1480 26488.722105 +1818 1480 518000.345946 +1819 1480 -107920.07235 +1827 1480 -35016.6833491 +1828 1480 -517998.274395 +1935 1480 54766.9844821 +1936 1480 129500.089111 +1937 1480 -28276.5262882 +1953 1480 -8754.17099186 +1954 1480 -129499.570885 +1992 1480 96214.3623491 +1993 1480 -56550.5813204 +1481 1481 231083271.548 +1482 1481 10380824.697 +1483 1481 -2.38418579102e-7 +1484 1481 56753.0690774 +1485 1481 3869.71569799 +1486 1481 -5180.51191516 +1487 1481 -14746.2967303 +1488 1481 288360.570055 +1489 1481 -5.03659248352e-9 +1490 1481 -4746.89014079 +1491 1481 4.91067767143e-9 +1492 1481 -15126523.0776 +1493 1481 1413885.08186 +1494 1481 -3.27825546265e-7 +1495 1481 14189.1069512 +1496 1481 967.543698322 +1497 1481 -44181428.0174 +1498 1481 -39461.1574646 +1499 1481 2.77012586594e-9 +1500 1481 -41846.6452218 +1501 1481 68779.6894051 +1502 1481 -6.2957406044e-11 +1719 1481 8933.14437348 +1720 1481 19635.0125523 +1721 1481 8754.20567669 +1730 1481 -25714587.3844 +1731 1481 -1834151.64705 +1732 1481 -51131291.8077 +1733 1481 1277946.22204 +1734 1481 -745.848948873 +1737 1481 9613.90403435 +1738 1481 8754.17097664 +1770 1481 -1230.67294558 +1771 1481 35016.6833491 +1777 1481 -45245142.6747 +1778 1481 -3012296.41422 +1779 1481 2.05882233381 +1780 1481 -3088890.46964 +1781 1481 .0883842712356 +1790 1481 -3823.11482578 +1791 1481 74760.1814182 +1792 1481 35016.8233555 +1834 1481 -25714692.4435 +1835 1481 -1832563.00422 +1836 1481 51131263.6705 +1837 1481 1278095.98793 +1838 1481 745.937333144 +1853 1481 -10230.6694059 +1854 1481 8754.17065986 +1876 1481 -10849.1302427 +1877 1481 17831.7801493 +1878 1481 8754.20599347 +1482 1482 79583175.4652 +1483 1482 -2.98023223877e-8 +1484 1482 -832337.854371 +1485 1482 -56753.0690775 +1486 1482 -1069.61935407 +1487 1482 218140.484176 +1488 1482 -4265688.90614 +1489 1482 7.45058059692e-8 +1490 1482 70220.2683549 +1491 1482 -7.264316082e-8 +1492 1482 1413885.08186 +1493 1482 -35756019.1954 +1494 1482 -2.04890966415e-8 +1495 1482 -208084.40634 +1496 1482 -14189.1069512 +1497 1482 647924231.725 +1498 1482 583744.932909 +1499 1482 -4.09781932831e-8 +1500 1482 619033.21334 +1501 1482 -1017451.0267 +1502 1482 9.31322574615e-10 +1719 1482 -132147.106117 +1720 1482 -290458.765567 +1721 1482 -129500.083975 +1730 1482 -1834151.64705 +1731 1482 1064026.69524 +1732 1482 -3486186.75252 +1733 1482 -18743413.8881 +1734 1482 10939.2361788 +1737 1482 -142217.515301 +1738 1482 -129499.57066 +1770 1482 18205.2210885 +1771 1482 -517998.274396 +1777 1482 -3012296.41422 +1778 1482 -1262804.04867 +1779 1482 -30.1945892498 +1780 1482 45301523.0323 +1781 1482 .00457900104811 +1790 1482 56554.953044 +1791 1482 -1105919.84347 +1792 1482 -518000.345496 +1834 1482 -1832563.00422 +1835 1482 1037321.65623 +1836 1482 3486599.41191 +1837 1482 -18743381.5115 +1838 1482 -10939.2315998 +1853 1482 151341.263401 +1854 1482 -129499.565974 +1876 1482 160490.092347 +1877 1482 -263783.73002 +1878 1482 -129500.088661 +1483 1483 14738546429.4 +1484 1483 606.556768 +1485 1483 125.238990307 +1492 1483 2.08616256714e-7 +1493 1483 1.30385160446e-8 +1494 1483 3588391808.38 +1495 1483 5172954.81566 +1496 1483 -75861802.6871 +1730 1483 -51131291.8077 +1731 1483 -3486186.75252 +1732 1483 -1789780859.35 +1777 1483 -2.05882251263 +1778 1483 30.1945892377 +1779 1483 -6972261921.53 +1834 1483 51131263.6705 +1835 1483 3486599.41191 +1836 1483 -1789781809.98 +1484 1484 2074368143.08 +1485 1484 -114929475.705 +1492 1484 14189.1069512 +1493 1484 -208084.40634 +1494 1484 -5172954.81566 +1495 1484 -796904796.573 +1496 1484 -118436721.998 +1497 1484 3.84170562029e-9 +1730 1484 -1277946.22204 +1731 1484 18743413.8881 +1733 1484 -402675057.292 +1734 1484 266308.811499 +1777 1484 3088890.46964 +1778 1484 -45301523.0323 +1780 1484 914755616.606 +1781 1484 .0107230314752 +1834 1484 -1278095.98793 +1835 1484 18743381.5115 +1837 1484 -402674372.455 +1838 1484 -266308.66495 +1485 1485 3752081971.9 +1492 1485 967.543698323 +1493 1485 -14189.1069512 +1494 1485 75861802.6871 +1495 1485 -118436721.998 +1496 1485 931903250.764 +1497 1485 2.76486389339e-10 +1730 1485 -87131.7549821 +1731 1485 1277946.22204 +1733 1485 -27454820.7306 +1734 1485 18157.2226694 +1777 1485 210616.414825 +1778 1485 -3088890.46964 +1780 1485 62372735.331 +1781 1485 -.15726348578 +1834 1485 -87152.329123 +1835 1485 1278095.98793 +1837 1485 -27458038.965 +1838 1485 -18159.371937 +1486 1486 32113807848.9 +1492 1486 44181428.0174 +1493 1486 -647924231.725 +1495 1486 -4.65661287308e-10 +1496 1486 -4.36557456851e-11 +1497 1486 8028292151.1 +1730 1486 745.848948873 +1731 1486 -10939.2361788 +1733 1486 266308.811499 +1734 1486 -169270.034539 +1777 1486 .0883842712356 +1778 1486 .00457900104811 +1780 1486 -.0107230285648 +1781 1486 -980610.879246 +1834 1486 -745.937333144 +1835 1486 10939.2315998 +1837 1486 -266308.66495 +1838 1486 -169270.14554 +1487 1487 1085940.9081 +1488 1487 -290853.314362 +1489 1487 -2.65426933765e-8 +1490 1487 271348.047938 +1491 1487 -1.55996531248e-8 +1492 1487 34811.8059412 +1493 1487 -514967.543509 +1498 1487 -120113.326389 +1499 1487 1.210719347e-8 +1500 1487 -558967.804754 +1501 1487 -69376.307047 +1502 1487 1.8160790205e-8 +1518 1487 -160258.791268 +1519 1487 584343.862544 +1520 1487 -7.45058059692e-9 +1692 1487 -28195.0549943 +1693 1487 -142048.94942 +1694 1487 -41522.6255193 +1719 1487 -131471.038086 +1720 1487 -19804.1459265 +1721 1487 -174920.662203 +1730 1487 -10941.268891 +1731 1487 161853.090103 +1737 1487 -37974.7375495 +1738 1487 -50352.4315243 +1770 1487 70349.2450789 +1771 1487 -26489.7721063 +1777 1487 -3823.11482578 +1778 1487 56554.953044 +1790 1487 281539.239276 +1791 1487 -75406.4148348 +1792 1487 -.00879156822339 +1796 1487 69096.9336557 +1797 1487 18851.4728056 +1798 1487 8829.80147696 +1834 1487 9025.28302179 +1835 1487 -133510.103873 +1853 1487 -31140.6225305 +1854 1487 41522.6300347 +1876 1487 -144918.100646 +1877 1487 -17986.4588557 +1878 1487 192580.632807 +1909 1487 -41548.7060167 +1910 1487 151496.556956 +1911 1487 50352.4358261 +1488 1488 8531395.67412 +1489 1488 -1.86264514923e-7 +1490 1488 -70220.0858794 +1491 1488 6.14672899246e-8 +1492 1488 68779.6737237 +1493 1488 -1017450.79473 +1498 1488 -583747.217232 +1499 1488 3.72529029846e-8 +1500 1488 -69376.307047 +1501 1488 2034908.01517 +1502 1488 -3.632158041e-8 +1518 1488 584343.862544 +1519 1488 -1017458.12427 +1520 1488 -4.65661287308e-10 +1692 1488 -142048.94942 +1693 1488 -290459.987382 +1694 1488 -129500.08561 +1719 1488 -19804.1459265 +1720 1488 580918.087506 +1721 1488 -.00297559052706 +1730 1488 19635.0166176 +1731 1488 -290458.825704 +1737 1488 142218.073486 +1738 1488 129500.088886 +1770 1488 -18205.2283742 +1771 1488 518000.345947 +1777 1488 74760.1814182 +1778 1488 -1105919.84347 +1790 1488 -75406.4148348 +1791 1488 2211842.32676 +1792 1488 -.000901502557099 +1796 1488 18851.4728056 +1797 1488 -1105922.94351 +1798 1488 -518000.345646 +1834 1488 17831.7760838 +1835 1488 -263783.669878 +1853 1488 -151341.879956 +1854 1488 129500.0842 +1876 1488 -17986.4588557 +1877 1488 527568.483289 +1878 1488 .00327618746087 +1909 1488 151496.556956 +1910 1488 -263785.570127 +1911 1488 -129500.087176 +1489 1489 896556.55881 +1490 1489 -9.63173806667e-9 +1491 1489 224129.8407 +1492 1489 -2.42386013269e-9 +1493 1489 3.58559191227e-8 +1498 1489 1.80235132575e-8 +1499 1489 58725.1867951 +1500 1489 1.49011611938e-8 +1501 1489 -4.70317900181e-8 +1502 1489 234908.725556 +1518 1489 -3.25962901115e-9 +1519 1489 -1.86264514923e-9 +1520 1489 58724.6476683 +1692 1489 -41522.6299317 +1693 1489 -129500.08576 +1694 1489 -25683.7523006 +1719 1489 -174920.671033 +1720 1489 -.00297558540478 +1721 1489 -102730.042131 +1730 1489 -8754.20597824 +1731 1489 129500.088435 +1737 1489 -41598.2299375 +1738 1489 -25683.9173526 +1770 1489 8527.06010246 +1771 1489 -107920.380676 +1777 1489 -35016.8233555 +1778 1489 518000.345496 +1790 1489 .00879155099392 +1791 1489 .00090142339468 +1792 1489 -431660.95511 +1796 1489 8829.81030933 +1797 1489 -518000.345796 +1798 1489 -107920.064881 +1834 1489 -8754.20566145 +1835 1489 129500.083749 +1853 1489 50276.8313036 +1854 1489 -28276.7444072 +1876 1489 192580.623976 +1877 1489 .00327618280426 +1878 1489 -113101.986845 +1909 1489 50352.4314138 +1910 1489 -129500.087326 +1911 1489 -28276.5970302 +1490 1490 537938.218188 +1491 1490 -1.70178711414e-8 +1492 1490 37196.9870646 +1493 1490 -550251.287937 +1498 1490 -280687.563294 +1499 1490 2.05129384994e-8 +1500 1490 -159441.930557 +1501 1490 550253.523935 +1502 1490 -5.7578086853e-9 +1719 1490 -27780.8165553 +1720 1490 -151782.118669 +1721 1490 -45862.2783615 +1730 1490 -10260.4297325 +1731 1490 151781.504918 +1737 1490 -66078.8858582 +1738 1490 -87385.2564527 +1770 1490 139464.963618 +1771 1490 303.094563699 +1777 1490 -1230.67294558 +1778 1490 18205.2210885 +1790 1490 70349.2450789 +1791 1490 -18205.2283742 +1792 1490 -8527.06010246 +1834 1490 9643.66436095 +1835 1490 -142657.756819 +1853 1490 -72771.111908 +1854 1490 96366.9662598 +1876 1490 -41336.9273148 +1877 1490 142658.312198 +1878 1490 46013.8328814 +1491 1491 448278.927 +1492 1491 -1.25914812088e-10 +1493 1491 1.86264514923e-9 +1498 1491 1.0572373867e-9 +1499 1491 117454.791591 +1500 1491 -2.32830643654e-10 +1501 1491 -7.45058059692e-9 +1502 1491 58725.0128149 +1719 1491 -37108.0770763 +1720 1491 -129500.084425 +1721 1491 -25683.8271477 +1730 1491 -8754.17067509 +1731 1491 129499.5662 +1737 1491 -87535.7603657 +1738 1491 -51365.1227754 +1770 1491 -303.094563709 +1771 1491 -215830.782152 +1777 1491 -35016.6833491 +1778 1491 517998.274395 +1790 1491 26489.7721063 +1791 1491 -518000.345947 +1792 1491 -107920.380676 +1834 1491 -8754.17099187 +1835 1491 129499.570886 +1853 1491 96214.3623527 +1854 1491 -56551.197999 +1876 1491 54768.0344823 +1877 1491 -129500.089111 +1878 1491 -28276.8346192 +1492 1492 275333356.033 +1493 1492 -4993787.07513 +1494 1492 -2.38418579102e-7 +1495 1492 42179.2926487 +1496 1492 2875.86093118 +1497 1492 -142432344.865 +1498 1492 -3254.45640654 +1499 1492 3.96631658077e-9 +1500 1492 -10108.3737273 +1501 1492 197674.760935 +1502 1492 -3.08491289616e-9 +1503 1492 -110981236.818 +1504 1492 2.04611569643e-9 +1505 1492 13415279.6939 +1506 1492 -7.45058059692e-8 +1507 1492 6900.53937398 +1508 1492 470.386767327 +1509 1492 -186613772.882 +1510 1492 -39929.9334526 +1511 1492 31308.1051363 +1512 1492 6.92531466484e-10 +1770 1492 9643.66436095 +1771 1492 8754.17099187 +1777 1492 -25714692.4435 +1778 1492 -1832563.00422 +1779 1492 -51131263.6705 +1780 1492 1278095.98793 +1781 1492 -745.937333144 +1790 1492 9025.28302179 +1791 1492 17831.7760838 +1792 1492 8754.20566145 +1834 1492 -31203357.204 +1835 1492 -1966532.52438 +1836 1492 -5.71835456789 +1837 1492 -4439763.2253 +1838 1492 -288.066103075 +1853 1492 -843.746139642 +1854 1492 26025.9133 +1866 1492 -14945068.6699 +1867 1492 4258.7856299 +1868 1492 -1158583.77845 +1869 1492 51131341.8213 +1870 1492 2765650.54527 +1871 1492 188525.178836 +1872 1492 457.871230069 +1876 1492 -2620.69018436 +1877 1492 51249.0391801 +1878 1492 26026.0173589 +1897 1492 -10352.2049692 +1898 1492 8116.92073077 +1899 1492 4258.80301227 +1493 1493 348301826.882 +1494 1493 -1.49011611938e-8 +1495 1493 -618629.625584 +1496 1493 -42179.2926487 +1497 1493 2089686128.4 +1498 1493 48142.8462507 +1499 1493 -5.86733222008e-8 +1500 1493 149532.155729 +1501 1493 -2924182.85407 +1502 1493 4.56348061562e-8 +1503 1493 13989906.683 +1504 1493 -3.0267983675e-8 +1505 1493 -306825218.468 +1506 1493 -3.72529029846e-9 +1507 1493 -101230.406464 +1508 1493 -6900.53937398 +1509 1493 2737610360.13 +1510 1493 590679.488944 +1511 1493 -463137.649945 +1512 1493 -1.02445483208e-8 +1770 1493 -142657.756819 +1771 1493 -129499.570886 +1777 1493 -1832563.00422 +1778 1493 1037321.65623 +1779 1493 -3486599.41191 +1780 1493 -18743381.5115 +1781 1493 10939.2315998 +1790 1493 -133510.103873 +1791 1493 -263783.669878 +1792 1493 -129500.083749 +1834 1493 -1966532.52438 +1835 1493 -2489340.27445 +1836 1493 83.8739820197 +1837 1493 65123516.9692 +1838 1493 4222.29423939 +1853 1493 12481.4517698 +1854 1493 -384998.717455 +1866 1493 -1009606.41895 +1867 1493 -62999.7874245 +1868 1493 1983367.2082 +1869 1493 3485453.13416 +1870 1493 -40571890.6397 +1871 1493 -2765650.54527 +1872 1493 -6716.93736042 +1876 1493 38767.6062776 +1877 1493 -758121.881363 +1878 1493 -385000.256788 +1897 1493 153139.126763 +1898 1493 -120072.791875 +1899 1493 -63000.0445602 +1494 1494 11082186873.8 +1495 1494 16677256.7023 +1496 1494 -244679197.577 +1503 1494 -7.45058059692e-8 +1505 1494 -5.58793544769e-9 +1506 1494 1617837108.6 +1507 1494 21850211.518 +1508 1494 -320541000.264 +1777 1494 -51131263.6705 +1778 1494 -3486599.41191 +1779 1494 -1789781809.98 +1834 1494 5.71835459769 +1835 1494 -83.8739820179 +1836 1494 -5133218380.24 +1866 1494 51131341.8213 +1868 1494 3485453.13416 +1869 1494 -919570375.719 +1495 1495 2931479868.96 +1496 1495 -191761202.337 +1497 1495 -3.72529029846e-9 +1503 1495 6900.53937396 +1505 1495 -101230.406464 +1506 1495 -21850211.518 +1507 1495 -1756941722.28 +1508 1495 -251475317.382 +1509 1495 3.37604433298e-9 +1777 1495 -1278095.98793 +1778 1495 18743381.5115 +1780 1495 -402674372.455 +1781 1495 266308.66495 +1834 1495 4439763.2253 +1835 1495 -65123516.9692 +1837 1495 1340324266.37 +1838 1495 -.0297830933705 +1866 1495 -2765650.54527 +1868 1495 40571890.6397 +1870 1495 -856334466.463 +1871 1495 -58373466.1306 +1872 1495 -266309.071986 +1496 1496 5731251169.52 +1497 1496 -2.32830643654e-10 +1503 1496 470.386767326 +1505 1496 -6900.53937396 +1506 1496 320541000.264 +1507 1496 -251475317.382 +1508 1496 1915040503.96 +1509 1496 2.2555468604e-10 +1777 1496 -87152.329123 +1778 1496 1278095.98793 +1780 1496 -27458038.965 +1781 1496 18159.371937 +1834 1496 302678.646702 +1835 1496 -4439763.2253 +1837 1496 91375738.7849 +1838 1496 .436843656578 +1866 1496 -188525.178836 +1868 1496 2765650.54527 +1870 1496 -58373466.1306 +1871 1496 -3979124.6079 +1872 1496 -18153.4017404 +1497 1497 49061095389.8 +1503 1497 186613772.882 +1505 1497 -2737610360.13 +1507 1497 9.31322574615e-10 +1508 1497 6.54836185277e-11 +1509 1497 1.650202127e10 +1777 1497 745.937333144 +1778 1497 -10939.2315998 +1780 1497 266308.66495 +1781 1497 -169270.14554 +1834 1497 -288.066103075 +1835 1497 4222.29423939 +1837 1497 .0297830962809 +1838 1497 -677929.103773 +1866 1497 -457.871230069 +1868 1497 6716.93736042 +1870 1497 -266309.071986 +1871 1497 -18153.4017404 +1872 1497 -56895.9280188 +1498 1498 899248.106027 +1499 1498 -3.93565744162e-8 +1500 1498 451270.85515 +1501 1498 -48142.6052064 +1502 1498 -1.55415385961e-8 +1503 1498 -579134.823936 +1504 1498 3.3344142139e-8 +1505 1498 -559369.231734 +1510 1498 -327866.027312 +1511 1498 559371.383807 +1512 1498 4.4297426939e-9 +1770 1498 -72771.111908 +1771 1498 -96214.3623527 +1777 1498 -10230.6694059 +1778 1498 151341.263401 +1790 1498 -31140.6225305 +1791 1498 -151341.879956 +1792 1498 -50276.8313036 +1834 1498 -843.746139642 +1835 1498 12481.4517698 +1853 1498 233137.999407 +1854 1498 223.995963951 +1866 1498 -150146.201152 +1867 1498 102888.869643 +1868 1498 -145021.660726 +1876 1498 116995.949483 +1877 1498 -12481.4329026 +1878 1498 -6338.50750889 +1897 1498 -85002.3711924 +1898 1498 145022.206032 +1899 1498 50388.8346623 +1499 1499 361092.938366 +1500 1499 -1.8160790205e-8 +1501 1499 5.02914190292e-8 +1502 1499 180539.87343 +1503 1499 1.8160790205e-8 +1504 1499 61033.6420397 +1505 1499 1.39698386192e-8 +1510 1499 3.0267983675e-9 +1511 1499 -1.76951289177e-8 +1512 1499 30515.6882161 +1770 1499 -96366.9662598 +1771 1499 -56551.197999 +1777 1499 -8754.17065986 +1778 1499 129499.565974 +1790 1499 -41522.6300347 +1791 1499 -129500.0842 +1792 1499 -28276.7444072 +1834 1499 -26025.9133 +1835 1499 384998.717455 +1853 1499 -223.995963971 +1854 1499 -173853.818487 +1866 1499 98558.68175 +1867 1499 -29386.7968444 +1868 1499 62999.7926695 +1876 1499 19687.5164295 +1877 1499 -385000.257122 +1878 1499 -86930.3292638 +1897 1499 54647.6355389 +1898 1499 -63000.0447791 +1899 1499 -14693.9858019 +1500 1500 1805445.71392 +1501 1500 -199376.693041 +1502 1500 -5.40167093277e-8 +1503 1500 -251837.851457 +1504 1500 1.67638063431e-8 +1505 1500 -543321.267905 +1510 1500 -1232798.2645 +1511 1500 -31573.0533503 +1512 1500 5.58793544769e-8 +1518 1500 447953.166912 +1519 1500 49844.5182553 +1520 1500 -2.46800482273e-8 +1521 1500 -328067.170232 +1522 1500 574894.327484 +1523 1500 -2.56113708019e-9 +1770 1500 -41336.9273148 +1771 1500 -54768.0344823 +1777 1500 -10849.1302427 +1778 1500 160490.092347 +1790 1500 -144918.100646 +1791 1500 -17986.4588557 +1792 1500 -192580.623976 +1796 1500 -31525.6630649 +1797 1500 -142503.639264 +1798 1500 -45937.5284672 +1834 1500 -2620.69018436 +1835 1500 38767.6062776 +1853 1500 116995.949483 +1854 1500 -19687.5164295 +1866 1500 -65291.3626373 +1867 1500 48205.533375 +1868 1500 -140861.069457 +1876 1500 468077.725136 +1877 1500 -51690.2534404 +1878 1500 -.00653404835612 +1897 1500 -319614.635934 +1898 1500 -8185.61103788 +1899 1500 205705.639289 +1909 1500 116135.80786 +1910 1500 12922.6563383 +1911 1500 6562.50109771 +1920 1500 -85054.5193564 +1921 1500 149046.677496 +1922 1500 52500.0361274 +1501 1501 5848404.01565 +1502 1501 -1.1594966054e-7 +1503 1501 -543321.267905 +1504 1501 3.07336449623e-8 +1505 1501 -463137.41803 +1510 1501 -31573.0533503 +1511 1501 926274.928197 +1512 1501 -2.65426933765e-8 +1518 1501 49844.5182553 +1519 1501 -2924213.60677 +1520 1501 5.72763383389e-8 +1521 1501 574894.327484 +1522 1501 -463140.769102 +1523 1501 -8.38190317154e-9 +1770 1501 142658.312198 +1771 1501 129500.089111 +1777 1501 17831.7801493 +1778 1501 -263783.73002 +1790 1501 -17986.4588557 +1791 1501 527568.483289 +1792 1501 -.0032761930488 +1796 1501 -142503.639264 +1797 1501 -263785.550081 +1798 1501 -129500.085535 +1834 1501 51249.0391801 +1835 1501 -758121.881363 +1853 1501 -12481.4329026 +1854 1501 385000.257122 +1866 1501 -140861.069457 +1867 1501 63000.0395342 +1868 1501 -120072.731749 +1876 1501 -51690.2534404 +1877 1501 1516252.09055 +1878 1501 -.00066912220791 +1897 1501 -8185.61103789 +1898 1501 240145.215928 +1899 1501 .00349872559309 +1909 1501 12922.6563383 +1910 1501 -758129.854752 +1911 1501 -385000.256899 +1920 1501 149046.677496 +1921 1501 -120073.600545 +1922 1501 -63000.0428869 +1502 1502 722182.05972 +1503 1502 1.8859282136e-8 +1504 1502 30515.8621529 +1505 1502 2.60770320892e-8 +1510 1502 4.09781932831e-8 +1511 1502 -1.8160790205e-8 +1512 1502 122066.866555 +1518 1502 -1.2805685401e-8 +1519 1502 5.72763383389e-8 +1520 1502 180537.978938 +1521 1502 -1.16415321827e-9 +1522 1502 -1.55996531248e-8 +1523 1502 30515.5406474 +1770 1502 -46013.8328814 +1771 1502 -28276.8346192 +1777 1502 -8754.20599347 +1778 1502 129500.088661 +1790 1502 -192580.632807 +1791 1502 -.00327620282769 +1792 1502 -113101.986845 +1796 1502 -45937.5328796 +1797 1502 -129500.085685 +1798 1502 -28276.5669611 +1834 1502 -26026.0173589 +1835 1502 385000.256788 +1853 1502 6338.50750888 +1854 1502 -86930.3292638 +1866 1502 48205.5312393 +1867 1502 -14693.8956125 +1868 1502 63000.0393152 +1876 1502 .00653402227908 +1877 1502 .000669073779136 +1878 1502 -347705.808464 +1897 1502 205705.634995 +1898 1502 .00349873490632 +1899 1502 -58773.3947974 +1909 1502 6562.50766212 +1910 1502 -385000.257011 +1911 1502 -86929.4077421 +1920 1502 52500.0339811 +1921 1502 -63000.04296 +1922 1502 -14693.8546262 +1503 1503 405175338.769 +1504 1503 -2.98023223877e-8 +1505 1503 -9610884.30184 +1506 1503 7.15255737305e-7 +1507 1503 13801.0787465 +1508 1503 170049.652257 +1509 1503 1985070208.32 +1510 1503 -244349447.804 +1511 1503 -520134.181513 +1512 1503 -4.42378222942e-9 +1516 1503 84554.4394155 +1517 1503 1798456435.44 +1834 1503 -14945068.6699 +1835 1503 -1009606.41895 +1836 1503 -51131341.8213 +1837 1503 2765650.54527 +1838 1503 -457.871230069 +1853 1503 -150146.201152 +1854 1503 -98558.68175 +1866 1503 -10859794.7965 +1867 1503 -96410.6799039 +1868 1503 -311578.141836 +1869 1503 3741317.69424 +1870 1503 -2895227.34017 +1871 1503 -51047520.9789 +1872 1503 -4713.82361102 +1876 1503 -65291.3626373 +1877 1503 -140861.069457 +1878 1503 -48205.5312393 +1888 1503 49262418.5091 +1889 1503 -4255.95238095 +1897 1503 2427419.19752 +1898 1503 -134849.599084 +1899 1503 -46057.721679 +1504 1504 123343.936075 +1505 1504 -3.86498868465e-8 +1510 1504 -1.95577740669e-8 +1511 1504 3.39932739735e-8 +1512 1504 61669.9589789 +1834 1504 -4258.7856299 +1835 1504 62999.7874245 +1853 1504 -102888.869643 +1854 1504 -29386.7968444 +1866 1504 96410.6799039 +1867 1504 -59385.6140011 +1868 1504 125999.577581 +1876 1504 -48205.533375 +1877 1504 -63000.0395342 +1878 1504 -14693.8956125 +1897 1504 58941.9302781 +1898 1504 -126000.081472 +1899 1504 -29693.8487346 +1505 1505 439883843.441 +1506 1505 2.38418579102e-7 +1507 1505 -202460.812906 +1508 1505 -13801.0787465 +1509 1505 -2737610360.13 +1510 1505 613862.039333 +1511 1505 -916605.030075 +1512 1505 -1.210719347e-8 +1513 1505 -90451648.3517 +1514 1505 3.57627868652e-7 +1834 1505 -1158583.77845 +1835 1505 1983367.2082 +1836 1505 -3485453.13416 +1837 1505 -40571890.6397 +1838 1505 6716.93736042 +1853 1505 -145021.660726 +1854 1505 -62999.7926694 +1866 1505 -311578.141836 +1867 1505 -125999.577581 +1868 1505 -7796878.66553 +1869 1505 4005033.15616 +1870 1505 42472772.7165 +1871 1505 2895227.34017 +1872 1505 6716.93736042 +1876 1505 -140861.069457 +1877 1505 -120072.731749 +1878 1505 -63000.0393152 +1886 1505 -13671428.5714 +1887 1505 -5.125e7 +1897 1505 159149.421135 +1898 1505 -237638.477996 +1899 1505 -126000.086717 +1506 1506 6847335332.02 +1507 1506 -256250211.518 +1508 1506 320541000.264 +1513 1506 -1.78813934326e-7 +1514 1506 1297581831.5 +1515 1506 -2.344e8 +1834 1506 -51131341.8213 +1835 1506 -3485453.13416 +1836 1506 -919570375.719 +1866 1506 -3741317.69424 +1868 1506 -4005033.15616 +1869 1506 -2992705490.75 +1886 1506 -5.125e7 +1887 1506 -788309523.81 +1507 1507 4238295535.66 +1508 1507 -134293100.946 +1509 1507 -5.58793544769e-9 +1514 1507 2.344e8 +1515 1507 1.172e9 +1834 1507 -2765650.54527 +1835 1507 40571890.6397 +1837 1507 -856334466.463 +1838 1507 266309.071986 +1866 1507 2895227.34017 +1868 1507 -42472772.7165 +1870 1507 882946815.538 +1871 1507 60187541.2592 +1872 1507 19486.0296575 +1508 1508 5955133982.51 +1509 1508 -7.45058059692e-9 +1510 1508 84554.4394155 +1516 1508 -2007589371.57 +1517 1508 -5.23868948221e-9 +1834 1508 -188525.178836 +1835 1508 2765650.54527 +1837 1508 -58373466.1306 +1838 1508 18153.4017404 +1866 1508 51047520.9789 +1868 1508 -2895227.34017 +1870 1508 60187541.2592 +1871 1508 1064413051.92 +1872 1508 20859.5476883 +1888 1508 -1038081845.24 +1889 1508 266927.083333 +1897 1508 -49262418.5091 +1509 1509 50988944388.9 +1510 1509 -1798456435.44 +1516 1509 2.09547579288e-9 +1517 1509 8992310508.24 +1834 1509 457.871230069 +1835 1509 -6716.93736042 +1837 1509 266309.071986 +1838 1509 -56895.9280188 +1866 1509 -4713.82361102 +1868 1509 6716.93736042 +1870 1509 -19486.0296575 +1871 1509 -20859.5476883 +1872 1509 -318848.709804 +1888 1509 266927.083333 +1889 1509 -34920.6349206 +1897 1509 4255.95238095 +1510 1510 490926847.59 +1511 1510 -62486.9953689 +1512 1510 -5.63450157642e-8 +1516 1510 338217.757445 +1518 1510 -289410.267118 +1519 1510 -559106.429365 +1520 1510 2.93366611004e-8 +1521 1510 -244347318.098 +1522 1510 -551375.050453 +1523 1510 2.32830643654e-9 +1527 1510 84554.4394155 +1528 1510 1798456435.44 +1834 1510 -10352.2049692 +1835 1510 153139.126763 +1853 1510 -85002.3711924 +1854 1510 -54647.6355389 +1866 1510 2427419.19752 +1867 1510 -58941.9302781 +1868 1510 159149.421135 +1871 1510 49262418.5091 +1872 1510 4255.95238095 +1876 1510 -319614.635934 +1877 1510 -8185.61103788 +1878 1510 -205705.634995 +1888 1510 -101700325.964 +1897 1510 -4516603.25806 +1898 1510 -16200.3320364 +1899 1510 -209999.302447 +1909 1510 -75032.3592898 +1910 1510 -144953.518724 +1911 1510 -50352.4325477 +1920 1510 2427971.34365 +1921 1510 -142949.085975 +1922 1510 -50352.2246647 +1925 1510 49262418.5091 +1926 1510 -4255.95238095 +1511 1511 1833217.68284 +1512 1511 -3.81842255592e-8 +1518 1511 -559106.429365 +1519 1511 -463140.691788 +1520 1511 3.23634594679e-8 +1521 1511 582621.170394 +1522 1511 -916608.132991 +1834 1511 8116.92073077 +1835 1511 -120072.791875 +1853 1511 145022.206032 +1854 1511 63000.0447791 +1866 1511 -134849.599084 +1867 1511 126000.081472 +1868 1511 -237638.477996 +1876 1511 -8185.61103788 +1877 1511 240145.215928 +1878 1511 -.00349873839878 +1897 1511 -16200.3320364 +1898 1511 475278.384426 +1899 1511 .00335267791525 +1909 1511 -144953.518724 +1910 1511 -120073.580501 +1911 1511 -63000.0411343 +1920 1511 151049.934245 +1921 1511 -237639.282616 +1922 1511 -126000.084971 +1512 1512 246687.685991 +1518 1512 2.44472175837e-8 +1519 1512 3.53902578354e-8 +1520 1512 30515.5986326 +1521 1512 -2.56113708019e-8 +1522 1512 4.56348061562e-8 +1523 1512 61669.7539619 +1834 1512 -4258.80301227 +1835 1512 63000.0445602 +1853 1512 -50388.8346623 +1854 1512 -14693.9858019 +1866 1512 46057.721679 +1867 1512 -29693.8487346 +1868 1512 126000.086717 +1876 1512 -205705.639289 +1877 1512 -.00349873956293 +1878 1512 -58773.3947974 +1897 1512 209999.302447 +1898 1512 -.00335269188508 +1899 1512 -118770.909143 +1909 1512 -50352.4346941 +1910 1512 -63000.0412075 +1911 1512 -14693.8245598 +1920 1512 54647.4275314 +1921 1512 -126000.083218 +1922 1512 -29693.7473469 +1513 1513 262496703.297 +1514 1513 -2.38418579102e-7 +1524 1513 -90451648.3517 +1525 1513 3.57627868652e-7 +1868 1513 -13671428.5714 +1869 1513 5.125e7 +1886 1513 -11942857.1429 +1887 1513 -5.96046447754e-8 +1923 1513 -13671428.5714 +1924 1513 -5.125e7 +1514 1514 6268847326.01 +1524 1514 -1.78813934326e-7 +1525 1514 1297581831.5 +1526 1514 -2.344e8 +1868 1514 5.125e7 +1869 1514 -788309523.81 +1886 1514 -1.19209289551e-7 +1887 1514 -2691238095.24 +1923 1514 -5.125e7 +1924 1514 -788309523.81 +1515 1515 4.688e9 +1525 1515 2.344e8 +1526 1515 1.172e9 +1516 1516 4199845638.74 +1517 1516 1.86264514923e-9 +1521 1516 84554.4394155 +1527 1516 -2007589371.57 +1528 1516 -5.23868948221e-9 +1866 1516 -49262418.5091 +1871 1516 -1038081845.24 +1872 1516 -266927.083333 +1888 1516 2120620535.71 +1889 1516 -2.32830643654e-10 +1897 1516 101700325.964 +1920 1516 -49262418.5091 +1925 1516 -1038081845.24 +1926 1516 266927.083333 +1517 1517 35969497012.4 +1521 1517 -1798456435.44 +1527 1517 2.09547579288e-9 +1528 1517 8992310508.24 +1866 1517 -4255.95238095 +1871 1517 -266927.083333 +1872 1517 -34920.6349206 +1888 1517 2.32830643654e-10 +1889 1517 -262450.396825 +1920 1517 4255.95238095 +1925 1517 266927.083333 +1926 1517 -34920.6349206 +1518 1518 1798636.29799 +1519 1518 -1.39698386192e-7 +1520 1518 -7.45058059692e-8 +1521 1518 -1233870.15171 +1522 1518 5.21540641785e-8 +1523 1518 5.26197254658e-8 +1529 1518 -289410.267118 +1530 1518 559106.429365 +1531 1518 -1.39698386192e-9 +1540 1518 447953.166913 +1541 1518 -49844.5182553 +1542 1518 -1.76951289177e-8 +1790 1518 -41548.7060167 +1791 1518 151496.556956 +1792 1518 -50352.4314138 +1796 1518 -145530.820236 +1797 1518 7.45058059692e-9 +1798 1518 -192579.924088 +1817 1518 -41548.7060167 +1818 1518 -151496.556956 +1819 1518 -50352.4314138 +1876 1518 116135.80786 +1877 1518 12922.6563383 +1878 1518 -6562.50766212 +1897 1518 -75032.3592898 +1898 1518 -144953.518724 +1899 1518 50352.4346941 +1909 1518 466312.321021 +1910 1518 -3.632158041e-8 +1911 1518 -.00655680987984 +1920 1518 -319892.532774 +1921 1518 1.02445483208e-8 +1922 1518 205704.939408 +1935 1518 116135.80786 +1936 1518 -12922.6563383 +1937 1518 -6562.50766212 +1996 1518 -75032.3592898 +1997 1518 144953.518724 +1998 1518 50352.4346941 +1519 1519 5848434.76895 +1520 1519 -1.04308128357e-7 +1521 1519 5.77419996262e-8 +1522 1519 926278.124454 +1523 1519 -3.28291207552e-8 +1529 1519 559106.429365 +1530 1519 -463140.691788 +1531 1519 -1.44354999065e-8 +1540 1519 -49844.5182553 +1541 1519 -2924213.60677 +1542 1519 4.74974513054e-8 +1790 1519 151496.556956 +1791 1519 -263785.570127 +1792 1519 129500.087326 +1796 1519 1.86264514923e-9 +1797 1519 527570.343643 +1817 1519 -151496.556956 +1818 1519 -263785.570127 +1819 1519 -129500.087326 +1876 1519 12922.6563383 +1877 1519 -758129.854752 +1878 1519 385000.257011 +1897 1519 -144953.518724 +1898 1519 -120073.580501 +1899 1519 63000.0412075 +1909 1519 -3.44589352608e-8 +1910 1519 1516260.06362 +1911 1519 -1.72294676304e-8 +1920 1519 8.38190317154e-9 +1921 1519 240146.044745 +1922 1519 -1.55996531248e-8 +1935 1519 -12922.6563383 +1936 1519 -758129.854752 +1937 1519 -385000.257011 +1996 1519 144953.518724 +1997 1519 -120073.580501 +1998 1519 -63000.0412075 +1520 1520 722178.242631 +1521 1520 5.82076609135e-8 +1522 1520 -2.53785401583e-8 +1523 1520 122066.44903 +1529 1520 3.25962901115e-9 +1530 1520 -1.37370079756e-8 +1531 1520 30515.5986326 +1540 1520 -1.07102096081e-8 +1541 1520 3.21306288242e-8 +1542 1520 180537.978938 +1790 1520 -50352.4358261 +1791 1520 129500.087176 +1792 1520 -28276.5970302 +1796 1520 -192579.932918 +1797 1520 -1.39698386192e-9 +1798 1520 -113101.577692 +1817 1520 -50352.4358261 +1818 1520 -129500.087176 +1819 1520 -28276.5970302 +1876 1520 -6562.50109772 +1877 1520 385000.256899 +1878 1520 -86929.4077421 +1897 1520 50352.4325477 +1898 1520 63000.0411343 +1899 1520 -14693.8245598 +1909 1520 .00655677029863 +1910 1520 -1.95577740669e-8 +1911 1520 -347703.979993 +1920 1520 205704.935113 +1921 1520 -1.62981450558e-8 +1922 1520 -58773.1959059 +1935 1520 -6562.50109771 +1936 1520 -385000.256899 +1937 1520 -86929.4077421 +1996 1520 50352.4325477 +1997 1520 -63000.0411343 +1998 1520 -14693.8245598 +1521 1521 491886786.85 +1522 1521 -1.02445483208e-7 +1523 1521 -5.58793544769e-8 +1527 1521 338217.757445 +1529 1521 -244347318.098 +1530 1521 -582621.170394 +1540 1521 -328067.170232 +1541 1521 -574894.327484 +1542 1521 2.21189111471e-8 +1548 1521 84554.4394155 +1549 1521 1798456435.44 +1876 1521 -85054.5193564 +1877 1521 149046.677496 +1878 1521 -52500.0339811 +1888 1521 49262418.5091 +1889 1521 4255.95238095 +1897 1521 2427971.34365 +1898 1521 151049.934245 +1899 1521 -54647.4275314 +1909 1521 -319892.532774 +1910 1521 1.76951289177e-8 +1911 1521 -205704.935113 +1920 1521 -4517155.40407 +1921 1521 -2.23517417908e-8 +1922 1521 -209999.302333 +1925 1521 -101700325.964 +1935 1521 -85054.5193564 +1936 1521 -149046.677496 +1937 1521 -52500.0339811 +1990 1521 49262418.5091 +1991 1521 -4255.95238095 +1996 1521 2427971.34365 +1997 1521 -151049.934245 +1998 1521 -54647.4275314 +1522 1522 1833220.78598 +1523 1522 -5.21540641785e-8 +1529 1522 551375.050453 +1530 1522 -916608.132991 +1540 1522 -574894.327484 +1541 1522 -463140.769102 +1542 1522 2.65426933765e-8 +1876 1522 149046.677496 +1877 1522 -120073.600545 +1878 1522 63000.04296 +1897 1522 -142949.085975 +1898 1522 -237639.282616 +1899 1522 126000.083218 +1909 1522 1.30385160446e-8 +1910 1522 240146.044745 +1911 1522 1.210719347e-8 +1920 1522 -2.79396772385e-8 +1921 1522 475279.18894 +1922 1522 8.38190317154e-9 +1935 1522 -149046.677496 +1936 1522 -120073.600545 +1937 1522 -63000.04296 +1996 1522 142949.085975 +1997 1522 -237639.282616 +1998 1522 -126000.083218 +1523 1523 246687.26793 +1529 1523 -2.25845724344e-8 +1530 1523 4.19095158577e-8 +1531 1523 61669.7539619 +1540 1523 2.39815562963e-8 +1541 1523 4.14438545704e-8 +1542 1523 30515.5406474 +1876 1523 -52500.0361274 +1877 1523 63000.0428868 +1878 1523 -14693.8546262 +1897 1523 50352.2246647 +1898 1523 126000.084971 +1899 1523 -29693.7473469 +1909 1523 -205704.939408 +1910 1523 1.16415321827e-9 +1911 1523 -58773.1959059 +1920 1523 209999.302333 +1921 1523 -2.09547579288e-8 +1922 1523 -118770.71053 +1935 1523 -52500.0361274 +1936 1523 -63000.0428868 +1937 1523 -14693.8546262 +1996 1523 50352.2246647 +1997 1523 -126000.084971 +1998 1523 -29693.7473469 +1524 1524 262498626.295 +1525 1524 -2.38418579102e-7 +1528 1524 167300.832342 +1545 1524 -90451648.3517 +1546 1524 3.57627868652e-7 +1886 1524 -13671428.5714 +1887 1524 5.125e7 +1923 1524 -11942857.1429 +1924 1524 -5.96046447754e-8 +1988 1524 -13671428.5714 +1989 1524 -5.125e7 +1525 1525 6268849249.01 +1527 1525 -167300.832342 +1545 1525 -1.78813934326e-7 +1546 1525 1297581831.5 +1547 1525 -2.344e8 +1886 1525 5.125e7 +1887 1525 -788309523.81 +1923 1525 -1.19209289551e-7 +1924 1525 -2691238095.24 +1988 1525 -5.125e7 +1989 1525 -788309523.81 +1526 1526 4.688e9 +1546 1526 2.344e8 +1547 1526 1.172e9 +1527 1527 4219252535.29 +1528 1527 1.86264514923e-9 +1529 1527 84554.4394155 +1548 1527 -2007589371.57 +1549 1527 -5.23868948221e-9 +1888 1527 -1038081845.24 +1889 1527 -266927.083333 +1897 1527 -49262418.5091 +1920 1527 101700325.964 +1925 1527 2120620535.71 +1926 1527 -2.32830643654e-10 +1990 1527 -1038081845.24 +1991 1527 266927.083333 +1996 1527 -49262418.5091 +1528 1528 35988903908.9 +1529 1528 -1798456435.44 +1548 1528 2.09547579288e-9 +1549 1528 8992310508.24 +1888 1528 -266927.083333 +1889 1528 -34920.6349206 +1897 1528 -4255.95238095 +1925 1528 2.32830643654e-10 +1926 1528 -262450.396825 +1990 1528 266927.083333 +1991 1528 -34920.6349206 +1996 1528 4255.95238095 +1529 1529 490926848.471 +1530 1529 62494.8722176 +1531 1529 -5.58793544769e-8 +1532 1529 -244349448.685 +1533 1529 -3.25962901115e-9 +1534 1529 -39930.2109287 +1535 1529 -590683.593621 +1540 1529 -1232791.51293 +1541 1529 31577.1580267 +1542 1529 5.49480319023e-8 +1543 1529 -327872.501408 +1544 1529 2.421438694e-8 +1548 1529 338217.757445 +1550 1529 -613869.916181 +1553 1529 84554.4394155 +1554 1529 1798456435.44 +1909 1529 -75032.3592898 +1910 1529 144953.518724 +1911 1529 -50352.4325477 +1920 1529 2427971.34365 +1921 1529 142949.085975 +1922 1529 -50352.2246647 +1925 1529 49262418.5091 +1926 1529 4255.95238095 +1935 1529 -319612.885525 +1936 1529 8186.67521377 +1937 1529 -205704.584994 +1953 1529 -10352.2769074 +1954 1529 -153140.190939 +1974 1529 -159151.463282 +1977 1529 49262418.5091 +1978 1529 -4255.95238095 +1990 1529 -101700325.964 +1992 1529 -85004.0496612 +1993 1529 -54647.6355384 +1994 1529 2427418.96922 +1995 1529 -58942.9802793 +1996 1529 -4516603.02976 +1997 1529 16202.3741823 +1998 1529 -209999.302447 +1530 1530 1833222.34649 +1531 1530 -4.61004674435e-8 +1532 1530 520126.304665 +1533 1530 -2.32830643654e-9 +1534 1530 -31308.4292982 +1535 1530 -463142.445239 +1540 1530 31577.1580267 +1541 1530 926279.723489 +1542 1530 -1.46683305502e-8 +1543 1530 -559375.164322 +1544 1530 2.56113708019e-8 +1550 1530 -916609.693729 +1909 1530 144953.518724 +1910 1530 -120073.580501 +1911 1530 63000.0411343 +1920 1530 -151049.934245 +1921 1530 -237639.282616 +1922 1530 126000.084971 +1935 1530 8186.67521376 +1936 1530 240146.459153 +1937 1530 .0034991549328 +1953 1530 -8117.00477267 +1954 1530 -120074.035099 +1974 1530 -237639.687091 +1992 1530 -145023.186166 +1993 1530 -63000.0447796 +1994 1530 134847.556938 +1995 1530 -126000.081471 +1996 1530 16202.3741823 +1997 1530 475279.593522 +1998 1530 -.0033529996872 +1531 1531 246687.062921 +1532 1531 -1.83936208487e-8 +1533 1531 61669.6474314 +1534 1531 2.5812536478e-9 +1535 1531 3.81842255592e-8 +1540 1531 5.16884028912e-8 +1541 1531 -2.21189111471e-8 +1542 1531 122066.243494 +1543 1531 1.9770488143e-8 +1544 1531 30515.3766592 +1550 1531 3.632158041e-8 +1909 1531 -50352.4346941 +1910 1531 63000.0412075 +1911 1531 -14693.8245598 +1920 1531 54647.4275314 +1921 1531 126000.083218 +1922 1531 -29693.7473469 +1935 1531 -205704.589289 +1936 1531 .0034991458524 +1937 1531 -58773.0947875 +1953 1531 -4258.80301229 +1954 1531 -63000.0445605 +1974 1531 -126000.086717 +1992 1531 -50388.8346629 +1993 1531 -14693.8358106 +1994 1531 46056.6716788 +1995 1531 -29693.6987384 +1996 1531 209999.302447 +1997 1531 .00335298711434 +1998 1531 -118770.609138 +1532 1532 405175528.267 +1533 1532 -1.02445483208e-8 +1534 1532 -110981498.837 +1535 1532 -13993101.6777 +1536 1532 -2.98023223877e-8 +1537 1532 -6902.21874174 +1538 1532 470.616281207 +1539 1532 -186658766.395 +1540 1532 -251825.702979 +1541 1532 543317.163229 +1542 1532 6.98491930962e-9 +1543 1532 -579128.349842 +1544 1532 2.28174030781e-8 +1548 1532 84554.4394155 +1549 1532 -1798456435.44 +1550 1532 9613284.37679 +1551 1532 2.38418579102e-7 +1552 1532 -13804.4374798 +1553 1532 170050.111285 +1554 1532 -1985115201.83 +1935 1532 -65288.2130313 +1936 1532 140860.005281 +1937 1532 -48204.4812381 +1953 1532 -14945040.1276 +1954 1532 1009886.67536 +1955 1532 -51131283.9922 +1956 1532 -2766317.25965 +1957 1532 457.983514158 +1974 1532 311689.624167 +1975 1532 3741313.46284 +1976 1532 2895925.58933 +1977 1532 -51047616.8416 +1978 1532 4713.93589511 +1990 1532 49262418.5091 +1991 1532 4255.95238095 +1992 1532 -150144.522682 +1993 1532 -98556.5817522 +1994 1532 -10859801.5464 +1995 1532 -96408.5799114 +1996 1532 2427418.96922 +1997 1532 134847.556938 +1998 1532 -46056.6716788 +1533 1533 123343.312976 +1534 1533 8.49924981594e-10 +1535 1533 1.25728547573e-8 +1540 1533 1.86264514923e-9 +1541 1533 -1.2805685401e-8 +1542 1533 30515.5506244 +1543 1533 9.39462333918e-9 +1544 1533 61033.0189787 +1550 1533 -9.31322574615e-10 +1935 1533 -48204.4833749 +1936 1533 63000.0395338 +1937 1533 -14693.7456065 +1953 1533 -4258.78562987 +1954 1533 -62999.7874241 +1974 1533 -125999.577581 +1992 1533 -102888.86964 +1993 1533 -29386.4968345 +1994 1533 96408.5799114 +1995 1533 -59385.3140108 +1996 1533 58942.9802793 +1997 1533 126000.081471 +1998 1533 -29693.6987384 +1534 1534 275803320.269 +1535 1534 5803953.85767 +1536 1534 -4.76837158203e-7 +1537 1534 -42179.2926549 +1538 1534 2875.86086352 +1539 1534 142947952.073 +1540 1534 -10108.515626 +1541 1534 -197677.880808 +1542 1534 2.29794532061e-9 +1543 1534 -3254.52541121 +1544 1534 -1.95167958736e-9 +1550 1534 -13418478.4691 +1551 1534 1.19209289551e-7 +1552 1534 -6902.21874174 +1553 1534 470.616281209 +1554 1534 186658766.395 +1802 1534 9643.58896227 +1803 1534 8754.17099186 +1817 1534 9025.34565937 +1818 1534 -17831.9648569 +1819 1534 8754.20566147 +1827 1534 -25714709.2706 +1828 1534 1832348.59694 +1829 1534 -51131291.8077 +1830 1534 -1277946.22204 +1831 1534 745.848948873 +1935 1534 -2620.72697291 +1936 1534 -51249.8480358 +1937 1534 26026.0173588 +1953 1534 -31203368.7837 +1954 1534 1966468.73787 +1955 1534 .571871042252 +1956 1534 4440280.17385 +1957 1534 287.865434715 +1974 1534 1158863.05472 +1975 1534 51131283.9922 +1976 1534 -2766317.25965 +1977 1534 188616.73182 +1978 1534 -457.983514158 +1992 1534 -843.76402976 +1993 1534 26025.9133 +1994 1534 -14945040.1276 +1995 1534 4258.78562987 +1996 1534 -10352.2769074 +1997 1534 -8117.00477267 +1998 1534 4258.80301229 +1535 1535 349775780.499 +1536 1535 1.49011611938e-8 +1537 1535 -618629.625606 +1538 1535 42179.2926549 +1539 1535 2089417359.51 +1540 1535 -149534.254822 +1541 1535 -2924229.00604 +1542 1535 3.39932739735e-8 +1543 1535 -48143.8670298 +1544 1535 -2.88709998131e-8 +1550 1535 -306823734.665 +1551 1535 -8.38190317154e-9 +1552 1535 -101230.291984 +1553 1535 6902.21874177 +1554 1535 2737601071.54 +1802 1535 142656.641454 +1803 1535 129499.570885 +1817 1535 133511.030464 +1818 1535 -263786.46238 +1819 1535 129500.08375 +1827 1535 1832348.59694 +1828 1535 1037354.35644 +1829 1535 3486186.75252 +1830 1535 -18743413.8881 +1831 1535 10939.2361788 +1935 1535 -38768.1504868 +1936 1535 -758133.846683 +1937 1535 385000.256788 +1953 1535 1966468.73787 +1954 1535 -2489317.73503 +1955 1535 8.38739084359 +1956 1535 65123410.2535 +1957 1535 4222.29390322 +1974 1535 1983327.97748 +1975 1535 -3486301.3802 +1976 1535 -40571751.5471 +1977 1535 2766317.25965 +1978 1535 -6716.9422756 +1992 1535 -12481.7164166 +1993 1535 384998.717456 +1994 1535 1009886.67536 +1995 1535 62999.7874241 +1996 1535 -153140.190939 +1997 1535 -120074.035099 +1998 1535 63000.0445605 +1536 1536 11082208186.8 +1537 1536 -17148564.6377 +1538 1536 -244419574.061 +1550 1536 1.86264514923e-9 +1551 1536 1617839378.76 +1552 1536 -21855479.7126 +1553 1536 -320539912.677 +1827 1536 -51131291.8077 +1828 1536 3486186.75252 +1829 1536 -1789780859.35 +1953 1536 -.571871072054 +1954 1536 -8.38739084173 +1955 1536 -5133218435.21 +1974 1536 -3486301.3802 +1975 1536 -919571270.94 +1994 1536 51131283.9922 +1537 1537 2944894772.55 +1538 1537 184339911.686 +1550 1537 -101230.291983 +1551 1537 21855479.7126 +1552 1537 -1756931307.11 +1553 1537 251535943.649 +1554 1537 -2.32830643654e-9 +1827 1537 1277946.22204 +1828 1537 18743413.8881 +1830 1537 -402675057.292 +1831 1537 266308.811499 +1953 1537 -4440280.17385 +1954 1537 -65123410.2535 +1956 1537 1340322025.63 +1957 1537 .00297849357594 +1974 1537 40571751.5471 +1976 1537 -856331540.877 +1977 1537 58387538.8955 +1978 1537 -266308.770792 +1994 1537 2766317.25965 +1538 1538 5735378884 +1539 1538 1.16415321827e-10 +1550 1538 6902.21874172 +1551 1538 320539912.677 +1552 1538 251535943.649 +1553 1538 1915029993.72 +1554 1538 1.60071067512e-10 +1827 1538 -87131.7549821 +1828 1538 -1277946.22204 +1830 1538 27454820.7306 +1831 1538 -18157.2226694 +1953 1538 302749.624911 +1954 1538 4440280.17385 +1956 1538 -91386593.3163 +1957 1538 .0436843274147 +1974 1538 -2766317.25965 +1976 1538 58387538.8955 +1977 1538 -3981057.02702 +1978 1538 18157.8196885 +1994 1538 -188616.73182 +1539 1539 49078614415.9 +1550 1539 -2737601071.54 +1552 1539 1.2805685401e-9 +1553 1539 -8.73114913702e-11 +1554 1539 16502002606.8 +1827 1539 -745.848948873 +1828 1539 -10939.2361788 +1830 1539 266308.811499 +1831 1539 -169270.034539 +1953 1539 287.865434715 +1954 1539 4222.29390322 +1956 1539 -.00297849229537 +1957 1539 -677929.161299 +1974 1539 6716.9422756 +1976 1539 -266308.770792 +1977 1539 18157.8196885 +1978 1539 -56896.0677886 +1994 1539 457.983514158 +1540 1540 1805427.07956 +1541 1540 199378.792134 +1542 1540 -7.72997736931e-8 +1543 1540 451261.53673 +1544 1540 -2.18860805035e-8 +1550 1540 543317.163229 +1796 1540 -31525.6630649 +1797 1540 142503.639264 +1798 1540 -45937.5284672 +1802 1540 -41335.286812 +1803 1540 -54766.9844821 +1817 1540 -144917.419993 +1818 1540 17985.5322638 +1819 1540 -192579.573976 +1827 1540 -10849.0676051 +1828 1540 -160489.165756 +1909 1540 116135.80786 +1910 1540 -12922.6563383 +1911 1540 6562.50109771 +1920 1540 -85054.5193564 +1921 1540 -149046.677496 +1922 1540 52500.0361274 +1935 1540 468072.89401 +1936 1540 51690.7976499 +1937 1540 -.00653399899602 +1953 1540 -2620.72697291 +1954 1540 -38768.1504868 +1974 1540 140860.005281 +1992 1540 116993.533598 +1993 1540 -19687.5164296 +1994 1540 -65288.2130313 +1995 1540 48204.4833749 +1996 1540 -319612.885525 +1997 1540 8186.67521376 +1998 1540 205704.589289 +1541 1541 5848450.16755 +1542 1541 -9.685754776e-8 +1543 1541 48143.6259861 +1544 1541 2.28174030781e-8 +1550 1541 -463142.213285 +1796 1541 142503.639264 +1797 1541 -263785.550081 +1798 1541 129500.085535 +1802 1541 -142657.196834 +1803 1541 -129500.089111 +1817 1541 17985.5322638 +1818 1541 527571.275792 +1819 1541 .00327597465366 +1827 1541 -17831.9689221 +1828 1541 -263786.522516 +1909 1541 -12922.6563383 +1910 1541 -758129.854752 +1911 1541 385000.256899 +1920 1541 -149046.677496 +1921 1541 -120073.600545 +1922 1541 63000.0428868 +1935 1541 51690.7976499 +1936 1541 1516264.05586 +1937 1541 .000669681001455 +1953 1541 -51249.8480358 +1954 1541 -758133.846683 +1974 1541 -120073.974963 +1992 1541 12481.6975489 +1993 1541 -385000.257122 +1994 1541 140860.005281 +1995 1541 -63000.0395339 +1996 1541 8186.67521377 +1997 1541 240146.459153 +1998 1541 -.00349915935658 +1542 1542 722176.348208 +1543 1542 -1.92945823073e-8 +1544 1542 180537.01757 +1550 1542 -1.90921127796e-8 +1796 1542 -45937.5328796 +1797 1542 129500.085685 +1798 1542 -28276.5669612 +1802 1542 -46012.7828802 +1803 1542 -28276.5262882 +1817 1542 -192579.582806 +1818 1542 .0032759681344 +1819 1542 -113101.370166 +1827 1542 -8754.20599346 +1828 1542 -129500.088661 +1909 1542 6562.50766211 +1910 1542 385000.257011 +1911 1542 -86929.4077421 +1920 1542 52500.0339811 +1921 1542 63000.04296 +1922 1542 -14693.8546262 +1935 1542 .00653395662084 +1936 1542 -.000669721979648 +1937 1542 -347703.058435 +1953 1542 -26026.0173588 +1954 1542 -385000.256788 +1974 1542 -63000.0393148 +1992 1542 6338.5075089 +1993 1542 -86928.9543033 +1994 1542 48204.4812381 +1995 1542 -14693.7456065 +1996 1542 205704.584994 +1997 1542 -.00349915586412 +1998 1542 -58773.0947875 +1543 1543 899257.493442 +1544 1543 -2.97132879496e-8 +1550 1543 559373.012248 +1802 1543 -72770.2932193 +1803 1543 -96214.3623491 +1817 1543 -31141.3658178 +1818 1543 151342.995321 +1819 1543 -50276.8313041 +1827 1543 -10230.7448046 +1828 1543 -151342.378766 +1935 1543 116993.533598 +1936 1543 12481.6975489 +1937 1543 -6338.50750891 +1953 1543 -843.76402976 +1954 1543 -12481.7164166 +1974 1543 145022.64086 +1992 1543 233140.433185 +1993 1543 223.995963976 +1994 1543 -150144.522682 +1995 1543 102888.86964 +1996 1543 -85004.0496612 +1997 1543 -145023.186166 +1998 1543 50388.8346629 +1544 1544 361087.226896 +1550 1544 -2.81725078821e-8 +1802 1544 -96364.8662621 +1803 1544 -56550.5813203 +1817 1544 -41522.6300342 +1818 1544 129500.0842 +1819 1544 -28276.4360834 +1827 1544 -8754.17065987 +1828 1544 -129499.565974 +1935 1544 19687.5164295 +1936 1544 385000.257122 +1937 1544 -86928.9543033 +1953 1544 -26025.9133 +1954 1544 -384998.717456 +1974 1544 -62999.7926699 +1992 1544 -223.995963991 +1993 1544 -173851.068437 +1994 1544 98556.5817522 +1995 1544 -29386.4968345 +1996 1544 54647.6355384 +1997 1544 63000.0447796 +1998 1544 -14693.8358107 +1545 1545 262496703.297 +1546 1545 -2.38418579102e-7 +1550 1545 -90451648.3517 +1551 1545 3.57627868652e-7 +1923 1545 -13671428.5714 +1924 1545 5.125e7 +1974 1545 -13671428.5714 +1975 1545 -5.125e7 +1988 1545 -11942857.1429 +1989 1545 -5.96046447754e-8 +1546 1546 6268847326.01 +1550 1546 -1.78813934326e-7 +1551 1546 1297581831.5 +1552 1546 -2.344e8 +1923 1546 5.125e7 +1924 1546 -788309523.81 +1974 1546 -5.125e7 +1975 1546 -788309523.81 +1988 1546 -1.19209289551e-7 +1989 1546 -2691238095.24 +1547 1547 4.688e9 +1551 1547 2.344e8 +1552 1547 1.172e9 +1548 1548 4199845638.74 +1549 1548 1.86264514923e-9 +1553 1548 -2007589371.57 +1554 1548 -5.23868948221e-9 +1920 1548 -49262418.5091 +1925 1548 -1038081845.24 +1926 1548 -266927.083333 +1977 1548 -1038081845.24 +1978 1548 266927.083333 +1990 1548 2120620535.71 +1991 1548 -2.32830643654e-10 +1994 1548 -49262418.5091 +1996 1548 101700325.964 +1549 1549 35969497012.4 +1553 1549 2.09547579288e-9 +1554 1549 8992310508.24 +1920 1549 -4255.95238095 +1925 1549 -266927.083333 +1926 1549 -34920.6349206 +1977 1549 266927.083333 +1978 1549 -34920.6349206 +1990 1549 2.32830643654e-10 +1991 1549 -262450.396825 +1994 1549 4255.95238095 +1550 1550 439882479.605 +1551 1550 -4.76837158203e-7 +1552 1550 -202460.583913 +1553 1550 13804.4374798 +1554 1550 -2737601071.54 +1935 1550 140860.005281 +1936 1550 -120073.974963 +1937 1550 63000.0393147 +1953 1550 1158863.05472 +1954 1550 1983327.97748 +1955 1550 3486301.3802 +1956 1550 -40571751.5471 +1957 1550 6716.9422756 +1974 1550 -7796890.19852 +1975 1550 -4005095.22294 +1976 1550 42472631.474 +1977 1550 -2895925.58933 +1978 1550 6716.9422756 +1988 1550 -13671428.5714 +1989 1550 5.125e7 +1992 1550 145022.64086 +1993 1550 62999.7926699 +1994 1550 311689.624167 +1995 1550 125999.577581 +1996 1550 -159151.463282 +1997 1550 -237639.687091 +1998 1550 126000.086717 +1551 1551 6847339090.91 +1552 1551 256255479.713 +1553 1551 320539912.677 +1953 1551 -51131283.9922 +1954 1551 3486301.3802 +1955 1551 -919571270.94 +1974 1551 4005095.22294 +1975 1551 -2992707498.41 +1988 1551 5.125e7 +1989 1551 -788309523.81 +1994 1551 -3741313.46284 +1552 1552 4238298016.18 +1553 1552 134325468.314 +1554 1552 -1.86264514923e-9 +1953 1552 2766317.25965 +1954 1552 40571751.5471 +1956 1552 -856331540.877 +1957 1552 266308.770792 +1974 1552 -42472631.474 +1976 1552 882943859.854 +1977 1552 -60202055.511 +1978 1552 19486.007619 +1994 1552 -2895925.58933 +1553 1553 5955125166.8 +1554 1553 9.31322574615e-9 +1953 1553 -188616.73182 +1954 1553 -2766317.25965 +1956 1553 58387538.8955 +1957 1553 -18157.8196885 +1974 1553 2895925.58933 +1976 1553 -60202055.511 +1977 1553 1064415044.68 +1978 1553 -20859.8709528 +1990 1553 -1038081845.24 +1991 1553 -266927.083333 +1994 1553 51047616.8416 +1996 1553 -49262418.5091 +1554 1554 50988907062.6 +1953 1554 -457.983514158 +1954 1554 -6716.9422756 +1956 1554 266308.770792 +1957 1554 -56896.0677886 +1974 1554 6716.9422756 +1976 1554 -19486.007619 +1977 1554 20859.8709528 +1978 1554 -318849.072847 +1990 1554 -266927.083333 +1991 1554 -34920.6349206 +1994 1554 4713.93589511 +1996 1554 -4255.95238095 +1555 1555 13291666666.7 +1556 1555 7.62939453125e-6 +1559 1555 1354166666.67 +1560 1555 9.53674316406e-7 +1563 1555 -4020833333.33 +1564 1555 5.72204589844e-6 +1567 1555 -1989583333.33 +1568 1555 1.3875e9 +1618 1555 -1989583333.33 +1622 1555 1354166666.67 +1628 1555 -1.3875e9 +1629 1555 -1989583333.33 +1630 1555 -1.3875e9 +1643 1555 -1989583333.33 +1644 1555 1.3875e9 +1652 1555 -3.81469726563e-6 +1653 1555 -4020833333.33 +1654 1555 -6.67572021484e-6 +1556 1556 15678571428.6 +1559 1556 -3.81469726563e-6 +1560 1556 -4410714285.71 +1563 1556 -1.90734863281e-6 +1564 1556 1348214285.71 +1567 1556 1.3875e9 +1568 1556 -2388392857.14 +1618 1556 -1.3875e9 +1622 1556 9.53674316406e-7 +1628 1556 -2388392857.14 +1629 1556 -1.3875e9 +1630 1556 -2388392857.14 +1643 1556 1.3875e9 +1644 1556 -2388392857.14 +1652 1556 -4410714285.71 +1653 1556 4.76837158203e-6 +1654 1556 1348214285.71 +1557 1557 7.1875e9 +1558 1557 -8.34465026855e-7 +1561 1557 3243303571.43 +1562 1557 3.57627868652e-7 +1565 1557 -2.828125e9 +1566 1557 -1.78813934326e-7 +1569 1557 -1430245535.71 +1570 1557 -2.890625e7 +1602 1557 234049479.167 +1620 1557 -1430245535.71 +1621 1557 2.890625e7 +1624 1557 3243303571.43 +1625 1557 2.23517417908e-7 +1626 1557 -234049479.167 +1632 1557 -1430245535.71 +1633 1557 2.890625e7 +1636 1557 -563802083.333 +1642 1557 -234049479.167 +1646 1557 -1430245535.71 +1647 1557 -2.890625e7 +1648 1557 234049479.167 +1650 1557 563802083.333 +1656 1557 -2.828125e9 +1657 1557 4.61935997009e-7 +1558 1558 4078993055.55 +1561 1558 2.23517417908e-7 +1562 1558 -1372829861.11 +1565 1558 6.10947608948e-7 +1566 1558 1744357638.89 +1569 1558 -2.890625e7 +1570 1558 -705512152.778 +1602 1558 129960317.46 +1608 1558 -355158730.159 +1620 1558 2.890625e7 +1621 1558 -705512152.778 +1624 1558 3.57627868652e-7 +1625 1558 -1372829861.11 +1626 1558 129960317.46 +1632 1558 2.890625e7 +1633 1558 -705512152.778 +1634 1558 355158730.159 +1636 1558 1.52587890625e-5 +1639 1558 -1.23977661133e-5 +1642 1558 -129960317.46 +1646 1558 -2.890625e7 +1647 1558 -705512152.778 +1648 1558 -129960317.46 +1650 1558 1.33514404297e-5 +1656 1558 -5.96046447754e-8 +1657 1558 1744357638.89 +1559 1559 2.56875e10 +1563 1559 -1989583333.33 +1564 1559 -1.3875e9 +1567 1559 -1.115625e10 +1568 1559 1.14440917969e-5 +1629 1559 -1.115625e10 +1630 1559 -1.04904174805e-5 +1653 1559 -1989583333.33 +1654 1559 1.3875e9 +1560 1560 15589285714.3 +1563 1560 -1.3875e9 +1564 1560 -2388392857.14 +1567 1560 -1.14440917969e-5 +1568 1560 -1888392857.14 +1629 1560 7.62939453125e-6 +1630 1560 -1888392857.14 +1653 1560 1.3875e9 +1654 1560 -2388392857.14 +1561 1561 1.453125e10 +1562 1561 -5.96046447754e-7 +1565 1561 -1430245535.71 +1566 1561 2.890625e7 +1569 1561 -6.7734375e9 +1570 1561 -1.19209289551e-7 +1602 1561 -14648437.4999 +1608 1561 -234049479.167 +1632 1561 -6.7734375e9 +1633 1561 4.91738319397e-7 +1634 1561 -234049479.167 +1636 1561 -5.859375e7 +1639 1561 563802083.333 +1648 1561 -14648437.5001 +1656 1561 -1430245535.71 +1657 1561 -2.890625e7 +1562 1562 4.05078125e9 +1565 1562 2.890625e7 +1566 1562 -705512152.778 +1569 1562 6.40749931335e-7 +1570 1562 1478515625 +1602 1562 -330357142.857 +1608 1562 129960317.46 +1632 1562 -1.49011611939e-7 +1633 1562 1478515625 +1634 1562 -129960317.46 +1636 1562 1.52587890625e-5 +1639 1562 1.33514404297e-5 +1648 1562 330357142.857 +1656 1562 -2.890625e7 +1657 1562 -705512152.778 +1563 1563 13291666666.7 +1564 1563 -7.62939453125e-6 +1567 1563 1354166666.67 +1568 1563 -9.53674316406e-7 +1571 1563 -4020833333.33 +1572 1563 9.53674316406e-7 +1575 1563 -1989583333.33 +1576 1563 1.3875e9 +1611 1563 -1989583333.33 +1617 1563 -1.3875e9 +1618 1563 1354166666.67 +1622 1563 -1989583333.33 +1628 1563 3.81469726563e-6 +1652 1563 1.3875e9 +1564 1564 15678571428.6 +1567 1564 3.81469726563e-6 +1568 1564 -4410714285.71 +1571 1564 -5.72204589844e-6 +1572 1564 1348214285.71 +1575 1564 1.3875e9 +1576 1564 -2388392857.14 +1611 1564 -1.3875e9 +1617 1564 -2388392857.14 +1618 1564 -9.53674316406e-7 +1622 1564 1.3875e9 +1628 1564 -4410714285.71 +1652 1564 -2388392857.14 +1565 1565 7.1875e9 +1566 1565 -3.57627868652e-7 +1569 1565 3243303571.43 +1570 1565 -1.49011611939e-7 +1573 1565 -2.828125e9 +1574 1565 -5.96046447754e-8 +1577 1565 -1430245535.71 +1578 1565 -2.890625e7 +1599 1565 234049479.167 +1602 1565 -563802083.333 +1608 1565 1.90734863281e-6 +1613 1565 -1430245535.71 +1614 1565 2.890625e7 +1615 1565 -234049479.167 +1620 1565 3243303571.43 +1621 1565 3.72529029846e-7 +1624 1565 -1430245535.71 +1625 1565 -2.890625e7 +1626 1565 563802083.333 +1636 1565 234049479.167 +1639 1565 1.90734863281e-6 +1650 1565 -234049479.167 +1566 1566 4078993055.55 +1569 1566 3.72529029846e-7 +1570 1566 -1372829861.11 +1573 1566 4.02331352234e-7 +1574 1566 1744357638.89 +1577 1566 -2.890625e7 +1578 1566 -705512152.778 +1599 1566 129960317.46 +1602 1566 -1.90734863281e-5 +1605 1566 -355158730.159 +1608 1566 2.86102294922e-5 +1613 1566 2.890625e7 +1614 1566 -705512152.778 +1615 1566 129960317.46 +1620 1566 -1.49011611939e-7 +1621 1566 -1372829861.11 +1624 1566 -2.890625e7 +1625 1566 -705512152.778 +1626 1566 -1.52587890625e-5 +1636 1566 -129960317.46 +1639 1566 355158730.159 +1650 1566 -129960317.46 +1567 1567 2.56875e10 +1568 1567 7.62939453125e-6 +1571 1567 -1989583333.33 +1572 1567 -1.3875e9 +1575 1567 -1.115625e10 +1576 1567 1.90734863281e-6 +1568 1568 15589285714.3 +1571 1568 -1.3875e9 +1572 1568 -2388392857.14 +1575 1568 -3.81469726563e-6 +1576 1568 -1888392857.14 +1569 1569 1.453125e10 +1570 1569 -3.57627868652e-7 +1573 1569 -1430245535.71 +1574 1569 2.890625e7 +1577 1569 -6.7734375e9 +1599 1569 -14648437.5 +1602 1569 -58593750.0001 +1605 1569 -234049479.167 +1608 1569 563802083.333 +1636 1569 -14648437.4999 +1639 1569 -234049479.167 +1570 1570 4.05078125e9 +1573 1570 2.890625e7 +1574 1570 -705512152.778 +1577 1570 2.53319740295e-7 +1578 1570 1478515625 +1599 1570 -330357142.857 +1602 1570 9.53674316406e-6 +1605 1570 129960317.46 +1608 1570 -1.52587890625e-5 +1636 1570 330357142.857 +1639 1570 -129960317.46 +1571 1571 13291666666.7 +1575 1571 1354166666.67 +1576 1571 -1.04904174805e-5 +1581 1571 -1989583333.33 +1582 1571 1.3875e9 +1588 1571 -4020833333.33 +1589 1571 4.76837158203e-6 +1594 1571 -1989583333.33 +1595 1571 -1.3875e9 +1611 1571 1354166666.67 +1617 1571 5.72204589844e-6 +1618 1571 -1989583333.33 +1628 1571 1.3875e9 +1572 1572 15678571428.6 +1575 1572 5.72204589844e-6 +1576 1572 -4410714285.71 +1581 1572 1.3875e9 +1582 1572 -2388392857.14 +1588 1572 -3.81469726563e-6 +1589 1572 1348214285.71 +1594 1572 -1.3875e9 +1595 1572 -2388392857.14 +1611 1572 -1.04904174805e-5 +1617 1572 -4410714285.71 +1618 1572 1.3875e9 +1628 1572 -2388392857.14 +1573 1573 7.1875e9 +1574 1573 -3.57627868652e-7 +1577 1573 3243303571.43 +1578 1573 3.8743019104e-7 +1579 1573 234049479.167 +1584 1573 -1430245535.71 +1585 1573 -2.890625e7 +1591 1573 -2.828125e9 +1592 1573 -1.19209289551e-7 +1593 1573 -234049479.167 +1597 1573 -1430245535.71 +1598 1573 2.890625e7 +1599 1573 -563802083.333 +1602 1573 234049479.167 +1605 1573 1.90734863281e-6 +1613 1573 3243303571.43 +1614 1573 -1.49011611938e-8 +1615 1573 563802083.333 +1620 1573 -1430245535.71 +1621 1573 -2.890625e7 +1626 1573 -234049479.167 +1574 1574 4078993055.55 +1577 1574 -1.49011611938e-8 +1578 1574 -1372829861.11 +1579 1574 129960317.46 +1584 1574 -2.890625e7 +1585 1574 -705512152.778 +1586 1574 -355158730.159 +1591 1574 4.02331352234e-7 +1592 1574 1744357638.89 +1593 1574 129960317.46 +1597 1574 2.890625e7 +1598 1574 -705512152.778 +1599 1574 2.00271606445e-5 +1602 1574 -129960317.46 +1605 1574 -3.81469726563e-5 +1608 1574 355158730.159 +1613 1574 3.8743019104e-7 +1614 1574 -1372829861.11 +1615 1574 1.81198120117e-5 +1620 1574 -2.890625e7 +1621 1574 -705512152.778 +1626 1574 -129960317.46 +1575 1575 2.56875e10 +1576 1575 7.62939453125e-6 +1581 1575 -1.115625e10 +1582 1575 -3.81469726563e-6 +1588 1575 -1989583333.33 +1589 1575 -1.3875e9 +1576 1576 15589285714.3 +1581 1576 5.72204589844e-6 +1582 1576 -1888392857.14 +1588 1576 -1.3875e9 +1589 1576 -2388392857.14 +1577 1577 1.453125e10 +1578 1577 -7.15255737305e-7 +1579 1577 -14648437.5 +1584 1577 -6.7734375e9 +1585 1577 5.96046447754e-8 +1586 1577 -234049479.167 +1591 1577 -1430245535.71 +1592 1577 2.890625e7 +1599 1577 -5.859375e7 +1602 1577 -14648437.5 +1605 1577 563802083.333 +1608 1577 -234049479.167 +1578 1578 4.05078125e9 +1579 1578 -330357142.857 +1584 1578 2.83122062683e-7 +1585 1578 1478515625 +1586 1578 129960317.46 +1591 1578 2.890625e7 +1592 1578 -705512152.778 +1599 1578 -1.90734863281e-5 +1602 1578 330357142.857 +1605 1578 1.81198120117e-5 +1608 1578 -129960317.46 +1579 1579 243443083.926 +1580 1579 -1.49011611938e-8 +1581 1579 -7123154.35155 +1582 1579 4.76837158203e-7 +1583 1579 2160112.54911 +1584 1579 -29444156.8739 +1585 1579 -330353188.419 +1586 1579 -162802665.198 +1587 1579 92590.7891601 +1588 1579 5657347.90122 +1589 1579 -3741313.67444 +1590 1579 3616391.33226 +1591 1579 -282147616.269 +1592 1579 129957416.35 +1599 1579 -113715071.171 +1600 1579 -473122.322987 +1601 1579 3.95812094212e-9 +1605 1579 63769381.6742 +1606 1579 -52569.1612794 +1607 1579 51068.034595 +1658 1579 -167113.471738 +1659 1579 -9.31322574615e-10 +1660 1579 113921246.599 +1661 1579 -7412184.71489 +1662 1579 1.49011611938e-8 +1663 1579 1080056.27455 +1664 1579 3954.4383947 +1665 1579 -111554.919228 +1666 1579 -424154.77785 +1667 1579 1.09430402517e-8 +1668 1579 -18568.7601425 +1669 1579 87818.5227136 +1670 1579 -91859776.3355 +1671 1579 6325489.22387 +1672 1579 51131286.8839 +1673 1579 -88207.5020468 +1674 1579 -2901.10999862 +1682 1579 -12395.2892082 +1683 1579 -47128.30865 +1684 1579 46295.5833745 +1580 1580 433641.230095 +1581 1580 -5.40167093277e-8 +1586 1580 -92590.7891601 +1587 1580 -337273.438892 +1588 1580 -279999.069115 +1599 1580 -8.03265720606e-9 +1600 1580 4.47034835815e-8 +1601 1580 216816.379936 +1605 1580 -22431.7154827 +1606 1580 280000.188872 +1607 1580 -168637.660582 +1658 1580 1.39459967613e-8 +1659 1580 223638.74294 +1660 1580 -2.77012586594e-9 +1661 1580 -4.09781932831e-8 +1665 1580 1.16415321827e-8 +1666 1580 3.632158041e-8 +1667 1580 111817.276865 +1668 1580 78191.4501587 +1669 1580 -173940.098102 +1670 1580 -9463.96859533 +1671 1580 -139999.535434 +1682 1580 46295.5786264 +1683 1580 140000.095678 +1684 1580 -86970.5145187 +1581 1581 12856033912.6 +1582 1581 -1.52587890625e-5 +1583 1581 31681333.9069 +1584 1581 -2160112.54911 +1585 1581 57997.8498104 +1586 1581 5657347.90122 +1587 1581 279999.069115 +1588 1581 668024671.607 +1589 1581 -112244907.88 +1590 1581 53039875.8077 +1591 1581 -3616391.33226 +1592 1581 -42549.1878212 +1599 1581 282875.157577 +1600 1581 -1860200.96305 +1601 1581 1.30385160446e-8 +1605 1581 31430.5587833 +1606 1581 -206689.573347 +1607 1581 280000.18488 +1658 1581 -392858.781167 +1659 1581 -4.65661287308e-9 +1660 1581 -7775323.41429 +1661 1581 397649.561817 +1663 1581 15840666.9535 +1664 1581 57997.8498104 +1665 1581 -424154.77785 +1666 1581 -902581.919078 +1667 1581 3.35276126862e-8 +1668 1581 -43650.9402673 +1669 1581 139999.531442 +1670 1581 6285140.44407 +1671 1581 -109041.744057 +1672 1581 -3486258.96796 +1673 1581 -1293697.09305 +1674 1581 -42549.1878212 +1682 1581 -47128.30865 +1683 1581 -100287.17808 +1684 1581 140000.095191 +1582 1582 24942745706.3 +1586 1582 3741313.67444 +1588 1582 112244907.88 +1589 1582 -15505731464.6 +1660 1582 7.45058059692e-8 +1661 1582 -5.58793544769e-9 +1662 1582 8518492916.51 +1670 1582 51131286.8839 +1671 1582 -3486258.96796 +1672 1582 -6662533496 +1583 1583 855924413.613 +1584 1583 -58359066.3312 +1585 1583 1.86264514923e-9 +1586 1583 -3616391.33226 +1588 1583 -53039875.8077 +1590 1583 249230126.277 +1591 1583 -16993133.0849 +1592 1583 -19486.008721 +1660 1583 1080056.27455 +1661 1583 15840666.9535 +1663 1583 -323678003.977 +1664 1583 -1.51339918375e-9 +1670 1583 88207.5020468 +1671 1583 1293697.09305 +1673 1583 -42245411.4185 +1674 1583 -266308.785854 +1584 1584 7269604067.04 +1585 1584 1.19209289551e-7 +1586 1584 282147616.269 +1588 1584 3616391.33226 +1590 1584 -16993133.0849 +1591 1584 1622810420.01 +1592 1584 -2342421.39521 +1599 1584 -14648437.5 +1605 1584 -234049479.167 +1660 1584 -73640.9369399 +1661 1584 -1080056.27455 +1663 1584 22069175.5061 +1664 1584 1.01863406599e-10 +1670 1584 -6014.20800831 +1671 1584 -88207.5020468 +1673 1584 2880397.76404 +1674 1584 18157.5987915 +1585 1585 2028010882.68 +1586 1585 129957416.35 +1588 1585 -42549.1878212 +1590 1585 19486.008721 +1591 1585 2342421.39521 +1592 1585 -688384317.999 +1599 1585 330357142.857 +1605 1585 -129960317.46 +1660 1585 -3954.4383947 +1661 1585 -57997.8498104 +1663 1585 -2.09547579288e-9 +1664 1585 940970.165597 +1670 1585 2901.10999862 +1671 1585 42549.1878212 +1673 1585 -266308.785854 +1674 1585 -697570.309005 +1586 1586 346329690.368 +1587 1586 -1.62981450558e-8 +1588 1586 -11166855.1219 +1589 1586 -2.38418579102e-7 +1592 1586 -355152797.015 +1593 1586 -162802665.198 +1594 1586 5657347.90122 +1595 1586 -3648722.88527 +1596 1586 3616391.33226 +1597 1586 -282147616.269 +1598 1586 129957416.35 +1599 1586 63769381.6742 +1600 1586 -52569.1612794 +1601 1586 -51068.034595 +1605 1586 -145638617.567 +1606 1586 -210276.570143 +1607 1586 3.95812094212e-9 +1613 1586 234049479.167 +1614 1586 129960317.46 +1615 1586 63769381.6742 +1616 1586 -52569.1612794 +1617 1586 51068.034595 +1658 1586 -18568.7601425 +1659 1586 -87818.5227136 +1660 1586 -91859776.3355 +1661 1586 6325489.22387 +1662 1586 -51131286.8839 +1663 1586 88207.5020468 +1664 1586 -2901.10999862 +1665 1586 -12395.2892082 +1666 1586 -47128.30865 +1667 1586 -46295.5833745 +1668 1586 -74271.9083355 +1669 1586 -9.31322574615e-10 +1670 1586 181280826.517 +1671 1586 -12200634.3837 +1672 1586 -2.98023223877e-8 +1673 1586 -8.38190317154e-9 +1674 1586 5933.14322851 +1675 1586 -91859776.3355 +1676 1586 6325489.22387 +1677 1586 -88207.5020468 +1678 1586 6014.20800831 +1679 1586 -2901.10999862 +1680 1586 -18568.7601425 +1681 1586 51219105.4067 +1682 1586 -49579.5913729 +1683 1586 -188513.2346 +1684 1586 1.09430402517e-8 +1689 1586 -12395.2892082 +1690 1586 -47128.30865 +1691 1586 46295.5833745 +1587 1587 674549.609698 +1588 1587 -5.40167093277e-8 +1593 1587 -92590.7891601 +1594 1587 -279999.069115 +1595 1587 -337273.438892 +1599 1587 22431.7154827 +1600 1587 -280000.188872 +1601 1587 -168637.660582 +1605 1587 -8.38190317154e-9 +1606 1587 4.65661287308e-8 +1607 1587 337272.922577 +1615 1587 -22431.7154827 +1616 1587 280000.188872 +1617 1587 -168637.660582 +1658 1587 -78191.4501587 +1659 1587 -173940.098102 +1660 1587 9463.96859533 +1661 1587 139999.535434 +1665 1587 -46295.5786264 +1666 1587 -140000.095678 +1667 1587 -86970.5145187 +1668 1587 1.48773193359e-8 +1669 1587 347881.215232 +1670 1587 -2.77012586594e-9 +1671 1587 -4.09781932831e-8 +1675 1587 -9463.96859533 +1676 1587 -139999.535434 +1680 1587 78191.4501587 +1681 1587 -173940.098102 +1682 1587 1.210719347e-8 +1683 1587 3.72529029846e-8 +1684 1587 173939.676681 +1689 1587 46295.5786264 +1690 1587 140000.095678 +1691 1587 -86970.5145187 +1588 1588 6665202313.23 +1592 1588 87018.5638325 +1593 1588 5657347.90122 +1594 1588 668024671.607 +1595 1588 -111964908.811 +1596 1588 53039875.8077 +1597 1588 -3616391.33226 +1598 1588 -42549.1878212 +1599 1588 31430.5587833 +1600 1588 -206689.573347 +1601 1588 -280000.18488 +1605 1588 125722.310107 +1606 1588 -826755.261762 +1607 1588 1.30385160446e-8 +1611 1588 -1989583333.33 +1615 1588 31430.5587833 +1616 1588 -206689.573347 +1617 1588 1387780000.18 +1658 1588 -43650.9402673 +1659 1588 -139999.531442 +1660 1588 6285140.44407 +1661 1588 -109041.744057 +1662 1588 3486258.96796 +1663 1588 1293697.09305 +1664 1588 -42549.1878212 +1665 1588 -47128.30865 +1666 1588 -100287.17808 +1667 1588 -140000.095191 +1668 1588 -174603.947013 +1669 1588 -4.65661287308e-9 +1670 1588 -12362029.3169 +1671 1588 808282.950949 +1672 1588 2.79396772385e-9 +1673 1588 -1.19209289551e-7 +1674 1588 87018.5638325 +1675 1588 6285140.44407 +1676 1588 -109041.744057 +1677 1588 -1293697.09305 +1678 1588 88207.5020468 +1679 1588 -42549.1878212 +1680 1588 -43650.9402673 +1681 1588 -3346259.43652 +1682 1588 -188513.2346 +1683 1588 -401147.146862 +1684 1588 3.35276126862e-8 +1689 1588 -47128.30865 +1690 1588 -100287.17808 +1691 1588 140000.095191 +1589 1589 34472957918.1 +1593 1589 3741313.67444 +1594 1589 112244907.88 +1595 1589 -15505731464.6 +1611 1589 1.3875e9 +1617 1589 -2388392857.14 +1660 1589 -51131286.8839 +1661 1589 3486258.96796 +1662 1589 -6662533496 +1670 1589 1.19209289551e-7 +1671 1589 -8.38190317154e-9 +1672 1589 13292143431.7 +1675 1589 51131286.8839 +1676 1589 -3486258.96796 +1681 1589 -6662533496 +1590 1590 774667450.226 +1591 1590 -52818763.425 +1592 1590 7.45058059692e-9 +1593 1590 -3616391.33226 +1594 1590 -53039875.8077 +1596 1590 249230126.277 +1597 1590 -16993133.0849 +1598 1590 -19486.008721 +1660 1590 -88207.5020468 +1661 1590 -1293697.09305 +1663 1590 -42245411.4185 +1664 1590 266308.785854 +1670 1590 8.38190317154e-9 +1671 1590 1.19209289551e-7 +1673 1590 53271409.2092 +1674 1590 -4.65661287308e-10 +1675 1590 88207.5020468 +1676 1590 1293697.09305 +1677 1590 -42245411.4185 +1678 1590 2880397.76404 +1679 1590 -266308.785854 +1591 1591 3597351315.34 +1592 1591 3.57627868652e-7 +1593 1591 282147616.269 +1594 1591 3616391.33226 +1596 1591 -16993133.0849 +1597 1591 1622810420.01 +1598 1591 -2342421.39521 +1599 1591 234049479.167 +1605 1591 1.90734863281e-6 +1613 1591 -1430245535.71 +1614 1591 -2.890625e7 +1615 1591 -234049479.167 +1660 1591 6014.20800831 +1661 1591 88207.5020468 +1663 1591 2880397.76404 +1664 1591 -18157.5987915 +1670 1591 -5.52972778678e-10 +1671 1591 -8.38190317154e-9 +1673 1591 -3632177.85841 +1674 1591 2.91038304567e-11 +1675 1591 -6014.20800831 +1676 1591 -88207.5020468 +1677 1591 2880397.76404 +1678 1591 -196392.720547 +1679 1591 18157.5987915 +1592 1592 2043486745.73 +1593 1592 129957416.35 +1594 1592 -42549.1878212 +1596 1592 19486.008721 +1597 1592 2342421.39521 +1598 1592 -688384317.999 +1599 1592 -129960317.46 +1605 1592 355158730.159 +1613 1592 -2.890625e7 +1614 1592 -705512152.778 +1615 1592 -129960317.46 +1660 1592 2901.10999862 +1661 1592 42549.1878212 +1663 1592 266308.785854 +1664 1592 -697570.309005 +1670 1592 -5933.14322851 +1671 1592 -87018.5638325 +1673 1592 -5.58793544769e-9 +1674 1592 1420862.14952 +1675 1592 2901.10999862 +1676 1592 42549.1878212 +1677 1592 -266308.785854 +1678 1592 18157.5987915 +1679 1592 -697570.309005 +1593 1593 580330622.965 +1594 1593 -153951792.69 +1595 1593 51223878.048 +1596 1593 -3616391.33226 +1597 1593 282147616.269 +1598 1593 -177576398.508 +1605 1593 63769381.6742 +1606 1593 -52569.1612794 +1607 1593 -51068.034595 +1611 1593 86689396.2256 +1613 1593 -234049479.167 +1614 1593 -177579365.079 +1615 1593 -241664065.211 +1616 1593 -105138.285072 +1617 1593 51068.1292996 +1668 1593 -18568.7601425 +1669 1593 -87818.5227136 +1670 1593 -91859776.3355 +1671 1593 6325489.22387 +1672 1593 -51131286.8839 +1673 1593 88207.5020468 +1674 1593 -2901.10999862 +1675 1593 55627148.6709 +1676 1593 37799665.905 +1677 1593 88207.5020468 +1678 1593 -6014.20800831 +1679 1593 2966.57161426 +1680 1593 -37135.9541678 +1681 1593 -3653495.4312 +1682 1593 -12395.2892082 +1683 1593 -47128.30865 +1684 1593 -46295.5833745 +1685 1593 -67483955.46 +1686 1593 -25636289.8692 +1689 1593 -24789.7956864 +1690 1593 -94256.6173 +1691 1593 46295.3932399 +1594 1594 4275180525.1 +1595 1594 1384293741.22 +1596 1594 -53039875.8077 +1597 1594 3616391.33226 +1598 1594 43509.2819163 +1605 1594 31430.5587833 +1606 1594 -206689.573347 +1607 1594 -280000.18488 +1611 1594 -2604918114.81 +1615 1594 86752257.3806 +1616 1594 -413377.630881 +1617 1594 -112220000.931 +1668 1594 -43650.9402673 +1669 1594 -139999.531442 +1670 1594 6285140.44407 +1671 1594 -109041.744057 +1672 1594 3486258.96796 +1673 1594 1293697.09305 +1674 1594 -42549.1878212 +1675 1594 37718968.4384 +1676 1594 17578908.0716 +1677 1594 1293697.09305 +1678 1594 -88207.5020468 +1679 1594 43509.2819163 +1680 1594 -87301.9735067 +1681 1594 395092.215041 +1682 1594 -47128.30865 +1683 1594 -100287.17808 +1684 1594 -140000.095191 +1685 1594 -25636289.8692 +1686 1594 -99411561.3761 +1689 1594 -94256.6173 +1690 1594 -200573.573431 +1691 1594 139999.531685 +1595 1595 21424459192.8 +1596 1595 14823030161.7 +1597 1595 -2838990165.52 +1605 1595 22431.7154827 +1606 1595 -280000.188872 +1607 1595 -168637.660582 +1611 1595 1.125e8 +1612 1595 22527924856.8 +1613 1595 4764865358.47 +1615 1595 22431.9247325 +1616 1595 -279999.064879 +1617 1595 -3241091841.26 +1668 1595 -78191.4501587 +1669 1595 -173940.098102 +1670 1595 -51121822.9153 +1671 1595 3626258.5034 +1672 1595 -6662533496 +1675 1595 3750777.68062 +1676 1595 -115092.028165 +1677 1595 4571799.6837 +1678 1595 -16054932161.1 +1680 1595 -78191.1414477 +1681 1595 5978431955.33 +1682 1595 -46295.5786264 +1683 1595 -140000.095678 +1684 1595 -86970.5145187 +1687 1595 678313428.472 +1688 1595 11313904071.6 +1689 1595 -46295.397988 +1690 1595 -139999.531198 +1691 1595 476339245.231 +1596 1596 252415439364 +1597 1596 -102120078764 +1598 1596 -266308.785854 +1612 1596 50487060731.9 +1613 1596 99364019966.6 +1617 1596 -15901307688.2 +1670 1596 -88207.5020468 +1671 1596 -1293697.09305 +1673 1596 -42245411.4185 +1674 1596 266308.785854 +1675 1596 88207.5020468 +1676 1596 1293697.09305 +1677 1596 -21716980950.9 +1678 1596 39865399838.7 +1679 1596 -19486.008721 +1681 1596 2099410295.9 +1687 1596 -5577350913.65 +1688 1596 -10589589432.3 +1691 1596 -984199775.225 +1597 1597 722146980936 +1598 1597 -28888092.4012 +1605 1597 234049479.167 +1612 1597 99364019966.6 +1613 1597 -581734540887 +1614 1597 -2.34375e6 +1615 1597 -234049479.167 +1617 1597 2230664438.63 +1670 1597 6014.20800831 +1671 1597 88207.5020468 +1673 1597 2880397.76404 +1674 1597 -18157.5987915 +1675 1597 -6014.20800831 +1676 1597 -88207.5020468 +1677 1597 39865399838.7 +1678 1597 222513583879 +1679 1597 1328.60478962 +1681 1597 10649002626.9 +1687 1597 -10589589432.3 +1688 1597 -217205212241 +1691 1597 -9982808210.14 +1598 1598 1021743372.86 +1605 1598 -129960317.46 +1613 1598 2.34375e6 +1614 1598 872178819.444 +1615 1598 177579365.079 +1670 1598 2901.10999862 +1671 1598 42549.1878212 +1673 1598 266308.785854 +1674 1598 -697570.309005 +1675 1598 -2966.57161426 +1676 1598 -43509.2819163 +1677 1598 19486.008721 +1678 1598 -1328.60478962 +1679 1598 710431.07476 +1599 1599 244145266.21 +1600 1599 126830.760298 +1601 1599 -1.76951289177e-8 +1602 1599 -113710747.324 +1603 1599 -409705.897833 +1604 1599 2.56113708019e-9 +1605 1599 -143445666.058 +1606 1599 14092.3079369 +1607 1599 146999.505464 +1608 1599 63769862.1023 +1609 1599 -45522.8823082 +1610 1599 41522.4783151 +1658 1599 -56669.4741149 +1659 1599 -4.3073669076e-9 +1660 1599 22432.771126 +1661 1599 331845.726716 +1665 1599 -278978.752525 +1666 1599 61539.0347024 +1667 1599 9.77888703346e-9 +1668 1599 -6296.90641785 +1669 1599 31977.4238183 +1670 1599 2492.53012511 +1671 1599 36871.7474129 +1682 1599 -30998.8310339 +1683 1599 6837.6908117 +1684 1599 156545.65914 +1692 1599 -83683.5914262 +1693 1599 -393384.784244 +1694 1599 1.04773789644e-8 +1695 1599 -9298.47500667 +1696 1599 -43709.4204715 +1697 1599 41522.6301091 +1600 1600 3720409.52335 +1601 1600 -7.63684511185e-8 +1602 1600 346291.582731 +1603 1600 -1860205.16553 +1604 1600 1.67638063431e-8 +1605 1600 14092.3079369 +1606 1600 413377.67951 +1607 1600 .00298771448433 +1608 1600 38476.8377545 +1609 1600 -206690.040937 +1610 1600 280000.186209 +1658 1600 392860.253992 +1659 1600 1.86264514923e-9 +1660 1600 -61014.5272763 +1661 1600 -902581.764442 +1665 1600 61539.0347024 +1666 1600 1805168.05702 +1667 1600 -4.00468707085e-8 +1668 1600 43651.1594896 +1669 1600 -140000.091685 +1670 1600 -6779.41207675 +1671 1600 -100287.160899 +1682 1600 6837.6908117 +1683 1600 200573.631329 +1684 1600 -.0026629678905 +1692 1600 -393384.784244 +1693 1600 -902585.743587 +1694 1600 3.16649675369e-8 +1695 1600 -43709.4204715 +1696 1600 -100287.603024 +1697 1600 140000.094024 +1601 1601 867281.299207 +1602 1601 -7.68341124058e-9 +1603 1601 4.842877388e-8 +1604 1601 216815.886276 +1605 1601 -146999.505464 +1606 1601 -.00298773497343 +1607 1601 -674546.135777 +1608 1601 -31977.2719444 +1609 1601 280000.187543 +1610 1601 -168637.270283 +1658 1601 -2.41622328758e-9 +1659 1601 111817.392842 +1660 1601 -3.77744436264e-10 +1661 1601 -5.58793544769e-9 +1665 1601 1.25728547573e-8 +1666 1601 -3.72529029846e-8 +1667 1601 447276.482616 +1668 1601 41441.4252353 +1669 1601 -86970.488746 +1670 1601 -9464.00616503 +1671 1601 -140000.091199 +1682 1601 156545.649595 +1683 1601 -.00266297534108 +1684 1601 -347879.419149 +1692 1601 1.09430402517e-8 +1693 1601 3.35276126862e-8 +1694 1601 111816.818787 +1695 1601 41522.6253393 +1696 1601 140000.094186 +1697 1601 -86970.1163126 +1602 1602 244140942.362 +1603 1602 -1.49011611938e-8 +1604 1602 -1.44354999065e-8 +1605 1602 63769862.1023 +1606 1602 38476.8377545 +1607 1602 31977.2719444 +1608 1602 -143446146.486 +1609 1602 -3.49245965481e-9 +1610 1602 146999.505363 +1636 1602 -113710747.324 +1637 1602 -346291.582731 +1638 1602 5.47152012587e-9 +1639 1602 63769862.1023 +1640 1602 -38476.8377545 +1641 1602 31977.2719444 +1665 1602 -57911.4826814 +1666 1602 362615.720322 +1667 1602 -2.56113708019e-9 +1682 1602 -6434.90736836 +1683 1602 40290.6355914 +1684 1602 36750.0269238 +1692 1602 -281076.080804 +1693 1602 3.72529029846e-9 +1694 1602 1.11758708954e-8 +1695 1602 -31231.8681978 +1696 1602 6.98491930962e-10 +1697 1602 156545.309231 +1716 1602 -6434.90736836 +1717 1602 -40290.6355914 +1718 1602 36750.0269238 +1719 1602 -57911.4826814 +1720 1602 -362615.720322 +1721 1602 1.58324837685e-8 +1603 1603 3720413.72651 +1604 1603 -9.12696123123e-8 +1605 1603 -45522.8823082 +1606 1603 -206690.040937 +1607 1603 -280000.187543 +1608 1603 -2.32830643654e-10 +1609 1603 413378.146571 +1610 1603 -1.86264514923e-8 +1636 1603 409705.897833 +1637 1603 -1860205.16553 +1638 1603 1.86264514923e-8 +1639 1603 45522.8823082 +1640 1603 -206690.040937 +1641 1603 280000.187543 +1665 1603 362615.720322 +1666 1603 -902585.692042 +1667 1603 9.31322574615e-10 +1682 1603 40290.6355914 +1683 1603 -100287.597297 +1684 1603 -140000.092853 +1692 1603 3.72529029846e-9 +1693 1603 1805171.9323 +1694 1603 -3.632158041e-8 +1695 1603 -4.65661287308e-10 +1696 1603 200574.062608 +1697 1603 -1.49011611938e-8 +1716 1603 -40290.6355914 +1717 1603 -100287.597297 +1718 1603 140000.092853 +1719 1603 -362615.720322 +1720 1603 -902585.692042 +1721 1603 4.09781932831e-8 +1604 1604 867280.292863 +1605 1604 -41522.4783151 +1606 1604 -280000.186209 +1607 1604 -168637.270283 +1608 1604 -146999.505363 +1609 1604 -1.86264514923e-9 +1610 1604 -674545.359406 +1636 1604 -1.42026692629e-8 +1637 1604 5.40167093277e-8 +1638 1604 216815.886276 +1639 1604 -41522.4783151 +1640 1604 280000.186209 +1641 1604 -168637.270283 +1665 1604 -3.95812094212e-9 +1666 1604 -4.65661287308e-9 +1667 1604 111816.857445 +1682 1604 36750.022154 +1683 1604 -140000.09269 +1684 1604 -86970.1077219 +1692 1604 1.95577740669e-8 +1693 1604 -5.58793544769e-8 +1694 1604 447275.479351 +1695 1604 156545.299685 +1696 1604 -1.76951289177e-8 +1697 1604 -347878.642094 +1716 1604 36750.022154 +1717 1604 140000.09269 +1718 1604 -86970.1077219 +1719 1604 1.04773789644e-8 +1720 1604 4.93600964546e-8 +1721 1604 111816.857445 +1605 1605 323352758.695 +1606 1605 56369.2252525 +1607 1605 -1.72294676304e-8 +1608 1605 -145636695.858 +1609 1605 -182091.504184 +1610 1605 5.12227416038e-9 +1613 1605 -563802083.333 +1614 1605 2.00271606445e-5 +1615 1605 -143445666.058 +1616 1605 14092.3079369 +1617 1605 146999.505464 +1620 1605 234049479.167 +1621 1605 129960317.46 +1626 1605 63769862.1023 +1627 1605 -45522.8823082 +1628 1605 41522.4783151 +1658 1605 -6296.90641785 +1659 1605 -31977.4238183 +1660 1605 2492.53012511 +1661 1605 36871.7474129 +1665 1605 -30998.8310339 +1666 1605 6837.6908117 +1667 1605 -156545.65914 +1668 1605 -25186.0602114 +1669 1605 -4.42378222942e-9 +1670 1605 9970.12050045 +1671 1605 147486.989652 +1675 1605 2492.53012511 +1676 1605 36871.7474129 +1680 1605 -6296.90641785 +1681 1605 31977.4238183 +1682 1605 -123989.066847 +1683 1605 27350.6567284 +1684 1605 7.45058059692e-9 +1689 1605 -30998.8310339 +1690 1605 6837.6908117 +1691 1605 156545.65914 +1692 1605 -9298.47500667 +1693 1605 -43709.4204715 +1694 1605 -41522.6301091 +1695 1605 -37192.3345736 +1696 1605 -174837.681886 +1697 1605 1.46683305502e-8 +1706 1605 -9298.47500667 +1707 1605 -43709.4204715 +1708 1605 41522.6301091 +1606 1606 1653516.78923 +1607 1606 -7.45058059692e-8 +1608 1606 153907.376067 +1609 1606 -826757.128721 +1610 1606 2.04890966415e-8 +1615 1606 14092.3079369 +1616 1606 413377.67951 +1617 1606 .00298770517111 +1626 1606 38476.8377545 +1627 1606 -206690.040937 +1628 1606 280000.186209 +1658 1606 43651.1594896 +1659 1606 140000.091685 +1660 1606 -6779.41207675 +1661 1606 -100287.160899 +1665 1606 6837.6908117 +1666 1606 200573.631329 +1667 1606 .00266295298934 +1668 1606 174604.532134 +1669 1606 3.72529029846e-9 +1670 1606 -27117.5424819 +1671 1606 -401147.078134 +1675 1606 -6779.41207675 +1676 1606 -100287.160899 +1680 1606 43651.1594896 +1681 1606 -140000.091685 +1682 1606 27350.6567284 +1683 1606 802297.660767 +1684 1606 -4.09781932831e-8 +1689 1606 6837.6908117 +1690 1606 200573.631329 +1691 1606 -.00266296975315 +1692 1606 -43709.4204715 +1693 1606 -100287.603024 +1694 1606 -140000.094024 +1695 1606 -174837.681886 +1696 1606 -401148.846645 +1697 1606 3.53902578354e-8 +1706 1606 -43709.4204715 +1707 1606 -100287.603024 +1708 1606 140000.094024 +1607 1607 1349097.59229 +1608 1607 -1.02445483208e-8 +1609 1607 5.02914190292e-8 +1610 1607 337272.147616 +1615 1607 -146999.505464 +1616 1607 -.00298774056137 +1617 1607 -674546.135777 +1626 1607 -31977.2719444 +1627 1607 280000.187543 +1628 1607 -168637.270283 +1658 1607 -41441.4252353 +1659 1607 -86970.488746 +1660 1607 9464.00616503 +1661 1607 140000.091199 +1665 1607 -156545.649595 +1666 1607 .00266296323389 +1667 1607 -347879.419149 +1668 1607 -2.76546925306e-9 +1669 1607 173939.728226 +1670 1607 -3.77744436264e-10 +1671 1607 -5.58793544769e-9 +1675 1607 -9464.00616503 +1676 1607 -140000.091199 +1680 1607 41441.4252353 +1681 1607 -86970.488746 +1682 1607 1.62981450558e-8 +1683 1607 -3.44589352608e-8 +1684 1607 695760.873455 +1689 1607 156545.649595 +1690 1607 -.00266297906637 +1691 1607 -347879.419149 +1692 1607 -41522.6253393 +1693 1607 -140000.094186 +1694 1607 -86970.1163125 +1695 1607 1.16415321827e-8 +1696 1607 3.632158041e-8 +1697 1607 173938.917533 +1706 1607 41522.6253393 +1707 1607 140000.094186 +1708 1607 -86970.1163126 +1608 1608 323350836.985 +1609 1608 -4.65661287308e-9 +1610 1608 -1.86264514923e-8 +1613 1608 234049479.167 +1614 1608 -129960317.46 +1615 1608 63769862.1023 +1616 1608 38476.8377545 +1617 1608 31977.2719444 +1620 1608 -563802083.333 +1621 1608 -1.90734863281e-5 +1624 1608 234049479.167 +1625 1608 129960317.46 +1626 1608 -143446146.486 +1627 1608 -1.86264514923e-9 +1628 1608 146999.505363 +1636 1608 63769862.1023 +1637 1608 -38476.8377545 +1638 1608 -31977.2719444 +1639 1608 -145636695.858 +1640 1608 -153907.376067 +1641 1608 5.00585883856e-9 +1650 1608 63769862.1023 +1651 1608 -38476.8377545 +1652 1608 31977.2719444 +1665 1608 -6434.90736836 +1666 1608 40290.6355914 +1667 1608 -36750.0269238 +1682 1608 -25738.0640204 +1683 1608 161162.542365 +1684 1608 -5.58793544769e-9 +1689 1608 -6434.90736836 +1690 1608 40290.6355914 +1691 1608 36750.0269238 +1692 1608 -31231.8681978 +1693 1608 1.39698386192e-9 +1694 1608 -156545.30923 +1695 1608 -124921.211889 +1696 1608 6.98491930962e-9 +1697 1608 1.16415321827e-8 +1706 1608 -31231.8681978 +1707 1608 9.31322574615e-10 +1708 1608 156545.309231 +1716 1608 -25738.0640204 +1717 1608 -161162.542365 +1718 1608 1.62981450558e-8 +1719 1608 -6434.90736836 +1720 1608 -40290.6355914 +1721 1608 -36750.0269238 +1727 1608 -6434.90736836 +1728 1608 -40290.6355914 +1729 1608 36750.0269238 +1609 1609 1653518.65725 +1610 1609 -9.12696123123e-8 +1615 1609 -45522.8823082 +1616 1609 -206690.040937 +1617 1609 -280000.187543 +1626 1609 -9.31322574615e-10 +1627 1609 413378.146571 +1628 1609 -2.60770320892e-8 +1636 1609 45522.8823082 +1637 1609 -206690.040937 +1638 1609 -280000.187543 +1639 1609 182091.504184 +1640 1609 -826757.128721 +1641 1609 1.49011611938e-8 +1650 1609 45522.8823082 +1651 1609 -206690.040937 +1652 1609 280000.187543 +1665 1609 40290.6355914 +1666 1609 -100287.597297 +1667 1609 140000.092853 +1682 1609 161162.542365 +1683 1609 -401148.823736 +1684 1609 4.65661287308e-9 +1689 1609 40290.6355914 +1690 1609 -100287.597297 +1691 1609 -140000.092853 +1692 1609 2.56113708019e-9 +1693 1609 200574.062608 +1694 1609 -1.86264514923e-9 +1695 1609 2.79396772385e-9 +1696 1609 802299.382247 +1697 1609 -4.56348061562e-8 +1706 1609 4.65661287308e-10 +1707 1609 200574.062608 +1708 1609 -1.95577740669e-8 +1716 1609 -161162.542365 +1717 1609 -401148.823736 +1718 1609 4.09781932831e-8 +1719 1609 -40290.6355914 +1720 1609 -100287.597297 +1721 1609 -140000.092853 +1727 1609 -40290.6355914 +1728 1609 -100287.597297 +1729 1609 140000.092853 +1610 1610 1349096.03391 +1615 1610 -41522.4783151 +1616 1610 -280000.186209 +1617 1610 -168637.270283 +1626 1610 -146999.505363 +1627 1610 -5.58793544769e-9 +1628 1610 -674545.359406 +1636 1610 41522.4783151 +1637 1610 -280000.186209 +1638 1610 -168637.270283 +1639 1610 -1.25728547573e-8 +1640 1610 5.21540641785e-8 +1641 1610 337272.147616 +1650 1610 -41522.4783151 +1651 1610 280000.186209 +1652 1610 -168637.270283 +1665 1610 -36750.022154 +1666 1610 140000.09269 +1667 1610 -86970.1077219 +1682 1610 -4.42378222942e-9 +1683 1610 9.31322574615e-10 +1684 1610 173938.934715 +1689 1610 36750.022154 +1690 1610 -140000.09269 +1691 1610 -86970.1077219 +1692 1610 -156545.299685 +1693 1610 -2.79396772385e-9 +1694 1610 -347878.642094 +1695 1610 2.18860805035e-8 +1696 1610 -5.77419996262e-8 +1697 1610 695759.316446 +1706 1610 156545.299685 +1707 1610 -1.95577740669e-8 +1708 1610 -347878.642094 +1716 1610 1.1408701539e-8 +1717 1610 5.02914190292e-8 +1718 1610 173938.934715 +1719 1610 -36750.022154 +1720 1610 -140000.09269 +1721 1610 -86970.1077218 +1727 1610 36750.022154 +1728 1610 140000.09269 +1729 1610 -86970.1077219 +1611 1611 7848055002.64 +1615 1611 -115389500.287 +1617 1611 -7.62939453125e-6 +1618 1611 -2596510776.72 +1626 1611 28700104.0613 +1628 1611 -1.125e8 +1675 1611 21263710.1308 +1676 1611 -96213841.2094 +1685 1611 2915572.57009 +1686 1611 178038015.084 +1698 1611 -24179282.7009 +1699 1611 -98239173.8748 +1612 1612 360375786695 +1613 1612 -104169999348 +1617 1612 -4472783849.81 +1619 1612 77596563067.8 +1620 1612 33205576861.9 +1628 1612 -17393792089.1 +1677 1612 -5368433196.1 +1678 1612 -13653722765.7 +1681 1612 -191386582.598 +1687 1612 13745298022 +1688 1612 12966764622.2 +1691 1612 618909155.565 +1700 1612 -4967836613.62 +1701 1612 -2509520011.86 +1708 1612 -587346480.731 +1613 1613 1.19178564127e12 +1614 1613 -3.57627868652e-7 +1615 1613 563802083.333 +1617 1613 -8024457041.4 +1619 1613 33205576861.9 +1620 1613 -583929119292 +1621 1613 -2.34375e6 +1626 1613 -234049479.167 +1628 1613 3034249677.13 +1677 1613 -13653722765.7 +1678 1613 -216682917947 +1681 1613 -10442809270.4 +1687 1613 12966764622.2 +1688 1613 439820996739 +1691 1613 21018836890.9 +1700 1613 -2509520011.86 +1701 1613 -217139523738 +1708 1613 -10142044034.5 +1614 1614 2039496527.78 +1615 1614 -1.90734863281e-5 +1620 1614 2.34375e6 +1621 1614 872178819.444 +1626 1614 177579365.079 +1615 1615 521561009.274 +1616 1615 28184.6126262 +1617 1615 147000.102756 +1618 1615 28700104.0613 +1620 1615 -234049479.167 +1621 1615 -177579365.079 +1626 1615 -209792943.651 +1627 1615 -91045.752092 +1628 1615 41522.6110201 +1668 1615 -6296.90641785 +1669 1615 -31977.4238183 +1670 1615 2492.53012511 +1671 1615 36871.7474129 +1675 1615 -59484669.983 +1676 1615 21337453.6256 +1680 1615 -12593.0301057 +1681 1615 31977.2909564 +1682 1615 -30998.8310339 +1683 1615 6837.6908117 +1684 1615 -156545.65914 +1685 1615 83031471.5327 +1686 1615 2915572.57009 +1689 1615 -61994.5334236 +1690 1615 13675.3283642 +1691 1615 156545.023639 +1695 1615 -9298.47500667 +1696 1615 -43709.4204715 +1697 1615 -41522.6301091 +1698 1615 -64579316.4894 +1699 1615 -24179282.7009 +1706 1615 -18596.1672868 +1707 1615 -87418.8409431 +1708 1615 41522.459226 +1616 1616 826758.394616 +1617 1616 -.00298775546253 +1626 1616 76953.6880334 +1627 1616 -413378.56436 +1628 1616 279999.067543 +1668 1616 43651.1594896 +1669 1616 140000.091685 +1670 1616 -6779.41207675 +1671 1616 -100287.160899 +1675 1616 -13558.7712409 +1676 1616 -200573.539067 +1680 1616 87302.2660667 +1681 1616 -139999.53519 +1682 1616 6837.6908117 +1683 1616 200573.631329 +1684 1616 .00266295019537 +1689 1616 13675.3283642 +1690 1616 401148.830384 +1691 1616 .00266293715686 +1695 1616 -43709.4204715 +1696 1616 -100287.603024 +1697 1616 -140000.094024 +1706 1616 -87418.8409431 +1707 1616 -200574.423322 +1708 1616 139999.532852 +1617 1617 15507075369.1 +1618 1617 1.125e8 +1619 1617 19609337166.7 +1620 1617 3804139136.87 +1626 1617 31977.4428303 +1627 1617 -279999.066209 +1628 1617 -3101528954.89 +1668 1617 -41441.4252353 +1669 1617 -86970.488746 +1670 1617 9464.00616503 +1671 1617 140000.091199 +1675 1617 9463.96861178 +1676 1617 139999.535677 +1677 1617 634383521.356 +1678 1617 11792993166.5 +1680 1617 -41441.2643163 +1681 1617 523293753.014 +1682 1617 -156545.649595 +1683 1617 .0026629595086 +1684 1617 -347879.419149 +1687 1617 -720110471.626 +1688 1617 -23387080643.1 +1689 1617 -156545.033185 +1690 1617 -.0026629678905 +1691 1617 -1023577105.99 +1695 1617 -41522.6253393 +1696 1617 -140000.094186 +1697 1617 -86970.1163125 +1700 1617 236042876.142 +1701 1617 11479859328.3 +1706 1617 -41522.4639959 +1707 1617 -139999.53269 +1708 1617 495093765.319 +1618 1618 7751110490.62 +1622 1618 -2507973602.79 +1626 1618 12655978.2082 +1628 1618 -1.52587890625e-5 +1650 1618 -41356082.2695 +1652 1618 -1.125e8 +1685 1618 22720717.2991 +1686 1618 -97173293.2081 +1698 1618 8.94069671631e-8 +1699 1618 177931586.416 +1702 1618 -22720717.2991 +1703 1618 -97173293.2081 +1619 1619 3.1614064184e11 +1620 1619 7696889808.47 +1623 1619 66460457385.5 +1624 1619 -42249248422.7 +1628 1619 -2509160423.05 +1652 1619 -17121554231.8 +1687 1619 -4898199076.73 +1688 1619 -5573653345.2 +1691 1619 195396975.265 +1700 1619 13259748548 +1701 1619 -.000106811523438 +1704 1619 -4898199076.73 +1705 1619 5573653345.2 +1708 1619 .000225067138672 +1729 1619 -195396975.265 +1620 1620 1.08159860603e12 +1621 1620 1.19209289551e-7 +1623 1620 -42249248422.7 +1624 1620 -475658783989 +1625 1620 -2.34375e6 +1626 1620 563802083.333 +1628 1620 -9929494574.98 +1639 1620 234049479.167 +1650 1620 -234049479.167 +1652 1620 5840766437.17 +1687 1620 -5573653345.2 +1688 1620 -216965429896 +1691 1620 -10295029893 +1700 1620 -.0001220703125 +1701 1620 4.3983815758e11 +1704 1620 5573653345.2 +1705 1620 -216965429896 +1708 1620 21019480508.7 +1729 1620 -10295029893 +1621 1621 2039496527.78 +1624 1621 2.34375e6 +1625 1621 872178819.444 +1626 1621 1.33514404297e-5 +1639 1621 -129960317.46 +1650 1621 177579365.079 +1622 1622 7666190044.11 +1626 1622 -41356082.2695 +1628 1622 1.125e8 +1642 1622 -126154736.397 +1643 1622 -2511590330.2 +1644 1622 -1.125e8 +1650 1622 167510818.667 +1652 1622 7.62939453125e-6 +1653 1622 -1989583333.33 +1654 1622 -1.3875e9 +1698 1622 24179282.7009 +1699 1622 -98239173.8748 +1702 1622 -2915572.57009 +1703 1622 178038015.084 +1722 1622 -21263710.1308 +1723 1622 -96213841.2094 +1623 1623 371762060818 +1624 1623 128142655909 +1628 1623 14277067475.1 +1644 1623 -20497483326 +1645 1623 5509027472.81 +1646 1623 -118978022547 +1652 1623 5484701574.55 +1700 1623 -4967836613.62 +1701 1623 2509520011.86 +1704 1623 13745298022 +1705 1623 -12966764622.2 +1708 1623 587346480.732 +1710 1623 191386582.599 +1724 1623 -5368433196.1 +1725 1623 13653722765.7 +1729 1623 -618909155.565 +1624 1624 9.6351977504e11 +1625 1624 -3.57627868652e-7 +1626 1624 -234049479.167 +1628 1624 5114726427.2 +1634 1624 234049479.167 +1639 1624 -563802083.333 +1642 1624 -234049479.167 +1644 1624 7414916046.23 +1645 1624 -118978022547 +1646 1624 -451289709156 +1647 1624 -2.34375e6 +1650 1624 563802083.333 +1652 1624 -12589122561.7 +1656 1624 -1430245535.71 +1657 1624 2.890625e7 +1700 1624 2509520011.86 +1701 1624 -217139523738 +1704 1624 -12966764622.2 +1705 1624 439820996739 +1708 1624 -10142044034.5 +1710 1624 -10442809270.4 +1724 1624 13653722765.7 +1725 1624 -216682917947 +1729 1624 21018836890.9 +1625 1625 2039496527.78 +1626 1625 -177579365.079 +1634 1625 -129960317.46 +1639 1625 1.52587890625e-5 +1642 1625 177579365.079 +1646 1625 2.34375e6 +1647 1625 872178819.444 +1650 1625 -6.67572021484e-6 +1656 1625 2.890625e7 +1657 1625 -705512152.778 +1626 1626 471108073.069 +1627 1626 -2.79396772385e-9 +1628 1626 147000.102857 +1639 1626 63769862.1023 +1640 1626 -38476.8377545 +1641 1626 -31977.2719444 +1650 1626 -191211129.006 +1651 1626 -76953.6880334 +1652 1626 31977.4428303 +1682 1626 -6434.90736836 +1683 1626 40290.6355914 +1684 1626 -36750.0269238 +1685 1626 -61914614.8227 +1686 1626 22720717.2991 +1689 1626 -12869.0320102 +1690 1626 80581.2711827 +1691 1626 36749.8751311 +1695 1626 -31231.8681978 +1696 1626 1.86264514923e-9 +1697 1626 -156545.30923 +1698 1626 82791729.6455 +1699 1626 -1.78813934326e-7 +1702 1626 -61914614.8227 +1703 1626 -22720717.2991 +1706 1626 -62460.6059443 +1707 1626 3.25962901115e-9 +1708 1626 156544.67355 +1716 1626 -6434.90736836 +1717 1626 -40290.6355914 +1718 1626 -36750.0269238 +1727 1626 -12869.0320102 +1728 1626 -80581.2711827 +1729 1626 36749.8751311 +1627 1627 826759.328624 +1628 1627 -5.58793544769e-8 +1639 1627 45522.8823082 +1640 1627 -206690.040937 +1641 1627 -280000.187543 +1650 1627 91045.752092 +1651 1627 -413378.56436 +1652 1627 279999.066209 +1682 1627 40290.6355914 +1683 1627 -100287.597297 +1684 1627 140000.092853 +1689 1627 80581.2711827 +1690 1627 -200574.411868 +1691 1627 -139999.534023 +1695 1627 1.39698386192e-9 +1696 1627 200574.062608 +1697 1627 -2.79396772385e-9 +1706 1627 2.79396772385e-9 +1707 1627 401149.691123 +1708 1627 -3.07336449623e-8 +1716 1627 -40290.6355914 +1717 1627 -100287.597297 +1718 1627 -140000.092853 +1727 1627 -80581.2711827 +1728 1627 -200574.411868 +1729 1627 139999.534023 +1628 1628 14837762394.3 +1639 1628 41522.4783151 +1640 1628 -280000.186209 +1641 1628 -168637.270283 +1650 1628 41522.6110201 +1651 1628 -279999.067542 +1652 1628 -2568688156.11 +1682 1628 -36750.022154 +1683 1628 140000.09269 +1684 1628 -86970.1077219 +1687 1628 201620950.919 +1688 1628 11639192985.5 +1689 1628 -36749.879901 +1690 1628 139999.534186 +1691 1628 510709741.104 +1695 1628 -156545.299685 +1696 1628 -6.51925802231e-9 +1697 1628 -347878.642094 +1700 1628 .00022029876709 +1701 1628 -23389139379.5 +1704 1628 -201620950.919 +1705 1628 11639192985.5 +1706 1628 -156544.683095 +1707 1628 -2.421438694e-8 +1708 1628 -1026435334.04 +1716 1628 -36750.022154 +1717 1628 -140000.09269 +1718 1628 -86970.1077218 +1727 1628 -36749.879901 +1728 1628 -139999.534186 +1729 1628 510709741.104 +1629 1629 12856033912.6 +1631 1629 31681333.907 +1632 1629 2160112.54911 +1633 1629 57997.8498104 +1634 1629 -5657347.90122 +1635 1629 -279999.069115 +1636 1629 -282875.157577 +1637 1629 -1860200.96305 +1638 1629 7.45058059692e-8 +1639 1629 -31430.5587833 +1640 1629 -206689.573347 +1641 1629 -280000.18488 +1648 1629 7123154.35155 +1649 1629 -5.02914190292e-8 +1653 1629 668024671.607 +1654 1629 112244907.88 +1655 1629 53039875.8077 +1656 1629 3616391.33226 +1657 1629 -42549.1878212 +1711 1629 -6285140.44407 +1712 1629 -109041.744056 +1713 1629 3486258.96796 +1714 1629 -1293697.09305 +1715 1629 -42549.1878212 +1716 1629 47128.30865 +1717 1629 -100287.17808 +1718 1629 -140000.095191 +1719 1629 424154.77785 +1720 1629 -902581.919078 +1721 1629 1.95577740669e-8 +1730 1629 7775323.41429 +1731 1629 397649.561817 +1732 1629 8.38190317154e-9 +1733 1629 15840666.9535 +1734 1629 57997.8498104 +1735 1629 43650.9402673 +1736 1629 -139999.531442 +1737 1629 392858.781167 +1738 1629 -4.93600964546e-8 +1630 1630 24942745706.3 +1634 1630 3741313.67444 +1648 1630 -4.76837158203e-7 +1653 1630 -112244907.88 +1654 1630 -15505731464.6 +1711 1630 51131286.8839 +1712 1630 3486258.96796 +1713 1630 -6662533496 +1730 1630 5.96046447754e-8 +1731 1630 3.72529029846e-9 +1732 1630 8518492916.51 +1631 1631 855924413.613 +1632 1631 58359066.3312 +1633 1631 1.86264514923e-9 +1634 1631 3616391.33226 +1648 1631 -2160112.54911 +1653 1631 -53039875.8077 +1655 1631 249230126.277 +1656 1631 16993133.0849 +1657 1631 -19486.008721 +1711 1631 -88207.5020468 +1712 1631 1293697.09305 +1714 1631 -42245411.4185 +1715 1631 -266308.785854 +1730 1631 -1080056.27455 +1731 1631 15840666.9535 +1733 1631 -323678003.977 +1734 1631 -4.65661287308e-10 +1632 1632 7269604067.04 +1633 1632 -5.96046447754e-7 +1634 1632 282147616.269 +1636 1632 -14648437.5001 +1639 1632 -234049479.167 +1648 1632 -29444156.8737 +1653 1632 -3616391.33226 +1655 1632 16993133.0849 +1656 1632 1622810420.01 +1657 1632 2342421.39521 +1711 1632 -6014.20800831 +1712 1632 88207.5020468 +1714 1632 -2880397.76404 +1715 1632 -18157.5987915 +1730 1632 -73640.9369398 +1731 1632 1080056.27455 +1733 1632 -22069175.5061 +1734 1632 -3.63797880709e-11 +1633 1633 2028010882.68 +1634 1633 -129957416.35 +1636 1633 -330357142.857 +1639 1633 129960317.46 +1648 1633 330353188.419 +1653 1633 -42549.1878212 +1655 1633 19486.008721 +1656 1633 -2342421.39521 +1657 1633 -688384317.999 +1711 1633 -2901.10999862 +1712 1633 42549.1878212 +1714 1633 -266308.785854 +1715 1633 -697570.309005 +1730 1633 3954.43839469 +1731 1633 -57997.8498104 +1733 1633 -2.32830643654e-10 +1734 1633 940970.165597 +1634 1634 346329690.368 +1635 1634 3.25962901115e-9 +1636 1634 63769381.6742 +1637 1634 52569.1612794 +1638 1634 -51068.034595 +1639 1634 -145638617.567 +1640 1634 210276.570143 +1641 1634 -1.95577740669e-8 +1642 1634 -162802665.198 +1643 1634 -5657347.90122 +1644 1634 -3648722.88528 +1645 1634 -3616391.33226 +1646 1634 -282147616.269 +1647 1634 -129957416.35 +1648 1634 -162802665.198 +1649 1634 -92590.7891601 +1650 1634 63769381.6742 +1651 1634 52569.1612794 +1652 1634 51068.034595 +1653 1634 11166855.1219 +1654 1634 -2.38418579102e-7 +1657 1634 355152797.015 +1709 1634 -18568.7601425 +1710 1634 51219105.4067 +1711 1634 181280826.517 +1712 1634 12200634.3837 +1713 1634 2.98023223877e-8 +1714 1634 -1.58324837685e-8 +1715 1634 -5933.14322851 +1716 1634 -49579.5913729 +1717 1634 188513.2346 +1718 1634 -1.07102096081e-8 +1719 1634 -12395.2892082 +1720 1634 47128.30865 +1721 1634 -46295.5833745 +1722 1634 -91859776.3355 +1723 1634 -6325489.22387 +1724 1634 88207.5020468 +1725 1634 6014.20800831 +1726 1634 2901.10999862 +1727 1634 -12395.2892082 +1728 1634 47128.30865 +1729 1634 46295.5833745 +1730 1634 -91859776.3355 +1731 1634 -6325489.22387 +1732 1634 -51131286.8839 +1733 1634 -88207.5020468 +1734 1634 2901.10999862 +1735 1634 -74271.9083355 +1736 1634 2.14204192162e-8 +1737 1634 -18568.7601425 +1738 1634 -87818.5227136 +1635 1635 674549.609698 +1636 1635 22431.7154827 +1637 1635 280000.188872 +1638 1635 -168637.660582 +1639 1635 3.84170562029e-9 +1640 1635 3.72529029846e-8 +1641 1635 337272.922577 +1642 1635 -92590.7891601 +1643 1635 279999.069115 +1644 1635 -337273.438892 +1648 1635 92590.7891601 +1649 1635 -337273.438892 +1650 1635 -22431.7154827 +1651 1635 -280000.188872 +1652 1635 -168637.660582 +1653 1635 -3.53902578354e-8 +1709 1635 78191.4501587 +1710 1635 -173940.098102 +1711 1635 3.77744436264e-10 +1712 1635 -5.58793544769e-9 +1716 1635 -6.51925802231e-9 +1717 1635 4.65661287308e-9 +1718 1635 173939.676681 +1719 1635 -46295.5786264 +1720 1635 140000.095678 +1721 1635 -86970.5145187 +1722 1635 -9463.96859533 +1723 1635 139999.535434 +1727 1635 46295.5786264 +1728 1635 -140000.095678 +1729 1635 -86970.5145187 +1730 1635 9463.96859533 +1731 1635 -139999.535434 +1735 1635 -2.7060508728e-9 +1736 1635 347881.215232 +1737 1635 -78191.4501587 +1738 1635 -173940.098102 +1636 1636 244145266.21 +1637 1636 -126830.760298 +1638 1636 -9.77888703346e-9 +1639 1636 -143445666.058 +1640 1636 -14092.3079369 +1641 1636 146999.505464 +1648 1636 -113715071.171 +1649 1636 7.21774995327e-9 +1653 1636 -31430.5587833 +1656 1636 234049479.167 +1657 1636 129960317.46 +1692 1636 -83683.5914262 +1693 1636 393384.784244 +1694 1636 -6.053596735e-9 +1695 1636 -9298.47500667 +1696 1636 43709.4204715 +1697 1636 41522.6301091 +1711 1636 2492.53012511 +1712 1636 -36871.7474129 +1716 1636 -30998.831034 +1717 1636 -6837.6908117 +1718 1636 156545.65914 +1719 1636 -278978.752525 +1720 1636 -61539.0347024 +1721 1636 1.210719347e-8 +1730 1636 22432.771126 +1731 1636 -331845.726716 +1735 1636 -6296.90641785 +1736 1636 31977.4238183 +1737 1636 -56669.4741149 +1738 1636 1.52504071593e-8 +1637 1637 3720409.52335 +1638 1637 -9.87201929092e-8 +1639 1637 -14092.3079369 +1640 1637 413377.67951 +1641 1637 -.00298773869872 +1648 1637 473122.322987 +1649 1637 5.58793544769e-8 +1653 1637 -206689.573347 +1692 1637 393384.784244 +1693 1637 -902585.743587 +1694 1637 2.79396772385e-9 +1695 1637 43709.4204715 +1696 1637 -100287.603024 +1697 1637 -140000.094024 +1711 1637 6779.41207675 +1712 1637 -100287.160899 +1716 1637 -6837.6908117 +1717 1637 200573.631329 +1718 1637 .00266294181347 +1719 1637 -61539.0347024 +1720 1637 1805168.05702 +1721 1637 -6.33299350738e-8 +1730 1637 61014.5272763 +1731 1637 -902581.764442 +1735 1637 -43651.1594896 +1736 1637 140000.091685 +1737 1637 -392860.253992 +1738 1637 4.842877388e-8 +1638 1638 867281.299207 +1639 1638 -146999.505464 +1640 1638 .00298770330846 +1641 1638 -674546.135777 +1648 1638 -2.18860805035e-8 +1649 1638 216816.379936 +1653 1638 280000.18488 +1692 1638 -4.88944351673e-9 +1693 1638 1.86264514923e-9 +1694 1638 111816.818787 +1695 1638 41522.6253393 +1696 1638 -140000.094186 +1697 1638 -86970.1163125 +1711 1638 -9464.00616503 +1712 1638 140000.091199 +1716 1638 156545.649595 +1717 1638 .00266293529421 +1718 1638 -347879.419149 +1719 1638 1.67638063431e-8 +1720 1638 -6.42612576485e-8 +1721 1638 447276.482616 +1730 1638 -3.08491289616e-9 +1731 1638 4.56348061562e-8 +1735 1638 41441.4252353 +1736 1638 -86970.4887461 +1737 1638 1.76368281245e-8 +1738 1638 111817.392842 +1639 1639 323352758.695 +1640 1639 -56369.2252525 +1641 1639 -1.32713466883e-8 +1642 1639 63769381.6742 +1643 1639 -31430.5587833 +1644 1639 22431.7154827 +1646 1639 234049479.167 +1647 1639 129960317.46 +1648 1639 63769381.6742 +1649 1639 -22431.7154827 +1650 1639 -143445666.058 +1651 1639 -14092.3079369 +1652 1639 146999.505464 +1653 1639 -125722.310107 +1657 1639 -355158730.159 +1692 1639 -9298.47500667 +1693 1639 43709.4204715 +1694 1639 -41522.6301091 +1695 1639 -37192.3345736 +1696 1639 174837.681886 +1697 1639 -7.21774995327e-9 +1706 1639 -9298.47500667 +1707 1639 43709.4204715 +1708 1639 41522.6301091 +1709 1639 -6296.90641785 +1710 1639 31977.4238183 +1711 1639 9970.12050045 +1712 1639 -147486.989652 +1716 1639 -123989.066847 +1717 1639 -27350.6567284 +1718 1639 1.25728547573e-8 +1719 1639 -30998.8310339 +1720 1639 -6837.6908117 +1721 1639 -156545.65914 +1722 1639 2492.53012511 +1723 1639 -36871.7474129 +1727 1639 -30998.8310339 +1728 1639 -6837.6908117 +1729 1639 156545.65914 +1730 1639 2492.53012511 +1731 1639 -36871.7474129 +1735 1639 -25186.0602114 +1736 1639 1.43190845847e-8 +1737 1639 -6296.90641785 +1738 1639 -31977.4238183 +1640 1640 1653516.78923 +1641 1640 -9.31322574615e-8 +1642 1640 52569.1612794 +1643 1640 -206689.573347 +1644 1640 280000.188872 +1648 1640 52569.1612794 +1649 1640 -280000.188872 +1650 1640 -14092.3079369 +1651 1640 413377.67951 +1652 1640 -.00298773497343 +1653 1640 -826755.261762 +1692 1640 43709.4204715 +1693 1640 -100287.603024 +1694 1640 140000.094024 +1695 1640 174837.681886 +1696 1640 -401148.846645 +1697 1640 4.65661287308e-9 +1706 1640 43709.4204715 +1707 1640 -100287.603024 +1708 1640 -140000.094024 +1709 1640 -43651.1594896 +1710 1640 140000.091685 +1711 1640 27117.5424819 +1712 1640 -401147.078134 +1716 1640 -27350.6567284 +1717 1640 802297.660767 +1718 1640 -5.77419996262e-8 +1719 1640 -6837.6908117 +1720 1640 200573.631329 +1721 1640 -.00266296695918 +1722 1640 6779.41207675 +1723 1640 -100287.160899 +1727 1640 -6837.6908117 +1728 1640 200573.631329 +1729 1640 .00266294367611 +1730 1640 6779.41207675 +1731 1640 -100287.160899 +1735 1640 -174604.532134 +1736 1640 4.09781932831e-8 +1737 1640 -43651.1594896 +1738 1640 -140000.091685 +1641 1641 1349097.59229 +1642 1641 -51068.034595 +1643 1641 280000.18488 +1644 1641 -168637.660582 +1648 1641 51068.034595 +1649 1641 -168637.660582 +1650 1641 -146999.505464 +1651 1641 .00298771075904 +1652 1641 -674546.135777 +1653 1641 6.70552253723e-8 +1692 1641 -41522.6253393 +1693 1641 140000.094186 +1694 1641 -86970.1163125 +1695 1641 -4.42378222942e-9 +1696 1641 1.86264514923e-9 +1697 1641 173938.917533 +1706 1641 41522.6253393 +1707 1641 -140000.094186 +1708 1641 -86970.1163125 +1709 1641 41441.4252353 +1710 1641 -86970.488746 +1711 1641 -3.21082770824e-9 +1712 1641 4.74974513054e-8 +1716 1641 2.04890966415e-8 +1717 1641 -5.86733222008e-8 +1718 1641 695760.873455 +1719 1641 -156545.649595 +1720 1641 -.00266295671463 +1721 1641 -347879.419149 +1722 1641 -9464.00616503 +1723 1641 140000.091199 +1727 1641 156545.649595 +1728 1641 .00266293715686 +1729 1641 -347879.419149 +1730 1641 9464.00616503 +1731 1641 -140000.091199 +1735 1641 1.48523598909e-8 +1736 1641 173939.728226 +1737 1641 -41441.4252353 +1738 1641 -86970.488746 +1642 1642 609477007.604 +1643 1642 198494931.666 +1644 1642 51223878.048 +1645 1642 3616391.33226 +1646 1642 282147616.269 +1647 1642 177576398.508 +1650 1642 -267889477.1 +1651 1642 105138.285072 +1652 1642 51068.1292996 +1653 1642 -5657347.90122 +1654 1642 3741313.67444 +1655 1642 3616391.33226 +1656 1642 282147616.269 +1657 1642 -129957416.35 +1702 1642 -67483955.46 +1703 1642 25636289.8692 +1709 1642 -37135.9541678 +1710 1642 -3653495.4312 +1711 1642 -91859776.3355 +1712 1642 -6325489.22387 +1713 1642 -51131286.8839 +1714 1642 -88207.5020468 +1715 1642 2901.10999862 +1716 1642 -12395.2892082 +1717 1642 47128.30865 +1718 1642 -46295.5833745 +1722 1642 34547596.196 +1723 1642 -41283886.396 +1724 1642 -88207.5020468 +1725 1642 -6014.20800831 +1726 1642 -2966.57161425 +1727 1642 -24789.7956864 +1728 1642 94256.6173 +1729 1642 46295.3932399 +1735 1642 -18568.7601425 +1736 1642 -87818.5227136 +1643 1643 4056453667.68 +1644 1643 -1384293741.22 +1645 1643 -53039875.8077 +1646 1643 -3616391.33226 +1647 1643 43509.2819163 +1650 1643 -126217597.552 +1651 1643 -413377.630881 +1652 1643 112220000.931 +1653 1643 668024671.607 +1654 1643 -112244907.88 +1655 1643 -53039875.8077 +1656 1643 -3616391.33226 +1657 1643 -42549.1878212 +1702 1643 25636289.8692 +1703 1643 -99411561.3761 +1709 1643 87301.9735067 +1710 1643 -395092.215041 +1711 1643 -6285140.44407 +1712 1643 -109041.744056 +1713 1643 -3486258.96796 +1714 1643 1293697.09305 +1715 1643 -42549.1878212 +1716 1643 47128.30865 +1717 1643 -100287.17808 +1718 1643 140000.095191 +1722 1643 -41203188.9294 +1723 1643 33843825.4891 +1724 1643 1293697.09305 +1725 1643 88207.5020468 +1726 1643 43509.2819163 +1727 1643 94256.6173 +1728 1643 -200573.573431 +1729 1643 -139999.531685 +1735 1643 43650.9402673 +1736 1643 139999.531442 +1644 1644 20812721342.6 +1645 1644 -10717783080.2 +1646 1644 -5550206218.2 +1650 1644 22431.9247326 +1651 1644 279999.064879 +1652 1644 -2660042274.84 +1653 1644 111964908.811 +1654 1644 -15505731464.6 +1704 1644 -678313428.471 +1705 1644 11313904071.6 +1709 1644 -78191.1414478 +1710 1644 5992447734.86 +1711 1644 -51121822.9153 +1712 1644 -3626258.5034 +1713 1644 -6662533496 +1716 1644 -46295.5786264 +1717 1644 140000.095678 +1718 1644 -86970.5145187 +1722 1644 3750777.68062 +1723 1644 115092.028165 +1724 1644 -839817406.158 +1725 1644 -15768304770.6 +1727 1644 -46295.397988 +1728 1644 139999.531198 +1729 1644 476339245.231 +1735 1644 -78191.4501587 +1736 1644 -173940.098102 +1645 1645 305945872319 +1646 1645 136002607876 +1647 1645 -266308.785854 +1652 1645 12329806374.9 +1653 1645 53039875.8077 +1655 1645 249230126.277 +1656 1645 16993133.0849 +1657 1645 19486.008721 +1704 1645 -5577350913.65 +1705 1645 10589589432.3 +1710 1645 -2840025783.02 +1711 1645 88207.5020468 +1712 1645 -1293697.09305 +1714 1645 -42245411.4185 +1715 1645 266308.785854 +1722 1645 -88207.5020468 +1723 1645 1293697.09305 +1724 1645 -56557759706.4 +1725 1645 -61267854363.9 +1726 1645 -19486.008721 +1729 1645 984199775.225 +1646 1646 5.8990841757e11 +1647 1646 28888092.4012 +1650 1646 -234049479.167 +1652 1646 4850149381.17 +1653 1646 3616391.33226 +1655 1646 16993133.0849 +1656 1646 1622810420.01 +1657 1646 -2342421.39521 +1704 1646 10589589432.3 +1705 1646 -217205212241 +1710 1646 10847501832.3 +1711 1646 6014.20800831 +1712 1646 -88207.5020468 +1714 1646 -2880397.76404 +1715 1646 18157.5987915 +1722 1646 -6014.20800831 +1723 1646 88207.5020468 +1724 1646 -61267854363.9 +1725 1646 2.2660480766e11 +1726 1646 -1328.60478962 +1729 1646 -9982808210.14 +1647 1647 1021743372.86 +1650 1647 -177579365.079 +1653 1647 -42549.1878212 +1655 1647 -19486.008721 +1656 1647 2342421.39521 +1657 1647 -688384317.999 +1711 1647 -2901.10999862 +1712 1647 42549.1878212 +1714 1647 266308.785854 +1715 1647 -697570.309005 +1722 1647 2966.57161425 +1723 1647 -43509.2819163 +1724 1647 19486.008721 +1725 1647 1328.60478962 +1726 1647 710431.07476 +1648 1648 243443083.926 +1649 1648 8.38190317154e-9 +1653 1648 -5657347.90122 +1654 1648 -3741313.67444 +1655 1648 -3616391.33226 +1656 1648 -282147616.269 +1657 1648 -129957416.35 +1711 1648 -91859776.3355 +1712 1648 -6325489.22387 +1713 1648 51131286.8839 +1714 1648 88207.5020468 +1715 1648 2901.10999862 +1716 1648 -12395.2892082 +1717 1648 47128.30865 +1718 1648 46295.5833745 +1719 1648 -111554.919228 +1720 1648 424154.77785 +1721 1648 -1.18743628263e-8 +1730 1648 113921246.599 +1731 1648 7412184.71489 +1732 1648 1.19209289551e-7 +1733 1648 -1080056.27455 +1734 1648 -3954.43839469 +1735 1648 -18568.7601425 +1736 1648 87818.5227136 +1737 1648 -167113.471738 +1738 1648 2.14204192162e-8 +1649 1649 433641.230095 +1653 1649 279999.069115 +1711 1649 -9463.96859533 +1712 1649 139999.535434 +1716 1649 46295.5786264 +1717 1649 -140000.095678 +1718 1649 -86970.5145187 +1719 1649 -7.45058059692e-9 +1720 1649 6.51925802231e-9 +1721 1649 111817.276865 +1730 1649 1.19619071484e-9 +1731 1649 -1.76951289177e-8 +1735 1649 78191.4501587 +1736 1649 -173940.098102 +1737 1649 -8.64677131176e-9 +1738 1649 223638.74294 +1650 1650 529204606.518 +1651 1650 -28184.6126262 +1652 1650 147000.102756 +1653 1650 -31430.5587833 +1656 1650 -234049479.167 +1657 1650 129960317.46 +1695 1650 -9298.47500667 +1696 1650 43709.4204715 +1697 1650 -41522.6301091 +1698 1650 -64579316.4894 +1699 1650 24179282.7009 +1702 1650 83031471.5327 +1703 1650 -2915572.57009 +1706 1650 -18596.1672868 +1707 1650 87418.8409431 +1708 1650 41522.459226 +1709 1650 -12593.0301057 +1710 1650 31977.2909564 +1711 1650 2492.53012511 +1712 1650 -36871.7474129 +1716 1650 -30998.8310339 +1717 1650 -6837.6908117 +1718 1650 -156545.65914 +1722 1650 -59484669.983 +1723 1650 -21337453.6256 +1727 1650 -61994.5334236 +1728 1650 -13675.3283642 +1729 1650 156545.023639 +1735 1650 -6296.90641785 +1736 1650 -31977.4238183 +1651 1651 826758.394616 +1652 1651 .00298768095672 +1653 1651 -206689.573347 +1695 1651 43709.4204715 +1696 1651 -100287.603024 +1697 1651 140000.094024 +1706 1651 87418.8409431 +1707 1651 -200574.423322 +1708 1651 -139999.532852 +1709 1651 -87302.2660667 +1710 1651 139999.53519 +1711 1651 6779.41207675 +1712 1651 -100287.160899 +1716 1651 -6837.6908117 +1717 1651 200573.631329 +1718 1651 -.00266296416521 +1722 1651 13558.7712409 +1723 1651 -200573.539067 +1727 1651 -13675.3283642 +1728 1651 401148.830384 +1729 1651 -.00266298744828 +1735 1651 -43651.1594896 +1736 1651 -140000.091685 +1652 1652 14394636539.1 +1653 1652 -1387780000.18 +1654 1652 -2388392857.14 +1695 1652 -41522.6253393 +1696 1652 140000.094186 +1697 1652 -86970.1163125 +1700 1652 -236042876.142 +1701 1652 11479859328.3 +1704 1652 720110471.625 +1705 1652 -23387080643.1 +1706 1652 -41522.4639959 +1707 1652 139999.53269 +1708 1652 495093765.319 +1709 1652 -41441.2643163 +1710 1652 523293753.014 +1711 1652 9464.00616503 +1712 1652 -140000.091199 +1716 1652 -156545.649595 +1717 1652 -.00266295392066 +1718 1652 -347879.419149 +1722 1652 9463.96861178 +1723 1652 -139999.535677 +1724 1652 -634383521.356 +1725 1652 11792993166.5 +1727 1652 -156545.033185 +1728 1652 .0026629474014 +1729 1652 -1023577105.99 +1735 1652 -41441.4252353 +1736 1652 -86970.488746 +1653 1653 6665202313.23 +1654 1653 7.62939453125e-6 +1657 1653 87018.5638325 +1709 1653 43650.9402673 +1710 1653 3346259.43652 +1711 1653 12362029.3169 +1712 1653 808282.950949 +1713 1653 1.86264514923e-9 +1714 1653 2.30967998505e-7 +1715 1653 87018.5638325 +1716 1653 188513.2346 +1717 1653 -401147.146862 +1718 1653 1.49011611938e-8 +1719 1653 47128.30865 +1720 1653 -100287.17808 +1721 1653 140000.095191 +1722 1653 -6285140.44407 +1723 1653 -109041.744056 +1724 1653 -1293697.09305 +1725 1653 -88207.5020468 +1726 1653 -42549.1878212 +1727 1653 47128.30865 +1728 1653 -100287.17808 +1729 1653 -140000.095191 +1730 1653 -6285140.44407 +1731 1653 -109041.744056 +1732 1653 -3486258.96796 +1733 1653 1293697.09305 +1734 1653 -42549.1878212 +1735 1653 174603.947013 +1736 1653 -4.37721610069e-8 +1737 1653 43650.9402673 +1738 1653 139999.531442 +1654 1654 34472957918.1 +1710 1654 -6662533496 +1711 1654 2.98023223877e-8 +1712 1654 1.86264514923e-9 +1713 1654 13292143431.7 +1722 1654 51131286.8839 +1723 1654 3486258.96796 +1730 1654 -51131286.8839 +1731 1654 -3486258.96796 +1732 1654 -6662533496 +1655 1655 774667450.226 +1656 1655 52818763.425 +1714 1655 53271409.2092 +1715 1655 -1.39698386192e-9 +1722 1655 -88207.5020468 +1723 1655 1293697.09305 +1724 1655 -42245411.4185 +1725 1655 -2880397.76404 +1726 1655 -266308.785854 +1730 1655 88207.5020468 +1731 1655 -1293697.09305 +1733 1655 -42245411.4185 +1734 1655 266308.785854 +1656 1656 3597351315.34 +1657 1656 -8.34465026855e-7 +1714 1656 3632177.8584 +1715 1656 -9.45874489844e-11 +1722 1656 -6014.20800831 +1723 1656 88207.5020468 +1724 1656 -2880397.76404 +1725 1656 -196392.720547 +1726 1656 -18157.5987915 +1730 1656 6014.20800831 +1731 1656 -88207.5020468 +1733 1656 -2880397.76404 +1734 1656 18157.5987915 +1657 1657 2043486745.73 +1711 1657 5933.14322851 +1712 1657 -87018.5638325 +1714 1657 -2.32830643654e-10 +1715 1657 1420862.14952 +1722 1657 -2901.10999862 +1723 1657 42549.1878212 +1724 1657 -266308.785854 +1725 1657 -18157.5987915 +1726 1657 -697570.309005 +1730 1657 -2901.10999862 +1731 1657 42549.1878212 +1733 1657 266308.785854 +1734 1657 -697570.309005 +1658 1658 312298.868233 +1659 1658 -2.19717621803e-8 +1660 1658 -3652.27111767 +1661 1658 -54027.6792554 +1665 1658 157983.799464 +1666 1658 54027.4665236 +1667 1658 -1.3480335474e-8 +1668 1658 34698.6559514 +1669 1658 313.594349576 +1670 1658 -405.802357052 +1671 1658 -6002.99344751 +1682 1658 17553.1496303 +1683 1658 6003.10282731 +1684 1658 -8873.91051247 +1802 1658 -169916.040545 +1803 1658 3.81320714951e-9 +1807 1658 -10850.1726702 +1808 1658 -40633.7185402 +1809 1658 41598.2299375 +1817 1658 -97648.7802839 +1818 1658 -365703.654367 +1819 1658 1.11937522888e-8 +1820 1658 2746.83171265 +1821 1658 40633.6052167 +1825 1658 -18880.1791824 +1826 1658 87535.7603657 +1827 1658 24721.4631421 +1828 1658 365702.117486 +1659 1659 911542.758405 +1660 1659 -5.03659248352e-9 +1661 1659 -7.45058059692e-8 +1665 1659 -6.75208866596e-9 +1666 1659 5.30853867531e-8 +1667 1659 455763.976202 +1668 1659 -313.594349585 +1669 1659 -708972.29902 +1670 1659 -36436.27862 +1671 1659 -538998.204438 +1682 1659 27562.5230014 +1683 1659 539000.359971 +1684 1659 -354487.794621 +1802 1659 1.96913257241e-8 +1803 1659 231146.959868 +1807 1659 50352.4315243 +1808 1659 129500.088886 +1809 1659 -89890.4376584 +1817 1659 1.83936208487e-8 +1818 1659 4.56348061562e-8 +1819 1659 115571.73655 +1820 1659 -8754.17097664 +1821 1659 -129499.57066 +1825 1659 87385.2564527 +1826 1659 -179780.10048 +1827 1659 -2.92751938105e-9 +1828 1659 -4.33064997196e-8 +1660 1660 234128054.792 +1661 1660 -14397770.2585 +1662 1660 -9.53674316406e-7 +1663 1660 4158175.26769 +1664 1660 33.0546975402 +1665 1660 -11343.916552 +1666 1660 -221836.882973 +1667 1660 2.77012586594e-9 +1668 1660 -405.802357052 +1669 1660 36436.27862 +1670 1660 -175276811.425 +1671 1660 10776470.7918 +1672 1660 -.360276252031 +1673 1660 7158808.63536 +1674 1660 3.74194014995 +1682 1660 -1260.43727217 +1683 1660 -24648.624605 +1684 1660 36436.4243024 +1802 1660 -26383.966544 +1803 1660 3.77744436264e-10 +1807 1660 -3126.076826 +1808 1660 -5610.02148942 +1809 1660 8754.20597824 +1817 1660 -28134.691434 +1818 1660 -50490.0058995 +1819 1660 2.07759439945e-9 +1820 1660 -85034562.3653 +1821 1660 5850242.75019 +1822 1660 51131291.8077 +1823 1660 -278914.862748 +1824 1660 -2897.36805847 +1825 1660 -2931.54936358 +1826 1660 8754.17067509 +1827 1660 104775734.566 +1828 1660 -7201055.05173 +1829 1660 -2.68220901489e-7 +1830 1660 999031.359292 +1831 1660 3987.49309224 +1661 1661 23970556.4911 +1662 1661 4.47034835815e-8 +1663 1661 60986570.5929 +1664 1661 486.014467075 +1665 1661 -167809.41645 +1666 1661 -3281610.69487 +1667 1661 4.09781932831e-8 +1668 1661 -6002.99344751 +1669 1661 538998.204438 +1670 1661 10776470.7918 +1671 1661 -17953546.0013 +1672 1661 -5.28405670915 +1673 1661 104995891.273 +1674 1661 53.9968895216 +1682 1661 -18645.5217776 +1683 1661 -364624.624334 +1684 1661 539000.359503 +1802 1661 -390295.363078 +1803 1661 5.58793544769e-9 +1807 1661 -46243.7400296 +1808 1661 -82988.4835713 +1809 1661 129500.088435 +1817 1661 -416193.660266 +1818 1661 -746893.578394 +1819 1661 3.07336449623e-8 +1820 1661 5850242.75019 +1821 1661 371760.24513 +1822 1661 -3486186.75252 +1823 1661 -4090795.54511 +1824 1661 -42495.1909317 +1825 1661 -43366.1148459 +1826 1661 129499.5662 +1827 1661 -7201055.05173 +1828 1661 -343510.783096 +1829 1661 2.04890966415e-8 +1830 1661 14652618.343 +1831 1661 58483.8642774 +1662 1662 33015877552.3 +1670 1662 .360276550055 +1671 1662 5.28405668959 +1672 1662 -25601934696.8 +1820 1662 51131291.8077 +1821 1662 -3486186.75252 +1822 1662 -6164127578.15 +1827 1662 3.27825546265e-7 +1828 1662 -2.32830643654e-8 +1829 1662 7873824093.84 +1663 1663 1725865895.43 +1664 1663 1.11758708954e-8 +1670 1663 -7158808.63536 +1671 1663 -104995891.273 +1673 1663 497130548.956 +1674 1663 -.00187644618563 +1820 1663 278914.862748 +1821 1663 4090795.54511 +1823 1663 -56439542.9974 +1824 1663 -266308.811499 +1827 1663 999031.359292 +1828 1663 14652618.343 +1830 1663 -377613505.496 +1831 1663 1.86264514923e-9 +1664 1664 5056039.74502 +1670 1664 3.74194014991 +1671 1664 53.9968895211 +1673 1664 .00187643850222 +1674 1664 -3789732.43648 +1820 1664 2897.36805847 +1821 1664 42495.1909317 +1823 1664 -266308.811499 +1824 1664 -644583.365458 +1827 1664 -3987.49309224 +1828 1664 -58483.8642774 +1830 1664 -7.79982656241e-9 +1831 1664 876419.293483 +1665 1665 632352.848091 +1666 1665 223746.250572 +1667 1665 -4.37721610069e-8 +1668 1665 17553.1496303 +1669 1665 -27562.5230014 +1670 1665 -1260.43727217 +1671 1665 -18645.5217776 +1682 1665 70259.0020551 +1683 1665 24860.6943294 +1684 1665 -.00914756720886 +1692 1665 154266.277455 +1693 1665 -55936.7873031 +1694 1665 -1.55996531248e-8 +1695 1665 17140.0909436 +1696 1665 -6215.20896688 +1697 1665 9187.50153679 +1793 1665 -10919.7042111 +1794 1665 -43414.641943 +1795 1665 45937.5328783 +1796 1665 -98274.5641631 +1797 1665 -390731.777487 +1798 1665 1.07102096081e-8 +1802 1665 -71435.8405847 +1803 1665 -1.39698386192e-9 +1807 1665 -37564.1436431 +1808 1665 5658.3442591 +1809 1665 174920.671033 +1817 1665 -338066.20586 +1818 1665 50924.9095949 +1819 1665 2.74740159512e-8 +1820 1665 2552.32696385 +1821 1665 37756.3160333 +1825 1665 -7937.62381469 +1826 1665 37108.0770763 +1827 1665 22970.9426747 +1828 1665 339806.8443 +1666 1666 6563249.51087 +1667 1666 -1.22934579849e-7 +1668 1666 6003.10282731 +1669 1666 -539000.359971 +1670 1666 -24648.624605 +1671 1666 -364624.624334 +1682 1666 24860.6943294 +1683 1666 729247.514906 +1684 1666 .000937772914767 +1692 1666 -55936.7873031 +1693 1666 -3281631.48229 +1694 1666 4.56348061562e-8 +1695 1666 -6215.20896688 +1696 1666 -364626.93545 +1697 1666 539000.359659 +1793 1666 -43414.641943 +1794 1666 -82988.821206 +1795 1666 129500.0871 +1796 1666 -390731.777487 +1797 1666 -746896.617117 +1798 1666 2.46800482273e-8 +1802 1666 390296.839746 +1803 1666 -1.30385160446e-8 +1807 1666 5658.3442591 +1808 1666 165976.100402 +1809 1666 -.0029755900614 +1817 1666 50924.9095949 +1818 1666 1493790.45914 +1819 1666 -3.77185642719e-8 +1820 1666 -5610.02032793 +1821 1666 -82988.4663895 +1825 1666 43366.3363612 +1826 1666 -129500.084425 +1827 1666 -50489.995446 +1828 1666 -746893.423758 +1667 1667 1823079.73065 +1668 1667 8873.91051247 +1669 1667 -354487.794621 +1670 1667 -36436.4243024 +1671 1667 -539000.359503 +1682 1667 .00914754811674 +1683 1667 -.000937816686928 +1684 1667 -1417940.10884 +1692 1667 -6.28642737865e-9 +1693 1667 5.86733222008e-8 +1694 1667 455761.099831 +1695 1667 9187.51072697 +1696 1667 539000.359815 +1697 1667 -354485.546307 +1793 1667 45937.5284659 +1794 1667 129500.087251 +1795 1667 -89890.0687338 +1796 1667 1.39698386192e-8 +1797 1667 4.61004674435e-8 +1798 1667 115571.315455 +1802 1667 1.44802033901e-9 +1803 1667 115571.852528 +1807 1667 174920.662203 +1808 1667 -.00297559052706 +1809 1667 -359559.482123 +1817 1667 2.79396772385e-8 +1818 1667 -1.76951289177e-8 +1819 1667 462292.991987 +1820 1667 -8754.20567669 +1821 1667 -129500.083975 +1825 1667 45862.2783615 +1826 1667 -89890.4118855 +1827 1667 -1.44802033901e-9 +1828 1667 -2.14204192162e-8 +1668 1668 138801.019864 +1669 1668 -1.6887485981e-8 +1670 1668 -1623.23853899 +1671 1668 -24012.4044229 +1675 1668 -405.802357052 +1676 1668 -6002.99344751 +1680 1668 34698.6559514 +1681 1668 313.594349576 +1682 1668 70215.779316 +1683 1668 24012.1436046 +1684 1668 -9.51625406742e-9 +1689 1668 17553.1496303 +1690 1668 6003.10282731 +1691 1668 -8873.91051247 +1802 1668 -18880.1791824 +1803 1668 -87535.7603657 +1804 1668 -10850.1726702 +1805 1668 -40633.7185402 +1806 1668 41598.2299375 +1807 1668 -43399.0726612 +1808 1668 -162534.983539 +1809 1668 1.2319907546e-8 +1810 1668 2746.83171265 +1811 1668 40633.6052167 +1815 1668 -18880.1791824 +1816 1668 87535.7603657 +1817 1668 -10850.1726702 +1818 1668 -40633.7185402 +1819 1668 -41598.2299375 +1820 1668 10987.3138587 +1821 1668 162534.22868 +1825 1668 -75517.4663401 +1826 1668 4.49270009995e-9 +1827 1668 2746.83171265 +1828 1668 40633.6052167 +1669 1669 1417949.39978 +1670 1669 -4.53293323517e-9 +1671 1669 -6.70552253723e-8 +1675 1669 -36436.27862 +1676 1669 -538998.204438 +1680 1669 -313.594349586 +1681 1669 -708972.29902 +1682 1669 -6.51925802231e-9 +1683 1669 5.40167093277e-8 +1684 1669 708971.409669 +1689 1669 27562.5230014 +1690 1669 539000.359971 +1691 1669 -354487.794621 +1802 1669 -87385.2564527 +1803 1669 -179780.10048 +1804 1669 50352.4315243 +1805 1669 129500.088886 +1806 1669 -89890.4376584 +1807 1669 1.53668224812e-8 +1808 1669 4.19095158577e-8 +1809 1669 179779.711556 +1810 1669 -8754.17097664 +1811 1669 -129499.57066 +1815 1669 87385.2564527 +1816 1669 -179780.10048 +1817 1669 -50352.4315243 +1818 1669 -129500.088886 +1819 1669 -89890.4376583 +1820 1669 -3.02195549011e-9 +1821 1669 -4.47034835815e-8 +1825 1669 1.93201005459e-8 +1826 1669 359560.972787 +1827 1669 8754.17097664 +1828 1669 129499.57066 +1670 1670 355678588.242 +1671 1670 -21753782.9386 +1672 1670 -2.38418579102e-7 +1673 1670 -1.49011611938e-8 +1674 1670 14.6044817113 +1675 1670 -175276811.425 +1676 1670 10776470.7918 +1677 1670 7158808.63536 +1678 1670 -488100.443378 +1679 1670 3.74194014995 +1680 1670 -405.802357052 +1681 1670 36435.9183438 +1682 1670 -5041.73806512 +1683 1670 -98594.0676449 +1684 1670 3.46265733242e-9 +1689 1670 -1260.43727217 +1690 1670 -24648.624605 +1691 1670 36436.4243024 +1802 1670 -2931.54936358 +1803 1670 -8754.17067509 +1804 1670 -3126.076826 +1805 1670 -5610.02148942 +1806 1670 8754.20597824 +1807 1670 -12504.307304 +1808 1670 -22439.9765796 +1809 1670 2.5812536478e-9 +1810 1670 -85034562.3653 +1811 1670 5850242.75019 +1812 1670 -278914.862748 +1813 1670 19016.7168717 +1814 1670 -2897.36805847 +1815 1670 -2931.54936358 +1816 1670 51140045.9784 +1817 1670 -3126.076826 +1818 1670 -5610.02148942 +1819 1670 -8754.20597824 +1820 1670 167414273.538 +1821 1670 -11485668.0135 +1822 1670 -1.49011611939e-7 +1823 1670 7.45058059692e-9 +1824 1670 5947.74771022 +1825 1670 -11726.2104462 +1826 1670 6.2957406044e-10 +1827 1670 -85034562.3653 +1828 1670 5850242.75019 +1829 1670 -51131291.8077 +1830 1670 278914.862748 +1831 1670 -2897.36805847 +1671 1671 38118828.5268 +1672 1671 1.49011611938e-8 +1673 1671 -2.38418579102e-7 +1674 1671 216.012327229 +1675 1671 10776470.7918 +1676 1671 -17953546.0013 +1677 1671 104995891.273 +1678 1671 -7158808.63536 +1679 1671 53.9968895216 +1680 1671 -6002.99344751 +1681 1671 538992.920382 +1682 1671 -74581.9240403 +1683 1671 -1458492.12493 +1684 1671 5.12227416039e-8 +1689 1671 -18645.5217776 +1690 1671 -364624.624334 +1691 1671 539000.359503 +1802 1671 -43366.1148459 +1803 1671 -129499.5662 +1804 1671 -46243.7400296 +1805 1671 -82988.4835713 +1806 1671 129500.088435 +1807 1671 -184974.960118 +1808 1671 -331952.316266 +1809 1671 3.81842255592e-8 +1810 1671 5850242.75019 +1811 1671 371760.24513 +1812 1671 -4090795.54511 +1813 1671 278914.862748 +1814 1671 -42495.1909317 +1815 1671 -43366.1148459 +1816 1671 -3356687.18632 +1817 1671 -46243.7400296 +1818 1671 -82988.4835713 +1819 1671 -129500.088435 +1820 1671 -11485668.0135 +1821 1671 -258064.420359 +1822 1671 1.02445483208e-8 +1823 1671 1.19209289551e-7 +1824 1671 87234.5761598 +1825 1671 -173464.651571 +1826 1671 9.31322574615e-9 +1827 1671 5850242.75019 +1828 1671 371760.24513 +1829 1671 3486186.75252 +1830 1671 4090795.54511 +1831 1671 -42495.1909317 +1672 1672 51272385995.6 +1675 1672 .360276550055 +1676 1672 5.28405668959 +1681 1672 -25601934696.8 +1810 1672 51131291.8077 +1811 1672 -3486186.75252 +1816 1672 -6164127578.15 +1820 1672 3.27825546265e-7 +1821 1672 -2.23517417908e-8 +1822 1672 12292662114.7 +1827 1672 -51131291.8077 +1828 1672 3486186.75252 +1829 1672 -6164127578.15 +1673 1673 1525995498.68 +1674 1673 3.72529029846e-9 +1675 1673 -7158808.63536 +1676 1673 -104995891.273 +1677 1673 497130548.956 +1678 1673 -33895251.9036 +1679 1673 -.00187644618563 +1810 1673 278914.862748 +1811 1673 4090795.54511 +1812 1673 -56439542.9974 +1813 1673 3848109.05729 +1814 1673 -266308.811499 +1820 1673 -1.67638063431e-8 +1821 1673 -2.23517417908e-7 +1823 1673 14515470.2699 +1824 1673 -1.16415321827e-9 +1827 1673 -278914.862748 +1828 1673 -4090795.54511 +1830 1673 -56439542.9974 +1831 1673 266308.811499 +1674 1674 7686522.06352 +1675 1674 3.74194014991 +1676 1674 53.9968895211 +1677 1674 .00187643850222 +1678 1674 .0275211287226 +1679 1674 -3789732.43648 +1810 1674 2897.36805847 +1811 1674 42495.1909317 +1812 1674 -266308.811499 +1813 1674 18157.2226694 +1814 1674 -644583.365458 +1820 1674 -5947.74771022 +1821 1674 -87234.5761598 +1823 1674 -4.7730281949e-9 +1824 1674 1316973.79469 +1827 1674 2897.36805847 +1828 1674 42495.1909317 +1830 1674 266308.811499 +1831 1674 -644583.365458 +1675 1675 472499938.228 +1676 1675 -45721947.2977 +1677 1675 -7158808.63536 +1678 1675 488100.443378 +1679 1675 7.30224085561 +1680 1675 -811.619269495 +1681 1675 36441.3480492 +1682 1675 -1260.43727217 +1683 1675 -24648.624605 +1684 1675 -36436.4243024 +1685 1675 -87001625.4739 +1686 1675 -11526437.44 +1689 1675 -2520.86903256 +1690 1675 -49297.0338225 +1691 1675 36436.2785884 +1759 1675 -59330252.8804 +1760 1675 -25352210.3251 +1804 1675 -6252.153652 +1805 1675 -11219.9882898 +1806 1675 8754.17069031 +1807 1675 -3126.076826 +1808 1675 -5610.02148942 +1809 1675 -8754.20597824 +1810 1675 82510603.279 +1811 1675 1278312.46013 +1812 1675 278914.862748 +1813 1675 -19016.7168717 +1814 1675 2973.87385511 +1815 1675 -5863.1052231 +1816 1675 -3732559.82872 +1820 1675 -85034562.3653 +1821 1675 5850242.75019 +1822 1675 -51131291.8077 +1823 1675 278914.862748 +1824 1675 -2897.36805847 +1825 1675 -2931.54936358 +1826 1675 -8754.17067509 +1676 1676 567500199.48 +1677 1676 -104995891.273 +1678 1676 7158808.63536 +1679 1676 108.006163614 +1680 1676 -12006.2022115 +1681 1676 539072.574476 +1682 1676 -18645.5217776 +1683 1676 -364624.624334 +1684 1676 -539000.359503 +1685 1676 -11526437.44 +1686 1676 -329975223.313 +1689 1676 -37290.9620201 +1690 1676 -729246.062463 +1691 1676 538998.20397 +1759 1676 -25352210.3251 +1760 1676 -84194473.367 +1804 1676 -92487.4800592 +1805 1676 -165976.158133 +1806 1676 129499.566425 +1807 1676 -46243.7400296 +1808 1676 -82988.4835713 +1809 1676 -129500.088435 +1810 1676 1278312.46013 +1811 1676 73466427.5527 +1812 1676 4090795.54511 +1813 1676 -278914.862748 +1814 1676 43617.2880799 +1815 1676 -86732.3257856 +1816 1676 384586.924211 +1820 1676 5850242.75019 +1821 1676 371760.24513 +1822 1676 3486186.75252 +1823 1676 4090795.54511 +1824 1676 -42495.1909317 +1825 1676 -43366.1148459 +1826 1676 -129499.5662 +1677 1677 237325618002 +1678 1677 -18646124329.8 +1679 1677 -.0256446823478 +1681 1677 13412899768.4 +1687 1677 81214226992.5 +1688 1677 -22222948191.6 +1691 1677 -17713774992.3 +1761 1677 -11102972940.8 +1762 1677 -8464493606.95 +1806 1677 191992214.535 +1810 1677 278914.862748 +1811 1677 4090795.54511 +1812 1677 -40150497231.3 +1813 1677 21537901259.6 +1814 1677 -19486.0105974 +1816 1677 2335235783.96 +1820 1677 -278914.862748 +1821 1677 -4090795.54511 +1823 1677 -56439542.9974 +1824 1677 266308.811499 +1678 1678 640342730477 +1679 1678 -.376122090849 +1681 1678 546895227.576 +1687 1678 -22222948191.6 +1688 1678 -411743396682 +1691 1678 396274130.581 +1761 1678 -8464493606.95 +1762 1678 -179469739173 +1806 1678 -9045776145.13 +1810 1678 -19016.7168717 +1811 1678 -278914.862748 +1812 1678 21537901259.6 +1813 1678 260672275794 +1814 1678 1328.57726849 +1816 1678 12682694665.8 +1820 1678 19016.7168717 +1821 1678 278914.862748 +1823 1678 3848109.05729 +1824 1678 -18157.2226694 +1679 1679 3843261.03176 +1810 1679 -2973.87385511 +1811 1679 -43617.2880799 +1812 1679 19486.0105974 +1813 1679 -1328.57726849 +1814 1679 658486.897344 +1820 1679 2897.36805847 +1821 1679 42495.1909317 +1823 1679 266308.811499 +1824 1679 -644583.365458 +1680 1680 69400.5099318 +1681 1680 313.604814624 +1682 1680 17553.1496303 +1683 1680 6003.10282731 +1684 1680 8873.91051247 +1689 1680 35107.889658 +1690 1680 12006.0718023 +1691 1680 -8873.86583706 +1804 1680 -21699.5363306 +1805 1680 -81267.4917694 +1806 1680 41598.0591961 +1807 1680 -10850.1726702 +1808 1680 -40633.7185402 +1809 1680 -41598.2299375 +1810 1680 5493.65692937 +1811 1680 81267.1143398 +1815 1680 -37758.73317 +1816 1680 87535.4063366 +1820 1680 2746.83171265 +1821 1680 40633.6052167 +1825 1680 -18880.1791824 +1826 1680 -87535.7603657 +1681 1681 30235996614.2 +1682 1681 -27562.5230014 +1683 1681 -539000.359971 +1684 1681 -354487.794621 +1687 1681 17696387274.4 +1688 1681 -408245039.462 +1689 1681 -27562.4035398 +1690 1681 -538998.203501 +1691 1681 -4055839531.22 +1761 1681 -475897373.39 +1762 1681 10034564230.9 +1804 1681 -50352.2342779 +1805 1681 -129499.565974 +1806 1681 644393129.353 +1807 1681 -50352.4315243 +1808 1681 -129500.088886 +1809 1681 -89890.4376583 +1810 1681 3750068.2404 +1811 1681 -125586.751351 +1812 1681 627451006.366 +1813 1681 -15370970069.9 +1815 1681 -87384.9106508 +1816 1681 5128334361.8 +1820 1681 -51122537.6367 +1821 1681 3615686.32318 +1822 1681 -6164127578.15 +1825 1681 -87385.2564527 +1826 1681 -179780.10048 +1682 1682 281048.742151 +1683 1682 99442.7782555 +1684 1682 -3.81842255592e-8 +1689 1682 70259.0020551 +1690 1682 24860.6943294 +1691 1682 -.00914756814018 +1692 1682 17140.0909436 +1693 1682 -6215.20896688 +1694 1682 -9187.50153679 +1695 1682 68563.5481692 +1696 1682 -24860.7813849 +1697 1682 -1.210719347e-8 +1706 1682 17140.0909436 +1707 1682 -6215.20896688 +1708 1682 9187.50153679 +1793 1682 -43677.1988313 +1794 1682 -173658.567772 +1795 1682 1.02445483208e-8 +1796 1682 -10919.7042111 +1797 1682 -43414.641943 +1798 1682 -45937.5328783 +1799 1682 -10919.7042111 +1800 1682 -43414.641943 +1801 1682 45937.5328783 +1802 1682 -7937.62381469 +1803 1682 -37108.0770763 +1804 1682 -37564.1436431 +1805 1682 5658.3442591 +1806 1682 174920.671033 +1807 1682 -150250.107198 +1808 1682 22633.2669398 +1809 1682 2.60770320892e-8 +1810 1682 2552.32696385 +1811 1682 37756.3160333 +1815 1682 -7937.62381469 +1816 1682 37108.0770763 +1817 1682 -37564.1436431 +1818 1682 5658.3442591 +1819 1682 -174920.671033 +1820 1682 10209.3078554 +1821 1682 151025.264133 +1825 1682 -31748.8772394 +1826 1682 -1.86264514923e-9 +1827 1682 2552.32696385 +1828 1682 37756.3160333 +1683 1683 2917002.82104 +1684 1683 -1.28522515297e-7 +1689 1683 24860.6943294 +1690 1683 729247.514906 +1691 1683 .000937763601541 +1692 1683 -6215.20896688 +1693 1683 -364626.93545 +1694 1683 -539000.359659 +1695 1683 -24860.7813849 +1696 1683 -1458501.36202 +1697 1683 7.17118382454e-8 +1706 1683 -6215.20896688 +1707 1683 -364626.93545 +1708 1683 539000.359659 +1793 1683 -173658.567772 +1794 1683 -331953.666811 +1795 1683 2.74740159512e-8 +1796 1683 -43414.641943 +1797 1683 -82988.821206 +1798 1683 -129500.0871 +1799 1683 -43414.641943 +1800 1683 -82988.821206 +1801 1683 129500.0871 +1802 1683 43366.3363612 +1803 1683 129500.084425 +1804 1683 5658.3442591 +1805 1683 165976.100402 +1806 1683 -.00297559145838 +1807 1683 22633.2669398 +1808 1683 663907.642328 +1809 1683 -3.44589352608e-8 +1810 1683 -5610.02032793 +1811 1683 -82988.4663895 +1815 1683 43366.3363612 +1816 1683 -129500.084425 +1817 1683 5658.3442591 +1818 1683 165976.100402 +1819 1683 .00297558121383 +1820 1683 -22439.9719336 +1821 1683 -331952.247538 +1825 1683 173465.236067 +1826 1683 -1.210719347e-8 +1827 1683 -5610.02032793 +1828 1683 -82988.4663895 +1684 1684 2835889.81126 +1689 1684 .00914754671976 +1690 1684 -.000937828794122 +1691 1684 -1417940.10884 +1692 1684 -9187.51072697 +1693 1684 -539000.359815 +1694 1684 -354485.546307 +1695 1684 -6.053596735e-9 +1696 1684 7.17118382454e-8 +1697 1684 708966.922941 +1706 1684 9187.51072697 +1707 1684 539000.359815 +1708 1684 -354485.546307 +1793 1684 1.2805685401e-8 +1794 1684 4.09781932831e-8 +1795 1684 179779.010513 +1796 1684 -45937.5284659 +1797 1684 -129500.087251 +1798 1684 -89890.0687338 +1799 1684 45937.5284659 +1800 1684 129500.087251 +1801 1684 -89890.0687338 +1802 1684 -45862.2783615 +1803 1684 -89890.4118855 +1804 1684 174920.662203 +1805 1684 -.00297559425235 +1806 1684 -359559.482123 +1807 1684 2.60770320892e-8 +1808 1684 -2.65426933765e-8 +1809 1684 719120.505461 +1810 1684 -8754.20567669 +1811 1684 -129500.083975 +1815 1684 45862.2783615 +1816 1684 -89890.4118855 +1817 1684 -174920.662203 +1818 1684 .00297558587044 +1819 1684 -359559.482123 +1820 1684 -1.35358422995e-9 +1821 1684 -2.00234353542e-8 +1825 1684 4.22261655331e-10 +1826 1684 179779.763102 +1827 1684 8754.20567669 +1828 1684 129500.083975 +1685 1685 269758326.83 +1686 1685 15367494.3354 +1698 1685 -86263009.3631 +1699 1685 -3841056.89545 +1751 1685 -56459948.3926 +1752 1685 -24084668.1185 +1759 1685 57669270.6423 +1760 1685 2536878.44364 +1810 1685 -51335915.493 +1811 1685 21547789.6749 +1686 1686 698263039.603 +1698 1686 -3841056.89545 +1699 1686 -329690339.493 +1751 1686 -24084668.1185 +1752 1686 -83047478.5659 +1759 1686 2536878.44364 +1760 1686 143993579.681 +1810 1686 21547789.6749 +1811 1686 -80996738.412 +1687 1687 257778515393 +1688 1687 23974333267.2 +1691 1687 -41529987.2491 +1700 1687 82115058570.3 +1701 1687 -7409615188.36 +1708 1687 -17681613521.6 +1753 1687 -10592055916.8 +1754 1687 -1801487504.44 +1761 1687 -2144486303.58 +1762 1687 10868362487.3 +1801 1687 548451863.563 +1806 1687 566962004.68 +1812 1687 -10894054257.1 +1813 1687 -11528626940.3 +1816 1687 -1248481541.62 +1688 1688 849067741337 +1691 1688 150156730.779 +1700 1688 -7409615188.36 +1701 1688 -411913959063 +1708 1688 128479498.622 +1753 1688 -1801487504.44 +1754 1688 -179402628058 +1761 1688 10868362487.3 +1762 1688 365501592424 +1801 1688 -9162809579.15 +1806 1688 19105295062.3 +1812 1688 -11528626940.3 +1813 1688 -178947442463 +1816 1688 -9378893087.08 +1689 1689 140524.371075 +1690 1689 49721.3891277 +1691 1689 .00914754113182 +1695 1689 17140.0909436 +1696 1689 -6215.20896688 +1697 1689 -9187.5015368 +1706 1689 34281.7740846 +1707 1689 -12430.3906924 +1708 1689 9187.47397694 +1793 1689 -10919.7042111 +1794 1689 -43414.641943 +1795 1689 -45937.5328783 +1799 1689 -21838.5994157 +1800 1689 -86829.283886 +1801 1689 45937.3446904 +1804 1689 -75125.053599 +1805 1689 11316.6334699 +1806 1689 174919.962774 +1807 1689 -37564.1436431 +1808 1689 5658.3442591 +1809 1689 -174920.671033 +1810 1689 5104.6539277 +1811 1689 75512.6320666 +1815 1689 -15874.4386197 +1816 1689 37107.9240244 +1820 1689 2552.32696385 +1821 1689 37756.3160333 +1825 1689 -7937.62381469 +1826 1689 -37108.0770763 +1690 1690 1458501.41052 +1691 1690 -.000937824137509 +1695 1690 -6215.20896688 +1696 1690 -364626.93545 +1697 1690 -539000.359659 +1706 1690 -12430.3906924 +1707 1690 -729250.681011 +1708 1690 538998.203814 +1793 1690 -43414.641943 +1794 1690 -82988.821206 +1795 1690 -129500.0871 +1799 1690 -86829.283886 +1800 1690 -165976.833406 +1801 1690 129499.56776 +1804 1690 11316.6334699 +1805 1690 331953.821164 +1806 1690 .00297556491569 +1807 1690 5658.3442591 +1808 1690 165976.100402 +1809 1690 .0029755779542 +1810 1690 -11219.9859668 +1811 1690 -165976.123769 +1815 1690 86732.6180334 +1816 1690 -129499.570435 +1820 1690 -5610.02032793 +1821 1690 -82988.4663895 +1825 1690 43366.3363612 +1826 1690 129500.084425 +1691 1691 8161977887.41 +1695 1691 -9187.51072697 +1696 1691 -539000.359815 +1697 1691 -354485.546307 +1700 1691 17675875539.3 +1701 1691 -139098590.961 +1706 1691 -9187.46478677 +1707 1691 -538998.203657 +1708 1691 -4048925474.76 +1753 1691 -866214255.627 +1754 1691 10155931302 +1761 1691 -643460732.026 +1762 1691 -20868680160.2 +1793 1691 -45937.5284659 +1794 1691 -129500.087251 +1795 1691 -89890.0687338 +1799 1691 -45937.3491027 +1800 1691 -129499.56761 +1801 1691 658877384.35 +1804 1691 -174919.971603 +1805 1691 -.00297558913007 +1806 1691 -1357396123.78 +1807 1691 -174920.662203 +1808 1691 .00297558261082 +1809 1691 -359559.482123 +1810 1691 8754.17099186 +1811 1691 129499.570885 +1812 1691 1634096013.31 +1813 1691 10379082340.7 +1815 1691 -45862.0994077 +1816 1691 681022051.096 +1820 1691 8754.20567669 +1821 1691 129500.083975 +1825 1691 -45862.2783615 +1826 1691 -89890.4118855 +1692 1692 624722.518691 +1693 1692 -2.60770320892e-8 +1694 1692 -3.30619513988e-8 +1695 1692 69411.1876885 +1696 1692 -2.79396772385e-9 +1697 1692 -.00917950971052 +1716 1692 17140.0909436 +1717 1692 6215.20896688 +1718 1692 -9187.51072697 +1719 1692 154266.277455 +1720 1692 55936.7873031 +1721 1692 -1.11758708954e-8 +1784 1692 -8055.97765341 +1785 1692 -40585.4141199 +1786 1692 41522.6299317 +1790 1692 -72501.0251442 +1791 1692 -365268.727079 +1792 1692 2.02562659979e-8 +1793 1692 -37756.9629924 +1795 1692 174920.321134 +1796 1692 -339801.573597 +1797 1692 1.67638063431e-8 +1798 1692 1.8160790205e-8 +1807 1692 -8055.97765341 +1808 1692 40585.4141199 +1809 1692 41522.6299317 +1817 1692 -72501.0251442 +1818 1692 365268.727079 +1693 1693 6563270.29985 +1694 1693 -1.68569386005e-7 +1695 1693 -6.98491930962e-10 +1696 1693 729249.824795 +1697 1693 -3.53902578354e-8 +1716 1693 6215.20896688 +1717 1693 -364626.93545 +1718 1693 539000.359815 +1719 1693 55936.7873031 +1720 1693 -3281631.48229 +1721 1693 9.03382897377e-8 +1784 1693 -40585.4141199 +1785 1693 -82988.8154785 +1786 1693 129500.08576 +1790 1693 -365268.727079 +1791 1693 -746896.56557 +1792 1693 4.65661287308e-8 +1794 1693 165976.444391 +1795 1693 -7.91624188423e-9 +1796 1693 2.23517417908e-8 +1797 1693 1493793.5486 +1798 1693 -4.42378222942e-8 +1807 1693 40585.4141199 +1808 1693 -82988.8154785 +1809 1693 -129500.08576 +1817 1693 365268.727079 +1818 1693 -746896.56557 +1819 1693 -1.67638063431e-8 +1694 1694 1823073.9445 +1695 1694 .00917949061841 +1696 1694 -3.35276126862e-8 +1697 1694 -1417935.61964 +1716 1694 -9187.5015368 +1717 1694 539000.359659 +1718 1694 -354485.546307 +1719 1694 -1.83936208487e-8 +1720 1694 9.31322574615e-8 +1721 1694 455761.099831 +1784 1694 41522.6255194 +1785 1694 129500.08561 +1786 1694 -89890.0601427 +1790 1694 1.90921127796e-8 +1791 1694 5.91389834881e-8 +1792 1694 115571.354116 +1793 1694 174920.312304 +1794 1694 -1.25728547573e-8 +1795 1694 -359558.763287 +1796 1694 3.44589352608e-8 +1797 1694 -3.86498868465e-8 +1798 1694 462292.064238 +1807 1694 41522.6255194 +1808 1694 -129500.08561 +1809 1694 -89890.0601426 +1817 1694 2.32830643654e-10 +1818 1694 -1.95577740669e-8 +1819 1694 115571.354116 +1695 1695 277657.484626 +1696 1695 -3.72529029846e-9 +1697 1695 -3.632158041e-8 +1706 1695 69411.1876885 +1707 1695 -6.98491930962e-10 +1708 1695 -.00917951297015 +1716 1695 68563.5481692 +1717 1695 24860.7813849 +1718 1695 -1.18743628263e-8 +1719 1695 17140.0909436 +1720 1695 6215.20896688 +1721 1695 9187.51072696 +1727 1695 17140.0909436 +1728 1695 6215.20896688 +1729 1695 -9187.51072697 +1784 1695 -32222.2926007 +1785 1695 -162341.65648 +1786 1695 2.04890966415e-8 +1787 1695 -8055.97765341 +1788 1695 -40585.4141199 +1789 1695 41522.6299317 +1790 1695 -8055.97765341 +1791 1695 -40585.4141199 +1792 1695 -41522.6299317 +1793 1695 -151021.380858 +1794 1695 5.58793544769e-9 +1795 1695 1.44354999065e-8 +1796 1695 -37756.9629924 +1797 1695 2.32830643654e-9 +1798 1695 -174920.321134 +1799 1695 -37756.9629924 +1800 1695 1.16415321827e-9 +1801 1695 174920.321134 +1804 1695 -8055.97765341 +1805 1695 40585.4141199 +1806 1695 41522.6299317 +1807 1695 -32222.2926007 +1808 1695 162341.65648 +1809 1695 -2.56113708019e-9 +1817 1695 -8055.97765341 +1818 1695 40585.4141199 +1819 1695 -41522.6299317 +1696 1696 2917012.06059 +1697 1696 -1.92783772945e-7 +1706 1696 -1.39698386192e-9 +1707 1696 729249.824795 +1708 1696 -4.47034835815e-8 +1716 1696 24860.7813849 +1717 1696 -1458501.36202 +1718 1696 1.01514160633e-7 +1719 1696 6215.20896688 +1720 1696 -364626.93545 +1721 1696 -539000.359815 +1727 1696 6215.20896688 +1728 1696 -364626.93545 +1729 1696 539000.359815 +1784 1696 -162341.65648 +1785 1696 -331953.643901 +1786 1696 4.56348061562e-8 +1787 1696 -40585.4141199 +1788 1696 -82988.8154785 +1789 1696 129500.08576 +1790 1696 -40585.4141199 +1791 1696 -82988.8154785 +1792 1696 -129500.08576 +1793 1696 5.58793544769e-9 +1794 1696 663909.014529 +1795 1696 -3.49245965481e-8 +1796 1696 3.95812094212e-9 +1797 1696 165976.444391 +1798 1696 -4.65661287308e-9 +1799 1696 9.31322574615e-10 +1800 1696 165976.444391 +1801 1696 -1.07102096081e-8 +1804 1696 40585.4141199 +1805 1696 -82988.8154785 +1806 1696 -129500.08576 +1807 1696 162341.65648 +1808 1696 -331953.643901 +1809 1696 -8.84756445885e-9 +1817 1696 40585.4141199 +1818 1696 -82988.8154785 +1819 1696 129500.08576 +1697 1697 2835880.82295 +1706 1697 .00917948875576 +1707 1697 -4.09781932831e-8 +1708 1697 -1417935.61964 +1716 1697 -1.58324837685e-8 +1717 1697 1.00582838059e-7 +1718 1697 708966.922941 +1719 1697 9187.50153679 +1720 1697 -539000.359659 +1721 1697 -354485.546307 +1727 1697 -9187.50153679 +1728 1697 539000.359659 +1729 1697 -354485.546307 +1784 1697 1.90921127796e-8 +1785 1697 5.91389834881e-8 +1786 1697 179779.027695 +1787 1697 41522.6255194 +1788 1697 129500.08561 +1789 1697 -89890.0601427 +1790 1697 -41522.6255193 +1791 1697 -129500.08561 +1792 1697 -89890.0601426 +1793 1697 3.07336449623e-8 +1794 1697 -5.07570803165e-8 +1795 1697 719119.065348 +1796 1697 -174920.312304 +1797 1697 -6.053596735e-9 +1798 1697 -359558.763287 +1799 1697 174920.312304 +1800 1697 -1.44354999065e-8 +1801 1697 -359558.763287 +1804 1697 41522.6255194 +1805 1697 -129500.08561 +1806 1697 -89890.0601426 +1807 1697 -1.16415321827e-9 +1808 1697 -1.53668224812e-8 +1809 1697 179779.027695 +1817 1697 -41522.6255194 +1818 1697 129500.08561 +1819 1697 -89890.0601426 +1698 1698 269019304.042 +1699 1698 -1.07288360596e-6 +1702 1698 -86263009.3631 +1703 1698 3841056.89545 +1747 1698 -53795098.843 +1748 1698 -22815331.8815 +1751 1698 57463815.704 +1752 1698 5.96046447754e-8 +1759 1698 -53795098.843 +1760 1698 22815331.8815 +1699 1699 697977993.111 +1702 1699 3841056.89545 +1703 1699 -329690339.493 +1747 1699 -22815331.8815 +1748 1699 -81981538.7461 +1751 1699 1.78813934326e-7 +1752 1699 143912524.7 +1759 1699 22815331.8815 +1760 1699 -81981538.7461 +1700 1700 256758079292 +1701 1700 -.00117492675781 +1704 1700 82115058570.3 +1705 1700 7409615188.36 +1708 1700 .00067138671875 +1729 1700 -17675875539.3 +1749 1700 -10522414515.2 +1750 1700 4865620837.77 +1753 1700 -2555968435.4 +1754 1700 -.000198364257813 +1761 1700 -10522414515.2 +1762 1700 -4865620837.77 +1789 1700 900741341.202 +1801 1700 .000198364257813 +1806 1700 -900741341.202 +1701 1701 849083491988 +1704 1701 7409615188.36 +1705 1701 -411913959063 +1708 1701 147459448.855 +1729 1701 -139098590.958 +1749 1701 4865620837.77 +1750 1701 -179228524554 +1753 1701 -.000259399414063 +1754 1701 365545056918 +1761 1701 -4865620837.77 +1762 1701 -179228524554 +1789 1701 -9273609288.98 +1801 1701 19107377033.8 +1806 1701 -9273609288.98 +1702 1702 269758326.83 +1703 1702 -15367494.3354 +1722 1702 -87001625.4739 +1723 1702 11526437.44 +1747 1702 57669270.6423 +1748 1702 -2536878.44364 +1751 1702 -56459948.3926 +1752 1702 24084668.1185 +1763 1702 -51335915.493 +1764 1702 -21547789.6749 +1703 1703 698263039.603 +1722 1703 11526437.44 +1723 1703 -329975223.313 +1747 1703 -2536878.44364 +1748 1703 143993579.681 +1751 1703 24084668.1185 +1752 1703 -83047478.5659 +1763 1703 -21547789.6749 +1764 1703 -80996738.412 +1704 1704 257778515393 +1705 1704 -23974333267.3 +1708 1704 17681613521.6 +1710 1704 -17696387274.4 +1724 1704 81214226992.5 +1725 1704 22222948191.6 +1729 1704 41529987.2483 +1749 1704 -2144486303.58 +1750 1704 -10868362487.3 +1753 1704 -10592055916.8 +1754 1704 1801487504.44 +1765 1704 -10894054257.1 +1766 1704 11528626940.3 +1783 1704 1248481541.62 +1789 1704 -566962004.68 +1801 1704 -548451863.563 +1705 1705 849067741337 +1708 1705 128479498.624 +1710 1705 -408245039.46 +1724 1705 22222948191.6 +1725 1705 -411743396682 +1729 1705 150156730.774 +1749 1705 -10868362487.3 +1750 1705 365501592424 +1753 1705 1801487504.44 +1754 1705 -179402628058 +1765 1705 11528626940.3 +1766 1705 -178947442463 +1783 1705 -9378893087.08 +1789 1705 19105295062.3 +1801 1705 -9162809579.15 +1706 1706 138828.742313 +1707 1706 -9.31322574615e-10 +1708 1706 .00917947338894 +1716 1706 17140.0909436 +1717 1706 6215.20896688 +1718 1706 9187.51072696 +1727 1706 34281.7740846 +1728 1706 12430.3906924 +1729 1706 -9187.46478677 +1784 1706 -8055.97765341 +1785 1706 -40585.4141199 +1786 1706 -41522.6299317 +1787 1706 -16111.1463004 +1788 1706 -81170.8282398 +1789 1706 41522.4594034 +1793 1706 -37756.9629924 +1794 1706 1.39698386192e-9 +1795 1706 -174920.321134 +1799 1706 -75510.6904288 +1800 1706 1.39698386192e-9 +1801 1706 174919.612674 +1804 1706 -16111.1463004 +1805 1706 81170.8282398 +1806 1706 41522.4594034 +1807 1706 -8055.97765341 +1808 1706 40585.4141199 +1809 1706 -41522.6299317 +1707 1707 1458506.03029 +1708 1707 -1.01514160633e-7 +1716 1707 6215.20896688 +1717 1707 -364626.93545 +1718 1707 -539000.359815 +1727 1707 12430.3906924 +1728 1707 -729250.681011 +1729 1707 538998.203657 +1784 1707 -40585.4141199 +1785 1707 -82988.8154785 +1786 1707 -129500.08576 +1787 1707 -81170.8282398 +1788 1707 -165976.821951 +1789 1707 129499.5691 +1793 1707 2.09547579288e-9 +1794 1707 165976.444391 +1795 1707 -6.053596735e-9 +1799 1707 2.79396772385e-9 +1800 1707 331954.507264 +1801 1707 -1.90921127796e-8 +1804 1707 81170.8282398 +1805 1707 -165976.821951 +1806 1707 -129499.5691 +1807 1707 40585.4141199 +1808 1707 -82988.8154785 +1809 1707 129500.08576 +1708 1708 8154637964.97 +1716 1708 9187.50153679 +1717 1708 -539000.359659 +1718 1708 -354485.546307 +1727 1708 9187.47397694 +1728 1708 -538998.203814 +1729 1708 -4048925474.76 +1749 1708 -1252425778.79 +1750 1708 10270523533.2 +1753 1708 .000267028808594 +1754 1708 -20872021059.8 +1761 1708 1252425778.79 +1762 1708 10270523533.2 +1784 1708 -41522.6255193 +1785 1708 -129500.08561 +1786 1708 -89890.0601426 +1787 1708 -41522.4638158 +1788 1708 -129499.56925 +1789 1708 671060732.52 +1793 1708 -174920.312304 +1794 1708 -8.84756445885e-9 +1795 1708 -359558.763287 +1799 1708 -174919.621504 +1800 1708 -2.09547579288e-8 +1801 1708 -1359472612.62 +1804 1708 -41522.4638158 +1805 1708 129499.56925 +1806 1708 671060732.52 +1807 1708 -41522.6255194 +1808 1708 129500.08561 +1809 1708 -89890.0601426 +1709 1709 69400.5099318 +1710 1709 313.604814616 +1711 1709 -405.802357052 +1712 1709 6002.99344751 +1716 1709 17553.1496303 +1717 1709 -6003.10282731 +1718 1709 8873.91051247 +1722 1709 -811.619269494 +1723 1709 12006.2022115 +1727 1709 35107.889658 +1728 1709 -12006.0718023 +1729 1709 -8873.86583706 +1735 1709 34698.6559514 +1736 1709 -313.594349576 +1763 1709 5493.65692937 +1764 1709 -81267.1143398 +1768 1709 -18880.1791823 +1769 1709 -87535.7603657 +1772 1709 2746.83171265 +1773 1709 -40633.6052167 +1782 1709 -37758.73317 +1783 1709 87535.4063367 +1784 1709 -10850.1726702 +1785 1709 40633.7185402 +1786 1709 -41598.2299375 +1787 1709 -21699.5363306 +1788 1709 81267.4917694 +1789 1709 41598.0591961 +1710 1710 30053094117.4 +1711 1710 36435.9183435 +1712 1710 -538992.920382 +1713 1710 -25601934696.8 +1716 1710 -27562.5230014 +1717 1710 539000.359971 +1718 1710 -354487.794621 +1722 1710 36441.3480488 +1723 1710 -539072.574475 +1724 1710 -13137389359 +1725 1710 1125409619.41 +1727 1710 -27562.4035398 +1728 1710 538998.203501 +1729 1710 -4055839531.22 +1735 1710 313.594349567 +1736 1710 -708972.29902 +1749 1710 475897373.39 +1750 1710 10034564230.9 +1763 1710 3750068.2404 +1764 1710 125586.751351 +1765 1710 -981673560.549 +1766 1710 -13567594910.1 +1768 1710 -87385.2564527 +1769 1710 -179780.10048 +1772 1710 -51122537.6367 +1773 1710 -3615686.32318 +1774 1710 -6164127578.15 +1782 1710 -87384.9106508 +1783 1710 5272617395.64 +1784 1710 -50352.4315243 +1785 1710 129500.088886 +1786 1710 -89890.4376583 +1787 1710 -50352.2342779 +1788 1710 129499.565974 +1789 1710 644393129.353 +1711 1711 355678588.242 +1712 1711 21753782.9386 +1715 1711 -14.6044817117 +1716 1711 -5041.73806512 +1717 1711 98594.0676449 +1718 1711 -6.04391098023e-9 +1719 1711 -1260.43727217 +1720 1711 24648.624605 +1721 1711 -36436.4243024 +1722 1711 -175276811.425 +1723 1711 -10776470.7918 +1724 1711 -7158808.63536 +1725 1711 -488100.443378 +1726 1711 -3.74194014978 +1727 1711 -1260.43727217 +1728 1711 24648.624605 +1729 1711 36436.4243024 +1730 1711 -175276811.425 +1731 1711 -10776470.7918 +1732 1711 .36027662456 +1733 1711 7158808.63536 +1734 1711 -3.74194014975 +1735 1711 -1623.23853899 +1736 1711 7.93263316155e-9 +1737 1711 -405.802357051 +1738 1711 -36436.27862 +1763 1711 -85034562.3653 +1764 1711 -5850242.75019 +1765 1711 278914.862748 +1766 1711 19016.7168717 +1767 1711 2897.36805847 +1768 1711 -11726.2104462 +1769 1711 2.39238142967e-9 +1770 1711 -2931.54936358 +1771 1711 -8754.17067509 +1772 1711 167414273.538 +1773 1711 11485668.0135 +1774 1711 -3.27825546265e-7 +1775 1711 1.49011611938e-8 +1776 1711 -5947.74771022 +1777 1711 -85034562.3653 +1778 1711 -5850242.75019 +1779 1711 -51131291.8077 +1780 1711 -278914.862748 +1781 1711 2897.36805847 +1782 1711 -2931.54936358 +1783 1711 51140045.9784 +1784 1711 -12504.307304 +1785 1711 22439.9765796 +1786 1711 -4.40701842308e-10 +1787 1711 -3126.076826 +1788 1711 5610.02148942 +1789 1711 8754.20597824 +1790 1711 -3126.076826 +1791 1711 5610.02148942 +1792 1711 -8754.20597824 +1712 1712 38118828.5268 +1713 1712 1.49011611938e-8 +1714 1712 -2.38418579102e-7 +1715 1712 216.012327228 +1716 1712 74581.9240403 +1717 1712 -1458492.12493 +1718 1712 8.94069671631e-8 +1719 1712 18645.5217776 +1720 1712 -364624.624334 +1721 1712 539000.359503 +1722 1712 -10776470.7918 +1723 1712 -17953546.0013 +1724 1712 104995891.273 +1725 1712 7158808.63536 +1726 1712 53.9968895221 +1727 1712 18645.5217776 +1728 1712 -364624.624334 +1729 1712 -539000.359503 +1730 1712 -10776470.7918 +1731 1712 -17953546.0013 +1732 1712 -5.28405666538 +1733 1712 -104995891.273 +1734 1712 53.9968895216 +1735 1712 24012.4044229 +1736 1712 -1.17346644402e-7 +1737 1712 6002.99344751 +1738 1712 538998.204438 +1763 1712 -5850242.75019 +1764 1712 371760.24513 +1765 1712 -4090795.54511 +1766 1712 -278914.862748 +1767 1712 -42495.1909317 +1768 1712 173464.651571 +1769 1712 -3.53902578354e-8 +1770 1712 43366.1148459 +1771 1712 129499.5662 +1772 1712 11485668.0135 +1773 1712 -258064.420359 +1774 1712 -2.23517417908e-8 +1775 1712 -2.23517417908e-7 +1776 1712 87234.5761598 +1777 1712 -5850242.75019 +1778 1712 371760.24513 +1779 1712 -3486186.75252 +1780 1712 4090795.54511 +1781 1712 -42495.1909317 +1782 1712 43366.1148459 +1783 1712 3356687.18632 +1784 1712 184974.960118 +1785 1712 -331952.316266 +1786 1712 6.51925802231e-9 +1787 1712 46243.7400296 +1788 1712 -82988.4835713 +1789 1712 -129500.088435 +1790 1712 46243.7400296 +1791 1712 -82988.4835713 +1792 1712 129500.088435 +1713 1713 51272385995.6 +1722 1713 .36027662456 +1723 1713 -5.28405666538 +1730 1713 -.360276564956 +1731 1713 5.2840566691 +1732 1713 -25601934696.8 +1763 1713 51131291.8077 +1764 1713 3486186.75252 +1772 1713 1.49011611939e-7 +1773 1713 1.02445483208e-8 +1774 1713 12292662114.7 +1777 1713 -51131291.8077 +1778 1713 -3486186.75252 +1779 1713 -6164127578.15 +1783 1713 -6164127578.15 +1714 1714 1525995498.68 +1715 1714 3.72529029846e-9 +1722 1714 7158808.63536 +1723 1714 -104995891.273 +1724 1714 497130548.956 +1725 1714 33895251.9036 +1726 1714 -.00187644013204 +1730 1714 -7158808.63536 +1731 1714 104995891.273 +1733 1714 497130548.956 +1734 1714 .00187643861864 +1763 1714 -278914.862748 +1764 1714 4090795.54511 +1765 1714 -56439542.9974 +1766 1714 -3848109.05729 +1767 1714 -266308.811499 +1772 1714 -7.45058059692e-9 +1773 1714 1.19209289551e-7 +1775 1714 14515470.2699 +1776 1714 4.7730281949e-9 +1777 1714 278914.862748 +1778 1714 -4090795.54511 +1780 1714 -56439542.9974 +1781 1714 266308.811499 +1715 1715 7686522.06352 +1722 1715 -3.74194014975 +1723 1715 53.9968895216 +1724 1715 .00187643861864 +1725 1715 -.0275211286062 +1726 1715 -3789732.43648 +1730 1715 -3.74194014978 +1731 1715 53.9968895221 +1733 1715 -.00187644013204 +1734 1715 -3789732.43648 +1763 1715 -2897.36805847 +1764 1715 42495.1909317 +1765 1715 -266308.811499 +1766 1715 -18157.2226694 +1767 1715 -644583.365458 +1772 1715 5947.74771022 +1773 1715 -87234.5761598 +1775 1715 1.16415321827e-9 +1776 1715 1316973.79469 +1777 1715 -2897.36805847 +1778 1715 42495.1909317 +1780 1715 266308.811499 +1781 1715 -644583.365458 +1716 1716 281048.742151 +1717 1716 -99442.7782555 +1718 1716 -1.07102096081e-8 +1719 1716 70259.0020551 +1720 1716 -24860.6943294 +1721 1716 .00914755836129 +1722 1716 -1260.43727217 +1723 1716 18645.5217776 +1727 1716 70259.0020551 +1728 1716 -24860.6943294 +1729 1716 -.00914756441489 +1730 1716 -1260.43727217 +1731 1716 18645.5217776 +1735 1716 70215.779316 +1736 1716 -1.76951289177e-8 +1737 1716 17553.1496303 +1738 1716 27562.5230014 +1763 1716 2552.32696385 +1764 1716 -37756.3160333 +1768 1716 -31748.8772394 +1769 1716 1.1408701539e-8 +1770 1716 -7937.62381469 +1771 1716 -37108.0770763 +1772 1716 10209.3078554 +1773 1716 -151025.264133 +1777 1716 2552.32696385 +1778 1716 -37756.3160333 +1782 1716 -7937.62381469 +1783 1716 37108.0770763 +1784 1716 -150250.107198 +1785 1716 -22633.2669398 +1786 1716 2.09547579288e-8 +1787 1716 -37564.1436431 +1788 1716 -5658.3442591 +1789 1716 174920.671033 +1790 1716 -37564.1436431 +1791 1716 -5658.34425909 +1792 1716 -174920.671033 +1793 1716 -43677.1988313 +1794 1716 173658.567772 +1795 1716 -1.07102096081e-8 +1796 1716 -10919.7042111 +1797 1716 43414.641943 +1798 1716 -45937.5328783 +1799 1716 -10919.7042111 +1800 1716 43414.641943 +1801 1716 45937.5328783 +1717 1717 2917002.82104 +1718 1717 -2.16998159885e-7 +1719 1717 -24860.6943294 +1720 1717 729247.514906 +1721 1717 .000937726348638 +1722 1717 24648.624605 +1723 1717 -364624.624334 +1727 1717 -24860.6943294 +1728 1717 729247.514906 +1729 1717 -.000937820412219 +1730 1717 24648.624605 +1731 1717 -364624.624334 +1735 1717 -24012.1436047 +1736 1717 1.05239450931e-7 +1737 1717 -6003.10282731 +1738 1717 -539000.359971 +1763 1717 5610.02032793 +1764 1717 -82988.4663895 +1768 1717 -173465.236067 +1769 1717 3.25962901115e-8 +1770 1717 -43366.3363612 +1771 1717 -129500.084425 +1772 1717 22439.9719336 +1773 1717 -331952.247538 +1777 1717 5610.02032793 +1778 1717 -82988.4663894 +1782 1717 -43366.3363612 +1783 1717 129500.084425 +1784 1717 -22633.2669398 +1785 1717 663907.642328 +1786 1717 -5.77419996262e-8 +1787 1717 -5658.3442591 +1788 1717 165976.100402 +1789 1717 .00297556165606 +1790 1717 -5658.34425909 +1791 1717 165976.100402 +1792 1717 -.00297558866441 +1793 1717 173658.567772 +1794 1717 -331953.666811 +1795 1717 3.72529029846e-9 +1796 1717 43414.641943 +1797 1717 -82988.821206 +1798 1717 129500.0871 +1799 1717 43414.641943 +1800 1717 -82988.821206 +1801 1717 -129500.0871 +1718 1718 2835889.81126 +1719 1718 -.0091475606896 +1720 1718 -.000937817618251 +1721 1718 -1417940.10884 +1722 1718 -36436.4243024 +1723 1718 539000.359503 +1727 1718 .00914755556732 +1728 1718 .000937723554671 +1729 1718 -1417940.10884 +1730 1718 36436.4243024 +1731 1718 -539000.359503 +1735 1718 -5.13195991516e-9 +1736 1718 708971.409669 +1737 1718 -8873.91051248 +1738 1718 -354487.794621 +1763 1718 -8754.20567669 +1764 1718 129500.083975 +1768 1718 1.5084631741e-8 +1769 1718 179779.763102 +1770 1718 -45862.2783615 +1771 1718 -89890.4118855 +1772 1718 -2.04611569643e-9 +1773 1718 3.0267983675e-8 +1777 1718 8754.20567669 +1778 1718 -129500.083975 +1782 1718 45862.2783615 +1783 1718 -89890.4118856 +1784 1718 8.38190317154e-9 +1785 1718 -4.79631125927e-8 +1786 1718 719120.505461 +1787 1718 174920.662203 +1788 1718 .00297556258738 +1789 1718 -359559.482123 +1790 1718 -174920.662203 +1791 1718 -.00297558028251 +1792 1718 -359559.482123 +1793 1718 -6.75208866596e-9 +1794 1718 7.91624188423e-9 +1795 1718 179779.010513 +1796 1718 -45937.5284659 +1797 1718 129500.087251 +1798 1718 -89890.0687338 +1799 1718 45937.5284659 +1800 1718 -129500.087251 +1801 1718 -89890.0687338 +1719 1719 632352.848091 +1720 1719 -223746.250572 +1721 1719 -1.02445483208e-8 +1730 1719 -11343.916552 +1731 1719 167809.41645 +1735 1719 17553.1496303 +1736 1719 -27562.5230014 +1737 1719 157983.799464 +1738 1719 -1.67638063431e-8 +1768 1719 -7937.62381469 +1769 1719 37108.0770763 +1770 1719 -71435.8405847 +1771 1719 1.16415321827e-8 +1772 1719 2552.32696385 +1773 1719 -37756.3160333 +1777 1719 22970.9426747 +1778 1719 -339806.8443 +1784 1719 -37564.1436431 +1785 1719 -5658.3442591 +1786 1719 174920.671033 +1790 1719 -338066.20586 +1791 1719 -50924.9095949 +1792 1719 2.32830643654e-8 +1793 1719 -10919.7042111 +1794 1719 43414.641943 +1795 1719 45937.5328783 +1796 1719 -98274.5641631 +1797 1719 390731.777487 +1798 1719 -1.07102096081e-8 +1720 1720 6563249.51087 +1721 1720 -2.1792948246e-7 +1730 1720 221836.882973 +1731 1720 -3281610.69487 +1735 1720 -6003.10282731 +1736 1720 539000.359971 +1737 1720 -54027.4665236 +1738 1720 1.15483999252e-7 +1768 1720 -43366.3363612 +1769 1720 129500.084425 +1770 1720 -390296.839746 +1771 1720 3.16649675369e-8 +1772 1720 5610.02032793 +1773 1720 -82988.4663895 +1777 1720 50489.995446 +1778 1720 -746893.423758 +1784 1720 -5658.3442591 +1785 1720 165976.100402 +1786 1720 .00297556305304 +1790 1720 -50924.9095949 +1791 1720 1493790.45914 +1792 1720 -5.49480319023e-8 +1793 1720 43414.641943 +1794 1720 -82988.821206 +1795 1720 -129500.0871 +1796 1720 390731.777487 +1797 1720 -746896.617117 +1798 1720 2.32830643654e-9 +1721 1721 1823079.73065 +1730 1721 -6.98827207089e-9 +1731 1721 1.03376805782e-7 +1735 1721 8873.91051248 +1736 1721 -354487.794621 +1737 1721 -4.42042946816e-9 +1738 1721 455763.976202 +1768 1721 45862.2783615 +1769 1721 -89890.4118856 +1770 1721 1.50406733155e-8 +1771 1721 115571.852528 +1772 1721 -8754.20567669 +1773 1721 129500.083975 +1777 1721 -2.23498791456e-9 +1778 1721 3.30619513988e-8 +1784 1721 174920.662203 +1785 1721 .00297556631267 +1786 1721 -359559.482123 +1790 1721 1.210719347e-8 +1791 1721 -5.77419996262e-8 +1792 1721 462292.991987 +1793 1721 45937.5284659 +1794 1721 -129500.087251 +1795 1721 -89890.0687338 +1796 1721 -6.51925802231e-9 +1797 1721 6.053596735e-9 +1798 1721 115571.315455 +1722 1722 526259838.416 +1723 1722 52647149.6621 +1724 1722 7158808.63536 +1725 1722 488100.443378 +1726 1722 -7.3022408558 +1727 1722 -2520.86903256 +1728 1722 49297.0338225 +1729 1722 36436.2785883 +1735 1722 -405.802357051 +1736 1722 -36436.27862 +1747 1722 -59330252.8804 +1748 1722 25352210.3251 +1763 1722 22617888.0345 +1764 1722 -4474425.1876 +1765 1722 -278914.862748 +1766 1722 -19016.7168717 +1767 1722 -2973.87385511 +1768 1722 -2931.54936358 +1769 1722 -8754.17067509 +1772 1722 -85034562.3653 +1773 1722 -5850242.75019 +1774 1722 -51131291.8077 +1775 1722 -278914.862748 +1776 1722 2897.36805847 +1782 1722 -5863.1052231 +1783 1722 -3732559.82872 +1784 1722 -3126.076826 +1785 1722 5610.02148942 +1786 1722 -8754.20597824 +1787 1722 -6252.153652 +1788 1722 11219.9882898 +1789 1722 8754.17069031 +1723 1723 504754032.08 +1724 1723 -104995891.273 +1725 1723 -7158808.63536 +1726 1723 108.006163614 +1727 1723 37290.9620201 +1728 1723 -729246.062463 +1729 1723 -538998.20397 +1735 1723 6002.99344751 +1736 1723 538998.204438 +1747 1723 25352210.3251 +1748 1723 -84194473.367 +1763 1723 -4474425.1876 +1764 1723 54765599.7016 +1765 1723 4090795.54511 +1766 1723 278914.862748 +1767 1723 43617.2880799 +1768 1723 43366.1148459 +1769 1723 129499.5662 +1772 1723 -5850242.75019 +1773 1723 371760.24513 +1774 1723 -3486186.75252 +1775 1723 4090795.54511 +1776 1723 -42495.1909317 +1782 1723 86732.3257856 +1783 1723 -384586.924211 +1784 1723 46243.7400296 +1785 1723 -82988.4835713 +1786 1723 129500.088435 +1787 1723 92487.4800592 +1788 1723 -165976.158133 +1789 1723 -129499.566425 +1724 1724 313249783277 +1725 1724 36222691621.9 +1726 1724 -.0256446748972 +1729 1724 17713774992.3 +1749 1724 -11102972940.8 +1750 1724 8464493606.95 +1763 1724 -278914.862748 +1764 1724 4090795.54511 +1765 1724 -93798676830.6 +1766 1724 -22267489372.2 +1767 1724 -19486.0105974 +1772 1724 278914.862748 +1773 1724 -4090795.54511 +1775 1724 -56439542.9974 +1776 1724 266308.811499 +1783 1724 -2485021128 +1789 1724 -191992214.535 +1725 1725 598259596588 +1726 1725 .376122089918 +1729 1725 396274130.583 +1749 1725 8464493606.95 +1750 1725 -179469739173 +1763 1725 -19016.7168717 +1764 1725 278914.862748 +1765 1725 -22267489372.2 +1766 1725 229074473848 +1767 1725 -1328.57726849 +1772 1725 19016.7168717 +1773 1725 -278914.862748 +1775 1725 -3848109.05729 +1776 1725 18157.2226694 +1783 1725 11490956540.1 +1789 1725 -9045776145.13 +1726 1726 3843261.03176 +1763 1726 2973.87385511 +1764 1726 -43617.2880799 +1765 1726 19486.0105974 +1766 1726 1328.57726849 +1767 1726 658486.897344 +1772 1726 -2897.36805847 +1773 1726 42495.1909317 +1775 1726 266308.811499 +1776 1726 -644583.365458 +1727 1727 140524.371075 +1728 1727 -49721.3891277 +1729 1727 .00914754765108 +1735 1727 17553.1496303 +1736 1727 27562.5230014 +1763 1727 5104.6539277 +1764 1727 -75512.6320666 +1768 1727 -7937.62381469 +1769 1727 -37108.0770763 +1772 1727 2552.32696385 +1773 1727 -37756.3160333 +1782 1727 -15874.4386197 +1783 1727 37107.9240244 +1784 1727 -37564.1436431 +1785 1727 -5658.3442591 +1786 1727 -174920.671033 +1787 1727 -75125.053599 +1788 1727 -11316.6334699 +1789 1727 174919.962774 +1793 1727 -10919.7042111 +1794 1727 43414.641943 +1795 1727 -45937.5328783 +1799 1727 -21838.5994157 +1800 1727 86829.283886 +1801 1727 45937.3446904 +1728 1728 1458501.41052 +1729 1728 .000937681645155 +1735 1728 -6003.10282731 +1736 1728 -539000.359971 +1763 1728 11219.9859668 +1764 1728 -165976.123769 +1768 1728 -43366.3363612 +1769 1728 -129500.084425 +1772 1728 5610.02032793 +1773 1728 -82988.4663895 +1782 1728 -86732.6180334 +1783 1728 129499.570435 +1784 1728 -5658.34425909 +1785 1728 165976.100402 +1786 1728 -.00297559099272 +1787 1728 -11316.6334699 +1788 1728 331953.821164 +1789 1728 -.00297561706975 +1793 1728 43414.641943 +1794 1728 -82988.821206 +1795 1728 129500.0871 +1799 1728 86829.283886 +1800 1728 -165976.833406 +1801 1728 -129499.56776 +1729 1729 8161977887.41 +1735 1729 -8873.91051248 +1736 1729 -354487.794621 +1749 1729 643460732.026 +1750 1729 -20868680160.2 +1753 1729 866214255.627 +1754 1729 10155931302 +1763 1729 8754.17099186 +1764 1729 -129499.570885 +1765 1729 -1634096013.31 +1766 1729 10379082340.7 +1768 1729 -45862.2783615 +1769 1729 -89890.4118855 +1772 1729 8754.20567669 +1773 1729 -129500.083975 +1782 1729 -45862.0994077 +1783 1729 681022051.096 +1784 1729 -174920.662203 +1785 1729 -.00297558354214 +1786 1729 -359559.482123 +1787 1729 -174919.971603 +1788 1729 .00297557003796 +1789 1729 -1357396123.78 +1793 1729 -45937.5284659 +1794 1729 129500.087251 +1795 1729 -89890.0687338 +1799 1729 -45937.3491027 +1800 1729 129499.56761 +1801 1729 658877384.35 +1730 1730 234128054.792 +1731 1730 14397770.2585 +1732 1730 4.76837158203e-7 +1733 1730 -4158175.26769 +1734 1730 -33.0546975404 +1735 1730 -405.802357052 +1736 1730 36436.27862 +1737 1730 -3652.27111766 +1738 1730 8.18446278572e-9 +1768 1730 -2931.54936358 +1769 1730 8754.17067509 +1770 1730 -26383.966544 +1771 1730 2.26646661758e-9 +1772 1730 -85034562.3653 +1773 1730 -5850242.75019 +1774 1730 51131291.8077 +1775 1730 278914.862748 +1776 1730 2897.36805847 +1777 1730 104775734.566 +1778 1730 7201055.05173 +1779 1730 -3.27825546265e-7 +1780 1730 -999031.359292 +1781 1730 -3987.49309224 +1784 1730 -3126.076826 +1785 1730 5610.02148942 +1786 1730 8754.20597824 +1790 1730 -28134.691434 +1791 1730 50490.0058995 +1792 1730 -2.51829624176e-10 +1731 1731 23970556.4911 +1732 1731 5.96046447754e-8 +1733 1731 60986570.5929 +1734 1731 486.014467073 +1735 1731 6002.99344751 +1736 1731 -538998.204438 +1737 1731 54027.6792554 +1738 1731 -1.210719347e-7 +1768 1731 43366.1148459 +1769 1731 -129499.5662 +1770 1731 390295.363078 +1771 1731 -3.35276126862e-8 +1772 1731 -5850242.75019 +1773 1731 371760.24513 +1774 1731 3486186.75252 +1775 1731 -4090795.54511 +1776 1731 -42495.1909317 +1777 1731 7201055.05173 +1778 1731 -343510.783096 +1779 1731 -2.32830643654e-8 +1780 1731 14652618.343 +1781 1731 58483.8642774 +1784 1731 46243.7400296 +1785 1731 -82988.4835713 +1786 1731 -129500.088435 +1790 1731 416193.660266 +1791 1731 -746893.578394 +1792 1731 3.72529029846e-9 +1732 1732 33015877552.3 +1772 1732 51131291.8077 +1773 1732 3486186.75252 +1774 1732 -6164127578.15 +1777 1732 2.68220901489e-7 +1778 1732 2.04890966415e-8 +1779 1732 7873824093.84 +1733 1733 1725865895.43 +1734 1733 1.86264514923e-9 +1772 1733 -278914.862748 +1773 1733 4090795.54511 +1775 1733 -56439542.9974 +1776 1733 -266308.811499 +1777 1733 -999031.359292 +1778 1733 14652618.343 +1780 1733 -377613505.496 +1781 1733 7.79982656241e-9 +1734 1734 5056039.74502 +1772 1734 -2897.36805847 +1773 1734 42495.1909317 +1775 1734 -266308.811499 +1776 1734 -644583.365458 +1777 1734 3987.49309224 +1778 1734 -58483.8642774 +1780 1734 -1.86264514923e-9 +1781 1734 876419.293483 +1735 1735 138801.019864 +1736 1735 -1.49175524712e-8 +1737 1735 34698.6559514 +1738 1735 -313.594349576 +1763 1735 2746.83171265 +1764 1735 -40633.6052167 +1768 1735 -75517.4663401 +1769 1735 1.71653926373e-8 +1770 1735 -18880.1791824 +1771 1735 -87535.7603657 +1772 1735 10987.3138587 +1773 1735 -162534.228679 +1777 1735 2746.83171265 +1778 1735 -40633.6052167 +1782 1735 -18880.1791823 +1783 1735 87535.7603657 +1784 1735 -43399.0726612 +1785 1735 162534.983539 +1786 1735 -8.63969326019e-9 +1787 1735 -10850.1726702 +1788 1735 40633.7185402 +1789 1735 41598.2299375 +1790 1735 -10850.1726702 +1791 1735 40633.7185402 +1792 1735 -41598.2299375 +1736 1736 1417949.39978 +1737 1736 313.594349566 +1738 1736 -708972.29902 +1763 1736 -8754.17097664 +1764 1736 129499.57066 +1768 1736 -4.82052564621e-9 +1769 1736 359560.972787 +1770 1736 -87385.2564527 +1771 1736 -179780.10048 +1772 1736 6.2957406044e-10 +1773 1736 -9.31322574615e-9 +1777 1736 8754.17097664 +1778 1736 -129499.57066 +1782 1736 87385.2564527 +1783 1736 -179780.10048 +1784 1736 -5.82076609135e-9 +1785 1736 2.79396772385e-9 +1786 1736 179779.711556 +1787 1736 50352.4315243 +1788 1736 -129500.088886 +1789 1736 -89890.4376583 +1790 1736 -50352.4315243 +1791 1736 129500.088886 +1792 1736 -89890.4376583 +1737 1737 312298.868233 +1738 1737 -1.70320272446e-8 +1768 1737 -18880.1791824 +1769 1737 87535.7603657 +1770 1737 -169916.040545 +1771 1737 1.8222630024e-8 +1772 1737 2746.83171265 +1773 1737 -40633.6052167 +1777 1737 24721.4631421 +1778 1737 -365702.117486 +1784 1737 -10850.1726702 +1785 1737 40633.7185402 +1786 1737 41598.2299375 +1790 1737 -97648.7802839 +1791 1737 365703.654367 +1792 1737 -8.36290419102e-9 +1738 1738 911542.758405 +1768 1738 87385.2564527 +1769 1738 -179780.10048 +1770 1738 -4.78904694319e-9 +1771 1738 231146.959867 +1772 1738 -8754.17097664 +1773 1738 129499.57066 +1777 1738 5.98095357418e-10 +1778 1738 -8.84756445885e-9 +1784 1738 50352.4315243 +1785 1738 -129500.088886 +1786 1738 -89890.4376583 +1790 1738 -4.88944351673e-9 +1791 1738 -2.79396772385e-9 +1792 1738 115571.73655 +1739 1739 246783027.816 +1740 1739 8424819.14622 +1751 1739 -50435484.8 +1752 1739 22855483.721 +1755 1739 -30317651.3682 +1756 1739 -2105529.14174 +1759 1739 45605788.3975 +1760 1739 2376241.93166 +1810 1739 -55955872.5164 +1811 1739 -25231725.6526 +1916 1739 -23841649.2929 +1927 1739 -41768809.3938 +1938 1739 1565642.56072 +1942 1739 -30731693.6397 +1943 1739 -6319290.00448 +1947 1739 -36542020.1011 +1948 1739 22276006.7321 +1958 1739 -46637284.394 +1740 1740 440525777.201 +1751 1740 22855483.721 +1752 1740 -75421095.2901 +1755 1740 -2105529.14174 +1756 1740 -183017006.144 +1759 1740 2376241.93166 +1760 1740 128730107.172 +1810 1740 -25231725.6526 +1811 1740 -77623239.4493 +1916 1740 -45220410.8368 +1927 1740 -23841649.2929 +1938 1740 38345921.1849 +1942 1740 -6319290.00448 +1943 1740 -183215297.934 +1947 1740 22276006.7321 +1948 1740 -43104755.9036 +1958 1740 1565642.56072 +1741 1741 258276010451 +1742 1741 14856969366.5 +1753 1741 -13517892838.9 +1754 1741 -4552909202.52 +1757 1741 99142464762.5 +1758 1741 -4312714460.94 +1761 1741 -10225085919.5 +1762 1741 9950100967.57 +1801 1741 1641898134.19 +1806 1741 -585293337.71 +1812 1741 -14053819685.8 +1813 1741 -7526242074.65 +1816 1741 -941520995.965 +1908 1741 -15749716917.4 +1917 1741 -45627088695.6 +1918 1741 193631283.235 +1929 1741 5668651033.93 +1939 1741 -86955510617.2 +1940 1741 5092053729.63 +1944 1741 98541086225.9 +1945 1741 -12930926176.4 +1949 1741 -6246639007.44 +1950 1741 -45615674093.3 +1951 1741 -5543305974.01 +1960 1741 549363422.268 +1962 1741 15722056370.5 +1981 1741 -58798702.4494 +1742 1742 530186479449 +1753 1742 -4552909202.52 +1754 1742 -162561496431 +1757 1742 -4312714460.94 +1758 1742 -240879681458 +1761 1742 9950100967.57 +1762 1742 332849746779 +1801 1742 9264091290.63 +1806 1742 -18955005584.8 +1812 1742 -7526242074.65 +1813 1742 -162804420299 +1816 1742 9071716786.83 +1908 1742 -275550823.686 +1917 1742 193631283.235 +1918 1742 -71955870458.9 +1929 1742 -7679580306.66 +1939 1742 5092053729.63 +1940 1742 160305944175 +1944 1742 -12930926176.4 +1945 1742 -240728787192 +1949 1742 -7745641243.39 +1950 1742 -5543305974.01 +1951 1742 -71525094186.5 +1960 1742 18201694472.7 +1962 1742 -535676095.937 +1981 1742 -1346048495.69 +1743 1743 246783665.951 +1744 1743 -8424774.61502 +1747 1743 45605153.968 +1748 1743 -2376370.99546 +1751 1743 -50435484.8 +1752 1743 -22855483.721 +1755 1743 -30317651.3682 +1756 1743 2105529.14174 +1763 1743 -55955871.8707 +1764 1743 25231854.7164 +1855 1743 -30730395.2138 +1856 1743 6319245.47328 +1860 1743 -36542651.3659 +1861 1743 -22276203.3386 +1890 1743 -1565445.95427 +1894 1743 -46637955.9069 +1916 1743 23841649.2929 +1927 1743 -41768809.3938 +1744 1744 440523168.602 +1747 1744 -2376370.99546 +1748 1744 128729312.506 +1751 1744 -22855483.721 +1752 1744 -75421095.2901 +1755 1744 2105529.14174 +1756 1744 -183017006.144 +1763 1744 25231854.7164 +1764 1744 -77622698.2973 +1855 1744 6319245.47328 +1856 1744 -183211914.71 +1860 1744 -22276203.3386 +1861 1744 -43104809.9803 +1890 1744 38345454.1504 +1894 1744 -1565445.95427 +1916 1744 -45220410.8368 +1927 1744 23841649.2929 +1745 1745 258276170909 +1746 1745 -14856856189.1 +1749 1745 -10225478032.9 +1750 1745 -9950617316.55 +1753 1745 -13517892838.9 +1754 1745 4552909202.53 +1757 1745 99142464762.5 +1758 1745 4312714460.94 +1765 1745 -14054241956.8 +1766 1745 7526858098.61 +1783 1745 941558620.442 +1789 1745 585250325.398 +1801 1745 -1641898134.2 +1840 1745 -15721693233.6 +1857 1745 98541675993.8 +1858 1745 12930869328.1 +1862 1745 6246657716.98 +1863 1745 -45616191018.5 +1864 1745 5542611639.77 +1875 1745 58445769.5055 +1891 1745 -86956215528.5 +1892 1745 -5091402741.12 +1896 1745 -549386948.003 +1908 1745 15749716917.4 +1917 1745 -45627088695.6 +1918 1745 -193631283.235 +1929 1745 -5668651033.93 +1746 1746 530183945359 +1749 1746 -9950617316.55 +1750 1746 332847978114 +1753 1746 4552909202.53 +1754 1746 -162561496431 +1757 1746 4312714460.94 +1758 1746 -240879681458 +1765 1746 7526858098.61 +1766 1746 -162802623414 +1783 1746 9071697820.83 +1789 1746 -18954990382.4 +1801 1746 9264091290.64 +1840 1746 -535662115.371 +1857 1746 12930869328.1 +1858 1746 -240725922857 +1862 1746 -7745635780.02 +1863 1746 5542611639.77 +1864 1746 -71524376617.8 +1875 1746 -1346073612.02 +1891 1746 -5091402741.12 +1892 1746 160305275586 +1896 1746 18201703908.7 +1908 1746 -275550823.688 +1917 1746 -193631283.234 +1918 1746 -71955870458.9 +1929 1746 -7679580306.66 +1747 1747 251477162.675 +1748 1747 -13131924.085 +1751 1747 -69968002.3662 +1752 1747 3282077.12854 +1755 1747 -53100334.3496 +1756 1747 24044516.279 +1763 1747 -70596998.1468 +1764 1747 9849846.95642 +1855 1747 -47960900.6995 +1856 1747 -21668145.2836 +1748 1748 610574327.992 +1751 1748 3282077.12854 +1752 1748 -282975483.53 +1755 1748 24044516.279 +1756 1748 -76487035.1099 +1763 1748 9849846.95642 +1764 1748 -283233979.596 +1855 1748 -21668145.2836 +1856 1748 -74424709.8289 +1749 1749 245292543324 +1750 1749 -20861681646.1 +1753 1749 81643975135.4 +1754 1749 6364727951 +1757 1749 -13587534240.5 +1758 1749 1488775869.19 +1765 1749 80857501528.9 +1766 1749 19087855637.1 +1783 1749 -15441976348.5 +1789 1749 28384889.8361 +1801 1749 15431569943.7 +1840 1749 1639926523.36 +1857 1749 -13845306710.2 +1858 1749 10590991431.9 +1875 1749 -521160687.873 +1908 1749 -1003676647.13 +1750 1750 738732441848 +1753 1750 6364727951 +1754 1750 -354887580541 +1757 1750 1488775869.19 +1758 1750 -162735599935 +1765 1750 19087855637.1 +1766 1750 -354716917205 +1783 1750 -307195266.25 +1789 1750 150304679.883 +1801 1750 101281711.489 +1840 1750 -8525487209.64 +1857 1750 10590991431.9 +1858 1750 -162280285297 +1875 1750 17495532203.1 +1908 1750 -8350843722.48 +1751 1751 251502166.894 +1752 1751 -1.19209289551e-6 +1755 1751 45414888.519 +1756 1751 -1.78813934326e-7 +1759 1751 -69968002.3662 +1760 1751 -3282077.12854 +1752 1752 610315831.926 +1755 1752 2.98023223877e-8 +1756 1752 128659758.148 +1759 1752 -3282077.12854 +1760 1752 -282975483.53 +1753 1753 244420358625 +1754 1753 -.00178527832031 +1757 1753 -10605292535 +1758 1753 -.00120544433594 +1761 1753 81643975135.4 +1762 1753 -6364727951 +1789 1753 -15427532739.9 +1801 1753 .00100708007813 +1806 1753 15427532739.9 +1875 1753 1323915125.47 +1908 1753 2.28881835938e-5 +1981 1753 -1323915125.47 +1754 1754 738788728185 +1757 1754 -.00128936767578 +1758 1754 332904236641 +1761 1754 -6364727951 +1762 1754 -354887580541 +1789 1754 -102450190.909 +1801 1754 148606166.858 +1806 1754 -102450190.909 +1875 1754 -8440978043.38 +1908 1754 17498408757.6 +1981 1754 -8440978043.37 +1755 1755 246369631.065 +1756 1755 -4.76837158203e-7 +1759 1755 -53100334.3496 +1760 1755 -24044516.279 +1890 1755 -23058350.7071 +1894 1755 -39104194.579 +1916 1755 -2.08616256714e-7 +1927 1755 -46740158.9901 +1938 1755 23058350.7071 +1958 1755 -39104194.579 +1756 1756 440327743.619 +1759 1756 -24044516.279 +1760 1756 -76487035.1099 +1890 1756 -44154564.9109 +1894 1756 -23058350.7071 +1916 1756 38329710.5625 +1927 1756 1.49011611939e-7 +1938 1756 -44154564.9109 +1958 1756 23058350.7071 +1757 1757 2.5772821374e11 +1758 1757 -.00204467773438 +1761 1757 -13587534240.5 +1762 1757 -1488775869.19 +1789 1757 1293645860.39 +1806 1757 -1293645860.39 +1875 1757 -15734911349.3 +1891 1757 -45557453428.4 +1892 1757 2870502050.1 +1896 1757 5961881082.56 +1908 1757 6.103515625e-5 +1917 1757 -87195054433.9 +1918 1757 -.000251770019531 +1929 1757 -.000213623046875 +1939 1757 -45557453428.4 +1940 1757 -2870502050.1 +1960 1757 -5961881082.56 +1981 1757 15734911349.3 +1758 1758 530305768289 +1761 1758 -1488775869.19 +1762 1758 -162735599935 +1789 1758 9171159098.07 +1801 1758 -18958770866.9 +1806 1758 9171159098.07 +1875 1758 -403688597.489 +1891 1758 2870502050.1 +1892 1758 -71781782291 +1896 1758 -7717058397.77 +1908 1758 -1354768820.9 +1917 1758 -.000308990478516 +1918 1758 160407647616 +1929 1758 18212715482.2 +1939 1758 -2870502050.1 +1940 1758 -71781782291 +1960 1758 -7717058397.77 +1981 1758 -403688597.487 +1759 1759 251477563.527 +1760 1759 13131570.2798 +1810 1759 -70597398.9984 +1811 1759 -9849493.15123 +1942 1759 -47961535.129 +1943 1759 21668274.3474 +1760 1760 610575158.096 +1810 1760 -9849493.15124 +1811 1760 -283234809.701 +1942 1760 21668274.3474 +1943 1760 -74425504.4943 +1761 1761 245292564791 +1762 1761 20861167498.7 +1801 1761 -15431569943.7 +1806 1761 -28380353.3817 +1812 1761 80857577234.3 +1813 1761 -19087241814.7 +1816 1761 15441966424.2 +1908 1761 1003676647.13 +1944 1761 -13844901002.1 +1945 1761 -10590375408 +1962 1761 -1639889927.72 +1981 1761 521129480.073 +1762 1762 738734197178 +1801 1762 101281711.489 +1806 1762 150289477.527 +1812 1762 -19087241814.7 +1813 1762 -354718742162 +1816 1762 -307176300.25 +1908 1762 -8350843722.48 +1944 1762 -10590375408 +1945 1762 -1.6228212359e11 +1962 1762 -8525668109.35 +1981 1762 17495709339.2 +1763 1763 509060942.431 +1764 1763 -16481882.8247 +1765 1763 7085252.41719 +1766 1763 483108.895226 +1767 1763 -.351960846121 +1768 1763 -351.616086157 +1769 1763 -35016.6833491 +1772 1763 -168383875.652 +1773 1763 -10316056.9564 +1774 1763 -2.05882227421 +1775 1763 7085252.41719 +1776 1763 .342989078024 +1782 1763 -703.247706742 +1783 1763 34988.6860887 +1784 1763 -1092.32031566 +1785 1763 21360.1220885 +1786 1763 -35016.8233555 +1787 1763 -2184.63477089 +1788 1763 42720.0146782 +1789 1763 35016.6833187 +1839 1763 -5846.09957659 +1840 1763 -3732557.76988 +1841 1763 -2923.04621229 +1842 1763 -8754.17065986 +1848 1763 -85034549.1728 +1849 1763 -5850419.08152 +1850 1763 -51131263.6705 +1851 1763 -278946.373452 +1852 1763 2897.71104755 +1855 1763 9149047.94923 +1856 1763 28977776.4992 +1857 1763 -278946.373452 +1858 1763 -19021.127033 +1859 1763 -2974.22581596 +1873 1763 -6199.50299582 +1874 1763 10189.5653098 +1875 1763 8754.17067508 +1879 1763 -3099.75149791 +1880 1763 5094.81276018 +1881 1763 -8754.20599347 +1764 1764 431440337.766 +1765 1764 -103911980.278 +1766 1764 -7085252.41719 +1767 1764 -.0248256539926 +1768 1764 5201.42139286 +1769 1764 517998.274395 +1772 1764 -10316056.9564 +1773 1764 -17789744.9176 +1774 1764 30.1945892535 +1775 1764 -103911980.278 +1776 1764 .0229732061271 +1782 1764 10403.0725849 +1783 1764 -517587.685659 +1784 1764 16158.5845512 +1785 1764 -315978.137404 +1786 1764 518000.345496 +1787 1764 32317.0824096 +1788 1764 -631952.879855 +1789 1764 -517998.273945 +1839 1764 86480.7629673 +1840 1764 -384617.119026 +1841 1764 43240.3285841 +1842 1764 129499.565974 +1848 1764 -5850419.08152 +1849 1764 364040.890782 +1850 1764 -3486599.41191 +1851 1764 4090771.23176 +1852 1764 -42495.1679585 +1855 1764 28977776.4992 +1856 1764 35511717.058 +1857 1764 4090771.23176 +1858 1764 278946.373452 +1859 1764 43617.2632542 +1873 1764 91708.6241986 +1874 1764 -150733.214642 +1875 1764 -129499.566199 +1879 1764 45854.3120993 +1880 1764 -75367.0526654 +1881 1764 129500.088661 +1765 1765 3.2841622726e11 +1766 1765 -37812892733.9 +1767 1765 .146548107266 +1772 1765 -7085252.41719 +1773 1765 103911980.278 +1775 1765 495800576.583 +1776 1765 -.0107230299618 +1783 1765 -10067028321.5 +1789 1765 15454073126.1 +1840 1765 -1653944924.44 +1848 1765 278946.373452 +1849 1765 -4090771.23176 +1851 1765 -56439379.5827 +1852 1765 266308.66495 +1855 1765 -278946.373452 +1856 1765 4090771.23176 +1857 1765 -92111421107.8 +1858 1765 28226353968.1 +1859 1765 -19485.9998744 +1875 1765 -679548447.188 +1766 1766 515299007873 +1767 1766 -2.14926763834 +1772 1766 -483108.895226 +1773 1766 7085252.41719 +1775 1766 33806229.3133 +1776 1766 .157263485882 +1783 1766 -985777033.004 +1789 1766 305325394.438 +1840 1766 12364390995.4 +1848 1766 19021.127033 +1849 1766 -278946.373452 +1851 1766 -3848555.53209 +1852 1766 18159.371937 +1855 1766 -19021.127033 +1856 1766 278946.373452 +1857 1766 28226353968.1 +1858 1766 198385774101 +1859 1766 -1328.73453198 +1875 1766 -8254496638.28 +1767 1767 3696305.1105 +1772 1767 .342989078024 +1773 1767 .0229732061271 +1775 1767 .0107230356662 +1776 1767 -3640690.99826 +1848 1767 -2897.71104755 +1849 1767 42495.1679585 +1851 1767 266308.66495 +1852 1767 -644583.725269 +1855 1767 2974.22581596 +1856 1767 -43617.2632542 +1857 1767 19485.9998744 +1858 1767 1328.73453198 +1859 1767 658487.249504 +1768 1768 159391.178163 +1769 1768 -1.70178711414e-8 +1770 1768 39846.0870753 +1771 1768 -303.094563708 +1772 1768 -1406.49541348 +1773 1768 20806.1451699 +1777 1768 -351.616086157 +1778 1768 5201.42139286 +1782 1768 39846.0870753 +1783 1768 303.094563698 +1784 1768 80400.4542597 +1785 1768 -20805.8645372 +1786 1768 -9.48086380959e-9 +1787 1768 20099.2644293 +1788 1768 -5201.53753732 +1789 1768 -8527.06010246 +1790 1768 20099.2644293 +1791 1768 -5201.53753732 +1792 1768 8527.06010246 +1834 1768 2755.33486395 +1835 1768 -40759.3914785 +1839 1768 -20792.2939973 +1840 1768 96366.9662598 +1841 1768 -83165.5974351 +1842 1768 1.95816159248e-8 +1848 1768 11021.3251518 +1849 1768 -163037.354316 +1853 1768 -20792.2939973 +1854 1768 -96366.9662598 +1855 1768 2755.33486395 +1856 1768 -40759.3914785 +1873 1768 -11810.8233212 +1874 1768 40759.4993391 +1875 1768 46013.8328814 +1876 1768 -11810.8233212 +1877 1768 40759.4993391 +1878 1768 -46013.8328814 +1879 1768 -47241.5119074 +1880 1768 163038.117778 +1881 1768 -6.053596735e-9 +1769 1769 1510843.81921 +1770 1769 303.094563698 +1771 1769 -755419.770426 +1772 1769 4.91067767143e-9 +1773 1769 -7.264316082e-8 +1777 1769 35016.6833491 +1778 1769 -517998.274396 +1782 1769 -303.094563708 +1783 1769 -755419.770426 +1784 1769 -1.49011611938e-8 +1785 1769 5.68106770515e-8 +1786 1769 755419.058407 +1787 1769 26489.7721063 +1788 1769 -518000.345947 +1789 1769 -377711.310813 +1790 1769 -26489.7721063 +1791 1769 518000.345947 +1792 1769 -377711.310813 +1834 1769 8754.17099187 +1835 1769 -129499.570886 +1839 1769 96214.3623527 +1840 1769 -197931.041436 +1841 1769 1.0572373867e-9 +1842 1769 395862.740094 +1848 1769 -1.25914812088e-10 +1849 1769 1.86264514923e-9 +1853 1769 -96214.3623527 +1854 1769 -197931.041436 +1855 1769 -8754.17099187 +1856 1769 129499.570886 +1873 1769 54768.0344823 +1874 1769 -129500.089111 +1875 1769 -98965.873752 +1876 1769 -54768.0344823 +1877 1769 129500.089111 +1878 1769 -98965.873752 +1879 1769 -4.65661287308e-10 +1880 1769 -8.38190317154e-9 +1881 1769 197930.663979 +1770 1770 358626.492013 +1771 1770 -1.73956155777e-8 +1772 1770 -351.616086157 +1773 1770 5201.42139286 +1777 1770 -3164.59803631 +1778 1770 46813.5804188 +1784 1770 20099.2644293 +1785 1770 -5201.53753732 +1786 1770 -8527.06010246 +1790 1770 180899.202508 +1791 1770 -46813.3482152 +1792 1770 -9.60677862167e-9 +1834 1770 24797.9892543 +1835 1770 -366834.160567 +1841 1770 -20792.2939973 +1842 1770 96366.9662598 +1848 1770 2755.33486395 +1849 1770 -40759.3914785 +1853 1770 -187124.511312 +1854 1770 2.03870236874e-8 +1876 1770 -106294.356101 +1877 1770 366835.700488 +1878 1770 -5.41806221008e-9 +1879 1770 -11810.8233212 +1880 1770 40759.4993391 +1881 1770 46013.8328814 +1771 1771 971260.178894 +1772 1771 -35016.6833491 +1773 1771 517998.274395 +1777 1771 5.2884221077e-9 +1778 1771 -7.82310962677e-8 +1784 1771 26489.7721063 +1785 1771 -518000.345947 +1786 1771 -377711.310813 +1790 1771 -1.49011611938e-8 +1791 1771 6.053596735e-8 +1792 1771 485623.674247 +1834 1771 3.1478703022e-11 +1835 1771 -4.65661287308e-10 +1841 1771 96214.3623527 +1842 1771 -197931.041436 +1848 1771 -8754.17099187 +1849 1771 129499.570886 +1853 1771 -4.9713999033e-10 +1854 1771 254483.718186 +1876 1771 -6.98491930962e-10 +1877 1771 -6.51925802231e-9 +1878 1771 127240.270439 +1879 1771 54768.0344823 +1880 1771 -129500.089111 +1881 1771 -98965.873752 +1772 1772 342090663.772 +1773 1772 20866289.8227 +1776 1772 -.703921692126 +1777 1772 -168383875.652 +1778 1772 -10316056.9564 +1779 1772 -2.05882227421 +1780 1772 7085252.41719 +1781 1772 .342989078024 +1782 1772 -351.616086157 +1783 1772 35018.7421713 +1784 1772 -4369.26954177 +1785 1772 85440.0293564 +1786 1772 -4.7218054533e-9 +1787 1772 -1092.32031566 +1788 1772 21360.1220885 +1789 1772 35016.8233555 +1790 1772 -1092.32031566 +1791 1772 21360.1220885 +1792 1772 -35016.8233555 +1834 1772 -85034549.1728 +1835 1772 -5850419.08152 +1836 1772 -51131263.6705 +1837 1772 -278946.373452 +1838 1772 2897.71104755 +1839 1772 -2923.04621229 +1840 1772 51140017.8411 +1841 1772 -11692.1991532 +1842 1772 2.77012586594e-9 +1848 1772 167414042.57 +1849 1772 11489090.6977 +1850 1772 -2.08616256714e-7 +1851 1772 7.45058059692e-9 +1852 1772 -5948.45163191 +1853 1772 -2923.04621229 +1854 1772 -8754.17065986 +1855 1772 -85034549.1728 +1856 1772 -5850419.08152 +1857 1772 278946.373452 +1858 1772 19021.127033 +1859 1772 2897.71104755 +1873 1772 -3099.75149791 +1874 1772 5094.81276018 +1875 1772 8754.20599347 +1876 1772 -3099.75149791 +1877 1772 5094.81276018 +1878 1772 -8754.20599347 +1879 1772 -12399.0059916 +1880 1772 20379.1306196 +1773 1773 37500301.1453 +1775 1773 -2.38418579102e-7 +1776 1773 -.049651309615 +1777 1773 -10316056.9564 +1778 1773 -17789744.9176 +1779 1773 30.1945892535 +1780 1773 -103911980.278 +1781 1773 .0229732061271 +1782 1773 5201.42139286 +1783 1773 -518028.468985 +1784 1773 64634.1648191 +1785 1773 -1263905.75971 +1786 1773 6.98491930962e-8 +1787 1773 16158.5845512 +1788 1773 -315978.137404 +1789 1773 -518000.345496 +1790 1773 16158.5845512 +1791 1773 -315978.137404 +1792 1773 518000.345496 +1834 1773 -5850419.08152 +1835 1773 364040.890782 +1836 1773 -3486599.41191 +1837 1773 4090771.23176 +1838 1773 -42495.1679585 +1839 1773 43240.3285841 +1840 1773 3357099.84594 +1841 1773 172961.525935 +1842 1773 -4.09781932831e-8 +1848 1773 11489090.6977 +1849 1773 -288357.412095 +1850 1773 -1.39698386192e-8 +1851 1773 -1.19209289551e-7 +1852 1773 87234.5265084 +1853 1773 43240.3285841 +1854 1773 129499.565974 +1855 1773 -5850419.08152 +1856 1773 364040.890782 +1857 1773 -4090771.23176 +1858 1773 -278946.373452 +1859 1773 -42495.1679585 +1873 1773 45854.3120993 +1874 1773 -75367.0526654 +1875 1773 -129500.088661 +1876 1773 45854.3120993 +1877 1773 -75367.0526654 +1878 1773 129500.088661 +1879 1773 183417.248397 +1880 1773 -301466.429284 +1774 1774 49277441122.5 +1777 1774 2.058822155 +1778 1774 -30.1945892619 +1779 1774 -24603127529.4 +1783 1774 -24603127529.4 +1834 1774 -51131263.6705 +1835 1774 -3486599.41191 +1836 1774 -6164130960.44 +1840 1774 -6164130960.44 +1848 1774 2.08616256714e-7 +1849 1774 1.39698386192e-8 +1850 1774 12292668898.8 +1855 1774 51131263.6705 +1856 1774 3486599.41191 +1775 1775 1502655418.48 +1776 1775 -3.72529029846e-9 +1777 1775 -7085252.41719 +1778 1775 103911980.278 +1780 1775 495800576.583 +1781 1775 -.0107230299618 +1834 1775 278946.373452 +1835 1775 -4090771.23176 +1837 1775 -56439379.5827 +1838 1775 266308.66495 +1848 1775 -1.67638063431e-8 +1849 1775 2.38418579102e-7 +1851 1775 14515727.2657 +1852 1775 4.54019755125e-9 +1855 1775 -278946.373452 +1856 1775 4090771.23176 +1857 1775 -56439379.5827 +1858 1775 -3848555.53209 +1859 1775 -266308.66495 +1776 1776 7392610.22101 +1777 1776 .342989078024 +1778 1776 .0229732061271 +1780 1776 .0107230356662 +1781 1776 -3640690.99826 +1834 1776 -2897.71104755 +1835 1776 42495.1679585 +1837 1776 266308.66495 +1838 1776 -644583.725269 +1848 1776 5948.45163191 +1849 1776 -87234.5265085 +1852 1776 1316974.49901 +1855 1776 -2897.71104755 +1856 1776 42495.1679585 +1857 1776 -266308.66495 +1858 1776 -18159.371937 +1859 1776 -644583.725269 +1777 1777 225605571.38 +1778 1777 13855249.168 +1779 1777 2.38418579102e-7 +1780 1777 -3996361.94754 +1781 1777 -.471746305335 +1784 1777 -1092.32031566 +1785 1777 21360.1220885 +1786 1777 35016.8233555 +1790 1777 -9830.86274803 +1791 1777 192240.311944 +1792 1777 -4.59589064121e-9 +1834 1777 104775366.121 +1835 1777 7206550.28874 +1836 1777 -1.49011611939e-7 +1837 1777 -999149.614479 +1838 1777 -3987.96483854 +1841 1777 -2923.04621229 +1842 1777 8754.17065986 +1848 1777 -85034549.1728 +1849 1777 -5850419.08152 +1850 1777 51131263.6705 +1851 1777 278946.373452 +1852 1777 2897.71104755 +1853 1777 -26307.4404318 +1854 1777 2.89604067802e-9 +1876 1777 -27897.7634812 +1877 1777 45853.1084054 +1878 1777 6.2957406044e-11 +1879 1777 -3099.75149791 +1880 1777 5094.81276018 +1881 1777 8754.20599347 +1778 1778 23374374.414 +1779 1778 2.98023223877e-8 +1780 1778 58610457.2454 +1781 1778 -.03588822647 +1784 1778 16158.5845512 +1785 1778 -315978.137404 +1786 1778 -518000.345496 +1790 1778 145426.963728 +1791 1778 -2843791.5968 +1792 1778 6.79865479469e-8 +1834 1778 7206550.28874 +1835 1778 -411982.715712 +1836 1778 -1.210719347e-8 +1837 1778 14652610.2797 +1838 1778 58483.8283892 +1841 1778 43240.3285841 +1842 1778 -129499.565974 +1848 1778 -5850419.08152 +1849 1778 364040.890782 +1850 1778 3486599.41191 +1851 1778 -4090771.23176 +1852 1778 -42495.1679585 +1853 1778 389163.319997 +1854 1778 -4.28408384323e-8 +1876 1778 412688.808894 +1877 1778 -678300.420199 +1878 1778 -9.31322574615e-10 +1879 1778 45854.3120993 +1880 1778 -75367.0526654 +1881 1778 -129500.088661 +1779 1779 31735558094.2 +1834 1779 5.96046447754e-8 +1835 1779 5.58793544769e-9 +1836 1779 7873828470.83 +1848 1779 51131263.6705 +1849 1779 3486599.41191 +1850 1779 -6164130960.44 +1780 1780 1739881888.7 +1781 1780 -9.31322574615e-9 +1834 1780 -999149.614479 +1835 1780 14652610.2797 +1837 1780 -377612701.484 +1838 1780 3.14321368933e-9 +1848 1780 -278946.373452 +1849 1780 4090771.23176 +1851 1780 -56439379.5827 +1852 1780 -266308.66495 +1781 1781 4871565.38259 +1834 1781 3987.96483854 +1835 1781 -58483.8283892 +1837 1781 6.98491930962e-10 +1838 1781 876419.729865 +1848 1781 -2897.71104755 +1849 1781 42495.1679585 +1851 1781 -266308.66495 +1852 1781 -644583.725269 +1782 1782 79695.5890818 +1783 1782 303.10462848 +1784 1782 20099.2644293 +1785 1782 -5201.53753732 +1786 1782 8527.06010246 +1787 1782 40200.2271299 +1788 1782 -10402.9322686 +1789 1782 -8527.01717149 +1839 1782 -41582.7987175 +1840 1782 96366.5769059 +1841 1782 -20792.2939973 +1842 1782 -96366.9662598 +1848 1782 2755.33486395 +1849 1782 -40759.3914785 +1855 1782 5510.66257588 +1856 1782 -81518.677158 +1873 1782 -23620.7559537 +1874 1782 81519.0588888 +1875 1782 46013.6444839 +1879 1782 -11810.8233212 +1880 1782 40759.4993391 +1881 1782 -46013.8328814 +1783 1783 28417038612.8 +1784 1783 -26489.7721063 +1785 1783 518000.345947 +1786 1783 -377711.310813 +1787 1783 -26489.657294 +1788 1783 517998.273495 +1789 1783 -3351657809.19 +1839 1783 -96213.9812196 +1840 1783 5265432338.76 +1841 1783 -96214.3623527 +1842 1783 -197931.041436 +1848 1783 -51122509.4995 +1849 1783 -3616098.9828 +1850 1783 -6164130960.44 +1855 1783 3750066.18157 +1856 1783 125616.946165 +1857 1783 -697627335.553 +1858 1783 -11061748743.4 +1873 1783 -54767.8195516 +1874 1783 129499.565749 +1875 1783 648529395.22 +1879 1783 -54768.0344823 +1880 1783 129500.089111 +1881 1783 -98965.873752 +1784 1784 321764.40312 +1785 1784 -86178.7598106 +1786 1784 -3.07336449623e-8 +1787 1784 80437.701393 +1788 1784 -21544.689953 +1789 1784 -.00879157194868 +1790 1784 80437.701393 +1791 1784 -21544.689953 +1792 1784 .00879155658185 +1793 1784 78969.2426867 +1794 1784 21544.5178871 +1795 1784 -4.42378222942e-9 +1796 1784 19741.4605805 +1797 1784 5386.14395397 +1798 1784 -8829.80147696 +1799 1784 19741.4605805 +1800 1784 5386.14395397 +1801 1784 8829.80147696 +1834 1784 2578.65229194 +1835 1784 -38145.7439636 +1839 1784 -8897.5933828 +1840 1784 41522.6300347 +1841 1784 -35588.5921539 +1842 1784 1.16415321827e-8 +1848 1784 10314.6091678 +1849 1784 -152582.975854 +1853 1784 -8897.5933828 +1854 1784 -41522.6300347 +1855 1784 2578.65229194 +1856 1784 -38145.7439636 +1873 1784 -41406.2614577 +1874 1784 -5139.00679843 +1875 1784 192580.632807 +1876 1784 -41406.2614577 +1877 1784 -5139.00679843 +1878 1784 -192580.632807 +1879 1784 -165617.925512 +1880 1784 -20555.9059746 +1881 1784 2.09547579288e-8 +1903 1784 -47483.5447146 +1904 1784 173138.922235 +1905 1784 -6.51925802231e-9 +1906 1784 -11871.3315197 +1907 1784 43284.7305589 +1908 1784 50352.4358261 +1909 1784 -11871.3315197 +1910 1784 43284.7305589 +1911 1784 -50352.4358261 +1785 1785 2527825.07453 +1786 1785 -1.70432031155e-7 +1787 1785 -21544.689953 +1788 1785 631952.869249 +1789 1785 -.000901502557099 +1790 1785 -21544.689953 +1791 1785 631952.869249 +1792 1785 .00090142711997 +1793 1785 21544.5178871 +1794 1785 -1263909.29957 +1795 1785 6.33299350738e-8 +1796 1785 5386.14395397 +1797 1785 -315979.024334 +1798 1785 518000.345646 +1799 1785 5386.14395397 +1800 1785 -315979.024334 +1801 1785 -518000.345646 +1834 1785 5094.81159859 +1835 1785 -75367.0354821 +1839 1785 -43240.5555622 +1840 1785 129500.0842 +1841 1785 -172962.101828 +1842 1785 3.72529029846e-8 +1848 1785 20379.1259733 +1849 1785 -301466.360551 +1853 1785 -43240.5555622 +1854 1785 -129500.0842 +1855 1785 5094.81159859 +1856 1785 -75367.0354821 +1873 1785 -5139.00679843 +1874 1785 150733.30626 +1875 1785 .0032761846669 +1876 1785 -5139.00679843 +1877 1785 150733.30626 +1878 1785 -.00327620003372 +1879 1785 -20555.9059746 +1880 1785 602936.792946 +1881 1785 -3.77185642719e-8 +1903 1785 173138.922235 +1904 1785 -301468.53227 +1905 1785 -4.65661287308e-9 +1906 1785 43284.7305589 +1907 1785 -75367.5784085 +1908 1785 -129500.087176 +1909 1785 43284.7305589 +1910 1785 -75367.5784085 +1911 1785 129500.087176 +1786 1786 3021683.31748 +1787 1786 .00879155518487 +1788 1786 .000901421532035 +1789 1786 -1510837.38465 +1790 1786 -.00879157334566 +1791 1786 -.000901491381228 +1792 1786 -1510837.38465 +1793 1786 -2.21189111471e-8 +1794 1786 7.82310962677e-8 +1795 1786 755416.904332 +1796 1786 -8829.81030933 +1797 1786 518000.345796 +1798 1786 -377710.229512 +1799 1786 8829.81030932 +1800 1786 -518000.345796 +1801 1786 -377710.229512 +1834 1786 8754.20566145 +1835 1786 -129500.083749 +1839 1786 50276.8313036 +1840 1786 -98965.8479772 +1841 1786 1.81933864951e-8 +1842 1786 197930.715528 +1848 1786 -2.36090272665e-9 +1849 1786 3.49245965481e-8 +1853 1786 -50276.8313036 +1854 1786 -98965.8479772 +1855 1786 -8754.20566145 +1856 1786 129500.083749 +1873 1786 192580.623976 +1874 1786 .00327619258314 +1875 1786 -395860.644538 +1876 1786 -192580.623976 +1877 1786 -.00327620049939 +1878 1786 -395860.644538 +1879 1786 2.04890966415e-8 +1880 1786 -3.72529029846e-8 +1881 1786 791722.601283 +1903 1786 2.32830643654e-10 +1904 1786 -6.98491930962e-9 +1905 1786 197929.24339 +1906 1786 50352.4314138 +1907 1786 -129500.087326 +1908 1786 -98965.1451534 +1909 1786 -50352.4314138 +1910 1786 129500.087326 +1911 1786 -98965.1451534 +1787 1787 160882.20156 +1788 1787 -43089.3799053 +1789 1787 .00879155332223 +1793 1787 19741.4605805 +1794 1787 5386.14395397 +1795 1787 -8829.80147696 +1799 1787 39484.6213433 +1800 1787 10772.2589435 +1801 1787 8829.7749901 +1839 1787 -17794.296077 +1840 1787 41522.4593005 +1841 1787 -8897.5933828 +1842 1787 -41522.6300347 +1848 1787 2578.65229194 +1849 1787 -38145.7439636 +1855 1787 5157.30458388 +1856 1787 -76291.4879272 +1873 1787 -82808.962756 +1874 1787 -10277.9529873 +1875 1787 192579.853933 +1879 1787 -41406.2614577 +1880 1787 -5139.00679843 +1881 1787 -192580.632807 +1903 1787 -11871.3315197 +1904 1787 43284.7305589 +1905 1787 -50352.4358261 +1906 1787 -23741.7723573 +1907 1787 86569.4611177 +1908 1787 50352.2299761 +1788 1788 1263912.53726 +1789 1788 .000901385210454 +1793 1788 5386.14395397 +1794 1788 -315979.024334 +1795 1788 518000.345646 +1799 1788 10772.2589435 +1800 1788 -631954.649784 +1801 1788 -517998.273795 +1839 1788 -86481.0509139 +1840 1788 129499.57066 +1841 1788 -43240.5555622 +1842 1788 -129500.0842 +1848 1788 5094.81159859 +1849 1788 -75367.0354821 +1855 1788 10189.5629866 +1856 1788 -150733.180276 +1873 1788 -10277.9529873 +1874 1788 301468.396473 +1875 1788 -.00327621167526 +1879 1788 -5139.00679843 +1880 1788 150733.30626 +1881 1788 -.00327620282769 +1903 1788 43284.7305589 +1904 1788 -75367.5784085 +1905 1788 129500.087176 +1906 1788 86569.4611177 +1907 1788 -150734.266135 +1908 1788 -129499.567685 +1789 1789 6767152838.26 +1793 1789 -8829.81030933 +1794 1789 518000.345796 +1795 1789 -377710.229512 +1799 1789 -8829.76615774 +1800 1789 517998.273645 +1801 1789 -3347356370.89 +1839 1789 -50276.6347001 +1840 1789 678280437.955 +1841 1789 -50276.8313036 +1842 1789 -98965.8479772 +1848 1789 8754.20566145 +1849 1789 -129500.083749 +1855 1789 8754.1710071 +1856 1789 -129499.571111 +1857 1789 -1985951169.93 +1858 1789 9351101539.57 +1873 1789 -192579.862763 +1874 1789 .00327617302537 +1875 1789 -1361362305.12 +1879 1789 -192580.623976 +1880 1789 -.00327620236203 +1881 1789 -395860.644538 +1903 1789 -50352.4314138 +1904 1789 129500.087326 +1905 1789 -98965.1451534 +1906 1789 -50352.2343884 +1907 1789 129499.567534 +1908 1789 660284861.431 +1790 1790 723962.622619 +1791 1790 -193902.209575 +1792 1790 -2.46800482273e-8 +1793 1790 19741.4605805 +1794 1790 5386.14395397 +1795 1790 8829.80147696 +1796 1790 177678.974421 +1797 1790 48475.1962793 +1798 1790 -1.39698386192e-9 +1834 1790 23207.8706275 +1835 1790 -343311.695673 +1841 1790 -8897.5933828 +1842 1790 41522.6300347 +1848 1790 2578.65229194 +1849 1790 -38145.7439636 +1853 1790 -80075.2866556 +1854 1790 1.25728547573e-8 +1876 1790 -372644.146858 +1877 1790 -46250.8533816 +1878 1790 2.421438694e-8 +1879 1790 -41406.2614577 +1880 1790 -5139.00679843 +1881 1790 192580.632807 +1903 1790 -11871.3315197 +1904 1790 43284.7305589 +1905 1790 50352.4358261 +1909 1790 -106838.92991 +1910 1790 389562.57503 +1911 1790 -4.65661287308e-9 +1791 1791 5687599.13329 +1792 1791 -1.8160790205e-7 +1793 1791 5386.14395397 +1794 1791 -315979.024334 +1795 1791 -518000.345646 +1796 1791 48475.1962793 +1797 1791 -2843799.56569 +1798 1791 7.264316082e-8 +1834 1791 45853.0979512 +1835 1791 -678300.26555 +1841 1791 -43240.5555622 +1842 1791 129500.0842 +1848 1791 5094.81159859 +1849 1791 -75367.0354821 +1853 1791 -389164.793624 +1854 1791 3.77185642719e-8 +1876 1791 -46250.8533816 +1877 1791 1356605.87275 +1878 1791 -3.44589352608e-8 +1879 1791 -5139.00679843 +1880 1791 150733.30626 +1881 1791 .00327618699521 +1903 1791 43284.7305589 +1904 1791 -75367.5784085 +1905 1791 -129500.087176 +1909 1791 389562.57503 +1910 1791 -678305.151909 +1911 1791 -9.31322574615e-10 +1792 1792 1942517.57317 +1793 1792 8829.81030932 +1794 1792 -518000.345796 +1795 1792 -377710.229512 +1796 1792 -2.37487256527e-8 +1797 1792 7.91624188423e-8 +1798 1792 485622.296335 +1834 1792 -2.26646661758e-9 +1835 1792 3.35276126862e-8 +1841 1792 50276.8313036 +1842 1792 -98965.8479772 +1848 1792 -8754.20566145 +1849 1792 129500.083749 +1853 1792 1.71676278114e-8 +1854 1792 127240.386426 +1876 1792 1.53668224812e-8 +1877 1792 -3.35276126862e-8 +1878 1792 508965.583848 +1879 1792 192580.623976 +1880 1792 .00327619537711 +1881 1792 -395860.644538 +1903 1792 50352.4314138 +1904 1792 -129500.087326 +1905 1792 -98965.1451534 +1909 1792 -3.49245965481e-9 +1910 1792 -5.12227416038e-9 +1911 1792 127239.386622 +1793 1793 318826.342505 +1794 1793 3.25962901115e-9 +1795 1793 -3.25962901115e-8 +1796 1793 79703.186249 +1797 1793 1.16415321827e-9 +1798 1793 .00882210349664 +1799 1793 79703.186249 +1800 1793 1.62981450558e-9 +1801 1793 -.00882211932913 +1804 1793 19741.4605805 +1805 1793 -5386.14395397 +1806 1793 -8829.81030933 +1807 1793 78969.2426867 +1808 1793 -21544.5178871 +1809 1793 -1.11758708954e-8 +1817 1793 19741.4605805 +1818 1793 -5386.14395397 +1819 1793 8829.81030933 +1873 1793 -9007.60496207 +1874 1793 -40715.325504 +1875 1793 45937.5328796 +1876 1793 -9007.60496207 +1877 1793 -40715.325504 +1878 1793 -45937.5328796 +1879 1793 -36028.6384839 +1880 1793 -162861.302016 +1881 1793 1.55996531248e-8 +1903 1793 -166318.174881 +1904 1793 1.39698386192e-9 +1905 1793 1.67638063431e-8 +1906 1793 -41581.3248259 +1908 1793 192579.932918 +1909 1793 -41581.3248259 +1910 1793 1.39698386192e-9 +1911 1793 -192579.932918 +1935 1793 -9007.60496207 +1936 1793 40715.325504 +1937 1793 -45937.5328796 +1971 1793 -36028.6384839 +1972 1793 162861.302016 +1973 1793 -5.35510480404e-9 +1979 1793 -9007.60496207 +1980 1793 40715.325504 +1981 1793 45937.5328796 +1794 1794 2527828.617 +1795 1794 -1.30385160446e-7 +1796 1794 1.16415321827e-9 +1797 1794 631953.754872 +1798 1794 -3.81842255592e-8 +1799 1794 4.65661287308e-10 +1800 1794 631953.754872 +1801 1794 -1.67638063431e-8 +1804 1794 -5386.14395397 +1805 1794 -315979.024334 +1806 1794 -518000.345796 +1807 1794 -21544.5178871 +1808 1794 -1263909.29957 +1809 1794 1.67638063431e-8 +1817 1794 -5386.14395397 +1818 1794 -315979.024334 +1819 1794 518000.345796 +1873 1794 -40715.325504 +1874 1794 -75367.572681 +1875 1794 129500.085685 +1876 1794 -40715.325504 +1877 1794 -75367.572681 +1878 1794 -129500.085685 +1879 1794 -162861.302016 +1880 1794 -301468.50936 +1881 1794 3.49245965481e-8 +1903 1794 2.32830643654e-9 +1904 1794 602938.91746 +1905 1794 -2.88709998131e-8 +1906 1794 -2.32830643654e-10 +1907 1794 150733.838424 +1908 1794 -3.72529029846e-9 +1909 1794 2.56113708019e-9 +1910 1794 150733.838424 +1911 1794 -6.053596735e-9 +1935 1794 40715.325504 +1936 1794 -75367.572681 +1937 1794 129500.085685 +1971 1794 162861.302016 +1972 1794 -301468.50936 +1973 1794 -1.39698386192e-9 +1979 1794 40715.325504 +1980 1794 -75367.572681 +1981 1794 -129500.085685 +1795 1795 3021678.99654 +1796 1795 -.00882211979479 +1797 1795 -4.65661287308e-9 +1798 1795 -1510835.22844 +1799 1795 .00882210209966 +1800 1795 -4.19095158577e-8 +1801 1795 -1510835.22844 +1804 1795 -8829.80147697 +1805 1795 -518000.345646 +1806 1795 -377710.229512 +1807 1795 -8.84756445885e-9 +1808 1795 4.47034835815e-8 +1809 1795 755416.904332 +1817 1795 8829.80147696 +1818 1795 518000.345646 +1819 1795 -377710.229512 +1873 1795 45937.5284672 +1874 1795 129500.085535 +1875 1795 -98965.1365623 +1876 1795 -45937.5284672 +1877 1795 -129500.085535 +1878 1795 -98965.1365622 +1879 1795 1.18743628263e-8 +1880 1795 3.44589352608e-8 +1881 1795 197929.260573 +1903 1795 1.95577740669e-8 +1904 1795 -2.98023223877e-8 +1905 1795 791719.722378 +1906 1795 192579.924088 +1907 1795 -1.02445483208e-8 +1908 1795 -395859.206205 +1909 1795 -192579.924088 +1910 1795 1.86264514923e-9 +1911 1795 -395859.206205 +1935 1795 -45937.5284672 +1936 1795 129500.085535 +1937 1795 -98965.1365623 +1971 1795 6.98491930962e-10 +1972 1795 -1.07102096081e-8 +1973 1795 197929.260573 +1979 1795 45937.5284672 +1980 1795 -129500.085535 +1981 1795 -98965.1365623 +1796 1796 717351.986257 +1797 1796 -2.98023223877e-8 +1798 1796 -3.44589352608e-8 +1807 1796 19741.4605805 +1808 1796 -5386.14395397 +1809 1796 -8829.81030933 +1817 1796 177678.974421 +1818 1796 -48475.1962793 +1819 1796 -1.210719347e-8 +1876 1796 -81065.3908912 +1877 1796 -366437.929536 +1878 1796 1.42026692629e-8 +1879 1796 -9007.60496207 +1880 1796 -40715.325504 +1881 1796 45937.5328796 +1903 1796 -41581.3248259 +1904 1796 -1.62981450558e-9 +1905 1796 192579.932918 +1909 1796 -374219.710138 +1910 1796 5.58793544769e-9 +1911 1796 1.90921127796e-8 +1935 1796 -81065.3908912 +1936 1796 366437.929536 +1937 1796 -5.12227416038e-9 +1971 1796 -9007.60496207 +1972 1796 40715.325504 +1973 1796 45937.5328796 +1797 1797 5687607.10386 +1798 1797 -1.48080289364e-7 +1807 1797 -5386.14395397 +1808 1797 -315979.024334 +1809 1797 -518000.345796 +1817 1797 -48475.1962793 +1818 1797 -2843799.56569 +1819 1797 2.32830643654e-8 +1876 1797 -366437.929536 +1877 1797 -678305.100362 +1878 1797 2.79396772385e-8 +1879 1797 -40715.325504 +1880 1797 -75367.572681 +1881 1797 129500.085685 +1903 1797 -9.31322574615e-10 +1904 1797 150733.838424 +1905 1797 -2.32830643654e-9 +1909 1797 1.86264514923e-9 +1910 1797 1356610.65513 +1911 1797 -3.86498868465e-8 +1935 1797 366437.929536 +1936 1797 -678305.100362 +1937 1797 -1.86264514923e-9 +1971 1797 40715.325504 +1972 1797 -75367.572681 +1973 1797 -129500.085685 +1798 1798 1942514.78857 +1807 1798 -8829.80147697 +1808 1798 -518000.345646 +1809 1798 -377710.229512 +1817 1798 -1.42026692629e-8 +1818 1798 4.93600964546e-8 +1819 1798 485622.296336 +1876 1798 1.37370079756e-8 +1877 1798 4.19095158577e-8 +1878 1798 127239.425282 +1879 1798 45937.5284672 +1880 1798 129500.085535 +1881 1798 -98965.1365623 +1903 1798 192579.924088 +1904 1798 -8.38190317154e-9 +1905 1798 -395859.206205 +1909 1798 1.8160790205e-8 +1910 1798 -3.25962901115e-8 +1911 1798 508963.731325 +1935 1798 6.98491930962e-10 +1936 1798 -1.02445483208e-8 +1937 1798 127239.425282 +1971 1798 45937.5284672 +1972 1798 -129500.085535 +1973 1798 -98965.1365623 +1799 1799 159413.171253 +1800 1799 3.72529029846e-9 +1801 1799 .00882209325209 +1804 1799 39484.6213433 +1805 1799 -10772.2589436 +1806 1799 -8829.76615774 +1807 1799 19741.4605805 +1808 1799 -5386.14395397 +1809 1799 8829.81030933 +1873 1799 -18014.319242 +1874 1799 -81430.6510081 +1875 1799 45937.3446891 +1879 1799 -9007.60496207 +1880 1799 -40715.325504 +1881 1799 -45937.5328796 +1903 1799 -41581.3248259 +1904 1799 6.98491930962e-10 +1905 1799 -192579.932918 +1906 1799 -83159.0874406 +1907 1799 1.39698386192e-9 +1908 1799 192579.153824 +1971 1799 -9007.60496207 +1972 1799 40715.325504 +1973 1799 -45937.5328796 +1979 1799 -18014.319242 +1980 1799 81430.6510081 +1981 1799 45937.3446891 +1800 1800 1263914.3085 +1801 1800 -4.842877388e-8 +1804 1800 -10772.2589436 +1805 1800 -631954.649784 +1806 1800 -517998.273645 +1807 1800 -5386.14395397 +1808 1800 -315979.024334 +1809 1800 518000.345796 +1873 1800 -81430.6510081 +1874 1800 -150734.25468 +1875 1800 129499.569175 +1879 1800 -40715.325504 +1880 1800 -75367.572681 +1881 1800 -129500.085685 +1903 1800 1.16415321827e-9 +1904 1800 150733.838424 +1905 1800 -7.91624188423e-9 +1906 1800 1.86264514923e-9 +1907 1800 301469.45873 +1908 1800 -1.11758708954e-8 +1971 1800 40715.325504 +1972 1800 -75367.572681 +1973 1800 129500.085685 +1979 1800 81430.6510081 +1980 1800 -150734.25468 +1981 1800 -129499.569175 +1801 1801 6763861223.11 +1804 1801 8829.77499011 +1805 1801 517998.273795 +1806 1801 -3347356370.89 +1807 1801 8829.80147696 +1808 1801 518000.345646 +1809 1801 -377710.229512 +1873 1801 -45937.3491015 +1874 1801 -129499.569326 +1875 1801 670180348.654 +1879 1801 -45937.5284672 +1880 1801 -129500.085535 +1881 1801 -98965.1365622 +1903 1801 -192579.924088 +1904 1801 -1.86264514923e-9 +1905 1801 -395859.206205 +1906 1801 -192579.162654 +1907 1801 -8.38190317154e-9 +1908 1801 -1363041950.65 +1971 1801 -45937.5284672 +1972 1801 129500.085535 +1973 1801 -98965.1365623 +1979 1801 -45937.3491015 +1980 1801 129499.569326 +1981 1801 670180348.654 +1802 1802 358620.486373 +1803 1802 -2.31809914112e-8 +1807 1802 20099.2938422 +1808 1802 5202.17659333 +1809 1802 -8528.11010263 +1817 1802 180899.467191 +1818 1802 46819.0997097 +1819 1802 -1.69478356838e-8 +1820 1802 -351.659286304 +1821 1802 -5202.06044828 +1825 1802 39845.4197894 +1826 1802 300.994571215 +1827 1802 -3164.98683733 +1828 1802 -46819.3319131 +1935 1802 -106290.137671 +1936 1802 -366832.832408 +1937 1802 1.03943049908e-8 +1953 1802 24797.7953723 +1954 1802 366831.292489 +1971 1802 -11810.3546031 +1972 1802 -40759.1806638 +1973 1802 46012.7828802 +1982 1802 -20792.0600802 +1983 1802 96364.8662621 +1992 1802 -187122.406125 +1993 1802 6.97188079357e-9 +1999 1802 2755.31332137 +2000 1802 40759.0728014 +1803 1803 971257.403888 +1807 1803 26488.722105 +1808 1803 518000.345946 +1809 1803 -377710.231646 +1817 1803 -8.14907252789e-9 +1818 1803 3.72529029846e-8 +1819 1803 485622.286733 +1820 1803 -35016.6833491 +1821 1803 -517998.274395 +1825 1803 -300.994571225 +1826 1803 -755417.612087 +1827 1803 -2.89604067802e-9 +1828 1803 -4.28408384323e-8 +1935 1803 1.53668224812e-8 +1936 1803 3.35276126862e-8 +1937 1803 127238.882931 +1953 1803 -2.51829624176e-9 +1954 1803 -3.72529029846e-8 +1971 1803 54766.9844821 +1972 1803 129500.089111 +1973 1803 -98964.7945834 +1982 1803 96214.3623491 +1983 1803 -197928.883094 +1992 1803 1.69537961483e-8 +1993 1803 254480.943192 +1999 1803 -8754.17099186 +2000 1803 -129499.570885 +1804 1804 160882.064086 +1805 1804 43088.2164635 +1806 1804 .00879104388878 +1807 1804 80437.6326655 +1808 1804 21544.1082318 +1809 1804 .00879105227068 +1810 1804 -2184.55612228 +1811 1804 -32315.9189687 +1815 1804 40200.2859459 +1816 1804 -26488.607298 +1820 1804 -1092.28099124 +1821 1804 -16158.0028291 +1825 1804 20099.2938422 +1826 1804 26488.722105 +1903 1804 -11871.3315197 +1904 1804 -43284.7305589 +1905 1804 -50352.4358261 +1906 1804 -23741.7723573 +1907 1804 -86569.4611177 +1908 1804 50352.2299761 +1942 1804 5157.34037678 +1943 1804 76292.017408 +1961 1804 -17794.7208163 +1962 1804 41522.459301 +1971 1804 -41406.0669798 +1972 1804 5138.74205666 +1973 1804 -192579.582806 +1979 1804 -82808.5738191 +1980 1804 10277.4235078 +1981 1804 192578.803937 +1982 1804 -8897.80574762 +1983 1804 -41522.6300342 +1999 1804 2578.67018839 +2000 1804 38146.008704 +1805 1805 1263914.23353 +1806 1805 -.000901205465198 +1807 1805 21544.1082318 +1808 1805 631953.71739 +1809 1805 -.000901193358004 +1810 1805 -42720.1293465 +1811 1805 -631954.576132 +1815 1805 10404.2103778 +1816 1805 -517998.273495 +1820 1805 -21360.1794224 +1821 1805 -315978.985538 +1825 1805 5202.17659333 +1826 1805 518000.345946 +1903 1805 -43284.7305589 +1904 1805 -75367.5784085 +1905 1805 -129500.087176 +1906 1805 -86569.4611177 +1907 1805 -150734.266135 +1908 1805 129499.567685 +1942 1805 -10189.6708572 +1943 1805 -150734.775995 +1961 1805 86481.6882653 +1962 1805 -129499.57066 +1971 1805 5138.74205667 +1972 1805 150734.104121 +1973 1805 .00327596627176 +1979 1805 10277.4235078 +1980 1805 301469.992185 +1981 1805 .00327594857663 +1982 1805 43240.8742376 +1983 1805 129500.0842 +1999 1805 -5094.86553356 +2000 1805 -75367.8333367 +1806 1806 6767156762.51 +1807 1806 -.00879107881337 +1808 1806 .000901160761714 +1809 1806 -1510835.22631 +1810 1806 35016.6833187 +1811 1806 517998.273945 +1812 1806 -15454143643.7 +1813 1806 305327668.589 +1815 1806 -8528.06716852 +1816 1806 -3351661037.86 +1820 1806 35016.8233555 +1821 1806 518000.345496 +1825 1806 -8528.11010263 +1826 1806 -377710.231646 +1903 1806 -50352.4314138 +1904 1806 -129500.087326 +1905 1806 -98965.1451534 +1906 1806 -50352.2343884 +1907 1806 -129499.567534 +1908 1806 660284861.431 +1942 1806 8754.17100708 +1943 1806 129499.571111 +1944 1806 1985833103.57 +1945 1806 9351103813.72 +1961 1806 -50276.6346996 +1962 1806 678281801.94 +1971 1806 -192579.573976 +1972 1806 .00327597279102 +1973 1806 -395858.486196 +1979 1806 -192578.812766 +1980 1806 -.00327597372234 +1981 1806 -1361364371.17 +1982 1806 -50276.8313041 +1983 1806 -98964.7688106 +1999 1806 8754.20566147 +2000 1806 129500.08375 +1807 1807 321764.128171 +1808 1807 86176.432927 +1809 1807 -5.07570803165e-8 +1810 1807 -1092.28099124 +1811 1807 -16158.0028291 +1815 1807 20099.2938422 +1816 1807 -26488.722105 +1817 1807 80437.6326655 +1818 1807 21544.1082318 +1819 1807 .00879105366767 +1820 1807 -4369.11224457 +1821 1807 -64631.8379374 +1825 1807 80400.5718917 +1826 1807 -1.16415321827e-8 +1827 1807 -1092.28099124 +1828 1807 -16158.0028291 +1903 1807 -47483.5447146 +1904 1807 -173138.922235 +1905 1807 1.02445483208e-8 +1906 1807 -11871.3315197 +1907 1807 -43284.7305589 +1908 1807 50352.4358261 +1909 1807 -11871.3315197 +1910 1807 -43284.7305589 +1911 1807 -50352.4358261 +1935 1807 -41406.0669798 +1936 1807 5138.74205666 +1937 1807 -192579.582806 +1942 1807 2578.67018839 +1943 1807 38146.008704 +1953 1807 2578.67018839 +1954 1807 38146.008704 +1961 1807 -8897.80574762 +1962 1807 41522.6300342 +1971 1807 -165617.147638 +1972 1807 20554.8470156 +1973 1807 1.95577740669e-8 +1979 1807 -41406.0669798 +1980 1807 5138.74205666 +1981 1807 192579.582806 +1982 1807 -35589.4416326 +1983 1807 -2.32830643654e-9 +1992 1807 -8897.80574762 +1993 1807 -41522.6300342 +1999 1807 10314.6807536 +2000 1807 152584.034816 +1808 1808 2527828.46707 +1809 1808 -9.31322574615e-8 +1810 1808 -21360.1794224 +1811 1808 -315978.985538 +1815 1808 5202.17659333 +1816 1808 -518000.345946 +1817 1808 21544.1082318 +1818 1808 631953.71739 +1819 1808 -.000901183113456 +1820 1808 -85440.2586931 +1821 1808 -1263909.15226 +1825 1808 20808.4207557 +1826 1808 3.35276126862e-8 +1827 1808 -21360.1794224 +1828 1808 -315978.985538 +1903 1808 -173138.922235 +1904 1808 -301468.53227 +1905 1808 2.84053385258e-8 +1906 1808 -43284.7305589 +1907 1808 -75367.5784085 +1908 1808 129500.087176 +1909 1808 -43284.7305589 +1910 1808 -75367.5784085 +1911 1808 -129500.087176 +1935 1808 5138.74205667 +1936 1808 150734.104121 +1937 1808 .0032759681344 +1942 1808 -5094.86553356 +1943 1808 -75367.8333367 +1953 1808 -5094.86553356 +1954 1808 -75367.8333367 +1961 1808 43240.8742376 +1962 1808 -129500.0842 +1971 1808 20554.8470156 +1972 1808 602939.984371 +1973 1808 -4.88944351673e-8 +1979 1808 5138.74205666 +1980 1808 150734.104121 +1981 1808 -.00327598676085 +1982 1808 172963.376531 +1983 1808 -1.53668224812e-8 +1992 1808 43240.8742376 +1993 1808 129500.0842 +1999 1808 -20379.3417145 +2000 1808 -301469.551989 +1809 1809 3021679.00081 +1810 1809 -35016.8233555 +1811 1809 -518000.345496 +1815 1809 8528.11010263 +1816 1809 -377710.231646 +1817 1809 -.00879107881337 +1818 1809 .000901171937585 +1819 1809 -1510835.22631 +1820 1809 3.33674252033e-9 +1821 1809 4.93600964546e-8 +1825 1809 -1.61424279213e-8 +1826 1809 755416.900064 +1827 1809 35016.8233555 +1828 1809 518000.345496 +1903 1809 1.25728547573e-8 +1904 1809 2.46800482273e-8 +1905 1809 197929.24339 +1906 1809 50352.4314138 +1907 1809 129500.087326 +1908 1809 -98965.1451534 +1909 1809 -50352.4314138 +1910 1809 -129500.087326 +1911 1809 -98965.1451534 +1935 1809 -192579.573976 +1936 1809 .00327597558498 +1937 1809 -395858.486196 +1942 1809 -8754.20566147 +1943 1809 -129500.08375 +1953 1809 8754.20566147 +1954 1809 129500.08375 +1961 1809 50276.8313041 +1962 1809 -98964.7688106 +1971 1809 2.00234353542e-8 +1972 1809 -7.45058059692e-9 +1973 1809 791718.284611 +1979 1809 192579.573976 +1980 1809 -.003275974188 +1981 1809 -395858.486196 +1982 1809 3.26670706272e-9 +1983 1809 197928.557183 +1992 1809 -50276.8313041 +1993 1809 -98964.7688106 +1999 1809 -1.63689255714e-9 +2000 1809 -2.421438694e-8 +1810 1810 424589308.116 +1811 1810 12083862.1223 +1812 1810 -7084834.6062 +1813 1810 483051.682732 +1814 1810 -2.76486389339e-10 +1815 1810 -703.334106946 +1816 1810 35016.8233251 +1820 1810 -168383911.931 +1821 1810 10315447.4748 +1822 1810 5.96046447754e-8 +1823 1810 -7084834.6062 +1824 1810 2.76486389339e-10 +1825 1810 -351.659286304 +1826 1810 -35016.6833491 +1942 1810 58850622.7342 +1943 1810 -20347631.658 +1944 1810 278914.862748 +1945 1810 -19016.7168717 +1946 1810 2973.87385511 +1961 1810 -5846.14266142 +1962 1810 -3732559.8287 +1971 1810 -3099.73360146 +1972 1810 -5094.86669506 +1973 1810 -8754.20599346 +1979 1810 -6199.46720292 +1980 1810 -10189.6731802 +1981 1810 8754.17067509 +1982 1810 -2923.06775486 +1983 1810 -8754.17065987 +1999 1810 -85034597.1901 +2000 1810 5849727.59132 +2001 1810 -51131291.8077 +2002 1810 278914.862748 +2003 1810 -2897.36805847 +1811 1811 470089927.877 +1812 1811 -103912030.931 +1813 1811 7084834.6062 +1815 1811 -10404.3506945 +1816 1811 518000.345046 +1820 1811 10315447.4748 +1821 1811 -17789659.6808 +1822 1811 1.86264514923e-8 +1823 1811 -103912030.931 +1825 1811 -5202.06044828 +1826 1811 -517998.274395 +1942 1811 -20347631.658 +1943 1811 41889481.4779 +1944 1811 4090795.54511 +1945 1811 -278914.862748 +1946 1811 43617.2880799 +1961 1811 -86481.4003169 +1962 1811 384586.924436 +1971 1811 -45854.0473589 +1972 1811 -75367.8505186 +1973 1811 -129500.088661 +1979 1811 -91708.0947177 +1980 1811 -150734.810358 +1981 1811 129499.5662 +1982 1811 -43240.6472613 +1983 1811 -129499.565974 +1999 1811 5849727.59132 +2000 1811 364139.551833 +2001 1811 3486186.75252 +2002 1811 4090795.54511 +2003 1811 -42495.1909317 +1812 1812 237868690701 +1813 1812 3.197273377e10 +1816 1812 10075536434.3 +1820 1812 7084834.6062 +1821 1812 103912030.931 +1823 1812 495800845.358 +1824 1812 -2.09547579288e-9 +1942 1812 278914.862748 +1943 1812 4090795.54511 +1944 1812 -37936628386.8 +1945 1812 -16589871289.7 +1946 1812 -19486.0105974 +1962 1812 943453148.067 +1981 1812 679567486.645 +1999 1812 -278914.862748 +2000 1812 -4090795.54511 +2002 1812 -56439542.9974 +2003 1812 266308.811499 +1813 1813 573759050799 +1814 1813 -1.62981450558e-9 +1816 1813 -533700200.576 +1820 1813 -483051.682732 +1821 1813 -7084834.6062 +1823 1813 -33804237.6374 +1824 1813 2.61934474111e-10 +1942 1813 -19016.7168717 +1943 1813 -278914.862748 +1944 1813 -16589871289.7 +1945 1813 206811555431 +1946 1813 1328.57726849 +1962 1813 14047802585.7 +1981 1813 -8254691847.2 +1999 1813 19016.7168717 +2000 1813 278914.862748 +2002 1813 3848109.05729 +2003 1813 -18157.2226694 +1814 1814 3696304.11388 +1820 1814 2.61934474111e-10 +1823 1814 -3.84170562029e-9 +1824 1814 -3640689.98634 +1942 1814 -2973.87385511 +1943 1814 -43617.2880799 +1944 1814 19486.0105974 +1945 1814 -1328.57726849 +1946 1814 658486.897344 +1999 1814 2897.36805847 +2000 1814 42495.1909317 +2002 1814 266308.811499 +2003 1814 -644583.365458 +1815 1815 79694.2544904 +1816 1815 301.004626557 +1820 1815 -351.659286304 +1821 1815 -5202.06044828 +1825 1815 39845.4197894 +1826 1815 -300.994571225 +1942 1815 5510.61949105 +1943 1815 81518.0398084 +1961 1815 -41582.330903 +1962 1815 96364.4769092 +1971 1815 -11810.3546031 +1972 1815 -40759.1806638 +1973 1815 -46012.7828802 +1979 1815 -23619.8185272 +1980 1815 -81518.4215375 +1981 1815 46012.5944879 +1982 1815 -20792.0600802 +1983 1815 -96364.8662621 +1999 1815 2755.31332137 +2000 1815 40759.0728014 +1816 1816 28697434532 +1820 1816 35016.6833492 +1821 1816 517998.274395 +1822 1816 -24603120750.2 +1825 1816 300.994571215 +1826 1816 -755417.612087 +1942 1816 3750068.24039 +1943 1816 -125586.751576 +1944 1816 33788101.6308 +1945 1816 -11179881760.6 +1961 1816 -96213.9812233 +1962 1816 5168325822.38 +1971 1816 -54766.9844821 +1972 1816 -129500.089111 +1973 1816 -98964.7945834 +1979 1816 -54766.7695546 +1980 1816 -129499.565749 +1981 1816 648532434.939 +1982 1816 -96214.3623491 +1983 1816 -197928.883094 +1999 1816 -51122537.6367 +2000 1816 3615686.32341 +2001 1816 -6164127578.15 +1817 1817 723962.004005 +1818 1817 193896.974086 +1819 1817 -4.88944351673e-8 +1820 1817 -1092.28099124 +1821 1817 -16158.0028291 +1825 1817 20099.2938422 +1826 1817 -26488.722105 +1827 1817 -9830.50882907 +1828 1817 -145421.728241 +1903 1817 -11871.3315197 +1904 1817 -43284.7305589 +1905 1817 50352.4358261 +1909 1817 -106838.92991 +1910 1817 -389562.57503 +1911 1817 1.07102096081e-8 +1935 1817 -372642.396622 +1936 1817 46248.4707196 +1937 1817 2.04890966415e-8 +1953 1817 23208.0316955 +1954 1817 343314.078336 +1971 1817 -41406.0669798 +1972 1817 5138.74205666 +1973 1817 192579.582806 +1982 1817 -8897.80574762 +1983 1817 41522.6300342 +1992 1817 -80077.1979723 +1993 1817 -2.32830643654e-9 +1999 1817 2578.67018839 +2000 1817 38146.008704 +1818 1818 5687606.76652 +1819 1818 -8.475035429e-8 +1820 1818 -21360.1794224 +1821 1818 -315978.985538 +1825 1818 5202.17659333 +1826 1818 -518000.345946 +1827 1818 -192240.82795 +1828 1818 -2843799.23004 +1903 1818 -43284.7305589 +1904 1818 -75367.5784085 +1905 1818 129500.087176 +1909 1818 -389562.57503 +1910 1818 -678305.151909 +1911 1818 2.84053385258e-8 +1935 1818 46248.4707196 +1936 1818 1356613.05347 +1937 1818 -4.98257577419e-8 +1953 1818 -45853.5833681 +1954 1818 -678307.446274 +1971 1818 5138.74205666 +1972 1818 150734.104121 +1973 1818 -.00327598303556 +1982 1818 43240.8742376 +1983 1818 -129500.0842 +1992 1818 389167.661704 +1993 1818 -1.67638063431e-8 +1999 1818 -5094.86553356 +2000 1818 -75367.8333367 +1819 1819 1942514.79817 +1820 1819 -35016.8233555 +1821 1819 -518000.345496 +1825 1819 8528.11010263 +1826 1819 -377710.231646 +1827 1819 3.21082770824e-9 +1828 1819 4.74974513054e-8 +1903 1819 50352.4314138 +1904 1819 129500.087326 +1905 1819 -98965.1451534 +1909 1819 1.210719347e-8 +1910 1819 2.421438694e-8 +1911 1819 127239.386622 +1935 1819 2.00234353542e-8 +1936 1819 -8.84756445885e-9 +1937 1819 508962.808854 +1953 1819 -1.47949904203e-9 +1954 1819 -2.18860805035e-8 +1971 1819 192579.573976 +1972 1819 -.00327597046271 +1973 1819 -395858.486196 +1982 1819 50276.8313041 +1983 1819 -98964.7688106 +1992 1819 2.87648290396e-9 +1993 1819 127238.998909 +1999 1819 -8754.20566147 +2000 1819 -129500.08375 +1820 1820 342090740.74 +1821 1820 -20865049.2714 +1822 1820 -2.38418579102e-7 +1824 1820 -5.52972778678e-10 +1825 1820 -1406.66821389 +1826 1820 -3.27378511429e-9 +1827 1820 -168383911.931 +1828 1820 10315447.4748 +1829 1820 5.96046447754e-8 +1830 1820 -7084834.6062 +1831 1820 2.76486389339e-10 +1935 1820 -3099.73360146 +1936 1820 -5094.86669506 +1937 1820 -8754.20599346 +1942 1820 -85034597.1901 +1943 1820 5849727.59132 +1944 1820 -278914.862748 +1945 1820 19016.7168717 +1946 1820 -2897.36805847 +1953 1820 -85034597.1901 +1954 1820 5849727.59132 +1955 1820 -51131291.8077 +1956 1820 278914.862748 +1957 1820 -2897.36805847 +1961 1820 -2923.06775486 +1962 1820 51140045.9784 +1971 1820 -12398.9344058 +1972 1820 -20379.3463604 +1973 1820 2.70716845989e-9 +1979 1820 -3099.73360146 +1980 1820 -5094.86669506 +1981 1820 8754.20599346 +1982 1820 -11692.2853228 +1983 1820 8.18446278572e-10 +1992 1820 -2923.06775486 +1993 1820 -8754.17065987 +1999 1820 167414134.24 +2000 1820 -11487728.6379 +2001 1820 -1.49011611939e-7 +2002 1820 7.45058059692e-9 +2003 1820 5947.74771022 +1821 1821 37500132.8432 +1822 1821 1.49011611938e-8 +1823 1821 -2.38418579102e-7 +1825 1821 -20808.7013889 +1826 1821 -4.842877388e-8 +1827 1821 10315447.4748 +1828 1821 -17789659.6808 +1829 1821 1.86264514923e-8 +1830 1821 -103912030.931 +1935 1821 -45854.0473589 +1936 1821 -75367.8505186 +1937 1821 -129500.088661 +1942 1821 5849727.59132 +1943 1821 364139.551833 +1944 1821 -4090795.54511 +1945 1821 278914.862748 +1946 1821 -42495.1909317 +1953 1821 5849727.59132 +1954 1821 364139.551833 +1955 1821 3486186.75252 +1956 1821 4090795.54511 +1957 1821 -42495.1909317 +1961 1821 -43240.6472613 +1962 1821 -3356687.18655 +1971 1821 -183416.189435 +1972 1821 -301469.620716 +1973 1821 4.00468707085e-8 +1979 1821 -45854.0473589 +1980 1821 -75367.8505186 +1981 1821 129500.088661 +1982 1821 -172962.800634 +1983 1821 1.210719347e-8 +1992 1821 -43240.6472613 +1993 1821 -129499.565974 +1999 1821 -11487728.6379 +2000 1821 -288547.029782 +2001 1821 1.02445483208e-8 +2002 1821 1.19209289551e-7 +2003 1821 87234.5761598 +1822 1822 49277427583.6 +1827 1822 1.19209289551e-7 +1828 1822 -3.07336449623e-8 +1829 1822 -24603120750.2 +1942 1822 51131291.8077 +1943 1822 -3486186.75252 +1953 1822 -51131291.8077 +1954 1822 3486186.75252 +1955 1822 -6164127578.15 +1962 1822 -6164127578.15 +1999 1822 3.27825546265e-7 +2000 1822 -2.23517417908e-8 +2001 1822 12292662114.7 +1823 1823 1502656096.91 +1824 1823 3.72529029846e-9 +1827 1823 7084834.6062 +1828 1823 103912030.931 +1830 1823 495800845.358 +1831 1823 -2.09547579288e-9 +1942 1823 278914.862748 +1943 1823 4090795.54511 +1944 1823 -56439542.9974 +1945 1823 3848109.05729 +1946 1823 -266308.811499 +1953 1823 -278914.862748 +1954 1823 -4090795.54511 +1956 1823 -56439542.9974 +1957 1823 266308.811499 +1999 1823 -1.49011611938e-8 +2000 1823 -2.23517417908e-7 +2002 1823 14515470.2699 +2003 1823 -1.16415321827e-9 +1824 1824 7392608.22776 +1827 1824 2.61934474111e-10 +1830 1824 -3.84170562029e-9 +1831 1824 -3640689.98634 +1942 1824 2897.36805847 +1943 1824 42495.1909317 +1944 1824 -266308.811499 +1945 1824 18157.2226694 +1946 1824 -644583.365458 +1953 1824 2897.36805847 +1954 1824 42495.1909317 +1956 1824 266308.811499 +1957 1824 -644583.365458 +1999 1824 -5947.74771022 +2000 1824 -87234.5761598 +2002 1824 -4.7730281949e-9 +2003 1824 1316973.79469 +1825 1825 159388.508981 +1826 1825 -2.37345695496e-8 +1827 1825 -351.659286304 +1828 1825 -5202.06044828 +1935 1825 -11810.3546031 +1936 1825 -40759.1806638 +1937 1825 -46012.7828802 +1942 1825 2755.31332137 +1943 1825 40759.0728014 +1953 1825 2755.31332137 +1954 1825 40759.0728014 +1961 1825 -20792.0600802 +1962 1825 96364.8662621 +1971 1825 -47239.6370545 +1972 1825 -163036.843075 +1973 1825 9.63285565376e-9 +1979 1825 -11810.3546031 +1980 1825 -40759.1806638 +1981 1825 46012.7828802 +1982 1825 -83164.6618061 +1983 1825 4.76948916912e-9 +1992 1825 -20792.0600802 +1993 1825 -96364.8662621 +1999 1825 11021.2389821 +2000 1825 163036.079617 +1826 1826 1510839.50254 +1827 1826 35016.6833491 +1828 1826 517998.274395 +1935 1826 -54766.9844821 +1936 1826 -129500.089111 +1937 1826 -98964.7945834 +1942 1826 -8754.17099186 +1943 1826 -129499.570885 +1953 1826 8754.17099186 +1954 1826 129499.570885 +1961 1826 96214.3623491 +1962 1826 -197928.883094 +1971 1826 1.55996531248e-8 +1972 1826 3.53902578354e-8 +1973 1826 197928.505638 +1979 1826 54766.9844821 +1980 1826 129500.089111 +1981 1826 -98964.7945834 +1982 1826 1.84137374163e-8 +1983 1826 395858.423422 +1992 1826 -96214.3623491 +1993 1826 -197928.883094 +1999 1826 -2.5812536478e-9 +2000 1826 -3.81842255592e-8 +1827 1827 225605627.123 +1828 1827 -13854417.2781 +1829 1827 -2.38418579102e-7 +1830 1827 3996125.43717 +1831 1827 -3.71073838323e-10 +1935 1827 -27897.6024131 +1936 1827 -45853.5938216 +1937 1827 2.64421105385e-9 +1953 1827 104775421.145 +1954 1827 -7205691.46256 +1955 1827 -2.68220901489e-7 +1956 1827 999031.359292 +1957 1827 3987.49309224 +1971 1827 -3099.73360146 +1972 1827 -5094.86669506 +1973 1827 8754.20599346 +1982 1827 -2923.06775486 +1983 1827 8754.17065987 +1992 1827 -26307.6343139 +1993 1827 9.4436109066e-10 +1999 1827 -85034597.1901 +2000 1827 5849727.59132 +2001 1827 51131291.8077 +2002 1827 -278914.862748 +2003 1827 -2897.36805847 +1828 1828 23374267.7785 +1829 1828 1.49011611938e-8 +1830 1828 58610473.3719 +1935 1828 -412686.42623 +1936 1828 -678307.600911 +1937 1828 3.91155481339e-8 +1953 1828 -7205691.46256 +1954 1828 -412096.742029 +1955 1828 2.04890966415e-8 +1956 1828 14652618.343 +1957 1828 58483.8642774 +1971 1828 -45854.0473589 +1972 1828 -75367.8505186 +1973 1828 129500.088661 +1982 1828 -43240.6472613 +1983 1828 129499.565974 +1992 1828 -389166.188075 +1993 1828 1.39698386192e-8 +1999 1828 5849727.59132 +2000 1828 364139.551833 +2001 1828 -3486186.75252 +2002 1828 -4090795.54511 +2003 1828 -42495.1909317 +1829 1829 31735549406.3 +1953 1829 3.27825546265e-7 +1954 1829 -2.32830643654e-8 +1955 1829 7873824093.84 +1999 1829 51131291.8077 +2000 1829 -3486186.75252 +2001 1829 -6164127578.15 +1830 1830 1739882963.64 +1831 1830 5.58793544769e-9 +1953 1830 999031.359292 +1954 1830 14652618.343 +1956 1830 -377613505.496 +1957 1830 1.86264514923e-9 +1999 1830 278914.862748 +2000 1830 4090795.54511 +2002 1830 -56439542.9974 +2003 1830 -266308.811499 +1831 1831 4871564.13401 +1953 1831 -3987.49309224 +1954 1831 -58483.8642774 +1956 1831 -7.79982656241e-9 +1957 1831 876419.293483 +1999 1831 2897.36805847 +2000 1831 42495.1909317 +2002 1831 -266308.811499 +2003 1831 -644583.365458 +1832 1832 107134758.54 +1833 1832 -2.93366611004e-8 +1834 1832 -42041608.0577 +1835 1832 -3207439.50934 +1836 1832 51131341.8213 +1837 1832 -2279737.56439 +1838 1832 -2814.52384418 +1839 1832 -42899.198105 +1840 1832 -51229900.5031 +1841 1832 -171594.940285 +1842 1832 1.72294676304e-8 +1843 1832 4723344.51011 +1844 1832 2.38418579102e-7 +1847 1832 101379.600776 +1848 1832 78605001.2895 +1849 1832 6284107.03991 +1850 1832 8.94069671631e-8 +1851 1832 -2.98023223877e-8 +1852 1832 6275.43410912 +1853 1832 -42899.198105 +1854 1832 98558.68175 +1855 1832 -42041608.0577 +1856 1832 -3207439.50934 +1857 1832 2279737.56439 +1858 1832 155402.11064 +1859 1832 -2814.52384418 +1860 1832 -50712142.2448 +1861 1832 -2059962.83353 +1862 1832 3644907.01434 +1863 1832 -3867053.30194 +1864 1832 -63021850.6612 +1865 1832 -43491.6071775 +1866 1832 -50712142.2448 +1867 1832 96410.6799039 +1868 1832 -2059962.83353 +1869 1832 -3741317.69424 +1870 1832 3867053.30194 +1871 1832 63021850.6612 +1872 1832 -43491.6071775 +1873 1832 -18654.8167247 +1874 1832 -40246.0198449 +1875 1832 -48205.5312393 +1876 1832 -18654.8167247 +1877 1832 -40246.0198449 +1878 1832 48205.5312393 +1879 1832 -74618.3412204 +1880 1832 -160984.079379 +1881 1832 1.93249434233e-8 +1885 1832 95104.1666667 +1888 1832 -43308376.7361 +1889 1832 -40677.0833333 +1892 1832 43308376.7361 +1893 1832 -40677.0833333 +1894 1832 7246635.48251 +1895 1832 -38528.4495052 +1896 1832 -46057.721679 +1897 1832 7246635.48251 +1898 1832 -38528.4495052 +1899 1832 46057.721679 +1900 1832 -14356208.8779 +1901 1832 -154113.846211 +1902 1832 -3.72529029846e-9 +1833 1833 415707.962809 +1834 1833 4258.7856299 +1835 1833 -62999.7874245 +1839 1833 -102888.869643 +1840 1833 -102853.408197 +1841 1833 3.10787931085e-8 +1842 1833 205706.681014 +1843 1833 -3.81842255592e-8 +1848 1833 1.98315829039e-9 +1849 1833 -2.93366611004e-8 +1853 1833 102888.869643 +1854 1833 -102853.408197 +1855 1833 -4258.7856299 +1856 1833 62999.7874245 +1860 1833 96410.6799039 +1861 1833 125999.577581 +1862 1833 -207853.327457 +1866 1833 -96410.6799039 +1867 1833 -207853.327457 +1868 1833 -125999.577581 +1873 1833 -48205.533375 +1874 1833 -63000.0395342 +1875 1833 -51426.846153 +1876 1833 48205.533375 +1877 1833 63000.0395342 +1878 1833 -51426.846153 +1879 1833 1.58324837685e-8 +1880 1833 3.05008143187e-8 +1881 1833 102853.056398 +1894 1833 58941.9302781 +1895 1833 -126000.081472 +1896 1833 -103926.961367 +1897 1833 -58941.9302781 +1898 1833 126000.081472 +1899 1833 -103926.961367 +1900 1833 -1.93249434233e-8 +1901 1833 3.30619513988e-8 +1902 1833 207853.386128 +1834 1834 173964287.347 +1835 1834 10274852.9051 +1836 1834 2.38418579102e-7 +1837 1834 -2970125.19072 +1838 1834 -738.799682431 +1841 1834 -241.066528104 +1842 1834 26025.9133 +1843 1834 -3250004.45236 +1844 1834 51131341.8213 +1845 1834 2279737.56439 +1846 1834 155402.11064 +1847 1834 2814.52384418 +1848 1834 -124479787.322 +1849 1834 -7260787.24773 +1850 1834 -5.71835429966 +1851 1834 -7409888.41602 +1852 1834 -83.1872033674 +1853 1834 -2169.64128503 +1854 1834 4.34406101704e-9 +1866 1834 44660693.3696 +1867 1834 2.04611569643e-9 +1868 1834 3539724.30035 +1869 1834 -5.96046447754e-7 +1870 1834 -485912.98088 +1871 1834 -33123.0681967 +1872 1834 -4726.76452097 +1876 1834 -6738.91440165 +1877 1834 131783.119108 +1878 1834 -2.89604067802e-9 +1879 1834 -748.770085597 +1880 1834 14642.6392129 +1881 1834 26026.0173589 +1897 1834 -26619.9556351 +1898 1834 20872.0608076 +1899 1834 7.24010169506e-10 +1900 1834 -2957.77284834 +1901 1834 2319.12978673 +1902 1834 4258.80301227 +1835 1835 23983824.8586 +1836 1835 -1.49011611938e-8 +1837 1835 43561836.1354 +1838 1835 10857.460427 +1841 1835 3566.07290095 +1842 1835 -384998.717455 +1843 1835 5417340.79203 +1844 1835 3485453.13416 +1845 1835 -33443582.8517 +1846 1835 -2279737.56439 +1847 1835 -41288.8583498 +1848 1835 -7260787.24773 +1849 1835 -18482764.0745 +1850 1835 83.8739820365 +1851 1835 108685353.105 +1852 1835 1206.30960866 +1853 1835 32095.2852814 +1854 1835 -6.42612576485e-8 +1866 1835 3922808.97607 +1867 1835 -3.0267983675e-8 +1868 1835 -6997036.2338 +1869 1835 -4.00468707085e-8 +1870 1835 7128307.78797 +1871 1835 485912.98088 +1872 1835 69341.2888162 +1876 1835 99688.0828647 +1877 1835 -1949454.42467 +1878 1835 4.28408384323e-8 +1879 1835 11076.4805562 +1880 1835 -216607.088949 +1881 1835 -385000.256788 +1897 1835 393786.325962 +1898 1835 -308758.295971 +1899 1835 -1.07102096081e-8 +1900 1835 43754.036218 +1901 1835 -34306.6536498 +1902 1835 -63000.0445602 +1836 1836 23650062836.9 +1843 1836 3485453.13416 +1844 1836 -3012723841.83 +1848 1836 5.71835406125 +1849 1836 -83.8739820523 +1850 1836 -18272142178.5 +1866 1836 5.06639480591e-7 +1868 1836 3.44589352608e-8 +1869 1836 3767676239.01 +1837 1837 2143159143.64 +1843 1837 33443582.8517 +1845 1837 -216153759.266 +1846 1837 -14734481.2566 +1847 1837 -266309.071986 +1848 1837 7409888.41602 +1849 1837 -108685353.105 +1851 1837 557197134.933 +1852 1837 -.0297830947675 +1866 1837 -485912.98088 +1868 1837 7128307.78797 +1870 1837 -1033707595.08 +1871 1837 -70464401.0648 +1872 1837 3.84170562029e-9 +1838 1838 3751651.03456 +1843 1838 41288.8583498 +1845 1838 -266309.071986 +1846 1838 -18153.4017404 +1847 1838 -306308.911182 +1848 1838 -83.1872033674 +1849 1838 1206.30960866 +1851 1838 .029783097445 +1852 1838 -2691374.6212 +1866 1838 4726.76452097 +1868 1838 -69341.2888162 +1870 1838 -1.86264514923e-9 +1871 1838 -1.23691279441e-10 +1872 1838 491812.63494 +1839 1839 133222.768421 +1840 1839 224.003439023 +1841 1839 66610.0244933 +1842 1839 -223.995963972 +1843 1839 -41434.7770356 +1848 1839 -241.066528104 +1849 1839 3566.07290095 +1855 1839 -482.145461401 +1856 1839 7132.32931066 +1860 1839 -85797.4701426 +1861 1839 -82869.4990994 +1862 1839 102888.45614 +1873 1839 66855.3526623 +1874 1839 -7132.20307714 +1875 1839 -6338.47559793 +1879 1839 33427.0001486 +1880 1839 -3566.15865678 +1881 1839 6338.50750888 +1894 1839 -48572.6040702 +1895 1839 82869.8441506 +1896 1839 50388.6310429 +1900 1839 -24286.5334547 +1901 1839 41434.9064313 +1902 1839 -50388.8346623 +1840 1840 22609209518.9 +1841 1840 223.995963952 +1842 1840 -608497.938756 +1843 1840 -3548452.92682 +1844 1840 -3012723841.83 +1848 1840 26020.1949457 +1849 1840 -384914.843473 +1850 1840 -18272142178.5 +1855 1840 26104.1681784 +1856 1840 -386146.534208 +1857 1840 -11263716340.7 +1858 1840 -6473138210.9 +1860 1840 3642759.43867 +1861 1840 192033.116733 +1862 1840 749267506.889 +1863 1840 3401988481.53 +1864 1840 -10382453984.3 +1873 1840 -19687.4310999 +1874 1840 384998.716787 +1875 1840 -3545512488.55 +1879 1840 -19687.5164295 +1880 1840 385000.257122 +1881 1840 -304249.946526 +1891 1840 5633638658.85 +1892 1840 7989825094.27 +1894 1840 -54647.4188159 +1895 1840 62999.787315 +1896 1840 1670390121.83 +1900 1840 -54647.6355389 +1901 1840 63000.0447791 +1902 1840 -51426.8719214 +1841 1841 266445.536843 +1842 1841 -3.88909131288e-8 +1843 1841 -165738.998199 +1848 1841 -964.290922801 +1849 1841 14264.6586213 +1853 1841 66610.0244933 +1854 1841 -223.995963971 +1855 1841 -241.066528104 +1856 1841 3566.07290095 +1860 1841 -42899.198105 +1861 1841 -41434.7770356 +1862 1841 102888.869643 +1866 1841 -42899.198105 +1867 1841 -102888.869643 +1868 1841 -41434.7770356 +1873 1841 33427.0001486 +1874 1841 -3566.15865678 +1875 1841 -6338.50750889 +1876 1841 33427.0001486 +1877 1841 -3566.15865678 +1878 1841 6338.50750888 +1879 1841 133710.705325 +1880 1841 -14264.4061543 +1881 1841 -1.49814411998e-8 +1894 1841 -24286.5334547 +1895 1841 41434.9064313 +1896 1841 50388.8346623 +1897 1841 -24286.5334547 +1898 1841 41434.9064313 +1899 1841 -50388.8346623 +1900 1841 -97145.2081405 +1901 1841 165739.688301 +1902 1841 4.19691205025e-9 +1842 1842 1216999.28162 +1843 1842 1.49011611938e-8 +1848 1842 3.96631658077e-9 +1849 1842 -5.86733222008e-8 +1853 1842 223.995963952 +1854 1842 -608497.938756 +1855 1842 -26025.9133 +1856 1842 384998.717455 +1860 1842 98558.68175 +1861 1842 62999.7926695 +1862 1842 -102853.408197 +1866 1842 -98558.68175 +1867 1842 -102853.408197 +1868 1842 -62999.7926694 +1873 1842 19687.5164295 +1874 1842 -385000.257122 +1875 1842 -304249.946526 +1876 1842 -19687.5164295 +1877 1842 385000.257122 +1878 1842 -304249.946526 +1879 1842 -1.83936208487e-8 +1880 1842 5.07570803165e-8 +1881 1842 608497.686512 +1894 1842 54647.6355389 +1895 1842 -63000.0447791 +1896 1842 -51426.8719214 +1897 1842 -54647.6355389 +1898 1842 63000.0447791 +1899 1842 -51426.8719214 +1900 1842 3.72529029846e-9 +1901 1842 -1.8160790205e-8 +1902 1842 102853.004861 +1843 1843 92740950.0954 +1844 1843 2.38418579102e-7 +1847 1843 -92060.15808 +1848 1843 6113847.15786 +1849 1843 -10655271.9101 +1850 1843 6.51925802231e-9 +1851 1843 2.38418579102e-7 +1852 1843 -92060.15808 +1853 1843 -41434.7770356 +1854 1843 62999.7926695 +1855 1843 -3250004.45236 +1856 1843 5417340.79203 +1857 1843 -33443582.8517 +1858 1843 -2279737.56439 +1859 1843 41288.8583498 +1860 1843 -2059962.83353 +1861 1843 -42853570.3904 +1862 1843 3879033.57858 +1863 1843 56729388.2924 +1864 1843 3867053.30194 +1865 1843 41288.8583498 +1866 1843 -2059962.83353 +1867 1843 125999.577581 +1868 1843 -42853570.3904 +1869 1843 -4005033.15616 +1870 1843 -56729388.2924 +1871 1843 -3867053.30194 +1872 1843 41288.8583498 +1873 1843 -40246.0198449 +1874 1843 -34306.6364709 +1875 1843 -63000.0393152 +1876 1843 -40246.0198449 +1877 1843 -34306.6364709 +1878 1843 63000.0393152 +1879 1843 -160984.079379 +1880 1843 -137225.620205 +1881 1843 2.67755240202e-8 +1882 1843 6.435e7 +1883 1843 1.49011611939e-7 +1886 1843 -3.5475e7 +1887 1843 5.125e7 +1890 1843 -3.5475e7 +1894 1843 45471.2705575 +1895 1843 -67896.9939502 +1896 1843 -51376000.0867 +1897 1843 45471.2705575 +1898 1843 -67896.9939502 +1899 1843 126000.086717 +1900 1843 181885.03404 +1901 1843 -271586.107586 +1902 1843 -1.30385160446e-8 +1844 1844 22016646927.7 +1848 1844 -3.57627868652e-7 +1849 1844 -2.421438694e-8 +1850 1844 5952284137.65 +1855 1844 -51131341.8213 +1856 1844 -3485453.13416 +1860 1844 -3741317.69424 +1861 1844 -4005033.15616 +1862 1844 -10927741690.8 +1866 1844 3741317.69424 +1868 1844 4005033.15616 +1869 1844 -10927741690.8 +1882 1844 -1.19209289551e-7 +1883 1844 4935166666.67 +1886 1844 5.125e7 +1887 1844 -2511583333.33 +1890 1844 -5.125e7 +1896 1844 -2511583333.33 +1845 1845 743290654.616 +1846 1845 50667646.2897 +1847 1845 -7.45058059692e-9 +1848 1845 -1.49011611938e-8 +1849 1845 2.38418579102e-7 +1851 1845 -370717767.564 +1852 1845 -4.65661287308e-10 +1855 1845 -2279737.56439 +1856 1845 33443582.8517 +1857 1845 -216153759.266 +1858 1845 -14734481.2566 +1859 1845 266309.071986 +1860 1845 3867053.30194 +1861 1845 -56729388.2924 +1863 1845 309296981.029 +1864 1845 21083744.2068 +1865 1845 19486.0296575 +1866 1845 -3867053.30194 +1868 1845 56729388.2924 +1870 1845 309296981.029 +1871 1845 21083744.2068 +1872 1845 -19486.0296575 +1846 1846 808953844.555 +1847 1846 -3.72529029846e-9 +1848 1846 -9.31322574615e-10 +1849 1846 1.49011611938e-8 +1851 1846 -25270594.489 +1852 1846 -2.91038304567e-11 +1855 1846 -155402.11064 +1856 1846 2279737.56439 +1857 1846 -14734481.2566 +1858 1846 -1004400.47233 +1859 1846 18153.4017404 +1860 1846 63021850.6612 +1861 1846 -3867053.30194 +1863 1846 21083744.2068 +1864 1846 352015333.563 +1865 1846 20859.5476883 +1866 1846 -63021850.6612 +1868 1846 3867053.30194 +1870 1846 21083744.2068 +1871 1846 352015333.563 +1872 1846 -20859.5476883 +1884 1846 -494302083.333 +1885 1846 -3.60887497664e-9 +1888 1846 -272778645.833 +1889 1846 -266927.083333 +1892 1846 -272778645.833 +1893 1846 266927.083333 +1894 1846 -43308376.7361 +1897 1846 43308376.7361 +1847 1847 3428076.66175 +1848 1847 -6275.43410912 +1849 1847 92060.15808 +1851 1847 2.21189111471e-9 +1852 1847 669776.842693 +1855 1847 2814.52384418 +1856 1847 -41288.8583498 +1857 1847 266309.071986 +1858 1847 18153.4017404 +1859 1847 -306308.911182 +1860 1847 -43491.6071775 +1861 1847 41288.8583498 +1863 1847 -19486.0296575 +1864 1847 -20859.5476883 +1865 1847 -1588129.31055 +1866 1847 -43491.6071775 +1868 1847 41288.8583498 +1870 1847 19486.0296575 +1871 1847 20859.5476883 +1872 1847 -1588129.31055 +1884 1847 -6.98491930962e-10 +1885 1847 571006.944444 +1888 1847 -266927.083333 +1889 1847 -251128.472222 +1892 1847 266927.083333 +1893 1847 -251128.472222 +1894 1847 40677.0833333 +1897 1847 40677.0833333 +1900 1847 -95104.1666667 +1848 1848 257084527.009 +1849 1848 14987144.7768 +1851 1848 1.49011611938e-8 +1852 1848 -326.982477209 +1853 1848 -241.066528104 +1854 1848 -26025.9133 +1855 1848 -124479787.322 +1856 1848 -7260787.24773 +1857 1848 -7409888.41602 +1858 1848 -505187.187276 +1859 1848 -83.1872033674 +1860 1848 -42041608.0577 +1861 1848 -3250004.45236 +1862 1848 51135600.607 +1863 1848 2279737.56439 +1864 1848 155402.11064 +1865 1848 2814.52384418 +1866 1848 -42041608.0577 +1867 1848 -4258.7856299 +1868 1848 -3250004.45236 +1869 1848 -51131341.8213 +1870 1848 -2279737.56439 +1871 1848 -155402.11064 +1872 1848 2814.52384418 +1873 1848 -748.770085597 +1874 1848 14642.6392129 +1875 1848 26026.0173589 +1876 1848 -748.770085597 +1877 1848 14642.6392129 +1878 1848 -26026.0173589 +1879 1848 -2995.07079397 +1880 1848 58570.1871301 +1881 1848 -3.17934900522e-9 +1894 1848 -2957.77284834 +1895 1848 2319.12978673 +1896 1848 4258.80301227 +1897 1848 -2957.77284834 +1898 1848 2319.12978673 +1899 1848 -4258.80301227 +1900 1848 -11831.0913934 +1901 1848 9276.45657105 +1902 1848 6.92531466484e-10 +1849 1849 38304070.5977 +1851 1849 -2.38418579102e-7 +1852 1849 4825.63157157 +1853 1849 3566.07290095 +1854 1849 384998.717455 +1855 1849 -7260787.24773 +1856 1849 -18482764.0745 +1857 1849 108685353.105 +1858 1849 7409888.41602 +1859 1849 1206.30960866 +1860 1849 -3207439.50934 +1861 1849 5417340.79203 +1862 1849 3422453.34673 +1863 1849 -33443582.8517 +1864 1849 -2279737.56439 +1865 1849 -41288.8583498 +1866 1849 -3207439.50934 +1867 1849 62999.7874245 +1868 1849 5417340.79203 +1869 1849 -3485453.13416 +1870 1849 33443582.8517 +1871 1849 2279737.56439 +1872 1849 -41288.8583498 +1873 1849 11076.4805562 +1874 1849 -216607.088949 +1875 1849 -385000.256788 +1876 1849 11076.4805562 +1877 1849 -216607.088949 +1878 1849 385000.256788 +1879 1849 44305.7809758 +1880 1849 -866422.88654 +1881 1849 4.70317900181e-8 +1894 1849 43754.036218 +1895 1849 -34306.6536498 +1896 1849 -63000.0445602 +1897 1849 43754.036218 +1898 1849 -34306.6536498 +1899 1849 63000.0445602 +1900 1849 175016.144872 +1901 1849 -137225.688921 +1902 1849 -1.02445483208e-8 +1850 1850 36653040925.1 +1855 1850 5.71835406125 +1856 1850 -83.8739820523 +1860 1850 51131341.8213 +1861 1850 3485453.13416 +1862 1850 -3012723841.83 +1866 1850 -51131341.8213 +1868 1850 -3485453.13416 +1869 1850 -3012723841.83 +1851 1851 1494618024.64 +1852 1851 -3.72529029846e-9 +1855 1851 7409888.41602 +1856 1851 -108685353.105 +1857 1851 557197134.933 +1858 1851 37987854.7014 +1859 1851 -.0297830947675 +1860 1851 -2279737.56439 +1861 1851 33443582.8517 +1863 1851 -216153759.266 +1864 1851 -14734481.2566 +1865 1851 -266309.071986 +1866 1851 2279737.56439 +1868 1851 -33443582.8517 +1870 1851 -216153759.266 +1871 1851 -14734481.2566 +1872 1851 266309.071986 +1852 1852 5552681.37999 +1855 1852 -83.1872033674 +1856 1852 1206.30960866 +1857 1852 .029783097445 +1858 1852 -.436843656294 +1859 1852 -2691374.6212 +1860 1852 -2814.52384418 +1861 1852 41288.8583498 +1863 1852 -266309.071986 +1864 1852 -18153.4017404 +1865 1852 -306308.911182 +1866 1852 -2814.52384418 +1868 1852 41288.8583498 +1870 1852 266309.071986 +1871 1852 18153.4017404 +1872 1852 -306308.911182 +1853 1853 599499.544216 +1854 1853 -4.11313027144e-8 +1866 1853 -386089.607857 +1867 1853 3.1947158277e-8 +1868 1853 -372912.804846 +1876 1853 300847.638018 +1877 1853 -32095.0362433 +1878 1853 -1.59632414579e-8 +1879 1853 33427.0001486 +1880 1853 -3566.15865678 +1881 1853 -6338.50750889 +1897 1853 -218577.214215 +1898 1853 372914.265155 +1899 1853 3.93260270357e-9 +1900 1853 -24286.5334547 +1901 1853 41434.9064313 +1902 1853 50388.8346623 +1854 1854 782359.416483 +1866 1854 1.72294676304e-8 +1867 1854 132239.900435 +1868 1854 1.44354999065e-8 +1876 1854 -1.90921127796e-8 +1877 1854 5.40167093277e-8 +1878 1854 391175.311073 +1879 1854 19687.5164295 +1880 1854 -385000.257122 +1881 1854 -304249.946526 +1897 1854 3.49245965481e-9 +1898 1854 -1.8160790205e-8 +1899 1854 66119.195015 +1900 1854 54647.6355389 +1901 1854 -63000.0447791 +1902 1854 -51426.8719214 +1855 1855 538704256.546 +1856 1855 -151181014.954 +1857 1855 7409888.41602 +1858 1855 505187.187276 +1859 1855 -163.491238604 +1860 1855 -153813369.835 +1861 1855 129281115.503 +1862 1855 -3737058.89122 +1863 1855 -2279737.56439 +1864 1855 -155402.11064 +1865 1855 -3137.71705456 +1873 1855 -1497.53539698 +1874 1855 29285.0935651 +1875 1855 26025.9132774 +1879 1855 -748.770085597 +1880 1855 14642.6392129 +1881 1855 -26026.0173589 +1890 1855 24623796.6614 +1894 1855 -44541542.8375 +1895 1855 4638.22828552 +1896 1855 4258.7856373 +1900 1855 -2957.77284834 +1901 1855 2319.12978673 +1902 1855 -4258.80301227 +1856 1856 511725211.261 +1857 1856 -108685353.105 +1858 1856 -7409888.41602 +1859 1856 2412.81578579 +1860 1856 129366245.444 +1861 1856 -184363109.023 +1862 1856 -318033.200827 +1863 1856 33443582.8517 +1864 1856 2279737.56439 +1865 1856 46030.07904 +1873 1856 22152.8904879 +1874 1856 -433211.44327 +1875 1856 -384998.717121 +1879 1856 11076.4805562 +1880 1856 -216607.088949 +1881 1856 385000.256788 +1890 1856 -46302000.3506 +1894 1856 24711304.7338 +1895 1856 -68612.8444604 +1896 1856 -62999.787534 +1900 1856 43754.036218 +1901 1856 -34306.6536498 +1902 1856 63000.0445602 +1857 1857 3.3072203631e11 +1858 1857 -116421139939 +1859 1857 -.40703563951 +1860 1857 -2279737.56439 +1861 1857 33443582.8517 +1862 1857 4342547334.72 +1863 1857 -1.2037409458e11 +1864 1857 85616392203.2 +1865 1857 -19486.0296575 +1875 1857 15766816976.5 +1891 1857 -45825074122.7 +1892 1857 2478478306.44 +1896 1857 -5367952113.54 +1858 1858 532453875672 +1859 1858 5.97019663779 +1860 1858 -155402.11064 +1861 1858 2279737.56439 +1862 1858 16597309955.2 +1863 1858 85616392203.2 +1864 1858 18991490708.3 +1865 1858 -1328.29768832 +1875 1858 -150647611.561 +1891 1858 2478478306.44 +1892 1858 -72046584378.3 +1896 1858 -7633187599.72 +1859 1859 2776340.69 +1860 1859 3137.71705456 +1861 1859 -46030.07904 +1863 1859 19486.0296575 +1864 1859 1328.29768832 +1865 1859 334888.421346 +1860 1860 513890317.787 +1861 1860 -254387886.2 +1862 1860 -51227752.8845 +1863 1860 3867053.30194 +1864 1860 63021850.6612 +1865 1860 50689.8003879 +1873 1860 -37309.1706102 +1874 1860 -80492.0396897 +1875 1860 -48205.3402847 +1879 1860 -18654.8167247 +1880 1860 -40246.0198449 +1881 1860 48205.5312393 +1884 1860 -43308376.7361 +1885 1860 -40677.0833333 +1890 1860 103845008.958 +1892 1860 -43308376.7361 +1893 1860 47552.0833333 +1894 1860 -121655164.339 +1895 1860 -77056.9231053 +1896 1860 -46057.9555688 +1900 1860 7246635.48251 +1901 1860 -38528.4495052 +1902 1860 46057.721679 +1861 1861 864698883.742 +1862 1861 -54861453.2208 +1863 1861 -56729388.2924 +1864 1861 -3867053.30194 +1865 1861 -46030.07904 +1873 1861 -80492.0396897 +1874 1861 -68612.8101025 +1875 1861 -62999.7927789 +1879 1861 -40246.0198449 +1880 1861 -34306.6364709 +1881 1861 63000.0393152 +1882 1861 -3.5475e7 +1883 1861 5.125e7 +1890 1861 -375687408.217 +1894 1861 103935951.475 +1895 1861 -135793.053793 +1896 1861 3624000.42253 +1900 1861 45471.2705575 +1901 1861 -67896.9939502 +1902 1861 126000.086717 +1862 1862 14147633936.5 +1863 1862 -8728091183.89 +1864 1862 4225908365.83 +1873 1862 48205.338149 +1874 1862 62999.79256 +1875 1862 1695553689.94 +1879 1862 48205.533375 +1880 1862 63000.0395342 +1881 1862 -51426.846153 +1882 1862 5.125e7 +1883 1862 -2511583333.33 +1890 1862 -3.75e6 +1891 1862 -15377177176.6 +1892 1862 -3780438789.23 +1894 1862 -58942.1126311 +1895 1862 125999.582716 +1896 1862 -50161820.1438 +1900 1862 -58941.9302781 +1901 1862 126000.081472 +1902 1862 -103926.961367 +1863 1863 3.0940650923e11 +1864 1863 -164533305689 +1865 1863 266309.071986 +1875 1863 -6548892992.14 +1891 1863 55350311962.4 +1892 1863 1.1793777468e11 +1896 1863 12163459582.3 +1864 1864 587654697135 +1865 1864 285080.485074 +1875 1864 8103849026.72 +1884 1864 -272778645.833 +1885 1864 -266927.083333 +1891 1864 1.1793777468e11 +1892 1864 -364266418691 +1893 1864 19531.25 +1894 1864 -43308376.7361 +1896 1864 -1666691854.55 +1900 1864 43308376.7361 +1865 1865 1714038.33088 +1884 1865 -266927.083333 +1885 1865 -251128.472222 +1892 1865 -19531.25 +1893 1865 285503.472222 +1894 1865 -47552.0833333 +1900 1865 40677.0833333 +1866 1866 74420503.6534 +1867 1866 -2.98023223877e-8 +1868 1866 3729233.37224 +1869 1866 -2.38418579102e-7 +1870 1866 -971825.961762 +1871 1866 -11974329.6823 +1872 1866 80597.3002353 +1876 1866 -167891.763645 +1877 1866 -362214.178604 +1878 1866 1.90921127796e-8 +1879 1866 -18654.8167247 +1880 1866 -40246.0198449 +1881 1866 -48205.5312393 +1884 1866 43308376.7361 +1885 1866 -40677.0833333 +1888 1866 -5954041.77297 +1889 1866 75870.5357143 +1897 1866 -9365664.98405 +1898 1866 -346756.128158 +1899 1866 -4.42378222942e-9 +1900 1866 7246635.48251 +1901 1866 -38528.4495052 +1902 1866 -46057.721679 +1867 1867 267241.884221 +1868 1867 -3.95812094212e-8 +1876 1867 1.62981450558e-8 +1877 1867 3.0966475606e-8 +1878 1867 66119.3109729 +1879 1867 -48205.533375 +1880 1867 -63000.0395342 +1881 1867 -51426.846153 +1897 1867 -1.90921127796e-8 +1898 1867 3.30619513988e-8 +1899 1867 133619.602738 +1900 1867 58941.9302781 +1901 1867 -126000.081472 +1902 1867 -103926.961367 +1868 1868 66476520.0139 +1869 1868 -2.38418579102e-7 +1870 1868 14256615.576 +1871 1868 971825.961762 +1872 1868 -69341.2888162 +1876 1868 -362214.178604 +1877 1868 -308758.14136 +1878 1868 2.67755240202e-8 +1879 1868 -40246.0198449 +1880 1868 -34306.6364709 +1881 1868 -63000.0393152 +1882 1868 -3.5475e7 +1883 1868 -5.125e7 +1886 1868 34296428.5714 +1887 1868 2.98023223877e-8 +1897 1868 409241.352406 +1898 1868 -611069.742897 +1899 1868 -1.39698386192e-8 +1900 1868 45471.2705575 +1901 1868 -67896.9939502 +1902 1868 -126000.086717 +1869 1869 14283065160.1 +1882 1869 -5.125e7 +1883 1869 -2511583333.33 +1886 1869 -2.98023223877e-8 +1887 1869 3101892857.14 +1870 1870 1273218736.76 +1871 1870 86791077.2224 +1872 1870 -7.45058059692e-9 +1871 1871 1484864919.14 +1872 1871 -1.86264514923e-9 +1884 1871 -272778645.833 +1885 1871 266927.083333 +1888 1871 -1278892857.14 +1889 1871 -9.31322574615e-10 +1897 1871 -5954041.77297 +1900 1871 -43308376.7361 +1872 1872 2473568.61183 +1884 1872 266927.083333 +1885 1872 -251128.472222 +1888 1872 -4.65661287308e-10 +1889 1872 440736.607143 +1897 1872 -75870.5357143 +1900 1872 40677.0833333 +1873 1873 267475.085169 +1874 1873 -29537.288503 +1875 1873 .00653401715681 +1879 1873 133734.835493 +1880 1873 -14768.6431905 +1881 1873 .00653402227908 +1894 1873 -182636.217469 +1895 1873 -4677.47981172 +1896 1873 205704.81247 +1900 1873 -91319.0337391 +1901 1873 -2338.75565023 +1902 1873 -205705.639289 +1903 1873 33181.2449231 +1904 1873 3692.19474844 +1905 1873 -6562.50109772 +1906 1873 66363.8437667 +1907 1873 7384.36590103 +1908 1873 6562.48141209 +1927 1873 -48602.4030223 +1928 1873 85169.5299977 +1929 1873 52499.8239511 +1930 1873 -24301.4329292 +1931 1873 42584.7649988 +1932 1873 -52500.0361274 +1874 1874 866431.889514 +1875 1874 .00066901370883 +1879 1874 -14768.6431905 +1880 1874 433213.206578 +1881 1874 .000669085420668 +1894 1874 -4677.47981172 +1895 1874 137226.197129 +1896 1874 -.00349877402186 +1900 1874 -2338.75565023 +1901 1874 68612.6350561 +1902 1874 -.00349874026142 +1903 1874 3692.19474844 +1904 1874 -216609.368034 +1905 1874 385000.256899 +1906 1874 7384.36590103 +1907 1874 -433215.998259 +1908 1874 -384998.71701 +1927 1874 85169.5299977 +1928 1874 -68613.3065586 +1929 1874 -62999.7892073 +1930 1874 42584.7649988 +1931 1874 -34306.8846973 +1932 1874 63000.0428868 +1875 1875 7436039926.69 +1879 1875 -.00653405021876 +1880 1875 -.000669138971716 +1881 1875 -1216989.46221 +1891 1875 590084373.396 +1892 1875 -18841605815.1 +1894 1875 -205704.816765 +1895 1875 .00349876005202 +1896 1875 -3676561030.57 +1900 1875 -205705.634995 +1901 1875 -.00349872908555 +1902 1875 -205706.116709 +1903 1875 -6562.50766212 +1904 1875 385000.257011 +1905 1875 -304246.736798 +1906 1875 -6562.4748477 +1907 1875 384998.716898 +1908 1875 -3545403671.34 +1917 1875 5946909857.07 +1918 1875 8037289445.89 +1927 1875 -52499.8260974 +1928 1875 62999.7891341 +1929 1875 1681263972.35 +1930 1875 -52500.0339811 +1931 1875 63000.04296 +1932 1875 -51426.5130132 +1876 1876 1203632.08235 +1877 1876 -132917.79599 +1878 1876 -5.02914190292e-8 +1879 1876 133734.835493 +1880 1876 -14768.6431905 +1881 1876 -.00653404928744 +1897 1876 -821864.960762 +1898 1876 -21048.6928907 +1899 1876 5.35510480404e-8 +1900 1876 -91319.0337391 +1901 1876 -2338.75565023 +1902 1876 205705.639289 +1903 1876 33181.2449231 +1904 1876 3692.19474844 +1905 1876 6562.50109771 +1909 1876 298635.846321 +1910 1876 33229.6718359 +1911 1876 -2.07219272852e-8 +1920 1876 -218711.309496 +1921 1876 383262.88499 +1922 1876 -2.79396772385e-9 +1930 1876 -24301.4329292 +1931 1876 42584.7649988 +1932 1876 52500.0361274 +1877 1877 3898937.63529 +1878 1877 -1.06170773506e-7 +1879 1877 -14768.6431905 +1880 1877 433213.206578 +1881 1877 -.000669133383781 +1897 1877 -21048.6928907 +1898 1877 617516.893847 +1899 1877 -2.56113708019e-8 +1900 1877 -2338.75565023 +1901 1877 68612.6350561 +1902 1877 .00349872838706 +1903 1877 3692.19474844 +1904 1877 -216609.368034 +1905 1877 -385000.256899 +1909 1877 33229.6718359 +1910 1877 -1949474.92553 +1911 1877 6.93835318089e-8 +1920 1877 383262.88499 +1921 1877 -308760.375409 +1922 1877 -1.04773789644e-8 +1930 1877 42584.7649988 +1931 1877 -34306.8846973 +1932 1877 -63000.0428869 +1878 1878 1564710.57674 +1879 1878 .00653402274474 +1880 1878 .000669094268233 +1881 1878 -1216989.46221 +1897 1878 4.19095158577e-8 +1898 1878 -3.28291207552e-8 +1899 1878 264478.899442 +1900 1878 205705.634995 +1901 1878 .00349872163497 +1902 1878 -205706.11671 +1903 1878 6562.50766211 +1904 1878 -385000.257011 +1905 1878 -304246.736798 +1909 1878 -2.21189111471e-8 +1910 1878 6.33299350738e-8 +1911 1878 391171.192301 +1920 1878 -2.32830643654e-10 +1921 1878 -1.39698386192e-8 +1922 1878 66118.7850966 +1930 1878 52500.0339811 +1931 1878 -63000.04296 +1932 1878 -51426.5130132 +1879 1879 534950.170338 +1880 1879 -59074.5770061 +1881 1879 -5.16884028912e-8 +1894 1879 -91319.0337391 +1895 1879 -2338.75565023 +1896 1879 205705.639289 +1897 1879 -91319.0337391 +1898 1879 -2338.75565023 +1899 1879 -205705.639289 +1900 1879 -365272.434937 +1901 1879 -9354.95962344 +1902 1879 4.93600964546e-8 +1903 1879 132727.687533 +1904 1879 14768.7318021 +1905 1879 -2.21189111471e-8 +1906 1879 33181.2449231 +1907 1879 3692.19474844 +1908 1879 6562.50109771 +1909 1879 33181.2449231 +1910 1879 3692.19474844 +1911 1879 -6562.50109772 +1920 1879 -24301.4329292 +1921 1879 42584.7649988 +1922 1879 -52500.0361274 +1927 1879 -24301.4329292 +1928 1879 42584.7649988 +1929 1879 52500.0361274 +1930 1879 -97204.8060446 +1931 1879 170339.059995 +1932 1879 -3.25962901115e-9 +1880 1880 1732863.77903 +1881 1880 -1.19674950838e-7 +1894 1880 -2338.75565023 +1895 1880 68612.6350561 +1896 1880 .00349872768857 +1897 1880 -2338.75565023 +1898 1880 68612.6350561 +1899 1880 -.00349873886444 +1900 1880 -9354.95962344 +1901 1880 274452.394257 +1902 1880 -2.21189111471e-8 +1903 1880 14768.7318021 +1904 1880 -866431.996519 +1905 1880 5.86733222008e-8 +1906 1880 3692.19474844 +1907 1880 -216609.368034 +1908 1880 -385000.256899 +1909 1880 3692.19474844 +1910 1880 -216609.368034 +1911 1880 385000.256899 +1920 1880 42584.7649988 +1921 1880 -34306.8846973 +1922 1880 63000.0428868 +1927 1880 42584.7649988 +1928 1880 -34306.8846973 +1929 1880 -63000.0428869 +1930 1880 170339.059995 +1931 1880 -137226.613117 +1932 1880 -1.210719347e-8 +1881 1881 2433985.72711 +1894 1881 205705.634995 +1895 1881 .00349872070365 +1896 1881 -205706.11671 +1897 1881 -205705.634995 +1898 1881 -.0034987272229 +1899 1881 -205706.116709 +1900 1881 3.632158041e-8 +1901 1881 -2.39815562963e-8 +1902 1881 411411.96139 +1903 1881 -1.86264514923e-8 +1904 1881 5.77419996262e-8 +1905 1881 608491.272601 +1906 1881 6562.50766211 +1907 1881 -385000.257011 +1908 1881 -304246.736798 +1909 1881 -6562.50766212 +1910 1881 385000.257011 +1911 1881 -304246.736798 +1920 1881 -52500.0339811 +1921 1881 63000.04296 +1922 1881 -51426.5130132 +1927 1881 52500.0339811 +1928 1881 -63000.04296 +1929 1881 -51426.5130132 +1930 1881 1.39698386192e-9 +1931 1881 -8.84756445885e-9 +1932 1881 102852.322674 +1882 1882 1.463e8 +1883 1882 -2.38418579102e-7 +1886 1882 -6.655e7 +1887 1882 8.94069671631e-8 +1890 1882 -6.655e7 +1896 1882 8.94069671631e-8 +1912 1882 6.435e7 +1913 1882 1.49011611939e-7 +1916 1882 -3.5475e7 +1923 1882 -3.5475e7 +1924 1882 5.125e7 +1929 1882 -5.125e7 +1883 1883 20004666666.7 +1886 1883 8.94069671631e-8 +1887 1883 -9914333333.33 +1890 1883 8.94069671631e-8 +1896 1883 -9914333333.33 +1912 1883 -1.19209289551e-7 +1913 1883 4935166666.67 +1916 1883 -5.125e7 +1923 1883 5.125e7 +1924 1883 -2511583333.33 +1929 1883 -2511583333.33 +1884 1884 1.611e9 +1885 1884 1.86264514923e-9 +1888 1884 7.0115625e8 +1889 1884 -1.62981450558e-9 +1892 1884 7.0115625e8 +1893 1884 -1.04773789644e-9 +1894 1884 125516493.056 +1897 1884 -125516493.056 +1914 1884 -494302083.333 +1915 1884 -3.60887497664e-9 +1918 1884 -272778645.833 +1919 1884 266927.083333 +1920 1884 43308376.7361 +1925 1884 -272778645.833 +1926 1884 -266927.083333 +1927 1884 -43308376.7361 +1885 1885 3143402.77778 +1888 1885 -1.04773789644e-9 +1889 1885 -1434201.38889 +1892 1885 -1.62981450558e-9 +1893 1885 -1434201.38889 +1914 1885 -6.98491930962e-10 +1915 1885 571006.944444 +1918 1885 266927.083333 +1919 1885 -251128.472222 +1920 1885 40677.0833333 +1925 1885 -266927.083333 +1926 1885 -251128.472222 +1927 1885 40677.0833333 +1930 1885 -95104.1666667 +1886 1886 108192857.143 +1912 1886 -3.5475e7 +1913 1886 -5.125e7 +1923 1886 34296428.5714 +1924 1886 2.98023223877e-8 +1887 1887 13001571428.6 +1912 1887 -5.125e7 +1913 1887 -2511583333.33 +1923 1887 -2.98023223877e-8 +1924 1887 3101892857.14 +1888 1888 2957897321.43 +1897 1888 -23816167.0918 +1900 1888 125516493.056 +1914 1888 -272778645.833 +1915 1888 266927.083333 +1920 1888 -5954041.77297 +1925 1888 -1278892857.14 +1926 1888 -9.31322574615e-10 +1930 1888 -43308376.7361 +1889 1889 2315401.78571 +1914 1889 266927.083333 +1915 1889 -251128.472222 +1920 1889 -75870.5357143 +1925 1889 -4.65661287308e-10 +1926 1889 440736.607143 +1930 1889 40677.0833333 +1890 1890 954083074.36 +1894 1890 -138240238.434 +1896 1890 -2.38418579102e-7 +1912 1890 -3.5475e7 +1913 1890 5.125e7 +1916 1890 -383393750.434 +1927 1890 34395229.476 +1929 1890 3.75e6 +1891 1891 356925239514 +1892 1891 -1.2644943563e11 +1896 1891 1911647182.71 +1908 1891 -6252342767.3 +1917 1891 91376598782.3 +1918 1891 40854575328.8 +1929 1891 13125352754.7 +1892 1892 805558824945 +1894 1892 125516493.056 +1896 1892 8359021409.47 +1900 1892 -125516493.056 +1908 1892 8075292898.79 +1914 1892 -272778645.833 +1915 1892 -266927.083333 +1917 1892 40854575328.8 +1918 1892 -390851916401 +1919 1892 19531.25 +1927 1892 -43308376.7361 +1929 1892 -1983116889.81 +1930 1892 43308376.7361 +1893 1893 1571701.38889 +1914 1893 -266927.083333 +1915 1893 -251128.472222 +1918 1893 -19531.25 +1919 1893 285503.472222 +1927 1893 -47552.0833333 +1930 1893 40677.0833333 +1894 1894 356934075.04 +1895 1894 -9257.3328471 +1896 1894 -210000.137867 +1900 1894 -20836719.2047 +1901 1894 -4628.66609488 +1902 1894 209999.302447 +1903 1894 -21437.9586245 +1904 1894 -41415.2910641 +1905 1894 50352.4325477 +1906 1894 -42875.4544129 +1907 1894 -82830.5821281 +1908 1894 -50352.2332545 +1914 1894 -43308376.7361 +1915 1894 -40677.0833333 +1916 1894 34395229.476 +1918 1894 -43308376.7361 +1919 1894 47552.0833333 +1927 1894 -84760829.8253 +1928 1894 -81685.1951074 +1929 1894 -50352.4411375 +1930 1894 7246793.23888 +1931 1894 -40842.5935281 +1932 1894 50352.2246647 +1895 1895 271588.373597 +1896 1895 -.00335267186165 +1900 1895 -4628.66609488 +1901 1895 135793.251474 +1902 1895 -.00335269793868 +1903 1895 -41415.2910641 +1904 1895 -34306.8789704 +1905 1895 63000.0411343 +1906 1895 -82830.5821281 +1907 1895 -68613.2951047 +1908 1895 -62999.7909598 +1927 1895 86314.2450179 +1928 1895 -135793.513152 +1929 1895 -125999.579218 +1930 1895 43157.1265345 +1931 1895 -67897.2241757 +1932 1895 126000.084971 +1896 1896 15336340654.3 +1900 1896 -209999.302447 +1901 1896 .00335268676281 +1902 1896 -415705.920953 +1903 1896 50352.4346941 +1904 1896 63000.0412075 +1905 1896 -51426.5044228 +1906 1896 50352.2311081 +1907 1896 62999.7908867 +1908 1896 1689650810.58 +1912 1896 5.125e7 +1913 1896 -2511583333.33 +1916 1896 -3.75e6 +1917 1896 -14228565565 +1918 1896 -2672515875.57 +1927 1896 -54647.6268234 +1928 1896 125999.58097 +1929 1896 -44655993.7038 +1930 1896 -54647.4275314 +1931 1896 126000.083218 +1932 1896 -103926.61097 +1897 1897 26624418.4061 +1898 1897 -41657.9971076 +1899 1897 -4.98257577419e-8 +1900 1897 -20836719.2047 +1901 1897 -4628.66609488 +1902 1897 -209999.302447 +1903 1897 -21437.9586245 +1904 1897 -41415.2910641 +1905 1897 -50352.4325477 +1909 1897 -192940.040754 +1910 1897 -372737.619576 +1911 1897 2.84053385258e-8 +1914 1897 43308376.7361 +1915 1897 -40677.0833333 +1920 1897 -9364245.18047 +1921 1897 -367583.369357 +1922 1897 3.25962901115e-9 +1925 1897 -5954041.77297 +1926 1897 75870.5357143 +1930 1897 7246793.23888 +1931 1897 -40842.5935281 +1932 1897 -50352.2246647 +1898 1898 1222145.67692 +1899 1898 -4.09781932831e-8 +1900 1898 -4628.66609488 +1901 1898 135793.251474 +1902 1898 .00335268815979 +1903 1898 -41415.2910641 +1904 1898 -34306.8789704 +1905 1898 -63000.0411343 +1909 1898 -372737.619576 +1910 1898 -308760.323867 +1911 1898 2.77068465948e-8 +1920 1898 388414.111207 +1921 1898 -611071.811184 +1922 1898 -4.19095158577e-9 +1930 1898 43157.1265345 +1931 1898 -67897.2241757 +1932 1898 -126000.084971 +1899 1899 534483.021258 +1900 1899 209999.302447 +1901 1899 -.00335269607603 +1902 1899 -415705.920953 +1903 1899 -50352.4346941 +1904 1899 -63000.0412075 +1905 1899 -51426.5044228 +1909 1899 2.14204192162e-8 +1910 1899 3.7020072341e-8 +1911 1899 66118.8237534 +1920 1899 -2.74740159512e-8 +1921 1899 4.65661287308e-8 +1922 1899 133619.154521 +1930 1899 54647.4275314 +1931 1899 -126000.083218 +1932 1899 -103926.61097 +1900 1900 42238369.9397 +1901 1900 -18514.6656942 +1902 1900 -4.74974513054e-8 +1903 1900 -85750.9088257 +1904 1900 -165661.164256 +1905 1900 2.53785401583e-8 +1906 1900 -21437.9586245 +1907 1900 -41415.2910641 +1908 1900 -50352.4325477 +1909 1900 -21437.9586245 +1910 1900 -41415.2910641 +1911 1900 50352.4325477 +1915 1900 95104.1666667 +1918 1900 43308376.7361 +1919 1900 -40677.0833333 +1920 1900 7246793.23888 +1921 1900 -40842.5935281 +1922 1900 50352.2246647 +1925 1900 -43308376.7361 +1926 1900 -40677.0833333 +1927 1900 7246793.23888 +1928 1900 -40842.5935281 +1929 1900 -50352.2246647 +1930 1900 -14355577.8546 +1931 1900 -163370.390215 +1932 1900 2.56113708019e-9 +1901 1901 543176.747194 +1902 1901 -3.0267983675e-8 +1903 1901 -165661.164256 +1904 1901 -137226.590209 +1905 1901 3.51574271917e-8 +1906 1901 -41415.2910641 +1907 1901 -34306.8789704 +1908 1901 -63000.0411343 +1909 1901 -41415.2910641 +1910 1901 -34306.8789704 +1911 1901 63000.0411343 +1920 1901 43157.1265345 +1921 1901 -67897.2241757 +1922 1901 126000.084971 +1927 1901 43157.1265345 +1928 1901 -67897.2241757 +1929 1901 -126000.084971 +1930 1901 172628.490036 +1931 1901 -271587.026304 +1932 1901 -1.86264514923e-9 +1902 1902 831414.593533 +1903 1902 2.23517417908e-8 +1904 1902 3.16649675369e-8 +1905 1902 102852.339855 +1906 1902 -50352.4346941 +1907 1902 -63000.0412075 +1908 1902 -51426.5044228 +1909 1902 50352.4346941 +1910 1902 63000.0412075 +1911 1902 -51426.5044228 +1920 1902 -54647.4275314 +1921 1902 126000.083218 +1922 1902 -103926.61097 +1927 1902 54647.4275314 +1928 1902 -126000.083218 +1929 1902 -103926.61097 +1930 1902 -2.421438694e-8 +1931 1902 3.67872416973e-8 +1932 1902 207852.686919 +1903 1903 532932.565564 +1904 1903 -1.8160790205e-8 +1905 1903 -6.61239027977e-8 +1906 1903 133230.434345 +1907 1903 -3.95812094212e-9 +1908 1903 -.0065568042919 +1909 1903 133230.434345 +1910 1903 -5.35510480404e-9 +1911 1903 .00655677029863 +1920 1903 -91398.4331626 +1921 1903 5.58793544769e-9 +1922 1903 -205704.939408 +1927 1903 -91398.4331626 +1928 1903 5.12227416038e-9 +1929 1903 205704.939408 +1930 1903 -365590.030499 +1931 1903 1.90921127796e-8 +1932 1903 4.51691448689e-8 +1935 1903 33181.2449231 +1936 1903 -3692.19474844 +1937 1903 6562.50766211 +1958 1903 -21437.9586245 +1959 1903 41415.2910641 +1960 1903 50352.4346941 +1968 1903 -85750.9088257 +1969 1903 165661.164256 +1970 1903 -4.65661287308e-10 +1971 1903 132727.687533 +1972 1903 -14768.7318021 +1973 1903 -1.44354999065e-8 +1979 1903 33181.2449231 +1980 1903 -3692.19474844 +1981 1903 -6562.50766212 +1996 1903 -21437.9586245 +1997 1903 41415.2910641 +1998 1903 -50352.4346941 +1904 1904 1732872.89114 +1905 1904 -1.10827386379e-7 +1906 1904 -5.12227416038e-9 +1907 1904 433215.484585 +1908 1904 -1.07102096081e-8 +1909 1904 -4.65661287308e-9 +1910 1904 433215.484585 +1911 1904 -3.25962901115e-8 +1920 1904 6.75208866596e-9 +1921 1904 68612.8721901 +1922 1904 -5.82076609135e-9 +1927 1904 3.95812094212e-9 +1928 1904 68612.8721901 +1929 1904 -2.79396772385e-9 +1930 1904 2.04890966415e-8 +1931 1904 274453.340642 +1932 1904 -1.67638063431e-8 +1935 1904 -3692.19474844 +1936 1904 -216609.368034 +1937 1904 385000.257011 +1958 1904 41415.2910641 +1959 1904 -34306.8789704 +1960 1904 -63000.0412075 +1968 1904 165661.164256 +1969 1904 -137226.590209 +1970 1904 -1.00117176771e-8 +1971 1904 -14768.7318021 +1972 1904 -866431.996519 +1973 1904 4.47034835815e-8 +1979 1904 -3692.19474844 +1980 1904 -216609.368034 +1981 1904 -385000.257011 +1996 1904 41415.2910641 +1997 1904 -34306.8789704 +1998 1904 63000.0412075 +1905 1905 2433972.89096 +1906 1905 .00655676983297 +1907 1905 -4.37721610069e-8 +1908 1905 -1216983.04691 +1909 1905 -.0065568042919 +1910 1905 -2.32830643654e-9 +1911 1905 -1216983.04691 +1920 1905 -205704.935113 +1921 1905 2.00234353542e-8 +1922 1905 -205705.417024 +1927 1905 205704.935113 +1928 1905 -2.72411853075e-8 +1929 1905 -205705.417025 +1930 1905 4.88944351673e-8 +1931 1905 -3.16649675369e-8 +1932 1905 411410.560753 +1935 1905 6562.50109771 +1936 1905 385000.256899 +1937 1905 -304246.736798 +1958 1905 50352.4325477 +1959 1905 -63000.0411343 +1960 1905 -51426.5044228 +1968 1905 3.49245965481e-9 +1969 1905 -1.09430402517e-8 +1970 1905 102852.339855 +1971 1905 -1.210719347e-8 +1972 1905 3.91155481339e-8 +1973 1905 608491.272601 +1979 1905 -6562.50109771 +1980 1905 -385000.256899 +1981 1905 -304246.736798 +1996 1905 -50352.4325477 +1997 1905 63000.0411343 +1998 1905 -51426.5044228 +1906 1906 266466.282782 +1907 1906 -6.51925802231e-9 +1908 1906 .0065567609854 +1927 1906 -182795.01525 +1928 1906 7.45058059692e-9 +1929 1906 205704.112353 +1930 1906 -91398.4331626 +1931 1906 4.88944351673e-9 +1932 1906 -205704.939408 +1958 1906 -42875.4544129 +1959 1906 82830.5821281 +1960 1906 50352.2311081 +1968 1906 -21437.9586245 +1969 1906 41415.2910641 +1970 1906 -50352.4346941 +1971 1906 33181.2449231 +1972 1906 -3692.19474844 +1973 1906 6562.50766211 +1979 1906 66363.8437667 +1980 1906 -7384.36590104 +1981 1906 -6562.4748477 +1907 1907 866436.445572 +1908 1907 -3.632158041e-8 +1927 1907 7.45058059692e-9 +1928 1907 137226.670321 +1929 1907 -5.58793544769e-9 +1930 1907 5.12227416038e-9 +1931 1907 68612.8721901 +1932 1907 -6.75208866596e-9 +1958 1907 82830.5821281 +1959 1907 -68613.2951047 +1960 1907 -62999.7908867 +1968 1907 41415.2910641 +1969 1907 -34306.8789704 +1970 1907 63000.0412075 +1971 1907 -3692.19474844 +1972 1907 -216609.368034 +1973 1907 385000.257011 +1979 1907 -7384.36590104 +1980 1907 -433215.998259 +1981 1907 -384998.716898 +1908 1908 7435986812.94 +1917 1908 -.000152587890625 +1918 1908 -18853177578.4 +1927 1908 -205704.116648 +1928 1908 7.91624188423e-9 +1929 1908 -3679281039.2 +1930 1908 -205704.935113 +1931 1908 1.90921127796e-8 +1932 1908 -205705.417024 +1939 1908 6252342767.3 +1940 1908 8075292898.79 +1958 1908 -50352.2332545 +1959 1908 62999.7909599 +1960 1908 1689650810.58 +1968 1908 -50352.4325477 +1969 1908 63000.0411343 +1970 1908 -51426.5044228 +1971 1908 6562.50109771 +1972 1908 385000.256899 +1973 1908 -304246.736798 +1979 1908 6562.48141209 +1980 1908 384998.71701 +1981 1908 -3545403671.34 +1909 1909 1199092.47171 +1910 1909 -7.63684511185e-8 +1911 1909 -7.31088221073e-8 +1920 1909 -822579.551918 +1921 1909 3.35276126862e-8 +1922 1909 5.30853867531e-8 +1930 1909 -91398.4331626 +1931 1909 3.72529029846e-9 +1932 1909 205704.939408 +1935 1909 298635.846321 +1936 1909 -33229.6718359 +1937 1909 -1.210719347e-8 +1968 1909 -21437.9586245 +1969 1909 41415.2910641 +1970 1909 50352.4346941 +1971 1909 33181.2449231 +1972 1909 -3692.19474844 +1973 1909 -6562.50766212 +1996 1909 -192940.040754 +1997 1909 372737.619577 +1998 1909 1.86264514923e-9 +1910 1910 3898958.1375 +1911 1910 -1.210719347e-7 +1920 1910 3.72529029846e-8 +1921 1910 617519.024366 +1922 1910 -3.5623088479e-8 +1930 1910 3.49245965481e-9 +1931 1910 68612.8721901 +1932 1910 -1.39698386192e-9 +1935 1910 -33229.6718359 +1936 1910 -1949474.92553 +1937 1910 2.98023223877e-8 +1968 1910 41415.2910641 +1969 1910 -34306.8789704 +1970 1910 -63000.0412075 +1971 1910 -3692.19474844 +1972 1910 -216609.368034 +1973 1910 -385000.257011 +1996 1910 372737.619577 +1997 1910 -308760.323867 +1998 1910 -2.14204192162e-8 +1911 1911 1564702.32046 +1920 1911 5.40167093277e-8 +1921 1911 -3.81842255592e-8 +1922 1911 264477.998014 +1930 1911 205704.935113 +1931 1911 -2.63098627329e-8 +1932 1911 -205705.417025 +1935 1911 -1.35041773319e-8 +1936 1911 4.93600964546e-8 +1937 1911 391171.192301 +1968 1911 50352.4325477 +1969 1911 -63000.0411343 +1970 1911 -51426.5044228 +1971 1911 -6562.50109771 +1972 1911 -385000.256899 +1973 1911 -304246.736798 +1996 1911 4.65661287308e-10 +1997 1911 -2.79396772385e-9 +1998 1911 66118.8237534 +1912 1912 1.463e8 +1913 1912 -2.38418579102e-7 +1916 1912 -6.655e7 +1923 1912 -6.655e7 +1924 1912 8.94069671631e-8 +1929 1912 8.94069671631e-8 +1938 1912 -3.5475e7 +1960 1912 -5.125e7 +1984 1912 6.435e7 +1985 1912 1.49011611939e-7 +1988 1912 -3.5475e7 +1989 1912 5.125e7 +1913 1913 20004666666.7 +1916 1913 8.94069671631e-8 +1923 1913 8.94069671631e-8 +1924 1913 -9914333333.33 +1929 1913 -9914333333.33 +1938 1913 -5.125e7 +1960 1913 -2511583333.33 +1984 1913 -1.19209289551e-7 +1985 1913 4935166666.67 +1988 1913 5.125e7 +1989 1913 -2511583333.33 +1914 1914 1.611e9 +1915 1914 1.86264514923e-9 +1918 1914 7.0115625e8 +1919 1914 -1.04773789644e-9 +1920 1914 -125516493.056 +1925 1914 7.0115625e8 +1926 1914 -1.62981450558e-9 +1927 1914 125516493.056 +1940 1914 -272778645.833 +1941 1914 266927.083333 +1958 1914 -43308376.7361 +1986 1914 -494302083.333 +1987 1914 -3.60887497664e-9 +1990 1914 -272778645.833 +1991 1914 -266927.083333 +1996 1914 43308376.7361 +1915 1915 3143402.77778 +1918 1915 -1.62981450558e-9 +1919 1915 -1434201.38889 +1925 1915 -1.04773789644e-9 +1926 1915 -1434201.38889 +1940 1915 266927.083333 +1941 1915 -251128.472222 +1958 1915 40677.0833333 +1968 1915 -95104.1666667 +1986 1915 -6.98491930962e-10 +1987 1915 571006.944444 +1990 1915 -266927.083333 +1991 1915 -251128.472222 +1996 1915 40677.0833333 +1916 1916 1049267313.85 +1927 1916 -13200912.8352 +1929 1916 -2.38418579102e-7 +1938 1916 -470871647.706 +1958 1916 -21194316.6409 +1960 1916 3.75e6 +1984 1916 -3.5475e7 +1985 1916 5.125e7 +1917 1917 339502975265 +1918 1917 -9374205035.53 +1929 1917 -2519451110.33 +1939 1917 105371807538 +1940 1917 -29306955400.9 +1960 1917 16723034895 +1981 1917 -5946909857.07 +1918 1918 948592180353 +1927 1918 125516493.056 +1929 1918 6608898233.08 +1930 1918 -125516493.056 +1939 1918 -29306955400.9 +1940 1918 -516359438584 +1941 1918 19531.25 +1958 1918 -43308376.7361 +1960 1918 -1234453322.62 +1968 1918 43308376.7361 +1981 1918 8037289445.89 +1986 1918 -272778645.833 +1987 1918 -266927.083333 +1919 1919 1571701.38889 +1940 1919 -19531.25 +1941 1919 285503.472222 +1958 1919 -47552.0833333 +1968 1919 40677.0833333 +1986 1919 -266927.083333 +1987 1919 -251128.472222 +1920 1920 26622998.602 +1921 1920 -5.77419996262e-8 +1922 1920 -5.07570803165e-8 +1925 1920 -23816167.0918 +1930 1920 -20836876.9606 +1931 1920 -2.56113708019e-9 +1932 1920 -209999.302333 +1935 1920 -218711.309496 +1936 1920 -383262.88499 +1937 1920 2.16532498598e-8 +1968 1920 7246793.23888 +1969 1920 -43157.1265345 +1970 1920 -54647.4275314 +1971 1920 -24301.4329292 +1972 1920 -42584.7649988 +1973 1920 -52500.0339811 +1986 1920 43308376.7361 +1987 1920 -40677.0833333 +1990 1920 -5954041.77297 +1991 1920 75870.5357143 +1996 1920 -9364245.18047 +1997 1920 -388414.111207 +1998 1920 1.39698386192e-9 +1921 1921 1222147.74568 +1922 1921 -5.26197254658e-8 +1930 1921 -6.51925802231e-9 +1931 1921 135793.48133 +1932 1921 1.72294676304e-8 +1935 1921 -383262.88499 +1936 1921 -308760.375409 +1937 1921 2.25845724344e-8 +1968 1921 40842.5935281 +1969 1921 -67897.2241757 +1970 1921 -126000.083218 +1971 1921 -42584.7649988 +1972 1921 -34306.8846973 +1973 1921 -63000.04296 +1996 1921 367583.369357 +1997 1921 -611071.811184 +1998 1921 -8.38190317154e-9 +1922 1922 534482.119471 +1930 1922 209999.302333 +1931 1922 -2.421438694e-8 +1932 1922 -415705.221347 +1935 1922 2.23517417908e-8 +1936 1922 3.93483787775e-8 +1937 1922 66118.7850966 +1968 1922 50352.2246647 +1969 1922 -126000.084971 +1970 1922 -103926.61097 +1971 1922 -52500.0361274 +1972 1922 -63000.0428868 +1973 1922 -51426.5130132 +1996 1922 -2.58442014456e-8 +1997 1922 5.35510480404e-8 +1998 1922 133619.154521 +1923 1923 108192857.143 +1984 1923 -3.5475e7 +1985 1923 -5.125e7 +1988 1923 34296428.5714 +1989 1923 2.98023223877e-8 +1924 1924 13001571428.6 +1984 1924 -5.125e7 +1985 1924 -2511583333.33 +1988 1924 -2.98023223877e-8 +1989 1924 3101892857.14 +1925 1925 2957897321.43 +1930 1925 125516493.056 +1968 1925 -43308376.7361 +1986 1925 -272778645.833 +1987 1925 266927.083333 +1990 1925 -1278892857.14 +1991 1925 -9.31322574615e-10 +1996 1925 -5954041.77297 +1926 1926 2315401.78571 +1968 1926 40677.0833333 +1986 1926 266927.083333 +1987 1926 -251128.472222 +1990 1926 -4.65661287308e-10 +1991 1926 440736.607143 +1996 1926 -75870.5357143 +1927 1927 346506744.885 +1928 1927 -6.51925802231e-9 +1929 1927 -210000.137981 +1930 1927 -20836876.9606 +1931 1927 -5.58793544769e-9 +1932 1927 209999.302333 +1938 1927 -21194316.6409 +1940 1927 -43308376.7361 +1941 1927 47552.0833333 +1958 1927 -111227834.184 +1959 1927 -86314.2450179 +1960 1927 -54647.6268234 +1968 1927 7246793.23888 +1969 1927 -43157.1265345 +1970 1927 54647.4275314 +1971 1927 -24301.4329292 +1972 1927 -42584.7649988 +1973 1927 52500.0339811 +1979 1927 -48602.4030223 +1980 1927 -85169.5299977 +1981 1927 -52499.8260974 +1986 1927 -43308376.7361 +1987 1927 -40677.0833333 +1928 1928 271588.833327 +1929 1928 1.86264514923e-9 +1930 1928 -4.42378222942e-9 +1931 1928 135793.48133 +1932 1928 -2.60770320892e-8 +1958 1928 81685.1951074 +1959 1928 -135793.513152 +1960 1928 -125999.58097 +1968 1928 40842.5935281 +1969 1928 -67897.2241757 +1970 1928 126000.083218 +1971 1928 -42584.7649988 +1972 1928 -34306.8846973 +1973 1928 63000.04296 +1979 1928 -85169.5299977 +1980 1928 -68613.3065586 +1981 1928 -62999.7891341 +1929 1929 15716421184.2 +1930 1929 -209999.302333 +1931 1929 1.58324837685e-8 +1932 1929 -415705.221347 +1938 1929 -3.75e6 +1939 1929 -16127226291 +1940 1929 -610719730.182 +1958 1929 -50352.4411375 +1959 1929 125999.579218 +1960 1929 -429930631.335 +1968 1929 -50352.2246647 +1969 1929 126000.084971 +1970 1929 -103926.61097 +1971 1929 52500.0361274 +1972 1929 63000.0428868 +1973 1929 -51426.5130132 +1979 1929 52499.8239511 +1980 1929 62999.7892073 +1981 1929 1681263972.35 +1984 1929 5.125e7 +1985 1929 -2511583333.33 +1930 1930 42237738.9157 +1931 1930 -1.90921127796e-8 +1932 1930 -4.61004674435e-8 +1935 1930 -24301.4329292 +1936 1930 -42584.7649988 +1937 1930 52500.0339811 +1940 1930 43308376.7361 +1941 1930 -40677.0833333 +1958 1930 7246793.23888 +1959 1930 -43157.1265345 +1960 1930 -54647.4275314 +1968 1930 -14355577.8546 +1969 1930 -172628.490036 +1970 1930 -6.98491930962e-10 +1971 1930 -97204.8060446 +1972 1930 -170339.059995 +1973 1930 2.00234353542e-8 +1979 1930 -24301.4329292 +1980 1930 -42584.7649988 +1981 1930 -52500.0339811 +1987 1930 95104.1666667 +1990 1930 -43308376.7361 +1991 1930 -40677.0833333 +1996 1930 7246793.23888 +1997 1930 -43157.1265345 +1998 1930 54647.4275314 +1931 1931 543177.666653 +1932 1931 -3.86498868465e-8 +1935 1931 -42584.7649988 +1936 1931 -34306.8846973 +1937 1931 63000.04296 +1958 1931 40842.5935281 +1959 1931 -67897.2241757 +1960 1931 -126000.083218 +1968 1931 163370.390215 +1969 1931 -271587.026304 +1970 1931 4.65661287308e-10 +1971 1931 -170339.059995 +1972 1931 -137226.613117 +1973 1931 2.44472175837e-8 +1979 1931 -42584.7649988 +1980 1931 -34306.8846973 +1981 1931 -63000.04296 +1996 1931 40842.5935281 +1997 1931 -67897.2241757 +1998 1931 126000.083218 +1932 1932 831413.192737 +1935 1932 52500.0361274 +1936 1932 63000.0428868 +1937 1932 -51426.5130132 +1958 1932 50352.2246647 +1959 1932 -126000.084971 +1960 1932 -103926.61097 +1968 1932 -2.07219272852e-8 +1969 1932 3.0267983675e-8 +1970 1932 207852.686919 +1971 1932 2.21189111471e-8 +1972 1932 2.98023223877e-8 +1973 1932 102852.322674 +1979 1932 -52500.0361274 +1980 1932 -63000.0428868 +1981 1932 -51426.5130132 +1996 1932 -50352.2246647 +1997 1932 126000.084971 +1998 1932 -103926.61097 +1933 1933 107134690.506 +1934 1933 -1.02445483208e-8 +1935 1933 -18653.9168358 +1936 1933 40245.7157947 +1937 1933 48204.4812381 +1940 1933 43308376.7361 +1941 1933 40677.0833333 +1942 1933 -42041545.8275 +1943 1933 3208228.99422 +1944 1933 -2280286.02334 +1945 1933 155477.502025 +1946 1933 2815.20905158 +1947 1933 -50712121.4975 +1948 1933 2060475.32189 +1949 1933 3644904.88293 +1950 1933 3867988.06196 +1951 1933 -63021978.8471 +1952 1933 43492.2923849 +1953 1933 -42041545.8275 +1954 1933 3208228.99422 +1955 1933 51131283.9922 +1956 1933 2280286.02334 +1957 1933 2815.20905158 +1958 1933 7246635.41728 +1959 1933 38527.8660336 +1960 1933 -46056.6716788 +1961 1933 -42898.7185391 +1962 1933 -51229840.5739 +1963 1933 -4724455.73681 +1964 1933 2.38418579102e-7 +1967 1933 -101381.127038 +1968 1933 -14356209.1388 +1969 1933 154111.512332 +1970 1933 -1.8859282136e-8 +1971 1933 -74614.7416743 +1972 1933 160982.863179 +1973 1933 6.98491930962e-9 +1974 1933 2060475.32189 +1975 1933 -3741313.46284 +1976 1933 -3867988.06196 +1977 1933 63021978.8471 +1978 1933 43492.2923849 +1979 1933 -18653.9168358 +1980 1933 40245.7157947 +1981 1933 -48204.4812381 +1982 1933 -171593.022041 +1983 1933 2.32830643654e-8 +1987 1933 -95104.1666667 +1990 1933 -43308376.7361 +1991 1933 40677.0833333 +1992 1933 -42898.7185391 +1993 1933 98556.5817522 +1994 1933 -50712121.4975 +1995 1933 96408.5799114 +1996 1933 7246635.41729 +1997 1933 38527.8660336 +1998 1933 46056.6716788 +1999 1933 78604895.4822 +2000 1933 -6285594.43459 +2001 1933 8.94069671631e-8 +2003 1933 -6276.9603709 +1934 1934 415705.862797 +1935 1934 48204.4833749 +1936 1934 -63000.0395339 +1937 1934 -51426.32115 +1942 1934 -4258.78562987 +1943 1934 -62999.7874241 +1947 1934 96408.5799114 +1948 1934 -125999.577581 +1949 1934 -207852.277457 +1953 1934 4258.78562987 +1954 1934 62999.7874241 +1958 1934 58942.9802793 +1959 1934 126000.081471 +1960 1934 -103926.436367 +1961 1934 -102888.86964 +1962 1934 -102852.358192 +1963 1934 -1.86264514923e-9 +1968 1934 -3.95812094212e-9 +1969 1934 -1.86264514923e-9 +1970 1934 207852.336123 +1971 1934 1.86264514923e-9 +1972 1934 -1.25728547573e-8 +1973 1934 102852.006399 +1974 1934 125999.577581 +1979 1934 -48204.4833749 +1980 1934 63000.0395338 +1981 1934 -51426.32115 +1982 1934 8.89748334885e-9 +1983 1934 205704.581013 +1992 1934 102888.86964 +1993 1934 -102852.358192 +1994 1934 -96408.5799114 +1995 1934 -207852.277457 +1996 1934 -58942.9802793 +1997 1934 -126000.081471 +1998 1934 -103926.436367 +1999 1934 8.81403684616e-10 +2000 1934 1.30385160446e-8 +1935 1935 1203619.65944 +1936 1935 132919.195385 +1937 1935 -7.77654349804e-8 +1953 1935 -6739.00900084 +1954 1935 -99689.4822609 +1963 1935 40245.7157947 +1968 1935 -91318.5336194 +1969 1935 2339.05970158 +1970 1935 205704.589289 +1971 1935 133733.45518 +1972 1935 14768.7986793 +1973 1935 -.00653399759904 +1974 1935 362211.442152 +1982 1935 33426.3099003 +1983 1935 -19687.5164296 +1992 1935 300841.425734 +1993 1935 -2.16532498598e-8 +1994 1935 -167883.664661 +1995 1935 1.86264514923e-9 +1996 1935 -821860.459718 +1997 1935 21051.4293406 +1998 1935 5.26197254658e-8 +1999 1935 -748.78059658 +2000 1935 -11076.6360441 +1936 1936 3898968.40321 +1937 1936 -8.80099833012e-8 +1953 1936 -131785.199024 +1954 1936 -1949485.19267 +1963 1936 -34306.9916734 +1968 1936 2339.05970158 +1969 1936 68612.9902644 +1970 1936 -.00349915749393 +1971 1936 14768.7986793 +1972 1936 433216.625252 +1973 1936 .000669677276164 +1974 1936 -308761.338199 +1982 1936 3566.23426958 +1983 1936 -385000.257122 +1992 1936 32095.7167635 +1993 1936 2.37487256527e-8 +1994 1936 362211.442152 +1995 1936 -1.2805685401e-8 +1996 1936 21051.4293406 +1997 1936 617520.090707 +1998 1936 -2.46800482273e-8 +1999 1936 -14642.8703137 +2000 1936 -216610.507598 +1937 1937 1564698.20173 +1953 1937 2.45533883572e-9 +1954 1937 3.632158041e-8 +1963 1937 -63000.0393148 +1968 1937 205704.584994 +1969 1937 -.00349914305843 +1970 1937 -205705.066704 +1971 1937 .00653395801783 +1972 1937 -.000669708941132 +1973 1937 -1216979.83717 +1974 1937 -1.79279595613e-8 +1982 1937 6338.5075089 +1983 1937 -304245.134026 +1992 1937 -1.94519758224e-8 +1993 1937 391169.123501 +1994 1937 6.75208866596e-9 +1995 1937 66118.6359783 +1996 1937 4.61004674435e-8 +1997 1937 -4.19095158577e-9 +1998 1937 264477.54945 +1999 1937 -26026.0173588 +2000 1937 -385000.256788 +1938 1938 1140261614.55 +1942 1938 -24623993.2679 +1943 1938 -46302467.3851 +1947 1938 -63674018.3024 +1948 1938 -474388051.132 +1949 1938 3.75e6 +1958 1938 84868334.9433 +1960 1938 -2.38418579102e-7 +1963 1938 -3.5475e7 +1964 1938 5.125e7 +1984 1938 -6.655e7 +1985 1938 8.94069671631e-8 +1939 1939 372365177331 +1940 1939 92701196780.5 +1944 1939 -45824591243.4 +1945 1939 -2479172640.68 +1949 1939 17568722224.4 +1950 1939 93272854411.8 +1951 1939 -87862413237.7 +1960 1939 -1191838290.43 +1962 1939 -5633606068.06 +1981 1939 -590112147.996 +1940 1940 1.0743750542e12 +1944 1940 -2479172640.68 +1945 1940 -72047387061.9 +1947 1940 -43308376.7361 +1949 1940 -1898809077.21 +1950 1940 -87862413237.7 +1951 1940 -515334267795 +1952 1940 19531.25 +1958 1940 125516493.056 +1960 1940 5194163637.7 +1962 1940 7989992013.42 +1966 1940 -272778645.833 +1967 1940 -266927.083333 +1968 1940 -125516493.056 +1981 1940 -18841757834.9 +1986 1940 7.0115625e8 +1987 1940 -1.62981450558e-9 +1941 1941 1571701.38889 +1947 1941 -47552.0833333 +1951 1941 -19531.25 +1952 1941 285503.472222 +1966 1941 -266927.083333 +1967 1941 -251128.472222 +1986 1941 -1.04773789644e-9 +1987 1941 -1434201.38889 +1942 1942 490428424.762 +1943 1942 180683756.703 +1944 1942 -7410405.36506 +1945 1942 505258.160723 +1946 1942 164.60633034 +1947 1942 -136252578.475 +1948 1942 -169113566.209 +1949 1942 -3737054.65982 +1950 1942 2280286.02334 +1951 1942 -155477.502025 +1952 1942 3138.48018545 +1958 1942 -44542214.3916 +1959 1942 -4638.2763096 +1960 1942 4258.78563728 +1961 1942 -482.155684274 +1962 1942 26018.2017685 +1963 1942 3250793.65721 +1964 1942 -51131283.9922 +1965 1942 2280286.02334 +1966 1942 -155477.502025 +1967 1942 -2815.20905158 +1968 1942 -2957.79340213 +1969 1942 -2319.1537986 +1970 1942 -4258.80301229 +1971 1942 -748.78059658 +1972 1942 -14642.8703137 +1973 1942 -26026.0173588 +1979 1942 -1497.55641905 +1980 1942 -29285.5557694 +1981 1942 26025.9132774 +1982 1942 -241.071639606 +1983 1942 -26025.9133 +1999 1942 -124479801.507 +2000 1942 7260689.84482 +2001 1942 -.571870774031 +2002 1942 -7410405.36506 +2003 1942 82.1590068901 +1943 1943 783769813.851 +1944 1943 -108685246.391 +1945 1943 7410405.36506 +1946 1943 2412.73175075 +1947 1943 -169198695.59 +1948 1943 -419581610.416 +1949 1943 318095.267611 +1950 1943 33443451.8211 +1951 1943 -2280286.02334 +1952 1943 46030.0198306 +1958 1943 -24711501.9484 +1959 1943 -68613.5548757 +1960 1943 62999.7875337 +1961 1943 -7132.4805366 +1962 1943 384885.628778 +1963 1943 5417223.93218 +1964 1943 3486301.3802 +1965 1943 33443451.8211 +1966 1943 -2280286.02334 +1967 1943 -41288.8152273 +1968 1943 -43754.3402682 +1969 1943 -34307.0088551 +1970 1943 -63000.0445605 +1971 1943 -11076.6360441 +1972 1943 -216610.507598 +1973 1943 -385000.256788 +1979 1943 -22153.2014652 +1980 1943 -433218.280613 +1981 1943 384998.717121 +1982 1943 -3566.14851489 +1983 1943 -384998.717456 +1999 1943 7260689.84482 +2000 1943 -18482741.2771 +2001 1943 -8.38739086408 +2002 1943 -108685246.391 +2003 1943 1206.37570441 +1944 1944 265554801049 +1945 1944 95590489204.4 +1946 1944 .0407060813159 +1947 1944 2280286.02334 +1948 1944 33443451.8211 +1949 1944 -7190355501.69 +1950 1944 -90191722605.8 +1951 1944 -69085350635.3 +1952 1944 -19486.007619 +1960 1944 5367790085.09 +1962 1944 13092206571.5 +1963 1944 -33443451.8211 +1965 1944 -216152955.633 +1966 1944 14738029.0249 +1967 1944 266308.770792 +1981 1944 -15766956613.4 +1999 1944 7410405.36506 +2000 1944 108685246.391 +2002 1944 557196494.73 +2003 1944 -.00297849415802 +1945 1945 668035933003 +1946 1945 .597019141191 +1947 1945 -155477.502025 +1948 1945 -2280286.02334 +1949 1945 21783977484 +1950 1945 -69085350635.3 +1951 1945 -14368712677.5 +1952 1945 1328.62095282 +1960 1945 -7633173294.25 +1962 1945 -10972852415.5 +1963 1945 2280286.02334 +1965 1945 14738029.0249 +1966 1945 -1004887.94568 +1967 1945 -18157.8196885 +1981 1945 -150655063.065 +1999 1945 -505258.160723 +2000 1945 -7410405.36506 +2002 1945 -37990955.9981 +2003 1945 -.0436843273856 +1946 1946 2776340.65695 +1947 1946 -3138.48018545 +1948 1946 -46030.0198306 +1950 1946 19486.007619 +1951 1946 -1328.62095282 +1952 1946 334888.757005 +1963 1946 41288.8152273 +1965 1946 266308.770792 +1966 1946 -18157.8196885 +1967 1946 -306309.279164 +1999 1946 82.1590068901 +2000 1946 1206.37570441 +2002 1946 .00297849264461 +2003 1946 -2691374.6375 +1947 1947 555726753.114 +1948 1947 257563620.908 +1949 1947 -51227692.9553 +1950 1947 -3867988.06196 +1951 1947 63021978.8471 +1952 1947 -50690.5635188 +1958 1947 -124250743.248 +1959 1947 77055.7561661 +1960 1947 -46056.9055718 +1961 1947 -85796.5110206 +1962 1947 3642757.30726 +1963 1947 2060475.32189 +1964 1947 -3741313.46284 +1965 1947 -3867988.06196 +1966 1947 63021978.8471 +1967 1947 43492.2923849 +1968 1947 7246635.41729 +1969 1947 38527.8660336 +1970 1947 46056.6716788 +1971 1947 -18653.9168358 +1972 1947 40245.7157947 +1973 1947 48204.4812381 +1979 1947 -37307.3708372 +1980 1947 80491.4315894 +1981 1947 -48204.2902887 +1982 1947 -42898.7185391 +1983 1947 98556.5817522 +1986 1947 -43308376.7361 +1987 1947 40677.0833333 +1999 1947 -42041545.8275 +2000 1947 3208228.99422 +2001 1947 51131283.9922 +2002 1947 2280286.02334 +2003 1947 2815.20905158 +1948 1948 1390533896.58 +1949 1948 54862301.4668 +1950 1948 -56729230.9258 +1951 1948 3867988.06196 +1952 1948 -46030.0198306 +1958 1948 -63764961.9864 +1959 1948 -135793.744706 +1960 1948 -3624000.42253 +1961 1948 82870.0591746 +1962 1948 -192095.183517 +1963 1948 -42853635.0549 +1964 1948 4005095.22294 +1965 1948 -56729230.9258 +1966 1948 3867988.06196 +1967 1948 41288.8152273 +1968 1948 -45471.8540291 +1969 1948 -67897.3394043 +1970 1948 -126000.086717 +1971 1948 40245.7157947 +1972 1948 -34306.9916734 +1973 1948 -63000.0393148 +1979 1948 80491.4315894 +1980 1948 -68613.5205122 +1981 1948 62999.7927794 +1982 1948 41435.0570748 +1983 1948 -62999.7926699 +1984 1948 -3.5475e7 +1985 1948 -5.125e7 +1999 1948 3250793.65721 +2000 1948 5417223.93218 +2001 1948 -3486301.3802 +2002 1948 33443451.8211 +2003 1948 41288.8152273 +1949 1949 15366905194.5 +1950 1949 10690288602.2 +1951 1949 4268782728.19 +1958 1949 -58943.1626271 +1959 1949 -125999.582717 +1960 1949 -468928845.568 +1961 1949 102888.456144 +1962 1949 248658993.65 +1963 1949 -3879095.64536 +1964 1949 -10927748484.9 +1968 1949 -58942.9802793 +1969 1949 -126000.081471 +1970 1949 -103926.436367 +1971 1949 48204.4833749 +1972 1949 -63000.0395339 +1973 1949 -51426.32115 +1979 1949 48204.288152 +1980 1949 -62999.7925603 +1981 1949 1695570299.9 +1982 1949 102888.86964 +1983 1949 -102852.358192 +1984 1949 -5.125e7 +1985 1949 -2511583333.33 +1999 1949 51135542.7778 +2000 1949 -3423301.59277 +2001 1949 -3012727207.83 +1950 1950 301269838942 +1951 1950 125821977754 +1952 1950 266308.770792 +1960 1950 -15782956990.3 +1962 1950 -3065132154.79 +1963 1950 56729230.9258 +1965 1950 309296072.051 +1966 1950 -21088837.1794 +1967 1950 -19486.007619 +1981 1950 6549028266.27 +1999 1950 -2280286.02334 +2000 1950 -33443451.8211 +2002 1950 -216152955.633 +2003 1950 -266308.770792 +1951 1951 846151509614 +1952 1951 -285084.903022 +1958 1951 -43308376.7361 +1960 1951 23403905.0848 +1962 1951 -11594224574.5 +1963 1951 -3867988.06196 +1965 1951 -21088837.1794 +1966 1951 352016032.215 +1967 1951 20859.8709528 +1968 1951 43308376.7361 +1981 1951 8104036784.14 +1986 1951 -272778645.833 +1987 1951 266927.083333 +1999 1951 155477.502025 +2000 1951 2280286.02334 +2002 1951 14738029.0249 +2003 1951 18157.8196885 +1952 1952 1714039.29445 +1958 1952 47552.0833333 +1963 1952 41288.8152273 +1965 1952 19486.007619 +1966 1952 -20859.8709528 +1967 1952 -1588130.33877 +1968 1952 -40677.0833333 +1986 1952 266927.083333 +1987 1952 -251128.472222 +1999 1952 -2815.20905158 +2000 1952 -41288.8152273 +2002 1952 -266308.770792 +2003 1952 -306309.279164 +1953 1953 173964281.501 +1954 1953 -10274842.7357 +1955 1953 -2.38418579102e-7 +1956 1953 2970125.19121 +1957 1953 740.419575931 +1963 1953 3250793.65721 +1964 1953 51131283.9922 +1965 1953 -2280286.02334 +1966 1953 155477.502025 +1967 1953 -2815.20905158 +1968 1953 -2957.79340213 +1969 1953 -2319.1537986 +1970 1953 4258.80301229 +1971 1953 -748.78059658 +1972 1953 -14642.8703137 +1973 1953 26026.0173588 +1974 1953 -3540590.51803 +1975 1953 5.96046447754e-8 +1976 1953 486031.236312 +1977 1953 -33139.2297958 +1978 1953 4727.91266817 +1982 1953 -241.071639606 +1983 1953 26025.9133 +1992 1953 -2169.6872881 +1993 1953 -2.1405518055e-9 +1994 1953 44660644.5663 +1995 1953 8.81403684616e-10 +1996 1953 -26620.1406192 +1997 1953 -20872.2769156 +1998 1953 2.61273235083e-9 +1999 1953 -124479801.507 +2000 1953 7260689.84482 +2001 1953 .571870952845 +2002 1953 7410405.36506 +2003 1953 82.1590068901 +1954 1954 23983846.83 +1955 1954 2.98023223877e-8 +1956 1954 43561836.1378 +1957 1954 10857.3139406 +1963 1954 5417223.93218 +1964 1954 -3486301.3802 +1965 1954 -33443451.8211 +1966 1954 2280286.02334 +1967 1954 -41288.8152273 +1968 1954 -43754.3402682 +1969 1954 -34307.0088551 +1970 1954 63000.0445605 +1971 1954 -11076.6360441 +1972 1954 -216610.507598 +1973 1954 385000.256788 +1974 1954 -6996903.06805 +1975 1954 -3.72529029846e-9 +1976 1954 7128299.72591 +1977 1954 -486031.236312 +1978 1954 69341.178218 +1982 1954 -3566.14851489 +1983 1954 384998.717456 +1992 1954 -32095.9658002 +1993 1954 -3.16649675369e-8 +1994 1954 -3923672.67341 +1995 1954 1.30385160446e-8 +1996 1954 -393789.062414 +1997 1954 -308761.492835 +1998 1954 3.86498868465e-8 +1999 1954 7260689.84482 +2000 1954 -18482741.2771 +2001 1954 8.38739085197 +2002 1954 108685246.391 +2003 1954 1206.37570441 +1955 1955 23650062764.5 +1963 1955 -3486301.3802 +1964 1955 -3012727207.83 +1974 1955 6.51925802231e-9 +1975 1955 3767680686.41 +1994 1955 -8.94069671631e-8 +1999 1955 -.571870774031 +2000 1955 -8.38739086408 +2001 1955 -18272142193.3 +1956 1956 2143156259.76 +1957 1956 -1.86264514923e-9 +1963 1956 33443451.8211 +1965 1956 -216152955.633 +1966 1956 14738029.0249 +1967 1956 -266308.770792 +1974 1956 7128299.72591 +1976 1956 -1033703907.15 +1977 1956 70481378.0691 +1978 1956 4.65661287308e-10 +1994 1956 486031.236312 +1999 1956 -7410405.36506 +2000 1956 -108685246.391 +2002 1956 557196494.73 +2003 1956 .00297849264461 +1957 1957 3751650.88634 +1963 1957 41288.8152273 +1965 1957 -266308.770792 +1966 1957 18157.8196885 +1967 1957 -306309.279164 +1974 1957 -69341.178218 +1976 1957 -4.65661287308e-10 +1977 1957 2.91038304567e-11 +1978 1957 491812.997238 +1994 1957 -4727.91266817 +1999 1957 82.1590068901 +2000 1957 1206.37570441 +2002 1957 -.00297849415802 +2003 1957 -2691374.6375 +1958 1958 385996658.308 +1959 1958 9258.49978775 +1960 1958 -210000.137867 +1961 1958 -48573.5631971 +1962 1958 -54647.4188163 +1963 1958 -45471.8540291 +1966 1958 -43308376.7361 +1967 1958 -40677.0833333 +1968 1958 -20836719.1394 +1969 1958 4629.24956505 +1970 1958 209999.302447 +1971 1958 -91318.5336194 +1972 1958 2339.05970158 +1973 1958 205704.584994 +1979 1958 -182635.217239 +1980 1958 4678.08791084 +1981 1958 -205703.766769 +1982 1958 -24287.0130158 +1983 1958 54647.6355384 +1986 1958 125516493.056 +1999 1958 -2957.79340213 +2000 1958 -43754.3402682 +1959 1959 271589.064507 +1960 1959 .00335296895355 +1961 1959 -82870.4042268 +1962 1959 -62999.7873146 +1963 1959 -67897.3394043 +1968 1959 4629.24956505 +1969 1959 135793.596932 +1970 1959 .00335300387815 +1971 1959 2339.05970158 +1972 1959 68612.9902644 +1973 1959 -.00349914375693 +1979 1959 4678.08791083 +1980 1959 137226.907541 +1981 1959 -.00349915586412 +1982 1959 -41435.1864696 +1983 1959 63000.0447796 +1999 1959 -2319.1537986 +2000 1959 -34307.0088551 +1960 1960 16140804745.7 +1961 1960 50388.6310423 +1962 1960 1670402219.89 +1963 1960 51376000.0867 +1964 1960 -2511583333.33 +1968 1960 -209999.302447 +1969 1960 -.00335301598534 +1970 1960 -415704.870949 +1971 1960 205704.589289 +1972 1960 -.00349915842526 +1973 1960 -205705.066704 +1979 1960 205703.762473 +1980 1960 .00349913188256 +1981 1960 -3676573671.24 +1982 1960 50388.8346629 +1983 1960 -51426.3469226 +1984 1960 8.94069671631e-8 +1985 1960 -9914333333.33 +1999 1960 4258.80301229 +2000 1960 63000.0445605 +1961 1961 133224.159141 +1962 1961 224.003439006 +1963 1961 41435.0570748 +1968 1961 -24287.0130158 +1969 1961 -41435.1864696 +1970 1961 -50388.8346629 +1971 1961 33426.3099003 +1972 1961 3566.23426958 +1973 1961 6338.5075089 +1979 1961 66853.9721514 +1980 1961 7132.3543042 +1981 1961 -6338.47559791 +1982 1961 66610.7198675 +1983 1961 -223.995963991 +1999 1961 -241.071639606 +2000 1961 -3566.14851489 +1962 1962 23105309323.8 +1963 1962 3549301.17287 +1964 1962 -3012727207.83 +1968 1962 -54647.6355384 +1969 1962 -63000.0447796 +1970 1962 -51426.3469226 +1971 1962 -19687.5164296 +1972 1962 -385000.257122 +1973 1962 -304245.134026 +1979 1962 -19687.4310999 +1980 1962 -384998.716787 +1981 1962 -3545634224.15 +1982 1962 223.995963975 +1983 1962 -608488.313718 +1999 1962 26026.485171 +2000 1962 385007.104847 +2001 1962 -18272142193.3 +1963 1963 92741093.8172 +1964 1963 -4.76837158203e-7 +1967 1963 -92060.0396613 +1968 1963 -181887.367919 +1969 1963 -271587.489412 +1970 1963 3.632158041e-8 +1971 1963 160982.863179 +1972 1963 -137227.041024 +1973 1963 -1.86264514923e-8 +1974 1963 -42853635.0549 +1975 1963 4005095.22294 +1976 1963 -56729230.9258 +1977 1963 3867988.06196 +1978 1963 41288.8152273 +1979 1963 40245.7157947 +1980 1963 -34306.9916734 +1981 1963 63000.0393147 +1982 1963 165740.118349 +1983 1963 -2.84053385258e-8 +1984 1963 6.435e7 +1985 1963 -1.19209289551e-7 +1988 1963 -3.5475e7 +1989 1963 -5.125e7 +1992 1963 41435.0570748 +1993 1963 -62999.7926699 +1994 1963 2060475.32189 +1995 1963 -125999.577581 +1996 1963 -45471.8540291 +1997 1963 -67897.3394043 +1998 1963 -126000.086717 +1999 1963 -6115335.67269 +2000 1963 -10655048.3792 +2001 1963 -5.58793544769e-9 +2003 1963 -92060.0396613 +1964 1964 22016660433 +1974 1964 -4005095.22294 +1975 1964 -10927748484.9 +1984 1964 1.49011611939e-7 +1985 1964 4935166666.67 +1988 1964 -5.125e7 +1989 1964 -2511583333.33 +1994 1964 3741313.46284 +1999 1964 -1.49011611939e-7 +2000 1964 1.02445483208e-8 +2001 1964 5952290952.39 +1965 1965 743288694.485 +1966 1965 -50679900.819 +1967 1965 -1.86264514923e-9 +1974 1965 56729230.9258 +1976 1965 309296072.051 +1977 1965 -21088837.1794 +1978 1965 -19486.007619 +1994 1965 3867988.06196 +2002 1965 -370716228.811 +2003 1965 -3.49245965481e-10 +1966 1966 808955524.571 +1967 1966 5.58793544769e-9 +1974 1966 -3867988.06196 +1976 1966 -21088837.1794 +1977 1966 352016032.215 +1978 1966 20859.8709528 +1986 1966 -494302083.333 +1987 1966 -6.98491930962e-10 +1990 1966 -272778645.833 +1991 1966 266927.083333 +1994 1966 -63021978.8471 +1996 1966 43308376.7361 +2002 1966 25276668.2011 +2003 1966 2.18278728425e-11 +1967 1967 3428078.58891 +1968 1967 95104.1666667 +1974 1967 41288.8152273 +1976 1967 19486.007619 +1977 1967 -20859.8709528 +1978 1967 -1588130.33877 +1986 1967 -3.60887497664e-9 +1987 1967 571006.944444 +1990 1967 266927.083333 +1991 1967 -251128.472222 +1994 1967 43492.2923849 +1996 1967 -40677.0833333 +1999 1967 6276.9603709 +2000 1967 92060.0396613 +2002 1967 4.65661287308e-10 +2003 1967 669777.514011 +1968 1968 42238370.2006 +1969 1968 18516.9995755 +1970 1968 -5.35510480404e-8 +1971 1968 -365270.434478 +1972 1968 9356.17582168 +1973 1968 5.16884028912e-8 +1974 1968 -45471.8540291 +1977 1968 -43308376.7361 +1978 1968 -40677.0833333 +1979 1968 -91318.5336194 +1980 1968 2339.05970158 +1981 1968 -205704.584994 +1982 1968 -97147.1263942 +1983 1968 2.44472175837e-8 +1990 1968 125516493.056 +1992 1968 -24287.0130158 +1993 1968 54647.6355384 +1994 1968 7246635.41728 +1995 1968 58942.9802793 +1996 1968 -20836719.1394 +1997 1968 4629.24956505 +1998 1968 209999.302447 +1999 1968 -11831.1736085 +2000 1968 -175017.361073 +1969 1969 543178.129014 +1970 1969 -4.88944351673e-8 +1971 1969 9356.17582168 +1972 1969 274453.815082 +1973 1969 -1.42026692629e-8 +1974 1969 -67897.3394043 +1979 1969 2339.05970158 +1980 1969 68612.9902644 +1981 1969 .00349914538674 +1982 1969 -165740.808454 +1983 1969 2.56113708019e-8 +1992 1969 -41435.1864696 +1993 1969 63000.0447796 +1994 1969 38527.8660336 +1995 1969 126000.081471 +1996 1969 4629.24956505 +1997 1969 135793.596932 +1998 1969 .00335300620645 +1999 1969 -9276.55261919 +2000 1969 -137227.109751 +1970 1970 831412.49353 +1971 1970 4.842877388e-8 +1972 1970 -2.39815562963e-8 +1973 1970 411409.86139 +1974 1970 126000.086717 +1979 1970 -205704.589289 +1980 1970 .00349914329126 +1981 1970 -205705.066704 +1982 1970 2.00033187866e-8 +1983 1970 102851.954853 +1992 1970 50388.8346629 +1993 1970 -51426.3469226 +1994 1970 -46056.6716788 +1995 1970 -103926.436367 +1996 1970 -209999.302447 +1997 1970 -.00335301365703 +1998 1970 -415704.870949 +1999 1970 2.5812536478e-9 +2000 1970 3.81842255592e-8 +1971 1971 534944.649029 +1972 1971 59075.198959 +1973 1971 -7.40401446819e-8 +1974 1971 40245.7157947 +1979 1971 133733.45518 +1980 1971 14768.7986793 +1981 1971 -.00653399759904 +1982 1971 133707.944303 +1983 1971 -2.11875885725e-8 +1992 1971 33426.3099003 +1993 1971 19687.5164295 +1994 1971 -18653.9168358 +1995 1971 -48204.4833749 +1996 1971 -91318.5336194 +1997 1971 2339.05970158 +1998 1971 -205704.589289 +1999 1971 -2995.1128381 +2000 1971 -44306.4029304 +1972 1972 1732877.45364 +1973 1972 -8.75443220138e-8 +1974 1972 -34306.9916734 +1979 1972 14768.7986793 +1980 1972 433216.625252 +1981 1972 .000669674947858 +1982 1972 14264.7086084 +1983 1972 2.65426933765e-8 +1992 1972 3566.23426958 +1993 1972 385000.257122 +1994 1972 40245.7157947 +1995 1972 63000.0395338 +1996 1972 2339.05970158 +1997 1972 68612.9902644 +1998 1972 .00349914422259 +1999 1972 -58571.1115388 +2000 1972 -866436.561225 +1973 1973 2433966.47707 +1974 1973 63000.0393147 +1979 1973 .00653395941481 +1980 1973 -.000669714063406 +1981 1973 -1216979.83717 +1982 1973 -1.92316249013e-8 +1983 1973 608488.061461 +1992 1973 -6338.50750891 +1993 1973 -304245.134026 +1994 1973 -48204.4812381 +1995 1973 -51426.32115 +1996 1973 -205704.584994 +1997 1973 .00349914608523 +1998 1973 -205705.066704 +1999 1973 2.23498791456e-9 +2000 1973 3.30619513988e-8 +1974 1974 66476628.5951 +1976 1974 14256599.4518 +1977 1974 -972062.472624 +1978 1974 -69341.178218 +1982 1974 41435.0570748 +1983 1974 62999.7926699 +1984 1974 -3.5475e7 +1985 1974 5.125e7 +1988 1974 34296428.5714 +1989 1974 -2.98023223877e-8 +1992 1974 372915.325188 +1993 1974 -2.77068465948e-8 +1994 1974 -3730051.40536 +1995 1974 -4.65661287308e-10 +1996 1974 -409246.603637 +1997 1974 -611072.852002 +1998 1974 3.77185642719e-8 +1999 1974 3250793.65721 +2000 1974 5417223.93218 +2001 1974 3486301.3802 +2002 1974 -33443451.8211 +2003 1974 41288.8152273 +1975 1975 14283073775.7 +1984 1975 5.125e7 +1985 1975 -2511583333.33 +1988 1975 2.98023223877e-8 +1989 1975 3101892857.14 +1994 1975 2.38418579102e-7 +1999 1975 -51131283.9922 +2000 1975 3486301.3802 +2001 1975 -3012727207.83 +1976 1976 1273214777.94 +1977 1976 -86812027.6092 +1978 1976 -1.86264514923e-9 +1994 1976 972062.472624 +1999 1976 2280286.02334 +2000 1976 33443451.8211 +2002 1976 -216152955.633 +2003 1976 266308.770792 +1977 1977 1484867794.13 +1978 1977 1.86264514923e-9 +1986 1977 -272778645.833 +1987 1977 -266927.083333 +1990 1977 -1278892857.14 +1991 1977 -4.65661287308e-10 +1994 1977 -11974362.0055 +1996 1977 -5954041.77297 +1999 1977 -155477.502025 +2000 1977 -2280286.02334 +2002 1977 14738029.0249 +2003 1977 -18157.8196885 +1978 1978 2473569.71219 +1986 1978 -266927.083333 +1987 1978 -251128.472222 +1990 1978 -9.31322574615e-10 +1991 1978 440736.607143 +1994 1978 -80598.4483824 +1996 1978 75870.5357143 +1999 1978 -2815.20905158 +2000 1978 -41288.8152273 +2002 1978 266308.770792 +2003 1978 -306309.279164 +1979 1979 267472.324515 +1980 1979 29537.5994795 +1981 1979 .00653393659741 +1982 1979 33426.3099003 +1983 1979 19687.5164295 +1999 1979 -748.78059658 +2000 1979 -11076.6360441 +1980 1980 866438.726819 +1981 1980 -.000669762026519 +1982 1980 3566.23426958 +1983 1980 385000.257122 +1999 1980 -14642.8703137 +2000 1980 -216610.507598 +1981 1981 7436156700.08 +1982 1981 -6338.50750891 +1983 1981 -304245.134026 +1999 1981 26026.0173588 +2000 1981 385000.256788 +1982 1982 266448.318282 +1983 1982 -2.99271196127e-8 +1992 1982 66610.7198675 +1993 1982 -223.995963991 +1994 1982 -42898.7185391 +1995 1982 -102888.86964 +1996 1982 -24287.0130158 +1997 1982 -41435.1864696 +1998 1982 -50388.8346629 +1999 1982 -964.311368549 +2000 1982 -14264.9610732 +1983 1983 1216980.03159 +1992 1983 223.995963976 +1993 1983 -608488.313718 +1994 1983 -98556.5817522 +1995 1983 -102852.358192 +1996 1983 -54647.6355384 +1997 1983 -63000.0447796 +1998 1983 -51426.3469226 +1999 1983 -2.20350921154e-9 +2000 1983 -3.25962901115e-8 +1984 1984 1.463e8 +1985 1984 -2.38418579102e-7 +1988 1984 -6.655e7 +1989 1984 8.94069671631e-8 +1985 1985 20004666666.7 +1988 1985 8.94069671631e-8 +1989 1985 -9914333333.33 +1986 1986 1.611e9 +1987 1986 1.86264514923e-9 +1990 1986 7.0115625e8 +1991 1986 -1.62981450558e-9 +1994 1986 43308376.7361 +1996 1986 -125516493.056 +1987 1987 3143402.77778 +1990 1987 -1.04773789644e-9 +1991 1987 -1434201.38889 +1994 1987 40677.0833333 +1988 1988 108192857.143 +1989 1989 13001571428.6 +1990 1990 2957897321.43 +1994 1990 -5954041.77297 +1996 1990 -23816167.0918 +1991 1991 2315401.78571 +1994 1991 -75870.5357143 +1992 1992 599505.802485 +1993 1992 -3.04557383061e-8 +1994 1992 -386085.291797 +1995 1992 1.07601284981e-8 +1996 1992 -218581.530281 +1997 1992 -372916.785498 +1998 1992 2.02046707273e-8 +1999 1992 -241.071639606 +2000 1992 -3566.14851489 +1993 1993 782347.041505 +1994 1993 2.23517417908e-8 +1995 1993 132238.550443 +1996 1993 2.3515895009e-8 +1997 1993 2.421438694e-8 +1998 1993 66118.5200015 +1999 1993 -26025.9133 +2000 1993 -384998.717456 +1994 1994 74420429.9447 +1995 1994 -1.11758708954e-8 +1996 1994 -9365665.57111 +1997 1994 346750.876927 +1998 1994 -1.93249434233e-8 +1999 1994 -42041545.8275 +2000 1994 3208228.99422 +2001 1994 -51131283.9922 +2002 1994 -2280286.02334 +2003 1994 2815.20905158 +1995 1995 267240.534204 +1996 1995 -4.19095158577e-9 +1997 1995 -3.72529029846e-9 +1998 1995 133618.927731 +1999 1995 -4258.78562987 +2000 1995 -62999.7874241 +1996 1996 26624418.9931 +1997 1996 41663.2483402 +1998 1996 -6.10016286373e-8 +1999 1996 -2957.79340213 +2000 1996 -43754.3402682 +1997 1997 1222148.78602 +1998 1997 -3.11993062496e-8 +1999 1997 -2319.1537986 +2000 1997 -34307.0088551 +1998 1998 534481.671259 +1999 1998 -4258.80301229 +2000 1998 -63000.0445605 +1999 1999 257084541.33 +2000 1999 -14987017.091 +2003 1999 329.21266068 +2000 2000 38304054.9177 +2002 2000 -2.38418579102e-7 +2003 2000 4825.4635015 +2001 2001 36653040891.5 +2002 2002 1494616742.94 +2003 2002 -1.86264514923e-9 +2003 2003 5552681.3139 diff --git a/experimental/algorithm/LAGraph_RichClubCoefficient.c b/experimental/algorithm/LAGraph_RichClubCoefficient.c index e04590968c..d421a88218 100644 --- a/experimental/algorithm/LAGraph_RichClubCoefficient.c +++ b/experimental/algorithm/LAGraph_RichClubCoefficient.c @@ -263,19 +263,23 @@ int LAGraph_RichClubCoefficient } GRB_TRY (GrB_Vector_nvals(&edge_vec_nvals, node_edges_x)) GRB_TRY (GrB_Vector_new(&ones_v, GrB_INT64, edge_vec_nvals)) ; - GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; - GRB_TRY (GrB_Vector_assign_INT64( - ramp_v, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_Vector_assign_INT64( edges_per_deg, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_assign_INT64( verts_per_deg, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_Vector_assign_INT64( ones_v, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; - + + #if !defined(COVERAGE) + GRB_TRY (GrB_Vector_new(&ramp_v, GrB_INT64, edge_vec_nvals + 1)) ; + GRB_TRY (GrB_Vector_assign_INT64( + ramp_v, NULL, NULL, (int64_t) 0, GrB_ALL, 0, NULL)) ; GRB_TRY (GrB_apply ( ramp_v, NULL, NULL, GrB_ROWINDEX_INT64, ramp_v, 0, NULL)) ; + #endif + LG_TRY (LAGraph_FastAssign_Semiring ( edges_per_deg, NULL, GrB_PLUS_INT64, deg_x, node_edges_x, ramp_v, GxB_PLUS_SECOND_INT64, NULL, msg diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 9e9b5b3d4f..875143cbcf 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -711,12 +711,12 @@ int LAGraph_SwapEdges )) ; // Find each hashed edge's bucket, dup_swaps_v is 1 if exists[edge] = 1 - // LG_TRY (LAGraph_FastAssign_Semiring( - // dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, - // GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg - // )) ; - GRB_TRY (GxB_Vector_extract_Vector( - dup_swaps_v, NULL, NULL, exists, new_hashed_edges, NULL)) ; + LG_TRY (LAGraph_FastAssign_Semiring( + dup_swaps_v, NULL, NULL, new_hashed_edges, exists, ramp_v, + GxB_ANY_PAIR_INT8, GrB_DESC_T0, msg + )) ; + // GRB_TRY (GxB_Vector_extract_Vector( + // dup_swaps_v, NULL, NULL, exists, new_hashed_edges, NULL)) ; // Fill out dup_swaps_v in O(1) time. GRB_TRY (GxB_Container_new(&con)) ; @@ -746,7 +746,6 @@ int LAGraph_SwapEdges // Place Good Swaps back into E_vec // --------------------------------------------------------------------- - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,1) GRB_TRY (GxB_Container_new(&con)) ; GRB_TRY (GxB_unload_Vector_into_Container(M, con, NULL)) ; GRB_TRY (GrB_free(&(con->b))) ; @@ -759,10 +758,6 @@ int LAGraph_SwapEdges GRB_TRY (LAGraph_FastAssign_Semiring( E_vec, NULL, second_edge, edge_perm, M, ramp_v, second_second_edge, NULL, msg)) ; - #else // Fix for old saxpy4 bug - GRB_TRY(GxB_Vector_subassign_Vector( - E_vec, dup_swaps_v, NULL, M, edge_perm, NULL)); - #endif n_keep /= 2; diff --git a/experimental/test/test_RichClubCoefficient.c b/experimental/test/test_RichClubCoefficient.c index 7182a6a665..28e7ddff0e 100644 --- a/experimental/test/test_RichClubCoefficient.c +++ b/experimental/test/test_RichClubCoefficient.c @@ -98,10 +98,11 @@ const char *tests2 [ ] = "random_unweighted_general1.mtx", "random_unweighted_general2.mtx", "bcsstk13.mtx", + "bcsstk13_celeb.mtx", "test_FW_1000.mtx", "test_FW_2003.mtx", "test_FW_2500.mtx", - NULL + "" } ; void test_RichClubCoefficient (void) @@ -199,11 +200,6 @@ void iseq(bool *z, const double *x, const double *y) { (*z) = (isnan(*x) && isnan(*y)) ||*x == *y ; } -#define ISEQ \ -" void iseq(bool *z, const double *x, const double *y) \n"\ -" { \n"\ -" (*z) = (isnan(*x) && isnan(*y)) || *x == *y ; \n"\ -" }" //------------------------------------------------------------------------------ // test RichClubCoefficient vs C code //------------------------------------------------------------------------------ @@ -214,14 +210,16 @@ void test_RCC_Check (void) //-------------------------------------------------------------------------- OK (LAGraph_Init (msg)) ; GrB_BinaryOp iseqFP = NULL ; - OK (GxB_BinaryOp_new ( - &iseqFP, (GxB_binary_function) iseq, - GrB_BOOL, GrB_FP64, GrB_FP64, "iseq", ISEQ)) ; + OK (GrB_BinaryOp_new ( + &iseqFP, (GxB_binary_function) iseq, GrB_BOOL, GrB_FP64, GrB_FP64)) ; + // OK (GxB_BinaryOp_new ( + // &iseqFP, (GxB_binary_function) iseq, + // GrB_BOOL, GrB_FP64, GrB_FP64, "iseq", ISEQ)) ; for (int k = 0 ; ; k++) { //The following code taken from MIS tester // load the matrix as A - const char *aname = tests [k].name; + const char *aname = tests2 [k]; if (strlen (aname) == 0) break; TEST_CASE (aname) ; snprintf (filename, LEN, LG_DATA_DIR "%s", aname) ; @@ -231,8 +229,6 @@ void test_RCC_Check (void) OK (fclose (f)) ; TEST_MSG ("Loading of valued matrix failed") ; printf ("\nMatrix: %s\n", aname) ; - const double *ans = tests [k].rcc; - const uint64_t n_ans = tests [k].n; // C = structure of A OK (LAGraph_Matrix_Structure (&C, A, msg)) ; diff --git a/papers/GOMEZ-FINALTHESIS-2025.pdf b/papers/GOMEZ-FINALTHESIS-2025.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3c6ea3b9e1538469a57c9b3991b49a1347104b4a GIT binary patch literal 308199 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
aMeSh=SnWAFj+6Dx)B5|joO;&ZkJ4XR;5$PM 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

hO{|f+(RFjU+V1e&^RkblJ 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

{ROoTly9Qp>ybyLkae;Z!H@9wO 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≈WmaGHsHdK? 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 xKCM`idZW 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 Date: Thu, 8 May 2025 15:51:52 -0500 Subject: [PATCH 113/115] hack fast_assign --- experimental/utility/LAGraph_FastAssign.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index 20d354dae1..eea2b747ec 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -159,7 +159,7 @@ int LAGraph_FastAssign_Semiring int64_t n, nrows; GxB_Container con = NULL; void *ramp_a = NULL, *i_a =NULL; - int ramp_h = 0, trsp = 0, i_h = 0; + int ramp_h = 0, trsp = GrB_DEFAULT, i_h = 0; int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; bool iso = false; @@ -170,29 +170,27 @@ int LAGraph_FastAssign_Semiring LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; - LG_ASSERT_MSG (c != X_vec, GrB_NOT_IMPLEMENTED, - "c cannot be aliased with X_vec.") ; + LG_ASSERT_MSG (c != X_vec && c != I_vec && c != yada yada, GrB_NOT_IMPLEMENTED, + "c cannot be aliased with any input.") ; //---------------------------------------------------------------------- // Find dimensions and type //---------------------------------------------------------------------- GRB_TRY (GrB_Vector_size(&n, I_vec)) ; + if(desc != NULL) { GRB_TRY (GrB_get(desc, &trsp, GrB_INP0)) ; - if(trsp == GrB_TRAN) - { - GRB_TRY (GrB_Vector_size(&nrows, X_vec)) ; - } - else - { - GRB_TRY (GrB_Vector_size(&nrows, c)) ; - } } - else + if(trsp == GrB_TRAN) + { + GRB_TRY (GrB_Vector_size(&nrows, X_vec)) ; + } + else { GRB_TRY (GrB_Vector_size(&nrows, c)) ; } + GRB_TRY (GrB_Vector_get_INT32(X_vec, (int32_t *) &iso, GxB_ISO)) ; GRB_TRY (GxB_Vector_type(&x_type, X_vec)); From fa59ff5bae1302eb072f3dabdb585c935e1a7c87 Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 11 May 2025 12:09:14 -0500 Subject: [PATCH 114/115] Test cov 100 --- experimental/algorithm/LAGraph_SwapEdges.c | 139 ++++++++++++--------- experimental/test/test_SwapEdges.c | 81 ++++++------ experimental/utility/LAGraph_FastAssign.c | 38 +++--- 3 files changed, 138 insertions(+), 120 deletions(-) diff --git a/experimental/algorithm/LAGraph_SwapEdges.c b/experimental/algorithm/LAGraph_SwapEdges.c index 875143cbcf..bc1703975f 100644 --- a/experimental/algorithm/LAGraph_SwapEdges.c +++ b/experimental/algorithm/LAGraph_SwapEdges.c @@ -39,7 +39,7 @@ GrB_free (&ramp_v) ; \ GrB_free (&E_temp) ; \ GrB_free (&r_60) ; \ - GrB_free(&exists); \ + GrB_free (&exists) ; \ GrB_free (&E_vec) ; \ GrB_free (&swap_pair) ; \ GrB_free (&hash_seed_e) ; \ @@ -57,8 +57,9 @@ GrB_free (&con) ; \ GrB_free (&one8) ; \ GrB_free (&x) ; \ - LAGraph_Free((void**)&indices, msg) ; \ - LAGraph_Free((void **) &dup_swaps, NULL); \ + GrB_free (&temp_i) ; \ + LAGraph_Free ((void ** )&indices, msg) ; \ + LAGraph_Free ((void **) &dup_swaps, NULL); \ FREE_LOOP ; \ } @@ -87,15 +88,12 @@ void shift_and " (*z) |= (*z) >> 8; \n"\ " }" -#define INTTYPE "int64_t" -#define EDGE_TYPE "typedef struct { "INTTYPE" a; "INTTYPE" b; } edge_type;" - typedef struct { uint64_t a; uint64_t b; } edge_type64; #define EDGE_TYPE64 \ -"typedef struct { uint64_t a; uint64_t b; } edge_type;" +"typedef struct { uint64_t a; uint64_t b; } edge_type64;" typedef struct { uint64_t a; @@ -106,14 +104,14 @@ typedef struct { #define SWAP_TYPE64 \ "typedef struct { \n"\ " uint64_t a; uint64_t b; uint64_t c; uint64_t d; \n"\ -"}swap_type;" +"} swap_type64;" typedef struct { uint32_t a; uint32_t b; } edge_type32; #define EDGE_TYPE32 \ -"typedef struct { uint32_t a; uint32_t b; } edge_type;" +"typedef struct { uint32_t a; uint32_t b; } edge_type32;" typedef struct { uint32_t a; @@ -124,7 +122,7 @@ typedef struct { #define SWAP_TYPE32 \ "typedef struct { \n"\ " uint32_t a; uint32_t b; uint32_t c; uint32_t d; \n"\ -"}swap_type;" +"}swap_type32;" void swap_bc64 (swap_type64 *z, const swap_type64 *x, GrB_Index I, GrB_Index J, const bool *y) @@ -163,10 +161,10 @@ void swap_bc32 } } #define SWAP_BC64 \ -"void swap_bc \n"\ -"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"void swap_bc64 \n"\ +"(swap_type64 *z, const swap_type64 *x, GrB_Index I, GrB_Index J, const bool *y)\n"\ "{ \n"\ -" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety. \n"\ +" memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety.\n"\ " if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ " if(I & 1) \n"\ " { \n"\ @@ -182,8 +180,8 @@ void swap_bc32 " } \n"\ "}" #define SWAP_BC32 \ -"void swap_bc \n"\ -"(swap_type *z, const swap_type *x, GrB_Index I, GrB_Index J, const bool *y) \n"\ +"void swap_bc32 \n"\ +"(swap_type32 *z, const swap_type32 *x, GrB_Index I, GrB_Index J, const bool *y)\n"\ "{ \n"\ " memcpy(z, x, sizeof(*z)) ; //unnessesary when aliassed but done for safety.\n"\ " if(z->a == z->c || z->b == z->c || z->a == z->d || z->b == z->d ) return; \n"\ @@ -223,9 +221,20 @@ void hash_edge32 (*z) ^= (*z) << 17; (*z) &= (*mask); } -#define HASH_EDGE \ -"void hash_edge \n"\ -"(uint64_t *z, const edge_type *x, const uint64_t *mask) \n"\ +#define HASH_EDGE64 \ +"void hash_edge64 \n"\ +"(uint64_t *z, const edge_type64 *x, const uint64_t *mask) \n"\ +"{ \n"\ +" (*z) = x->a ^ x->b; \n"\ +" (*z) ^= (*z) << 13; \n"\ +" (*z) ^= (*z) >> 7; \n"\ +" (*z) ^= (uint64_t)((x->a < x->b)? x->a: x->b); \n"\ +" (*z) ^= (*z) << 17; \n"\ +" (*z) &= (*mask); \n"\ +"}" +#define HASH_EDGE32 \ +"void hash_edge32 \n"\ +"(uint64_t *z, const edge_type32 *x, const uint64_t *mask) \n"\ "{ \n"\ " (*z) = x->a ^ x->b; \n"\ " (*z) ^= (*z) << 13; \n"\ @@ -242,7 +251,7 @@ void add_term } #define ADD_TERM \ "void add_term \n"\ -"(int8_t *z, const int8_t *x, const int8_t *y) \n"\ +"(int8_t *z, const int8_t *x, const int8_t *y) \n"\ "{ \n"\ " (*z) = (*x) | (*y) + ((int8_t)1 & (*x) & (*y)) ; \n"\ "}" @@ -271,17 +280,33 @@ void edge2nd32_edge z->a = y->a; z->b = y->b; } -#define EDGE2ND_BOOL \ -"void edge2 \n"\ -"(edge_type *z, const bool *x, const edge_type *y) \n"\ +#define EDGE2ND32_BOOL \ +"void edge2nd32_bool \n"\ +"(edge_type32 *z, const bool *x, const edge_type32 *y) \n"\ +"{ \n"\ +" //if(y->a == 0 && y->b == 0) return; \n"\ +" z->a = y->a; \n"\ +" z->b = y->b; \n"\ +"}" +#define EDGE2ND64_BOOL \ +"void edge2nd64_bool \n"\ +"(edge_type64 *z, const bool *x, const edge_type64 *y) \n"\ +"{ \n"\ +" //if(y->a == 0 && y->b == 0) return; \n"\ +" z->a = y->a; \n"\ +" z->b = y->b; \n"\ +"}" +#define EDGE2ND32_EDGE \ +"void edge2nd32_edge \n"\ +"(edge_type32 *z, const edge_type32 *x, const edge_type32 *y) \n"\ "{ \n"\ " //if(y->a == 0 && y->b == 0) return; \n"\ " z->a = y->a; \n"\ " z->b = y->b; \n"\ "}" -#define EDGE2ND_EDGE \ -"void edge2 \n"\ -"(edge_type *z, const edge_type *x, const edge_type *y) \n"\ +#define EDGE2ND64_EDGE \ +"void edge2nd64_edge \n"\ +"(edge_type64 *z, const edge_type64 *x, const edge_type64 *y) \n"\ "{ \n"\ " //if(y->a == 0 && y->b == 0) return; \n"\ " z->a = y->a; \n"\ @@ -378,7 +403,8 @@ int LAGraph_SwapEdges GrB_Vector sort_h = NULL; GrB_Vector r_60 = NULL; - + // Only Used for coverage typecasting + GrB_Vector temp_i = NULL; // count swaps GrB_Index num_swaps = 0, num_attempts = 0, swaps_per_loop = 0 ; @@ -424,27 +450,22 @@ int LAGraph_SwapEdges GRB_TRY (GrB_Matrix_nvals(&e, A_tril)) ; swaps_per_loop = e / 3; GRB_TRY (GxB_Matrix_extractTuples_Vector(Ai, Aj, NULL, A_tril, NULL)) ; - // #ifdef COVERAGE - // GxB_fprint(Ai, GxB_SHORT, stdout) ; - // GxB_fprint(Aj, GxB_SHORT, stdout) ; - // if(n > 100) - // { - // // // Make Ai and Aj 64 bit - // GrB_Vector temp_i = NULL; - // GRB_TRY (GrB_Vector_new(&temp_i, GrB_INT64, e)) ; - // GRB_TRY (GrB_assign(temp_i, NULL, NULL, Ai, GrB_ALL, 0, NULL)) ; - // GRB_TRY (GrB_free(&Ai)) ; - // Ai = temp_i; - // temp_i = NULL; - // GRB_TRY (GrB_Vector_new(&temp_i, GrB_INT64, e)) ; - // GRB_TRY (GrB_assign(temp_i, NULL, NULL, Aj, GrB_ALL, 0, NULL)) ; - // GRB_TRY (GrB_free(&Aj)) ; - // Aj = temp_i; - // temp_i = NULL; - // } - // GxB_fprint(Ai, GxB_SHORT, stdout) ; - // GxB_fprint(Aj, GxB_SHORT, stdout) ; - // #endif + #ifdef COVERAGE + if(n > 100) + { + // // Make Ai and Aj 64 bit + GRB_TRY (GrB_Vector_new(&temp_i, GrB_INT64, e)) ; + GRB_TRY (GrB_assign(temp_i, NULL, NULL, Ai, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_free(&Ai)) ; + Ai = temp_i; + temp_i = NULL; + GRB_TRY (GrB_Vector_new(&temp_i, GrB_INT64, e)) ; + GRB_TRY (GrB_assign(temp_i, NULL, NULL, Aj, GrB_ALL, 0, NULL)) ; + GRB_TRY (GrB_free(&Aj)) ; + Aj = temp_i; + temp_i = NULL; + } + #endif int codei = 0, codej = 0; GRB_TRY (GxB_Vector_type(&Ai_type, Ai)) ; GrB_get(Ai, &codei, GrB_EL_TYPE_CODE); @@ -460,47 +481,47 @@ int LAGraph_SwapEdges if(codei == GrB_UINT32_CODE) // Use uint32 if possible { GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type32), "edge_type", EDGE_TYPE32)) ; + &lg_edge, sizeof(edge_type32), "edge_type32", EDGE_TYPE32)) ; GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type32), "swap_type", SWAP_TYPE32)) ; + &lg_swap, sizeof(swap_type32), "swap_type32", SWAP_TYPE32)) ; GRB_TRY(GxB_BinaryOp_new( &hash_seed_e, (GxB_binary_function) (&hash_edge32), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge32", HASH_EDGE32 )) ; GRB_TRY (GxB_IndexUnaryOp_new ( &swap_pair, (GxB_index_unary_function) (&swap_bc32), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC32 + lg_swap, lg_swap, GrB_BOOL, "swap_bc32", SWAP_BC32 )) ; GRB_TRY(GxB_BinaryOp_new( &second_edge, (GxB_binary_function) (&edge2nd32_edge), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE + lg_edge, lg_edge, lg_edge, "edge2nd32_edge", EDGE2ND32_EDGE )) ; GRB_TRY(GxB_BinaryOp_new( &second_bool_edge, (GxB_binary_function) (&edge2nd32_bool), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL + lg_edge, GrB_BOOL, lg_edge, "edge2nd32_bool", EDGE2ND32_BOOL )) ; } else //uint64 types { GRB_TRY (GxB_Type_new( - &lg_edge, sizeof(edge_type64), "edge_type", EDGE_TYPE64)) ; + &lg_edge, sizeof(edge_type64), "edge_type64", EDGE_TYPE64)) ; GRB_TRY (GxB_Type_new( - &lg_swap, sizeof(swap_type64), "swap_type", SWAP_TYPE64)) ; + &lg_swap, sizeof(swap_type64), "swap_type64", SWAP_TYPE64)) ; GRB_TRY(GxB_BinaryOp_new( &hash_seed_e, (GxB_binary_function) (&hash_edge64), - GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge", HASH_EDGE + GrB_UINT64, lg_edge, GrB_UINT64, "hash_edge64", HASH_EDGE64 )) ; GRB_TRY (GxB_IndexUnaryOp_new ( &swap_pair, (GxB_index_unary_function) (&swap_bc64), - lg_swap, lg_swap, GrB_BOOL, "swap_bc", SWAP_BC64 + lg_swap, lg_swap, GrB_BOOL, "swap_bc64", SWAP_BC64 )) ; GRB_TRY(GxB_BinaryOp_new( &second_edge, (GxB_binary_function) (&edge2nd64_edge), - lg_edge, lg_edge, lg_edge, "edge2", EDGE2ND_EDGE + lg_edge, lg_edge, lg_edge, "edge2nd64_edge", EDGE2ND64_EDGE )) ; GRB_TRY(GxB_BinaryOp_new( &second_bool_edge, (GxB_binary_function) (&edge2nd64_bool), - lg_edge, GrB_BOOL, lg_edge, "edge2", EDGE2ND_BOOL + lg_edge, GrB_BOOL, lg_edge, "edge2nd64_bool", EDGE2ND64_BOOL )) ; } diff --git a/experimental/test/test_SwapEdges.c b/experimental/test/test_SwapEdges.c index c8ba3f1dbf..b9e6a5c729 100644 --- a/experimental/test/test_SwapEdges.c +++ b/experimental/test/test_SwapEdges.c @@ -97,46 +97,49 @@ void test_SwapEdges (void) GrB_Index n = 0; OK (LAGraph_Cached_OutDegree (G, msg)) ; OK (GrB_Matrix_nrows(&n, G->A)); - - //---------------------------------------------------------------------- - // test the algorithm - //---------------------------------------------------------------------- - - GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; - OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); - GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; - printf ("Test ends:\n") ; - printf ("%s\n", msg + 1) ; - - //---------------------------------------------------------------------- - // check results - //---------------------------------------------------------------------- - bool ok = false; - //Make sure we got a symetric back out: - OK (LAGraph_New (&G_new, &A_new, LAGraph_ADJACENCY_DIRECTED, msg)) ; - OK (LAGraph_Cached_AT (G_new, msg)) ; - OK (LAGraph_Matrix_IsEqual (&ok, G_new->AT, G_new->A, msg)) ; - TEST_CHECK (ok) ; - - //Make sure no self edges created. - OK (LAGraph_Cached_NSelfEdges (G_new, msg)) ; - TEST_CHECK (G_new->nself_edges == 0); - - // Check nvals stay the same. - GrB_Index edge_count, new_edge_count; - OK (GrB_Matrix_nvals(&edge_count, G->A)) ; - OK (GrB_Matrix_nvals(&new_edge_count, G_new->A)) ; - printf("old: %ld, new: %ld", edge_count,new_edge_count); - TEST_CHECK(edge_count == new_edge_count); - //next: check degrees stay the same. - OK (LAGraph_Cached_OutDegree (G_new, msg)) ; - - OK (LAGraph_Vector_IsEqual ( - &ok, G->out_degree, G_new->out_degree, msg)) ; - TEST_CHECK (ok) ; - + for (int jit = 0 ; jit <= 1 ; jit++) + { + OK (GxB_Global_Option_set (GxB_JIT_C_CONTROL, + jit ? GxB_JIT_ON : GxB_JIT_OFF)) ; + + //------------------------------------------------------------------ + // test the algorithm + //------------------------------------------------------------------ + // GrB_set (GrB_GLOBAL, (int32_t) (true), GxB_BURBLE) ; + OK(LAGraph_SwapEdges( &A_new, G, (GrB_Index) 100, msg)); + // GrB_set (GrB_GLOBAL, (int32_t) (false), GxB_BURBLE) ; + printf ("Test ends:\n") ; + printf ("%s\n", msg) ; + + //------------------------------------------------------------------ + // check results + //------------------------------------------------------------------ + bool ok = false; + //Make sure we got a symetric back out: + OK (LAGraph_New (&G_new, &A_new, LAGraph_ADJACENCY_DIRECTED, msg)) ; + OK (LAGraph_Cached_AT (G_new, msg)) ; + OK (LAGraph_Matrix_IsEqual (&ok, G_new->AT, G_new->A, msg)) ; + TEST_CHECK (ok) ; + + //Make sure no self edges created. + OK (LAGraph_Cached_NSelfEdges (G_new, msg)) ; + TEST_CHECK (G_new->nself_edges == 0); + + // Check nvals stay the same. + GrB_Index edge_count, new_edge_count; + OK (GrB_Matrix_nvals(&edge_count, G->A)) ; + OK (GrB_Matrix_nvals(&new_edge_count, G_new->A)) ; + printf("old: %ld, new: %ld", edge_count,new_edge_count); + TEST_CHECK(edge_count == new_edge_count); + //next: check degrees stay the same. + OK (LAGraph_Cached_OutDegree (G_new, msg)) ; + + OK (LAGraph_Vector_IsEqual ( + &ok, G->out_degree, G_new->out_degree, msg)) ; + TEST_CHECK (ok) ; + OK (LAGraph_Delete (&G_new, msg)) ; + } OK (LAGraph_Delete (&G, msg)) ; - OK (LAGraph_Delete (&G_new, msg)) ; } //-------------------------------------------------------------------------- diff --git a/experimental/utility/LAGraph_FastAssign.c b/experimental/utility/LAGraph_FastAssign.c index eea2b747ec..1a12915f38 100755 --- a/experimental/utility/LAGraph_FastAssign.c +++ b/experimental/utility/LAGraph_FastAssign.c @@ -159,7 +159,7 @@ int LAGraph_FastAssign_Semiring int64_t n, nrows; GxB_Container con = NULL; void *ramp_a = NULL, *i_a =NULL; - int ramp_h = 0, trsp = GrB_DEFAULT, i_h = 0; + int ramp_h = GrB_DEFAULT, trsp = GrB_DEFAULT, i_h = GrB_DEFAULT; int64_t ramp_n = 0, ramp_size = 0, i_n = 0, i_size= 0; GrB_Type x_type = NULL, i_type = NULL, ramp_type = NULL; bool iso = false; @@ -170,8 +170,8 @@ int LAGraph_FastAssign_Semiring LG_ASSERT (c != NULL, GrB_NULL_POINTER) ; LG_ASSERT (I_vec != NULL, GrB_NULL_POINTER) ; LG_ASSERT (X_vec != NULL, GrB_NULL_POINTER) ; - LG_ASSERT_MSG (c != X_vec && c != I_vec && c != yada yada, GrB_NOT_IMPLEMENTED, - "c cannot be aliased with any input.") ; + LG_ASSERT_MSG (c != X_vec && c != I_vec && c != ramp && c != mask, + GrB_NOT_IMPLEMENTED, "c cannot be aliased with any input.") ; //---------------------------------------------------------------------- // Find dimensions and type @@ -203,7 +203,7 @@ int LAGraph_FastAssign_Semiring if(ramp == NULL) { - //TODO: maybe let user input a size 0 ramp and build it for them? + //FUTURE: maybe let user input a size 0 ramp and build it for them? GRB_TRY (GrB_free(&(con->p))) ; ramp_type = (n + 1 <= INT32_MAX)? GrB_UINT32: GrB_UINT64; GrB_IndexUnaryOp idxnum = (n + 1 <= INT32_MAX)? @@ -218,7 +218,7 @@ int LAGraph_FastAssign_Semiring ramp, &ramp_a, &ramp_type, &ramp_n, &ramp_size, &ramp_h, NULL)) ; LG_ASSERT_MSG (ramp_n > n, GrB_DIMENSION_MISMATCH, "Ramp too small!"); GRB_TRY (GxB_Vector_load( - con->p, &ramp_a, ramp_type, n + 1, (n + 1) * (ramp_size / ramp_n), + con->p, &ramp_a, ramp_type, n + 1, ramp_size, GxB_IS_READONLY, NULL)) ; // Since con->p won't free this array I should be safe to load it back // into ramp. @@ -226,23 +226,17 @@ int LAGraph_FastAssign_Semiring ramp, &ramp_a, ramp_type, ramp_n, ramp_size, ramp_h, NULL)) ; ramp_a = NULL; } - if (c == I_vec) - { - GRB_TRY (GrB_Vector_dup(&con->i, I_vec)) ; - } - else - { - // con->i = I_vec; - GRB_TRY (GxB_Vector_unload( - I_vec, &i_a, &i_type, &i_n, &i_size, &i_h, NULL)) ; - GRB_TRY (GxB_Vector_load( - con->i, &i_a, i_type, i_n, i_size, GxB_IS_READONLY, NULL)) ; - // Since con->i won't free this array I should be safe to load it back - // into I_vec. - GRB_TRY (GxB_Vector_load( - I_vec, &i_a, i_type, i_n, i_size, i_h, NULL)) ; - i_a = NULL; - } + // con->i = I_vec; + GRB_TRY (GxB_Vector_unload( + I_vec, &i_a, &i_type, &i_n, &i_size, &i_h, NULL)) ; + GRB_TRY (GxB_Vector_load( + con->i, &i_a, i_type, i_n, i_size, GxB_IS_READONLY, NULL)) ; + // Since con->i won't free this array I should be safe to load it back + // into I_vec. + GRB_TRY (GxB_Vector_load( + I_vec, &i_a, i_type, i_n, i_size, i_h, NULL)) ; + i_a = NULL; + // con->x [0] = false, of length 1 GRB_TRY (GrB_free(&(con->x))) ; GRB_TRY (GrB_Vector_new (&(con->x), GrB_BOOL, 1)) ; From a7e86e5a160f1f676a8d68e0c4f64b80ff389e6a Mon Sep 17 00:00:00 2001 From: Gabriel Gomez Date: Sun, 11 May 2025 12:41:35 -0500 Subject: [PATCH 115/115] move USING_GRAPHBLAS_V10 definition --- config/LAGraph.h.in | 6 ++++++ include/LAGraph.h | 6 ++++++ src/algorithm/LG_CC_FastSV7.c | 8 -------- src/utility/LG_internal.h | 6 ------ 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/config/LAGraph.h.in b/config/LAGraph.h.in index 676316f432..bbbe74bd8d 100644 --- a/config/LAGraph.h.in +++ b/config/LAGraph.h.in @@ -102,9 +102,15 @@ #error "If using SuiteSparse::GraphBLAS, version 9.0.0 or later is required" #endif #define LAGRAPH_SUITESPARSE 1 + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + #define USING_GRAPHBLAS_V10 1 + #else + #define USING_GRAPHBLAS_V10 0 +#endif #else // use any GraphBLAS library (possibly SuiteSparse) but with no GxB* #define LAGRAPH_SUITESPARSE 0 + #define USING_GRAPHBLAS_V10 0 #endif // maximum length of the name of a GrB type, including the null-terminator diff --git a/include/LAGraph.h b/include/LAGraph.h index 21a5d86e1c..a5227d14df 100644 --- a/include/LAGraph.h +++ b/include/LAGraph.h @@ -102,9 +102,15 @@ #error "If using SuiteSparse::GraphBLAS, version 9.0.0 or later is required" #endif #define LAGRAPH_SUITESPARSE 1 + #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) + #define USING_GRAPHBLAS_V10 1 + #else + #define USING_GRAPHBLAS_V10 0 +#endif #else // use any GraphBLAS library (possibly SuiteSparse) but with no GxB* #define LAGRAPH_SUITESPARSE 0 + #define USING_GRAPHBLAS_V10 0 #endif // maximum length of the name of a GrB type, including the null-terminator diff --git a/src/algorithm/LG_CC_FastSV7.c b/src/algorithm/LG_CC_FastSV7.c index 6be2c337c9..3245dbcbf9 100644 --- a/src/algorithm/LG_CC_FastSV7.c +++ b/src/algorithm/LG_CC_FastSV7.c @@ -54,14 +54,6 @@ #define LG_FREE_ALL ; #include "LG_internal.h" -#define USING_GRAPHBLAS_V10 0 -#if LAGRAPH_SUITESPARSE - #if GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - #undef USING_GRAPHBLAS_V10 - #define USING_GRAPHBLAS_V10 1 - #endif -#endif - double timings [16] ; #if USING_GRAPHBLAS_V10 diff --git a/src/utility/LG_internal.h b/src/utility/LG_internal.h index a399f45dad..ba94f2493c 100644 --- a/src/utility/LG_internal.h +++ b/src/utility/LG_internal.h @@ -239,12 +239,6 @@ typedef unsigned char LG_void ; // code development settings //------------------------------------------------------------------------------ -#if LAGRAPH_SUITESPARSE && GxB_IMPLEMENTATION >= GxB_VERSION (10,0,0) - #define USING_GRAPHBLAS_V10 1 -#else - #define USING_GRAPHBLAS_V10 0 -#endif - // turn off debugging; do not edit these three lines #ifndef NDEBUG #define NDEBUG