add some tests in permutation dir

This commit is contained in:
2023-11-24 09:54:41 +01:00
parent 79890b7017
commit 8f5a85bd4d
14 changed files with 1608 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
NAME_TEST=is_good
CC=gcc
ROOT_DIR=$(PWD)
YTESTDIR=$(PWD)/../../ytest_t
INCLUDE_DIR=$(PWD)/../src
CFLAGS=-I$(INCLUDE_DIR) -I$(YTESTDIR)/include_ytest/include
LDFLAGS=-L$(YTESTDIR) -lytest
#SRC_DIR=$(ROOT_DIR)/src
#SRC=$(wildcard */*/*.c)
SRC=$(wildcard **/**/*.c)
#HEADS=$(OBJS:.o=.h)
TEST_DIR=$(PWD)
EXECSRC=$(NAME_TEST).c
EXEC=launch_$(NAME_TEST)_m
PERMDIR=$(PWD)/..
PERMSRC_O=$(PERMDIR)/src/permutation_t/permutation_t.o
TOPTARGETS := all clean
DEPS=$(PERMDIR) $(YTESTDIR)
$(TOPTARGETS): $(DEPS)
$(DEPS):
$(MAKE) -C $@ $(MAKECMDGOALS)
#PERMSRC_O=$(PERMSRC:.c=.o)
#SETTSRC_O=$(PWD)/../src/set_theoric_t/set_theoric_t.o
#SETTSRC_O=$(SETTSRC:.c=.o)
#TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c
#TOOLSRC_O=$(TOOLSRC:.c=.o)
OBJ=$(SRC:.c=.o) $(PERMSRC_O)
LIB_YTEST=$(YTESTDIR)/libytest.so
all: $(EXEC) $(LIB_YTEST)
$(EXEC): $(EXECSRC) $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
.PHONY: clean mrproper
clean:
rm -f $(OBJ)
mrproper: clean
rm -f $(EXEC)
run: $(EXEC)
$(EXEC) -h
+23
View File
@@ -0,0 +1,23 @@
#!/bin/bash
if [ "$#" -le 0 ] ; then
echo "Usage: $0 is_good.c" >&2
echo "for example to compile: is_good.c" >&2
exit 1
fi
if [ "$#" -le 1 ] ; then
echo "Usage: $0 $1" >&2
echo " we can add more option for example '-D DEBUG=1' to have debug print, '-D HK' to have gtest like prompt, od '-g' to gbd" >&2
echo "for example: $0 $1 \"-D DEBUG=1 -D HK -g\""
fi
DIR_YTEST=$PWD/../../ytest_t
SRC=../src
gcc -o launch_is_good_c $1 -L$DIR_YTEST $2 -lytest -I$DIR_YTEST/include_ytest/include $SRC/permutation_t/permutation_t.c $SRC/set_theoric_t/set_theoric_t.c -I$SRC
#gcc -o launch_is_good_c $1 $2 -lytest -I../include_ytest src/permutation_t/permutation_t.o src/set_theoric_t/set_theoric_t.o -I./src
export LD_LIBRARY_PATH=$DIR_YTEST/:LD_LIBRARY_PATH
#gcc $1 src/ftest/ftest.c src/fmock/fmock.c src/tools_t/tools_t.c src/bar_progress/bar_progress.c src/permutation_t/permutation_t.c src/set_theoric_t/set_theoric_t.c -I./include $2 -o launch_is_good_c -lpthread
+426
View File
@@ -0,0 +1,426 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// for sleep !
#ifdef __linux__
#include <unistd.h>
#elif _WIN32
#include <windows.h>
#endif
#include "ftest/ftest.h"
#include "fmock/fmock.h"
#include "permutation_t/permutation_t.h"
TEST(size_permutation)
{
PERMUTATION_TYPE_CHAR *p = CREATE_PERMUTATION_TYPE_CHAR(3);
PRINTF(" size = %lu \n",p->size);
EXPECT_EQ(p->size, 3);
PRINTF("test size_permutation2\n");
}
TEST(permutation_t_float_trans)
{
int n =8;
PERMUTATION_TYPE_FLOAT *p = CREATE_PERMUTATION_TYPE_FLOAT(n);
PRINTF(" size = %lu \n",p->size);
EXPECT_EQ(p->size, n);
p->perm[0]=0.001;
p->perm[1]=0.01;
p->perm[2]=0.00101;
p->perm[3]=0.02;
p->perm[4]=0.1;
p->perm[5]=0.1;
PERMUTATION_TYPE_SIZE_T *translate_p = TRANSLATE_TO_SET_THEORIC_SIZE_T_TYPE_FLOAT(p);
for(int i = 0; i < translate_p->size; ++i) PRINTF(" ([%d] %ld) ,",i,translate_p->perm[i]);
PRINTF("\n");
for(int i = 0; i < p->size; ++i) PRINTF(" (%d: %f) ,",i,p->perm[i]);
PRINTF("\n");
// sleep(n);
}
TEST(not_permutation_)
{
int n =8;
PERMUTATION_TYPE_FLOAT *p = CREATE_PERMUTATION_TYPE_FLOAT(n);
PRINTF(" size = %lu \n",p->size);
EXPECT_EQ(p->size, n);
p->perm[0]=0.001;
p->perm[1]=0.01;
p->perm[2]=0.00101;
p->perm[3]=0.02;
p->perm[4]=0.1;
p->perm[5]=0.1;
EXPECT_FALSE(IS_PERMUTATION_TYPE_FLOAT(p));
// sleep(n);
}
TEST(is_permutation_)
{
int n =6;
PERMUTATION_TYPE_FLOAT *p = CREATE_PERMUTATION_TYPE_FLOAT(n);
PRINTF(" size = %lu \n",p->size);
EXPECT_EQ(p->size, n);
p->perm[0]=0.001;
p->perm[1]=0.01;
p->perm[2]=0.1101;
p->perm[3]=0.02;
p->perm[4]=0.2;
p->perm[5]=0.1;
EXPECT_TRUE(IS_PERMUTATION_TYPE_FLOAT(p));
// sleep(n);
}
TEST(float_equal){
PRINTF("another size_permutation2 float\n");
ASSERT_TRUE(true);
float a = 1.00001f;
float b = 1.00001001f;
ASSERT_EQ_TYPE_FLOAT(a,b);
b=1.0000010001f;
ASSERT_EQ_TYPE_FLOAT(1.000001000,b);
}
TEST(double_equal){
PRINTF("another size_permutation2 double\n");
ASSERT_TRUE(true);
double a = 1.00000001;
double b = 1.00000001;
ASSERT_EQ_TYPE_DOUBLE(a,b);
b=1.00000001000000001;
ASSERT_EQ_TYPE_DOUBLE(a,b);
ASSERT_EQ_TYPE_DOUBLE(1.0000000100000002,b);
}
TEST(){
int a = 5;
long b = 5;
ASSERT_EQ(a,b);
}
TEST(expect){
// SKIP();
SKIP("%s\n","on skip eq string");
EXPECT_EQ_TYPE_STRING("hello","hello");
float f1 = 1.00019999, f2=1.00019999;
EXPECT_EQ_TYPE_FLOAT(f1,f2);
}
TEST(){
PERMUTATION_TYPE_CHAR *p_char = CREATE_PERMUTATION_TYPE_CHAR(6);
p_char->perm[0]='B';
p_char->perm[1]='A';
p_char->perm[2]='Y';
p_char->perm[3]='C';
p_char->perm[4]='D';
p_char->perm[5]='Z';
PERMUTATION_TYPE_SIZE_T *tr_p_char = TRANSLATE_TO_SET_THEORIC_SIZE_T_TYPE_CHAR(p_char);
for(int i = 0; i < tr_p_char->size; ++i) PRINTF(" [%d ]%ld ,",i,tr_p_char->perm[i]);
PRINTF("p_char == %s\n",p_char->perm);
}
TEST(){
PERMUTATION_TYPE_CHAR *p_char = CREATE_PERMUTATION_TYPE_CHAR(6);
p_char->perm[0]='B';
p_char->perm[1]='A';
p_char->perm[2]='Y';
p_char->perm[3]='C';
p_char->perm[4]='D';
p_char->perm[5]='Z';
PRINTF("init :%s \n",p_char->perm);
PERMUTATION_TYPE_SIZE_T *tab_45 = TRANSLATE_TO_SET_THEORIC_SIZE_T_TYPE_CHAR(p_char);
for(size_t i=0; i<p_char->size; ++i) PRINTF(" %ld: %ld \n",i, tab_45->perm[i]);
size_t pl = TabToPlaceAlgo_TYPE_CHAR(p_char);
//size_t pl = TabToPlaceOpt1_TYPE_CHAR(p_char);
PRINTF("sa place est :%ld \n", pl);
tab_45 = PlaceToTab_TYPE_CHAR(p_char, pl+1);
for(size_t i=0; i<p_char->size; ++i) PRINTF(" %ld: %ld \n",i, tab_45->perm[i]);
/* tab_45 = PlaceToTab_TYPE_CHAR(p_char,45);
PRINTF("ret :%s \n",p_char->perm);
for(size_t i=0; i<sz; ++i) PRINTF(" %ld: %ld \n",i, tab_45->perm[i]);
*/
}
#if 0
TEST(lessThan){
long int a=1,b=2;
EXPECT_LT(a,b);
EXPECT_LT(b,a);
}
#if 0
TEST(sleep){sleep(2);}
TEST(sleep){sleep(2);}
TEST(sleep){sleep(2);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
TEST(sleep){sleep(1);}
#endif
MOCK_FUNC(int, f_mock, (), ())
EXPECT_MOCK_CALL(int,f_mock, (),false, 2) {
EXPECT_EQ_IN_MOCKF(21,21,f_mock);
EXPECT_EQ(1,3);
EXPECT_EQ(4,4);
EXPECT_EQ_IN_MOCKF(23,24,f_mock); return 12;}
EXPECT_MOCK_CALL(int,f_mock, (),1, 1) { EXPECT_EQ_IN_MOCKF(23,21,f_mock);return 10;}
EXPECT_MOCK_CALL(int,f_mock, (),1==2||2<1, 1) {return 18;}
EXPECT_MOCK_CALL(int,f_mock, (),1, INFINITY) {return -18;}
TEST(mockf1){
INIT_CALLER_MOCK(f_mock);
for(int i = 0; i<8; ++i){
LOG("call f_mock:%d: ret:%d\n",i,f_mock());
// int val=f_mock();
//PRINTF("call f_mock:%d: ret:%d\n",i,val);
}
}
MOCK_FUNC(int, f2_mock,(int a,int b),(a,b))
STR_PRINT_CUR_VAR(f2_mock, (int a,int b),(a,b)){
char *ret=malloc(150);
//char ret[150];
sprintf(ret,"(int)a: %d, (int)b: %d",a,b);
return ret;
}
EXPECT_MOCK_CALL(int, f2_mock, (int a,int b), (a<b), 3){
return a+b;
}
EXPECT_MOCK_CALL(int, f2_mock, (int a,int b), ((a<b)&&(b<100)), 1){
return a*b;
}
WILL_MOCK_CALL(int, f2_mock, (int a,int b), (a!=b), 6){
return a/b;
}
EXPECT_MOCK_CALL(int, f2_mock, (int a,int b), (a==b), 1){
return a/b;
}
MOCK_FUNC(int, f3_mock,(int a,int b),(a,b))
EXPECT_MOCK_CALL(int, f3_mock, (int a,int b), (a<b), 2){
return a+b;
}
EXPECT_MOCK_CALL(int, f2_mock, (int a,int b), ((a<b)&&(b<100)), 1){
return a*b;
}
WILL_MOCK_CALL(int, f2_mock, (int a,int b), (a!=b), 6){
return a/b;
}
EXPECT_MOCK_CALL(int, f2_mock, (int a,int b), (a==b), 1){
return a/b;
}
EXPECT_MOCK_CALL(int, f2_mock, (int a,int b), (1), INFINITY){
return a*b;
}
TEST(f2mock_test){
INIT_CALLER_MOCK(f2_mock);
//LOG("--------------------------- > call f2_mock:%d: %d\n",0,f2_mock(1,4));
for(int i=0; i<8; ++i){
if(i<2) {
//int val = f2_mock(i,4);
//LOG("call f2_mock:%d: %d\n",i,val);
LOG("call f2_mock:%d: %d\n",i,f2_mock(i,4));
}
else if(i<4) LOG("call:%d: %d\n",i,f2_mock(i,3));
else LOG("call:%d:%d\n",i,f2_mock(i,i*i));
}
}
TEST(f3_mock_test){
INIT_CALLER_MOCK(f3_mock);
for(int i=0; i<7; ++i){
if(i<1) {
LOG("call f3_mock:%d: %d\n",i,f3_mock(1,i));
}
else LOG("call:%d:%d\n",i,f3_mock(i,i*i));
}
for(int i=COLOR_SZ-1; i>=0; --i)
LOG("%s colors_fld\n",colors_f[i]);
}
MOCK_FUNC(int, f4_mock,(int a,int b),(a,b))
STR_PRINT_CUR_VAR(f4_mock, (int a,int b),(a,b)){
char *ret=malloc(150);
//char ret[150];
sprintf(ret,"(int)a: %d, (int)b: %d",a,b);
return ret;
}
TEST(f4_mock_test){
//EXPECT_EQ(1,f4_mock(1,1));
PRINTF("f4 no excepted create ret: %d\n",f4_mock(1,1));
PRINTF("second call f4 : %d\n",f4_mock(2,0));
}
MOCK_FUNC(int, f5_mock,(int a,int b, int c),(a,b,c))
TEST(f5__mock){
LOG("f5 ???:%d\n",f5_mock(1,2,3));
LOG("f5 !!!:%d\n",f5_mock(2,5,3));
}
MOCK_FUNC(int, f6_mock,(int a,int b, int c),(a,b,c))
STR_PRINT_CUR_VAR(f6_mock,(int a,int b, int c),(a,b,c)){
char *ret=malloc(150);
sprintf(ret,"(%d,%d,%d)",a,b,c);
return ret;
}
EXPECT_MOCK_CALL(int, f6_mock,(int a, int b, int c),((a<b)&&(b<c)),1){
return a+b+c;
}
TEST(f6__mock){
LOG("f6 6?:%d\n",f6_mock(1,2,3));
LOG("f6 0?:%d\n",f6_mock(2,5,4));
}
MOCK_FUNC(int, f7_mock,(int a,int b),(a,b))
STR_PRINT_CUR_VAR(f7_mock, (int a,int b),(a,b)){
char *ret=malloc(150);
//char ret[150];
sprintf(ret,"(int)a: %d, (int)b: %d",a,b);
return ret;
}
EXPECT_MOCK_CALL(int, f7_mock,(int a, int b),(a>b),2){
return a*b;
}
TEST(f7_mock_test){
int v0=f7_mock(1,1);
PRINTF("f7 ret: %d\n",v0);
int v1=f7_mock(2,0);
PRINTF("second call f7 : %d\n",v1);
}
#endif
int main(int argc, char **argv){
//run_all_tests();
//run_all_tests_parallel(4);
run_all_tests_args(argc, argv);
//purge_tests();
//run_some_tests(8, 1, 2, 2, 3, 3, 0, 4, 1);
//run_some_tests(8, 5, 7, 1, 1, 1, 1, 1, 1);
//run_some_tests_one_by_one(3, 1, 2, 2);
//run_all_tests_exept(2, 1, 3);
return 0;
}
+652
View File
@@ -0,0 +1,652 @@
#include <gtest/gtest.h>
#include <stdlib.h>
//#include "/home/fanasina/progr_/ptens0neD/src/tensor/tens0neD/tens0neD.h"
#include "src/tensor/tens0neD/tens0neD.h"
//#include "cudatensor.h"
//#include "/home/fanasina/progr_/ptens0neD/src/tensor/tensCuda/tensCuda.h"
#include "src/tensor/tensCuda/tensCuda.h"
/*TEST(LineraCoodTransform, check_print) {
int t3[] = { [0] = 2,[1] = 4,[2] = 3 };
struct dimension D0(3, t3);
int coor0[3] = { 1,3,2 };
int* coor1 = new int[3];
int l0 = D0.CoordToLinear(coor0);
D0.print();
D0.LinearToCoord(coor1, l0);
for (int i = 0; i < D0.rank; i++) {
EXPECT_EQ(coor0[i], coor1[i]) << " coor0: " << coor0[i] << " coor1: " << coor1[i] << " i: " << i;
}
}*/
TEST(subArray, concatArray) {
int t[] = { 1,5,6,2,3 };
int t0[] = { 1,5,6 };
int t1[] = { 2,3 };
int n = 5;
int s0[3];
int s1[2];
int s[n];
subArray(s0, t, 0, 3, 0);
subArray(s1, t, 0, 2, 3);
ASSERT_EQ(0, memcmp(t0, s0, sizeof(int) * 3));
ASSERT_EQ(0, memcmp(t1, s1, sizeof(int) * 2));
concatArray(s, s0, s1, 0, 0, 3, 0, 2);
ASSERT_EQ(0, memcmp(t, s, sizeof(int) * 5));
}
TEST(tensorProdpetit, floatTemp) {
/*int t3[] = { 2, 4, 3 };
int t4[] = { 2, 4, 3, 2 };*/
int t3[] = { 3, 6, 5 };
int t4[] = { 3, 5, 8, 4 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<float> M3(d3), M4(d4), M;
M3.initVal(3.0f); // M3.print();
M4.initVal(2.0f); // M4.print();
tensorProd<float>(M, M3, M4);
//tensorProd(M, M4, M3);
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int lin3, lin4, lin;
d = M.Dim;
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < d3.rank; i++) coord3[i] = idx3[i];
for (int i = 0; i < d4.rank; i++) coord4[i] = idx4[i];
concatArray(coord, coord3, coord4, 0, 0, d3.rank, 0, d4.rank);
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
lin = d.CoordToLinear(coord);
//ASSERT_FLOAT_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
ASSERT_FLOAT_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
//ASSERT_NEAR(M.elements[lin], M3.elements[lin3] * M4.elements[lin4], 0.0001) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
}
}
TEST(tensorProd, doubleTemp) {
int t3[] = { 2, 4, 3 };
int t4[] = { 4, 3, 2,3 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<double> M3(d3), M4(d4), M;
M3.initVal(3.0f); // M3.print();
M4.initVal(2.0f); // M4.print();
tensorProd(M, M3, M4);
//tensorProd(M, M4, M3);
d = M.Dim;
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int lin3, lin4, lin;
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < d3.rank; i++) coord3[i] = idx3[i];
for (int i = 0; i < d4.rank; i++) coord4[i] = idx4[i];
concatArray(coord, coord3, coord4, 0, 0, d3.rank, 0, d4.rank);
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
lin = d.CoordToLinear(coord);
//ASSERT_FLOAT_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]);
ASSERT_DOUBLE_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]);
//ASSERT_NEAR(M.elements[lin], M3.elements[lin3] * M4.elements[lin4], 0.001) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
}
}
void printArray(int* t, int sz) {
for (int i = 0; i < sz;i++) printf(" %d ", t[i]);
}
TEST(tensorContractnProd, floatTemp) {
int t3[] = { 2, 4, 3 };
int t4[] = { 4, 3, 2, 3 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<float> M3(d3), M4(d4), M;
M3.initVal(3.0f); // M3.print();
M4.initVal(2.0f); // M4.print();
int dee = 2;
try {
//tensorContractnProd(M, M3, M4, dee);
tensorContractnProd(M, M3, M4, dee);
}
catch (const std::invalid_argument& e) {
printf("bye from test tensorContractnProd floatTemp invalid arg! deep:\n");
dimension dM;
extractDimNestingDepth(dM, d3, d4, dee);
dM.print();
ASSERT_TRUE(false);
}
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int l0, l1;
l0 = M3.Dim.rank - dee;
l1 = M4.Dim.rank - dee;
int pcoord3[l0];
int pcoord4[l1];
int r[dee];
int lin3, lin4, lin;
d = M.Dim;
d.print();
Tensor<float> Msum(d);
//for (size_t idx = 0; idx < d.size; idx++) Msum.elements[idx] = 0.0f;
//Msum.print();
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < l0; i++) pcoord3[i] = idx3[i];
for (int i = 0; i < l1; i++) pcoord4[i] = idx4[i + dee];
concatArray(coord, pcoord3, pcoord4, 0, 0, l0, 0, l1);
lin = d.CoordToLinear(coord);
Msum.elements[lin] = 0.0f;
//for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
//for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
{
for (int i = 0; i < dee; i++) r[i] = idx4[i];
concatArray(coord3, pcoord3, r, 0, 0, l0, 0, dee);
concatArray(coord4, r, pcoord4, 0, 0, dee, 0, l1);
//printf("[");printArray(coord3, M3.Dim.rank); printf("]["); printArray(coord4, M4.Dim.rank);printf("] =*= ("); printArray(coord, Msum.Dim.rank); printf(") |||");
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
Msum.elements[lin] += (M3.elements[lin3] * M4.elements[lin4]);
//printf("lin:%d lin3:%d lin4:%d el+:%f\n", lin, lin3, lin4, Msum.elements[lin]);
}
ASSERT_FLOAT_EQ(Msum.elements[lin], M.elements[lin]);
}
}
TEST(tensorContractnProdD, doubleTemp) {
int t3[] = { 2, 3, 4 };
int t4[] = { 3, 4, 2, 3 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<double> M3(d3), M4(d4), M;
M3.initVal(3.0f); // M3.print();
M4.initVal(2.0f); // M4.print();
int dee = 2;
try {
//tensorContractnProd(M, M3, M4, dee);
tensorContractnProd(M, M3, M4, dee);
}
catch (const std::invalid_argument& e) {
printf("bye from test tensorContractnProd floatTemp invalid arg! deep:\n");
dimension dM;
extractDimNestingDepth(dM, d3, d4, dee);
dM.print();
ASSERT_TRUE(false);
}
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int l0, l1;
l0 = M3.Dim.rank - dee;
l1 = M4.Dim.rank - dee;
int pcoord3[l0];
int pcoord4[l1];
int r[dee];
int lin3, lin4, lin;
d = M.Dim;
d.print();
Tensor<double> Msum(d);
//for (size_t idx = 0; idx < d.size; idx++) Msum.elements[idx] = 0.0f;
//Msum.print();
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < l0; i++) pcoord3[i] = idx3[i];
for (int i = 0; i < l1; i++) pcoord4[i] = idx4[i + dee];
concatArray(coord, pcoord3, pcoord4, 0, 0, l0, 0, l1);
lin = d.CoordToLinear(coord);
Msum.elements[lin] = 0.0f;
//for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
//for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
{
for (int i = 0; i < dee; i++) r[i] = idx4[i];
concatArray(coord3, pcoord3, r, 0, 0, l0, 0, dee);
concatArray(coord4, r, pcoord4, 0, 0, dee, 0, l1);
//printf("[");printArray(coord3, M3.Dim.rank); printf("]["); printArray(coord4, M4.Dim.rank);printf("] =*= ("); printArray(coord, Msum.Dim.rank); printf(") |||");
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
Msum.elements[lin] += (M3.elements[lin3] * M4.elements[lin4]);
//printf("lin:%d lin3:%d lin4:%d el+:%f\n", lin, lin3, lin4, Msum.elements[lin]);
}
ASSERT_DOUBLE_EQ(Msum.elements[lin], M.elements[lin]);
}
}
TEST(reverseArray, innt) {
int n = 6;
int t4[6] = { 3, 4, 2, 3 ,5, 1 };
int revt4[6] = { 1,5,3,2, 4, 3 };
reverseArray(t4, n);
for (int i = 0; i < n; i++) {
ASSERT_EQ(t4[i], revt4[i]);
}
}
TEST(tensorContractnReverseProd, floatTemp) {
int t3[] = { 4, 4, 3 };
int t4[] = { 3, 4, 7, 2 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<float> M3(d3), M4(d4), M;
M3.initVal(3.0f); // M3.print();
M4.initVal(2.0f); // M4.print();
int dee = 2;
try {
//tensorContractnProd(M, M3, M4, dee);
tensorContractnReverseProd(M, M3, M4, dee);
}
catch (const std::invalid_argument& e) {
printf("bye from test tensorContractnProd floatTemp invalid arg! deep:\n");
dimension dM;
extractDimNestingDepth(dM, d3, d4, dee);
dM.print();
ASSERT_TRUE(false);
}
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int l0, l1;
l0 = M3.Dim.rank - dee;
l1 = M4.Dim.rank - dee;
int pcoord3[l0];
int pcoord4[l1];
int r[dee];
int rev[dee];
int lin3, lin4, lin;
d = M.Dim;
d.print();
Tensor<float> Msum(d);
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < l0; i++) pcoord3[i] = idx3[i];
for (int i = 0; i < l1; i++) pcoord4[i] = idx4[i + dee];
concatArray(coord, pcoord3, pcoord4, 0, 0, l0, 0, l1);
lin = d.CoordToLinear(coord);
Msum.elements[lin] = 0.0f;
//for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
//for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
{
for (int i = 0; i < dee; i++) {
r[i] = idx4[i];
rev[i] = idx4[dee - 1 - i];
}
concatArray(coord3, pcoord3, rev, 0, 0, l0, 0, dee);
concatArray(coord4, r, pcoord4, 0, 0, dee, 0, l1);
//printf("[");printArray(coord3, M3.Dim.rank); printf("]["); printArray(coord4, M4.Dim.rank);printf("] =*= ("); printArray(coord, Msum.Dim.rank); printf(") |||");
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
Msum.elements[lin] += (M3.elements[lin3] * M4.elements[lin4]);
//printf("lin:%d lin3:%d lin4:%d el+:%f\n", lin, lin3, lin4, Msum.elements[lin]);
}
ASSERT_FLOAT_EQ(Msum.elements[lin], M.elements[lin]);
}
}
TEST(cudaTensorProd, floatTemp) {
int t3[] = { 15, 6, 24 };
int t4[] = { 23, 15, 6, 10 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<float> M3(d3), M4(d4), M;
M3.initVal(1.0f); // M3.print();
M4.initVal(0.5f); // M4.print();
cudaTensorProd(M, M3, M4);
//tensorProd(M, M4, M3);
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int lin3, lin4, lin;
d = M.Dim;
d.print();
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < d3.rank; i++) coord3[i] = idx3[i];
for (int i = 0; i < d4.rank; i++) coord4[i] = idx4[i];
concatArray(coord, coord3, coord4, 0, 0, d3.rank, 0, d4.rank);
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
lin = d.CoordToLinear(coord);
//ASSERT_FLOAT_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
//ASSERT_FLOAT_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
ASSERT_FLOAT_EQ(M.elements[lin], M3.elements[lin3] * M4.elements[lin4]) << " M " << M.elements[lin] << " lin: " << lin << " M3: " << M3.elements[lin3] << " lin3:" << lin3 << " lin4: " << lin4 << " M4 " << M4.elements[lin4] << std::endl;
//std::cout << " M " << M.elements[lin] << " lin: " << lin << " M3: " << M3.elements[lin3] << " lin3:" << lin3 << " lin4: " << lin4 << " M4 " << M4.elements[lin4] << std::endl;
//ASSERT_NEAR(M.elements[lin], M3.elements[lin3] * M4.elements[lin4], 0.0001) << " lin: " << lin << " lin3: " << lin3 << " lin4: " << lin4;
}
}
TEST(permuteTensor, float) {
int t4[] = { 3, 8, 2, 4 };
struct dimension d4(4, t4);
struct Tensor<float> M4(d4), M;
M4.initVal(1.0f);
permutation p(4, true);
int n = 5;
//for (int n = 0; n < 24;n++) {
PlaceToTab(p.perm, n, p.size);
printf(" %*d : ", 2, n);
for (int i = 0; i < p.size; i++)printf("(%d)%d ", i, p.perm[i]);printf("\n");
permuteTensor(M, M4, p);
//permuteTensorDef(M, M4, p);
int ind[4];
int coor[4];
size_t cM, cM4;
for (ind[0] = 0; ind[0] < M4.Dim.dim[0]; ind[0]++)
for (ind[1] = 0; ind[1] < M4.Dim.dim[1]; ind[1]++)
for (ind[2] = 0; ind[2] < M4.Dim.dim[2]; ind[2]++)
for (ind[3] = 0; ind[3] < M4.Dim.dim[3]; ind[3]++) {
p.permute(coor, ind);
cM = M.Dim.CoordToLinear(coor);
cM4 = M4.Dim.CoordToLinear(ind);
//printf("M[%ld]=%f M4[%ld]=%f \n", cM, M.elements[cM], cM4, M4.elements[cM4]);
ASSERT_FLOAT_EQ(M.elements[cM], M4.elements[cM4]);
}
}
TEST(cudapermuteTensor, float) {
int t4[] = { 3, 8, 2, 4 };
struct dimension d4(4, t4);
struct Tensor<float> M4(d4), M;
M4.initVal(1.0f);
permutation p(4, true);
int n = 5;
//for (int n = 0; n < 24;n++) {
PlaceToTab(p.perm, n, p.size);
printf(" %*d : ", 2, n);
for (int i = 0; i < p.size; i++)printf("{%d}%d ", i, p.perm[i]);printf("\n");
cudapermuteTensor(M, M4, p);
//permuteTensor(M, M4, p);
//permuteTensorDef(M, M4, p);
int ind[4];
int coor[4];
size_t cM, cM4;
for (ind[0] = 0; ind[0] < M4.Dim.dim[0]; ind[0]++)
for (ind[1] = 0; ind[1] < M4.Dim.dim[1]; ind[1]++)
for (ind[2] = 0; ind[2] < M4.Dim.dim[2]; ind[2]++)
for (ind[3] = 0; ind[3] < M4.Dim.dim[3]; ind[3]++) {
p.permute(coor, ind);
cM = M.Dim.CoordToLinear(coor);
cM4 = M4.Dim.CoordToLinear(ind);
//printf("M[%ld]=%f M4[%ld]=%f \n", cM, M.elements[cM], cM4, M4.elements[cM4]);
ASSERT_FLOAT_EQ(M.elements[cM], M4.elements[cM4]);
}
}
TEST(scanPermuteMatchContractTensorfromSrcToDst1, permId) {
int t[] = { 3, 8, 2, 3, 4 };
//int tm[] = { 4, 2, 7, 3 };
int tm[] = { 2, 3,4,7 };
struct dimension d(5, t);
struct dimension dm(4, tm);
struct Tensor<float> M4(d), M(dm);
M4.initVal(1.0f);
M.initVal(1.0f);
int dee = 3;
//int result[4] = { 1,3,0,2 };
int result[4] = { 0,1,2,3 };
int perm[M.Dim.rank];
ASSERT_TRUE(scanPermuteMatchContractTensorfromSrcToDst(perm, M, M4, dee));
for (int i = 0; i < M.Dim.rank; i++) printf(" %d[%d] ", i, perm[i]); printf(" first perm \n");
ASSERT_EQ(0, memcmp(result, perm, sizeof(int) * M.Dim.rank));
Tensor<float> tM;
permutation p(M.Dim.rank, perm);
permuteTensor(tM, M, p);
ASSERT_FALSE(scanPermuteMatchContractTensorfromSrcToDst(perm, M, M4, 4));
for (int i = 0; i < M.Dim.rank; i++) printf(" %d[%d] ", i, perm[i]); printf(": last perm \n");
tM.Dim.print();
int resultDim[] = { 2,3,4,7 };
ASSERT_EQ(0, memcmp(resultDim, tM.Dim.dim, sizeof(int) * tM.Dim.rank));
}
TEST(scanPermuteMatchContractTensorfromSrcToDst2, floatest) {
int t[] = { 3, 8, 2, 3, 4 };
int tm[] = { 4, 2, 7, 3 };
//int tm[] = { 2, 3,4,7 };
struct dimension d(5, t);
struct dimension dm(4, tm);
struct Tensor<float> M4(d), M(dm);
M4.initVal(1.0f);
M.initVal(1.0f);
int dee = 3;
int result[4] = { 1,3,0,2 };
//int result[4] = { 0,1,2,3 };
int perm[M.Dim.rank];
ASSERT_TRUE(scanPermuteMatchContractTensorfromSrcToDst(perm, M, M4, dee));
for (int i = 0; i < M.Dim.rank; i++) printf(" %d[%d] ", i, perm[i]); printf(" first perm \n");
ASSERT_EQ(0, memcmp(result, perm, sizeof(int) * M.Dim.rank));
Tensor<float> tM;
permutation p(M.Dim.rank, perm);
permuteTensor(tM, M, p);
ASSERT_FALSE(scanPermuteMatchContractTensorfromSrcToDst(perm, M, M4, 4));
for (int i = 0; i < M.Dim.rank; i++) printf(" %d[%d] ", i, perm[i]); printf(": last perm \n");
tM.Dim.print();
int resultDim[] = { 2,3,4,7 };
ASSERT_EQ(0, memcmp(resultDim, tM.Dim.dim, sizeof(int) * tM.Dim.rank));
}
TEST(cudaTensorContractNestProd, floatTemp) {
int t3[] = { 77, 8, 25 };
int t4[] = { 8, 25, 52, 144 };
struct dimension d3(3, t3), d4(4, t4), d;
struct Tensor<float> M3(d3), M4(d4), M;
M3.initVal(1.0f); // M3.print();
M4.initVal(0.0f); // M4.print();
int dee = 2;
M4.Dim.print();
try {
//tensorContractnProd(M, M3, M4, dee);
cudaTensorContractNestProd(M, M3, M4, dee);
}
catch (const std::invalid_argument& e) {
printf("bye from test tensorContractnProd floatTemp invalid arg! deep: \n");
dimension dM;
extractDimNestingDepth(dM, d3, d4, dee);
dM.print();
ASSERT_TRUE(false);
}
int coord[M.Dim.rank];
int coord3[M3.Dim.rank];
int coord4[M4.Dim.rank];
int idx3[M3.Dim.rank];
int idx4[M4.Dim.rank];
int l0, l1;
l0 = M3.Dim.rank - dee;
l1 = M4.Dim.rank - dee;
int pcoord3[l0];
int pcoord4[l1];
int r[dee];
//int rev[dee];
int lin3, lin4, lin;
d = M.Dim;
d.print();
Tensor<float> Msum(d);
for (idx3[0] = 0; idx3[0] < d3.dim[0];idx3[0]++)
for (idx4[2] = 0; idx4[2] < d4.dim[2];idx4[2]++)
for (idx4[3] = 0; idx4[3] < d4.dim[3];idx4[3]++) {
for (int i = 0; i < l0; i++) pcoord3[i] = idx3[i];
for (int i = 0; i < l1; i++) pcoord4[i] = idx4[i + dee];
concatArray(coord, pcoord3, pcoord4, 0, 0, l0, 0, l1);
lin = d.CoordToLinear(coord);
Msum.elements[lin] = 0.0f;
//for (idx3[1] = 0; idx3[1] < d3.dim[1];idx3[1]++)
//for (idx3[2] = 0; idx3[2] < d3.dim[2]; idx3[2]++)
for (idx4[0] = 0; idx4[0] < d4.dim[0];idx4[0]++)
for (idx4[1] = 0; idx4[1] < d4.dim[1];idx4[1]++)
{
for (int i = 0; i < dee; i++) {
r[i] = idx4[i];
//rev[i] = idx4[dee - 1 - i];
}
//concatArray(coord3, pcoord3, rev, 0, 0, l0, 0, dee);
concatArray(coord3, pcoord3, r, 0, 0, l0, 0, dee);
concatArray(coord4, r, pcoord4, 0, 0, dee, 0, l1);
//printf("[");printArray(coord3, M3.Dim.rank); printf("]["); printArray(coord4, M4.Dim.rank);printf("] =*= ("); printArray(coord, Msum.Dim.rank); printf(") |||");
lin3 = d3.CoordToLinear(coord3);
lin4 = d4.CoordToLinear(coord4);
Msum.elements[lin] += (M3.elements[lin3] * M4.elements[lin4]);
//printf("lin:%d lin3:%d lin4:%d el+:%f\n", lin, lin3, lin4, Msum.elements[lin]);
}
ASSERT_FLOAT_EQ(Msum.elements[lin], M.elements[lin]) << " lin: " << lin << " Msumelem: " << Msum.elements[lin] << " Melem: " << M.elements[lin];
}
}
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
+56
View File
@@ -0,0 +1,56 @@
NAME_TEST=is_good
CC=gcc
ROOT_DIR=$(PWD)
YTESTDIR=$(PWD)/../ytest
TOOLDIR=$(PWD)/../ytools_t
INCLUDE_DIR=$(ROOT_DIR)/src
CFLAGS=-I$(INCLUDE_DIR) -I$(YTESTDIR)/include_ytest/include
LDFLAGS=-L$(YTESTDIR) -lytest
#SRC_DIR=$(ROOT_DIR)/src
#SRC=$(wildcard */*/*.c)
SRC=$(wildcard **/**/*.c)
#HEADS=$(OBJS:.o=.h)
TEST_DIR=$(PWD)
EXECSRC=$(NAME_TEST).c
EXEC=launch_$(NAME_TEST)_m
PERMSRC=src/permutation_t/permutation_t.c
PERMSRC_O=$(PERMSRC:.c=.o)
SETTSRC=src/set_theoric_t/set_theoric_t.c
SETTSRC_O=$(SETTSRC:.c=.o)
TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c
TOOLSRC_O=$(TOOLSRC:.c=.o)
OBJ=$(SRC:.c=.o) $(TOOLSRC_O)
LIB_YTEST=$(YTESTDIR)/libytest.so
all: $(EXEC) $(LIB_YTEST)
$(EXEC): $(EXECSRC) $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
$(PERMSRC_O): $(PERMSRC) $(SETTSRC_O)
$(CC) -o $@ -c $< $(CFLAGS)
$(SETTSRC_O) : $(SETTSRC) $(TOOLSRC_O)
$(CC) -o $@ -c $< $(CFLAGS)
$(TOOLSRC_O): $(TOOLSRC)
$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean mrproper
clean:
rm -f $(OBJ)
mrproper: clean
rm -f $(EXEC)
run: $(EXEC)
$(EXEC) -h