comparison src/DLD-FUNCTIONS/luinc.cc @ 7515:f3c00dc0912b

Eliminate the rest of the dispatched sparse functions
author David Bateman <dbateman@free.fr>
date Fri, 22 Feb 2008 15:50:51 +0100
parents e8d7eed42935
children 6f2d95255911
comparison
equal deleted inserted replaced
7514:4f6a73fd8df9 7515:f3c00dc0912b
88 range are ignored.\n\ 88 range are ignored.\n\
89 @end table\n\ 89 @end table\n\
90 \n\ 90 \n\
91 All other fields in @var{opts} are ignored. The outputs from @dfn{luinc}\n\ 91 All other fields in @var{opts} are ignored. The outputs from @dfn{luinc}\n\
92 are the same as for @dfn{lu}.\n\ 92 are the same as for @dfn{lu}.\n\
93 \n\
94 Given the string argument 'vector', @dfn{luinc} returns the values of @var{p}\n\
95 @var{q} as vector values.\n\
93 @seealso{sparse, lu, cholinc}\n\ 96 @seealso{sparse, lu, cholinc}\n\
94 @end deftypefn") 97 @end deftypefn")
95 { 98 {
96 int nargin = args.length (); 99 int nargin = args.length ();
97 octave_value_list retval; 100 octave_value_list retval;
98 101
99 if (nargin == 0) 102 if (nargin == 0)
100 print_usage (); 103 print_usage ();
101 else if (nargin != 2) 104 else if (nargin < 2 || nargin > 3)
102 error ("luinc: incorrect number of arguments"); 105 error ("luinc: incorrect number of arguments");
103 else 106 else
104 { 107 {
105 bool zero_level = false; 108 bool zero_level = false;
106 bool milu = false; 109 bool milu = false;
107 bool udiag = false; 110 bool udiag = false;
108 bool thresh = -1; 111 Matrix thresh;
109 double droptol = -1.; 112 double droptol = -1.;
113 bool vecout;
110 114
111 if (args(1).is_string ()) 115 if (args(1).is_string ())
112 { 116 {
113 if (args(1).string_value () == "0") 117 if (args(1).string_value () == "0")
114 zero_level = true; 118 zero_level = true;
135 139
136 udiag = (tmp == 0. ? false : true); 140 udiag = (tmp == 0. ? false : true);
137 } 141 }
138 142
139 if (map.contains ("thresh")) 143 if (map.contains ("thresh"))
140 thresh = map.contents ("thresh")(0).double_value (); 144 {
145 thresh = map.contents ("thresh")(0).matrix_value ();
146
147 if (thresh.nelem () == 1)
148 {
149 thresh.resize(1,2);
150 thresh(1) = thresh(0);
151 }
152 else if (thresh.nelem () != 2)
153 error ("chol: expecting 2 element vector for thresh");
154 }
141 } 155 }
142 else 156 else
143 droptol = args(1).double_value (); 157 droptol = args(1).double_value ();
158
159 if (nargin == 3)
160 {
161 std::string tmp = args(2).string_value ();
162
163 if (! error_state )
164 {
165 if (tmp.compare ("vector") == 0)
166 vecout = true;
167 else
168 error ("luinc: unrecognized string argument");
169 }
170 }
144 171
145 // FIXME Add code for zero-level factorization 172 // FIXME Add code for zero-level factorization
146 if (zero_level) 173 if (zero_level)
147 error ("luinc: zero-level factorization not implemented"); 174 error ("luinc: zero-level factorization not implemented");
148 175
164 { 191 {
165 case 0: 192 case 0:
166 case 1: 193 case 1:
167 case 2: 194 case 2:
168 { 195 {
169 SparseLU fact (sm, Qinit, thresh, true, droptol, 196 SparseLU fact (sm, Qinit, thresh, false, true, droptol,
170 milu, udiag); 197 milu, udiag);
171 198
172 if (! error_state) 199 if (! error_state)
173 { 200 {
174 SparseMatrix P = fact.Pr (); 201 SparseMatrix P = fact.Pr ();
182 } 209 }
183 break; 210 break;
184 211
185 case 3: 212 case 3:
186 { 213 {
187 SparseLU fact (sm, Qinit, thresh, true, droptol, 214 SparseLU fact (sm, Qinit, thresh, false, true, droptol,
188 milu, udiag); 215 milu, udiag);
189 216
190 if (! error_state) 217 if (! error_state)
191 { 218 {
192 retval(2) = fact.Pr (); 219 if (vecout)
220 retval(2) = fact.Pr_vec ();
221 else
222 retval(2) = fact.Pr ();
193 retval(1) = octave_value (fact.U (), 223 retval(1) = octave_value (fact.U (),
194 MatrixType (MatrixType::Upper)); 224 MatrixType (MatrixType::Upper));
195 retval(0) = octave_value (fact.L (), 225 retval(0) = octave_value (fact.L (),
196 MatrixType (MatrixType::Lower)); 226 MatrixType (MatrixType::Lower));
197 } 227 }
199 break; 229 break;
200 230
201 case 4: 231 case 4:
202 default: 232 default:
203 { 233 {
204 SparseLU fact (sm, Qinit, thresh, false, droptol, 234 SparseLU fact (sm, Qinit, thresh, false, false, droptol,
205 milu, udiag); 235 milu, udiag);
206 236
207 if (! error_state) 237 if (! error_state)
208 { 238 {
209 retval(3) = fact.Pc (); 239 if (vecout)
210 retval(2) = fact.Pr (); 240 {
241 retval(3) = fact.Pc_vec ();
242 retval(2) = fact.Pr_vec ();
243 }
244 else
245 {
246 retval(3) = fact.Pc ();
247 retval(2) = fact.Pr ();
248 }
211 retval(1) = octave_value (fact.U (), 249 retval(1) = octave_value (fact.U (),
212 MatrixType (MatrixType::Upper)); 250 MatrixType (MatrixType::Upper));
213 retval(0) = octave_value (fact.L (), 251 retval(0) = octave_value (fact.L (),
214 MatrixType (MatrixType::Lower)); 252 MatrixType (MatrixType::Lower));
215 } 253 }
235 { 273 {
236 case 0: 274 case 0:
237 case 1: 275 case 1:
238 case 2: 276 case 2:
239 { 277 {
240 SparseComplexLU fact (sm, Qinit, thresh, true, 278 SparseComplexLU fact (sm, Qinit, thresh, false, true,
241 droptol, milu, udiag); 279 droptol, milu, udiag);
242 280
243 281
244 if (! error_state) 282 if (! error_state)
245 { 283 {
254 } 292 }
255 break; 293 break;
256 294
257 case 3: 295 case 3:
258 { 296 {
259 SparseComplexLU fact (sm, Qinit, thresh, true, 297 SparseComplexLU fact (sm, Qinit, thresh, false, true,
260 droptol, milu, udiag); 298 droptol, milu, udiag);
261 299
262 if (! error_state) 300 if (! error_state)
263 { 301 {
264 retval(2) = fact.Pr (); 302 if (vecout)
303 retval(2) = fact.Pr_vec ();
304 else
305 retval(2) = fact.Pr ();
265 retval(1) = octave_value (fact.U (), 306 retval(1) = octave_value (fact.U (),
266 MatrixType (MatrixType::Upper)); 307 MatrixType (MatrixType::Upper));
267 retval(0) = octave_value (fact.L (), 308 retval(0) = octave_value (fact.L (),
268 MatrixType (MatrixType::Lower)); 309 MatrixType (MatrixType::Lower));
269 } 310 }
271 break; 312 break;
272 313
273 case 4: 314 case 4:
274 default: 315 default:
275 { 316 {
276 SparseComplexLU fact (sm, Qinit, thresh, false, 317 SparseComplexLU fact (sm, Qinit, thresh, false, false,
277 droptol, milu, udiag); 318 droptol, milu, udiag);
278 319
279 if (! error_state) 320 if (! error_state)
280 { 321 {
281 retval(3) = fact.Pc (); 322 if (vecout)
282 retval(2) = fact.Pr (); 323 {
324 retval(3) = fact.Pc_vec ();
325 retval(2) = fact.Pr_vec ();
326 }
327 else
328 {
329 retval(3) = fact.Pc ();
330 retval(2) = fact.Pr ();
331 }
283 retval(1) = octave_value (fact.U (), 332 retval(1) = octave_value (fact.U (),
284 MatrixType (MatrixType::Upper)); 333 MatrixType (MatrixType::Upper));
285 retval(0) = octave_value (fact.L (), 334 retval(0) = octave_value (fact.L (),
286 MatrixType (MatrixType::Lower)); 335 MatrixType (MatrixType::Lower));
287 } 336 }