diff --git a/onetensor/testDimension.c b/onetensor/testDimension.c index b14b47e..366304a 100644 --- a/onetensor/testDimension.c +++ b/onetensor/testDimension.c @@ -38,7 +38,7 @@ TEST(size){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); EXPECT_EQ(D->size, 180); free_dimension(D); @@ -50,7 +50,7 @@ TEST(SplitDim){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); printDebug_dimension(D," D root"); dimension *d_part1 = NULL,*d_part2=NULL; @@ -80,7 +80,7 @@ TEST(SplitDim_2){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); printDebug_dimension(D," D root"); dimension *d_part1 = NULL,*d_part2=NULL; @@ -122,8 +122,10 @@ TEST(SubDimB){ EXPECT_EQ(d_tail2->size, 15*26); free_dimension(D); - free(d_tail2); - free(d_head2); + d_tail2->shape=NULL; + d_head2->shape=NULL; + free_dimension(d_tail2); + free_dimension(d_head2); } TEST(SubDim){ @@ -143,8 +145,12 @@ TEST(SubDim){ EXPECT_EQ(d_tail2->size, 5*6); free_dimension(D); - free(d_tail2); - free(d_head2); + d_tail2->shape=NULL; + d_head2->shape=NULL; + free_dimension(d_tail2); + free_dimension(d_head2); + //free(d_tail2); + //free(d_head2); } TEST(Coord_linear){ @@ -154,7 +160,7 @@ TEST(Coord_linear){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); size_t line=255; size_t *coord = CoordFromLin(line,D); @@ -175,7 +181,7 @@ TEST(signedCoord_linear){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); long line=-255; long *coord = signedCoordFromLin(line,D); @@ -195,7 +201,7 @@ TEST(signedCoord_linearSuccessif){ D->shape[1]=3; D->shape[2]=2; - updateRankDim(D); + updateDim(D); for(long line=-4; line < 4; ++line){ long *coord = signedCoordFromLin(line,D); @@ -217,7 +223,7 @@ TEST(sprint_dim){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); char *dimSTR =NULL; size_t nb=sprint_dimension(&dimSTR, D); @@ -236,7 +242,7 @@ TEST(incrment_dim){ D->shape[2]=5; D->shape[3]=6; - updateRankDim(D); + updateDim(D); char *dimSTR =NULL; size_t nb=sprint_dimension(&dimSTR, D); diff --git a/onetensor/y_tensor_h.h b/onetensor/y_tensor_h.h index 23d4157..34282f9 100644 --- a/onetensor/y_tensor_h.h +++ b/onetensor/y_tensor_h.h @@ -275,9 +275,11 @@ long diff_timespec_nanoseconds(struct timespec time_stop, struct timespec time_s #include "../list_t/list_t.h" struct dimension{ - size_t size; - size_t *shape; size_t rank; + size_t *shape; + long int *basis; + size_t basis_rank; + size_t size; }; @@ -324,7 +326,7 @@ void min_dimension(dimension **d, dimension *d0, dimension *d1); void printDebug_dimension(dimension *d, char *msg); size_t sprint_dimension(char **dimContent, dimension *d); -void updateRankDim(dimension *dim); +void updateDim(dimension *dim); size_t LineFromCoord(size_t *coo, dimension *dim); size_t* CoordFromLin(size_t line, dimension *dim); @@ -384,7 +386,9 @@ dimension* init_dim(size_t *t, size_t rnk){\ dimension *d = malloc(sizeof(dimension));\ d->rank=rnk;\ d->shape=t;\ - updateRankDim(d);\ + d->basis=NULL;\ + d->basis_rank=0;\ + updateDim(d);\ return d;\ }\ \ @@ -392,9 +396,11 @@ dimension* init_copy_dim(size_t *t, size_t rnk){\ if (rnk==0) return NULL;\ dimension *d = malloc(sizeof(dimension));\ d->shape=malloc(rnk * sizeof(size_t));\ + d->basis=NULL;\ + d->basis_rank=0;\ d->rank = rnk;\ for(size_t i=0; ishape[i]=t[i];\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ dimension *\ @@ -402,6 +408,8 @@ create_dim(size_t rnk){\ if (rnk==0) return NULL;\ dimension *d = malloc(sizeof(dimension));\ d->shape=malloc(rnk * sizeof(size_t));\ + d->basis=NULL;\ + d->basis_rank=0;\ d->rank = rnk;\ return d;\ }\ @@ -414,13 +422,14 @@ dimension *\ create_reverse_dim(size_t rnk){\ dimension *dim = create_dim(rnk);\ for(size_t i=0;ishape[i]=rnk-1-i;\ - updateRankDim(dim);\ + updateDim(dim);\ return dim;\ }\ \ void free_dimension(dimension *d){\ if(d){\ - free(d->shape);\ + if(d->shape) free(d->shape);\ + if(d->basis) free(d->basis);\ free(d);\ }\ }\ @@ -437,7 +446,7 @@ bool is_equal_dim(dimension *d0, dimension *d1){\ dimension* sub_copy_minus_dim_head(dimension *root, size_t minusSubdim){\ if(minusSubdim < (root->rank)){\ dimension *d = init_copy_dim(root->shape, (root->rank)-minusSubdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -446,7 +455,7 @@ dimension* sub_copy_minus_dim_head(dimension *root, size_t minusSubdim){\ dimension* sub_copy_minus_dim_tail(dimension *root, size_t minusSubdim){\ if(minusSubdim < (root->rank)){\ dimension *d = init_copy_dim((root->shape)+minusSubdim, (root->rank)-minusSubdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -455,7 +464,7 @@ dimension* sub_copy_minus_dim_tail(dimension *root, size_t minusSubdim){\ dimension* sub_copy_dim_head(dimension *root, size_t subdim){\ if(subdim < (root->rank)){\ dimension *d = init_copy_dim(root->shape, subdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -464,7 +473,7 @@ dimension* sub_copy_dim_head(dimension *root, size_t subdim){\ dimension* sub_copy_dim_tail(dimension *root, size_t subdim){\ if(subdim < (root->rank)){\ dimension *d = init_copy_dim((root->shape)+(root->rank - subdim), subdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -474,7 +483,7 @@ void add_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\ (*d) = create_dim(d0->rank + d1->rank);\ for (size_t i = 0; i < d0->rank; i++) (*d)->shape[i] = d0->shape[i];\ for (size_t i = 0; i < d1->rank; i++) (*d)->shape[d0->rank + i] = d1->shape[i];\ - updateRankDim(*d);\ + updateDim(*d);\ }\ \ void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\ @@ -485,7 +494,7 @@ void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\ if (d0->shape[i] > d1->shape[i]) (*d)->shape[i] = d1->shape[i];\ else (*d)->shape[i] = d0->shape[i];\ }\ - updateRankDim(*d);\ + updateDim(*d);\ }\ \ \ @@ -494,7 +503,7 @@ void min_copy_dimension(dimension **d, dimension *d0, dimension *d1) {\ dimension* sub_minus_dim_head(dimension *root, size_t minusSubdim){\ if(minusSubdim < (root->rank)){\ dimension *d = init_dim(root->shape, (root->rank)-minusSubdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -502,7 +511,7 @@ dimension* sub_minus_dim_head(dimension *root, size_t minusSubdim){\ dimension* sub_minus_dim_tail(dimension *root, size_t minusSubdim){\ if(minusSubdim < (root->rank)){\ dimension *d = init_dim((root->shape)+minusSubdim, (root->rank)-minusSubdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -510,7 +519,7 @@ dimension* sub_minus_dim_tail(dimension *root, size_t minusSubdim){\ dimension* sub_dim_head(dimension *root, size_t subdim){\ if(subdim < (root->rank)){\ dimension *d = init_dim(root->shape, subdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -518,7 +527,7 @@ dimension* sub_dim_head(dimension *root, size_t subdim){\ dimension* sub_dim_tail(dimension *root, size_t subdim){\ if(subdim < (root->rank)){\ dimension *d = init_dim((root->shape)+(root->rank - subdim), subdim);\ - updateRankDim(d);\ + updateDim(d);\ return d;\ }\ return NULL;\ @@ -533,14 +542,14 @@ void split_dim_part(dimension *root, dimension **part_1, dimension **part_2, siz /*printf("rnk_part1 :%ld \n",rnk_part1);*/\ *part_1 = init_copy_dim(root->shape, root->rank);\ ((*part_1)->shape[pivotSplit]) -= rangeInPivot;\ - updateRankDim(*part_1);\ + updateDim(*part_1);\ /*if(rnk_nb_minus_part <2)\ *part_2 = init_copy_dim((root->shape), root->rank-1 );\ else{*/\ *part_2 = init_copy_dim((root->shape), root->rank );\ (*part_2)->shape[pivotSplit] = rangeInPivot ;\ /*}*/\ - updateRankDim(*part_2);\ + updateDim(*part_2);\ }\ }\ }\ @@ -568,7 +577,7 @@ void add_dimension(dimension **d, dimension *d0, dimension *d1) {\ (*d) = create_dim(d0->rank + d1->rank);\ for (size_t i = 0; i < d0->rank; i++) (*d)->shape[i] = d0->shape[i];\ for (size_t i = 0; i < d1->rank; i++) (*d)->shape[d0->rank + i] = d1->shape[i];\ - updateRankDim(*d);\ + updateDim(*d);\ }\ \ void min_dimension(dimension **d, dimension *d0, dimension *d1) {\ @@ -584,7 +593,7 @@ void min_dimension(dimension **d, dimension *d0, dimension *d1) {\ if (d0->shape[i] > d1->shape[i]) (*d)->shape[i] = d1->shape[i];\ }\ }\ - updateRankDim(*d);\ + updateDim(*d);\ }\ \ void printDebug_dimension(dimension *d,char *msg){\ @@ -650,10 +659,21 @@ size_t sprint_dimension(char **dimContent, dimension *d){\ return cur;\ }\ \ -void updateRankDim(dimension *dim){\ - dim->size=1;\ - for(size_t i=0; irank; ++i)\ - dim->size *=dim->shape[i];\ +void updateDim(dimension *dim){\ + if(dim->basis==NULL){\ + \ + dim->basis_rank=dim->rank+1;\ + dim->basis=malloc(dim->basis_rank *sizeof(long int));\ + }else if(dim->basis_rank != dim->rank+1){\ + free(dim->basis);\ + dim->basis_rank=dim->rank+1;\ + dim->basis=malloc(dim->basis_rank *sizeof(long int));\ + }\ + dim->basis[dim->rank]=1;\ + for(long int j=dim->rank-1; j>=0; --j){\ + dim->basis[j] = dim->basis[j+1]*dim->shape[j];\ + }\ + dim->size=dim->basis[0];\ }\ \ /* signed */\ @@ -754,7 +774,7 @@ dimension * create_dim_from_list_shape( list_shape_in_dim *l_p){\ (dim)->shape[tmp->index]=tmp->shape;\ tmp=tmp->next;\ }\ - updateRankDim(dim);\ + updateDim(dim);\ return dim;\ }\ return NULL;\ @@ -764,7 +784,7 @@ dimension * create_binary_dim(size_t dimension_rank){\ dimension * dim = create_dim(dimension_rank);\ for(size_t i=0; ishape[i]=2;\ - updateRankDim(dim);\ + updateDim(dim);\ return dim;\ }\ \ @@ -955,7 +975,7 @@ long int decr(long int i) { return i - 1; } #define GEN_FUNC_TENSOR(type)\ tensor_##type* create_tensor_##type(dimension *dim){\ tensor_##type *r_tens=malloc(sizeof(tensor_##type));\ - updateRankDim(dim);\ + updateDim(dim);\ r_tens->dim = dim;\ r_tens->x = malloc(sizeof(type)*dim->size);\ return r_tens;\ @@ -973,7 +993,7 @@ void _recreate_tensor_if_not_the_same_dim_or_null_##type(tensor_##type **M, dime }\ tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\ tensor_##type *r_tens=malloc(sizeof(tensor_##type));\ - updateRankDim(dim);\ + updateDim(dim);\ r_tens->dim = dim;\ r_tens->x = troot->x;\ return r_tens;\ @@ -981,7 +1001,7 @@ tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\ \ tensor_##type* init_tensor_tail_##type(tensor_##type *troot ,dimension *dim){\ tensor_##type *r_tens=malloc(sizeof(tensor_##type));\ - updateRankDim(dim);\ + updateDim(dim);\ r_tens->dim = dim;\ r_tens->x = troot->x + ((troot->dim)->size - dim->size);\ return r_tens;\ @@ -990,7 +1010,7 @@ tensor_##type* init_tensor_head_##type(tensor_##type *troot ,dimension *dim){\ \ tensor_##type* init_copy_tensor_head_##type(tensor_##type *troot ,dimension *dim){\ tensor_##type *r_tens=malloc(sizeof(tensor_##type));\ - updateRankDim(dim);\ + updateDim(dim);\ r_tens->dim = dim;\ /*r_tens->x = troot->x;*/\ for(size_t i=0; isize;++i)\ @@ -1000,7 +1020,7 @@ tensor_##type* init_copy_tensor_head_##type(tensor_##type *troot ,dimension *dim \ tensor_##type* init_copy_tensor_tail_##type(tensor_##type *troot ,dimension *dim){\ tensor_##type *r_tens=malloc(sizeof(tensor_##type));\ - updateRankDim(dim);\ + updateDim(dim);\ r_tens->dim = dim;\ /*r_tens->x = troot->x + ((troot->dim)->size - dim->size);*/\ r_tens->x = malloc(sizeof(type)*dim->size);\ @@ -1589,7 +1609,7 @@ void tensorContractnProd_##type(tensor_##type** MM, tensor_##type *M0, tensor_## dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ /*printDebug_dimension(dd,"dd");*/\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -1667,7 +1687,7 @@ void tensorContractnProdOpt0_##type(tensor_##type** MM, tensor_##type *M0, tenso dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ /*printDebug_dimension(dd,"dd");*/\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -1899,7 +1919,7 @@ void tensorContractnProdThread_##type(tensor_##type** MM, tensor_##type *M0, ten \ dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -1996,7 +2016,7 @@ void tensorContractnProdThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0, \ dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -2104,7 +2124,7 @@ void tensorContractnPro2dThread_##type(tensor_##type** MM, tensor_##type *M0, te \ dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -2204,7 +2224,7 @@ void tensorContractnPro2dThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0 \ dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -2272,7 +2292,7 @@ void tensorContractnProdNotOpt_##type(tensor_##type** MM, tensor_##type *M0, ten dimension *dd;\ add_dimension(&dd, dSub0, dSub1);\ /*printDebug_dimension(dd,"dd");*/\ - updateRankDim(dd);\ + updateDim(dd);\ _recreate_tensor_if_not_the_same_dim_or_null_##type(MM,dd);\ tensor_##type *M= *MM;\ \ @@ -2462,10 +2482,10 @@ void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_# dim2->shape[0] = dim->shape[0];\ for(size_t i=1;irank;++i) dim2->shape[i] = ddim2->shape[i-1];\ /*dim2->shape[1] = dim->shape[dim->rank - 1];*/\ - updateRankDim(dim1);\ - updateRankDim(ddim1);\ - updateRankDim(ddim2);\ - updateRankDim(dim2);\ + updateDim(dim1);\ + updateDim(ddim1);\ + updateDim(ddim2);\ + updateDim(dim2);\ *Tpart1 = create_tensor_##type(dim1);\ *Tpart2 = create_tensor_##type(dim2);\ \ @@ -2517,8 +2537,8 @@ void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_# dimension *ddim2 = create_dim(pivotSplit);\ for(size_t i=0;irank;++i) ddim1->shape[i] = dim->shape[i];\ for(size_t i=0;irank;++i) ddim2->shape[i] = dim->shape[dim->rank - pivotSplit + i];\ - updateRankDim(ddim1);\ - updateRankDim(ddim2);\ + updateDim(ddim1);\ + updateDim(ddim2);\ array_chainlist_##type *l_a1=NULL;\ array_chainlist_##type *l_a2=NULL;\ size_t i1=0, /*i=0,j=0, */ i2=0;\ @@ -2671,10 +2691,10 @@ void parse_file_InputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, te for(size_t i=0;irank;++i) ddim2->shape[i] = dim->shape[ dim->rank - pivotSplit + i];\ dim2->shape[0] = dim->shape[0];\ for(size_t i=1;irank;++i) dim2->shape[i] = ddim2->shape[i-1];\ - updateRankDim(dim1);\ - updateRankDim(ddim1);\ - updateRankDim(ddim2);\ - updateRankDim(dim2);\ + updateDim(dim1);\ + updateDim(ddim1);\ + updateDim(ddim2);\ + updateDim(dim2);\ *Tpart1 = create_tensor_##type(dim1);\ *Tpart2 = create_tensor_##type(dim2);\ initDim=true;\ @@ -2723,8 +2743,8 @@ void parse_file_InputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, te ddim2 = create_dim(pivotSplit);\ for(size_t i=0;irank;++i) ddim1->shape[i] = dim->shape[i];\ for(size_t i=0;irank;++i) ddim2->shape[i] = dim->shape[dim->rank - pivotSplit + i];\ - updateRankDim(ddim1);\ - updateRankDim(ddim2);\ + updateDim(ddim1);\ + updateDim(ddim2);\ initDim=true;\ }\ type x= 0;\ @@ -2782,7 +2802,7 @@ tensor_##type ** fromInput_to_array_tensor_##type(tensor_##type *tens){\ tensor_##type **re_tens=malloc((tens->dim)->shape[0]*sizeof(tensor_##type *));\ dimension *dim=create_dim((tens->dim)->rank - 1);\ for(size_t i=0; irank; ++i) dim->shape[i]=(tens->dim)->shape[i+1];\ - updateRankDim(dim);\ + updateDim(dim);\ for(size_t i=0; i < (tens->dim)->shape[0];++i){\ re_tens[i]=create_tensor_from_cpy_dim_##type(dim);\ for(size_t j=0; jsize; ++j) (re_tens[i])->x[j] = tens->x[i*(dim->size) + j ] ;\ @@ -2822,7 +2842,7 @@ tensor_##type * create_tensor_from_list_array_##type( array_chainlist_##type *l_ dim->shape[i]=miss_part_d;\ \ }\ - updateRankDim(dim);\ + updateDim(dim);\ tensor_##type *tens= create_tensor_##type(dim);\ tmp=l_a;\ while(tmp){\ @@ -2847,7 +2867,7 @@ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\ size_t dimrnk = (org->dim)->rank; \ dimension *dim_tr=create_dim(dimrnk);\ for(size_t i=0; ishape[i]=(org->dim)->shape[(dimrnk-1)-i];\ - updateRankDim(dim_tr);\ + updateDim(dim_tr);\ printDebug_dimension(dim_tr,"dim_tr");\ tensor_##type *tens_tr = create_tensor_##type(dim_tr);\ size_t *coord = malloc((dimrnk)*sizeof(size_t));\ @@ -2862,11 +2882,38 @@ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\ return tens_tr;\ }\ \ +tensor_##type * transpose_Opt0_tensor_##type(tensor_##type *org){\ + size_t dimrnk = org->rank;\ + dimension *dim_tr=create_dim(dimrnk);\ + for(size_t i=0; ishape[i]=(org->dim)->shape[(dimrnk-1)-i];\ + updateDim(dim_tr);\ + printDebug_dimension(dim_tr,"dim_trOpt");\ + tensor_##type *tens_tr = CREATE_TENSOR_##type(dim_tr);\ + long int cur_tr=0, add_tr=0, minus_tr=0;\ + tens_tr->x[cur_tr] = org->x[cur_tr];\ + for(size_t i=1; isize; ++i){\ + minus_tr =0;\ + /*printf("DEBUG: cur_tr=%ld\n",cur_tr);*/\ + for(size_t l=0; lbase[l+1];\ + if(cur_tr + add_tr < dim_tr->base[l]){\ + cur_tr += add_tr;\ + /*tens_tr->x[cur_tr] = org->x[i]*/;\ + tens_tr->x[i] = org->x[cur_tr];\ + break;\ + }\ + minus_tr -= (dim_tr->base[l]-dim_tr->base[l+1]);\ + }\ + /*printf("DEBUG: after cur_tr=%ld\n",cur_tr);*/\ + }\ + return tens_tr;\ +}\ +\ tensor_##type * shapeute_notOpt_tensor_##type(tensor_##type *org, dimension *dshape){\ size_t dimrnk = (org->dim)->rank; \ dimension *dim_tr=create_dim(dimrnk);\ for(size_t i=0; ishape[i]=(org->dim)->shape[(dimrnk-1)-i];\ - updateRankDim(dim_tr);\ + updateDim(dim_tr);\ printDebug_dimension(dim_tr,"dim_tr");\ tensor_##type *tens_tr = create_tensor_##type(dim_tr);\ size_t *coord = malloc((dimrnk)*sizeof(size_t));\