add some functions to pars input char* or file to convert to tensor input output

This commit is contained in:
2024-02-26 18:01:57 +01:00
parent 39c8e90555
commit 2fc2fe477f
4 changed files with 413 additions and 6 deletions
+397 -4
View File
@@ -94,7 +94,8 @@ tensor_##type* init_copy_tensor_head_##type(tensor_##type *troot ,dimension *dim
r_tens->dim = dim;\
/*r_tens->x = troot->x + ((troot->dim)->rank - dim->rank);*/\
r_tens->x = malloc(sizeof(type)*dim->rank);\
for(size_t dRank=(troot->dim)->rank - dim->rank, i=0; i<dim->rank;++i)\
size_t dRank=(troot->dim)->rank - dim->rank;\
for(size_t i=0; i<dim->rank;++i)\
r_tens->x[i]=troot->x[i+dRank];\
return r_tens;\
}\
@@ -476,8 +477,8 @@ void split_copy_tensor_##type(tensor_##type *Troot, tensor_##type **Tpart1, tens
if( rangeInPivot < (Troot->dim)->perm[pivotSplit]){\
dimension *dpart1, *dpart2;\
split_dim_part(Troot->dim, &dpart1, &dpart2, pivotSplit, rangeInPivot);\
*Tpart1 = init_tensor_head_##type(Troot, dpart1);\
*Tpart2 = init_tensor_tail_##type(Troot, dpart2);\
*Tpart1 = init_copy_tensor_head_##type(Troot, dpart1);\
*Tpart2 = init_copy_tensor_tail_##type(Troot, dpart2);\
}\
}\
}\
@@ -1049,9 +1050,365 @@ tensor_##type * parseInput_withDim_to_tensor_##type(char *input){\
}\
\
tens = create_tensor_from_list_array_##type(l_a,dim);\
free_dimension(dim);\
free_array_chainlist_##type(l_a);\
}\
free_list_perm_in_dim(l_p);\
return tens;\
}\
\
\
/*format_file: [*,dim1,dim2]((x,x,a)(x,a))... | example:[2,(2,3),4](((a0,b0,c0,)((a1,b1,c1))((a2,b2,c2,d2))((e0,f0,g0)(e1,f1,g1)(e2,f2,g2,h2))) ==[2,2,3][2,4]*/\
void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_##type **Tpart2, char *input, size_t pivotSplit){\
/*tensor_##type *tens ;*/\
size_t len = strlen(input);\
list_perm_in_dim *l_p=NULL;\
size_t ss;\
char *ttmp=input;\
char *ppEnd="[";\
bool size_unknown=false; \
for(size_t i=0; i<len ; ++i){\
if(input[i]==']') break;\
if((input[i]=='*') ||(input[i]=='_')){ size_unknown =true; break;}\
}\
while(ppEnd && (ppEnd[0] !=']') ){\
ss = strtoul(ttmp, &ppEnd, 10);\
while(ttmp == ppEnd && ppEnd[0] !=']'){\
ttmp++;\
ss = strtoul(ttmp, &ppEnd, 10);\
}\
if(ppEnd !=ttmp )\
append_in_list_perm(&l_p,ss);\
/*printf("ss: %ld\n",ss);*/\
ttmp=ppEnd;\
}\
dimension *dim=create_dim_from_list_perm(l_p);\
/*printf("ppEnd = %s\n",ppEnd);*/\
\
ttmp++; ppEnd++;\
\
if(size_unknown == false){\
/*dimension *dim1 = create_dim(dim->size-1);\
dimension *ddim1 = create_dim(dim->size-2);\
dimension *ddim2 = create_dim(dim->size-2);\
dimension *dim2 = create_dim(2);\
*/dimension *dim1 = create_dim(dim->size-pivotSplit);\
dimension *ddim1 = create_dim(dim->size-pivotSplit-1);\
dimension *ddim2 = create_dim(pivotSplit);\
dimension *dim2 = create_dim(pivotSplit+1);\
for(size_t i=0;i<dim1->size;++i) dim1->perm[i] = dim->perm[i];\
for(size_t i=0;i<ddim1->size;++i) ddim1->perm[i] = dim->perm[i+1];\
for(size_t i=0;i<ddim2->size;++i) ddim2->perm[i] = dim->perm[ dim->size - pivotSplit + i];\
dim2->perm[0] = dim->perm[0];\
for(size_t i=1;i<dim2->size;++i) dim2->perm[i] = ddim2->perm[i-1];\
/*dim2->perm[1] = dim->perm[dim->size - 1];*/\
updateRankDim(dim1);\
updateRankDim(ddim1);\
updateRankDim(ddim2);\
updateRankDim(dim2);\
*Tpart1 = CREATE_TENSOR_##type(dim1);\
*Tpart2 = CREATE_TENSOR_##type(dim2);\
\
size_t i1=0,i=0,j=0,i2=0;\
bool filled1=false,filled2=false;\
type x;\
while(ppEnd && (ppEnd[0] !='\0') && j<dim2->rank){\
x = strto_##type(ttmp, &ppEnd);\
while(ttmp == ppEnd && ppEnd[0] !='\0'){\
ttmp++;\
x = strto_##type(ttmp, &ppEnd);\
}\
if(ppEnd[0]!='\0'){\
if(!filled1){\
++i1;\
(*Tpart1)->x[i++] = x;\
printf("++ x: %f, i1:%ld , rkn1: %ld\n",x,i1,ddim1->rank);\
if(i1 == ddim1->rank){\
filled1=true;\
i1=0;\
filled2=false;\
}\
}else{\
if(!filled2){\
++i2;\
(*Tpart2)->x[j++] = x;\
printf("-----++ x: %f, i2:%ld , rknr: %ld\n",x,i2,ddim2->rank);\
if(i2 == ddim2->rank){\
filled2=true;\
i2=0;\
filled1=false;\
}\
}\
\
}\
/*printf("d: %lf\n",d);*/\
}\
ttmp=ppEnd;\
}\
free_dimension(ddim1);\
free_dimension(ddim2);\
}\
else{\
/*dimension *ddim1 = create_dim(dim->size-1);\
dimension *ddim2 = create_dim(1);\
for(size_t i=0;i<ddim1->size;++i) ddim1->perm[i] = dim->perm[i];\
ddim2->perm[0] = dim->perm[dim->size - 1];\
*/dimension *ddim1 = create_dim(dim->size-pivotSplit);\
dimension *ddim2 = create_dim(pivotSplit);\
for(size_t i=0;i<ddim1->size;++i) ddim1->perm[i] = dim->perm[i];\
for(size_t i=0;i<ddim2->size;++i) ddim2->perm[i] = dim->perm[dim->size - pivotSplit + i];\
updateRankDim(ddim1);\
updateRankDim(ddim2);\
array_chainlist_##type *l_a1=NULL;\
array_chainlist_##type *l_a2=NULL;\
size_t i1=0,i=0,j=0,i2=0;\
bool filled1=false,filled2=false;\
type x;\
while(ppEnd && (ppEnd[0] !='\0')){\
x = strto_##type(ttmp, &ppEnd);\
while(ttmp == ppEnd && ppEnd[0] !='\0'){\
ttmp++;\
x = strto_##type(ttmp, &ppEnd);\
}\
/*if(ppEnd[0]!='\0')*/ \
if(ppEnd != ttmp){\
if(!filled1){\
++i1;\
append_array_chainlist_##type(&l_a1, x);\
/*printf("++ x: %f, i1:%ld\n",x,i1);*/\
/*(*Tpart1)->x[i++] = x;*/\
if(i1 == ddim1->rank){\
filled1=true;\
i1=0;\
filled2=false;\
}\
}else{\
if(!filled2){\
++i2;\
/*(*Tpart2)->x[j++] = x;*/\
append_array_chainlist_##type(&l_a2, x);\
/*printf("++ x: %f, i2:%ld\n",x,i2);*/\
if(i2 == ddim2->rank){\
filled2 = true;\
i2=0;\
filled1 = false;\
}\
}\
\
}\
/*printf("d: %lf\n",d);*/\
}\
/*printf("-- x: %f\n",x);*/\
ttmp=ppEnd;\
}\
\
/*tens = create_tensor_from_list_array_##type(l_a,dim);*/\
*Tpart1 = create_tensor_from_list_array_##type(l_a1,ddim1);\
*Tpart2 = create_tensor_from_list_array_##type(l_a2,ddim2);\
free_array_chainlist_##type(l_a1);\
free_array_chainlist_##type(l_a2);\
free_dimension(ddim1);\
free_dimension(ddim2);\
}\
free_dimension(dim);\
free_list_perm_in_dim(l_p);\
}\
\
\
/*format_file: [*,dim1,dim2]((x,x,a)(x,a))... | example:[2,(2,3),4](((a0,b0,c0,)((a1,b1,c1))((a2,b2,c2,d2))((e0,f0,g0)(e1,f1,g1)(e2,f2,g2,h2))) == with pivot 1 => [2,2,3][2,4]*/\
void parse_file_InputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_##type **Tpart2, char *file_name_input, size_t pivotSplit){\
size_t block_size=4;\
size_t block_count=2;\
char *input=malloc(block_size*block_count + 1);\
FILE *f_input;\
f_input=fopen(file_name_input,"r");\
if ( f_input == NULL ) {\
fprintf( stderr, "Cannot open file: %s for reading\n",file_name_input );\
exit( -1 );\
}\
bool size_unknown=false, breaked=false; \
while((block_count == fread(input, block_size, block_count, f_input)) && !breaked){\
input[block_count * block_size]='\0';\
size_t len = strlen(input);\
for(size_t i=0; i<len ; ++i){\
if(input[i]==']') {breaked = true; break;}\
if((input[i]=='*') ||(input[i]=='_')){ \
breaked=true; size_unknown =true;\
break;}\
}\
}\
rewind(f_input);\
list_perm_in_dim *l_p=NULL;\
dimension *dim=NULL;\
size_t ss;\
char *ttmp;\
char *ppEnd="[";\
bool bracketsDown=false;\
size_t i1=0,i=0,j=0,i2=0;\
bool filled1=false,filled2=false;\
array_chainlist_##type *l_a1=NULL;\
array_chainlist_##type *l_a2=NULL;\
bool initDim=false;\
dimension *dim1 =NULL ;\
dimension *ddim1=NULL;\
dimension *ddim2=NULL;\
dimension *dim2=NULL ;\
bool Done=false;\
while(!Done){\
Done = (block_count != fread(input, block_size, block_count, f_input)); \
input[block_size * block_count] = '\0';\
ttmp=input;\
if( !bracketsDown){\
while(strlen(ttmp) && strlen(ppEnd) && (*ppEnd !=']') ){\
ss = strtoul(ttmp, &ppEnd, 10);\
while(ttmp == ppEnd && ppEnd[0] !=']'){\
ttmp++;\
ss = strtoul(ttmp, &ppEnd, 10);\
}\
if(ppEnd !=ttmp )\
append_in_list_perm(&l_p,ss);\
ttmp=ppEnd;\
}\
if(*ppEnd ==']'){\
dim=create_dim_from_list_perm(l_p);\
bracketsDown = true;\
ttmp++; ppEnd++;\
}\
\
}\
if(bracketsDown){\
\
if(size_unknown == false){\
\
if(!initDim){\
dim1 = create_dim(dim->size-pivotSplit);\
ddim1 = create_dim(dim->size-pivotSplit-1);\
ddim2 = create_dim(pivotSplit);\
dim2 = create_dim(pivotSplit+1);\
for(size_t i=0;i<dim1->size;++i) dim1->perm[i] = dim->perm[i];\
for(size_t i=0;i<ddim1->size;++i) ddim1->perm[i] = dim->perm[i+1];\
for(size_t i=0;i<ddim2->size;++i) ddim2->perm[i] = dim->perm[ dim->size - pivotSplit + i];\
dim2->perm[0] = dim->perm[0];\
for(size_t i=1;i<dim2->size;++i) dim2->perm[i] = ddim2->perm[i-1];\
updateRankDim(dim1);\
updateRankDim(ddim1);\
updateRankDim(ddim2);\
updateRankDim(dim2);\
*Tpart1 = CREATE_TENSOR_##type(dim1);\
*Tpart2 = CREATE_TENSOR_##type(dim2);\
initDim=true;\
}\
\
type x;\
while(strlen(ttmp) && j<dim2->rank){ \
x = strto_##type(ttmp, &ppEnd);\
while(ttmp == ppEnd && strlen(ttmp)){\
ttmp++;\
x = strto_##type(ttmp, &ppEnd);\
}\
if(ttmp != ppEnd){\
if(!filled1){\
++i1;\
(*Tpart1)->x[i++] = x;\
if(i1 == ddim1->rank){\
filled1=true;\
i1=0;\
filled2=false;\
}\
}else{\
if(!filled2){\
++i2;\
(*Tpart2)->x[j++] = x;\
if(i2 == ddim2->rank){\
filled2=true;\
i2=0;\
filled1=false;\
}\
}\
\
}\
}\
ttmp=ppEnd;\
}\
if(Done){\
free_dimension(ddim1);\
free_dimension(ddim2);\
}\
}\
else{\
\
if(!initDim){\
ddim1 = create_dim(dim->size-pivotSplit);\
ddim2 = create_dim(pivotSplit);\
for(size_t i=0;i<ddim1->size;++i) ddim1->perm[i] = dim->perm[i];\
for(size_t i=0;i<ddim2->size;++i) ddim2->perm[i] = dim->perm[dim->size - pivotSplit + i];\
updateRankDim(ddim1);\
updateRankDim(ddim2);\
initDim=true;\
}\
type x=0;\
while(ttmp && strlen(ttmp) ){ \
x = strto_##type(ttmp, &ppEnd);\
while(ttmp == ppEnd && strlen(ttmp)){\
ttmp++;\
x = strto_##type(ttmp, &ppEnd);\
}\
if(ppEnd != ttmp){\
if(!filled1){\
++i1;\
append_array_chainlist_##type(&l_a1, x);\
if(i1 == ddim1->rank){\
filled1=true;\
i1=0;\
filled2=false;\
}\
}else{\
if(!filled2){\
++i2;\
append_array_chainlist_##type(&l_a2, x);\
if(i2 == ddim2->rank){\
filled2 = true;\
i2=0;\
filled1 = false;\
}\
}\
\
}\
}\
ttmp=ppEnd;\
}\
\
if(Done){\
*Tpart1 = create_tensor_from_list_array_##type(l_a1,ddim1);\
*Tpart2 = create_tensor_from_list_array_##type(l_a2,ddim2);\
free_array_chainlist_##type(l_a1);\
free_array_chainlist_##type(l_a2);\
free_dimension(ddim1);\
free_dimension(ddim2);\
\
}\
}\
}\
}\
free_dimension(dim);\
free_list_perm_in_dim(l_p);\
free(input);\
fclose(f_input);\
}\
\
tensor_##type ** formInput_to_array_tensor_##type(tensor_##type *tens){\
tensor_##type **re_tens=malloc((tens->dim)->perm[0]*sizeof(tensor_##type *));\
dimension *dim=create_dim((tens->dim)->size - 1);\
for(size_t i=0; i<dim->size; ++i) dim->perm[i]=(tens->dim)->perm[i+1];\
updateRankDim(dim);\
for(size_t i=0; i < (tens->dim)->perm[0];++i){\
re_tens[i]=CREATE_TENSOR_FROM_CPY_DIM_##type(dim);\
for(size_t j=0; j<dim->rank; ++j) (re_tens[i])->x[j] = tens->x[i*(dim->rank) + j ] ;\
}\
free_dimension(dim);\
return re_tens;\
}\
\
void append_array_chainlist_##type(array_chainlist_##type **list_a, type x){\
array_chainlist_##type *lis=malloc(sizeof(array_chainlist_##type));\
lis->x=x;\
@@ -1104,7 +1461,43 @@ void free_array_chainlist_##type(array_chainlist_##type *l_a){\
}\
}\
\
tensor_##type * transpose_notOpt_tensor_##type(tensor_##type *org){\
size_t dimsz = (org->dim)->size; \
dimension *dim_tr=create_dim(dimsz);\
for(size_t i=0; i<dimsz; ++i) dim_tr->perm[i]=(org->dim)->perm[(dimsz-1)-i];\
updateRankDim(dim_tr);\
printDebug_dimension(dim_tr,"dim_tr");\
tensor_##type *tens_tr = CREATE_TENSOR_##type(dim_tr);\
size_t *coord = malloc((dimsz)*sizeof(size_t));\
size_t *coord_tr = malloc((dimsz)*sizeof(size_t));\
for(size_t i=0; i<dim_tr->rank; ++i){\
vCoordFromLin(coord,i,org->dim);\
for(size_t j=0; j<dimsz;++j) coord_tr[j]=coord[dimsz-1-j]; \
tens_tr->x[LineFromCoord(coord_tr, dim_tr)] = org->x[i];\
}\
free(coord);\
free(coord_tr);\
return tens_tr;\
}\
\
tensor_##type * permute_notOpt_tensor_##type(tensor_##type *org, dimension *dperm){\
size_t dimsz = (org->dim)->size; \
dimension *dim_tr=create_dim(dimsz);\
for(size_t i=0; i<dimsz; ++i) dim_tr->perm[i]=(org->dim)->perm[(dimsz-1)-i];\
updateRankDim(dim_tr);\
printDebug_dimension(dim_tr,"dim_tr");\
tensor_##type *tens_tr = CREATE_TENSOR_##type(dim_tr);\
size_t *coord = malloc((dimsz)*sizeof(size_t));\
size_t *coord_tr = malloc((dimsz)*sizeof(size_t));\
for(size_t i=0; i<dim_tr->rank; ++i){\
vCoordFromLin(coord,i,org->dim);\
for(size_t j=0; j<dimsz;++j) coord_tr[j]=coord[dperm->perm[j]]; \
tens_tr->x[LineFromCoord(coord_tr, dim_tr)] = org->x[i];\
}\
free(coord);\
free(coord_tr);\
return tens_tr;\
}\
GEN_FUNC_TENSOR(TYPE_FLOAT);
+6 -1
View File
@@ -29,6 +29,7 @@ tensor_##type * sub_copy_tensor_tail_##type(tensor_##type *rootens, size_t sub_c
void print_tensor_msg_##type(tensor_##type *T, char *msg);\
size_t sprint_tensor_##type(char **tensorContent,tensor_##type *T, bool withIndex);\
void split_tensor_##type(tensor_##type *Troot, tensor_##type **Tpart1, tensor_##type **Tpart2, size_t pivotSplit, size_t rangeInPivot);\
void split_copy_tensor_##type(tensor_##type *Troot, tensor_##type **Tpart1, tensor_##type **Tpart2, size_t pivotSplit, size_t rangeInPivot);\
void tensorProdNotOpt_##type(tensor_##type **MM, tensor_##type *M0, tensor_##type *M1); \
void tensorProd_##type(tensor_##type **MM, tensor_##type *M0, tensor_##type *M1); \
void tensorContractnProd_##type(tensor_##type **MM, tensor_##type *M0, tensor_##type *M1, size_t contractionNumber); \
@@ -39,6 +40,9 @@ void tensorContractnPro2dThread_##type(tensor_##type **MM, tensor_##type *M0, te
void tensorContractnProdNotOpt_##type(tensor_##type **MM, tensor_##type *M0, tensor_##type *M1, size_t contractionNumber); \
void init_random_x_##type(tensor_##type *M, type minR, type maxR, int randomRange);\
tensor_##type * parseInput_withDim_to_tensor_##type(char *input);\
void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_##type **Tpart2, char *input, size_t pivotSplit);\
void parse_file_InputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_##type **Tpart2, char *file_name_input, size_t pivotSplit);\
tensor_##type ** formInput_to_array_tensor_##type(tensor_##type *tens);\
struct array_chainlist_##type{\
size_t index;\
type x;\
@@ -48,7 +52,8 @@ typedef struct array_chainlist_##type array_chainlist_##type;\
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 * permute_notOpt_tensor_##type(tensor_##type *org, dimension *dperm);\
GENERATE_TENSOR_TYPE(TYPE_FLOAT);