My Project
AronLib.h
Go to the documentation of this file.
1 #ifndef __AronLib__
2 #define __AronLib__
3 
4 #ifdef __cplus
5 #include <iostream>
6 #include <fstream>
7 #include <sstream>
8 #include <string>
9 #include <cmath>
10 #include <utility> // std::pair, std::make_pair
11 #endif
12 
13 #include <iostream>
14 #include <fstream>
15 #include <sstream>
16 #include <string>
17 #include <cmath>
18 #include <utility> // std::pair, std::make_pair
19 
20 #include <execinfo.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include "Vector3.h"
24 #include "DDLinkedList.h"
25 #include "Const.h"
26 #include <experimental/optional>
27 // #include "/Library/Developer/CommandLineTools/usr/include/c++/v1/experimental/optional"
28 #include <boost/filesystem/operations.hpp>
29 
30 #include <vector>
31 #include </Users/cat/myfile/bitbucket/cpplib/glm/glm/glm.hpp>
32 
33 
34 #include <dirent.h>
35 #include <unistd.h>
36 #include <limits.h>
37 #include <regex>
38 
39 #include <algorithm>
40 #include <cctype>
41 #include <locale>
42 
43 #include <limits> // for std::numeric_limits
44 #include <stdexcept> // for std::overflow_error
45 
46 #include <array> // std::array<int, 2> arr = {1, 2};
47 
48 #ifdef __has_include // Check if __has_include is present
49 # if __has_include(<optional>) // Check for a standard library
50 # include<optional>
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>"
57 # endif
58 #endif
59 
60 
62 
77 //const string S_RED = "\033[1;31m";
78 //const string S_END = "\033[0m";
79 
80 //cout << "\033[1;31mbold red text\033[0m\n";
81 
82 namespace fs = boost::filesystem;
83 
84 using namespace std;
85 
86 
87 template<typename T>
88 void pl(T t);
89 
90 void nl();
91 
92 template<typename T>
93 void swap(vector<T>& vec, int i, int j);
94 
95 int random(int n);
96 
97 void nl(){
98  printf("\n");
99 }
100 
107 int random(int n) {
108  return arc4random_uniform(n);
109 }
110 
111 // print all prime from 2 to n
112 vector<int> allPrime(int n) {
113  vector<int> vec;
114  if(n >= 2) {
115  vec.push_back(2);
116  for(int p=3; p<n; p++) {
117  bool isPrime = true;
118  for(int i=0; i<vec.size() && isPrime; i++) {
119  if(p % vec[i] == 0)
120  isPrime = false;
121  }
122  if(isPrime)
123  vec.push_back(p);
124  }
125  }
126  return vec;
127 }
128 
129 
130 
136 const char* stringToCString(string s) {
137  return s.c_str();
138 }
139 
140 
144 const char* s2c(string s) {
145  return s.c_str();
146 }
147 
151 const char* toCharPtr(string s) {
152  return s2c(s);
153 }
154 
161 template<typename T>
162 string toStr(const T& s) {
163  std::ostringstream out;
164  out<<s;
165  return out.str();
166 }
167 
168 template<typename T, typename U>
169 string toStr(std::pair<T, U> p){
170  string ret = "";
171  ret += "(";
172  ret += toStr(p.first) + " , ";
173  ret += toStr(p.second);
174  ret += ")";
175  return ret;
176 }
177 
178 template<typename T, typename U>
179 string str(std::pair<T, U> p){
180  return toStr(p);
181 }
182 
183 template<typename T>
184 string str(const T& s) {
185  return toStr(s);
186 }
187 
188 template<typename T>
189 string toStr2(T& s) {
190  std::ostringstream out;
191  out<<s;
192  return out.str();
193 }
194 
195 template<typename T>
196 string str2(T& s) {
197  return toStr2(s);
198 }
199 
200 
201 
202 string trimLeft(string str) {
203  string s = str;
204  s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](auto& x) {
205  return !std::isspace(x);
206  }));
207  return s;
208 }
209 
210 string trimRight(string str) {
211  string s = str;
212  s.erase(std::find_if(s.rbegin(), s.rend(), [](auto& x) {
213  return !std::isspace(x);
214  }).base(), s.end());
215  return s;
216 }
217 
224 string trim(string str) {
225  string s = str;
226  return trimRight(trimLeft(s));
227 }
228 
234 string cStringToString(const char* pt) {
235  std::string s(pt);
236  return s;
237 }
238 
242 string c2s(const char* pt) {
243  string s(pt);
244  return s;
245 }
246 
256 bool containStrRegex(string s, regex rx) {
257  smatch m;
258  regex_search(s, m, rx);
259  return m.size() > 0;
260 }
261 
271 bool containStr(string str, string pat) {
272  smatch m;
273  regex rx(pat);
274  regex_search(str, m, rx);
275  return m.size() > 0;
276 }
277 
286 vector<string> splitStr(string s, string delim) {
287  vector<string> vec;
288  auto start = 0U;
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);
294  }
295  vec.push_back(s.substr(start, s.size() - start));
296  return vec;
297 }
298 
299 
312 template<typename T>
313 std::pair<vector<T>, vector<T>> splitAt(int n, vector<T> vec) {
314  vector<T> fstVec;
315  vector<T> sndVec;
316  for(int i=0; i<vec.size(); i++) {
317  if(i < n)
318  fstVec.push_back(vec[i]);
319  else
320  sndVec.push_back(vec[i]);
321  }
322  return std::make_pair(fstVec, sndVec);
323 }
324 
325 
331 template<typename Fun, typename T>
332 std::pair<vector<T>, vector<T>> breakVec(Fun f, vector<T> vec) {
333  bool first = true;
334  vector<T> fstVec;
335  for(int i=0; i<vec.size(); i++) {
336  if(f(vec[i])) {
337  return splitAt(i, vec);
338  }
339  }
340  return std::make_pair(fstVec, vec);
341 }
342 
349 template<typename T>
350 vector<T> replaceVec(T oldVal, T newVal, vector<T> vec) {
351  vector<T> retVec(vec);
352  std::replace(retVec.begin(), retVec.end(), oldVal, newVal);
353  return retVec;
354 }
355 
372 template<typename T>
373 vector<T> insertAt(vector<T> vec, int pos, vector<T> insertVec) {
374  assert(0 <= pos && pos <= vec.size());
375  vector<T> v(vec);
376  typename vector<T>::iterator it = v.begin();
377  advance(it, pos);
378  std::copy (insertVec.begin(),insertVec.end(),std::inserter(v,it));
379  return v;
380 }
381 
382 
383 
399 vector<std::string> splitStrRegex(const string& s, string rgxStr = "\\s+") {
400  vector<std::string> vec;
401  regex rgx (rgxStr);
402 
403  sregex_token_iterator iter(s.begin(), s.end(), rgx, -1);
404  sregex_token_iterator end;
405 
406  while (iter != end) {
407  vec.push_back(*iter);
408  ++iter;
409  }
410  return vec;
411 }
412 
413 
414 
418 bool isEmpty(string s) {
419  return s.empty();
420 }
421 
425 bool isEmpty(const char* cpt) {
426  if(cpt != NULL) {
427  return strlen(cpt) == 0;
428  } else {
429  perror("cpt is NULL");
430  exit(EXIT_FAILURE);
431  }
432  return false;
433 }
434 
439 double squareRoot(double a) {
440  double x0 = a + 1;
441  double x = x0;
442  while(fabs(x*x - a) > 0.00000001) {
443  x = x + (a - x*x)/(2*x);
444  }
445  return x;
446 }
447 
453 double intToDouble(int n) {
454  return static_cast<double>(n);
455 }
456 
463 double nthRoot(double c, int n, double epsilon = 0.000001) {
464 
465  // f(x) = x^{1/2}
466  auto ff = [](auto xx, auto nn, auto cc) {
467  double nb = intToDouble(nn);
468  return pow(xx, nb) - cc;
469  };
470 
471  // The first derivative of f(x)
472  auto df = [](auto xx, auto nn, auto cc) {
473  double bb = intToDouble(nn - 1);
474  return nn*pow(xx, bb);
475  };
476 
477  double b = intToDouble(n);
478  double x = c + 1;
479  while(fabs(pow(x, b) - c) > epsilon) {
480  x = x - ff(x, n, c)/df(x, n, c);
481  }
482  return x;
483 }
484 
485 
486 // KEY: char array to string, char arr to str
487 string charArrToString(const char* pt) {
488  return cStringToString(pt);
489 }
490 
491 
492 // TODO: find a better way to do it
493 // replicate n copy of s
494 string replicate(int n, string s) {
495  string str = "";
496  for(int i=0; i<n; i++) {
497  str += s;
498  }
499  return str;
500 }
501 
502 // TODO: find a better way to do it
503 // repeating n copy of s
504 string repeat(int n, string s) {
505  return replicate(n, s);
506 }
507 
508 template<typename T>
509 vector<T> repeatVec(int n, T t) {
510  vector<T> vec;
511  for(int i=0; i<n; i++) {
512  vec.push_back(t);
513  }
514  return vec;
515 }
516 
517 
522 int compareCString(char* s1, char* s2) {
523  return strcmp(s1, s2);
524 }
525 
530 int compareString(string s1, string s2) {
531  return s1.compare(s2);
532 }
533 
537 bool compareFloat(double a, double b) {
538  double epsilon = 0.00001;
539  return fabs(a-b) < epsilon;
540 }
541 
542 void print(glm::vec3 v3) {
543  printf("%2.3f %2.3f %2.3f \n",v3.x, v3.y, v3.z);
544 }
545 void print(glm::vec2 v2) {
546  printf("%2.3f %2.3f \n",v2.x, v2.y);
547 }
548 
549 void printLn(glm::vec3 v3) {
550  printf("%2.3f %2.3f %2.3f ",v3.x, v3.y, v3.z);
551 }
552 void printLn(glm::vec2 v2) {
553  printf("%2.3f %2.3f ",v2.x, v2.y);
554 }
555 
556 
557 string toString(glm::vec3 v3) {
558  char strPt[50];
559  sprintf(strPt, "%2.3f %2.3f %2.3f", v3.x, v3.y, v3.z);
560  return charArrToString(strPt);
561 }
562 
563 
599 template<typename T>
600 vector<vector<T>> transpose(vector<vector<T>> mat) {
601  vector<vector<T>> retMat;
602  int min = INT_MAX;
603  for(auto const& v : mat) {
604  if(min > v.size())
605  min = v.size();
606  }
607 
608  for(int i=0; i<min; i++) {
609  vector<T> v;
610  for(int k = 0; k < mat.size(); k++) {
611  v.push_back(mat[k][i]);
612  }
613  retMat.push_back(v);
614  }
615  return retMat;
616 }
617 
618 // Compare array, compare int array
619 template<typename T>
620 bool compareArray(T arr1[], T arr2[], const int s1) {
621  for(int i=0; i<s1; i++) {
622  if(arr1[i] != arr2[i])
623  return false;
624  }
625  return true;
626 }
627 
628 template<typename T>
629 void print(std::pair<T, T> pair) {
630  cout<<"("<<pair.first<<" "<<pair.second<<")"<<endl;
631 }
632 
633 template<typename T>
634 void print(vector<T> vec) {
635  for(auto const& v: vec) {
636  std::cout<<"["<<v<<"]";
637  }
638  std::cout<<std::endl;
639 }
640 
641 template<typename T>
642 void print(vector< vector<T> > vec) {
643  for(auto const& v: vec) {
644  print(v);
645  }
646  std::cout<<std::endl;
647 }
648 
649 template<typename T>
650 void print(T t) {
651  std::cout<<"["<<t<<"]";
652 }
653 
657 template<typename T>
658 void printNb(T t) {
659  std::cout<<t;
660 }
661 
662 template<typename T>
663 void printLn(T t) {
664  std::cout<<"["<<t<<"]"<<std::endl;
665 }
666 
667 template<typename T>
668 void printLnNb(T t) {
669  std::cout<<t<<std::endl;
670 }
671 
672 
673 template<typename T>
674 void pl(T t) {
675  print(t);
676  std::cout<<std::endl;
677 }
678 
679 template<typename T>
680 void ppL(T t) {
681  printLn(t);
682 }
683 
684 
685 
691 template<typename T>
692 vector<T> operator+(vector<T> v1, vector<T> v2) {
693  vector<T> vec(v1);
694  vec.insert(vec.end(), v2.begin(), v2.end());
695  return vec;
696 }
697 
698 string operator+(const char* chars, string s) {
699  return charArrToString(chars) + s;
700 }
701 
702 string operator+(string s, const char* chars) {
703  return s + charArrToString(chars);
704 }
705 
706 template<typename T>
707 vector<T> con(T t, vector<T> v) {
708  vector<T> vec;
709  vec.push_back(t);
710  for(auto const& e: v)
711  vec.push_back(e);
712  return vec;
713 }
714 
715 
720 template<typename T>
721 vector<T>* moveVec(T a, vector<T> vec) {
722  vector<T>* pt = new vector<T>();
723  for(auto const& val: vec) {
724  pt -> push_back(val);
725  }
726  pt -> push_back(a);
727  return std::move(pt);
728 }
729 
730 int unsignToInt(size_t u){
731  if(u > std::numeric_limits<int>::max()){
732  throw std::overflow_error("ERROR: size_t > int");
733  }
734  return static_cast<int>(u);
735 }
736 
743 template<typename T>
744 vector<T>* append(vector<T> vec, T a) {
745  vector<T>* pt = new vector<T>();
746  for(auto const& val: vec) {
747  pt -> push_back(val);
748  }
749  pt -> push_back(a);
750  return std::move(pt);
751 }
752 
756 int length(string s){
757  return unsignToInt(s.size());
758 }
759 
760 
764 int len(string s){
765  return length(s);
766 }
767 
771 template<typename T>
772 int length(vector<T> v){
773  return unsignToInt(v.size());
774 }
775 
779 template<typename T>
780 int len(vector<T> v){
781  return length(v);
782 }
783 
795 template<typename T>
796 bool binSearch(T key, T arr[], int lo, int hi){
797  if(lo < hi){
798  int mid = (lo + hi)/2;
799  if(key < arr[mid]){
800  return binSearch(key, arr, lo, mid - 1);
801  }else{
802  return binSearch(key, arr, mid + 1, hi);
803  }
804  }else if(lo == hi){
805  return key == arr[lo];
806  }
807  return false;
808 }
809 
815 template<typename T>
816 vector<T> operator*(T a, vector<T> vec) {
817  vector<T> newVec;
818  for(auto const& value: vec) {
819  newVec.push_back(a*value);
820  }
821  return newVec;
822 }
823 
829 template<typename T>
830 vector<T> operator*(vector<T> vec, T a) {
831  vector<T> newVec;
832  for(auto const& value: vec) {
833  newVec.push_back(a*value);
834  }
835  return newVec;
836 }
837 
838 template<typename T>
839 vector<vector<T>> operator*(T a, vector<vector<T>> vec2) {
840  vector<vector<T>> newVec2;
841  vector<T> vec;
842  for(auto const& vec : vec2) {
843  newVec2.push_back(a*vec);
844  }
845  return newVec2;
846 }
847 
848 template<typename T>
849 vector<vector<T>> operator*(vector<vector<T>> vec2, T a) {
850  return a*vec2;
851 }
852 
853 
854 
855 
856 // Thanks for the default parameter
857 vector<int> range(int a, int b, int stride = 1) {
858  vector<int> vec;
859  for(int i=a; i<=b; i += stride)
860  vec.push_back(i);
861  return vec;
862 }
863 
864 // generate vector double
865 template<typename T>
866 vector<T> geneVector(int a, int b) {
867  int len = b - a;
868  std::vector<T> vec;
869  for(int i=0; i<=len; i++) {
870  vec.push_back(a + i);
871  }
872  return vec;
873 }
874 
879 template<typename T>
880 vector< vector<T> > geneMatrix(int ncol, int nrow, T init) {
881  vector< vector<T> > vv;
882  T val = init;
883  for(int c=0; c<ncol; c++) {
884  vector<T> tv;
885  for(int r=0; r<nrow; r++) {
886  tv.push_back(val);
887  val++;
888  }
889  vv.push_back(tv);
890  }
891  return vv;
892 }
893 
894 
895 // swap array
896 template<typename T>
897 void swapT(T array[], int i, int j) {
898  T tmp = array[i];
899  array[i] = array[j];
900  array[j] = tmp;
901 }
902 
909 template<typename T>
910 T partitionT(T array[], int lo, int hi) {
911  if(hi > lo) {
912  T p = array[hi];
913  T big = lo;
914  for(int i=lo; i<=hi; i++) {
915  if(array[i] <= p) {
916  swapT(array, i, big);
917  if(i < hi)
918  big++;
919  }
920  }
921  return big;
922  }
923  return -1;
924 }
925 
926 
927 // 2 3
928 // i = 0
929 // j=1
930 
935 template<typename T>
936 T partition(vector<T>& vec, int lo, int hi){
937  if(lo < hi){
938  T pivot = vec[hi];
939  vector<T> tmp(hi - lo + 1);
940  int i = lo;
941  int j = hi;
942  for(int k = 0; k < len(vec) && i != j; k++){
943  if(vec[k] < pivot){
944  tmp[i] = vec[k];
945  i++;
946  }else{
947  tmp[j] = vec[k];
948  j--;
949  }
950  }
951  tmp[i] = pivot;
952 
953  for(int k=0; k < len(tmp); k++)
954  vec[lo + k] = tmp[k];
955 
956  return i;
957  }else{
958  return lo;
959  }
960 }
961 
962 
974 template<typename T>
975 T partititonInline(vector<T>& vec, int lo, int hi){
976  int bigInx = lo;
977  if(lo < hi){
978  T pivot = vec[hi];
979  for(int i = lo; i <= hi; i++){
980  if(vec[i] <= pivot){
981  swap(vec, i, bigInx);
982  if(i != hi)
983  bigInx++;
984  }else if(vec[i] > pivot){
985  // vec[i] >= pivot
986  }
987  }
988 
989  }
990  return bigInx;
991 }
992 
993 
994 // squick sort
995 template<typename T>
996 void quickSortT(T array[], int lo, int hi) {
997  if(hi > lo) {
998  T pivot = partitionT(array, lo, hi);
999  quickSortT(array, lo, pivot-1);
1000  quickSortT(array, pivot+1, hi);
1001  }
1002 }
1003 
1004 
1014 class StopWatch {
1015  clock_t startTime = 0;
1016  clock_t endTime = 0;
1017  clock_t diff = 0;
1018 public:
1019  StopWatch() {
1020  startTime = clock();
1021  }
1022 
1023  // Deprecated, use start() instead
1024  void begin() {
1025  startTime = clock();
1026  pl("Start StopWatch()");
1027  }
1028  void start() {
1029  begin();
1030  }
1031  void end() {
1032  endTime = clock();
1033  diff = endTime - startTime;
1034  std::cout<<"Diff=["<<(float)diff/CLOCKS_PER_SEC<<"] Seconds"<<std::endl;
1035  std::cout<<"Tick=["<<diff<<"] ticks"<<std::endl;
1036  }
1037  void print() {
1038  endTime = clock();
1039  diff = endTime - startTime;
1040  std::cout<<"Diff=["<<(float)diff/CLOCKS_PER_SEC<<"] Seconds"<<std::endl;
1041  std::cout<<"Tick=["<<diff<<"] ticks"<<std::endl;
1042  }
1043  void printTicket() {
1044  endTime = clock();
1045  clock_t diff = endTime - startTime;
1046  std::cout<<"Tick=["<<diff<<"] CPU tickets"<<std::endl;
1047  }
1048 };
1049 
1050 
1051 namespace SpacePrint {
1052  void pp(const char* format, ...);
1053  void fl();
1054  void fw(string s);
1055 
1056  template<typename T>
1057  void pp(T t);
1058 
1059  template<typename T>
1060  void pp(T t1, T t2);
1061 
1062  template<typename T>
1063  void pp(T t1, T t2, T t3);
1064 
1065  template<typename T, typename U>
1066  void pp(std::pair<T, U> p);
1067 
1068  void pp(int n);
1069  void pp(float n);
1070  void pp(long n);
1071  void pp(unsigned long n);
1072 
1073 
1074  template<typename T>
1075  void pp(T t) {
1076  print(t);
1077  }
1078 
1079  template<typename T>
1080  void pp(T t1, T t2) {
1081  print(t1);
1082  print(t2);
1083  }
1084 
1085  template<typename T>
1086  void pp(T t1, T t2, T t3) {
1087  print(t1);
1088  print(t2);
1089  print(t3);
1090  }
1091 
1092  template<typename T, typename U>
1093  void pp(std::pair<T, U> p){
1094  pp(toStr(p));
1095  }
1096 
1097  void pp(const char* format, ...) {
1098  printf(format);
1099  }
1100 
1101  void pp(int n) {
1102  printf("[%d]", n);
1103  }
1104 
1105  void pp(float n) {
1106  printf("[%f6]", n);
1107  }
1108 
1109  void pp(long n) {
1110  printf("[%ld]", n);
1111  }
1112  void pp(unsigned long n) {
1113  printf("[%lu]", n);
1114  }
1115 
1116 
1117 
1118  void fl() {
1119  pl("");
1120  printLnNb(repeat(80, "-"));
1121  }
1122  void fl(string s) {
1123  int n = 80;
1124  string s1 = repeat(n/2 - len(s)/2, "-");
1125  string s2 = repeat(n/2 - len(s)/2, "-");
1126  printLnNb(s1 + s + s2);
1127  }
1128  void fw(string s) {
1129  int len = s.length();
1130  int pad = 40 - (len/2);
1131  printLnNb(repeat(pad, "-") + s + repeat(pad, "-"));
1132  }
1133 
1134 } // end SpacePrint
1135 
1136 namespace SpaceTest {
1137 using namespace SpacePrint;
1138 
1139  static void t(double a, double b, string s = "") {
1140  bool ret = compareFloat(a, b);
1141  if(ret)
1142  pp("true => " + s);
1143  else{
1144  pp(a, b);
1145  pp("false => " + s);
1146  }
1147  nl();
1148  }
1149  static void t(int a, int b, string s = "") {
1150  if(a == b)
1151  pp("true => " + s);
1152  else{
1153  pp(a, b);
1154  pp("false => " + s);
1155  }
1156  nl();
1157  }
1158  static void t(long a, long b, string s = "") {
1159  if(a == b)
1160  pp("true => " + s);
1161  else{
1162  pp(a, b);
1163  pp("false => " + s);
1164  }
1165  nl();
1166  }
1167  static void t(bool a, bool b, string s = "") {
1168  if(a == b)
1169  pp("ture => " + s);
1170  else{
1171  pp(a, b);
1172  pp("false => " + s);
1173  }
1174  nl();
1175  }
1176  static void t(string a, string b, string s = "") {
1177  if(a == b)
1178  pp("true => " + s);
1179  else{
1180  pp(a, b);
1181  pp("false => " + s);
1182  }
1183  nl();
1184  }
1185 };
1186 
1187 template<typename T>
1188 void swap(T arr[], int i, int j) {
1189  T tmp = arr[i];
1190  arr[i] = arr[j];
1191  arr[j] = tmp;
1192 }
1193 
1194 template<typename T>
1195 void swap(vector<T>& vec, int i, int j){
1196  T tmp = vec[i];
1197  vec[i] = vec[j];
1198  vec[j] = tmp;
1199 }
1200 
1201 // all the geometry functions here
1202 namespace AronGeometry {
1203 using namespace SpacePrint;
1204 
1205 template<class T = double> class Vector;
1206 
1207 template<class T = double>
1208 class Point {
1209 public:
1210  T x;
1211  T y;
1212  T z;
1213  Point() {
1214  x = 0.0;
1215  y = 0.0;
1216  z = 0.0;
1217  }
1218  Point(T x, T y, T z = 0.0 ) {
1219  this->x = x;
1220  this->y = y;
1221  this->z = z;
1222  }
1223 
1224  friend Point<T> operator+(Point<T> p1, Point<T> p2) {
1225  Point<T> p(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
1226  return p;
1227  }
1228  friend Point<T> operator-(Point<T> p1, Point<T> p2) {
1229  Point<T> p(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
1230  return p;
1231  }
1232  friend Point<T> operator*(double k, Point<T> p) {
1233  Point<T> p1(k*p.x, k*p.y, k*p.z);
1234  return p1;
1235  }
1236  friend Point<T> operator*(Point<T> p, double k) {
1237  return k*p;
1238  }
1239 
1240 
1241 // /*
1242 // vector(p0, p1) = p1 - p0
1243 // */
1244 // // TODO: add test
1245 // Vector<T> operator-(Point<T> p1){
1246 // Point<T> zero(0, 0, 0);
1247 // Point<T> p(p1.x - x, p1.y - y, p1.z - z);
1248 // Vector<T> v(zero, p);
1249 // return v;
1250 // }
1251 
1252 
1253  /*
1254  p1 = p0 + (p1 - p0) = p0 + v
1255  */
1256  // TODO: add test
1258  Point p(x + v.x, y + v.y, z + v.z);
1259  return p;
1260  }
1261  bool operator==(Point p0) {
1262  return x == p0.x && y == p0.y && z == p0.z;
1263  }
1264  bool operator!=(Point p0) {
1265  return x != p0.x || y != p0.y || z != p0.z;
1266  }
1267 };
1268 
1269 
1270 /*
1271  /Library/WebServer/Documents/zsurface/pdf/colinear_point.pdf
1272 
1273  p on segment p1 p2 => return 0
1274  p on one side of segment p1 p2 => return > 0
1275  p on other size of segment p1 p2 => return < 0
1276 */
1277 
1278 template<class T>
1279 class Pair {
1280 public:
1281  Point<T> p0;
1282  Point<T> p1;
1283  Pair(Point<T> p0, Point<T> p1) {
1284  this -> p0 = p0;
1285  this -> p1 = p1;
1286  }
1287 public:
1288  Pair operator+(Pair pair) {
1289  Pair pa(this -> p0 + pair.p0, this -> p1 + pair.p1);
1290  return pa;
1291  }
1292  Pair operator-(Pair pair) {
1293  Pair pa(this -> p0 - pair.p0, this -> p1 - pair.p1);
1294  return pa;
1295  }
1296 };
1297 
1298 
1299 
1300 template<class T>
1301 class Vector {
1302 public:
1303  Point<T> p0; // origin
1304  Point<T> p1;
1305 public:
1306  Vector(Point<T> p0, Point<T> p1) {
1307  this -> p0 = p0;
1308  this -> p1 = p1;
1309  }
1310 
1311  bool isZero() {
1312  return p0 == p1;
1313  }
1314  Vector<T> dir() {
1315  // affine formula
1316  // vector: p0 -> p1 = p1 - p0
1317  return p1 - p0;
1318  }
1319 
1320  // v1 + v1' =
1321  // v1 = p1 - p0
1322  // v1' = p1' - p0'
1323  // v1 + v1' = (p1 - p0) + (p1' - p0')
1324  // Affine axiom:
1325  // there is unique map f such as
1326  // f:(S, V) -> S
1327  // a + v = bf
1328  Vector<T> operator+(Vector<T> v) {
1329  Vector<T> v1(p0 + v.p0, p1, v.p1);
1330  return v1;
1331  }
1332 };
1333 
1334 template<class T = double>
1335 double isColinear3(Point<T> p, Point<T> p1, Point<T> p2) {
1336  // TODO: ignore z for now
1337  return (p2.y - p.y)*(p2.x - p1.x) - (p2.x - p.x)*(p2.y - p1.y);
1338 }
1339 template<class T = double>
1340 bool isCrossSegment(Point<T> p0, Point<T> p1) {
1341  bool ret = false;
1342  return ret;
1343 }
1344 
1345 template<class T = double>
1346 class Segment {
1347 public:
1348  Point<T> p0;
1349  Point<T> p1;
1350 public:
1351  /*
1352  Segment definition:
1353  1. p0 != p2
1354  */
1355  Segment(Point<T> p0, Point<T> p1) {
1356  if(p0 != p1) {
1357  this -> p0 = p0;
1358  this -> p1 = p1;
1359  } else {
1360  pp("some error");
1361  }
1362  }
1363 
1364  double squareDist() {
1365  double d = (p1.x - p0.x)*(p1.x - p0.x) +
1366  (p1.y - p0.y)*(p1.y - p0.y);
1367  return d;
1368  }
1369  double distance() {
1370  double d = (p1.x - p0.x)*(p1.x - p0.x) +
1371  (p1.y - p0.y)*(p1.y - p0.y);
1372  return sqrt(d);
1373  }
1374  bool isColinear(Point<T> p) {
1375  return isColinear3(p, p0, p1) == 0;
1376  }
1377 
1378  /*
1379  1. If two segment are the same, return false
1380  2. If one end point of segment on other segment, return true
1381  3.
1382  */
1383  bool isCrossSegment(Segment<T> s1, Segment<T> s2) {
1384  return true;
1385  }
1386  bool isEndPoint(Point<T> p) {
1387  return p == p0 || p == p1;
1388  }
1389  bool operator==(Segment<T> s) {
1390  return (p0 == s.p0 && p1 = s.p1) || (p1 = s.p0 && p0 == s.p1);
1391  }
1392 };
1393 
1394 }
1395 
1396 
1397 
1398 void writeFile(string fname, string s) {
1399  ofstream ofs;
1400  ofs.open(fname, std::ofstream::out);
1401  ofs<<s;
1402  ofs.close();
1403 }
1404 void writeFileAppend(string fname, string s) {
1405  ofstream ofs;
1406  ofs.open(fname, std::ofstream::out | std::ofstream::app);
1407  ofs<<s;
1408  ofs.close();
1409 }
1410 
1411 template<typename T>
1412 void writeFileVector(string fname, std::vector<T> vec) {
1413  ofstream ofs;
1414  ofs.open (fname, std::ofstream::out);
1415  for(T s : vec) {
1416  ofs<<s<<std::endl;
1417  }
1418  ofs.close();
1419 }
1420 
1421 template<typename T>
1422 void writeFileAppendVector(string fname, std::vector<T> vec) {
1423  ofstream ofs;
1424  ofs.open (fname, std::ofstream::out | std::ofstream::app);
1425  for(T s : vec) {
1426  ofs<<s<<std::endl;
1427  }
1428  ofs.close();
1429 }
1430 
1436 template<typename T>
1437 void writeFileAppendRow(string fname, std::vector<T> vec) {
1438  ofstream ofs;
1439  ofs.open (fname, std::ofstream::out | std::ofstream::app);
1440  for(T s : vec) {
1441  ofs<<s<<" ";
1442  }
1443  ofs.close();
1444 }
1445 
1446 
1447 
1454 namespace Utility {
1455 using namespace SpacePrint;
1456 
1457 // void fl();
1458 
1469 bool isSubstring(string sub, string s){
1470  bool ret = false;
1471  if(isEmpty(sub)){
1472  // sub.length() == 0
1473  ret = true;
1474  }else if(sub.length() > 0 && sub.length() <= s.length()){
1475  // sub.length() > 0
1476  //
1477  // abcd
1478  // bc
1479  // bc
1480  int j = 0;
1481  int count = 0;
1482  for(int i=0; i < s.length() && ret == false; i++){
1483  count = 0;
1484  j = 0;
1485  while(j < sub.length() && i + count < s.length() && sub[j] == s[i + count]){
1486  j++;
1487  count++;
1488  if(count == sub.length()){
1489  ret = true;
1490  break;
1491  }
1492  }
1493  }
1494  }
1495  return ret;
1496 }
1497 
1508 int substringFirstIndex(string sub, string s){
1509  int ret = -1;
1510  if(isEmpty(sub)){
1511  // sub.length() == 0
1512  }else if(sub.length() > 0 && sub.length() <= s.length()){
1513  // sub.length() > 0
1514  //
1515  // abcd
1516  // bc
1517  // bc
1518  int j = 0;
1519  int count = 0;
1520  for(int i=0; i < s.length() && ret == -1; i++){
1521  count = 0;
1522  j = 0;
1523  while(j < sub.length() && i + count < s.length() && sub[j] == s[i + count]){
1524  j++;
1525  count++;
1526  if(count == sub.length()){
1527  ret = i;
1528  break;
1529  }
1530  }
1531  }
1532  }
1533  return ret;
1534 }
1535 
1536 // string to int
1537 int strToInt(string s);
1538 
1539 string fun_parent_parent();
1540 void cut(char* pt);
1541 
1542 int stringToInt(string s) {
1543  return strToInt(s);
1544 }
1545 
1546 int strToInt(string s) {
1547  return stoi(s);
1548 }
1549 
1550 // KEY: string to double
1551 double stringToDouble(std::string s) {
1552  return stod(s);
1553 }
1554 
1555 // KEY string to long
1556 long stringToLong(std::string s) {
1557  return stol(s);
1558 }
1559 
1560 // KEY string to float
1561 float stringToFloat(std::string s) {
1562  return stof(s);
1563 }
1564 
1565 // KEY char to string
1566 string charToString(char ch) {
1567  string s;
1568  s.push_back(ch);
1569  return s;
1570 }
1571 
1572 void begin() {
1573  int sz = 80;
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);
1577 }
1578 
1579 void begin(const char* name) {
1580  int sz = 80;
1581  printf ("[%s%.*s]\n", name, (sz < strlen(name)) ? 0 : (int)(sz - strlen(name)), PAD);
1582 }
1583 
1584 void end() {
1585  fl();
1586 }
1587 
1588 void cut(char* pt) {
1589  int k = strlen(pt) - 1;
1590  while(k >= 0 && pt[k] != 'v') k--;
1591 
1592  k >= 0 ? pt[k] = 0 : printf("Error: invalid string format.");
1593 }
1594 
1595 // get the name of parent function, get the name of caller function
1596 string fun_parent() {
1597  void *array[10];
1598  size_t size;
1599  char **strings;
1600 
1601  size = backtrace (array, 10);
1602  strings = backtrace_symbols (array, size);
1603 
1604  cut(strings[1]);
1605  string str = std::string(strings[1] + 62);
1606  free(strings);
1607  return str;
1608 }
1609 
1610 // get name of caller of caller function, get the name of parent of parent function
1611 string fun_parent_parent() {
1612  void *array[10];
1613  size_t size;
1614  char **strings;
1615 
1616  size = backtrace (array, 10);
1617  strings = backtrace_symbols (array, size);
1618 
1619  cut(strings[2]);
1620  string str = std::string(strings[2] + 62);
1621  free (strings);
1622  return str;
1623 }
1624 
1625 
1626 void print(Vector3 v) {
1627  v.print();
1628 }
1629 
1630 void print(DDLinkedList<Vector3>* ddl) {
1631  Node<Vector3>* curr = ddl->head;
1632  while(curr) {
1633  curr->data.print();
1634  curr = curr->next;
1635  }
1636 }
1637 
1644 template<typename T = int, typename U = int>
1645 class two{
1646  public:
1647  T first;
1648  // T& fst = 0;
1649  U second;
1650  two(){
1651  // fst = 0;
1652  }
1653  two(T first, U second) {
1654  this -> first = first;
1655  this -> second = second;
1656  }
1657  public:
1658  string toStr(){
1659  string str = "(" + toStr2(first) + " " + toStr2(second) + ")";
1660  return str;
1661  }
1662 };
1663 
1664 
1665 }; // end class Utility
1666 
1667 
1668 
1669 
1670 // TODO: delete it
1671 //namespace SpaceDraw {
1672 //class Cube {
1673 //public:
1674 // float x = 1.0f;
1675 // float y;
1676 // float z;
1677 // float r;
1678 //
1679 // GLfloat vertices[108] = { 1, 1, 1, -1, 1, 1, -1,-1, 1, // v0-v1-v2 (front)
1680 // -1,-1, 1, 1,-1, 1, 1, 1, 1, // v2-v3-v0
1681 //
1682 // 1, 1, 1, 1,-1, 1, 1,-1,-1, // v0-v3-v4 (right)
1683 // 1,-1,-1, 1, 1,-1, 1, 1, 1, // v4-v5-v0
1684 //
1685 // 1, 1, 1, 1, 1,-1, -1, 1,-1, // v0-v5-v6 (top)
1686 // -1, 1,-1, -1, 1, 1, 1, 1, 1, // v6-v1-v0
1687 //
1688 // -1, 1, 1, -1, 1,-1, -1,-1,-1, // v1-v6-v7 (left)
1689 // -1,-1,-1, -1,-1, 1, -1, 1, 1, // v7-v2-v1
1690 //
1691 // -1,-1,-1, 1,-1,-1, 1,-1, 1, // v7-v4-v3 (bottom)
1692 // 1,-1, 1, -1,-1, 1, -1,-1,-1, // v3-v2-v7
1693 //
1694 // 1,-1,-1, -1,-1,-1, -1, 1,-1, // v4-v7-v6 (back)
1695 // -1, 1,-1, 1, 1,-1, 1,-1,-1
1696 // }; // v6-v5-v4
1697 //
1698 // Cube() {
1699 // }
1700 // Cube(float x1, float y1, float z1, float r1=1.0) {
1701 // x = x1;
1702 // y = y1;
1703 // z = z1;
1704 // r = r1;
1705 // }
1706 //
1707 // void draw() {
1708 // glEnable(GL_DEPTH_TEST);
1709 // glLightfv(GL_LIGHT0, GL_DIFFUSE, WHITE);
1710 // glLightfv(GL_LIGHT0, GL_SPECULAR, RED);
1711 // glMaterialfv(GL_FRONT, GL_SPECULAR, MAGENTA);
1712 // glMaterialf(GL_FRONT, GL_SHININESS, 10);
1713 // glEnable(GL_LIGHTING);
1714 // glEnable(GL_LIGHT0);
1715 //
1716 // GLfloat lightPosition[] = {4, 3, 7, 1};
1717 // glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
1718 // glNormal3d(0, 1, 0);
1719 // // enble and specify pointers to vertex arrays
1720 // glEnableClientState(GL_VERTEX_ARRAY);
1721 // glVertexPointer(3, GL_FLOAT, 0, vertices);
1722 // glPushMatrix();
1723 // glDrawArrays(GL_TRIANGLES, 0, 36);
1724 //
1725 // glPopMatrix();
1726 // glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
1727 // }
1728 //}; // end class Clube
1729 //
1730 // TODO: delete it
1731 //class SimpleCoordinate {
1732 //public:
1733 // SimpleCoordinate() {
1734 // }
1735 //public:
1736 // void draw(float width = 1.0, int num=10) {
1737 // glBegin(GL_LINES);
1738 // float delta = width/num;
1739 // glColor3f(0.0f, width, 0.0f);
1740 // for(int i=-num; i<=num; i++) {
1741 // glVertex3f(-width, 0.0f, delta*i);
1742 // glVertex3f(width, 0.0f, delta*i);
1743 // }
1744 //
1745 // glColor3f(0.3f,0.7f,0.0f);
1746 // for(int i=-num; i<=num; i++) {
1747 // glVertex3f(-width, delta*i, 0.0f);
1748 // glVertex3f(width, delta*i, 0.0f);
1749 // }
1750 //
1751 // glColor3f(width, 0.0f,0.0f);
1752 // for(int i=-num; i<=num; i++) {
1753 // glVertex3f(0.0f, -width, delta*i);
1754 // glVertex3f(0.0f, width, delta*i);
1755 // }
1756 //
1757 // glColor3f(0.4f, 0.4f,0.1f);
1758 // for(int i=-num; i<=num; i++) {
1759 // glVertex3f(delta*i, -width, 0.0f);
1760 // glVertex3f(delta*i, width, 0.0f);
1761 // }
1762 //
1763 // glColor3f(0.0f, 0.0f, width);
1764 // for(int i=-num; i<=num; i++) {
1765 // glVertex3f(delta*i, 0.0f, -width);
1766 // glVertex3f(delta*i, 0.0f, width);
1767 // }
1768 //
1769 // glColor3f(0.0f, 0.5f, 0.5f);
1770 // for(int i=-num; i<=num; i++) {
1771 // glVertex3f(0.0f, delta*i, -width);
1772 // glVertex3f(0.0f, delta*i, width);
1773 // }
1774 // glEnd();
1775 // }
1776 //
1777 //}; // end class SimpleCoordinate
1778 
1779 // TODO: delete it
1780 //class Plane {
1781 //public:
1782 // float x;
1783 // float y;
1784 // Plane(int x_ = 1.0f, int y_ = 1.0f) {
1785 // x = x_;
1786 // y = y_;
1787 // }
1788 // // draw x-y plane
1789 // void draw() {
1790 // float alpha = 0.5;
1791 // glBegin(GL_QUADS);
1792 // glColor4f(x, 0.0, 0.0, alpha);
1793 // glVertex3f(-x, +y, 0.0); // top left
1794 //
1795 // glColor4f(0.0, y, 0.0, alpha);
1796 // glVertex3f(-x, -y, 0.0); // bottom left
1797 //
1798 // glColor4f(0.0, 0.0, 1.0, alpha);
1799 // glVertex3f(+x, -y, 0.0); // bottom right
1800 //
1801 // glColor4f(0.0, y, 1.0, alpha);
1802 // glVertex3f(+x, +y, 0.0); // top right
1803 // glEnd();
1804 // }
1805 //}; // end class Plane
1806 //
1807 
1808 //TODO: delete it
1809 //class Circle {
1810 // int numc;
1811 // double twopi;
1812 // double cx;
1813 // double cy;
1814 // double x;
1815 // double y;
1816 // double radius;
1817 // double beta = 0.0;
1818 //public:
1819 // Circle(double cx, double cy) {
1820 // twopi = 2 * (double)M_PI;
1821 // this->cx = cx;
1822 // this->cy = cy;
1823 // numc = 10;
1824 // radius = 2;
1825 // beta = twopi/numc;
1826 // }
1827 //
1828 // Circle(double cx, double cy, int numc) {
1829 // twopi = 2 * (double)M_PI;
1830 // this->numc = numc;
1831 // this->cx = cx;
1832 // this->cy = cy;
1833 // numc = 10;
1834 // radius = 2;
1835 // beta = twopi/this->numc;
1836 // }
1837 //
1838 // Circle(double cx, double cy, double radius, int numc) {
1839 // twopi = 2 * (double)M_PI;
1840 // this->numc = numc;
1841 // this->cx = cx;
1842 // this->cy = cy;
1843 // numc = 10;
1844 // this->radius = radius;
1845 // beta = twopi/this->numc;
1846 // }
1847 // void move(double mx, double my, double mz) {
1848 // cx = mx;
1849 // cy = my;
1850 // }
1851 // void draw() {
1852 // GLfloat lightPosition[] = {4, 3, 7, 1};
1853 // glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
1854 // glBegin(GL_LINE_STRIP);
1855 // glNormal3d(0, 1, 0);
1856 //
1857 // for (int i = 0; i <= numc; i++) {
1858 // glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
1859 // i % 2 == 0 ? GREEN : MAGENTA);
1860 // x = radius*cos(beta*i);
1861 // y = radius*sin(beta*i);
1862 // glVertex3f(x + cx, y + cy, 0);
1863 // }
1864 // glEnd();
1865 // }
1866 //};
1867 //}; // end namespace PlaneSpaceDraw
1868 //
1869 
1870 
1877 namespace SpaceComplex {
1878 class Complex {
1879 public:
1880  double x;
1881  double y;
1882 
1887  x = 0.0;
1888  y = 0.0;
1889  }
1893  Complex(double x_, double y_) {
1894  x = x_;
1895  y = y_;
1896  }
1897 
1902  Complex co;
1903  co.x = x + c.x;
1904  co.y = y + c.y;
1905  return co;
1906  }
1907 
1912  Complex co;
1913  co.x = x - c.x;
1914  co.y = y - c.y;
1915  return co;
1916  }
1924  Complex c1(x*c.x - y*c.y, x*c.y + y*c.x);
1925  return c1;
1926  }
1927 
1931  bool operator==(const Complex& c) {
1932  return x == c.x && y == c.y;
1933  }
1934  Complex conjugate() {
1935  Complex c1(x, -y);
1936  return c1;
1937  }
1938 
1939  double norm(Complex& c) {
1940  return sqrt(c.x*c.x + c.y*c.y);
1941  }
1942 
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);
1947  return pair;
1948  }
1949 
1950 
1956  friend Complex operator/(const Complex& c1, const Complex& c2) {
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);
1959  Complex c(xx, yy);
1960  return c;
1961  }
1962 
1963 
1967  void print() {
1968  printf("[%1.2f][%1.2f]\n", x, y);
1969  }
1970 };
1971 
1977 Complex rectangular(std::pair<double, double> p) {
1978  Complex c( p.first*cos(p.second), p.first*sin(p.second) );
1979  return c;
1980 }
1981 
1982 
1983 
1984 };
1985 
1992 namespace MatrixVector {
1993 class row;
1994 class mat;
1995 
2001 template<typename T>
2002 T** allocateTemp(int ncol, int nrow) {
2003  T** arr = (T**)new T*[ncol];
2004  for(int c = 0; c < ncol; c++)
2005  arr[c] = (T*) new T[nrow];
2006  return arr;
2007 }
2008 
2015 template<typename T>
2016 T** allocate(int ncol, int nrow) {
2017  T** arr = (T**)new T*[ncol];
2018  for(int c = 0; c < ncol; c++)
2019  arr[c] = (T*) new T[nrow];
2020  return arr;
2021 }
2022 
2028 template<typename T>
2029 T** vecVecToArrArr(vector< vector<T> > vv) {
2030  int ncol = vv.size();
2031  assert(ncol > 0);
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];
2037  }
2038  }
2039  return arr;
2040 }
2041 
2072 template<typename T>
2073 vector< vector<T> > arrArrToVecVec(T** arr, int ncol, int nrow) {
2074  vector< vector<T> > v;
2075  for(int c=0; c<ncol; c++) {
2076  vector<T> v1;
2077  for(int r=0; r<nrow; r++) {
2078  v1.push_back(arr[c][r]);
2079  }
2080  v.push_back(v1);
2081  }
2082  return v;
2083 }
2084 
2085 
2086 
2087 mat concat(mat m1, mat m2);
2088 
2089 class vec {
2090 public:
2091  int nrow;
2092  int ncol;
2093  float **arr;
2094  vec();
2095  vec(int r, int c);
2096  vec(const vec &v);
2097  ~vec();
2098  vec operator+(vec v);
2099  bool operator==(const vec &v);
2100  vec& operator=(const vec &v);
2101  vec operator-(vec &v);
2102  mat operator*(row r);
2103  mat toMatrix();
2104  void print();
2105  row tran();
2106  mat multi();
2107  void createVec(float* arr, int len);
2108  vector<float> toVector();
2109 };
2110 
2111 class row {
2112 public:
2113  int ncol;
2114  int nrow;
2115  float** arr;
2116 public:
2117  row();
2118  ~row();
2119  vec tran();
2120  float dot(vec& r);
2121  row(int row);
2122  row(const vector<float>& vec);
2123  row(int col, int row);
2124  row(const row& r);
2125  void createRow(float* array, int len);
2126  bool operator==(const row& v);
2127  row operator=(const row& r);
2128  float operator*(vec& v);
2129  row operator+(row& r);
2130  row operator-(row& r);
2131  row operator/(float f);
2132  vector<float> toVector();
2133 
2134  void print();
2135 };
2136 
2137 vec::vec() {}
2138 
2139 // copy constructor
2140 vec::vec(const vec& v) {
2141  ncol = v.ncol;
2142  nrow = v.nrow;
2143  arr = allocate<float>(ncol, nrow);
2144  for(int i=0; i<ncol; i++)
2145  arr[i][0] = v.arr[i][0];
2146 }
2147 
2151 vec::vec(int col, int row=1) {
2152  ncol = col;
2153  nrow = row;
2154  arr = allocate<float>(ncol, nrow);
2155 }
2156 vec::~vec() {
2157  for(int i=0; i<ncol; i++) {
2158  if(arr[i] != NULL)
2159  delete[] arr[i];
2160  }
2161  if(arr != NULL)
2162  delete[] arr;
2163 }
2164 
2165 vector<float> vec::toVector() {
2166  vector<float> vec;
2167  for(int i=0; i<ncol; i++) {
2168  vec.push_back(arr[i][0]);
2169  }
2170  return vec;
2171 }
2172 vec vec::operator+(vec v) {
2173  assert(ncol == v.ncol);
2174  vec* v1 = new vec(ncol);
2175  for(int i=0; i<ncol; i++)
2176  v1->arr[i][0] = arr[i][0] + v.arr[i][0];
2177 
2178  return *v1;
2179 }
2180 
2181 vec vec::operator-(vec& v) {
2182  assert(ncol == v.ncol);
2183  vec* v1 = new vec(ncol);
2184  for(int i=0; i<ncol; i++)
2185  v1->arr[i][0] = arr[i][0] - v.arr[i][0];
2186 
2187  return *v1;
2188 }
2189 
2190 
2191 bool vec::operator==(const vec& v) {
2192  bool ret = true;
2193  for(int i=0; i<ncol && ret; i++) {
2194  ret = arr[i][0] == v.arr[i][0];
2195  }
2196  return ret;
2197 }
2198 
2199 // return reference for chaining. e.g. (a = (b = c))
2200 vec& vec::operator=(const vec& v) {
2201  assert(ncol == v.ncol);
2202  // same object?
2203  if (this != &v) {
2204  arr = allocate<float>(v.ncol, v.nrow);
2205  for(int i=0; i<ncol; i++) {
2206  arr[i][0] = v.arr[i][0];
2207  }
2208  }
2209  return *this;
2210 }
2211 
2212 void vec::createVec(float* array, int len) {
2213  for(int i=0; i<len; i++) {
2214  arr[i][0] = array[i];
2215  }
2216 }
2217 void vec::print() {
2218  for(int i=0; i<ncol; i++) {
2219  cout<<arr[i][0]<<std::endl;
2220  }
2221 }
2222 
2223 row::row() {
2224 }
2225 row::row(int col, int row) {
2226  ncol = col;
2227  nrow = row;
2228  arr = allocate<float>(ncol, nrow);
2229 }
2230 row::row(int row) {
2231  ncol = 1;
2232  nrow = row;
2233  arr = allocate<float>(ncol, nrow);
2234 }
2235 row::row(const vector<float>& vec) {
2236  ncol = 1;
2237  nrow = (int)vec.size();
2238  arr = allocate<float>(ncol, nrow);
2239  for(int i=0; i<nrow; i++) {
2240  arr[0][i] = vec[i];
2241  }
2242 }
2243 row::~row() {
2244  for(int i=0; i<ncol; i++) {
2245  if(arr[i] != NULL)
2246  delete[] arr[i];
2247  }
2248  if(arr != NULL)
2249  delete[] arr;
2250 }
2251 // copy constructor
2252 row::row(const row& rw) {
2253  ncol = rw.ncol;
2254  nrow = rw.nrow;
2255  arr = allocate<float>(ncol, nrow);
2256  for(int r=0; r<nrow; r++) {
2257  arr[0][r] = rw.arr[0][r];
2258  }
2259 }
2260 
2261 row vec::tran() {
2262  row rw(nrow, ncol);
2263  for(int i=0; i<nrow; i++) {
2264  for(int j=0; j<ncol; j++) {
2265  rw.arr[i][j] = arr[j][i];
2266  }
2267  }
2268  return rw;
2269 }
2270 
2271 vec row::tran() {
2272  vec v = vec(nrow, ncol);
2273  for(int i=0; i<ncol; i++) {
2274  for(int j=0; j<nrow; j++) {
2275  v.arr[j][i] = arr[i][j];
2276  }
2277  }
2278  return v;
2279 }
2280 
2285 vector<float> row::toVector() {
2286  vector<float> vec;
2287  for(int i=0; i<nrow; i++) {
2288  vec.push_back(arr[0][i]);
2289  }
2290  return vec;
2291 }
2292 void row::print() {
2293  for(int i=0; i<nrow; i++) {
2294  cout<<arr[0][i]<<" ";
2295  }
2296  cout<<endl;
2297 }
2298 
2299 
2300 bool row::operator==(const row& r) {
2301  assert(nrow == r.nrow);
2302  bool ret = true;
2303  for(int i=0; i<nrow && ret; i++) {
2304  ret = arr[0][i] == r.arr[0][i];
2305  }
2306  return ret;
2307 }
2308 
2309 row row::operator=(const row& r) {
2310  ncol = r.ncol;
2311  nrow = r.nrow;
2312  arr = allocate<float>(ncol, nrow);
2313  for(int i=0; i<nrow; i++) {
2314  arr[0][i] = r.arr[0][i];
2315  }
2316  return *this;
2317 }
2318 
2319 void row::createRow(float* array, int len) {
2320  for(int i=0; i<len; i++) {
2321  arr[0][i] = array[i];
2322  }
2323 }
2324 
2325 class mat {
2326 public:
2327  int ncol;
2328  int nrow;
2329  float** arr;
2330  mat();
2331 
2332  // copy constructor
2333  // called: mat m = m1 + m2;
2334  // mat m(ncol, nrow);
2335  mat(const mat& m);
2336  ~mat();
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);
2340 
2351  class Loader{
2352  public:
2353  mat& m;
2354  int ix;
2355  Loader(mat& m, int ix) : m(m), ix(ix) {}
2356  Loader operator , (float x){
2357  assert(ix < m.ncol * m.nrow);
2358 
2359  int u = ix / m.nrow;
2360  int v = ix % m.nrow;
2361  m.arr[u][v] = x;
2362  return Loader(m, ix + 1);
2363  }
2364  };
2365  Loader operator << (float x){
2366  assert(ncol > 0 && nrow > 0);
2367  arr[0][0] = x;
2368  return Loader(*this, 1);
2369  }
2370 
2371  vec getVec(int n);
2372  row getRow(int n);
2373  vec operator*(vec& v);
2374  mat operator*(mat& m);
2375  mat operator=(const mat& m);
2376  bool operator==(const mat& m);
2377  mat operator+(mat m);
2378  mat operator-(const mat& m);
2379  mat operator/(float f);
2380  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);
2385  mat clone();
2386  mat concat(mat m);
2387 
2388 
2389  mat rowMultiScala(int index, float f);
2390  mat vecMultiScala(int index, float f);
2391  mat swapRow(int inx1, int inx2);
2392 
2393  // TODO: move to as normal functions
2394  void geneMat(int init);
2395 
2396  // TODO: the method should be removed, there is geneMatRandom(int ncol, nrow, int fst, int snd)
2397  void geneMatRandom(int fst, int snd);
2398 
2399  void print();
2400  string toStr();
2401  void print2();
2402  void zero();
2403  void identity();
2404  // check if the matrix is an identity matrix
2405  bool isId();
2406  // check if the matrix is zero matrix
2407  bool isZero();
2408  float det();
2409 
2410  mat id();
2411 
2418  mat subMatrix(int colIndex, int rowIndex);
2419 
2425  mat transpose();
2426 
2427  /*
2428  1 2 3 block(1, 1, 1, 2) => 5 6
2429  4 5 6
2430  */
2431  mat block(int colIndex, int clen, int rowIndex, int rlen);
2432  mat take(int len);
2433  mat drop(int len);
2434  mat init();
2435  mat tail();
2436 // mat addVecAfter(int index, float f);
2437 // mat rowAdd(int index, float f);
2438 // mat rowSub(int index, float f);
2439 // mat vecSub(int index, float f);
2440 // mat subVec(int index, vec v);
2441 // mat subRow(int index, row r);
2442 // mat upperTri();
2443 // mat lowerTri();
2444 // bool isSymmetric();
2445 // float trace();
2446 // mat subMatrix(int col, int row);
2447 
2448 };
2449 
2450 mat::mat() {
2451  ncol = 0;
2452  nrow = 0;
2453  arr = NULL;
2454  cout<<"empty matrix";
2455 }
2456 void mat::zero() {
2457  for(int c=0; c<ncol; c++) {
2458  for(int r=0; r<nrow; r++) {
2459  arr[c][r] = 0;
2460  }
2461  }
2462 }
2463 
2464 mat mat::id() {
2465  assert(ncol == nrow);
2466  mat m(nrow, ncol);
2467  m.identity();
2468  return m;
2469 }
2470 
2471 // identity matrix
2472 void mat::identity() {
2473  assert(ncol == nrow);
2474  for(int c=0; c<ncol; c++) {
2475  for(int r=0; r<nrow; r++) {
2476  if( c == r)
2477  arr[c][r] = 1;
2478  else
2479  arr[c][r] = 0;
2480  }
2481  }
2482 }
2483 
2484 // m1 = [[1, 2],
2485 // [3, 4]]
2486 // m2 = [[1, 0],
2487 // [0, 1]]
2488 // m = concat(m1, m2)
2489 // m = [[1, 2, 1, 0],
2490 // [3, 4, 0, 1]]
2491 mat::mat(const mat& m) {
2492  ncol = m.ncol;
2493  nrow = m.nrow;
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];
2498  }
2499  }
2500 }
2501 mat::mat(int col, int row) {
2502  ncol = col;
2503  nrow = row;
2504  arr = allocate<float>(ncol, nrow);
2505 }
2506 mat::mat(vector<vector<float>> v2){
2507  assert(v2.size() > 0 && v2[0].size() > 0);
2508  ncol = v2.size();
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];
2514  }
2515 }
2516 mat::mat(int col, int row, vector<float> v){
2517  ncol = col;
2518  nrow = row;
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];
2524  }
2525 }
2526 
2527 mat::~mat() {
2528  for(int i=0; i<ncol; i++)
2529  delete[] arr[i];
2530 
2531  delete[] arr;
2532 }
2533 
2534 mat vec::toMatrix() {
2535  mat m(ncol, 1);
2536  for(int c=0; c<ncol; c++) {
2537  for(int r=0; r<nrow; r++) {
2538  m.arr[c][r] = arr[c][r];
2539  }
2540  }
2541  return m;
2542 }
2543 
2561 void mat::print() {
2562  for(int c=0; c<ncol; c++) {
2563  for(int r=0; r<nrow; r++) {
2564  cout<<arr[c][r]<<" ";
2565  }
2566  cout<<std::endl;
2567  }
2568 }
2569 
2570 string mat::toStr() {
2571  string ret = "";
2572  for(int c=0; c<ncol; c++) {
2573  for(int r=0; r<nrow; r++) {
2574  ret += toStr2(arr[c][r]) + " ";
2575  // cout<<arr[c][r]<<" ";
2576  }
2577  ret += "\n";
2578  }
2579  return ret;
2580 }
2581 
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]);
2586  }
2587  printf("\n");
2588  }
2589 }
2590 
2594 vec mat::getVec(int n) {
2595  assert(0 <= n && n < nrow);
2596  vec v(ncol);
2597  for(int i=0; i<ncol; i++) {
2598  v.arr[i][0] = arr[i][n];
2599  }
2600  return v;
2601 }
2602 
2606 row mat::getRow(int index) {
2607  row r(1, nrow);
2608  for(int i=0; i<nrow; i++) {
2609  r.arr[0][i] = arr[index][i];
2610  }
2611  return r;
2612 }
2613 
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++) {
2621  int k = 0;
2622  for(int r=0; r<nrow; r++) {
2623  if(index != r) {
2624  m.arr[c][k] = arr[c][r];
2625  k++;
2626  }
2627  }
2628  }
2629  return m;
2630 }
2631 
2635 mat mat::insertVecNext(int index, vec v) {
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);
2641  return cat;
2642 }
2643 
2644 /*
2645 Add vector to the left of index
2646 Shoud I change the name to insertVecLeft()
2647 'left' is shorter than 'previous'
2648 */
2649 mat mat::insertVecPrevious(int index, vec v) {
2650  assert(ncol == v.ncol && 0 <= index && index < nrow);
2651  mat mv = v.toMatrix();
2652  if (index == 0) {
2653  return mv.concat(*this);
2654  } else {
2655  mat left = take(index);
2656  mat right = drop(index);
2657  return left.concat(mv).concat(right);
2658  }
2659 }
2660 
2661 mat mat::removeRow(int index) {
2662  assert(ncol > 0 && index >= 0 && index < ncol);
2663  mat m(ncol - 1, nrow);
2664  int k = 0;
2665  for(int c=0; c<ncol; c++) {
2666  if(index != c) {
2667  for(int r=0; r<nrow; r++) {
2668  m.arr[k][r] = arr[c][r];
2669  }
2670  k++;
2671  }
2672  }
2673  return m;
2674 }
2675 mat mat::operator+(mat m) {
2676  mat m1(ncol, nrow);
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];
2680  }
2681  }
2682  return m1;
2683 }
2684 
2685 mat mat::operator-(const mat &m) {
2686  mat m1(ncol, nrow);
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];
2690  }
2691  }
2692  return m1;
2693 }
2694 mat mat::operator/(float f) {
2695  mat m1(ncol, nrow);
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;
2699  }
2700  }
2701  return m1;
2702 }
2703 
2704 mat mat::operator*(float f) {
2705  mat m1(ncol, nrow);
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;
2709  }
2710  }
2711  return m1;
2712 }
2713 
2714 
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];
2730  }
2731  }
2732  return m;
2733 }
2734 
2742 mat mat::take(int len) {
2743  mat m = block(0, ncol, 0, len);
2744  return m;
2745 }
2746 
2754 mat mat::drop(int len) {
2755  mat m = block(0, ncol, len, nrow - len);
2756  return m;
2757 }
2773 mat mat::init() {
2774  assert(ncol > 0 && nrow > 0);
2775  mat m = take(nrow - 1);
2776  return m;
2777 }
2794 mat mat::tail() {
2795  assert(ncol > 0 && nrow > 0);
2796  mat m = drop(1);
2797  return m;
2798 }
2799 
2800 
2810 mat mat::block(int cIndex, int clen, int rIndex, int rlen) {
2811  mat m(clen, 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];
2815  }
2816  }
2817  return m;
2818 }
2819 
2831  mat m(nrow, ncol);
2832  for(int c=0; c<ncol; c++) {
2833  for(int r=0; r<nrow; r++) {
2834  m.arr[r][c] = arr[c][r];
2835  }
2836  }
2837  return m;
2838 }
2839 
2840 // two empty matrices are equal
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];
2846  }
2847  }
2848  return ret;
2849 }
2850 
2859 void mat::geneMat(int init) {
2860  int n = init;
2861  for(int c=0; c<ncol; c++) {
2862  for(int r=0; r<nrow; r++) {
2863  arr[c][r] = n;
2864  n++;
2865  }
2866  }
2867 }
2868 
2882 void mat::geneMatRandom(int fst, int snd){
2883  for(int c=0; c<ncol; c++) {
2884  for(int r=0; r<nrow; r++) {
2885  arr[c][r] = random(snd - fst) + fst;
2886  }
2887  }
2888 }
2889 
2890 
2891 mat vec::operator*(row rw) {
2892  // M(m,n) M(n,h) => M(m,h)
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];
2898  }
2899  }
2900  return m;
2901 }
2902 
2903 mat vec::multi() {
2904  mat m(2, 2);
2905  return m;
2906 }
2907 
2908 vec mat::operator*(vec &v) {
2909  assert(nrow == v.ncol);
2910  vec v1(ncol);
2911  for(int c=0; c<ncol; c++) {
2912  v1.arr[c][0] = getRow(c)*v;
2913  }
2914  return v1;
2915 }
2916 mat mat::operator*(mat &m) {
2917  assert(nrow == m.ncol);
2918  mat m1(ncol, m.nrow);
2919  m1.zero();
2920  for(int r=0; r<nrow; r++) {
2921  m1 = m1 + getVec(r) * m.getRow(r);
2922  }
2923  return m1;
2924 }
2925 // c = (a = b) ?
2926 mat mat::operator=(const mat& m) {
2927  if (this != &m) {
2928  ncol = m.ncol;
2929  nrow = m.nrow;
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];
2934  }
2935  }
2936  }
2937  return *this;
2938 }
2939 
2940 mat mat::clone() {
2941  mat m(ncol, nrow);
2942  for(int c=0; c<ncol; c++) {
2943  for(int r=0; r<nrow; r++) {
2944  m.arr[c][r] = arr[c][r];
2945  }
2946  }
2947  return m;
2948 }
2949 // concate two matrices
2950 mat mat::concat(mat m) {
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++) {
2955  if (r < nrow)
2956  m1.arr[c][r] = arr[c][r];
2957  else {
2958  m1.arr[c][r] = m.arr[c][r - nrow];
2959  }
2960  }
2961  }
2962  return m1;
2963 
2964 // nrow = nrow + m.nrow;
2965 // arr = allocate<float>(ncol, nrow);
2966 // for(int c=0; c < ncol; c++){
2967 // for(int r=0; r < nrow; r++){
2968 // arr[c][r] = m1.arr[c][r];
2969 // }
2970 // }
2971 }
2972 
2973 mat mat::rowMultiScala(int index, float f) {
2974  mat m(ncol, nrow);
2975  for(int c=0; c < ncol; c++) {
2976  for(int r=0; r < nrow; r++) {
2977  if(index != c) {
2978  m.arr[c][r] = arr[c][r];
2979  } else {
2980  m.arr[c][r] = arr[c][r]*f;
2981  }
2982  }
2983  }
2984  return m;
2985 }
2986 
2987 mat mat::vecMultiScala(int index, float f) {
2988  mat m(ncol, nrow);
2989  for(int c=0; c < ncol; c++) {
2990  for(int r=0; r < nrow; r++) {
2991  if(r != index) {
2992  m.arr[c][r] = arr[c][r];
2993  } else {
2994  m.arr[c][r] = arr[c][r]*f;
2995  }
2996  }
2997  }
2998  return m;
2999 }
3000 
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);
3008  mat m(ncol, nrow);
3009  for(int c=0; c < ncol; c++) {
3010  for(int r=0; r < nrow; r++) {
3011  if(c == inx1){
3012  m.arr[c][r] = r2.arr[0][r];
3013  }else if(c == inx2){
3014  m.arr[c][r] = r1.arr[0][r];
3015  }else{
3016  m.arr[c][r] = arr[c][r];
3017  }
3018  }
3019  }
3020  return m;
3021 }
3022 
3023 float row::dot(vec& v) {
3024  assert(nrow == v.ncol);
3025  float ret = 0.0;
3026  for(int i=0; i<nrow; i++) {
3027  ret += arr[0][i]*v.arr[i][0];
3028  }
3029  return ret;
3030 }
3031 
3032 
3033 
3034 float row::operator*(vec& v) {
3035  return dot(v);
3036 }
3037 row row::operator+(row& r) {
3038  assert(nrow == r.nrow);
3039  row rw(ncol, nrow);
3040 
3041  for(int i=0; i<nrow; i++) {
3042  rw.arr[0][i] = arr[0][i] + r.arr[0][i];
3043  }
3044  return rw;
3045 }
3046 row row::operator-(row& r) {
3047  assert(nrow == r.nrow);
3048  row rw(ncol, nrow);
3049 
3050  for(int i=0; i<nrow; i++) {
3051  rw.arr[0][i] = arr[0][i] - r.arr[0][i];
3052  }
3053  return rw;
3054 }
3055 row row::operator/(float f) {
3056  row rw(ncol, nrow);
3057  for(int i=0; i<nrow; i++) {
3058  rw.arr[0][i] = arr[0][i]/f;
3059  }
3060  return rw;
3061 }
3062 mat concat(mat m1, mat m2) {
3063  assert(m1.ncol == m2.ncol);
3064 
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++) {
3068  if (r < m1.nrow)
3069  m.arr[c][r] = m1.arr[c][r];
3070  else {
3071  m.arr[c][r] = m2.arr[c][r - m1.nrow];
3072  }
3073  }
3074  }
3075  return m;
3076 }
3077 
3078 mat identity(int n) {
3079  mat m(n, n);
3080  for(int c=0; c<n; c++) {
3081  for(int r=0; r<n; r++) {
3082  if( c == r)
3083  m.arr[c][r] = 1;
3084  else
3085  m.arr[c][r] = 0;
3086  }
3087  }
3088  return m;
3089 }
3090 
3107  assert(a.ncol == a.nrow && a.nrow == b.ncol);
3108 
3109  vec x(a.ncol);
3110  for(int c=a.ncol - 1; c >= 0; c--) {
3111  float s = 0.0;
3112  for(int r= a.nrow - 1; r >=c; r--) {
3113  if(r == c) {
3114  x.arr[r][0] = (b.arr[c][0] - s)/a.arr[c][r];
3115  } else {
3116  s += a.arr[c][r]*x.arr[r][0];
3117  }
3118  }
3119  }
3120  return x;
3121 }
3122 
3150 mat ltri(mat m, int index) {
3151  assert(0 <= index && index < m.nrow);
3152  mat im = identity(m.nrow);
3153  vec v = m.getVec(index);
3154 
3155  // assume m.arr[index][index] != 0
3156  for(int c=m.ncol-1; c > index; c--) {
3157  im.arr[c][index] = - m.arr[c][index]/m.arr[index][index];
3158  }
3159  return im;
3160 }
3161 
3167 std::pair<mat, mat> utri(mat m) {
3168  mat m4;
3169  mat m2 = m4;
3170  mat m1 = m;
3171  mat l = identity(m.ncol);
3172  for(int r = 0; r < m.nrow - 1; r++) {
3173  mat mt = ltri(m1, r);
3174  pl("what");
3175  l = mt*l; // L_k..L2L1
3176  m1 = l*m; // L_k..L2 (L1 A)
3177  }
3178  return std::make_pair(l, l*m);
3179 }
3180 
3181 mat geneMat(int ncol, int nrow, int init){
3182  mat m(ncol, nrow);
3183  int count = init;
3184  for(int c=0; c<ncol; c++){
3185  for(int r=0; r<nrow; r++){
3186  m.arr[c][r] = count;
3187  count++;
3188  }
3189  }
3190  return m;
3191 }
3192 
3197 mat geneMatRandom(int ncol, int nrow, int fst, int snd){
3198  mat m(ncol, nrow);
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;
3202  }
3203  }
3204  return m;
3205 }
3206 
3207 
3208 
3209 
3210 }; // end MatrixVector
3211 
3216 namespace SpaceVector4 {
3217 class Vector4 {
3218  float column[4];
3219 public:
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};
3224 public:
3225 
3230  column[0] = column[1] = column[2] = column[3] = 0.0f;
3231  }
3232 
3233  Vector4(const Vector4& other) {
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];
3238  }
3239 
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;
3245  }
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];
3251  }
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];
3257  }
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);
3264  }
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];
3270  return *this;
3271  }
3272 
3273  Vector4 operator+(Vector4& rhs) {
3274  Vector4 v;
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];
3278  v.column[3] = 0.0f;
3279  return v;
3280  }
3281 
3282  Vector4 operator-(Vector4& rhs) {
3283  Vector4 v;
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];
3287  v.column[3] = 0.0f;
3288  return v;
3289  }
3290 
3291  Vector4 operator/(float n) {
3292  Vector4 v;
3293  v.column[0] = column[0]/n;
3294  v.column[1] = column[1]/n;
3295  v.column[2] = column[2]/n;
3296  return v;
3297  }
3298 
3299  float dot(Vector4& rhs) {
3300  Vector4 v;
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];
3306  }
3307 
3308  float cross(Vector4& rhs) {
3309  return 0.0;
3310  }
3311 
3312  Vector4 normal() {
3313  Vector4 v;
3314  float norm = column[0]*column[0] +
3315  column[1]*column[1] +
3316  column[2]*column[2];
3317  float n = sqrtf(norm);
3318  return (*this)/n;
3319  }
3320 
3321  // [] can't modify member variables
3322  const float& operator[](int index) const {
3323  return column[index];
3324  }
3325 
3326  // [] can modify member variables
3327  float& operator[](int index) {
3328  return column[index];
3329  }
3330 
3331  void pp() {
3332  print();
3333  }
3334  void print() {
3335  printf("x=[%1.2f]\ny=[%1.2f]\nz=[%1.2f]\nw=[%1.2f]\n\n", column[0], column[1], column[2], column[3]);
3336  }
3337 };
3338 };
3339 
3340 
3341 
3342 // C++14 only
3343 // http://localhost:8080/snippet?id=s+c%2B%2B
3344 #if __cplusplus >= 201402
3345 
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);
3396  } else {
3397  return make_pair(s, "");
3398  }
3399 }
3400 
3417 template<typename T, typename Fun>
3418 static vector<vector<T>> splitWhen(Fun f, const vector<T>& vec) {
3419  vector<vector<T>> ret;
3420  vector<T> v2;
3421  for(auto const& e : vec) {
3422  if(!f(e)) {
3423  v2.push_back(e);
3424  }else{
3425  if(len(v2) > 0){
3426  vector<T> tmp(v2);
3427  ret.push_back(tmp);
3428  v2.clear();
3429  }
3430  }
3431  }
3432  if(len(v2) > 0){
3433  vector<T> tmp(v2);
3434  ret.push_back(tmp);
3435  }
3436  return ret;
3437 }
3438 
3439 
3440 
3441 
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;
3454 }
3459 template<typename T>
3460 vector<T> removeIndex(vector<T>& vec, int inx){
3461  vector<T> ret(vec); // clone vec
3462  ret.erase(ret.begin() + inx);
3463  return ret;
3464 }
3465 
3478 template<typename T>
3479 vector<T> removeIndexRange(vector<T>& vec, int fromInx, int toInx){
3480  vector<T> ret(vec); // clone vec
3481  // Error if vector is removed from the smaller index
3482  for(int i=toInx; i >= fromInx; i--){
3483  ret.erase(ret.begin() + i);
3484  }
3485  return ret;
3486 }
3487 
3488 
3489 
3490 
3496 namespace SpaceMatrix4 {
3497 using namespace SpaceVector4;
3498 using namespace Utility;
3499 
3500 class Matrix4 {
3501  Vector4 mat[4];
3502 public:
3503  Matrix4() {
3504  mat[0] = mat[1] = mat[2] = mat[3] = Vector4();
3505  }
3506 
3507  // copy constructor
3508  Matrix4(const Matrix4& matrix) {
3509  mat[0] = matrix[0];
3510  mat[1] = matrix[1];
3511  mat[2] = matrix[2];
3512  mat[3] = matrix[3];
3513  }
3514 
3515  Matrix4(Vector4 v0, Vector4 v1, Vector4 v2, Vector4 v3) {
3516  mat[0] = v0;
3517  mat[1] = v1;
3518  mat[2] = v2;
3519  mat[3] = v3;
3520  }
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]});
3526  mat[0] = v1;
3527  mat[1] = v2;
3528  mat[2] = v3;
3529  mat[3] = v4;
3530  }
3531  Matrix4& operator=(const Matrix4& matrix) {
3532  mat[0] = matrix[0];
3533  mat[1] = matrix[1];
3534  mat[2] = matrix[2];
3535  mat[3] = matrix[3];
3536  return *this;
3537  }
3538 
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);
3545  }
3546  // overload [] , const => member variables CAN NOT be modified
3547  const Vector4& operator[](int index) const {
3548  return mat[index];
3549  }
3550 
3551  // overload [] , no const => member variables CAN be modified
3552  Vector4& operator[](int index) {
3553  return mat[index];
3554  }
3555  Matrix4 operator+(Matrix4& rhs) {
3556  Matrix4 m;
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];
3561  return m;
3562  }
3563  Matrix4 operator-(Matrix4& rhs) {
3564  Matrix4 m;
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];
3569  return m;
3570  }
3571 
3572  // column vector
3573  Vector4 operator*(Vector4& vect4) {
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]);
3578 
3579  row0.print();
3580  row1.print();
3581  row2.print();
3582  row3.print();
3583 
3584  vect4.print();
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;
3589 
3590  Vector4 v(row0.dot(vect4), row1.dot(vect4), row2.dot(vect4), row3.dot(vect4));
3591  v.print();
3592  return v;
3593  }
3594 
3595  // column vector
3596  Matrix4 operator*(Matrix4& matrix) {
3597  Matrix4 m;
3598  m[0] = (*this)*matrix[0];
3599  m[1] = (*this)*matrix[1];
3600  m[2] = (*this)*matrix[2];
3601  m[3] = (*this)*matrix[3];
3602  return m;
3603  }
3604  // [1, 2, 3, 0] => point at infinite
3605  // [1, 2, 3, 1] => normal point
3606  Matrix4 translate(float x, float y, float z) {
3607  Matrix4 m;
3608  mat[0][0] = 1;
3609  mat[1][1] = 1;
3610  mat[2][2] = 1;
3611  mat[3][3] = 1;
3612 
3613  mat[3][0] = x;
3614  mat[3][1] = y;
3615  mat[3][2] = z;
3616  mat[3][3] = 1;
3617  return *this;
3618  }
3619  Matrix4 identity() {
3620  mat[0][0] = 1;
3621  mat[1][1] = 1;
3622  mat[2][2] = 1;
3623  mat[3][3] = 1;
3624  return *this;
3625  }
3626 
3627  void pp() {
3628  print();
3629  }
3630  void print() {
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]);
3635  fl();
3636  }
3637 };
3638 };
3639 
3646 namespace Lambda {
3647 
3648 
3653 template<typename T>
3654 T head(vector<T> vec) {
3655  assert(vec.size() > 0);
3656  return vec[0];
3657 
3658 }
3659 
3664 template<typename T>
3665 T last(vector<T> vec) {
3666  assert(vec.size() > 0);
3667  return vec.back();
3668 }
3669 
3670 
3681 template<typename T>
3682 static vector<T> reverse(vector<T> vec) {
3683  vector<T> v;
3684  for(auto it=vec.rbegin(); it != vec.rend(); it++)
3685  v.push_back(*it);
3686 
3687  return v;
3688 }
3689 
3701 template<typename Fun, typename T>
3702 static vector<T> takeWhile(Fun f, vector<T> vec) {
3703  vector<T> ret;
3704  for(auto const& n : vec) {
3705  if(f(n))
3706  ret.push_back(n);
3707  else
3708  break;
3709  }
3710  return ret;
3711 }
3712 
3719 template<typename Fun, typename T>
3720 static vector<T> dropWhile(Fun f, vector<T> vec) {
3721  vector<T> ret;
3722  bool flag = false;
3723  for(auto const& n : vec) {
3724  if(!f(n) || flag) {
3725  ret.push_back(n);
3726  flag = true;
3727  }
3728  }
3729  return ret;
3730 }
3731 
3738 template<typename T>
3739 static vector<T> tail(vector<T> vec) {
3740  vector<T> v;
3741  for(int i=1; i<vec.size(); i++) {
3742  v.push_back(vec.at(i));
3743  }
3744  return v;
3745 }
3746 
3751 template<typename Fun, typename T>
3752 static T foldl(Fun f, T acc, vector<T> vec) {
3753  vector<T> vec1;
3754  T tmpAcc = acc;
3755  for(auto ite = vec.begin(), end = vec.end(); end != ite; ite++) {
3756  tmpAcc = f(tmpAcc, *ite);
3757  }
3758  return tmpAcc;
3759 }
3760 
3761 
3771 template<typename Fun, typename T>
3772 static T foldr(Fun f, T acc, const vector<T>& vec) {
3773  vector<T> vec1;
3774  T tmpAcc = acc;
3775  for(int i=vec.size() - 1; i >= 0; i--) {
3776  tmpAcc = f(vec[i], tmpAcc);
3777  }
3778  return tmpAcc;
3779 }
3780 
3781 template<class T>
3782 static vector<T> init(const vector<T>& vec) {
3783  assert(vec.size() > 0);
3784  vector<T> v;
3785  for(int i=0; i < vec.size() - 1; i++) {
3786  v.push_back(vec[i]);
3787  }
3788  return v;
3789 }
3790 
3801 template<typename Fun, typename T>
3802 static vector<T> map(Fun f, vector<T> vec) {
3803  vector<T> vec1;
3804  for(auto const& v : vec) {
3805  vec1.push_back(f(v));
3806  }
3807  return vec1;
3808 }
3809 
3810 int min(int a, int b) {
3811  return a < b ? a : b;
3812 }
3813 
3814 template<typename Fun, typename T>
3815 static vector<T> zipWith(Fun f, vector<T> v1, vector<T> v2) {
3816  vector<T> vec;
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]));
3822  }
3823  }
3824  return vec;
3825 }
3826 
3837 template<typename T>
3838 static vector<T> flat(const vector<vector<T>>& vec2){
3839  vector<T> vec;
3840  for(auto& v : vec2){
3841  vec = vec + v;
3842  }
3843  return vec;
3844 }
3845 
3855 template<typename T, typename Fun>
3856 static vector<T> filter(Fun f, const vector<T>& vec) {
3857  vector<T> vec1;
3858  for(auto const& v : vec) {
3859  if(f(v)) {
3860  vec1.push_back(v);
3861  }
3862  }
3863  return vec1;
3864 }
3865 
3866 // take n char from a string
3867 static string take(int n, string s) {
3868  return s.substr(0, n);
3869 }
3870 
3871 template<class T>
3872 static vector<T> take(int n, const vector<T>& vec) {
3873  vector<T> vec1;
3874  int c = 0;
3875  for(auto const& v : vec) {
3876  if (c < n) {
3877  vec1.push_back(v);
3878  } else {
3879  break;
3880  }
3881  c++;
3882  }
3883  return vec1;
3884 }
3885 
3886 template<class T>
3887 static vector<T> drop(int n, vector<T> vec) {
3888  vector<T> vec1;
3889  int c = 0;
3890  for(auto const& v : vec) {
3891  if (c >= n)
3892  vec1.push_back(v);
3893  c++;
3894  }
3895  return vec1;
3896 }
3897 
3898 template<typename Fun, typename T>
3899 static vector<T> mergeSortListLam(Fun f, vector<T> v1, vector<T> v2) {
3900  vector<T> empty;
3901  if (v1.size() == 0)
3902  return v2;
3903  if (v2.size() == 0)
3904  return v1;
3905 
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);
3910  } else {
3911  return vh2 + mergeSortListLam(f, v1, tail(v2));
3912  }
3913 }
3914 
3920 template<class T>
3921 static vector<T> mergeSortList(vector<T> v1, vector<T> v2) {
3922  vector<T> empty;
3923  if (v1.size() == 0)
3924  return v2;
3925  if (v2.size() == 0)
3926  return v1;
3927 
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);
3932  } else {
3933  return vh2 + mergeSortList(v1, tail(v2));
3934  }
3935 }
3936 
3937 template<class T>
3938 static vector<T> mergeSort(vector<T> v1) {
3939  if(v1.size() > 1) {
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);
3945  } else {
3946  return v1;
3947  }
3948 }
3949 
3950 }; // end namespace Lambda
3951 
3958 template<class T>
3959 vector<T> interleave(const vector<T>& v1, const vector<T>& v2) {
3960  int len1 = v1.size();
3961  int len2 = v2.size();
3962  vector<T> vec;
3963  for(int i=0; i<std::min(len1, len2); i++) {
3964  vec.push_back(v1[i]);
3965  vec.push_back(v2[i]);
3966  }
3967  return vec;
3968 }
3969 
3977 string takeFileName(string path) {
3978  string s;
3979  // it works for MacOS so far, not windows
3980  vector<string> vec = splitStr(path, "/");
3981  if(vec.size() > 0) {
3982  s = Lambda::last(vec);
3983  }
3984  return s;
3985 }
3986 
4004 string takeDirectory(string path) {
4005  vector<string> vec = splitStr(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);
4012  } else {
4013  pathvec = vv;
4014  }
4015 
4016  return Lambda::foldr([](auto x, auto y) {
4017  return x + y;
4018  }, c2s(""), pathvec);
4019 }
4020 
4028 string takeExtension(string path) {
4029  auto vec = splitStr(path, ".");
4030  string ret;
4031  if(vec.size() > 1) {
4032  string dot(".");
4033  ret = dot + Lambda::last(vec);
4034  }
4035  return ret;
4036 }
4037 
4048 string join(vector<string>& vec) {
4049  return trimRight(Lambda::foldr([](auto& x, auto&y) {
4050  return x + " " + y;
4051  }, c2s(""), vec));
4052 }
4053 
4054 string joinNewLine(vector<string> vec) {
4055  return Lambda::foldr([](auto& x, auto&y) {
4056  return x + " " + y;
4057  }, c2s("\n"), vec);
4058 }
4059 
4069 vector<string> readFile(string fname) {
4070  std::ifstream file(fname);
4071  vector<string> retVec;
4072  if (file.is_open()) {
4073  std::string line;
4074  while(getline(file, line)) {
4075  retVec.push_back(line);
4076  }
4077  file.close();
4078  }
4079  return retVec;
4080 }
4081 
4087 void listDirToFile(char * path, char* toFile, vector<string>& vec) {
4088  DIR * d = opendir(path);
4089  if( d != NULL) {
4090  struct dirent* dir;
4091  while ((dir = readdir(d)) != NULL) {
4092  if(dir->d_type != DT_DIR) {
4093  char fpath[1000];
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);
4098  vec.clear();
4099  }
4100  } else if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 ) {
4101  char fpath[1000];
4102  sprintf(fpath, "%s/%s", path, dir->d_name);
4103  listDirToFile(fpath, toFile, vec);
4104  }
4105  }
4106  closedir(d);
4107  }
4108 }
4109 
4110 
4114 void listDirToVec(char * path, char* toFile, vector<string>& vec) {
4115  listDirToFile(path, toFile, vec);
4116 }
4117 
4118 
4119 
4123 vector<string> recurveDirBoost(char* dir) {
4124  vector<string> retVec;
4125  fs::path p(dir);
4126  bool b = exists(p);
4127 
4128  if(!exists(p) || !is_directory(p)) {
4129  std::cout << p << " is not a path\n";
4130  return retVec;
4131  }
4132 
4133  fs::recursive_directory_iterator begin(p), end;
4134  std::vector<fs::directory_entry> v(begin, end); // vector created here
4135  for(auto& f: v) {
4136  retVec.push_back(f.path().string());
4137  }
4138 
4139  return retVec;
4140 }
4141 
4142 
4143 
4144 
4165 void recurveDirToFile(char * path, char* toFile, vector<string>& vec) {
4166  DIR * d = opendir(path);
4167  if( d != NULL) {
4168  struct dirent* dir;
4169  while ((dir = readdir(d)) != NULL) {
4170  if(dir-> d_type != DT_DIR) {
4171  char fpath[500];
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);
4176  vec.clear();
4177  }
4178  } else if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 ) {
4179  char fpath[500];
4180  sprintf(fpath, "%s/%s", path, dir->d_name);
4181  listDirToFile(fpath, toFile, vec);
4182  } else {
4183  vec.push_back("Unknown_type");
4184  }
4185  }
4186  if(vec.size() > 0) {
4187  writeFileAppendVector(c2s(toFile), vec);
4188  vec.clear();
4189  }
4190  closedir(d);
4191  }
4192 }
4193 
4199 void listDirAll(char * path) {
4200  DIR * d = opendir(path);
4201  if(d != NULL) {
4202  struct dirent* dir;
4203  while ((dir = readdir(d)) != NULL) {
4204  if(dir-> d_type != DT_DIR) { // if the type is not directory just print it with blue
4205  char dpath[1000]; // here I am using sprintf which is safer than strcat
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); // print its name in green
4210  char dpath[1000]; // here I am using sprintf which is safer than strcat
4211  sprintf(dpath, "%s/%s", path, dir->d_name);
4212  printf("%s\n", dpath);
4213  listDirAll(dpath); // recall with the new path
4214  } else {
4215  pl("Unknown_type");
4216  }
4217  }
4218  closedir(d); // finally close the directory
4219  }
4220 }
4221 
4227 void listDirToVector(char * path, vector<string>& vec) {
4228  DIR * d = opendir(path);
4229  if( d != NULL) {
4230  struct dirent* dir;
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);
4240  } else {
4241  vec.push_back("Unknown_type");
4242  }
4243  }
4244  closedir(d);
4245  }
4246 }
4247 
4248 
4249 string getPWD() {
4250  string ret;
4251  char cwd[PATH_MAX];
4252  if (getcwd(cwd, sizeof(cwd)) != NULL) {
4253  ret = cStringToString(cwd);
4254  } else {
4255  perror("getcwd() error");
4256  }
4257  return ret;
4258 }
4259 
4264 string intToStringLen(int num, int maxlen) {
4265  char buffer[255];
4266  sprintf(buffer, "%d", num);
4267  string zero = Lambda::take(maxlen - strlen(buffer), repeat(num, "0"));
4268  return zero + c2s(buffer);
4269 }
4270 
4276 std::pair<vector<string>, vector<string>> parseLambda(string s) {
4277  vector<string> vecStr = splitStrRegex(s, "\\s+");
4278  vector<string> vec = Lambda::filter([](auto& x) {
4279  return trim(x).length() > 0;
4280  }, vecStr);
4281 
4282  vector<string> varv;
4283  auto f = [](auto x) {
4284  return x == c2s("->");
4285  };
4286  std::pair<vector<string>, vector<string>> pair = breakVec(f, vec);
4287  return std::make_pair(pair.first, Lambda::tail(pair.second));
4288 }
4289 
4290 
4291 
4292 
4298 namespace Algorithm {
4299 using namespace Lambda;
4300 
4301 void merge(int* arr, int lo, int mid, int hi) {
4302  int len = hi - lo + 1;
4303  int* list = new int[len];
4304  int i = lo;
4305  int j = mid + 1;
4306  int k = 0;
4307  while(i < mid + 1 || j < hi + 1) {
4308  if (i >= mid + 1) {
4309  list[k] = arr[j];
4310  j++;
4311  } else if(j >= hi + 1) {
4312  list[k] = arr[i];
4313  i++;
4314  } else if (arr[i] < arr[j]) {
4315  list[k] = arr[i];
4316  i++;
4317  } else {
4318  list[k] = arr[j];
4319  j++;
4320  }
4321  k++;
4322  }
4323  for(int i=0; i<len; i++) {
4324  arr[lo + i] = list[i];
4325  }
4326  delete[] list;
4327 }
4328 
4329 void mergeSort(int* arr, int lo, int hi) {
4330  if(lo < hi) {
4331  int m = (lo + hi)/2;
4332  mergeSort(arr, lo, m);
4333  mergeSort(arr, m+1, hi);
4334  merge(arr, lo, m, hi);
4335  }
4336 }
4337 
4338 // TODO: add test cases
4339 void swap(int array[], int i, int j) {
4340  int tmp = array[i];
4341  array[i] = array[j];
4342  array[j] = tmp;
4343 }
4344 
4345 
4355 int partition(int array[], int lo, int hi) {
4356  if(hi > lo) {
4357  int p = array[hi];
4358  int big = lo;
4359  for(int i=lo; i<=hi; i++) {
4360  if(array[i] <= p) {
4361  swap(array, i, big);
4362  if(i < hi)
4363  big++;
4364  }
4365  }
4366  return big;
4367  }
4368  return -1;
4369 }
4370 
4371 // TODO: add test cases
4372 void quickSortArr(int array[], int lo, int hi) {
4373  if(hi > lo) {
4374  int pivot = partition(array, lo, hi);
4375  quickSortArr(array, lo, pivot-1);
4376  quickSortArr(array, pivot+1, hi);
4377  }
4378 }
4379 
4380 // TODO: add lambda fun for more general sorting
4381 template<typename T>
4382 static vector<T> quickSort(vector<T> vec) {
4383  if (vec.size() <= 1)
4384  return vec;
4385  else {
4386  T pivot = head(vec);
4387  vector<T> rest = drop(1, vec);
4388  vector<T> left = filter<T>([pivot](auto x) {
4389  return x < pivot;
4390  }, rest);
4391  vector<T> right = filter<T>([pivot](auto x) {
4392  return x >= pivot;
4393  }, rest);
4394  return quickSort(left) + con(pivot, quickSort(right));
4395  }
4396 }
4397 
4398 template<typename Fun, typename T>
4399 static vector<T> mergeSortList(Fun f, vector<T> v1, vector<T> v2) {
4400  vector<T> empty;
4401  if (v1.size() == 0)
4402  return v2;
4403  if (v2.size() == 0)
4404  return v1;
4405 
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);
4410  } else {
4411  return vh2 + mergeSortList(f, v1, tail(v2));
4412  }
4413 }
4414 
4415 }
4416 #endif
4417 
4418 //string toStr(int e){
4419 // string ret;
4420 // return ret;
4421 //}
4422 //string toStr(float e){
4423 // string ret;
4424 // return ret;
4425 //}
4426 //string toStr(double e){
4427 // string ret;
4428 // return ret;
4429 //}
4430 //string toStr(long e){
4431 // string ret;
4432 // return ret;
4433 //}
4434 
4435 using namespace MatrixVector;
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);
4440  }
4441 }
4442 
4443 //void writeFileRow(string fname, row& r){
4444 // auto f = [](auto& x) { return toStr(s);};
4445 // vector<float> vec = {0.1, 1.2};
4446 // vector<string> s1 = Lambda::map( f, vec);
4453 //}
4454 
4455 
4456 #endif
4457 
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
Definition: Vector3.h:63
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