Mercurial > octave
annotate src/DLD-FUNCTIONS/balance.cc @ 7789:82be108cc558
First attempt at single precision tyeps
* * *
corrections to qrupdate single precision routines
* * *
prefer demotion to single over promotion to double
* * *
Add single precision support to log2 function
* * *
Trivial PROJECT file update
* * *
Cache optimized hermitian/transpose methods
* * *
Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author | David Bateman <dbateman@free.fr> |
---|---|
date | Sun, 27 Apr 2008 22:34:17 +0200 |
parents | 29980c6b8604 |
children | a5e080076778 |
rev | line source |
---|---|
2928 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2005, 2006, |
4 2007 John W. Eaton | |
2928 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
2928 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
2928 | 21 |
22 */ | |
23 | |
3911 | 24 // Author: A. S. Hodel <scotte@eng.auburn.edu> |
2928 | 25 |
26 #ifdef HAVE_CONFIG_H | |
27 #include <config.h> | |
28 #endif | |
29 | |
30 #include <string> | |
31 | |
32 #include "CmplxAEPBAL.h" | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
33 #include "fCmplxAEPBAL.h" |
2928 | 34 #include "dbleAEPBAL.h" |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
35 #include "floatAEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
36 #include "CmplxGEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
37 #include "fCmplxGEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
38 #include "dbleGEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
39 #include "floatGEPBAL.h" |
4153 | 40 #include "quit.h" |
2928 | 41 |
42 #include "defun-dld.h" | |
43 #include "error.h" | |
3181 | 44 #include "f77-fcn.h" |
2928 | 45 #include "gripes.h" |
46 #include "oct-obj.h" | |
47 #include "utils.h" | |
48 | |
49 DEFUN_DLD (balance, args, nargout, | |
3548 | 50 "-*- texinfo -*-\n\ |
3372 | 51 @deftypefn {Loadable Function} {@var{aa} =} balance (@var{a}, @var{opt})\n\ |
52 @deftypefnx {Loadable Function} {[@var{dd}, @var{aa}] =} balance (@var{a}, @var{opt})\n\ | |
3402 | 53 @deftypefnx {Loadable Function} {[@var{cc}, @var{dd}, @var{aa}, @var{bb}] =} balance (@var{a}, @var{b}, @var{opt})\n\ |
2928 | 54 \n\ |
7096 | 55 Compute @code{aa = dd \\ a * dd} in which @code{aa} is a matrix whose\n\ |
56 row and column norms are roughly equal in magnitude, and\n\ | |
57 @code{dd} = @code{p * d}, in which @code{p} is a permutation\n\ | |
3372 | 58 matrix and @code{d} is a diagonal matrix of powers of two. This allows\n\ |
59 the equilibration to be computed without roundoff. Results of\n\ | |
60 eigenvalue calculation are typically improved by balancing first.\n\ | |
2928 | 61 \n\ |
7096 | 62 If four output values are requested, compute @code{aa = cc*a*dd} and\n\ |
63 @code{bb = cc*b*dd)}, in which @code{aa} and @code{bb} have non-zero\n\ | |
3372 | 64 elements of approximately the same magnitude and @code{cc} and @code{dd}\n\ |
65 are permuted diagonal matrices as in @code{dd} for the algebraic\n\ | |
66 eigenvalue problem.\n\ | |
67 \n\ | |
7096 | 68 The eigenvalue balancing option @code{opt} may be one of:\n\ |
2928 | 69 \n\ |
3372 | 70 @table @asis\n\ |
71 @item @code{\"N\"}, @code{\"n\"}\n\ | |
72 No balancing; arguments copied, transformation(s) set to identity.\n\ | |
73 \n\ | |
74 @item @code{\"P\"}, @code{\"p\"}\n\ | |
75 Permute argument(s) to isolate eigenvalues where possible.\n\ | |
76 \n\ | |
77 @item @code{\"S\"}, @code{\"s\"}\n\ | |
78 Scale to improve accuracy of computed eigenvalues.\n\ | |
2928 | 79 \n\ |
3372 | 80 @item @code{\"B\"}, @code{\"b\"}\n\ |
81 Permute and scale, in that order. Rows/columns of a (and b)\n\ | |
82 that are isolated by permutation are not scaled. This is the default\n\ | |
83 behavior.\n\ | |
84 @end table\n\ | |
2928 | 85 \n\ |
3372 | 86 Algebraic eigenvalue balancing uses standard @sc{Lapack} routines.\n\ |
87 \n\ | |
88 Generalized eigenvalue problem balancing uses Ward's algorithm\n\ | |
89 (SIAM Journal on Scientific and Statistical Computing, 1981).\n\ | |
90 @end deftypefn") | |
2928 | 91 { |
92 octave_value_list retval; | |
93 | |
94 int nargin = args.length (); | |
95 | |
96 if (nargin < 1 || nargin > 3 || nargout < 0 || nargout > 4) | |
97 { | |
5823 | 98 print_usage (); |
2928 | 99 return retval; |
100 } | |
101 | |
3181 | 102 // determine if it's AEP or GEP |
3185 | 103 int AEPcase = nargin == 1 ? 1 : args(1).is_string (); |
3523 | 104 std::string bal_job; |
2928 | 105 |
3181 | 106 // problem dimension |
5275 | 107 octave_idx_type nn = args(0).rows (); |
2928 | 108 |
5275 | 109 octave_idx_type arg_is_empty = empty_arg ("balance", nn, args(0).columns()); |
2928 | 110 |
111 if (arg_is_empty < 0) | |
112 return retval; | |
3185 | 113 |
2928 | 114 if (arg_is_empty > 0) |
115 return octave_value_list (2, Matrix ()); | |
116 | |
3181 | 117 if (nn != args(0).columns()) |
3185 | 118 { |
119 gripe_square_matrix_required ("balance"); | |
120 return retval; | |
121 } | |
2928 | 122 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
123 bool isfloat = args(0).is_single_type () || |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
124 (! AEPcase && args(1).is_single_type()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
125 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
126 bool complex_case = (args(0).is_complex_type () || |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
127 (! AEPcase && args(1).is_complex_type ())); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
128 |
2928 | 129 // Extract argument 1 parameter for both AEP and GEP. |
130 Matrix aa; | |
131 ComplexMatrix caa; | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
132 FloatMatrix faa; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
133 FloatComplexMatrix fcaa; |
3185 | 134 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
135 if (isfloat) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
136 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
137 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
138 fcaa = args(0).float_complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
139 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
140 faa = args(0).float_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
141 } |
3185 | 142 else |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
143 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
144 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
145 caa = args(0).complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
146 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
147 aa = args(0).matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
148 } |
3185 | 149 |
150 if (error_state) | |
151 return retval; | |
2928 | 152 |
153 // Treat AEP/GEP cases. | |
3185 | 154 if (AEPcase) |
155 { | |
156 // Algebraic eigenvalue problem. | |
2928 | 157 |
3185 | 158 if (nargin == 1) |
159 bal_job = "B"; | |
160 else if (args(1).is_string ()) | |
161 bal_job = args(1).string_value (); | |
3181 | 162 else |
3185 | 163 { |
164 error ("balance: AEP argument 2 must be a string"); | |
165 return retval; | |
166 } | |
167 | |
168 // balance the AEP | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
169 if (isfloat) |
3185 | 170 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
171 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
172 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
173 FloatComplexAEPBALANCE result (fcaa, bal_job); |
2928 | 174 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
175 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
176 retval(0) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
177 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
178 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
179 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
180 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
181 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
182 } |
3185 | 183 else |
184 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
185 FloatAEPBALANCE result (faa, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
186 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
187 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
188 retval(0) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
189 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
190 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
191 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
192 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
193 } |
3185 | 194 } |
195 } | |
3181 | 196 else |
3185 | 197 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
198 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
199 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
200 ComplexAEPBALANCE result (caa, bal_job); |
3185 | 201 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
202 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
203 retval(0) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
204 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
205 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
206 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
207 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
208 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
209 } |
3185 | 210 else |
211 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
212 AEPBALANCE result (aa, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
213 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
214 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
215 retval(0) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
216 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
217 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
218 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
219 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
220 } |
3185 | 221 } |
222 } | |
3181 | 223 } |
224 else | |
225 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
226 if (nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
227 warning ("balance: used GEP, should have two output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
228 |
3185 | 229 // Generalized eigenvalue problem. |
230 if (nargin == 2) | |
231 bal_job = "B"; | |
232 else if (args(2).is_string ()) | |
233 bal_job = args(2).string_value (); | |
234 else | |
235 { | |
236 error ("balance: GEP argument 3 must be a string"); | |
237 return retval; | |
238 } | |
239 | |
240 if ((nn != args(1).columns ()) || (nn != args(1).rows ())) | |
241 { | |
242 gripe_nonconformant (); | |
243 return retval; | |
244 } | |
245 | |
246 Matrix bb; | |
247 ComplexMatrix cbb; | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
248 FloatMatrix fbb; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
249 FloatComplexMatrix fcbb; |
3185 | 250 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
251 if (isfloat) |
3185 | 252 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
253 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
254 fcbb = args(1).float_complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
255 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
256 fbb = args(1).float_matrix_value (); |
3185 | 257 } |
258 else | |
259 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
260 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
261 cbb = args(1).complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
262 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
263 bb = args(1).matrix_value (); |
3185 | 264 } |
4153 | 265 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
266 // balance the GEP |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
267 if (isfloat) |
3185 | 268 { |
269 if (complex_case) | |
270 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
271 FloatComplexGEPBALANCE result (fcaa, fcbb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
272 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
273 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
274 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
275 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
276 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
277 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
278 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
279 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
280 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
281 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
282 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
283 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
284 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
285 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
286 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
287 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
288 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
289 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
290 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
291 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
292 } |
3185 | 293 } |
294 else | |
295 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
296 FloatGEPBALANCE result (faa, fbb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
297 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
298 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
299 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
300 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
301 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
302 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
303 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
304 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
305 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
306 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
307 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
308 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
309 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
310 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
311 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
312 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
313 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
314 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
315 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
316 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
317 } |
3185 | 318 } |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
319 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
320 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
321 { |
3185 | 322 if (complex_case) |
323 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
324 ComplexGEPBALANCE result (caa, cbb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
325 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
326 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
327 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
328 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
329 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
330 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
331 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
332 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
333 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
334 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
335 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
336 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
337 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
338 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
339 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
340 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
341 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
342 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
343 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
344 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
345 } |
3185 | 346 } |
347 else | |
348 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
349 GEPBALANCE result (aa, bb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
350 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
351 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
352 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
353 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
354 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
355 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
356 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
357 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
358 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
359 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
360 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
361 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
362 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
363 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
364 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
365 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
366 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
367 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
368 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
369 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
370 } |
3185 | 371 } |
372 } | |
2928 | 373 } |
3185 | 374 |
2928 | 375 return retval; |
376 } | |
377 | |
378 /* | |
379 ;;; Local Variables: *** | |
380 ;;; mode: C++ *** | |
381 ;;; End: *** | |
382 */ |