add verbose variable for testing, update tensor and dimension repo
This commit is contained in:
@@ -9,27 +9,63 @@ bool isGreatThan(long int a, long int b) { return a > b; }
|
||||
long int incr(long int i) { return i + 1; }
|
||||
long int decr(long int i) { return i - 1; }
|
||||
|
||||
|
||||
|
||||
dimension* init_dim(size_t *t, size_t sz){
|
||||
dimension *d = INIT_PERMUTATION_TYPE_SIZE_T(t,sz);
|
||||
updateRankDim(d);
|
||||
return d;
|
||||
}
|
||||
dimension *
|
||||
create_dim(size_t sz){
|
||||
return CREATE_PERMUTATION_TYPE_SIZE_T(sz);
|
||||
}
|
||||
|
||||
void add_dimension(dimension **d, dimension *d0, dimension *d1) {
|
||||
(*d) = create_dim(d0->size + d1->size);
|
||||
//printf("d size : %ld\n",(*d)->size);
|
||||
(*d)->perm = malloc(sizeof(size_t)*((*d)->size));
|
||||
for (size_t i = 0; i < d0->size; i++) (*d)->perm[i] = d0->perm[i];
|
||||
for (size_t i = 0; i < d1->size; i++) (*d)->perm[d0->size + i] = d1->perm[i];
|
||||
updateRankDim(*d);
|
||||
}
|
||||
|
||||
void min_dimension(dimension **d, dimension *d0, dimension *d1) {
|
||||
if (d0->size > d1->size) {
|
||||
*d = d1;
|
||||
}
|
||||
else if (d0->size < d1->size) {
|
||||
*d = d0;
|
||||
}
|
||||
else { // d0->size = d1->size
|
||||
*d = d0;
|
||||
for (size_t i = 0; i < d0->size; i++) {
|
||||
if (d0->perm[i] > d1->perm[i]) (*d)->perm[i] = d1->perm[i];
|
||||
}
|
||||
}
|
||||
updateRankDim(*d);
|
||||
}
|
||||
|
||||
void printDebug_dimension(dimension *d,char *msg){
|
||||
|
||||
printf("%s / dim->size = %ld | dim->rank = %ld \n",msg,d->size,d->rank);
|
||||
for(size_t i=0; i<d->size; ++i)
|
||||
printf("[%ld: %ld] |", i,d->perm[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void updateRankDim(dimension *dim){
|
||||
dim->rank=1;
|
||||
for(size_t i=0; i<dim->size; ++i)
|
||||
dim->rank *=dim->perm[i];
|
||||
}
|
||||
|
||||
size_t LineFromCoord(size_t *coo, dimension dim){
|
||||
size_t LineFromCoord(size_t *coo, dimension *dim){
|
||||
long int begin = 0;
|
||||
long int end = dim.size - 1;
|
||||
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;
|
||||
begin = dim->size - 1; end = 0;
|
||||
iter = &decr; cond = &isGreatEqThan;
|
||||
}
|
||||
|
||||
@@ -37,38 +73,40 @@ size_t LineFromCoord(size_t *coo, dimension dim){
|
||||
long int sm = 0;
|
||||
for (long int i = begin; cond(i, end); i = iter(i)) {
|
||||
sm += (coo[i] * pp);
|
||||
pp *= dim.perm[i];
|
||||
pp *= dim->perm[i];
|
||||
}
|
||||
return sm;
|
||||
|
||||
}
|
||||
|
||||
|
||||
size_t* CoordFromLin(size_t line, dimension dim){
|
||||
size_t *ret;
|
||||
ret=malloc(dim.size*sizeof(size_t));
|
||||
long int begin = 0, end = dim.size - 1;
|
||||
void vCoordFromLin(size_t *ret, size_t 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;
|
||||
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;
|
||||
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];
|
||||
pp /= dim->perm[i];
|
||||
ret[i] = sm / pp;
|
||||
sm %= pp;
|
||||
//prlong intf("sm[%d] = %d , pp=%d ; ", i, sm, pp);
|
||||
}
|
||||
ret[end] = sm;
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
size_t* CoordFromLin(size_t line, dimension *dim){
|
||||
size_t *ret;
|
||||
ret=malloc(dim->size*sizeof(size_t));
|
||||
vCoordFromLin(ret,line,dim);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,11 +8,17 @@ extern bool endian;
|
||||
typedef struct PERMUTATION_TYPE_SIZE_T dimension ;
|
||||
|
||||
dimension * create_dim(size_t size);
|
||||
dimension* init_dim(size_t *t, size_t sz);
|
||||
|
||||
void add_dimension(dimension **d, dimension *d0, dimension *d1);
|
||||
void min_dimension(dimension **d, dimension *d0, dimension *d1);
|
||||
|
||||
void printDebug_dimension(dimension *d, char *msg);
|
||||
|
||||
void updateRankDim(dimension *dim);
|
||||
size_t LineFromCoord(size_t *coo, dimension dim);
|
||||
size_t* CoordFromLin(size_t line, 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 );
|
||||
|
||||
|
||||
#endif /* __DIMENSION_T__H__ */
|
||||
|
||||
@@ -45,13 +45,13 @@ TEST(Coord_linear){
|
||||
updateRankDim(D);
|
||||
|
||||
size_t line=255;
|
||||
size_t *coord = CoordFromLin(line,*D);
|
||||
size_t *coord = CoordFromLin(line,D);
|
||||
|
||||
for(size_t i=0; i<D->size; ++i){
|
||||
LOG("coo[%ld]=%ld\n",i,coord[i]);
|
||||
}
|
||||
|
||||
EXPECT_EQ(line, LineFromCoord(coord, *D));
|
||||
EXPECT_EQ(line, LineFromCoord(coord, D));
|
||||
}
|
||||
|
||||
int main(int argc, char **argv){
|
||||
|
||||
Reference in New Issue
Block a user