add signed coordinate transformations
This commit is contained in:
@@ -275,7 +275,7 @@ void updateRankDim(dimension *dim){
|
||||
for(size_t i=0; i<dim->size; ++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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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; i<D->size; ++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; i<D->size; ++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;
|
||||
|
||||
Reference in New Issue
Block a user