From 6a24c2b427e05566bb7644eac0388ea9d5178fa4 Mon Sep 17 00:00:00 2001 From: fanasina Date: Mon, 22 Apr 2024 12:00:55 +0200 Subject: [PATCH] add signed coordinate transformations --- dimension_t/src/dimension_t/dimension_t.c | 73 ++++++++++++++++++++++- dimension_t/src/dimension_t/dimension_t.h | 6 ++ dimension_t/test/is_good.c | 42 +++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/dimension_t/src/dimension_t/dimension_t.c b/dimension_t/src/dimension_t/dimension_t.c index a549ed2..5edb934 100644 --- a/dimension_t/src/dimension_t/dimension_t.c +++ b/dimension_t/src/dimension_t/dimension_t.c @@ -275,7 +275,7 @@ void updateRankDim(dimension *dim){ for(size_t i=0; isize; ++i) dim->rank *=dim->perm[i]; } - +/* size_t LineFromCoord(size_t *coo, dimension *dim){ long int begin = 0; long int end = dim->size - 1; @@ -327,6 +327,77 @@ size_t* CoordFromLin(size_t line, dimension *dim){ vCoordFromLin(ret,line,dim); return ret; } +*/ + +/* signed */ +long int signedLineFromCoord(long int *coo, dimension *dim){ + long int begin = 0; + long int end = dim->size - 1; + long int (*iter)(long int); iter = &incr; + bool (*cond)(long int, long int); cond = &isLessEqThan; + + if (endian) { + begin = dim->size - 1; end = 0; + iter = &decr; cond = &isGreatEqThan; + } + + long int pp = 1; + long int sm = 0; + for (long int i = begin; cond(i, end); i = iter(i)) { + sm += (coo[i] * pp); + pp *= dim->perm[i]; + } + return sm; + +} + +void signedvCoordFromLin(long int *ret, long int line, dimension *dim ){ + + long int begin = 0, end = dim->size - 1; + long int (*iter)(long int) = incr; + bool (*cond)(long int, long int) = isLessThan; + if (endian == false) { + //if (endian) { + begin = dim->size - 1; end = 0; + iter = decr; cond = isGreatThan; + } + //prlong intf("to coor begin = %d end = %d \n", begin, end); + + long int sm = line; + long int pp = dim->rank; + for (long int i = begin; cond(i, end); i = iter(i)) { + //prlong intf(" i: %d ", i); + pp /= dim->perm[i]; + ret[i] = sm / pp; + sm %= pp; + //prlong intf("sm[%d] = %d , pp=%d ; ", i, sm, pp); + } + ret[end] = sm; +} + +long int* signedCoordFromLin(long int line, dimension *dim){ + long int *ret; + ret=malloc(dim->size*sizeof(long int)); + vCoordFromLin(ret,line,dim); + return ret; +} + +/* */ +/* unsigned */ +size_t LineFromCoord(size_t *coo, dimension *dim) { + return signedLineFromCoord(coo,dim); +} + +void vCoordFromLin(size_t *ret, size_t line, dimension *dim ){ + signedvCoordFromLin(ret, line, dim); +} + +size_t* CoordFromLin(size_t line, dimension *dim){ + return signedCoordFromLin(line, dim); +} + + +/* */ void append_in_list_perm(list_perm_in_dim **list_p, size_t perm){ list_perm_in_dim *lis=malloc(sizeof(list_perm_in_dim)); diff --git a/dimension_t/src/dimension_t/dimension_t.h b/dimension_t/src/dimension_t/dimension_t.h index 14f18a8..18f46ca 100644 --- a/dimension_t/src/dimension_t/dimension_t.h +++ b/dimension_t/src/dimension_t/dimension_t.h @@ -46,10 +46,16 @@ void printDebug_dimension(dimension *d, char *msg); size_t sprint_dimension(char **dimContent, dimension *d); void updateRankDim(dimension *dim); + size_t LineFromCoord(size_t *coo, dimension *dim); size_t* CoordFromLin(size_t line, dimension *dim); void vCoordFromLin(size_t *ret, size_t line, dimension *dim ); +long int signedLineFromCoord(long int *coo, dimension *dim); +long int* signedCoordFromLin(long int line, dimension *dim); +void signedvCoordFromLin(long int *ret, long int line, dimension *dim ); + + void increment_dim_var(dimension *d); void decrement_dim_var(dimension *d); diff --git a/dimension_t/test/is_good.c b/dimension_t/test/is_good.c index 5cf554e..828867d 100644 --- a/dimension_t/test/is_good.c +++ b/dimension_t/test/is_good.c @@ -161,6 +161,48 @@ TEST(Coord_linear){ free(coord); } +TEST(signedCoord_linear){ + dimension *D=create_dim(4); + D->perm[0]=2; + D->perm[1]=3; + D->perm[2]=5; + D->perm[3]=6; + + updateRankDim(D); + + long line=-255; + long *coord = signedCoordFromLin(line,D); + + for(size_t i=0; isize; ++i){ + LOG("coo[%ld]=%ld\n",i,coord[i]); + } + + EXPECT_EQ(line, signedLineFromCoord(coord, D)); + free_dimension(D); + free(coord); +} + +TEST(signedCoord_linearSuccessif){ + dimension *D=create_dim(3); + D->perm[0]=2; + D->perm[1]=3; + D->perm[2]=2; + + updateRankDim(D); + + for(long line=-4; line < 4; ++line){ + long *coord = signedCoordFromLin(line,D); + + for(size_t i=0; isize; ++i){ + LOG("coo[%ld]=%ld\n",i,coord[i]); + } + + EXPECT_EQ(line, signedLineFromCoord(coord, D)); + free(coord); + } + free_dimension(D); +} + TEST(sprint_dim){ dimension *D=create_dim(4); D->perm[0]=2;