comparison liboctave/sparse-base-chol.cc @ 7637:2be056f03720

Fix fall back from sparse cholesky factorization to LU when matrix detected as not being positive definite
author David Bateman <dbateman@free.fr>
date Tue, 25 Mar 2008 16:17:16 -0400
parents daff886a8e2a
children 2176f2b4599e 72830070a17b
comparison
equal deleted inserted replaced
7636:99c410f7f0b0 7637:2be056f03720
163 163
164 cholmod_factor *Lfactor; 164 cholmod_factor *Lfactor;
165 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 165 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
166 Lfactor = CHOLMOD_NAME(analyze) (ac, cm); 166 Lfactor = CHOLMOD_NAME(analyze) (ac, cm);
167 CHOLMOD_NAME(factorize) (ac, Lfactor, cm); 167 CHOLMOD_NAME(factorize) (ac, Lfactor, cm);
168 cond = CHOLMOD_NAME(rcond) (Lfactor, cm);
169 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 168 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
170 169
171 minor_p = Lfactor->minor;
172 is_pd = cm->status == CHOLMOD_OK; 170 is_pd = cm->status == CHOLMOD_OK;
173 info = (is_pd ? 0 : cm->status); 171 info = (is_pd ? 0 : cm->status);
174 172
175 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 173 if (is_pd)
176 Lsparse = CHOLMOD_NAME(factor_to_sparse) (Lfactor, cm); 174 {
177 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
178
179 if (minor_p > 0 && minor_p < a_nr)
180 {
181 size_t n1 = a_nr + 1;
182 Lsparse->p = CHOLMOD_NAME(realloc) (minor_p+1, sizeof(octave_idx_type),
183 Lsparse->p, &n1, cm);
184 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 175 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
185 CHOLMOD_NAME(reallocate_sparse) 176 cond = CHOLMOD_NAME(rcond) (Lfactor, cm);
186 (static_cast<octave_idx_type *>(Lsparse->p)[minor_p], Lsparse, cm);
187 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 177 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
188 Lsparse->ncol = minor_p; 178
189 } 179 minor_p = Lfactor->minor;
190 180
191 drop_zeros (Lsparse); 181 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
192 182 Lsparse = CHOLMOD_NAME(factor_to_sparse) (Lfactor, cm);
193 if (! natural) 183 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
194 { 184
195 perms.resize (a_nr); 185 if (minor_p > 0 && minor_p < a_nr)
196 for (octave_idx_type i = 0; i < a_nr; i++) 186 {
197 perms(i) = static_cast<octave_idx_type *>(Lfactor->Perm)[i]; 187 size_t n1 = a_nr + 1;
198 } 188 Lsparse->p = CHOLMOD_NAME(realloc) (minor_p+1,
199 189 sizeof(octave_idx_type),
200 static char tmp[] = " "; 190 Lsparse->p, &n1, cm);
201 191 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
202 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 192 CHOLMOD_NAME(reallocate_sparse)
203 CHOLMOD_NAME(free_factor) (&Lfactor, cm); 193 (static_cast<octave_idx_type *>(Lsparse->p)[minor_p], Lsparse, cm);
204 CHOLMOD_NAME(finish) (cm); 194 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
205 CHOLMOD_NAME(print_common) (tmp, cm); 195 Lsparse->ncol = minor_p;
206 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE; 196 }
197
198 drop_zeros (Lsparse);
199
200 if (! natural)
201 {
202 perms.resize (a_nr);
203 for (octave_idx_type i = 0; i < a_nr; i++)
204 perms(i) = static_cast<octave_idx_type *>(Lfactor->Perm)[i];
205 }
206
207 static char tmp[] = " ";
208
209 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
210 CHOLMOD_NAME(free_factor) (&Lfactor, cm);
211 CHOLMOD_NAME(finish) (cm);
212 CHOLMOD_NAME(print_common) (tmp, cm);
213 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
214 }
207 #else 215 #else
208 (*current_liboctave_error_handler) 216 (*current_liboctave_error_handler)
209 ("Missing CHOLMOD. Sparse cholesky factorization disabled"); 217 ("Missing CHOLMOD. Sparse cholesky factorization disabled");
210 #endif 218 #endif
211 return info; 219 return info;