Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include "fvar.hpp"
00012 #include <string.h>
00013 #include <ctype.h>
00014 #include <cassert>
00015 #include <climits>
00016
00021 struct dvec_ptr_ptr
00022 {
00023 void ** m;
00024 };
00025
00026 const int MAXROWS = 5050;
00027
00037 void dmatrix::fill(const char* s)
00038 {
00039 #ifdef DIAG
00040 myheapcheck("Entering dmatrix(const char * s)" );
00041 #endif
00042
00043 size_t len = strlen(s);
00044 assert(len <= INT_MAX);
00045 int n = (int)len;
00046 int braces = 0;
00047 int nrow = 0;
00048 int ncol = 0;
00049 int mincolumn=colmin();
00050 int minrow=rowmin();
00051 rowshift(1);
00052 colshift(1);
00053
00054 ivector columns(1, MAXROWS);
00055 ivector k1(1, MAXROWS);
00056 ivector k2(1, MAXROWS);
00057
00058 for (int k = 0; k < n; k++)
00059 {
00060 if (s[k] == '{')
00061 {
00062 braces ++;
00063 if (braces != 1)
00064 {
00065 cerr << "Unbalanced braces in dmatrix::fill(const char * s)\n";
00066 cerr << "at character " << k << "\n";
00067 ad_exit(1);
00068 }
00069 ncol = 1;
00070 k1[nrow+1] = k;
00071 }
00072 else if (s[k] == '}')
00073 {
00074 braces --;
00075 if (braces != 0)
00076 {
00077 cerr << "Unbalanced braces in dmatrix::dmatrix(const char * s)\n";
00078 cerr << "at character " << k << "\n";
00079 ad_exit(1);
00080 }
00081 k2[nrow+1] = k;
00082 nrow ++;
00083 if (nrow > MAXROWS)
00084 {
00085 cerr << "Too many rows in dmatrix::dmatrix(const char * s)\n";
00086 ad_exit(1);
00087 }
00088 columns[nrow] = ncol;
00089 }
00090 else if (s[k] == ',')
00091 {
00092 if (braces != 0)
00093 {
00094 ncol++;
00095 }
00096 }
00097 }
00098
00099 if (braces != 0)
00100 {
00101 cerr << "Unbalanced braces in dmatrix::dmatrix(const char * s)\n";
00102 cerr << s << "\n";
00103 ad_exit(1);
00104 }
00105
00106 if (nrow != rowsize())
00107 {
00108 if (nrow < rowsize())
00109 {
00110 cerr << " Not enough rows in the data for dmatrix::fill(const char *) \n";
00111 ad_exit(1);
00112 }
00113 else
00114 {
00115 cerr << " Too many rows in the data for dmatrix::fill(const char *) \n";
00116 ad_exit(1);
00117 }
00118 }
00119
00120 for (int i=1; i<=nrow; i++)
00121 {
00122 cout << "row " << i << " matrix "
00123 << ((*this)[rowmin()+i-1]).size()
00124 << " colvector " << columns[i] << "\n";
00125
00126 if ( ((*this)[rowmin()+i-1]).size() != columns[i])
00127 {
00128 if ( ((*this)[rowmin()+i-1]).size() > columns[i])
00129 {
00130 cerr << " Not enough columns in the data in row "
00131 << i << " for dmatrix::fill(const char *) \n";
00132 ad_exit(1);
00133 }
00134 else
00135 {
00136 cerr << " Too many columns in the data in row "
00137 << i << " for dmatrix::fill(const char *) \n";
00138 ad_exit(1);
00139 }
00140 }
00141 }
00142
00143 for (int i=rowmin(); i<=rowmax(); i++)
00144 {
00145 char *t = new char[strlen(s)+1];
00146
00147
00148 for (int k = k1[i]; k <= k2[i]; k++)
00149 {
00150 t[k-k1[i]] = s[k];
00151 }
00152 t[k2[i]-k1[i]+1] = '\0';
00153
00154 dvector tt(t);
00155 tt.shift(( (*this)(i)).indexmin() );
00156
00157
00158 (*this)(i)=tt;
00159
00160 delete[] t;
00161 t = 0;
00162 }
00163 rowshift(minrow);
00164 colshift(mincolumn);
00165 }