24 #include "DDLinkedList.h" 26 #include <experimental/optional> 28 #include <boost/filesystem/operations.hpp> 31 #include </Users/cat/myfile/bitbucket/cpplib/glm/glm/glm.hpp> 48 #ifdef __has_include // Check if __has_include is present 49 # if __has_include(<optional>) // Check for a standard library 51 # elif __has_include(<experimental/optional>) // Check for an experimental version 52 # include <experimental/optional> 53 # elif __has_include(<boost/optional.hpp>) // Try with an external library 54 # include <boost/optional.hpp> 55 # else // Not found at all 56 # error "Missing <optional>" 82 namespace fs = boost::filesystem;
93 void swap(vector<T>&
vec,
int i,
int j);
108 return arc4random_uniform(n);
112 vector<int> allPrime(
int n) {
116 for(
int p=3; p<n; p++) {
118 for(
int i=0; i<
vec.size() && isPrime; i++) {
144 const char*
s2c(
string s) {
163 std::ostringstream out;
168 template<
typename T,
typename U>
169 string toStr(std::pair<T, U> p){
172 ret +=
toStr(p.first) +
" , ";
173 ret +=
toStr(p.second);
178 template<
typename T,
typename U>
179 string str(std::pair<T, U> p){
184 string str(
const T& s) {
189 string toStr2(T& s) {
190 std::ostringstream out;
202 string trimLeft(
string str) {
204 s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](
auto& x) {
205 return !std::isspace(x);
210 string trimRight(
string str) {
212 s.erase(std::find_if(s.rbegin(), s.rend(), [](
auto& x) {
213 return !std::isspace(x);
226 return trimRight(trimLeft(s));
242 string c2s(
const char* pt) {
258 regex_search(s, m, rx);
274 regex_search(str, m, rx);
289 auto end = s.find(delim);
290 while (end != std::string::npos) {
291 vec.push_back(s.substr(start, end - start));
292 start = end + delim.length();
293 end = s.find(delim, start);
295 vec.push_back(s.substr(start, s.size() - start));
313 std::pair<vector<T>, vector<T>>
splitAt(
int n, vector<T>
vec) {
316 for(
int i=0; i<
vec.size(); i++) {
318 fstVec.push_back(
vec[i]);
320 sndVec.push_back(
vec[i]);
322 return std::make_pair(fstVec, sndVec);
331 template<
typename Fun,
typename T>
335 for(
int i=0; i<
vec.size(); i++) {
340 return std::make_pair(fstVec,
vec);
351 vector<T> retVec(
vec);
352 std::replace(retVec.begin(), retVec.end(), oldVal, newVal);
374 assert(0 <= pos && pos <=
vec.size());
376 typename vector<T>::iterator it = v.begin();
378 std::copy (insertVec.begin(),insertVec.end(),std::inserter(v,it));
399 vector<std::string>
splitStrRegex(
const string& s,
string rgxStr =
"\\s+") {
400 vector<std::string>
vec;
403 sregex_token_iterator iter(s.begin(), s.end(), rgx, -1);
404 sregex_token_iterator end;
406 while (iter != end) {
407 vec.push_back(*iter);
427 return strlen(cpt) == 0;
429 perror(
"cpt is NULL");
442 while(fabs(x*x - a) > 0.00000001) {
443 x = x + (a - x*x)/(2*x);
454 return static_cast<double>(n);
463 double nthRoot(
double c,
int n,
double epsilon = 0.000001) {
466 auto ff = [](
auto xx,
auto nn,
auto cc) {
468 return pow(xx, nb) - cc;
472 auto df = [](
auto xx,
auto nn,
auto cc) {
474 return nn*pow(xx, bb);
479 while(fabs(pow(x, b) - c) > epsilon) {
480 x = x - ff(x, n, c)/df(x, n, c);
487 string charArrToString(
const char* pt) {
494 string replicate(
int n,
string s) {
496 for(
int i=0; i<n; i++) {
504 string repeat(
int n,
string s) {
505 return replicate(n, s);
509 vector<T> repeatVec(
int n, T t) {
511 for(
int i=0; i<n; i++) {
523 return strcmp(s1, s2);
531 return s1.compare(s2);
538 double epsilon = 0.00001;
539 return fabs(a-b) < epsilon;
542 void print(glm::vec3 v3) {
543 printf(
"%2.3f %2.3f %2.3f \n",v3.x, v3.y, v3.z);
545 void print(glm::vec2 v2) {
546 printf(
"%2.3f %2.3f \n",v2.x, v2.y);
549 void printLn(glm::vec3 v3) {
550 printf(
"%2.3f %2.3f %2.3f ",v3.x, v3.y, v3.z);
552 void printLn(glm::vec2 v2) {
553 printf(
"%2.3f %2.3f ",v2.x, v2.y);
557 string toString(glm::vec3 v3) {
559 sprintf(strPt,
"%2.3f %2.3f %2.3f", v3.x, v3.y, v3.z);
560 return charArrToString(strPt);
601 vector<vector<T>> retMat;
603 for(
auto const& v :
mat) {
608 for(
int i=0; i<min; i++) {
610 for(
int k = 0; k <
mat.size(); k++) {
611 v.push_back(
mat[k][i]);
620 bool compareArray(T arr1[], T arr2[],
const int s1) {
621 for(
int i=0; i<s1; i++) {
622 if(arr1[i] != arr2[i])
629 void print(std::pair<T, T> pair) {
630 cout<<
"("<<pair.first<<
" "<<pair.second<<
")"<<endl;
634 void print(vector<T>
vec) {
635 for(
auto const& v:
vec) {
636 std::cout<<
"["<<v<<
"]";
638 std::cout<<std::endl;
642 void print(vector< vector<T> >
vec) {
643 for(
auto const& v:
vec) {
646 std::cout<<std::endl;
651 std::cout<<
"["<<t<<
"]";
664 std::cout<<
"["<<t<<
"]"<<std::endl;
668 void printLnNb(T t) {
669 std::cout<<t<<std::endl;
676 std::cout<<std::endl;
694 vec.insert(
vec.end(), v2.begin(), v2.end());
698 string operator+(
const char* chars,
string s) {
699 return charArrToString(chars) + s;
702 string operator+(
string s,
const char* chars) {
703 return s + charArrToString(chars);
707 vector<T> con(T t, vector<T> v) {
710 for(
auto const& e: v)
722 vector<T>* pt =
new vector<T>();
723 for(
auto const& val:
vec) {
724 pt -> push_back(val);
727 return std::move(pt);
730 int unsignToInt(
size_t u){
731 if(u > std::numeric_limits<int>::max()){
732 throw std::overflow_error(
"ERROR: size_t > int");
734 return static_cast<int>(u);
745 vector<T>* pt =
new vector<T>();
746 for(
auto const& val:
vec) {
747 pt -> push_back(val);
750 return std::move(pt);
757 return unsignToInt(s.size());
773 return unsignToInt(v.size());
798 int mid = (lo + hi)/2;
805 return key == arr[lo];
818 for(
auto const& value:
vec) {
819 newVec.push_back(a*value);
832 for(
auto const& value:
vec) {
833 newVec.push_back(a*value);
839 vector<vector<T>>
operator*(T a, vector<vector<T>> vec2) {
840 vector<vector<T>> newVec2;
842 for(
auto const&
vec : vec2) {
843 newVec2.push_back(a*
vec);
849 vector<vector<T>>
operator*(vector<vector<T>> vec2, T a) {
857 vector<int> range(
int a,
int b,
int stride = 1) {
859 for(
int i=a; i<=b; i += stride)
866 vector<T> geneVector(
int a,
int b) {
869 for(
int i=0; i<=
len; i++) {
870 vec.push_back(a + i);
881 vector< vector<T> > vv;
883 for(
int c=0; c<ncol; c++) {
885 for(
int r=0; r<nrow; r++) {
897 void swapT(T array[],
int i,
int j) {
914 for(
int i=lo; i<=hi; i++) {
916 swapT(array, i, big);
939 vector<T> tmp(hi - lo + 1);
942 for(
int k = 0; k <
len(
vec) && i != j; k++){
953 for(
int k=0; k <
len(tmp); k++)
954 vec[lo + k] = tmp[k];
979 for(
int i = lo; i <= hi; i++){
981 swap(
vec, i, bigInx);
984 }
else if(
vec[i] > pivot){
996 void quickSortT(T array[],
int lo,
int hi) {
999 quickSortT(array, lo, pivot-1);
1000 quickSortT(array, pivot+1, hi);
1015 clock_t startTime = 0;
1016 clock_t endTime = 0;
1020 startTime = clock();
1025 startTime = clock();
1026 pl(
"Start StopWatch()");
1033 diff = endTime - startTime;
1034 std::cout<<
"Diff=["<<(float)diff/CLOCKS_PER_SEC<<
"] Seconds"<<std::endl;
1035 std::cout<<
"Tick=["<<diff<<
"] ticks"<<std::endl;
1039 diff = endTime - startTime;
1040 std::cout<<
"Diff=["<<(float)diff/CLOCKS_PER_SEC<<
"] Seconds"<<std::endl;
1041 std::cout<<
"Tick=["<<diff<<
"] ticks"<<std::endl;
1043 void printTicket() {
1045 clock_t diff = endTime - startTime;
1046 std::cout<<
"Tick=["<<diff<<
"] CPU tickets"<<std::endl;
1052 void pp(
const char* format, ...);
1056 template<
typename T>
1059 template<
typename T>
1060 void pp(T t1, T t2);
1062 template<
typename T>
1063 void pp(T t1, T t2, T t3);
1065 template<
typename T,
typename U>
1066 void pp(std::pair<T, U> p);
1071 void pp(
unsigned long n);
1074 template<
typename T>
1079 template<
typename T>
1080 void pp(T t1, T t2) {
1085 template<
typename T>
1086 void pp(T t1, T t2, T t3) {
1092 template<
typename T,
typename U>
1093 void pp(std::pair<T, U> p){
1097 void pp(
const char* format, ...) {
1112 void pp(
unsigned long n) {
1120 printLnNb(repeat(80,
"-"));
1124 string s1 = repeat(n/2 -
len(s)/2,
"-");
1125 string s2 = repeat(n/2 -
len(s)/2,
"-");
1126 printLnNb(s1 + s + s2);
1129 int len = s.length();
1130 int pad = 40 - (
len/2);
1131 printLnNb(repeat(pad,
"-") + s + repeat(pad,
"-"));
1139 static void t(
double a,
double b,
string s =
"") {
1145 pp(
"false => " + s);
1149 static void t(
int a,
int b,
string s =
"") {
1154 pp(
"false => " + s);
1158 static void t(
long a,
long b,
string s =
"") {
1163 pp(
"false => " + s);
1167 static void t(
bool a,
bool b,
string s =
"") {
1172 pp(
"false => " + s);
1176 static void t(
string a,
string b,
string s =
"") {
1181 pp(
"false => " + s);
1187 template<
typename T>
1188 void swap(T arr[],
int i,
int j) {
1194 template<
typename T>
1195 void swap(vector<T>&
vec,
int i,
int j){
1207 template<
class T =
double>
1218 Point(T x, T y, T z = 0.0 ) {
1225 Point<T> p(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
1229 Point<T> p(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
1258 Point p(x + v.x, y + v.y, z + v.z);
1261 bool operator==(
Point p0) {
1262 return x == p0.x && y == p0.y && z == p0.z;
1264 bool operator!=(
Point p0) {
1265 return x != p0.x || y != p0.y || z != p0.z;
1289 Pair pa(
this -> p0 + pair.p0, this -> p1 + pair.p1);
1293 Pair pa(
this -> p0 - pair.p0, this -> p1 - pair.p1);
1329 Vector<T> v1(p0 + v.p0, p1, v.p1);
1334 template<
class T =
double>
1335 double isColinear3(Point<T> p, Point<T> p1, Point<T> p2) {
1337 return (p2.y - p.y)*(p2.x - p1.x) - (p2.x - p.x)*(p2.y - p1.y);
1339 template<
class T =
double>
1340 bool isCrossSegment(Point<T> p0, Point<T> p1) {
1345 template<
class T =
double>
1364 double squareDist() {
1365 double d = (p1.x - p0.x)*(p1.x - p0.x) +
1366 (p1.y - p0.y)*(p1.y - p0.y);
1370 double d = (p1.x - p0.x)*(p1.x - p0.x) +
1371 (p1.y - p0.y)*(p1.y - p0.y);
1375 return isColinear3(p, p0, p1) == 0;
1387 return p == p0 || p == p1;
1390 return (p0 == s.p0 && p1 = s.p1) || (p1 = s.p0 && p0 == s.p1);
1398 void writeFile(
string fname,
string s) {
1400 ofs.open(fname, std::ofstream::out);
1404 void writeFileAppend(
string fname,
string s) {
1406 ofs.open(fname, std::ofstream::out | std::ofstream::app);
1411 template<
typename T>
1412 void writeFileVector(
string fname, std::vector<T>
vec) {
1414 ofs.open (fname, std::ofstream::out);
1421 template<
typename T>
1422 void writeFileAppendVector(
string fname, std::vector<T>
vec) {
1424 ofs.open (fname, std::ofstream::out | std::ofstream::app);
1436 template<
typename T>
1439 ofs.open (fname, std::ofstream::out | std::ofstream::app);
1474 }
else if(sub.length() > 0 && sub.length() <= s.length()){
1482 for(
int i=0; i < s.length() && ret ==
false; i++){
1485 while(j < sub.length() && i + count < s.length() && sub[j] == s[i + count]){
1488 if(count == sub.length()){
1512 }
else if(sub.length() > 0 && sub.length() <= s.length()){
1520 for(
int i=0; i < s.length() && ret == -1; i++){
1523 while(j < sub.length() && i + count < s.length() && sub[j] == s[i + count]){
1526 if(count == sub.length()){
1537 int strToInt(
string s);
1539 string fun_parent_parent();
1542 int stringToInt(
string s) {
1546 int strToInt(
string s) {
1551 double stringToDouble(std::string s) {
1556 long stringToLong(std::string s) {
1561 float stringToFloat(std::string s) {
1566 string charToString(
char ch) {
1574 std::string pretty_fun = fun_parent_parent();
1575 int len = pretty_fun.length();
1576 printf (
"[%s%.*s]\n", pretty_fun.c_str(), sz <
len ? 0 : (int)(sz -
len), PAD);
1579 void begin(
const char* name) {
1581 printf (
"[%s%.*s]\n", name, (sz < strlen(name)) ? 0 : (
int)(sz - strlen(name)), PAD);
1588 void cut(
char* pt) {
1589 int k = strlen(pt) - 1;
1590 while(k >= 0 && pt[k] !=
'v') k--;
1592 k >= 0 ? pt[k] = 0 : printf(
"Error: invalid string format.");
1596 string fun_parent() {
1601 size = backtrace (array, 10);
1602 strings = backtrace_symbols (array, size);
1605 string str = std::string(strings[1] + 62);
1611 string fun_parent_parent() {
1616 size = backtrace (array, 10);
1617 strings = backtrace_symbols (array, size);
1620 string str = std::string(strings[2] + 62);
1644 template<
typename T =
int,
typename U =
int>
1653 two(T first, U second) {
1654 this -> first = first;
1655 this -> second = second;
1659 string str =
"(" + toStr2(first) +
" " + toStr2(second) +
")";
1924 Complex c1(x*c.x - y*c.y, x*c.y + y*c.x);
1932 return x == c.x && y == c.y;
1940 return sqrt(c.x*c.x + c.y*c.y);
1943 std::pair<double, double> polar() {
1944 double radius = norm(*
this);
1945 double radian = acos(x/radius);
1946 std::pair<double, double> pair = std::make_pair(radius, radian);
1957 double xx = (c1.x*c2.x + c1.y*c2.y)/(c2.x*c2.x + c2.y*c2.y);
1958 double yy = (c2.x*c1.y - c1.x*c2.y)/(c2.x*c2.x + c2.y*c2.y);
1968 printf(
"[%1.2f][%1.2f]\n", x, y);
1978 Complex c( p.first*cos(p.second), p.first*sin(p.second) );
2001 template<
typename T>
2003 T** arr = (T**)
new T*[ncol];
2004 for(
int c = 0; c < ncol; c++)
2005 arr[c] = (T*)
new T[nrow];
2015 template<
typename T>
2017 T** arr = (T**)
new T*[ncol];
2018 for(
int c = 0; c < ncol; c++)
2019 arr[c] = (T*)
new T[nrow];
2028 template<
typename T>
2030 int ncol = vv.size();
2032 int nrow = vv[0].size();
2033 T** arr = allocateTemp<T>(ncol, nrow);
2034 for(
int c=0; c<ncol; c++) {
2035 for(
int r=0; r<nrow; r++) {
2036 arr[c][r] = vv[c][r];
2072 template<
typename T>
2074 vector< vector<T> > v;
2075 for(
int c=0; c<ncol; c++) {
2077 for(
int r=0; r<nrow; r++) {
2078 v1.push_back(arr[c][r]);
2099 bool operator==(
const vec &v);
2100 vec& operator=(
const vec &v);
2107 void createVec(
float* arr,
int len);
2108 vector<float> toVector();
2122 row(
const vector<float>&
vec);
2125 void createRow(
float* array,
int len);
2126 bool operator==(
const row& v);
2127 row operator=(
const row& r);
2131 row operator/(
float f);
2132 vector<float> toVector();
2140 vec::vec(
const vec& v) {
2143 arr = allocate<float>(ncol, nrow);
2144 for(
int i=0; i<ncol; i++)
2145 arr[i][0] = v.arr[i][0];
2151 vec::vec(
int col,
int row=1) {
2154 arr = allocate<float>(ncol, nrow);
2157 for(
int i=0; i<ncol; i++) {
2165 vector<float> vec::toVector() {
2167 for(
int i=0; i<ncol; i++) {
2168 vec.push_back(arr[i][0]);
2173 assert(ncol == v.ncol);
2175 for(
int i=0; i<ncol; i++)
2176 v1->arr[i][0] = arr[i][0] + v.arr[i][0];
2181 vec vec::operator-(
vec& v) {
2182 assert(ncol == v.ncol);
2184 for(
int i=0; i<ncol; i++)
2185 v1->arr[i][0] = arr[i][0] - v.arr[i][0];
2191 bool vec::operator==(
const vec& v) {
2193 for(
int i=0; i<ncol && ret; i++) {
2194 ret = arr[i][0] == v.arr[i][0];
2200 vec& vec::operator=(
const vec& v) {
2201 assert(ncol == v.ncol);
2204 arr = allocate<float>(v.ncol, v.nrow);
2205 for(
int i=0; i<ncol; i++) {
2206 arr[i][0] = v.arr[i][0];
2212 void vec::createVec(
float* array,
int len) {
2213 for(
int i=0; i<
len; i++) {
2214 arr[i][0] = array[i];
2218 for(
int i=0; i<ncol; i++) {
2219 cout<<arr[i][0]<<std::endl;
2225 row::row(
int col,
int row) {
2228 arr = allocate<float>(ncol, nrow);
2233 arr = allocate<float>(ncol, nrow);
2235 row::row(
const vector<float>&
vec) {
2237 nrow = (int)
vec.size();
2238 arr = allocate<float>(ncol, nrow);
2239 for(
int i=0; i<nrow; i++) {
2244 for(
int i=0; i<ncol; i++) {
2252 row::row(
const row& rw) {
2255 arr = allocate<float>(ncol, nrow);
2256 for(
int r=0; r<nrow; r++) {
2257 arr[0][r] = rw.arr[0][r];
2263 for(
int i=0; i<nrow; i++) {
2264 for(
int j=0; j<ncol; j++) {
2265 rw.arr[i][j] = arr[j][i];
2273 for(
int i=0; i<ncol; i++) {
2274 for(
int j=0; j<nrow; j++) {
2275 v.arr[j][i] = arr[i][j];
2285 vector<float> row::toVector() {
2287 for(
int i=0; i<nrow; i++) {
2288 vec.push_back(arr[0][i]);
2293 for(
int i=0; i<nrow; i++) {
2294 cout<<arr[0][i]<<
" ";
2300 bool row::operator==(
const row& r) {
2301 assert(nrow == r.nrow);
2303 for(
int i=0; i<nrow && ret; i++) {
2304 ret = arr[0][i] == r.arr[0][i];
2309 row row::operator=(
const row& r) {
2312 arr = allocate<float>(ncol, nrow);
2313 for(
int i=0; i<nrow; i++) {
2314 arr[0][i] = r.arr[0][i];
2319 void row::createRow(
float* array,
int len) {
2320 for(
int i=0; i<
len; i++) {
2321 arr[0][i] = array[i];
2337 mat(
const int col,
const int row);
2338 mat(vector<vector<float>> v2);
2339 mat(
const int col,
const int row, vector<float> v);
2355 Loader(
mat& m,
int ix) : m(m), ix(ix) {}
2356 Loader operator , (
float x){
2357 assert(ix < m.ncol * m.nrow);
2359 int u = ix / m.nrow;
2360 int v = ix % m.nrow;
2362 return Loader(m, ix + 1);
2365 Loader operator << (
float x){
2366 assert(ncol > 0 && nrow > 0);
2375 mat operator=(
const mat& m);
2376 bool operator==(
const mat& m);
2378 mat operator-(
const mat& m);
2379 mat operator/(
float f);
2381 mat removeRow(
int index);
2382 mat removeVec(
int index);
2383 mat insertVecNext(
int index,
vec v);
2384 mat insertVecPrevious(
int index,
vec v);
2389 mat rowMultiScala(
int index,
float f);
2390 mat vecMultiScala(
int index,
float f);
2391 mat swapRow(
int inx1,
int inx2);
2394 void geneMat(
int init);
2418 mat subMatrix(
int colIndex,
int rowIndex);
2431 mat block(
int colIndex,
int clen,
int rowIndex,
int rlen);
2454 cout<<
"empty matrix";
2457 for(
int c=0; c<ncol; c++) {
2458 for(
int r=0; r<nrow; r++) {
2465 assert(ncol == nrow);
2472 void mat::identity() {
2473 assert(ncol == nrow);
2474 for(
int c=0; c<ncol; c++) {
2475 for(
int r=0; r<nrow; r++) {
2491 mat::mat(
const mat& m) {
2494 arr = allocate<float>(ncol, nrow);
2495 for(
int c=0; c<ncol; c++) {
2496 for(
int r=0; r<nrow; r++) {
2497 arr[c][r] = m.arr[c][r];
2501 mat::mat(
int col,
int row) {
2504 arr = allocate<float>(ncol, nrow);
2506 mat::mat(vector<vector<float>> v2){
2507 assert(v2.size() > 0 && v2[0].size() > 0);
2509 nrow = v2[0].size();
2510 arr = allocate<float>(ncol, nrow);
2511 for(
int c=0; c<ncol; c++){
2512 for(
int r=0; r<nrow; r++)
2513 arr[c][r] = v2[c][r];
2516 mat::mat(
int col,
int row, vector<float> v){
2519 assert(ncol >= 0 && nrow >= 0 && v.size() == ncol*nrow);
2520 arr = allocate<float>(ncol, nrow);
2521 for(
int c=0; c<ncol; c++){
2522 for(
int r=0; r<nrow; r++)
2523 arr[c][r] = v[nrow*c + r];
2528 for(
int i=0; i<ncol; i++)
2534 mat vec::toMatrix() {
2536 for(
int c=0; c<ncol; c++) {
2537 for(
int r=0; r<nrow; r++) {
2538 m.arr[c][r] = arr[c][r];
2562 for(
int c=0; c<ncol; c++) {
2563 for(
int r=0; r<nrow; r++) {
2564 cout<<arr[c][r]<<
" ";
2572 for(
int c=0; c<ncol; c++) {
2573 for(
int r=0; r<nrow; r++) {
2574 ret += toStr2(arr[c][r]) +
" ";
2582 void mat::print2() {
2583 for(
int c=0; c<ncol; c++) {
2584 for(
int r=0; r<nrow; r++) {
2585 printf(
"[%*f]", 10, arr[c][r]);
2595 assert(0 <= n && n < nrow);
2597 for(
int i=0; i<ncol; i++) {
2598 v.arr[i][0] = arr[i][n];
2608 for(
int i=0; i<nrow; i++) {
2609 r.arr[0][i] = arr[index][i];
2617 mat mat::removeVec(
int index) {
2618 assert(nrow > 0 && index >= 0 && index < nrow);
2619 mat m(ncol, nrow - 1);
2620 for(
int c=0; c<ncol; c++) {
2622 for(
int r=0; r<nrow; r++) {
2624 m.arr[c][k] = arr[c][r];
2636 assert(ncol == v.ncol && 0 <= index && index < nrow);
2637 mat mv = v.toMatrix();
2638 mat left = take(index + 1);
2639 mat right = drop(index + 1);
2640 mat cat = left.concat(mv).concat(right);
2649 mat mat::insertVecPrevious(
int index,
vec v) {
2650 assert(ncol == v.ncol && 0 <= index && index < nrow);
2651 mat mv = v.toMatrix();
2653 return mv.concat(*
this);
2655 mat left = take(index);
2656 mat right = drop(index);
2657 return left.concat(mv).concat(right);
2661 mat mat::removeRow(
int index) {
2662 assert(ncol > 0 && index >= 0 && index < ncol);
2663 mat m(ncol - 1, nrow);
2665 for(
int c=0; c<ncol; c++) {
2667 for(
int r=0; r<nrow; r++) {
2668 m.arr[k][r] = arr[c][r];
2677 for(
int c=0; c<ncol; c++) {
2678 for(
int r=0; r<nrow; r++) {
2679 m1.arr[c][r] = arr[c][r] + m.arr[c][r];
2685 mat mat::operator-(
const mat &m) {
2687 for(
int c=0; c<ncol; c++) {
2688 for(
int r=0; r<nrow; r++) {
2689 m1.arr[c][r] = arr[c][r] - m.arr[c][r];
2694 mat mat::operator/(
float f) {
2696 for(
int c=0; c<ncol; c++) {
2697 for(
int r=0; r<nrow; r++) {
2698 m1.arr[c][r] = arr[c][r]/f;
2706 for(
int c=0; c<ncol; c++) {
2707 for(
int r=0; r<nrow; r++) {
2708 m1.arr[c][r] = arr[c][r]*f;
2722 mat mat::subMatrix(
int cStart,
int rStart) {
2723 assert(cStart < ncol && rStart < nrow);
2724 int ncolt = ncol - cStart;
2725 int nrowt = nrow - rStart;
2726 mat m(ncolt, nrowt);
2727 for(
int c=0; c<m.ncol; c++) {
2728 for(
int r=0; r<m.nrow; r++) {
2729 m.arr[c][r] = arr[c + cStart][r + rStart];
2743 mat m = block(0, ncol, 0,
len);
2755 mat m = block(0, ncol,
len, nrow -
len);
2774 assert(ncol > 0 && nrow > 0);
2775 mat m = take(nrow - 1);
2795 assert(ncol > 0 && nrow > 0);
2810 mat mat::block(
int cIndex,
int clen,
int rIndex,
int rlen) {
2812 for(
int c=0; c<m.ncol; c++) {
2813 for(
int r=0; r<m.nrow; r++) {
2814 m.arr[c][r] = arr[cIndex + c][rIndex + r];
2832 for(
int c=0; c<ncol; c++) {
2833 for(
int r=0; r<nrow; r++) {
2834 m.arr[r][c] = arr[c][r];
2841 bool mat::operator==(
const mat& m) {
2842 bool ret = ncol == m.ncol && nrow == m.nrow ? true :
false;
2843 for(
int c=0; c<ncol && ret; c++) {
2844 for(
int r=0; r<nrow && ret; r++) {
2845 ret = arr[c][r] == m.arr[c][r];
2859 void mat::geneMat(
int init) {
2861 for(
int c=0; c<ncol; c++) {
2862 for(
int r=0; r<nrow; r++) {
2883 for(
int c=0; c<ncol; c++) {
2884 for(
int r=0; r<nrow; r++) {
2885 arr[c][r] =
random(snd - fst) + fst;
2893 assert(nrow == rw.ncol);
2894 mat m(ncol, rw.nrow);
2895 for(
int c=0; c<m.ncol; c++) {
2896 for(
int r=0; r<m.nrow; r++) {
2897 m.arr[c][r] = arr[c][0]*rw.arr[0][r];
2909 assert(nrow == v.ncol);
2911 for(
int c=0; c<ncol; c++) {
2912 v1.arr[c][0] = getRow(c)*v;
2917 assert(nrow == m.ncol);
2918 mat m1(ncol, m.nrow);
2920 for(
int r=0; r<nrow; r++) {
2921 m1 = m1 + getVec(r) * m.
getRow(r);
2926 mat mat::operator=(
const mat& m) {
2930 arr = allocate<float>(ncol, nrow);
2931 for(
int c=0; c<ncol; c++) {
2932 for(
int r=0; r<nrow; r++) {
2933 arr[c][r] = m.arr[c][r];
2942 for(
int c=0; c<ncol; c++) {
2943 for(
int r=0; r<nrow; r++) {
2944 m.arr[c][r] = arr[c][r];
2951 assert(ncol == m.ncol);
2952 mat m1(ncol, nrow + m.nrow);
2953 for(
int c=0; c < ncol; c++) {
2954 for(
int r=0; r < nrow + m.nrow; r++) {
2956 m1.arr[c][r] = arr[c][r];
2958 m1.arr[c][r] = m.arr[c][r - nrow];
2973 mat mat::rowMultiScala(
int index,
float f) {
2975 for(
int c=0; c < ncol; c++) {
2976 for(
int r=0; r < nrow; r++) {
2978 m.arr[c][r] = arr[c][r];
2980 m.arr[c][r] = arr[c][r]*f;
2987 mat mat::vecMultiScala(
int index,
float f) {
2989 for(
int c=0; c < ncol; c++) {
2990 for(
int r=0; r < nrow; r++) {
2992 m.arr[c][r] = arr[c][r];
2994 m.arr[c][r] = arr[c][r]*f;
3004 mat mat::swapRow(
int inx1,
int inx2){
3005 assert(0 <= inx1 && inx1 < ncol && 0 <= inx2 && inx2 < ncol);
3006 row r1 = getRow(inx1);
3007 row r2 = getRow(inx2);
3009 for(
int c=0; c < ncol; c++) {
3010 for(
int r=0; r < nrow; r++) {
3012 m.arr[c][r] = r2.arr[0][r];
3013 }
else if(c == inx2){
3014 m.arr[c][r] = r1.arr[0][r];
3016 m.arr[c][r] = arr[c][r];
3023 float row::dot(
vec& v) {
3024 assert(nrow == v.ncol);
3026 for(
int i=0; i<nrow; i++) {
3027 ret += arr[0][i]*v.arr[i][0];
3038 assert(nrow == r.nrow);
3041 for(
int i=0; i<nrow; i++) {
3042 rw.arr[0][i] = arr[0][i] + r.arr[0][i];
3046 row row::operator-(
row& r) {
3047 assert(nrow == r.nrow);
3050 for(
int i=0; i<nrow; i++) {
3051 rw.arr[0][i] = arr[0][i] - r.arr[0][i];
3055 row row::operator/(
float f) {
3057 for(
int i=0; i<nrow; i++) {
3058 rw.arr[0][i] = arr[0][i]/f;
3063 assert(m1.ncol == m2.ncol);
3065 mat m(m1.ncol, m1.nrow + m2.nrow);
3066 for(
int c=0; c < m1.ncol; c++) {
3067 for(
int r=0; r < m1.nrow + m2.nrow; r++) {
3069 m.arr[c][r] = m1.arr[c][r];
3071 m.arr[c][r] = m2.arr[c][r - m1.nrow];
3078 mat identity(
int n) {
3080 for(
int c=0; c<n; c++) {
3081 for(
int r=0; r<n; r++) {
3107 assert(a.ncol == a.nrow && a.nrow == b.ncol);
3110 for(
int c=a.ncol - 1; c >= 0; c--) {
3112 for(
int r= a.nrow - 1; r >=c; r--) {
3114 x.arr[r][0] = (b.arr[c][0] - s)/a.arr[c][r];
3116 s += a.arr[c][r]*x.arr[r][0];
3151 assert(0 <= index && index < m.nrow);
3152 mat im = identity(m.nrow);
3156 for(
int c=m.ncol-1; c > index; c--) {
3157 im.arr[c][index] = - m.arr[c][index]/m.arr[index][index];
3171 mat l = identity(m.ncol);
3172 for(
int r = 0; r < m.nrow - 1; r++) {
3178 return std::make_pair(l, l*m);
3181 mat geneMat(
int ncol,
int nrow,
int init){
3184 for(
int c=0; c<ncol; c++){
3185 for(
int r=0; r<nrow; r++){
3186 m.arr[c][r] = count;
3199 for(
int c=0; c<ncol; c++) {
3200 for(
int r=0; r<nrow; r++) {
3201 m.arr[c][r] =
random(snd - fst) + fst;
3220 const float e1[4] = {1.0f, 0.0f, 0.0f, 0.0f};
3221 const float e2[4] = {0.0f, 1.0f, 0.0f, 0.0f};
3222 const float e3[4] = {0.0f, 0.0f, 1.0f, 0.0f};
3223 const float e4[4] = {0.0f, 0.0f, 0.0f, 1.0f};
3230 column[0] = column[1] = column[2] = column[3] = 0.0f;
3234 this->column[0] = other.column[0];
3235 this->column[1] = other.column[1];
3236 this->column[2] = other.column[2];
3237 this->column[3] = other.column[3];
3240 Vector4(
float x,
float y,
float z,
float w = 1.0f) {
3241 this->column[0] = x;
3242 this->column[1] = y;
3243 this->column[2] = z;
3244 this->column[3] = w;
3246 Vector4(
const float arr[4]) {
3247 this->column[0] = arr[0];
3248 this->column[1] = arr[1];
3249 this->column[2] = arr[2];
3250 this->column[3] = arr[3];
3252 Vector4(
float arr[4]) {
3253 this->column[0] = arr[0];
3254 this->column[1] = arr[1];
3255 this->column[2] = arr[2];
3256 this->column[3] = arr[3];
3258 bool operator==(
const Vector4& rhs) {
3259 bool b0 = column[0] == rhs.column[0];
3260 bool b1 = column[1] == rhs.column[1];
3261 bool b2 = column[2] == rhs.column[2];
3262 bool b3 = column[3] == rhs.column[3];
3263 return (b0 && b1 && b2 && b3);
3265 Vector4& operator=(
const Vector4& rhs) {
3266 this->column[0] = rhs.column[0];
3267 this->column[1] = rhs.column[1];
3268 this->column[2] = rhs.column[2];
3269 this->column[3] = rhs.column[3];
3275 v.column[0] = this->column[0] + rhs.column[0];
3276 v.column[1] = this->column[1] + rhs.column[1];
3277 v.column[2] = this->column[2] + rhs.column[2];
3282 Vector4 operator-(Vector4& rhs) {
3284 v.column[0] = this->column[0] - rhs.column[0];
3285 v.column[1] = this->column[1] - rhs.column[1];
3286 v.column[2] = this->column[2] - rhs.column[2];
3291 Vector4 operator/(
float n) {
3293 v.column[0] = column[0]/n;
3294 v.column[1] = column[1]/n;
3295 v.column[2] = column[2]/n;
3299 float dot(Vector4& rhs) {
3301 v.column[0] = column[0] * rhs.column[0];
3302 v.column[1] = column[1] * rhs.column[1];
3303 v.column[2] = column[2] * rhs.column[2];
3304 v.column[3] = column[3] * rhs.column[3];
3305 return v[0] + v[1] + v[2] + v[3];
3308 float cross(Vector4& rhs) {
3314 float norm = column[0]*column[0] +
3315 column[1]*column[1] +
3316 column[2]*column[2];
3317 float n = sqrtf(norm);
3322 const float& operator[](
int index)
const {
3323 return column[index];
3327 float& operator[](
int index) {
3328 return column[index];
3335 printf(
"x=[%1.2f]\ny=[%1.2f]\nz=[%1.2f]\nw=[%1.2f]\n\n", column[0], column[1], column[2], column[3]);
3344 #if __cplusplus >= 201402 3388 std::pair<string, string> split(
string s,
int inx) {
3389 unsigned long len = s.length();
3390 if(0 <= inx && inx <=
len) {
3391 string prefix = s.substr(0, inx);
3392 string suffix = s.substr(inx,
len);
3393 return make_pair(prefix, suffix);
3394 }
else if(inx < 0) {
3395 return make_pair(
"", s);
3397 return make_pair(s,
"");
3417 template<
typename T,
typename Fun>
3418 static vector<vector<T>> splitWhen(Fun f,
const vector<T>&
vec) {
3419 vector<vector<T>> ret;
3421 for(
auto const& e :
vec) {
3448 string removeIndex(
string s,
int inx) {
3449 std::pair<string, string> p = split(s, inx);
3450 string prefix = p.first;
3451 string suffix = p.second;
3452 string tail = suffix.substr(1, suffix.length());
3453 return prefix + tail;
3459 template<
typename T>
3460 vector<T> removeIndex(vector<T>&
vec,
int inx){
3462 ret.erase(ret.begin() + inx);
3478 template<
typename T>
3479 vector<T> removeIndexRange(vector<T>&
vec,
int fromInx,
int toInx){
3482 for(
int i=toInx; i >= fromInx; i--){
3483 ret.erase(ret.begin() + i);
3496 namespace SpaceMatrix4 {
3508 Matrix4(
const Matrix4& matrix) {
3515 Matrix4(Vector4 v0, Vector4 v1, Vector4 v2, Vector4 v3) {
3521 Matrix4(
float m[16]) {
3522 Vector4 v1({ m[0], m[1], m[2], m[3]});
3523 Vector4 v2({ m[4], m[5], m[6], m[7]});
3524 Vector4 v3({ m[8], m[9], m[10], m[11]});
3525 Vector4 v4({ m[12], m[13], m[14], m[15]});
3531 Matrix4& operator=(
const Matrix4& matrix) {
3539 bool operator==(
const Matrix4& matrix) {
3540 bool b0 =
mat[0] == matrix[0];
3541 bool b1 =
mat[1] == matrix[1];
3542 bool b2 =
mat[2] == matrix[2];
3543 bool b3 =
mat[3] == matrix[3];
3544 return (b0 && b1 && b2 && b3);
3547 const Vector4& operator[](
int index)
const {
3552 Vector4& operator[](
int index) {
3557 m[0] =
mat[0] + rhs[0];
3558 m[1] =
mat[1] + rhs[1];
3559 m[2] =
mat[2] + rhs[2];
3560 m[3] =
mat[3] + rhs[3];
3563 Matrix4 operator-(Matrix4& rhs) {
3565 m[0] =
mat[0] - rhs[0];
3566 m[1] =
mat[1] - rhs[1];
3567 m[2] =
mat[2] - rhs[2];
3568 m[3] =
mat[3] - rhs[3];
3574 Vector4 row0(
mat[0][0],
mat[1][0],
mat[2][0],
mat[3][0]);
3575 Vector4 row1(
mat[0][1],
mat[1][1],
mat[2][1],
mat[3][1]);
3576 Vector4 row2(
mat[0][2],
mat[1][2],
mat[2][2],
mat[3][2]);
3577 Vector4 row3(
mat[0][3],
mat[1][3],
mat[2][3],
mat[3][3]);
3585 cout<<
"["<<row0.dot(vect4)<<
"]"<<std::endl;
3586 cout<<
"["<<row1.dot(vect4)<<
"]"<<std::endl;
3587 cout<<
"["<<row2.dot(vect4)<<
"]"<<std::endl;
3588 cout<<
"["<<row3.dot(vect4)<<
"]"<<std::endl;
3590 Vector4 v(row0.dot(vect4), row1.dot(vect4), row2.dot(vect4), row3.dot(vect4));
3598 m[0] = (*this)*matrix[0];
3599 m[1] = (*this)*matrix[1];
3600 m[2] = (*this)*matrix[2];
3601 m[3] = (*this)*matrix[3];
3606 Matrix4 translate(
float x,
float y,
float z) {
3619 Matrix4 identity() {
3631 printf(
"[%1.2f][%1.2f][%1.2f][%1.2f]\n",
mat[0][0],
mat[1][0],
mat[2][0],
mat[3][0]);
3632 printf(
"[%1.2f][%1.2f][%1.2f][%1.2f]\n",
mat[0][1],
mat[1][1],
mat[2][1],
mat[3][1]);
3633 printf(
"[%1.2f][%1.2f][%1.2f][%1.2f]\n",
mat[0][2],
mat[1][2],
mat[2][2],
mat[3][2]);
3634 printf(
"[%1.2f][%1.2f][%1.2f][%1.2f]\n",
mat[0][3],
mat[1][3],
mat[2][3],
mat[3][3]);
3653 template<
typename T>
3654 T head(vector<T>
vec) {
3655 assert(
vec.size() > 0);
3664 template<
typename T>
3665 T last(vector<T>
vec) {
3666 assert(
vec.size() > 0);
3681 template<
typename T>
3682 static vector<T> reverse(vector<T>
vec) {
3684 for(
auto it=
vec.rbegin(); it !=
vec.rend(); it++)
3701 template<
typename Fun,
typename T>
3702 static vector<T> takeWhile(Fun f, vector<T>
vec) {
3704 for(
auto const& n :
vec) {
3719 template<
typename Fun,
typename T>
3720 static vector<T> dropWhile(Fun f, vector<T>
vec) {
3723 for(
auto const& n :
vec) {
3738 template<
typename T>
3739 static vector<T> tail(vector<T>
vec) {
3741 for(
int i=1; i<
vec.size(); i++) {
3742 v.push_back(
vec.at(i));
3751 template<
typename Fun,
typename T>
3752 static T foldl(Fun f, T acc, vector<T>
vec) {
3755 for(
auto ite =
vec.begin(), end =
vec.end(); end != ite; ite++) {
3756 tmpAcc = f(tmpAcc, *ite);
3771 template<
typename Fun,
typename T>
3772 static T foldr(Fun f, T acc,
const vector<T>&
vec) {
3775 for(
int i=
vec.size() - 1; i >= 0; i--) {
3776 tmpAcc = f(
vec[i], tmpAcc);
3782 static vector<T> init(
const vector<T>&
vec) {
3783 assert(
vec.size() > 0);
3785 for(
int i=0; i <
vec.size() - 1; i++) {
3786 v.push_back(
vec[i]);
3801 template<
typename Fun,
typename T>
3802 static vector<T> map(Fun f, vector<T>
vec) {
3804 for(
auto const& v :
vec) {
3805 vec1.push_back(f(v));
3810 int min(
int a,
int b) {
3811 return a < b ? a : b;
3814 template<
typename Fun,
typename T>
3815 static vector<T> zipWith(Fun f, vector<T> v1, vector<T> v2) {
3817 int len1 = unsignToInt(v1.size());
3818 int len2 = unsignToInt(v2.size());
3819 for(
int i=0; i<min(len1, len2); i++) {
3820 for(
int j=0; j<min(len1, len2); j++) {
3821 vec.push_back(f(v1[i], v2[j]));
3837 template<
typename T>
3838 static vector<T> flat(
const vector<vector<T>>& vec2){
3840 for(
auto& v : vec2){
3855 template<
typename T,
typename Fun>
3856 static vector<T> filter(Fun f,
const vector<T>&
vec) {
3858 for(
auto const& v :
vec) {
3867 static string take(
int n,
string s) {
3868 return s.substr(0, n);
3872 static vector<T> take(
int n,
const vector<T>&
vec) {
3875 for(
auto const& v :
vec) {
3887 static vector<T> drop(
int n, vector<T>
vec) {
3890 for(
auto const& v :
vec) {
3898 template<
typename Fun,
typename T>
3899 static vector<T> mergeSortListLam(Fun f, vector<T> v1, vector<T> v2) {
3906 vector<T> vh1 = take(1, v1);
3907 vector<T> vh2 = take(1, v2);
3908 if (f(vh1.at(0), vh2.at(0))) {
3909 return vh1 + mergeSortListLam(f, tail(v1), v2);
3911 return vh2 + mergeSortListLam(f, v1, tail(v2));
3921 static vector<T> mergeSortList(vector<T> v1, vector<T> v2) {
3928 vector<T> vh1 = take(1, v1);
3929 vector<T> vh2 = take(1, v2);
3930 if (vh1.at(0) < vh2.at(0)) {
3931 return vh1 + mergeSortList(tail(v1), v2);
3933 return vh2 + mergeSortList(v1, tail(v2));
3938 static vector<T> mergeSort(vector<T> v1) {
3940 vector<T> left = take(v1.size()/2, v1);
3941 vector<T> right= drop(v1.size()/2, v1);
3942 vector<T> subl = mergeSort(left);
3943 vector<T> subr = mergeSort(right);
3944 return mergeSortList(subl, subr);
3959 vector<T> interleave(
const vector<T>& v1,
const vector<T>& v2) {
3960 int len1 = v1.size();
3961 int len2 = v2.size();
3963 for(
int i=0; i<std::min(len1, len2); i++) {
3964 vec.push_back(v1[i]);
3965 vec.push_back(v2[i]);
3977 string takeFileName(
string path) {
3981 if(
vec.size() > 0) {
3982 s = Lambda::last(
vec);
4004 string takeDirectory(
string path) {
4006 vector<string> vecDir = Lambda::init(
vec);
4007 vector<string> pathvec;
4008 int len = vecDir.size();
4009 vector<string> vv = interleave(vecDir, repeatVec(
len,
c2s(
"/")));
4010 if(!(Lambda::head(
vec).empty() && vecDir.size() == 1)) {
4011 pathvec = Lambda::init(vv);
4016 return Lambda::foldr([](
auto x,
auto y) {
4018 },
c2s(
""), pathvec);
4028 string takeExtension(
string path) {
4031 if(
vec.size() > 1) {
4033 ret = dot + Lambda::last(
vec);
4048 string join(vector<string>&
vec) {
4049 return trimRight(Lambda::foldr([](
auto& x,
auto&y) {
4054 string joinNewLine(vector<string>
vec) {
4055 return Lambda::foldr([](
auto& x,
auto&y) {
4069 vector<string> readFile(
string fname) {
4070 std::ifstream file(fname);
4071 vector<string> retVec;
4072 if (file.is_open()) {
4074 while(getline(file, line)) {
4075 retVec.push_back(line);
4087 void listDirToFile(
char * path,
char* toFile, vector<string>&
vec) {
4088 DIR * d = opendir(path);
4091 while ((dir = readdir(d)) != NULL) {
4092 if(dir->d_type != DT_DIR) {
4094 sprintf(fpath,
"%s/%s", path, dir->d_name);
4095 vec.push_back(
c2s(fpath));
4096 if(
vec.size() > 1000) {
4097 writeFileAppendVector(
c2s(toFile),
vec);
4100 }
else if(dir -> d_type == DT_DIR && strcmp(dir->d_name,
".")!=0 && strcmp(dir->d_name,
"..")!=0 ) {
4102 sprintf(fpath,
"%s/%s", path, dir->d_name);
4103 listDirToFile(fpath, toFile,
vec);
4114 void listDirToVec(
char * path,
char* toFile, vector<string>&
vec) {
4115 listDirToFile(path, toFile,
vec);
4123 vector<string> recurveDirBoost(
char* dir) {
4124 vector<string> retVec;
4128 if(!exists(p) || !is_directory(p)) {
4129 std::cout << p <<
" is not a path\n";
4133 fs::recursive_directory_iterator begin(p), end;
4134 std::vector<fs::directory_entry> v(begin, end);
4136 retVec.push_back(f.path().string());
4165 void recurveDirToFile(
char * path,
char* toFile, vector<string>&
vec) {
4166 DIR * d = opendir(path);
4169 while ((dir = readdir(d)) != NULL) {
4170 if(dir-> d_type != DT_DIR) {
4172 sprintf(fpath,
"%s/%s", path, dir->d_name);
4173 vec.push_back(
c2s(fpath));
4174 if(
vec.size() > 1000) {
4175 writeFileAppendVector(
c2s(toFile),
vec);
4178 }
else if(dir -> d_type == DT_DIR && strcmp(dir->d_name,
".")!=0 && strcmp(dir->d_name,
"..")!=0 ) {
4180 sprintf(fpath,
"%s/%s", path, dir->d_name);
4181 listDirToFile(fpath, toFile,
vec);
4183 vec.push_back(
"Unknown_type");
4186 if(
vec.size() > 0) {
4187 writeFileAppendVector(
c2s(toFile),
vec);
4199 void listDirAll(
char * path) {
4200 DIR * d = opendir(path);
4203 while ((dir = readdir(d)) != NULL) {
4204 if(dir-> d_type != DT_DIR) {
4206 sprintf(dpath,
"%s/%s", path, dir->d_name);
4207 printf(
"%s\n", dpath);
4208 }
else if(dir -> d_type == DT_DIR && strcmp(dir->d_name,
".")!=0 && strcmp(dir->d_name,
"..")!=0 ) {
4209 printf(
"%s\n", dir->d_name);
4211 sprintf(dpath,
"%s/%s", path, dir->d_name);
4212 printf(
"%s\n", dpath);
4227 void listDirToVector(
char * path, vector<string>&
vec) {
4228 DIR * d = opendir(path);
4231 while ((dir = readdir(d)) != NULL) {
4232 if(dir-> d_type != DT_DIR) {
4233 char fullpath[1000];
4234 sprintf(fullpath,
"%s/%s", path, dir->d_name);
4235 vec.push_back(
c2s(fullpath));
4236 }
else if(dir -> d_type == DT_DIR && strcmp(dir->d_name,
".")!=0 && strcmp(dir->d_name,
"..")!=0 ) {
4237 char fullpath[1000];
4238 sprintf(fullpath,
"%s/%s", path, dir->d_name);
4239 listDirToVector(fullpath,
vec);
4241 vec.push_back(
"Unknown_type");
4252 if (getcwd(cwd,
sizeof(cwd)) != NULL) {
4255 perror(
"getcwd() error");
4264 string intToStringLen(
int num,
int maxlen) {
4266 sprintf(buffer,
"%d", num);
4267 string zero = Lambda::take(maxlen - strlen(buffer), repeat(num,
"0"));
4268 return zero +
c2s(buffer);
4276 std::pair<vector<string>, vector<string>> parseLambda(
string s) {
4278 vector<string>
vec = Lambda::filter([](
auto& x) {
4279 return trim(x).length() > 0;
4282 vector<string> varv;
4283 auto f = [](
auto x) {
4284 return x ==
c2s(
"->");
4286 std::pair<vector<string>, vector<string>> pair =
breakVec(f,
vec);
4287 return std::make_pair(pair.first, Lambda::tail(pair.second));
4298 namespace Algorithm {
4299 using namespace Lambda;
4301 void merge(
int* arr,
int lo,
int mid,
int hi) {
4302 int len = hi - lo + 1;
4303 int* list =
new int[
len];
4307 while(i < mid + 1 || j < hi + 1) {
4311 }
else if(j >= hi + 1) {
4314 }
else if (arr[i] < arr[j]) {
4323 for(
int i=0; i<
len; i++) {
4324 arr[lo + i] = list[i];
4329 void mergeSort(
int* arr,
int lo,
int hi) {
4331 int m = (lo + hi)/2;
4332 mergeSort(arr, lo, m);
4333 mergeSort(arr, m+1, hi);
4334 merge(arr, lo, m, hi);
4339 void swap(
int array[],
int i,
int j) {
4341 array[i] = array[j];
4355 int partition(
int array[],
int lo,
int hi) {
4359 for(
int i=lo; i<=hi; i++) {
4361 swap(array, i, big);
4372 void quickSortArr(
int array[],
int lo,
int hi) {
4375 quickSortArr(array, lo, pivot-1);
4376 quickSortArr(array, pivot+1, hi);
4381 template<
typename T>
4382 static vector<T> quickSort(vector<T>
vec) {
4383 if (
vec.size() <= 1)
4386 T pivot = head(
vec);
4387 vector<T> rest = drop(1,
vec);
4388 vector<T> left = filter<T>([pivot](
auto x) {
4391 vector<T> right = filter<T>([pivot](
auto x) {
4394 return quickSort(left) + con(pivot, quickSort(right));
4398 template<
typename Fun,
typename T>
4399 static vector<T> mergeSortList(Fun f, vector<T> v1, vector<T> v2) {
4406 vector<T> vh1 = take(1, v1);
4407 vector<T> vh2 = take(1, v2);
4408 if (f(vh1.at(0), vh2.at(0))) {
4409 return vh1 + mergeSortList(f, tail(v1), v2);
4411 return vh2 + mergeSortList(f, v1, tail(v2));
4436 void writeFile(
string fname,
mat& m) {
4437 for(
int i=0; i<m.nrow; i++) {
4438 vector<float>
vec = m.
getVec(i).toVector();
4439 writeFileAppendVector(fname,
vec);
vector< string > splitStr(string s, string delim)
Split string with delimiter.
Definition: AronLib.h:286
Inspired from Eigen Lib.
Definition: AronLib.h:2351
T ** vecVecToArrArr(vector< vector< T > > vv)
Convert Vector< Vector<T> > to dynamic T**.
Definition: AronLib.h:2029
bool containStrRegex(string s, regex rx)
check s contains regex pattern
Definition: AronLib.h:256
vector< vector< T > > geneMatrix(int ncol, int nrow, T init)
Generate ncol x nrow matrix with initial value .
Definition: AronLib.h:880
vec getVec(int n)
Definition: AronLib.h:2594
Definition: AronLib.h:2325
Complex(double x_, double y_)
Definition: AronLib.h:1893
bool binSearch(T key, T arr[], int lo, int hi)
binary search on a sorted array
Definition: AronLib.h:796
T partititonInline(vector< T > &vec, int lo, int hi)
partition vector inline
Definition: AronLib.h:975
const char * stringToCString(string s)
Convert std::string to char*, same as s2c(string s)
Definition: AronLib.h:136
std::pair< mat, mat > utri(mat m)
Assume the diagonal entries are not zero, compute the U triangle matrix Lk..(L2 (L1 A))= U TODO: fix ...
Definition: AronLib.h:3167
bool operator==(const Complex &c)
Definition: AronLib.h:1931
vec backwardSubstitute(mat a, vec b)
Backward Substitute.
Definition: AronLib.h:3106
T ** allocateTemp(int ncol, int nrow)
Allocate ncol, nrow two dimension array for any type, return a pointer.
Definition: AronLib.h:2002
vector< vector< T > > arrArrToVecVec(T **arr, int ncol, int nrow)
Convert T** arr to vector<vector<T>> v2.
Definition: AronLib.h:2073
int substringFirstIndex(string sub, string s)
find the index of sub in string s
Definition: AronLib.h:1508
bool isSubstring(string sub, string s)
Check whether sub is the substring of s.
Definition: AronLib.h:1469
mat geneMatRandom(int ncol, int nrow, int fst, int snd)
Generate random matrix in interval from fst to snd.
Definition: AronLib.h:3197
vector< T > replaceVec(T oldVal, T newVal, vector< T > vec)
replace oldVale with newVal in a cloned vector
Definition: AronLib.h:350
int random(int n)
random number from 0 to n-1
Definition: AronLib.h:107
Definition: AronLib.h:1346
string c2s(const char *pt)
string to char*
Definition: AronLib.h:242
double intToDouble(int n)
Definition: AronLib.h:453
Definition: AronLib.h:1202
4 dimensions vector
Definition: AronLib.h:3210
Vector4()
Definition: AronLib.h:3229
Complex rectangular(std::pair< double, double > p)
Definition: AronLib.h:1977
Definition: AronLib.h:1205
vector< std::string > splitStrRegex(const string &s, string rgxStr="\+")
Split string with regex.
Definition: AronLib.h:399
vector< T > operator+(vector< T > v1, vector< T > v2)
Concate two vectors, both vectors are NOT modified.
Definition: AronLib.h:692
vector< vector< T > > transpose(vector< vector< T >> mat)
transpose matrix
Definition: AronLib.h:600
std::pair< vector< T >, vector< T > > breakVec(Fun f, vector< T > vec)
break a vector to pair
Definition: AronLib.h:332
friend Complex operator/(const Complex &c1, const Complex &c2)
division for complex number
Definition: AronLib.h:1956
Complex operator-(Complex &c)
Definition: AronLib.h:1911
int compareString(string s1, string s2)
Definition: AronLib.h:530
Definition: AronLib.h:3217
Definition: AronLib.h:1877
many function can be global actually
int length(string s)
length of string
Definition: AronLib.h:756
Definition: AronLib.h:1279
int compareCString(char *s1, char *s2)
Definition: AronLib.h:522
bool containStr(string str, string pat)
check if str contain pat
Definition: AronLib.h:271
Definition: AronLib.h:1051
int len(string s)
length of string
Definition: AronLib.h:764
Definition: AronLib.h:2111
Definition: AronLib.h:2089
double nthRoot(double c, int n, double epsilon=0.000001)
Compute the nth root of any positive integer, n >= 1.
Definition: AronLib.h:463
void writeFileAppendRow(string fname, std::vector< T > vec)
Write vector to file using space as delimiter.
Definition: AronLib.h:1437
Stop watch.
Definition: AronLib.h:1014
vector< T > * append(vector< T > vec, T a)
use std::move, it acts like Java. Create local object, and return it.
Definition: AronLib.h:744
T ** allocate(int ncol, int nrow)
Allocate a matrix: height = ncol, width = nrow.
Definition: AronLib.h:2016
T partition(vector< T > &vec, int lo, int hi)
partition vector, use [hi] as pivot, like in quicksort
Definition: AronLib.h:936
Definition: AronLib.h:1136
double squareRoot(double a)
Definition: AronLib.h:439
const char * toCharPtr(string s)
it is same as s2c but it is better name.
Definition: AronLib.h:151
Definition: AronLib.h:1208
mat ltri(mat m, int index)
Get the L triangle from a matrix Ref
Definition: AronLib.h:3150
Complex()
Definition: AronLib.h:1886
bool isEmpty(string s)
Definition: AronLib.h:418
void printNb(T t)
print no bracket
Definition: AronLib.h:658
std::pair< vector< T >, vector< T > > splitAt(int n, vector< T > vec)
split vector to pair of vector
Definition: AronLib.h:313
row getRow(int n)
Get an index row from a matrix.
Definition: AronLib.h:2606
vector< T > insertAt(vector< T > vec, int pos, vector< T > insertVec)
Insert vector into vec at position .
Definition: AronLib.h:373
vector< T > * moveVec(T a, vector< T > vec)
use std::move, it acts like Java. Create local object, and return it.
Definition: AronLib.h:721
Complex operator+(Complex &c)
Definition: AronLib.h:1901
vector< T > operator*(T a, vector< T > vec)
scalar multiply vector
Definition: AronLib.h:816
string cStringToString(const char *pt)
char* to string
Definition: AronLib.h:234
const char * s2c(string s)
Convert std::string to char*.
Definition: AronLib.h:144
string toStr(const T &s)
Convert any type to std::string.
Definition: AronLib.h:162
string trim(string str)
trim both ends
Definition: AronLib.h:224
Two dimensional array represents matrix, column and row vector.
Definition: AronLib.h:1992
void print()
Definition: AronLib.h:1967
Complex operator*(const Complex &c)
Definition: AronLib.h:1923
Try to replace pair with two.
Definition: AronLib.h:1645
complex number representation and operation number
Definition: AronLib.h:1665
T partitionT(T array[], int lo, int hi)
partition array inline
Definition: AronLib.h:910
bool compareFloat(double a, double b)
Definition: AronLib.h:537