diff --git a/numpp.cpp b/numpp.cpp new file mode 100644 index 0000000..122eddd --- /dev/null +++ b/numpp.cpp @@ -0,0 +1,95 @@ +#include +#include +#include + +#include "numpp.hpp" + +using namespace std; + +template +int numpp::shape_match(vector dim) { + if(this->dim.size() == dim.size()) { + for(int i=0; idim.size(); i++) + if(this->dim[i] < dim[i]) + return 0; + return 1; + } + + return 0; +} + +template +numpp::numpp(vector dim) { + this->dim = dim; + this->ndim = 1; + for(int i=0; idim.size(); i++) + this->ndim *= this->dim[i]; + try { + T *a = new T[this->ndim]; + delete[] a; + } catch(bad_alloc&) { + cerr<<"\033[1;31m Error\033[0m: Memory out of bounds!"; + } +} + +template +void numpp::shape() { + cout<<"{ "; + for(int i=0; idim.size()-1; i++) + cout<dim[i]<<", "; + cout<dim[this->dim.size() - 1]<<" }"; + +} + +template +void numpp::add(numpp np1,numpp np2){ + cout<dim.size()*dim.size();i++) + { + this->data[i]=np1.data[i]+np2.data[i]; + cout<data[i]<<" "; + } +} +template +void numpp::sub(numpp np1,numpp np2){ + cout<dim.size()*dim.size();i++) + { + this->data[i]=np1.data[i]-np2.data[i]; + cout<data[i]<<" "; + } +} + +template +void numpp::reshape(vector new_dim) { + this->ndim = 1; + int new_ndim = 1; + for(int i=0; idim.size(); i++) + this->ndim *= this->dim[i]; + for(int i=0; indim == new_ndim) { + cout<<"New dimensions: "; + cout<<"{ "; + for(int i=0; i +void numpp::push_vec(vector dim, vector data) { + if(shape_match(dim)) { + this->ndim = 1; + for(int i=0; indim *= dim[i]; + if(data.size() == this->ndim) + this->data = data; + else + cerr<<"\033[1;31m Error\033[0m: Dimension doesn't match declared numpp dimension!\n"; + } + else + cerr<<"\033[1;31m Error\033[0m: Dimension doesn't match declared numpp dimension!\n"; +} diff --git a/numpp.hpp b/numpp.hpp new file mode 100644 index 0000000..18ded5d --- /dev/null +++ b/numpp.hpp @@ -0,0 +1,25 @@ +#ifndef NUMPP_H +#define NUMPP_H + +#include + +using namespace std; + +template +class numpp { + private: + vector dim; + vector data; + int ndim; + int shape_match(vector); + public: + numpp(vector); + void shape(); + void reshape(vector); + void push_vec(vector, vector); + void add(numpp,numpp); + void sub(numpp,numpp); + +}; + +#endif diff --git a/src/numpp.cpp b/src/numpp.cpp index 8dd44e0..0848eb6 100644 --- a/src/numpp.cpp +++ b/src/numpp.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "numpp.hpp" @@ -22,6 +23,7 @@ template numpp::numpp(vector dim) { this->dim = dim; this->ndim = 1; + is_zero = false; for(int i=0; idim.size(); i++) this->ndim *= this->dim[i]; try { @@ -59,6 +61,63 @@ void numpp::reshape(vector new_dim) { cerr<<"\033[1;31m Error\033[0m: Invalid dimensions!"; } +template +uint64_t numpp::max() { + long long int maximum=data[0]; + long i=1; + while(i!=ndim) + { + if(data[i]>maximum) + maximum=data[i++]; + } + return maximum; + +} + +template +uint64_t numpp::min() { + long long int minimum=data[0]; + long i=1; + while(i!=ndim) + { + if(data[i] +void numpp::zeros() { + is_zero = true; +} + +template +void numpp::print() { + long i=1; + cout< void numpp::push_vec(vector dim, vector data) { if(shape_match(dim)) { @@ -73,3 +132,128 @@ void numpp::push_vec(vector dim, vector data) { else cerr<<"\033[1;31m Error\033[0m: Dimension doesn't match declared numpp dimension!\n"; } + +template +void numpp::add(numpp np1,numpp np2){ + cout<dim.size()*dim.size();i++) + { + this->data[i]=np1.data[i]+np2.data[i]; + cout<data[i]<<" "; + } +} +template +void numpp::sub(numpp np1,numpp np2){ + cout<dim.size()*dim.size();i++) + { + this->data[i]=np1.data[i]-np2.data[i]; + cout<data[i]<<" "; + } +} + +template +void numpp::search(T a, string ch) { + if(ch == "linear") { + int count=0; + for(int i=0; i data[j+1]) { + temp=data[j]; + data[j]=data[j+1]; + data[j+1]=temp; + } + } + } + int count=0; + int start, end, middle; + start=0; + end=ndim-1; + for(int i=0;idata[middle]) + start=middle+1; + else + end=middle-1; + } + if(count>0) + cout< +void numpp::sort(string ch) { + if(ch=="Bubble") { + int i, j; + T temp; + for (i = 0; i < ndim-1; i++) { + for (j = 0; j < ndim-i-1; j++) { + if (data[j] > data[j+1]) { + temp=data[j]; + data[j]=data[j+1]; + data[j+1]=temp; + } + } + } + } else if(ch=="Insertion") { + int i, j; + T key; + for (i = 1; i < ndim; i++) { + key = data[i]; + j = i - 1; + while (j >= 0 && data[j] > key) { + data[j + 1] = data[j]; + j = j - 1; + } + data[j + 1] = key; + } + } else if(ch=="Selection") { + int i, j, min_idx; + T temp; + + for (i = 0; i < ndim-1; i++) { + min_idx = i; + for (j = i+1; j < ndim; j++) + if (data[j] < data[min_idx]) + min_idx = j; + temp=data[min_idx]; + data[min_idx]=data[i]; + data[i]=temp; + } + for(i=0;i + void numpp::random_normal(double mean, double stddev) { + default_random_engine generator; + normal_distribution distribution(mean, stddev); + this->data.clear(); + for(int i=0; indim; i++) + this->data.push_back(distribution(generator)); + } + + template + void numpp::random_uniform(double mean, double stddev) { + default_random_engine generator; + uniform_real_distribution distribution(mean, stddev); + this->data.clear(); + for(int i=0; indim; i++) + this->data.push_back(distribution(generator)); + } diff --git a/src/numpp.hpp b/src/numpp.hpp index e0976f8..254f401 100644 --- a/src/numpp.hpp +++ b/src/numpp.hpp @@ -10,6 +10,7 @@ class numpp { private: vector dim; vector data; + bool is_zero; uint64_t ndim; int shape_match(vector); public: @@ -17,6 +18,16 @@ class numpp { void shape(); void reshape(vector); void push_vec(vector, vector); + uint64_t max(); + uint64_t min(); + void zeros(); + void print(); + void add(numpp,numpp); + void sub(numpp,numpp); + void search(T, string); + void sort(string); + void random_normal(double, double); + void random_uniform(double, double); }; #endif diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000..47cb99b --- /dev/null +++ b/test.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include "numpp.cpp" + +using namespace std; + +using namespace std::chrono; + +int main() { + + numpp np({2,2}); + numpp np1({2,2}); + numpp np2({2,2}); + numpp np3({2,2}); + + auto start = high_resolution_clock::now(); + + np.push_vec({2,2}, {1,2,3,4}); + np1.push_vec({2,2}, {5,4,7,8}); + np2.push_vec({2,2}, {4,2,6,7}); + np3.push_vec({2,2}, {0,0,0,0}); + + auto stop = high_resolution_clock::now(); + auto duration = duration_cast(stop - start); + cout<