create makefile and test dim
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
|
||||
CC=gcc
|
||||
TOOLDIR=$(PWD)/../ytools_t
|
||||
PERMDIR=$(PWD)/../ypermutation_t
|
||||
|
||||
INCLUDE_PERMDIR=$(PERMDIR)/src
|
||||
INCLUDE_TOOLDIR=$(TOOLDIR)/include
|
||||
CFLAGS=-I$(INCLUDE_TOOLDIR) -I$(INCLUDE_PERMDIR) -I./src
|
||||
|
||||
#SRC_DIR=$(ROOT_DIR)/src
|
||||
#SRC=$(wildcard */*/*.c)
|
||||
#HEADS=$(OBJS:.o=.h)
|
||||
|
||||
|
||||
|
||||
DIMSRC=src/dimension_t.c
|
||||
DIMSRC_O=$(DIMSRC:.c=.o)
|
||||
|
||||
PERMSRC_O=$(PERMDIR)/src/permutation_t/permutation_t.o
|
||||
|
||||
#TOOLSRC_O=$(TOOLDIR)/src/tools_t/tools_t.o
|
||||
#TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c
|
||||
#TOOLSRC_O=$(TOOLSRC:.c=.o)
|
||||
|
||||
#SRC=$(wildcard **/**/*.c)
|
||||
#OBJ=$(SRC:.c=.o) #$(TOOLSRC_O)
|
||||
|
||||
TOPTARGETS := all clean
|
||||
DEP=$(PERMDIR)
|
||||
|
||||
$(TOPTARGETS): $(DEP)
|
||||
|
||||
all: $(DIMSRC_O)
|
||||
|
||||
|
||||
$(DIMSRC_O) : $(DIMSRC) $(PERMSRC_O)
|
||||
$(CC) -o $@ -c $< $(CFLAGS)
|
||||
|
||||
$(DEP):
|
||||
$(MAKE) -C $@ $(MAKECMDGOALS)
|
||||
|
||||
#$(TOOLSRC_O): $(TOOLSRC)
|
||||
# $(CC) -o $@ -c $< $(CFLAGS)
|
||||
|
||||
.PHONY: clean mrproper
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ)
|
||||
|
||||
mrproper: clean
|
||||
rm -f $(EXEC)
|
||||
|
||||
run: $(EXEC)
|
||||
$(EXEC) -h
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "dimension_t.h"
|
||||
|
||||
dimension *
|
||||
create_dim(size_t sz){
|
||||
return CREATE_PERMUTATION_TYPE_SIZE_T(sz);
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
|
||||
|
||||
|
||||
|
||||
NAME_TEST=is_good
|
||||
CC=gcc
|
||||
ROOT_DIR=$(PWD)
|
||||
YTESTDIR=$(PWD)/../../ytest_t
|
||||
YPERMDIR=$(PWD)/../../ypermutation_t
|
||||
|
||||
INCLUDE_DIR=$(PWD)/../src
|
||||
CFLAGS=-I$(INCLUDE_DIR) -I$(YPERMDIR)/src -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
|
||||
|
||||
DIMDIR=$(PWD)/..
|
||||
|
||||
PERMSRC_O=$(YPERMDIR)/src/permutation_t/permutation_t.o
|
||||
|
||||
DIMSRC_O=$(INCLUDE_DIR)/dimension_t.o
|
||||
|
||||
TOPTARGETS := all clean
|
||||
|
||||
DEPS=$(DIMDIR) $(YPERMDIR) $(YTESTDIR)
|
||||
|
||||
OBJ=$(DIMSRC_O) $(PERMSRC_O)
|
||||
|
||||
LIB_YTEST=$(YTESTDIR)/libytest.so
|
||||
|
||||
|
||||
$(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)
|
||||
|
||||
|
||||
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
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/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
|
||||
PERMSRC=$PWD/../../ypermutation_t/src
|
||||
|
||||
gcc -o launch_is_good_c $1 -L$DIR_YTEST $2 -lytest -I$DIR_YTEST/include_ytest/include $PERMSRC/permutation_t/permutation_t.o $PERMSRC/set_theoric_t/set_theoric_t.o $SRC/dimension_t.c -I$SRC -I$PERMSRC
|
||||
#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
|
||||
@@ -0,0 +1,34 @@
|
||||
#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"
|
||||
#include "dimension_t.h"
|
||||
|
||||
TEST(dimension0){
|
||||
|
||||
dimension *D = create_dim(5);
|
||||
|
||||
EXPECT_EQ(D->size,5);
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv){
|
||||
|
||||
|
||||
run_all_tests_args(argc, argv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user