ADMB Documentation  -a65f1c97
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
df1b2-separable/expm.cpp
Go to the documentation of this file.
1 /*
2  * $Id$
3  *
4  * Authors: Anders Nielsen <anders@nielsensweb.org> and Casper W. Berg <cbe@aqua.dtu.dk>
5  * Copyright (c) 2008-2012 Regents of the University of California
6  */
12 #include <df1b2fun.h>
13 #define TINY 1.0e-20;
14 
20 {
21  df1b2variable ln;
23  return solve(aa,tz,ln,sgn);
24 }
25 
34  df1b2variable ln_unsigned_det,df1b2variable& sign)
35 {
38 
39  int n = aa.colsize();
40  int lb = aa.colmin();
41  int ub = aa.colmax();
42  if (lb!=aa.rowmin()||ub!=aa.colmax())
43  {
44  cerr << "Error matrix not square in solve()"<<endl;
45  ad_exit(1);
46  }
47  df1b2matrix bb(lb,ub,lb,ub);
48  bb = aa;
49  ivector indx(lb,ub);
50  int One = 1;
51  indx.fill_seqadd(lb,One);
52  df1b2variable d;
53  df1b2variable big,dum,sum,temp;
54  df1b2vector vv(lb,ub);
55 
56  d = 1.0;
57  for (int i = lb;i<=ub;i++)
58  {
59  big = 0.0;
60  for (int j = lb;j<=ub;j++)
61  {
62  temp = fabs(bb(i,j));
63  if (value(temp) > value(big))
64  {
65  big = temp;
66  }
67  }
68  if (value(big) == 0.0)
69  {
70  cerr <<
71  "Error in matrix inverse -- matrix singular in inv(df1b2matrix)\n";
72  }
73  vv[i] = 1.0/big;
74  }
75 
76  for (int j = lb;j<=ub;j++)
77  {
78  for (int i = lb;i<j;i++)
79  {
80  sum = bb(i,j);
81  for (int k = lb;k<i;k++)
82  {
83  sum -= bb(i,k)*bb(k,j);
84  }
85  // a[i][j] = sum;
86  bb(i,j) = sum;
87  }
88  int imax = j;
89  big = 0.0;
90  for (int i = j;i<=ub;i++)
91  {
92  sum = bb(i,j);
93  for (int k = lb;k<j;k++)
94  {
95  sum -= bb(i,k)*bb(k,j);
96  }
97  bb(i,j) = sum;
98  dum = vv[i]*fabs(sum);
99  if (value(dum) >= value(big))
100  {
101  big = dum;
102  imax = i;
103  }
104  }
105  if (j != imax)
106  {
107  for (int k = lb;k<=ub;k++)
108  {
109  dum = bb(imax,k);
110  bb(imax,k) = bb(j,k);
111  bb(j,k) = dum;
112  }
113  d = -1.*d;
114  vv[imax] = vv[j];
115 
116  // if (j<ub)
117  {
118  int itemp = indx(imax);
119  indx(imax) = indx(j);
120  indx(j) = itemp;
121  }
122  // cout << "indx= " <<indx<<endl;
123  }
124 
125  if (value(bb(j,j)) == value(0.0))
126  {
127  bb(j,j) = TINY;
128  }
129 
130  if (j != n)
131  {
132  dum = 1.0/bb(j,j);
133  for (int i = j+1;i<=ub;i++)
134  {
135  bb(i,j) = bb(i,j) * dum;
136  }
137  }
138  }
139 
140  // get the determinant
141  sign = d;
142  df1b2vector part_prod(lb,ub);
143  part_prod(lb) = log(fabs(bb(lb,lb)));
144  if (value(bb(lb,lb))<0) sign=-sign;
145  for (int j = lb+1;j<=ub;j++)
146  {
147  if (value(bb(j,j))<0) sign=-sign;
148  part_prod(j) = part_prod(j-1)+log(fabs(bb(j,j)));
149  }
150  ln_unsigned_det = part_prod(ub);
151 
152  df1b2matrix z = trans(tz);
153  int mmin = z.indexmin();
154  int mmax = z.indexmax();
155  df1b2matrix x(mmin,mmax,lb,ub);
156  // df1b2vector x(lb,ub);
157 
158  df1b2vector y(lb,ub);
159  // int lb = rowmin;
160  // int ub = rowmax;
161  df1b2matrix& b = bb;
162  ivector indxinv(lb,ub);
163  for (int i = lb;i<=ub;i++)
164  {
165  indxinv(indx(i)) = i;
166  }
167  for (int kk = mmin;kk<=mmax;kk++)
168  {
169  for (int i = lb;i<=ub;i++)
170  {
171  y(indxinv(i)) = z(kk)(i);
172  }
173 
174  for (int i = lb;i<=ub;i++)
175  {
176  sum = y(i);
177  for (int j = lb;j<=i-1;j++)
178  {
179  sum-=b(i,j)*y(j);
180  }
181  y(i) = sum;
182  }
183  for (int i = ub;i>=lb;i--)
184  {
185  sum = y(i);
186  for (int j = i+1;j<=ub;j++)
187  {
188  sum-=b(i,j)*x(kk)(j);
189  }
190  x(kk)(i) = sum/b(i,i);
191  }
192  }
194  return trans(x);
195 }
196 
216 {
219 
220  int rmin = A.rowmin();
221  int rmax = A.rowmax();
222 
223  if(rmax != A.colmax())
224  {cout<<"Error: Not square matrix in expm."<<endl; ad_exit(1);}
225  if(rmin != A.colmin())
226  {cout<<"Error: Not square matrix in expm."<<endl; ad_exit(1);}
227 
228  df1b2matrix I(rmin,rmax,rmin,rmax);
229  df1b2matrix AA(rmin,rmax,rmin,rmax);
230  df1b2matrix X(rmin,rmax,rmin,rmax);
231  df1b2matrix E(rmin,rmax,rmin,rmax);
232  df1b2matrix D(rmin,rmax,rmin,rmax);
233  df1b2matrix cX(rmin,rmax,rmin,rmax);
234 
235  I.initialize();
236  for(int i = rmin; i<=rmax; ++i){I(i,i) = 1.0;}
237 
238  df1b2variable log2NormInf;
239  log2NormInf = log(max(rowsum(fabs(value(A)))));
240  log2NormInf/=log(2.0);
241  int e = (int)value(log2NormInf) + 1;
242  int s = e+1;
243  s = (s<0) ? 0 : s;
244  AA = 1.0/pow(2.0,s)*A;
245 
246  X = AA;
247  df1b2variable c = 0.5;
248 
249  E = I+c*AA;
250  D = I-c*AA;
251  int q = 6, p = 1;
252  for(int k = 2; k<=q; ++k){
253  c*=((double)q-k+1.0)/((double)k*(2*q-k+1));
254  X = AA*X;
255  cX = c*X;
256  E+=cX;
257  if(p==1){D+=cX;}else{D-=cX;}
258  p = (p==1) ? 0 : 1;
259  }
260  // E = inv(D)*E;
261  E = solve(D,E);
262  for(int k = 1; k<=s; ++k){
263  E = E*E;
264  }
266  return E;
267 }
268 
269 #undef TINY
dmatrix trans(const dmatrix &m1)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: dmat2.cpp:13
dmatrix expm(const dmatrix &A)
Matrix exponential.
#define x
int indexmin(void) const
Definition: df1b2fun.h:1054
double sum(const d3_array &darray)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: d3arr.cpp:21
Description not yet available.
Definition: df1b2fun.h:953
df1_two_variable fabs(const df1_two_variable &x)
Definition: df12fun.cpp:891
exitptr ad_exit
Definition: gradstrc.cpp:53
void initialize(void)
Description not yet available.
Definition: f1b2vc2.cpp:157
int rowmin(void) const
Definition: df1b2fun.h:1053
void fill_seqadd(int, int)
Fills ivector elements with values starting from base and incremented by offset.
Definition: cranfill.cpp:73
Description not yet available.
Definition: df1b2fun.h:266
ivector sgn(const dvector &v)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: dvect24.cpp:11
dvector solve(const dmatrix &aa, const dvector &z)
Solve a linear system using LU decomposition.
Definition: dmat34.cpp:46
prnstream & endl(prnstream &)
Array of integers(int) with indexes from index_min to indexmax.
Definition: ivector.h:50
dvector rowsum(const dmatrix &matrix)
Returns dvector where each element contains the sum total of each row in matrix.
Definition: dvect12.cpp:61
void RETURN_ARRAYS_INCREMENT()
Definition: gradstrc.cpp:478
static _THREAD gradient_structure * _instance
#define TINY
Description not yet available.
Definition: df1b2fun.h:1042
int indexmax(void) const
Definition: df1b2fun.h:1055
Description not yet available.
double sign(const double x)
The sign of a number.
Definition: gaussher.cpp:25
void RETURN_ARRAYS_DECREMENT()
Definition: gradstrc.cpp:511
int colsize(void) const
Definition: df1b2fun.h:1091
dvector value(const df1_one_vector &v)
Definition: df11fun.cpp:69
#define max(a, b)
Definition: cbivnorm.cpp:189
int colmin(void) const
Definition: df1b2fun.h:1089
class for things related to the gradient structures, including dimension of arrays, size of buffers, etc.
int colmax(void) const
Definition: df1b2fun.h:1090
int rowmax(void) const
Definition: df1b2fun.h:1056
d3_array log(const d3_array &arr3)
Author: David Fournier Copyright (c) 2008-2012 Regents of the University of California.
Definition: d3arr2a.cpp:13
d3_array pow(const d3_array &m, int e)
Description not yet available.
Definition: d3arr6.cpp:17