Compare commits

..

4 Commits

Author SHA1 Message Date
fanasina 7581a2612a [add] test tensor 2026-07-22 23:37:13 +02:00
fanasina 654ad1fa9c [fix] gitignore 2026-07-22 23:35:53 +02:00
fanasina 8bcc6177ea [fix] debug tensor func, [update] gitignore 2026-07-22 23:31:03 +02:00
fanasina 858fc6722e [add] dim: add basis, tensor: add optimize transposition 2026-07-22 14:47:27 +02:00
6 changed files with 2894 additions and 76 deletions
+3
View File
@@ -1,2 +1,5 @@
**.swp
**is_good*
**.ff*
**xtest*
+8
View File
@@ -0,0 +1,8 @@
[6,8,1]
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
File diff suppressed because it is too large Load Diff
+18 -12
View File
@@ -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);
+15
View File
@@ -0,0 +1,15 @@
[*,7,2]
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(5,9),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(5,9),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(8,8),(1,2)
((0,0,0)(8,8)(5,9),(1,2)
+112 -64
View File
@@ -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; i<rnk; ++i) d->shape[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;i<rnk;++i) dim->shape[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; i<dim->rank; ++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; i<dimension_rank; ++i)\
dim->shape[i]=2;\
updateRankDim(dim);\
updateDim(dim);\
return dim;\
}\
\
@@ -856,7 +876,7 @@ void append_array_chainlist_##type(array_chainlist_##type **list_a, type x);\
tensor_##type * create_tensor_from_list_array_##type( array_chainlist_##type *l_a, dimension *part_dim);\
void free_array_chainlist_##type(array_chainlist_##type *l_a);\
tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org);\
tensor_##type * shapeute_notOpt_tensor_##type(tensor_##type *org, dimension *dshape);\
tensor_##type * permute_notOpt_tensor_##type(tensor_##type *org, dimension *dshape);\
void update_1tensor_func_##type(tensor_##type *M0, \
type (*func)(type), size_t nbthread);\
void update_2tensor_func_##type(tensor_##type *M0, tensor_##type *M1, \
@@ -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; i<dim->size;++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);\
@@ -1556,7 +1576,7 @@ void tensorContractnProd_##type(tensor_##type** MM, tensor_##type *M0, tensor_##
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
\
size_t len0 = M0->dim->rank - contractionNumber;\
@@ -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;\
\
@@ -1634,7 +1654,7 @@ void tensorContractnProdOpt0_##type(tensor_##type** MM, tensor_##type *M0, tenso
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
\
size_t len0 = M0->dim->rank - contractionNumber;\
@@ -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;\
\
@@ -1877,7 +1897,7 @@ void tensorContractnProdThread_##type(tensor_##type** MM, tensor_##type *M0, ten
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
size_t len0 = M0->dim->rank - contractionNumber;\
size_t len1 = M1->dim->rank - contractionNumber;\
@@ -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;\
\
@@ -1974,7 +1994,7 @@ void tensorContractnProdThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0,
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
size_t len0 = M0->dim->rank - contractionNumber;\
size_t len1 = M1->dim->rank - contractionNumber;\
@@ -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;\
\
@@ -2081,7 +2101,7 @@ void tensorContractnPro2dThread_##type(tensor_##type** MM, tensor_##type *M0, te
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
\
size_t len0 = M0->dim->rank - contractionNumber;\
@@ -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;\
\
@@ -2181,7 +2201,7 @@ void tensorContractnPro2dThreadOpt0_##type(tensor_##type** MM, tensor_##type *M0
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
\
size_t len0 = M0->dim->rank - contractionNumber;\
@@ -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;\
\
@@ -2240,7 +2260,7 @@ void tensorContractnProdNotOpt_##type(tensor_##type** MM, tensor_##type *M0, ten
printf("error Deep = %ld\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
/*getchar();*/\
}\
size_t len0 = M0->dim->rank - contractionNumber;\
size_t len1 = M1->dim->rank - contractionNumber;\
@@ -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;i<dim2->rank;++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;i<ddim1->rank;++i) ddim1->shape[i] = dim->shape[i];\
for(size_t i=0;i<ddim2->rank;++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;i<ddim2->rank;++i) ddim2->shape[i] = dim->shape[ dim->rank - pivotSplit + i];\
dim2->shape[0] = dim->shape[0];\
for(size_t i=1;i<dim2->rank;++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;i<ddim1->rank;++i) ddim1->shape[i] = dim->shape[i];\
for(size_t i=0;i<ddim2->rank;++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; i<dim->rank; ++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; j<dim->size; ++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; i<dimrnk; ++i) dim_tr->shape[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,39 @@ tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\
return tens_tr;\
}\
\
tensor_##type * shapeute_notOpt_tensor_##type(tensor_##type *org, dimension *dshape){\
tensor_##type * transpose_Opt0_tensor_##type(tensor_##type *org){\
size_t dimrnk = org->dim->rank;\
dimension *dim_tr=create_dim(dimrnk);\
for(size_t i=0; i<dimrnk; ++i) dim_tr->shape[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);\
/*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; i<dim_tr->size; ++i){\
minus_tr =0;\
/*printf("DEBUG: cur_tr=%ld\n",cur_tr);*/\
for(size_t l=0; l<dimrnk; ++l){ \
add_tr = minus_tr + dim_tr->basis[l+1];\
if(cur_tr + add_tr < dim_tr->basis[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->basis[l]-dim_tr->basis[l+1]);\
}\
/*printf("DEBUG: after cur_tr=%ld\n",cur_tr);*/\
}\
return tens_tr;\
}\
\
tensor_##type * permute_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; i<dimrnk; ++i) dim_tr->shape[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));\