debug : nan, it's the learning rate too high,s try to find optimum: 0.001

This commit is contained in:
2025-12-13 05:00:23 +01:00
parent 32207170f6
commit 3d54639d4c
18 changed files with 834 additions and 148 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ INCLUDE_TENS=$(TENSEDIR)/src
INCLUDE_PERMDIR=$(PERMDIR)/src
INCLUDE_DIMDIR=$(DIMDIR)/src
INCLUDE_TOOLDIR=$(TOOLDIR)/include
CFLAGS=-I$(INCLUDE_TOOLDIR) -I$(INCLUDE_PERMDIR) -I$(INCLUDE_DIMDIR) -I$(INCLUDE_TENS) -lpthread
CFLAGS=-I$(INCLUDE_TOOLDIR) -I$(INCLUDE_PERMDIR) -I$(INCLUDE_DIMDIR) -I$(INCLUDE_TENS) -lpthread
#SRC_DIR=$(ROOT_DIR)/src
#SRC=$(wildcard */*/*.c)
+65 -12
View File
@@ -23,6 +23,21 @@ void printArraySzt(size_t *a, size_t sz,char *msg){
printf("\n");
}
int checkContractProdTensorDim(dimension *d0, dimension *d1, ssize_t contractionNumber){
if((d0->size-contractionNumber <0)||(d1->size-contractionNumber <0)) return 0;
if(endian){
ssize_t beginCommonM0=d0->size-contractionNumber;
for(ssize_t i=0; i<contractionNumber; ++i){
if(d0->perm[beginCommonM0+i] != d1->perm[i]) return 0;
}
}else{
ssize_t beginCommonM1=d1->size-contractionNumber;
for(ssize_t i=0; i<contractionNumber; ++i){
if(d0->perm[i] != d1->perm[beginCommonM1+i]) return 0;
}
}
return 1;
}
/*
bool isLessEqThan(long int a, long int b) { return a <= b; }
bool isLessThan(long int a, long int b) { return a < b; }
@@ -399,11 +414,11 @@ void print_tensor_msg_##type(tensor_##type *T,char *msg) {\
printf(" |#%ld]: %s, ",i,val);\
/*printf(" %s, ",val);*/\
free(val); val=NULL;\
if(T->x[i] != T->x[i]){\
/*if(T->x[i] != T->x[i]){\
printf("\nALERT NAN\n");\
char c;\
scanf("%c",&c);\
}\
}*/\
if(coord[begin]==(T->dim)->perm[begin]-1){\
size_t count=0;\
for(long int j=begin; cond(j,end); j = iter(j)){\
@@ -456,7 +471,12 @@ void fprint_tensor_##type(char *file_name, tensor_##type *T) {\
else break;\
}\
}\
/*fprintf(fileWrite," [");\
if(T->x[i] != T->x[i]){\
printf("\nALERT NAN\n");\
;\
return;\
}\
/*fprintf(fileWrite," [");\
for(size_t k=0; k<(T->dim)->size;++k) fprintf(fileWrite," %ld,",coord[k]);\
*/val=type##_TO_STR(T->x[i]);\
fprintf(fileWrite," %s, ",val);\
@@ -540,6 +560,14 @@ size_t sprint_tensor_##type(char **tensorContent,tensor_##type *T, bool withInde
(*tensorContent)[cur++]=']';\
(*tensorContent)[cur++]=' ';\
}\
if(T->x[i] != T->x[i]){\
/*char *nanStr="ALERT NAN";\
for(size_t c=0;c<strlen(nanStr);++c)\
(*tensorContent)[cur++]=nanStr[c];*/\
printf(" ALERT NAN ");\
;\
/*return strlen(nanStr)*/;\
}\
val=type##_TO_STR(T->x[i]);\
/*printf(" {%ld} %s [",i,val);*/\
(*tensorContent)[cur++]=' ';\
@@ -639,6 +667,12 @@ void tensorContractnProd_##type(tensor_##type** MM, tensor_##type *M0, tensor_##
/* if (!checkMatchProdtensor(M0->dim, M1->dim, contractionNumber)) {\
prsize_tf("Deep = %d\n", contractionNumber);\
}*/\
if(checkContractProdTensorDim(M0->dim, M1->dim, contractionNumber)==0){\
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
}\
\
size_t len0 = M0->dim->size - contractionNumber;\
size_t len1 = M1->dim->size - contractionNumber;\
@@ -727,6 +761,7 @@ void* runProd_thread_##type(void *arg){\
return 0;\
}\
\
\
void tensorProdThread_##type(tensor_##type **MM, tensor_##type *M0, tensor_##type *M1, size_t nbthread) { \
dimension *dd; \
add_dimension(&dd, M0->dim, M1->dim); \
@@ -863,8 +898,14 @@ void* runProdContract_thread_##type(void *arg){\
M[x0,x1,x3..xl x{l+1}...xn] X M[xn,x{n-1},x{n-2}...xl y{l+1} ..ym] = M[x0,x1..xly{l+1}...y{n+m-2l}] (deep = l > 0)\
M[[i][j]]=sum_{[k]}M0[[i][k]]*M[[k][j]]*/\
\
void tensorContractnProdThread_##type(tensor_##type** MM, tensor_##type *M0, tensor_##type *M1, size_t contractionNumber, size_t nbthread) {\
\
void tensorContractnProdThread_##type(tensor_##type** MM, tensor_##type *M0, tensor_##type *M1, size_t contractionNumber, size_t nbthread) {\
if(checkContractProdTensorDim(M0->dim, M1->dim, contractionNumber)==0){\
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
}\
size_t len0 = M0->dim->size - contractionNumber;\
size_t len1 = M1->dim->size - contractionNumber;\
\
@@ -962,6 +1003,15 @@ void* runPro2dContract_thread_##type(void *arg){\
M[[i][j]]=sum_{[k]}M0[[i][k]]*M[[k][j]]*/\
\
void tensorContractnPro2dThread_##type(tensor_##type** MM, tensor_##type *M0, tensor_##type *M1, size_t contractionNumber, size_t nbthread) {\
/*if(checkContractProdTensorDim(M0->dim, M1->dim, contractionNumber)==0){\
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
}*/\
if(checkContractProdTensorDim(M0->dim, M1->dim, contractionNumber)==0){\
printf("checkContractProdTensorDim %ld contractionNumber\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
}\
\
size_t len0 = M0->dim->size - contractionNumber;\
size_t len1 = M1->dim->size - contractionNumber;\
@@ -1015,10 +1065,12 @@ void tensorContractnPro2dThread_##type(tensor_##type** MM, tensor_##type *M0, te
FREE_dM_S_ ; \
}\
void tensorContractnProdNotOpt_##type(tensor_##type** MM, tensor_##type *M0, tensor_##type *M1, size_t contractionNumber) {\
/* if (!checkMatchProdtensor(M0->dim, M1->dim, contractionNumber)) {\
prsize_tf("Deep = %d\n", contractionNumber);\
}*/\
\
if (!checkContractProdTensorDim(M0->dim, M1->dim, contractionNumber)) {\
printf("error Deep = %ld\n", contractionNumber);\
printDebug_dimension(M0->dim, "M0 dim");\
printDebug_dimension(M1->dim, "M1 dim");\
getchar();\
}\
size_t len0 = M0->dim->size - contractionNumber;\
size_t len1 = M1->dim->size - contractionNumber;\
\
@@ -1259,8 +1311,8 @@ void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_#
if(!filled1){\
++i1;\
(*Tpart1)->x[i++] = x;\
printf("++ x: %f, i1:%ld , rkn1: %ld\n",x,i1,ddim1->rank);\
if(i1 == ddim1->rank){\
/*printf("++ x: %f, i1:%ld , rkn1: %ld\n",x,i1,ddim1->rank);\
*/if(i1 == ddim1->rank){\
filled1=true;\
i1=0;\
filled2=false;\
@@ -1269,8 +1321,8 @@ void parseInputOutput_withDim_to_tensors_##type(tensor_##type **Tpart1, tensor_#
if(!filled2){\
++i2;\
(*Tpart2)->x[j++] = x;\
printf("-----++ x: %f, i2:%ld , rknr: %ld\n",x,i2,ddim2->rank);\
if(i2 == ddim2->rank){\
/*printf("-----++ x: %f, i2:%ld , rknr: %ld\n",x,i2,ddim2->rank);\
*/if(i2 == ddim2->rank){\
filled2=true;\
i2=0;\
filled1=false;\
@@ -1942,3 +1994,4 @@ void update_6tensor_func_##type(tensor_##type *M0, tensor_##type *M1, \
GEN_FUNC_TENSOR(TYPE_FLOAT);
GEN_FUNC_TENSOR(TYPE_DOUBLE);
GEN_FUNC_TENSOR(TYPE_L_DOUBLE);
+1
View File
@@ -83,6 +83,7 @@ void update_6tensor_func_##type(tensor_##type *M0, tensor_##type *M1, \
GENERATE_TENSOR_TYPE(TYPE_FLOAT);
GENERATE_TENSOR_TYPE(TYPE_DOUBLE);
GENERATE_TENSOR_TYPE(TYPE_L_DOUBLE);
#endif /* __TENSOR_T__H__ */
+459 -1
View File
@@ -510,6 +510,106 @@ TEST(SplitOne_randomInit){
}
#endif
TEST(tensorProdNoOpt){
dimension *d0=create_dim(3);
dimension *d1=create_dim(2);
#if VALGRIND_
d0->perm[0]=5;
d0->perm[1]=2; //3;
d0->perm[2]=3;
d1->perm[0]=2;
d1->perm[1]=3;//3;
#else
d0->perm[0]=5;
d0->perm[1]=7; //3;
d0->perm[2]=12;
d1->perm[0]=2;
d1->perm[1]=13;//3;
#endif
tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0);
tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1);
LOG("M0->dim->rank = %ld\n",M0->dim->rank);
LOG("M1->dim->rank = %ld\n",M1->dim->rank);
for(size_t i=0; i<M0->dim->rank;++i) M0->x[i]=i*0.1 +1;
for(size_t i=0; i<M1->dim->rank;++i) M1->x[i]=i*0.003 + 2;
print_tensor_float(M0,"M0");
print_tensor_float(M1,"M1");
tensor_TYPE_FLOAT *M=NULL;
tensor_TYPE_FLOAT *Mn=NULL;
tensorProdNotOpt_TYPE_FLOAT(&Mn,M0,M1);
float MMM0[d0->perm[0]][d0->perm[1]][d0->perm[2]];
long int coord3[3];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
coord3[0]=i0; coord3[1]=i1; coord3[2]=i2;
MMM0[i0][i1][i2]=M0->x[signedLineFromCoord(coord3, d0)];
//printf("M0[%ld][%ld][%ld] = %f \n",i0,i1,i2,MMM0[i0][i1][i2]);
}
}
}
float MMM1[d1->perm[0]][d1->perm[1]];
long int coord2[2];
for(long int j0=0;j0<d1->perm[0];++j0){
for(long int j1=0;j1<d1->perm[1];++j1){
coord2[0]=j0; coord2[1]=j1;
MMM1[j0][j1]=M1->x[signedLineFromCoord(coord2, d1)];
}
}
//tensorProd_TYPE_FLOAT(&M,M0,M1);
float MMMm[d0->perm[0]][d0->perm[1]][d0->perm[2]][d1->perm[0]][d1->perm[1]];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
for(long int j0=0;j0<d1->perm[0];++j0){
for(long int j1=0;j1<d1->perm[1];++j1){
MMMm[i0][i1][i2][j0][j1]=MMM0[i0][i1][i2] * MMM1[j0][j1];
//printf("MMMm[%ld][%ld][%ld][%ld][%ld] = %f \n",i0,i1,i2,j0,j1,MMMm[i0][i1][i2][j0][j1]);
}
}
}
}
}
//LOG("M->dim->rank = %ld\n",M->dim->rank);
//print_tensor_float(M,"M");
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank);
long int coord5[5];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
for(long int j0=0;j0<d1->perm[0];++j0){
for(long int j1=0;j1<d1->perm[1];++j1){
coord5[0]=i0; coord5[1]=i1;coord5[2]=i2;
coord5[3]=j0; coord5[4]=j1;
EXPECT_EQ_TYPE_FLOAT(MMMm[i0][i1][i2][j0][j1], Mn->x[signedLineFromCoord(coord5, Mn->dim)] );
}
}
}
}
}
print_tensor_float(Mn,"Mn");
free_tensor_TYPE_FLOAT(M0);
free_tensor_TYPE_FLOAT(M1);
//free_tensor_TYPE_FLOAT(M);
free_tensor_TYPE_FLOAT(Mn);
}
TEST(tensorProd ){
dimension *d0=create_dim(3);
dimension *d1=create_dim(2);
@@ -563,7 +663,365 @@ TEST(tensorProd ){
free_tensor_TYPE_FLOAT(Mn);
}
TEST(tensorContractnProd_TYPE_FLOAT ){
TEST(tensorContractnProd_TYPE_FLOATNoOpt ){
dimension *d0=create_dim(3);
dimension *d1=create_dim(3);
#if VALGRIND_
d0->perm[0]=5;
d0->perm[1]=2; //3;
d0->perm[2]=3;
d1->perm[0]=3;
d1->perm[1]=3;//3;
d1->perm[2]=8;
#else
d0->perm[0]=15;
d0->perm[1]=12; //3;
d0->perm[2]=13;
d1->perm[0]=13;
d1->perm[1]=15;//3;
d1->perm[2]=14;
#endif
updateRankDim(d0);
updateRankDim(d1);
tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0);
tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1);
LOG("M0->dim->rank = %ld\n",M0->dim->rank);
LOG("M1->dim->rank = %ld\n",M1->dim->rank);
for(size_t i=0; i<M0->dim->rank;++i) M0->x[i]=i*0.1 +1;
for(size_t i=0; i<M1->dim->rank;++i) M1->x[i]=i*0.003 + 2;
print_tensor_float(M0,"M0");
print_tensor_float(M1,"M1");
tensor_TYPE_FLOAT *M=NULL;
tensor_TYPE_FLOAT *MnO=NULL;
//tensorContractnProd_TYPE_FLOAT(&M, M0,M1,2);
tensorContractnProd_TYPE_FLOAT(&MnO, M0,M1,1);
//tensorContractnProdNotOpt_TYPE_FLOAT(&MnO, M0,M1,1);
printDebug_dimension(MnO->dim, "dim Contr 1");
float MMM0[d0->perm[0]][d0->perm[1]][d0->perm[2]];
long int coord3[3];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
coord3[0]=i0; coord3[1]=i1; coord3[2]=i2;
MMM0[i0][i1][i2]=M0->x[signedLineFromCoord(coord3, d0)];
//printf("M0[%ld][%ld][%ld] = %f \n",i0,i1,i2,MMM0[i0][i1][i2]);
}
}
}
float MMM1[d1->perm[0]][d1->perm[1]][d1->perm[2]];
long int coord23[3];
for(long int j0=0;j0<d1->perm[0];++j0){
for(long int j1=0;j1<d1->perm[1];++j1){
for(long int j2=0;j2<d1->perm[2];++j2){
coord23[0]=j0; coord23[1]=j1; coord23[2]=j2;
MMM1[j0][j1][j2]=M1->x[signedLineFromCoord(coord23, d1)];
}
}
}
//tensorProd_TYPE_FLOAT(&M,M0,M1);
float MMMm[d0->perm[0]][d0->perm[1]][d1->perm[1]][d1->perm[2]];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int j1=0;j1<d1->perm[1];++j1){
for(long int j2=0;j2<d1->perm[2];++j2){
MMMm[i0][i1][j1][j2]=0;
for(long int i2=0;i2<d0->perm[2];++i2){
MMMm[i0][i1][j1][j2] += MMM0[i0][i1][i2] * MMM1[i2][j1][j2];
//printf("MMMm[%ld][%ld][%ld][%ld][%ld] = %f \n",i0,i1,i2,j0,j1,MMMm[i0][i1][i2][j0][j1]);
}
}
}
}
}
//LOG("M->dim->rank = %ld\n",M->dim->rank);
//print_tensor_float(M,"M");
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank);
long int coord4[4];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int j1=0;j1<d1->perm[1];++j1){
for(long int j2=0;j2<d1->perm[2];++j2){
coord4[0]=i0; coord4[1]=i1; coord4[2]=j1; coord4[3]=j2;
//EXPECT_EQ_TYPE_FLOAT(MMMm[i0][i1][j1][j2], MnO->x[signedLineFromCoord(coord4, MnO->dim)] );
if(expected_EQ_TYPE_FLOAT(MMMm[i0][i1][j1][j2], MnO->x[signedLineFromCoord(coord4, MnO->dim)] ) == false){
LOG("[ %ld, %ld, %ld, %ld ] [%ld]\n",i0,i1,j1,j2,
signedLineFromCoord(coord4, MnO->dim)
);
}
}
}
}
}
//print_tensor_float(M,"M");
print_tensor_float(MnO,"MnO");
// for(size_t i=0;i<M->dim->rank;++i)
// EXPECT_EQ_TYPE_FLOAT(M->x[i],MnO->x[i]);
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,MnO->x,MnO->dim->rank);
//free_tensor_TYPE_FLOAT(M);
free_tensor_TYPE_FLOAT(MnO);
free_tensor_TYPE_FLOAT(M0);
free_tensor_TYPE_FLOAT(M1);
}
TEST(tensorContractnProd_TYPE_FLOATNoOpt2 ){
endian=true; //
dimension *d0=create_dim(3);
dimension *d1=create_dim(3);
#if VALGRIND_
d0->perm[0]=5;
d0->perm[1]=2; //3;
d0->perm[2]=3;
d1->perm[0]=2;
d1->perm[1]=3;//3;
d1->perm[2]=8;
#else
d0->perm[0]=35;
d0->perm[1]=32; //3;
d0->perm[2]=23;
d1->perm[0]=32;
d1->perm[1]=23;//3;
d1->perm[2]=44;
#endif
updateRankDim(d0);
updateRankDim(d1);
tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0);
tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1);
LOG("M0->dim->rank = %ld\n",M0->dim->rank);
LOG("M1->dim->rank = %ld\n",M1->dim->rank);
for(size_t i=0; i<M0->dim->rank;++i) M0->x[i]=i*0.1 +1;
for(size_t i=0; i<M1->dim->rank;++i) M1->x[i]=i*0.003 + 2;
print_tensor_float(M0,"M0");
print_tensor_float(M1,"M1");
tensor_TYPE_FLOAT *M=NULL;
tensor_TYPE_FLOAT *MnO=NULL;
//tensorContractnProd_TYPE_FLOAT(&M, M0,M1,2);
tensorContractnProdNotOpt_TYPE_FLOAT(&MnO, M0,M1,2);
float MMM0[d0->perm[0]][d0->perm[1]][d0->perm[2]];
long int coord3[3];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
coord3[0]=i0; coord3[1]=i1; coord3[2]=i2;
MMM0[i0][i1][i2]=M0->x[signedLineFromCoord(coord3, d0)];
//printf("M0[%ld][%ld][%ld] = %f \n",i0,i1,i2,MMM0[i0][i1][i2]);
}
}
}
float MMM1[d1->perm[0]][d1->perm[1]][d1->perm[2]];
long int coord23[3];
for(long int j0=0;j0<d1->perm[0];++j0){
for(long int j1=0;j1<d1->perm[1];++j1){
for(long int j2=0;j2<d1->perm[2];++j2){
coord23[0]=j0; coord23[1]=j1; coord23[2]=j2;
MMM1[j0][j1][j2]=M1->x[signedLineFromCoord(coord23, d1)];
}
}
}
//tensorProd_TYPE_FLOAT(&M,M0,M1);
float MMMm[d0->perm[0]][d1->perm[2]];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int j2=0;j2<d1->perm[2];++j2){
MMMm[i0][j2]=0;
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
MMMm[i0][j2] += MMM0[i0][i1][i2] * MMM1[i1][i2][j2];
//printf("MMMm[%ld][%ld][%ld][%ld][%ld] = %f \n",i0,i1,i2,j0,j1,MMMm[i0][i1][i2][j0][j1]);
}
}
}
}
//LOG("M->dim->rank = %ld\n",M->dim->rank);
//print_tensor_float(M,"M");
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank);
long int coord52[2];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int j2=0;j2<d1->perm[2];++j2){
coord52[0]=i0; coord52[1]=j2;
EXPECT_EQ_TYPE_FLOAT(MMMm[i0][j2], MnO->x[signedLineFromCoord(coord52, MnO->dim)] );
if(expected_EQ_TYPE_FLOAT(MMMm[i0][j2], MnO->x[signedLineFromCoord(coord52, MnO->dim)] ) == false){
LOG("[ %ld, %ld] [%ld]\n",i0,j2,
signedLineFromCoord(coord52, MnO->dim)
);
}
}
}
//print_tensor_float(M,"M");
print_tensor_float(MnO,"MnO");
// for(size_t i=0;i<M->dim->rank;++i)
// EXPECT_EQ_TYPE_FLOAT(M->x[i],MnO->x[i]);
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,MnO->x,MnO->dim->rank);
//free_tensor_TYPE_FLOAT(M);
free_tensor_TYPE_FLOAT(MnO);
free_tensor_TYPE_FLOAT(M0);
free_tensor_TYPE_FLOAT(M1);
}
TEST(tensorContractnProd_TYPE_FLOATNoOpt3endianFalse ){
endian=false;
dimension *d0=create_dim(3);
dimension *d1=create_dim(3);
#if VALGRIND_
d0->perm[0]=5;
d0->perm[1]=2; //3;
d0->perm[2]=3;
d1->perm[0]=4;
d1->perm[1]=2;//3;
d1->perm[2]=5;
#else
d0->perm[0]=13;
d0->perm[1]=12; //3;
d0->perm[2]=35;
d1->perm[0]=32;
d1->perm[1]=12;//3;
d1->perm[2]=13;
#endif
updateRankDim(d0);
updateRankDim(d1);
tensor_TYPE_FLOAT *M0 = CREATE_TENSOR_TYPE_FLOAT(d0);
tensor_TYPE_FLOAT *M1 = CREATE_TENSOR_TYPE_FLOAT(d1);
LOG("M0->dim->rank = %ld\n",M0->dim->rank);
LOG("M1->dim->rank = %ld\n",M1->dim->rank);
for(size_t i=0; i<M0->dim->rank;++i) M0->x[i]=i*0.1 +1;
for(size_t i=0; i<M1->dim->rank;++i) M1->x[i]=i*0.003 + 2;
print_tensor_float(M0,"M0");
print_tensor_float(M1,"M1");
tensor_TYPE_FLOAT *M=NULL;
tensor_TYPE_FLOAT *MnO=NULL;
//tensorContractnProd_TYPE_FLOAT(&M, M0,M1,2);
tensorContractnProdNotOpt_TYPE_FLOAT(&MnO, M0,M1,2);
float MMM0[d0->perm[0]][d0->perm[1]][d0->perm[2]];
long int coord3[3];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
coord3[0]=i0; coord3[1]=i1; coord3[2]=i2;
MMM0[i0][i1][i2]=M0->x[signedLineFromCoord(coord3, d0)];
//printf("M0[%ld][%ld][%ld] = %f \n",i0,i1,i2,MMM0[i0][i1][i2]);
}
}
}
float MMM1[d1->perm[0]][d1->perm[1]][d1->perm[2]];
long int coord23[3];
for(long int j0=0;j0<d1->perm[0];++j0){
for(long int j1=0;j1<d1->perm[1];++j1){
for(long int j2=0;j2<d1->perm[2];++j2){
coord23[0]=j0; coord23[1]=j1; coord23[2]=j2;
MMM1[j0][j1][j2]=M1->x[signedLineFromCoord(coord23, d1)];
}
}
}
//tensorProd_TYPE_FLOAT(&M,M0,M1);
float MMMm[d0->perm[0]][d1->perm[2]];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int j2=0;j2<d1->perm[2];++j2){
MMMm[i0][j2]=0;
for(long int i1=0;i1<d0->perm[1];++i1){
for(long int i2=0;i2<d0->perm[2];++i2){
MMMm[i0][j2] += MMM0[i0][i1][i2] * MMM1[i1][i2][j2];
//printf("MMMm[%ld][%ld][%ld][%ld][%ld] = %f \n",i0,i1,i2,j0,j1,MMMm[i0][i1][i2][j0][j1]);
}
}
}
}
//LOG("M->dim->rank = %ld\n",M->dim->rank);
//print_tensor_float(M,"M");
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,Mn->x,Mn->dim->rank);
long int coord52[2];
for(long int i0=0;i0<d0->perm[0];++i0){
for(long int j2=0;j2<d1->perm[2];++j2){
coord52[0]=i0; coord52[1]=j2;
EXPECT_EQ_TYPE_FLOAT(MMMm[i0][j2], MnO->x[signedLineFromCoord(coord52, MnO->dim)] );
if(expected_EQ_TYPE_FLOAT(MMMm[i0][j2], MnO->x[signedLineFromCoord(coord52, MnO->dim)] ) == false){
LOG("[ %ld, %ld] [%ld]\n",i0,j2,
signedLineFromCoord(coord52, MnO->dim)
);
}
}
}
//print_tensor_float(M,"M");
print_tensor_float(MnO,"MnO");
// for(size_t i=0;i<M->dim->rank;++i)
// EXPECT_EQ_TYPE_FLOAT(M->x[i],MnO->x[i]);
//EXPECT_ARRAY_EQ_TYPE_FLOAT(M->x,M->dim->rank,MnO->x,MnO->dim->rank);
//free_tensor_TYPE_FLOAT(M);
free_tensor_TYPE_FLOAT(MnO);
free_tensor_TYPE_FLOAT(M0);
free_tensor_TYPE_FLOAT(M1);
}
TEST(tensorContractnProd_TYPE_FLOAT ){
dimension *d0=create_dim(3);
dimension *d1=create_dim(3);
#if VALGRIND_