|
|
|
@@ -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));\
|
|
|
|
|