debug : nan, it's the learning rate too high,s try to find optimum: 0.001
This commit is contained in:
+1
-1
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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_
|
||||
|
||||
Reference in New Issue
Block a user