JasonWang 6 éve
szülő
commit
db7258d83c

+ 11 - 0
traph/include/traph/core/index.h

@@ -7,6 +7,7 @@
 #include <stdexcept>
 #include <memory>
 #include <utility>
+#include <initializer_list>
 #include <traph/core/type.h>
 
 #define DIMVECTOR_SMALL_VECTOR_OPTIMIZATION 5
@@ -26,6 +27,7 @@ namespace traph
         }
 
         DimVector(idx_type size)
+			:data(nullptr), dim_num(0)
         {
             if(size < 0)
                 return;
@@ -37,6 +39,15 @@ namespace traph
             dim_num = size;
         }
 
+		DimVector(std::initializer_list<int> list)
+			:data(nullptr), dim_num(0)
+		{
+			for (auto & each : list)
+			{
+				this->push_back(each);
+			}
+		}
+
         DimVector(const DimVector& other)
         {
             if(other.dim_num > DIMVECTOR_SMALL_VECTOR_OPTIMIZATION)

+ 21 - 17
traph/source/demo/main.cpp

@@ -90,6 +90,11 @@ int main()
 	int batch_size = 16;
 	
 	auto x = traph::randn<traph::f32>({ batch_size,32 });
+	auto x_data = std::dynamic_pointer_cast<traph::FloatTensor>(x->data());
+	// x_data->fill_(0.5f);
+	// x_data->data_ptr()[0] = 1.0f;
+	std::cout << x_data->to_string() << std::endl;
+
 	auto y = traph::ones<traph::f32>({ batch_size,2 });
 
 	MyModel model;
@@ -101,7 +106,7 @@ int main()
 
 	std::cout << "Start Training..." << std::endl;
 
-	for (int epoch = 0; epoch < 100; ++epoch)
+	for (int epoch = 0; epoch < 1000; ++epoch)
 	{
 		float loss100 = 0.f;
 
@@ -113,7 +118,6 @@ int main()
 		// std::cout << model.parameters()[0]->grad()->to_string()<<std::endl;
 		std::cout << loss->data()->to_string() << std::endl;
 	}
-	
 
 	//auto a = traph::ones<traph::f32>({ 2,3 });
 	//a->requires_grad_(true);
@@ -125,22 +129,22 @@ int main()
 	//std::cout << a->grad()->to_string();
 
 	/*
-	DimVector dim;
-	dim.push_back(3);
-	dim.push_back(4);
-	auto a = std::make_shared<traph::FloatTensor>(dim);
-	auto b = std::make_shared<traph::FloatTensor>(dim);
-
-	a->fill_(0);
-	SliceVector slice(2);
-	slice[0] = Slice(0, 2);
-	slice[1] = Slice(0, 2);
-
-	auto selected = std::dynamic_pointer_cast<traph::FloatTensor>(a->select(slice));
-	TENSOR_APPLY(float, selected, (*element_ptr)++);
-	std::cout << a->to_string();
-	*/
+	auto a = std::make_shared<traph::FloatTensor>(DimVector({ 2,1 }));
+	auto b = std::make_shared<traph::FloatTensor>(DimVector({ 1,2 }));
+
+	float * a_ptr = a->data_ptr();
+	float * b_ptr = b->data_ptr();
 
+	a_ptr[0] = 3;
+	a_ptr[1] = 4;
+
+	b_ptr[0] = 5;
+	b_ptr[1] = 6;
+
+	auto c = std::dynamic_pointer_cast<traph::FloatTensor>(a->matmul(b));
+
+	std::cout << c->to_string();
+	*/
 	
     return 0;
 }

+ 6 - 4
traph/source/tensor/arithmetic.cpp

@@ -128,12 +128,14 @@ namespace traph
 		dim.push_back(b.size()[1]);
 		std::shared_ptr<Tensor<f32>> result(new Tensor<f32>(dim));
 
+		
+
 #ifdef TRAPH_BUILD_EIGEN
 		// copy data
-		Eigen::Map<const Eigen::Matrix<f32, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> eigen_a(a.data_ptr() + a.offset(), a.size()[0], a.size()[1]);
-		Eigen::Map<const Eigen::Matrix<f32, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> eigen_b(b.data_ptr() + b.offset(), b.size()[0], b.size()[1]);
+		Eigen::Map<const Eigen::Matrix<f32, Eigen::Dynamic, Eigen::Dynamic>, 0, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>> eigen_a(a.data_ptr() + a.offset(), a.size()[0], a.size()[1], Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(a.stride(1), a.stride(0)));
+		Eigen::Map<const Eigen::Matrix<f32, Eigen::Dynamic, Eigen::Dynamic>, 0, Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>> eigen_b(b.data_ptr() + b.offset(), b.size()[0], b.size()[1], Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(b.stride(1), b.stride(0)));
 
-		Eigen::Matrix<f32, Eigen::Dynamic, Eigen::Dynamic> eigen_c = eigen_a * eigen_b;
+		Eigen::Matrix<f32, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> eigen_c = eigen_a * eigen_b;
 		// copy to result
 		std::copy(eigen_c.data(), eigen_c.data() + a.size()[0] * b.size()[1], result->data_ptr());
 #elif defined TRAPH_BUILD_MKL
@@ -172,7 +174,7 @@ namespace traph
 		Eigen::Map<const Eigen::Matrix<f64, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> eigen_a(a.data_ptr() + a.offset(), a.size()[0], a.size()[1]);
 		Eigen::Map<const Eigen::Matrix<f64, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> eigen_b(b.data_ptr() + b.offset(), b.size()[0], b.size()[1]);
 
-		Eigen::Matrix<f64, Eigen::Dynamic, Eigen::Dynamic> eigen_c = eigen_a * eigen_b;
+		Eigen::Matrix<f64, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> eigen_c = eigen_a * eigen_b;
 		// copy to result
 		std::copy(eigen_c.data(), eigen_c.data() + a.size()[0] * b.size()[1], result->data_ptr());
 #elif defined TRAPH_BUILD_MKL