00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if !defined (octave_sparse_base_chol_h)
00025 #define octave_sparse_base_chol_h 1
00026
00027 #include "oct-sparse.h"
00028 #include "dColVector.h"
00029
00030 template <class chol_type, class chol_elt, class p_type>
00031 class
00032 sparse_base_chol
00033 {
00034 protected:
00035 #ifdef HAVE_CHOLMOD
00036 class sparse_base_chol_rep
00037 {
00038 public:
00039 sparse_base_chol_rep (void) : count (1), Lsparse (0),
00040 is_pd (false), minor_p (0) { }
00041
00042 sparse_base_chol_rep (const chol_type& a,
00043 const bool natural) : count (1)
00044 { init (a, natural); }
00045
00046 sparse_base_chol_rep (const chol_type& a, octave_idx_type& info,
00047 const bool natural) : count (1)
00048 { info = init (a, natural); }
00049
00050 ~sparse_base_chol_rep (void)
00051 { if (is_pd) CHOLMOD_NAME(free_sparse) (&Lsparse, &Common); }
00052
00053 cholmod_sparse * L (void) const { return Lsparse; }
00054
00055 octave_idx_type P (void) const
00056 { return (minor_p == static_cast<octave_idx_type>(Lsparse->ncol) ?
00057 0 : minor_p + 1); }
00058
00059 ColumnVector perm (void) const { return perms + 1; }
00060
00061 p_type Q (void) const;
00062
00063 bool is_positive_definite (void) const { return is_pd; }
00064
00065 double rcond (void) const { return cond; }
00066
00067 int count;
00068
00069 private:
00070 cholmod_sparse *Lsparse;
00071
00072 cholmod_common Common;
00073
00074 bool is_pd;
00075
00076 octave_idx_type minor_p;
00077
00078 ColumnVector perms;
00079
00080 double cond;
00081
00082 octave_idx_type init (const chol_type& a, bool natural = true);
00083
00084 void drop_zeros (const cholmod_sparse* S);
00085
00086
00087 sparse_base_chol_rep& operator = (const sparse_base_chol_rep& a);
00088 };
00089 #else
00090 class sparse_base_chol_rep
00091 {
00092 public:
00093 sparse_base_chol_rep (void) : count (1), is_pd (false), minor_p (0) { }
00094
00095 sparse_base_chol_rep (const chol_type& a,
00096 const bool natural) : count (1)
00097 { init (a, natural); }
00098
00099 sparse_base_chol_rep (const chol_type& a, octave_idx_type& info,
00100 const bool natural) : count (1)
00101 { info = init (a, natural); }
00102
00103 ~sparse_base_chol_rep (void) { }
00104
00105 octave_idx_type P (void) const { return 0; }
00106
00107 ColumnVector perm (void) const { return perms + 1; }
00108
00109 p_type Q (void) const;
00110
00111 bool is_positive_definite (void) const { return is_pd; }
00112
00113 double rcond (void) const { return cond; }
00114
00115 int count;
00116
00117 private:
00118 bool is_pd;
00119
00120 octave_idx_type minor_p;
00121
00122 ColumnVector perms;
00123
00124 double cond;
00125
00126 octave_idx_type init (const chol_type& a, bool natural = true);
00127
00128
00129 sparse_base_chol_rep& operator = (const sparse_base_chol_rep& a);
00130 };
00131 #endif
00132
00133 private:
00134 sparse_base_chol_rep *rep;
00135
00136 public:
00137
00138 sparse_base_chol (void) : rep (new typename
00139 sparse_base_chol<chol_type, chol_elt, p_type>::sparse_base_chol_rep ()) { }
00140
00141 sparse_base_chol (const chol_type& a, const bool n) : rep (new typename
00142 sparse_base_chol<chol_type, chol_elt, p_type>::
00143 sparse_base_chol_rep (a, n)) { }
00144
00145 sparse_base_chol (const chol_type& a, octave_idx_type& info, const bool n) :
00146 rep (new typename sparse_base_chol<chol_type, chol_elt, p_type>::
00147 sparse_base_chol_rep (a, info, n)) { }
00148
00149 sparse_base_chol (const sparse_base_chol<chol_type, chol_elt, p_type>& a) :
00150 rep (a.rep) { rep->count++; }
00151
00152 ~sparse_base_chol (void)
00153 {
00154 if (--rep->count <= 0)
00155 delete rep;
00156 }
00157
00158 sparse_base_chol& operator = (const sparse_base_chol& a)
00159 {
00160 if (this != &a)
00161 {
00162 if (--rep->count <= 0)
00163 delete rep;
00164
00165 rep = a.rep;
00166 rep->count++;
00167 }
00168
00169 return *this;
00170 }
00171
00172 chol_type L (void) const;
00173
00174 chol_type R (void) const { return L().hermitian (); }
00175
00176 octave_idx_type P (void) const { return rep->P(); }
00177
00178 ColumnVector perm (void) const { return rep->perm(); }
00179
00180 p_type Q (void) const { return rep->Q(); }
00181
00182 bool is_positive_definite (void) const
00183 { return rep->is_positive_definite(); }
00184
00185 double rcond (void) const { return rep->rcond(); }
00186
00187 chol_type inverse (void) const;
00188 };
00189
00190 #endif
00191
00192
00193
00194
00195
00196