annotate src/tc-rep.cc @ 578:d169be9237fb

[project @ 1994-08-03 20:06:54 by jwe]
author jwe
date Wed, 03 Aug 1994 20:07:26 +0000
parents 7ea224e713cd
children bc813f5eb025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
1 // tc-rep.cc -*- C++ -*-
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1992, 1993, 1994 John W. Eaton
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
7
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
11 later version.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
12
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
16 for more details.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
17
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
21
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
22 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
23
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
25 #include "config.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
26 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
27
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
28 #if defined (__GNUG__)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
29 #pragma implementation
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
30 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
31
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
32 #include <ctype.h>
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
33 #include <string.h>
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
34 #include <fstream.h>
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
35 #include <iostream.h>
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
36 #include <strstream.h>
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
37
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
38 #include "mx-base.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
39 #include "Range.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
40
504
be155b3d5a2f [project @ 1994-07-08 23:45:33 by jwe]
jwe
parents: 500
diff changeset
41 #include "arith-ops.h"
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
42 #include "variables.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
43 #include "error.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
44 #include "gripes.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
45 #include "user-prefs.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
46 #include "utils.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
47 #include "pager.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
48 #include "pr-output.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
49 #include "tree-const.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
50 #include "idx-vector.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
51
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
52 #include "tc-inlines.cc"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
53
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
54 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
55 * How about a few macros?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
56 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
57
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
58 #ifndef MAX
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
59 #define MAX(a,b) ((a) > (b) ? (a) : (b))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
60 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
61
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
62 #ifndef MIN
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
63 #define MIN(a,b) ((a) < (b) ? (a) : (b))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
64 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
65
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
66 #ifndef ABS
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
67 #define ABS(x) (((x) < 0) ? (-x) : (x))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
68 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
69
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
70 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
71 * The following are used by some of the functions in the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
72 * tree_constant_rep class that must deal with real and complex
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
73 * matrices. This was not done with overloaded or virtual functions
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
74 * from the Matrix class because there is no clean way to do that --
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
75 * the necessary functions (like elem) need to return values of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
76 * different types...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
77 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
78
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
79 // Given a tree_constant, and the names to be used for the real and
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
80 // complex matrix and their dimensions, declare a real or complex
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
81 // matrix, and initialize it from the tree_constant. Note that m, cm,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
82 // nr, and nc must not be previously declared, and they must not be
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
83 // expressions. Since only one of the matrices will be defined after
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
84 // this macro is used, only one set of dimesions is declared.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
85
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
86 // This macro only makes sense inside a friend or member function of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
87 // the tree_constant_rep class
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
88
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
89 #define REP_RHS_MATRIX(tc,m,cm,nr,nc) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
90 int nr = 0; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
91 int nc = 0; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
92 Matrix m; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
93 ComplexMatrix cm; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
94 if ((tc).const_type () == tree_constant_rep::complex_matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
95 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
96 cm = (tc).complex_matrix_value (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
97 nr = (cm).rows (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
98 nc = (cm).columns (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
99 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
100 else if ((tc).const_type () == tree_constant_rep::matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
101 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
102 m = (tc).matrix_value (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
103 nr = (m).rows (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
104 nc = (m).columns (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
105 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
106 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
107 abort ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
108
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
109 // Assign a real or complex value to a tree_constant.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
110 //
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
111 // This macro only makes sense inside a friend or member function of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
112 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
113
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
114 #define REP_ELEM_ASSIGN(i,j,rval,cval,real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
115 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
116 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
117 if (type_tag == tree_constant_rep::matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
118 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
119 if (real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
120 matrix->elem ((i), (j)) = (rval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
121 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
122 abort (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
123 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
124 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
125 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
126 if (real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
127 complex_matrix->elem ((i), (j)) = (rval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
128 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
129 complex_matrix->elem ((i), (j)) = (cval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
130 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
131 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
132 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
133
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
134 // Given a real and complex matrix and row and column dimensions,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
135 // declare both and size one of them. Only one of the matrices should
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
136 // be used after this macro has been used.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
137
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
138 // This macro only makes sense inside a friend or member function of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
139 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
140
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
141 #define CRMATRIX(m,cm,nr,nc) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
142 Matrix m; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
143 ComplexMatrix cm; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
144 if (type_tag == tree_constant_rep::matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
145 (m).resize ((nr), (nc)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
146 else if (type_tag == complex_matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
147 (cm).resize ((nr), (nc)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
148 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
149 abort (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
150
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
151 // Assign a real or complex matrix to a tree constant.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
152
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
153 // This macro only makes sense inside a friend or member function of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
154 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
155
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
156 #define ASSIGN_CRMATRIX_TO(tc,m,cm) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
157 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
158 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
159 if (type_tag == matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
160 tc = tree_constant (m); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
161 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
162 tc = tree_constant (cm); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
163 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
164 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
165
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
166 // Assign an element of this tree_constant_rep's real or complex
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
167 // matrix to another real or complex matrix.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
168
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
169 // This macro only makes sense inside a friend or member function of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
170 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
171
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
172 #define CRMATRIX_ASSIGN_REP_ELEM(m,cm,i1,j1,i2,j2) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
173 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
174 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
175 if (type_tag == matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
176 (m).elem ((i1), (j1)) = matrix->elem ((i2), (j2)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
177 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
178 (cm).elem ((i1), (j1)) = complex_matrix->elem ((i2), (j2)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
179 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
180 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
181
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
182 // Assign a value to an element of a real or complex matrix. Assumes
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
183 // that the lhs and rhs are either both real or both complex types.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
184
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
185 #define CRMATRIX_ASSIGN_ELEM(m,cm,i,j,rval,cval,real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
186 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
187 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
188 if (real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
189 (m).elem ((i), (j)) = (rval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
190 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
191 (cm).elem ((i), (j)) = (cval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
192 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
193 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
194
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
195
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
196 // A couple of handy helper functions.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
197
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
198 static int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
199 any_element_less_than (const Matrix& a, double val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
200 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
201 int nr = a.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
202 int nc = a.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
203 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
204 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
205 if (a.elem (i, j) < val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
206 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
207 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
208 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
209
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
210 static int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
211 any_element_greater_than (const Matrix& a, double val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
212 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
213 int nr = a.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
214 int nc = a.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
215 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
216 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
217 if (a.elem (i, j) > val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
218 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
219 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
220 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
221
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
222 static int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
223 any_element_is_complex (const ComplexMatrix& a)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
224 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
225 int nr = a.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
226 int nc = a.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
227 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
228 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
229 if (imag (a.elem (i, j)) != 0.0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
230 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
231 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
232 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
233
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
234 // Now, the classes.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
235
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
236 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
237 * The real representation of constants.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
238 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
239 tree_constant_rep::tree_constant_rep (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
240 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
241 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
242 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
243
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
244 tree_constant_rep::tree_constant_rep (double d)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
245 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
246 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
247 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
248 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
249
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
250 tree_constant_rep::tree_constant_rep (const Matrix& m)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
251 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
252 if (m.rows () == 1 && m.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
253 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
254 scalar = m.elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
255 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
256 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
257 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
258 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
259 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
260 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
261 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
262 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
263
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
264 tree_constant_rep::tree_constant_rep (const DiagMatrix& d)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
265 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
266 if (d.rows () == 1 && d.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
267 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
268 scalar = d.elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
269 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
270 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
271 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
272 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
273 matrix = new Matrix (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
274 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
275 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
276 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
277
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
278 tree_constant_rep::tree_constant_rep (const RowVector& v, int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
279 prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
280 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
281 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
282 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
283 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
284 scalar = v.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
285 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
286 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
287 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
288 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
289 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
290 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
291 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
292
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
293 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
294 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
295 Matrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
296 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
297 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
298 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
299 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
300 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
301 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
302 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
303 Matrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
304 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
305 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
306 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
307 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
308 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
309 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
310 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
311
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
312 tree_constant_rep::tree_constant_rep (const ColumnVector& v,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
313 int prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
314 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
315 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
316 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
317 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
318 scalar = v.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
319 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
320 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
321 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
322 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
323 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
324 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
325 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
326
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
327 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
328 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
329 Matrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
330 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
331 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
332 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
333 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
334 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
335 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
336 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
337 Matrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
338 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
339 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
340 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
341 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
342 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
343 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
344 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
345
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
346 tree_constant_rep::tree_constant_rep (const Complex& c)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
347 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
348 complex_scalar = new Complex (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
349 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
350 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
351
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
352 tree_constant_rep::tree_constant_rep (const ComplexMatrix& m)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
353 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
354 if (m.rows () == 1 && m.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
355 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
356 complex_scalar = new Complex (m.elem (0, 0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
357 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
358 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
359 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
360 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
361 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
362 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
363 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
364 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
365
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
366 tree_constant_rep::tree_constant_rep (const ComplexDiagMatrix& d)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
367 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
368 if (d.rows () == 1 && d.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
369 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
370 complex_scalar = new Complex (d.elem (0, 0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
371 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
372 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
373 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
374 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
375 complex_matrix = new ComplexMatrix (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
376 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
377 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
378 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
379
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
380 tree_constant_rep::tree_constant_rep (const ComplexRowVector& v,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
381 int prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
382 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
383 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
384 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
385 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
386 complex_scalar = new Complex (v.elem (0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
387 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
388 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
389 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
390 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
391 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
392 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
393 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
394
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
395 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
396 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
397 ComplexMatrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
398 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
399 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
400 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
401 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
402 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
403 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
404 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
405 ComplexMatrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
406 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
407 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
408 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
409 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
410 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
411 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
412 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
413
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
414 tree_constant_rep::tree_constant_rep (const ComplexColumnVector& v,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
415 int prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
416 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
417 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
418 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
419 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
420 complex_scalar = new Complex (v.elem (0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
421 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
422 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
423 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
424 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
425 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
426 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
427 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
428
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
429 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
430 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
431 ComplexMatrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
432 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
433 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
434 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
435 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
436 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
437 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
438 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
439 ComplexMatrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
440 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
441 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
442 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
443 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
444 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
445 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
446 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
447
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
448 tree_constant_rep::tree_constant_rep (const char *s)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
449 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
450 string = strsave (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
451 type_tag = string_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
452 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
453
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
454 tree_constant_rep::tree_constant_rep (double b, double l, double i)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
455 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
456 range = new Range (b, l, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
457 int nel = range->nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
458 if (nel < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
459 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
460 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
461 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
462 if (nel == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
463 ::error ("number of elements in range exceeds INT_MAX");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
464 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
465 ::error ("invalid range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
466 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
467 else if (nel > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
468 type_tag = range_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
469 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
470 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
471 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
472 if (nel == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
473 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
474 scalar = b;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
475 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
476 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
477 else if (nel == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
478 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
479 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
480 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
481 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
482 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
483 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
484 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
485 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
486
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
487 tree_constant_rep::tree_constant_rep (const Range& r)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
488 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
489 if (r.nelem () > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
490 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
491 range = new Range (r);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
492 type_tag = range_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
493 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
494 else if (r.nelem () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
495 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
496 scalar = r.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
497 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
498 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
499 else if (r.nelem () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
500 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
501 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
502 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
503 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
504 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
505 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
506 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
507
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
508 tree_constant_rep::tree_constant_rep (tree_constant_rep::constant_type t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
509 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
510 assert (t == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
511
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
512 type_tag = magic_colon;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
513 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
514
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
515 tree_constant_rep::tree_constant_rep (const tree_constant_rep& t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
516 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
517 type_tag = t.type_tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
518
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
519 switch (t.type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
520 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
521 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
522 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
523 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
524 scalar = t.scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
525 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
526 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
527 matrix = new Matrix (*(t.matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
528 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
529 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
530 string = strsave (t.string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
531 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
532 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
533 complex_matrix = new ComplexMatrix (*(t.complex_matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
534 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
535 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
536 complex_scalar = new Complex (*(t.complex_scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
537 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
538 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
539 range = new Range (*(t.range));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
540 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
541 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
542 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
543 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
544 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
545 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
546 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
547 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
548
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
549 tree_constant_rep::~tree_constant_rep (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
550 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
551 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
552 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
553 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
554 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
555 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
556 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
557 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
558 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
559 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
560 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
561 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
562 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
563 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
564 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
565 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
566 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
567 delete [] string;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
568 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
569 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
570 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
571 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
572 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
573 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
574 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
575 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
576 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
577 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
578 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
579
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
580 #if defined (MDEBUG)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
581 void *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
582 tree_constant_rep::operator new (size_t size)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
583 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
584 tree_constant_rep *p = ::new tree_constant_rep;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
585 cerr << "tree_constant_rep::new(): " << p << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
586 return p;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
587 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
588
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
589 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
590 tree_constant_rep::operator delete (void *p, size_t size)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
591 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
592 cerr << "tree_constant_rep::delete(): " << p << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
593 ::delete p;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
594 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
595 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
596
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
597 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
598 tree_constant_rep::resize (int i, int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
599 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
600 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
601 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
602 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
603 matrix->resize (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
604 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
605 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
606 complex_matrix->resize (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
607 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
608 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
609 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
610 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
611 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
612 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
613
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
614 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
615 tree_constant_rep::resize (int i, int j, double val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
616 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
617 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
618 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
619 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
620 matrix->resize (i, j, val);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
621 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
622 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
623 complex_matrix->resize (i, j, val);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
624 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
625 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
626 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
627 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
628 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
629 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
630
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
631 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
632 tree_constant_rep::maybe_resize (int i, int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
633 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
634 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
635 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
636
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
637 i++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
638 j++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
639
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
640 assert (i > 0 && j > 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
641
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
642 if (i > nr || j > nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
643 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
644 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
645 resize (MAX (i, nr), MAX (j, nc), 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
646 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
647 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
648 if (i > nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
649 ::error ("row index = %d exceeds max row dimension = %d", i, nr);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
650
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
651 if (j > nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
652 ::error ("column index = %d exceeds max column dimension = %d",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
653 j, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
654 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
655 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
656 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
657
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
658 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
659 tree_constant_rep::maybe_resize (int i, force_orient f_orient)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
660 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
661 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
662 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
663
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
664 i++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
665
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
666 assert (i >= 0 && (nr <= 1 || nc <= 1));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
667
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
668 // This function never reduces the size of a vector, and all vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
669 // have dimensions of at least 0x0. If i is 0, it is either because
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
670 // a vector has been indexed with a vector of all zeros (in which case
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
671 // the index vector is empty and nothing will happen) or a vector has
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
672 // been indexed with 0 (an error which will be caught elsewhere).
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
673 if (i == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
674 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
675
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
676 if (nr <= 1 && nc <= 1 && i >= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
677 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
678 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
679 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
680 if (f_orient == row_orient)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
681 resize (1, i, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
682 else if (f_orient == column_orient)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
683 resize (i, 1, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
684 else if (user_pref.prefer_column_vectors)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
685 resize (i, 1, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
686 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
687 resize (1, i, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
688 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
689 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
690 ::error ("matrix index = %d exceeds max dimension = %d", i, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
691 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
692 else if (nr == 1 && i > nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
693 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
694 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
695 resize (1, i, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
696 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
697 ::error ("matrix index = %d exceeds max dimension = %d", i, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
698 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
699 else if (nc == 1 && i > nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
700 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
701 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
702 resize (i, 1, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
703 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
704 ::error ("matrix index = %d exceeds max dimension = ", i, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
705 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
706 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
707
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
708 double
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
709 tree_constant_rep::to_scalar (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
710 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
711 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
712
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
713 double retval = 0.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
714
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
715 switch (tmp.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
716 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
717 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
718 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
719 retval = tmp.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
720 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
721 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
722 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
723 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
724 Matrix m = tmp.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
725 retval = m (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
726 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
727 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
728 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
729 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
730 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
731 int flag = user_pref.ok_to_lose_imaginary_part;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
732 if (flag == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
733 warning ("implicit conversion of complex value to real value");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
734
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
735 if (flag != 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
736 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
737 ComplexMatrix m = tmp.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
738 return ::real (m (0, 0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
739 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
740 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
741 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
742 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
743 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
744 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
745 ::error ("complex matrix used in invalid context");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
746 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
747 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
748 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
749 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
750 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
751 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
752 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
753 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
754
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
755 ColumnVector
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
756 tree_constant_rep::to_vector (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
757 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
758 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
759
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
760 ColumnVector retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
761
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
762 switch (tmp.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
763 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
764 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
765 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
766 retval.resize (1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
767 retval.elem (0) = tmp.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
768 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
769 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
770 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
771 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
772 Matrix m = tmp.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
773 int nr = m.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
774 int nc = m.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
775 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
776 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
777 retval.resize (nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
778 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
779 retval.elem (i) = m (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
780 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
781 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
782 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
783 retval.resize (nr);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
784 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
785 retval.elem (i) = m.elem (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
786 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
787 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
788 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
789 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
790 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
791 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
792 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
793 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
794 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
795
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
796 Matrix
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
797 tree_constant_rep::to_matrix (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
798 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
799 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
800
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
801 Matrix retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
802
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
803 switch (tmp.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
804 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
805 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
806 retval.resize (1, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
807 retval.elem (0, 0) = tmp.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
808 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
809 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
810 retval = tmp.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
811 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
812 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
813 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
814 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
815 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
816 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
817
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
818 tree_constant_rep::constant_type
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
819 tree_constant_rep::force_numeric (int force_str_conv)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
820 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
821 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
822 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
823 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
824 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
825 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
826 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
827 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
828 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
829 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
830 if (! force_str_conv && ! user_pref.implicit_str_to_num_ok)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
831 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
832 ::error ("failed to convert `%s' to a numeric type --", string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
833 ::error ("default conversion turned off");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
834 // Abort!
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
835 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
836 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
837
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
838 int len = strlen (string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
839 if (len > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
840 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
841 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
842 Matrix *tm = new Matrix (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
843 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
844 tm->elem (0, i) = toascii ((int) string[i]);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
845 matrix = tm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
846 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
847 else if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
848 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
849 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
850 scalar = toascii ((int) string[0]);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
851 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
852 else if (len == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
853 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
854 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
855 matrix = new Matrix (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
856 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
857 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
858 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
859 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
860 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
861 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
862 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
863 int len = range->nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
864 if (len > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
865 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
866 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
867 Matrix *tm = new Matrix (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
868 double b = range->base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
869 double increment = range->inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
870 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
871 tm->elem (0, i) = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
872 matrix = tm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
873 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
874 else if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
875 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
876 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
877 scalar = range->base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
878 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
879 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
880 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
881 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
882 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
883 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
884 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
885 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
886 return type_tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
887 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
888
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
889 tree_constant
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
890 tree_constant_rep::make_numeric (int force_str_conv) const
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
891 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
892 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
893 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
894 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
895 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
896 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
897 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
898 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
899 retval = tree_constant (*matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
900 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
901 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
902 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
903 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
904 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
905 retval = tree_constant (*complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
906 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
907 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
908 retval = tree_constant (string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
909 retval.force_numeric (force_str_conv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
910 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
911 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
912 retval = tree_constant (*range);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
913 retval.force_numeric (force_str_conv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
914 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
915 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
916 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
917 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
918 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
919 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
920 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
921 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
922
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
923 tree_constant
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
924 do_binary_op (tree_constant& a, tree_constant& b, tree_expression::type t)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
925 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
926 tree_constant ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
927
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
928 int first_empty = (a.rows () == 0 || a.columns () == 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
929 int second_empty = (b.rows () == 0 || b.columns () == 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
930
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
931 if (first_empty || second_empty)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
932 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
933 int flag = user_pref.propagate_empty_matrices;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
934 if (flag < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
935 warning ("binary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
936 else if (flag == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
937 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
938 ::error ("invalid binary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
939 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
940 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
941 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
942
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
943 tree_constant tmp_a = a.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
944 tree_constant tmp_b = b.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
945
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
946 tree_constant_rep::constant_type a_type = tmp_a.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
947 tree_constant_rep::constant_type b_type = tmp_b.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
948
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
949 double d1, d2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
950 Matrix m1, m2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
951 Complex c1, c2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
952 ComplexMatrix cm1, cm2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
953
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
954 switch (a_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
955 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
956 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
957 d1 = tmp_a.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
958 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
959 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
960 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
961 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
962 ans = do_binary_op (d1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
963 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
964 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
965 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
966 ans = do_binary_op (d1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
967 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
968 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
969 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
970 ans = do_binary_op (d1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
971 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
972 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
973 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
974 ans = do_binary_op (d1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
975 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
976 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
977 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
978 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
979 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
980 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
981 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
982 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
983 m1 = tmp_a.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
984 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
985 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
986 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
987 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
988 ans = do_binary_op (m1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
989 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
990 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
991 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
992 ans = do_binary_op (m1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
993 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
994 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
995 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
996 ans = do_binary_op (m1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
997 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
998 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
999 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1000 ans = do_binary_op (m1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1001 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1002 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1003 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1004 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1005 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1006 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1007 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1008 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1009 c1 = tmp_a.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1010 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1011 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1012 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1013 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1014 ans = do_binary_op (c1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1015 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1016 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1017 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1018 ans = do_binary_op (c1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1019 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1020 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1021 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1022 ans = do_binary_op (c1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1023 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1024 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1025 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1026 ans = do_binary_op (c1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1027 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1028 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1029 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1030 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1031 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1032 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1033 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1034 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1035 cm1 = tmp_a.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1036 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1037 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1038 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1039 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1040 ans = do_binary_op (cm1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1041 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1042 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1043 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1044 ans = do_binary_op (cm1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1045 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1046 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1047 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1048 ans = do_binary_op (cm1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1049 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1050 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1051 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1052 ans = do_binary_op (cm1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1053 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1054 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1055 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1056 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1057 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1058 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1059 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1060 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1061 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1062 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1063 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1064 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1065 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1066 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1067
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1068 tree_constant
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
1069 do_unary_op (tree_constant& a, tree_expression::type t)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1070 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1071 tree_constant ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1072
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1073 if (a.rows () == 0 || a.columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1074 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1075 int flag = user_pref.propagate_empty_matrices;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1076 if (flag < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1077 warning ("unary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1078 else if (flag == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1079 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1080 ::error ("invalid unary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1081 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1082 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1083 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1084
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1085 tree_constant tmp_a = a.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1086
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1087 switch (tmp_a.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1088 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1089 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1090 ans = do_unary_op (tmp_a.double_value (), t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1091 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1092 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1093 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1094 Matrix m = tmp_a.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1095 ans = do_unary_op (m, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1096 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1097 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1098 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1099 ans = do_unary_op (tmp_a.complex_value (), t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1100 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1101 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1102 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1103 ComplexMatrix m = tmp_a.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1104 ans = do_unary_op (m, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1105 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1106 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1107 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1108 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1109 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1110 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1111 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1112 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1113 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1114
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1115 void
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
1116 tree_constant_rep::bump_value (tree_expression::type etype)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1117 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1118 switch (etype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1119 {
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
1120 case tree_expression::increment:
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1121 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1122 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1123 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1124 scalar++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1125 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1126 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1127 *matrix = *matrix + 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1128 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1129 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1130 *complex_scalar = *complex_scalar + 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1131 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1132 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1133 *complex_matrix = *complex_matrix + 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1134 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1135 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1136 ::error ("string++ and ++string not implemented yet, ok?");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1137 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1138 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1139 range->set_base (range->base () + 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1140 range->set_limit (range->limit () + 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1141 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1142 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1143 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1144 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1145 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1146 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1147 break;
578
d169be9237fb [project @ 1994-08-03 20:06:54 by jwe]
jwe
parents: 529
diff changeset
1148 case tree_expression::decrement:
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1149 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1150 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1151 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1152 scalar--;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1153 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1154 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1155 *matrix = *matrix - 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1156 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1157 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1158 ::error ("string-- and -- string not implemented yet, ok?");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1159 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1160 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1161 range->set_base (range->base () - 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1162 range->set_limit (range->limit () - 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1163 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1164 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1165 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1166 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1167 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1168 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1169 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1170 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1171 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1172 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1173 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1174 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1175
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1176 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1177 tree_constant_rep::maybe_mutate (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1178 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1179 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1180 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1181
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1182 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1183 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1184 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1185 if (::imag (*complex_scalar) == 0.0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1186 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1187 double d = ::real (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1188 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1189 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1190 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1191 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1192 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1193 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1194 if (! any_element_is_complex (*complex_matrix))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1195 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1196 Matrix *m = new Matrix (::real (*complex_matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1197 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1198 matrix = m;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1199 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1200 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1201 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1202 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1203 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1204 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1205 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1206 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1207 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1208 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1209 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1210 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1211 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1212
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1213 // Avoid calling rows() and columns() for things like magic_colon.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1214
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1215 int nr = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1216 int nc = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1217 if (type_tag == matrix_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1218 || type_tag == complex_matrix_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1219 || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1220 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1221 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1222 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1223 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1224
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1225 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1226 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1227 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1228 if (nr == 1 && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1229 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1230 double d = matrix->elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1231 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1232 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1233 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1234 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1235 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1236 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1237 if (nr == 1 && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1238 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1239 Complex c = complex_matrix->elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1240 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1241 complex_scalar = new Complex (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1242 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1243 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1244 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1245 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1246 if (nr == 1 && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1247 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1248 double d = range->base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1249 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1250 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1251 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1252 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1253 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1254 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1255 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1256 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1257 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1258
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1259 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1260 tree_constant_rep::print (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1261 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1262 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1263 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1264
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1265 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1266 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1267
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1268 if (print)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1269 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1270 ostrstream output_buf;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1271 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1272 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1273 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1274 octave_print_internal (output_buf, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1275 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1276 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1277 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1278 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1279 output_buf << "[]";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1280 if (user_pref.print_empty_dimensions)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1281 output_buf << "(" << nr << "x" << nc << ")";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1282 output_buf << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1283 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1284 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1285 octave_print_internal (output_buf, *matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1286 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1287 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1288 octave_print_internal (output_buf, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1289 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1290 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1291 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1292 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1293 output_buf << "[]";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1294 if (user_pref.print_empty_dimensions)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1295 output_buf << "(" << nr << "x" << nc << ")";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1296 output_buf << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1297 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1298 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1299 octave_print_internal (output_buf, *complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1300 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1301 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1302 output_buf << string << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1303 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1304 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1305 octave_print_internal (output_buf, *range);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1306 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1307 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1308 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1309 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1310 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1311 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1312
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1313 output_buf << ends;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1314 maybe_page_output (output_buf);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1315 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1316 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1317
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1318 tree_constant
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
1319 tree_constant_rep::do_index (const Octave_object& args)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1320 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1321 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1322
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1323 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1324 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1325
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1326 if (rows () == 0 || columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1327 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1328 ::error ("attempt to index empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1329 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1330 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1331
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1332 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1333 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1334 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1335 case scalar_constant:
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
1336 retval = do_scalar_index (args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1337 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1338 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1339 case matrix_constant:
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
1340 retval = do_matrix_index (args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1341 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1342 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1343 gripe_string_invalid ();
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
1344 // retval = do_string_index (args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1345 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1346 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1347 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1348 // This isn\'t great, but it\'s easier than implementing a lot of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1349 // range indexing functions.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1350 force_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1351 assert (type_tag != magic_colon && type_tag != range_constant);
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
1352 retval = do_index (args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1353 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1354 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1355 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1356 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1357 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1358
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1359 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1360 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1361
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1362 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1363 tree_constant_rep::save (ostream& os, int mark_as_global, int precision)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1364 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1365 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1366 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1367 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1368 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1369 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1370 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1371 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1372 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1373 if (mark_as_global)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1374 os << "# type: global ";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1375 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1376 os << "# type: ";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1377 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1378 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1379 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1380 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1381 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1382
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1383 long old_precision = os.precision ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1384 os.precision (precision);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1385
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1386 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1387 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1388 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1389 os << "scalar\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1390 << scalar << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1391 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1392 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1393 os << "matrix\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1394 << "# rows: " << rows () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1395 << "# columns: " << columns () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1396 << *matrix ;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1397 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1398 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1399 os << "complex scalar\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1400 << *complex_scalar << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1401 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1402 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1403 os << "complex matrix\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1404 << "# rows: " << rows () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1405 << "# columns: " << columns () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1406 << *complex_matrix ;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1407 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1408 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1409 os << "string\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1410 << "# length: " << strlen (string) << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1411 << string << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1412 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1413 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1414 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1415 os << "range\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1416 << "# base, limit, increment\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1417 << range->base () << " "
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1418 << range->limit () << " "
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1419 << range->inc () << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1420 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1421 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1422 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1423 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1424 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1425 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1426 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1427
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1428 os.precision (old_precision);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1429
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1430 // Really want to return 1 only if write is successful.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1431 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1432 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1433
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1434 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1435 tree_constant_rep::save_three_d (ostream& os, int parametric)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1436 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1437 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1438 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1439
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1440 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1441 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1442 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1443 os << "# 3D data...\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1444 << "# type: matrix\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1445 << "# total rows: " << nr << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1446 << "# total columns: " << nc << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1447
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1448 if (parametric)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1449 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1450 int extras = nc % 3;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1451 if (extras)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1452 warning ("ignoring last %d columns", extras);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1453
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1454 for (int i = 0; i < nc-extras; i += 3)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1455 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1456 os << matrix->extract (0, i, nr-1, i+2);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1457 if (i+3 < nc-extras)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1458 os << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1459 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1460 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1461 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1462 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1463 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1464 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1465 os << matrix->extract (0, i, nr-1, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1466 if (i+1 < nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1467 os << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1468 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1469 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1470 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1471 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1472 ::error ("for now, I can only save real matrices in 3D format");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1473 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1474 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1475 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1476 // Really want to return 1 only if write is successful.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1477 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1478 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1479
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1480 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1481 tree_constant_rep::load (istream& is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1482 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1483 int is_global = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1484
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1485 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1486
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1487 // Look for type keyword
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1488
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1489 char *tag = extract_keyword (is, "type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1490
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
1491 if (tag && *tag)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1492 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1493 char *ptr = strchr (tag, ' ');
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
1494 if (ptr)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1495 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1496 *ptr = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1497 is_global = (strncmp (tag, "global", 6) == 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1498 *ptr = ' ';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1499 if (is_global)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1500 ptr++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1501 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1502 ptr = tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1503 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1504 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1505 ptr = tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1506
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1507 if (strncmp (ptr, "scalar", 6) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1508 type_tag = load (is, scalar_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1509 else if (strncmp (ptr, "matrix", 6) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1510 type_tag = load (is, matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1511 else if (strncmp (ptr, "complex scalar", 14) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1512 type_tag = load (is, complex_scalar_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1513 else if (strncmp (ptr, "complex matrix", 14) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1514 type_tag = load (is, complex_matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1515 else if (strncmp (ptr, "string", 6) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1516 type_tag = load (is, string_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1517 else if (strncmp (ptr, "range", 5) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1518 type_tag = load (is, range_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1519 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1520 ::error ("unknown constant type `%s'", tag);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1521 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1522 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1523 ::error ("failed to extract keyword specifying value type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1524
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1525 delete [] tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1526
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1527 return is_global;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1528 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1529
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1530 tree_constant_rep::constant_type
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1531 tree_constant_rep::load (istream& is, tree_constant_rep::constant_type t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1532 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1533 tree_constant_rep::constant_type status = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1534
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1535 switch (t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1536 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1537 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1538 is >> scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1539 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1540 status = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1541 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1542 ::error ("failed to load scalar constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1543 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1544 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1545 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1546 int nr = 0, nc = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1547
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1548 if (extract_keyword (is, "rows", nr) && nr > 0
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1549 && extract_keyword (is, "columns", nc) && nc > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1550 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1551 matrix = new Matrix (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1552 is >> *matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1553 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1554 status = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1555 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1556 ::error ("failed to load matrix constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1557 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1558 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1559 ::error ("failed to extract number of rows and columns");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1560 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1561 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1562 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1563 complex_scalar = new Complex;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1564 is >> *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1565 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1566 status = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1567 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1568 ::error ("failed to load complex scalar constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1569 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1570 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1571 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1572 int nr = 0, nc = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1573
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1574 if (extract_keyword (is, "rows", nr) && nr > 0
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1575 && extract_keyword (is, "columns", nc) && nc > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1576 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1577 complex_matrix = new ComplexMatrix (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1578 is >> *complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1579 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1580 status = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1581 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1582 ::error ("failed to load complex matrix constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1583 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1584 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1585 ::error ("failed to extract number of rows and columns");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1586 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1587 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1588 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1589 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1590 int len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1591 if (extract_keyword (is, "length", len) && len > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1592 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1593 string = new char [len+1];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1594 is.get (string, len+1, EOF);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1595 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1596 status = string_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1597 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1598 ::error ("failed to load string constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1599 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1600 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1601 ::error ("failed to extract string length");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1602 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1603 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1604 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1605 skip_comments (is);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1606 range = new Range ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1607 is >> *range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1608 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1609 status = range_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1610 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1611 ::error ("failed to load range constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1612 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1613 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1614 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1615 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1616 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1617 return status;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1618 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1619
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1620 double
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1621 tree_constant_rep::double_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1622 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1623 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1624 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1625 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1626 return scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1627 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1628 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1629 int flag = user_pref.ok_to_lose_imaginary_part;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1630 if (flag == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1631 warning ("implicit conversion of complex value to real value");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1632
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1633 if (flag != 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1634 return ::real (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1635
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1636 ::error ("implicit conversion of complex value to real value");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1637 ::error ("not allowed");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1638 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1639 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1640 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1641 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1642 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1643 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1644 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1645
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1646 Matrix
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1647 tree_constant_rep::matrix_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1648 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1649 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1650 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1651 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1652 return Matrix (1, 1, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1653 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1654 return *matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1655 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1656 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1657 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1658 int flag = user_pref.ok_to_lose_imaginary_part;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1659 if (flag == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1660 warning ("implicit conversion of complex matrix to real matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1661
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1662 if (flag != 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1663 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1664 if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1665 return Matrix (1, 1, ::real (*complex_scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1666 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1667 return ::real (*complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1668 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1669 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1670 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1671 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1672 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1673 ::error ("implicit conversion of complex matrix to real matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1674 ::error ("not allowed");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1675 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1676 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1677 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1678 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1679 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1680 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1681 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1682 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1683
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1684 Complex
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1685 tree_constant_rep::complex_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1686 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1687 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1688 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1689 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1690 return *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1691 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1692 return Complex (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1693 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1694 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1695 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1696 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1697 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1698
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1699 ComplexMatrix
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1700 tree_constant_rep::complex_matrix_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1701 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1702 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1703 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1704 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1705 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1706 return ComplexMatrix (1, 1, Complex (scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1707 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1708 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1709 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1710 return ComplexMatrix (1, 1, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1711 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1712 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1713 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1714 return ComplexMatrix (*matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1715 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1716 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1717 return *complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1718 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1719 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1720 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1721 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1722 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1723 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1724
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1725 char *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1726 tree_constant_rep::string_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1727 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1728 assert (type_tag == string_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1729 return string;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1730 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1731
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1732 Range
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1733 tree_constant_rep::range_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1734 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1735 assert (type_tag == range_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1736 return *range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1737 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1738
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1739 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1740 tree_constant_rep::rows (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1741 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1742 int retval = -1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1743 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1744 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1745 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1746 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1747 retval = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1748 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1749 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1750 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1751 retval = (columns () > 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1752 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1753 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1754 retval = matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1755 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1756 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1757 retval = complex_matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1758 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1759 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1760 ::error ("invalid use of colon operator");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1761 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1762 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1763 retval = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1764 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1765 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1766 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1767 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1768 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1769 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1770 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1771
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1772 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1773 tree_constant_rep::columns (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1774 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1775 int retval = -1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1776 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1777 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1778 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1779 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1780 retval = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1781 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1782 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1783 retval = matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1784 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1785 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1786 retval = complex_matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1787 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1788 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1789 retval = strlen (string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1790 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1791 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1792 retval = range->nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1793 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1794 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1795 ::error ("invalid use of colon operator");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1796 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1797 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1798 retval = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1799 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1800 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1801 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1802 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1803 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1804 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1805 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1806
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1807 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1808 tree_constant_rep::all (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1809 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1810 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1811 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1812 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1813 return tmp.all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1814 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1815
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1816 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1817 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1818 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1819 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1820 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1821 double status = (scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1822 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1823 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1824 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1825 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1826 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1827 Matrix m = matrix->all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1828 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1829 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1830 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1831 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1832 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1833 double status = (*complex_scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1834 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1835 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1836 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1837 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1838 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1839 Matrix m = complex_matrix->all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1840 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1841 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1842 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1843 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1844 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1845 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1846 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1847 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1848 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1849 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1850 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1851 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1852
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1853 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1854 tree_constant_rep::any (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1855 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1856 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1857 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1858 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1859 return tmp.any ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1860 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1861
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1862 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1863 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1864 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1865 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1866 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1867 double status = (scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1868 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1869 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1870 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1871 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1872 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1873 Matrix m = matrix->any ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1874 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1875 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1876 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1877 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1878 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1879 double status = (*complex_scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1880 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1881 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1882 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1883 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1884 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1885 Matrix m = complex_matrix->any ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1886 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1887 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1888 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1889 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1890 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1891 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1892 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1893 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1894 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1895 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1896 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1897 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1898
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1899 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1900 tree_constant_rep::isstr (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1901 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1902 double status = 0.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1903 if (type_tag == string_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1904 status = 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1905 tree_constant retval (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1906 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1907 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1908
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1909 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1910 tree_constant_rep::convert_to_str (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1911 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1912 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1913
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1914 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1915 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1916 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1917 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1918 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1919 double d = double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1920 int i = NINT (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1921 // Warn about out of range conversions?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1922 char s[2];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1923 s[0] = (char) i;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1924 s[1] = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1925 retval = tree_constant (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1926 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1927 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1928 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1929 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1930 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1931 ColumnVector v = to_vector ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1932 int len = v.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1933 if (len == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1934 ::error ("can only convert vectors and scalars to strings");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1935 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1936 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1937 char *s = new char [len+1];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1938 s[len] = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1939 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1940 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1941 double d = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1942 int ival = NINT (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1943 // Warn about out of range conversions?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1944 s[i] = (char) ival;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1945 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1946 retval = tree_constant (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1947 delete [] s;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1948 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1949 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1950 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1951 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1952 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1953 Range r = range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1954 double b = r.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1955 double incr = r.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1956 int nel = r.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1957 char *s = new char [nel+1];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1958 s[nel] = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1959 for (int i = 0; i < nel; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1960 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1961 double d = b + i * incr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1962 int ival = NINT (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1963 // Warn about out of range conversions?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1964 s[i] = (char) ival;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1965 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1966 retval = tree_constant (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1967 delete [] s;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1968 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1969 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1970 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1971 retval = tree_constant (*this);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1972 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1973 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1974 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1975 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1976 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1977 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1978 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1979 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1980
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1981 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1982 tree_constant_rep::convert_to_row_or_column_vector (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1983 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1984 assert (type_tag == matrix_constant || type_tag == complex_matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1985
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1986 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1987 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1988
509
7a3b6bb00c6e [project @ 1994-07-11 18:36:12 by jwe]
jwe
parents: 506
diff changeset
1989 if (nr == 1 || nc == 1)
7a3b6bb00c6e [project @ 1994-07-11 18:36:12 by jwe]
jwe
parents: 506
diff changeset
1990 return;
7a3b6bb00c6e [project @ 1994-07-11 18:36:12 by jwe]
jwe
parents: 506
diff changeset
1991
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1992 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1993
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1994 assert (len > 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1995
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1996 int new_nr = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1997 int new_nc = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1998
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1999 if (user_pref.prefer_column_vectors)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2000 new_nr = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2001 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2002 new_nc = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2003
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2004 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2005 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2006 Matrix *m = new Matrix (new_nr, new_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2007
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2008 double *cop_out = matrix->fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2009
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2010 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2011 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2012 if (new_nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2013 m->elem (0, i) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2014 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2015 m->elem (i, 0) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2016 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2017
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2018 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2019 matrix = m;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2020 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2021 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2022 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2023 ComplexMatrix *cm = new ComplexMatrix (new_nr, new_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2024
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2025 Complex *cop_out = complex_matrix->fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2026
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2027 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2028 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2029 if (new_nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2030 cm->elem (0, i) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2031 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2032 cm->elem (i, 0) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2033 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2034
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2035 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2036 complex_matrix = cm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2037 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2038 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2039
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2040 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2041 tree_constant_rep::is_true (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2042 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2043 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2044 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2045 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2046 return tmp.is_true ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2047 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2048
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2049 int retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2050 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2051 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2052 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2053 retval = (scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2054 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2055 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2056 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2057 Matrix m = (matrix->all ()) . all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2058 retval = (m.rows () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2059 && m.columns () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2060 && m.elem (0, 0) != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2061 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2062 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2063 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2064 retval = (*complex_scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2065 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2066 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2067 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2068 Matrix m = (complex_matrix->all ()) . all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2069 retval = (m.rows () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2070 && m.columns () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2071 && m.elem (0, 0) != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2072 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2073 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2074 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2075 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2076 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2077 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2078 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2079 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2080 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2081 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2082 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2083
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2084 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2085 tree_constant_rep::cumprod (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2086 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2087 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2088 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2089 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2090 return tmp.cumprod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2091 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2092
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2093 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2094 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2095 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2096 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2097 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2098 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2099 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2100 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2101 Matrix m = matrix->cumprod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2102 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2103 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2104 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2105 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2106 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2107 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2108 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2109 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2110 ComplexMatrix m = complex_matrix->cumprod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2111 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2112 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2113 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2114 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2115 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2116 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2117 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2118 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2119 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2120 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2121 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2122 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2123
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2124 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2125 tree_constant_rep::cumsum (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2126 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2127 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2128 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2129 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2130 return tmp.cumsum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2131 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2132
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2133 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2134 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2135 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2136 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2137 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2138 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2139 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2140 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2141 Matrix m = matrix->cumsum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2142 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2143 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2144 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2145 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2146 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2147 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2148 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2149 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2150 ComplexMatrix m = complex_matrix->cumsum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2151 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2152 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2153 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2154 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2155 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2156 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2157 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2158 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2159 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2160 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2161 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2162 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2163
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2164 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2165 tree_constant_rep::prod (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2166 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2167 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2168 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2169 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2170 return tmp.prod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2171 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2172
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2173 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2174 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2175 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2176 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2177 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2178 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2179 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2180 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2181 Matrix m = matrix->prod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2182 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2183 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2184 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2185 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2186 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2187 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2188 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2189 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2190 ComplexMatrix m = complex_matrix->prod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2191 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2192 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2193 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2194 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2195 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2196 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2197 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2198 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2199 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2200 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2201 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2202 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2203
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2204 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2205 tree_constant_rep::sum (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2206 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2207 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2208 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2209 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2210 return tmp.sum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2211 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2212
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2213 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2214 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2215 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2216 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2217 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2218 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2219 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2220 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2221 Matrix m = matrix->sum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2222 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2223 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2224 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2225 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2226 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2227 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2228 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2229 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2230 ComplexMatrix m = complex_matrix->sum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2231 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2232 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2233 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2234 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2235 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2236 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2237 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2238 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2239 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2240 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2241 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2242 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2243
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2244 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2245 tree_constant_rep::sumsq (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2246 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2247 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2248 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2249 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2250 return tmp.sumsq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2251 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2252
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2253 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2254 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2255 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2256 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2257 retval = tree_constant (scalar * scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2258 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2259 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2260 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2261 Matrix m = matrix->sumsq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2262 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2263 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2264 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2265 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2266 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2267 Complex c (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2268 retval = tree_constant (c * c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2269 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2270 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2271 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2272 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2273 ComplexMatrix m = complex_matrix->sumsq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2274 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2275 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2276 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2277 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2278 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2279 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2280 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2281 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2282 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2283 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2284 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2285 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2286
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2287 static tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2288 make_diag (const Matrix& v, int k)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2289 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2290 int nr = v.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2291 int nc = v.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2292 assert (nc == 1 || nr == 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2293
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2294 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2295
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2296 int roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2297 int coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2298 if (k > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2299 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2300 roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2301 coff = k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2302 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2303 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2304 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2305 roff = -k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2306 coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2307 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2308
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2309 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2310 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2311 int n = nc + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2312 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2313 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2314 m.elem (i+roff, i+coff) = v.elem (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2315 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2316 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2317 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2318 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2319 int n = nr + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2320 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2321 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2322 m.elem (i+roff, i+coff) = v.elem (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2323 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2324 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2325
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2326 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2327 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2328
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2329 static tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2330 make_diag (const ComplexMatrix& v, int k)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2331 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2332 int nr = v.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2333 int nc = v.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2334 assert (nc == 1 || nr == 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2335
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2336 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2337
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2338 int roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2339 int coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2340 if (k > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2341 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2342 roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2343 coff = k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2344 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2345 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2346 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2347 roff = -k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2348 coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2349 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2350
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2351 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2352 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2353 int n = nc + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2354 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2355 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2356 m.elem (i+roff, i+coff) = v.elem (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2357 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2358 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2359 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2360 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2361 int n = nr + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2362 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2363 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2364 m.elem (i+roff, i+coff) = v.elem (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2365 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2366 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2367
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2368 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2369 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2370
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2371 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2372 tree_constant_rep::diag (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2373 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2374 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2375 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2376 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2377 return tmp.diag ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2378 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2379
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2380 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2381 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2382 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2383 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2384 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2385 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2386 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2387 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2388 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2389 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2390 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2391 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2392 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2393 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2394 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2395 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2396 retval = make_diag (matrix_value (), 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2397 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2398 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2399 ColumnVector v = matrix->diag ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2400 if (v.capacity () > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2401 retval = tree_constant (v);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2402 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2403 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2404 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2405 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2406 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2407 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2408 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2409 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2410 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2411 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2412 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2413 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2414 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2415 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2416 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2417 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2418 retval = make_diag (complex_matrix_value (), 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2419 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2420 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2421 ComplexColumnVector v = complex_matrix->diag ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2422 if (v.capacity () > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2423 retval = tree_constant (v);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2424 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2425 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2426 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2427 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2428 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2429 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2430 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2431 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2432 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2433 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2434 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2435 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2436
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2437 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2438 tree_constant_rep::diag (const tree_constant& a) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2439 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2440 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2441 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2442 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2443 return tmp.diag (a);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2444 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2445
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2446 tree_constant tmp_a = a.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2447
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2448 tree_constant_rep::constant_type a_type = tmp_a.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2449
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2450 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2451
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2452 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2453 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2454 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2455 if (a_type == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2456 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2457 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2458 int n = ABS (k) + 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2459 if (k == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2460 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2461 else if (k > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2462 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2463 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2464 m.elem (0, k) = scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2465 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2466 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2467 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2468 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2469 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2470 m.elem (-k, 0) = scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2471 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2472 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2473 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2474 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2475 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2476 if (a_type == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2477 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2478 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2479 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2480 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2481 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2482 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2483 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2484 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2485 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2486 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2487 retval = make_diag (matrix_value (), k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2488 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2489 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2490 ColumnVector d = matrix->diag (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2491 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2492 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2493 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2494 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2495 ::error ("diag: invalid second argument");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2496
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2497 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2498 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2499 if (a_type == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2500 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2501 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2502 int n = ABS (k) + 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2503 if (k == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2504 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2505 else if (k > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2506 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2507 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2508 m.elem (0, k) = *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2509 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2510 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2511 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2512 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2513 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2514 m.elem (-k, 0) = *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2515 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2516 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2517 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2518 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2519 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2520 if (a_type == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2521 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2522 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2523 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2524 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2525 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2526 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2527 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2528 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2529 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2530 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2531 retval = make_diag (complex_matrix_value (), k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2532 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2533 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2534 ComplexColumnVector d = complex_matrix->diag (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2535 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2536 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2537 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2538 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2539 ::error ("diag: invalid second argument");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2540
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2541 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2542 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2543 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2544 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2545 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2546 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2547 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2548 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2549 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2550 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2551
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2552 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2553 tree_constant_rep::mapper (Mapper_fcn& m_fcn, int print) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2554 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2555 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2556
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2557 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2558 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2559 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2560 return tmp.mapper (m_fcn, print);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2561 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2562
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2563 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2564 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2565 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2566 if (m_fcn.can_return_complex_for_real_arg
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2567 && (scalar < m_fcn.lower_limit
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2568 || scalar > m_fcn.upper_limit))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2569 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2570 if (m_fcn.c_c_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2571 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2572 Complex c = m_fcn.c_c_mapper (Complex (scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2573 retval = tree_constant (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2574 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2575 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2576 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2577 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2578 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2579 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2580 if (m_fcn.d_d_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2581 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2582 double d = m_fcn.d_d_mapper (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2583 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2584 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2585 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2586 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2587 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2588 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2589 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2590 if (m_fcn.can_return_complex_for_real_arg
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2591 && (any_element_less_than (*matrix, m_fcn.lower_limit)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2592 || any_element_greater_than (*matrix, m_fcn.upper_limit)))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2593 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2594 if (m_fcn.c_c_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2595 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2596 ComplexMatrix cm = map (m_fcn.c_c_mapper,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2597 ComplexMatrix (*matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2598 retval = tree_constant (cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2599 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2600 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2601 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2602 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2603 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2604 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2605 if (m_fcn.d_d_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2606 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2607 Matrix m = map (m_fcn.d_d_mapper, *matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2608 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2609 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2610 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2611 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2612 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2613 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2614 case complex_scalar_constant:
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2615 if (m_fcn.d_c_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2616 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2617 double d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2618 d = m_fcn.d_c_mapper (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2619 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2620 }
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2621 else if (m_fcn.c_c_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2622 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2623 Complex c;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2624 c = m_fcn.c_c_mapper (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2625 retval = tree_constant (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2626 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2627 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2628 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2629 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2630 case complex_matrix_constant:
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2631 if (m_fcn.d_c_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2632 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2633 Matrix m;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2634 m = map (m_fcn.d_c_mapper, *complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2635 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2636 }
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2637 else if (m_fcn.c_c_mapper)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2638 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2639 ComplexMatrix cm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2640 cm = map (m_fcn.c_c_mapper, *complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2641 retval = tree_constant (cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2642 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2643 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2644 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2645 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2646 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2647 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2648 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2649 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2650 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2651 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2652 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2653 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2654 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2655
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2656 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2657 * Top-level tree-constant function that handles assignments. Only
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2658 * decide if the left-hand side is currently a scalar or a matrix and
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2659 * hand off to other functions to do the real work.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2660 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2661 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2662 tree_constant_rep::assign (const tree_constant& rhs, const Octave_object& args)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2663 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2664 tree_constant rhs_tmp = rhs.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2665
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2666 // This is easier than actually handling assignments to strings.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2667 // An assignment to a range will normally require a conversion to a
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2668 // vector since it will normally destroy the equally-spaced property
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2669 // of the range elements.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2670
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2671 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2672 force_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2673
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2674 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2675 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2676 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2677 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2678 case unknown_constant:
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2679 do_scalar_assignment (rhs_tmp, args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2680 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2681 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2682 case matrix_constant:
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2683 do_matrix_assignment (rhs_tmp, args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2684 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2685 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2686 ::error ("invalid assignment to string type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2687 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2688 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2689 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2690 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2691 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2692 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2693 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2694 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2695
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2696 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2697 * Assignments to scalars. If resize_on_range_error is true,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2698 * this can convert the left-hand side to a matrix.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2699 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2700 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2701 tree_constant_rep::do_scalar_assignment (const tree_constant& rhs,
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2702 const Octave_object& args)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2703 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2704 assert (type_tag == unknown_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2705 || type_tag == scalar_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2706 || type_tag == complex_scalar_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2707
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2708 int nargin = args.length ();
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2709
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2710 if ((rhs.is_scalar_type () || rhs.is_zero_by_zero ())
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2711 && valid_scalar_indices (args))
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2712 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2713 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2714 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2715 if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2716 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2717
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2718 matrix = new Matrix (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2719 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2720 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2721 else if (type_tag == unknown_constant || type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2722 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2723 if (rhs.const_type () == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2724 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2725 scalar = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2726 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2727 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2728 else if (rhs.const_type () == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2729 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2730 complex_scalar = new Complex (rhs.complex_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2731 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2732 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2733 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2734 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2735 ::error ("invalid assignment to scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2736 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2737 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2738 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2739 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2740 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2741 if (rhs.const_type () == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2742 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2743 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2744 scalar = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2745 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2746 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2747 else if (rhs.const_type () == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2748 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2749 *complex_scalar = rhs.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2750 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2751 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2752 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2753 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2754 ::error ("invalid assignment to scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2755 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2756 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2757 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2758 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2759 else if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2760 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2761 tree_constant_rep::constant_type old_type_tag = type_tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2762
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2763 if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2764 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2765 Complex *old_complex = complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2766 complex_matrix = new ComplexMatrix (1, 1, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2767 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2768 delete old_complex;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2769 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2770 else if (type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2771 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2772 matrix = new Matrix (1, 1, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2773 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2774 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2775
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2776 // If there is an error, the call to do_matrix_assignment should not
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2777 // destroy the current value. tree_constant_rep::eval(int) will take
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2778 // care of converting single element matrices back to scalars.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2779
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2780 do_matrix_assignment (rhs, args);
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2781
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2782 // I don't think there's any other way to revert back to unknown
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2783 // constant types, so here it is.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2784
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2785 if (old_type_tag == unknown_constant && error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2786 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2787 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2788 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2789 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2790 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2791
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2792 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2793 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2794 }
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2795 else if (nargin > 3 || nargin < 2)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2796 ::error ("invalid index expression for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2797 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2798 ::error ("index invalid or out of range for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2799 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2800
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2801 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2802 * Assignments to matrices (and vectors).
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2803 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2804 * For compatibility with Matlab, we allow assignment of an empty
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2805 * matrix to an expression with empty indices to do nothing.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2806 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2807 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2808 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2809 const Octave_object& args)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2810 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2811 assert (type_tag == unknown_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2812 || type_tag == matrix_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2813 || type_tag == complex_matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2814
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2815 if (type_tag == matrix_constant && rhs.is_complex_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2816 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2817 Matrix *old_matrix = matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2818 complex_matrix = new ComplexMatrix (*matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2819 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2820 delete old_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2821 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2822 else if (type_tag == unknown_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2823 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2824 if (rhs.is_complex_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2825 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2826 complex_matrix = new ComplexMatrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2827 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2828 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2829 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2830 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2831 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2832 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2833 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2834 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2835
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2836 int nargin = args.length ();
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2837
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2838 // The do_matrix_assignment functions can't handle empty matrices, so
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2839 // don't let any pass through here.
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
2840 switch (nargin)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2841 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2842 case 2:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2843 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2844 ::error ("matrix index is null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2845 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2846 ::error ("matrix index is undefined");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2847 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2848 do_matrix_assignment (rhs, args(1));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2849 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2850 case 3:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2851 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2852 ::error ("matrix indices are null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2853 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2854 ::error ("first matrix index is undefined");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2855 else if (args(2).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2856 ::error ("second matrix index is undefined");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2857 else if (args(1).is_empty () || args(2).is_empty ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2858 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2859 if (! rhs.is_empty ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2860 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2861 ::error ("in assignment expression, a matrix index is empty");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2862 ::error ("but hte right hand side is not an empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2863 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2864 // XXX FIXME XXX -- to really be correct here, we should probably
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2865 // check to see if the assignment conforms, but that seems like more
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2866 // work than it's worth right now...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2867 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2868 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2869 do_matrix_assignment (rhs, args(1), args(2));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2870 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2871 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2872 ::error ("too many indices for matrix expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2873 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2874 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2875 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2876
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2877 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2878 * Matrix assignments indexed by a single value.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2879 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2880 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2881 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2882 const tree_constant& i_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2883 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2884 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2885 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2886
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2887 if (user_pref.do_fortran_indexing || nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2888 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2889 if (i_arg.is_empty ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2890 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2891 if (! rhs.is_empty ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2892 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2893 ::error ("in assignment expression, matrix index is empty but");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2894 ::error ("right hand side is not an empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2895 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2896 // XXX FIXME XXX -- to really be correct here, we should probably
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2897 // check to see if the assignment conforms, but that seems like more
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2898 // work than it's worth right now...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2899
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2900 // The assignment functions can't handle empty matrices, so don't let
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2901 // any pass through here.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2902 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2903 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2904
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2905 // We can't handle the case of assigning to a vector first, since even
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2906 // then, the two operations are not equivalent. For example, the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2907 // expression V(:) = M is handled differently depending on whether the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2908 // user specified do_fortran_indexing = "true".
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2909
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2910 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2911 fortran_style_matrix_assignment (rhs, i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2912 else if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2913 vector_assignment (rhs, i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2914 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2915 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2916 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2917 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2918 ::error ("single index only valid for row or column vector");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2919 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2920
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2921 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2922 * Fortran-style assignments. Matrices are assumed to be stored in
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2923 * column-major order and it is ok to use a single index for
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2924 * multi-dimensional matrices.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2925 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2926 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2927 tree_constant_rep::fortran_style_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
2928 const tree_constant& i_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2929 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2930 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2931
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2932 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2933
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2934 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2935 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2936
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2937 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2938 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2939
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2940 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2941 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2942 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2943 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2944 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2945 int i = NINT (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2946 int idx = i - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2947
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2948 if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2949 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2950 if (idx < nr * nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2951 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2952 convert_to_row_or_column_vector ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2953
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2954 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2955 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2956
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2957 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2958 delete_column (idx);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2959 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2960 delete_row (idx);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2961 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2962 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2963 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2964 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2965 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2966
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2967 if (index_check (idx, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2968 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2969
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2970 if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2971 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2972 maybe_resize (idx);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2973 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2974 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2975 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2976 else if (range_max_check (idx, nr * nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2977 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2978
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2979 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2980 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2981
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2982 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2983 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2984 ::error ("for A(int) = X: X must be a scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2985 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2986 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2987 int ii = fortran_row (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2988 int jj = fortran_column (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2989 do_matrix_assignment (rhs, ii, jj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2990 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2991 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2992 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2993 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2994 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2995 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2996 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2997 idx_vector ii (mi, 1, "", len); // Always do fortran indexing here...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2998 if (! ii)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2999 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3000
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3001 if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3002 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3003 ii.sort_uniq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3004 int num_to_delete = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3005 for (int i = 0; i < ii.length (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3006 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3007 if (ii.elem (i) < len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3008 num_to_delete++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3009 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3010 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3011 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3012
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3013 if (num_to_delete > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3014 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3015 if (num_to_delete != ii.length ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3016 ii.shorten (num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3017
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3018 convert_to_row_or_column_vector ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3019
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3020 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3021 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3022
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3023 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3024 delete_columns (ii);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3025 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3026 delete_rows (ii);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3027 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3028 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3029 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3030 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3031 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3032
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3033 if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3034 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3035 maybe_resize (ii.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3036 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3037 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3038 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3039 else if (range_max_check (ii.max (), len) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3040 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3041
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3042 int ilen = ii.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3043
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3044 if (ilen != rhs_nr * rhs_nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3045 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3046 ::error ("A(matrix) = X: X and matrix must have the same number");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3047 ::error ("of elements");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3048 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3049 else if (ilen == 1 && rhs.is_scalar_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3050 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3051 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3052 int idx = ii.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3053 int ii = fortran_row (idx + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3054 int jj = fortran_column (idx + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3055
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3056 if (rhs.const_type () == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3057 matrix->elem (ii, jj) = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3058 else if (rhs.const_type () == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3059 complex_matrix->elem (ii, jj) = rhs.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3060 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3061 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3062 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3063 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3064 fortran_style_matrix_assignment (rhs, ii);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3065 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3066 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3067 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3068 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3069 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3070 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3071 gripe_range_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3072 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3073 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3074 // a(:) = [] is equivalent to a(:,:) = [].
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3075 if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3076 do_matrix_assignment (rhs, magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3077 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3078 fortran_style_matrix_assignment (rhs, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3079 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3080 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3081 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3082 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3083 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3084 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3085
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3086 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3087 * Fortran-style assignment for vector index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3088 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3089 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3090 tree_constant_rep::fortran_style_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3091 idx_vector& i)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3092 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3093 assert (rhs.is_matrix_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3094
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3095 int ilen = i.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3096
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3097 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3098
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3099 int len = rhs_nr * rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3100
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3101 if (len == ilen)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3102 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3103 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3104 if (rhs.const_type () == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3105 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3106 double *cop_out = rhs_m.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3107 for (int k = 0; k < len; k++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3108 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3109 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3110 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3111
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3112 matrix->elem (ii, jj) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3113 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3114 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3115 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3116 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3117 Complex *cop_out = rhs_cm.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3118 for (int k = 0; k < len; k++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3119 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3120 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3121 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3122
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3123 complex_matrix->elem (ii, jj) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3124 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3125 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3126 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3127 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3128 ::error ("number of rows and columns must match for indexed assignment");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3129 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3130
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3131 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3132 * Fortran-style assignment for colon index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3133 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3134 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3135 tree_constant_rep::fortran_style_matrix_assignment
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3136 (const tree_constant& rhs, tree_constant_rep::constant_type mci)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3137 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3138 assert (rhs.is_matrix_type () && mci == tree_constant_rep::magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3139
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3140 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3141 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3142
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3143 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3144
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3145 int rhs_size = rhs_nr * rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3146 if (rhs_size == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3147 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3148 if (rhs.const_type () == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3149 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3150 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3151 matrix = new Matrix (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3152 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3153 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3154 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3155 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3156 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3157 else if (nr*nc != rhs_size)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3158 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3159 ::error ("A(:) = X: X and A must have the same number of elements");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3160 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3161 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3162
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3163 if (rhs.const_type () == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3164 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3165 double *cop_out = rhs_m.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3166 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3167 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3168 matrix->elem (i, j) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3169 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3170 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3171 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3172 Complex *cop_out = rhs_cm.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3173 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3174 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3175 complex_matrix->elem (i, j) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3176 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3177 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3178
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3179 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3180 * Assignments to vectors. Hand off to other functions once we know
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3181 * what kind of index we have. For a colon, it is the same as
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3182 * assignment to a matrix indexed by two colons.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3183 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3184 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3185 tree_constant_rep::vector_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3186 const tree_constant& i_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3187 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3188 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3189 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3190
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3191 assert ((nr == 1 || nc == 1 || (nr == 0 && nc == 0))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3192 && ! user_pref.do_fortran_indexing);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3193
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3194 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3195
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3196 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3197
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3198 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3199 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3200 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3201 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3202 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3203 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3204 if (index_check (i, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3205 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3206 do_vector_assign (rhs, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3207 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3208 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3209 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3210 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3211 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3212 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3213 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3214 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3215 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3216 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3217
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3218 do_vector_assign (rhs, iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3219 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3220 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3221 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3222 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3223 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3224 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3225 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3226 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3227 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3228 if (len == 2 && is_zero_one (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3229 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3230 do_vector_assign (rhs, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3231 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3232 else if (len == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3233 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3234 do_vector_assign (rhs, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3235 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3236 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3237 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3238 if (index_check (ri, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3239 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3240 do_vector_assign (rhs, ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3241 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3242 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3243 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3244 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3245 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3246 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3247 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3248
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3249 if (! indexed_assign_conforms (nr, nc, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3250 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3251 ::error ("A(:) = X: X and A must have the same dimensions");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3252 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3253 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3254 do_matrix_assignment (rhs, magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3255 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3256 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3257 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3258 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3259 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3260 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3261 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3262
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3263 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3264 * Check whether an indexed assignment to a vector is valid.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3265 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3266 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3267 tree_constant_rep::check_vector_assign (int rhs_nr, int rhs_nc,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3268 int ilen, const char *rm)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3269 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3270 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3271 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3272
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3273 if ((nr == 1 && nc == 1) || nr == 0 || nc == 0) // No orientation.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3274 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3275 if (! (ilen == rhs_nr || ilen == rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3276 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3277 ::error ("A(%s) = X: X and %s must have the same number of elements",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3278 rm, rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3279 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3280 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3281 else if (nr == 1) // Preserve current row orientation.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3282 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3283 if (! (rhs_nr == 1 && rhs_nc == ilen))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3284 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3285 ::error ("A(%s) = X: where A is a row vector, X must also be a", rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3286 ::error ("row vector with the same number of elements as %s", rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3287 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3288 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3289 else if (nc == 1) // Preserve current column orientation.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3290 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3291 if (! (rhs_nc == 1 && rhs_nr == ilen))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3292 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3293 ::error ("A(%s) = X: where A is a column vector, X must also be", rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3294 ::error ("a column vector with the same number of elements as %s", rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3295 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3296 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3297 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3298 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3299 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3300
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3301 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3302 * Assignment to a vector with an integer index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3303 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3304 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3305 tree_constant_rep::do_vector_assign (const tree_constant& rhs, int i)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3306 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3307 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3308 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3309
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3310 if (indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3311 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3312 maybe_resize (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3313 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3314 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3315
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3316 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3317 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3318
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3319 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3320 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3321 REP_ELEM_ASSIGN (0, i, rhs.double_value (), rhs.complex_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3322 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3323 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3324 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3325 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3326 REP_ELEM_ASSIGN (i, 0, rhs.double_value (), rhs.complex_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3327 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3328 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3329 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3330 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3331 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3332 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3333 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3334 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3335 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3336
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3337 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3338
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3339 if (i < 0 || i >= len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3340 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3341 ::error ("A(int) = []: index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3342 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3343 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3344
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3345 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3346 delete_column (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3347 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3348 delete_row (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3349 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3350 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3351 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3352 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3353 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3354 ::error ("for A(int) = X: X must be a scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3355 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3356 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3357 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3358
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3359 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3360 * Assignment to a vector with a vector index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3361 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3362 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3363 tree_constant_rep::do_vector_assign (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3364 idx_vector& iv)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3365 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3366 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3367 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3368 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3369 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3370
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3371 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3372
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3373 if (iv.max () >= len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3374 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3375 ::error ("A(matrix) = []: index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3376 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3377 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3378
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3379 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3380 delete_columns (iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3381 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3382 delete_rows (iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3383 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3384 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3385 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3386 else if (rhs.is_scalar_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3387 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3388 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3389 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3390
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3391 if (iv.capacity () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3392 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3393 int idx = iv.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3394
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3395 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3396 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3397 REP_ELEM_ASSIGN (0, idx, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3398 rhs.complex_value (), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3399 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3400 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3401 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3402 REP_ELEM_ASSIGN (idx, 0, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3403 rhs.complex_value (), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3404 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3405 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3406 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3407 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3408 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3409 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3410 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3411 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3412 ::error ("A(matrix) = X: where A is a row vector, X must also be a");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3413 ::error ("row vector with the same number of elements as matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3414 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3415 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3416 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3417 ::error ("A(matrix) = X: where A is a column vector, X must also be a");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3418 ::error ("column vector with the same number of elements as matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3419 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3420 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3421 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3422 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3423 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3424 else if (rhs.is_matrix_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3425 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3426 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3427
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3428 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3429 check_vector_assign (rhs_nr, rhs_nc, ilen, "matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3430 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3431 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3432
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3433 force_orient f_orient = no_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3434 if (rhs_nr == 1 && rhs_nc != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3435 f_orient = row_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3436 else if (rhs_nc == 1 && rhs_nr != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3437 f_orient = column_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3438
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3439 maybe_resize (iv.max (), f_orient);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3440 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3441 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3442
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3443 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3444 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3445
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3446 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3447 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3448 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3449 REP_ELEM_ASSIGN (0, iv.elem (i), rhs_m.elem (0, i),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3450 rhs_cm.elem (0, i), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3451 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3452 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3453 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3454 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3455 REP_ELEM_ASSIGN (iv.elem (i), 0, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3456 rhs_cm.elem (i, 0), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3457 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3458 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3459 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3460 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3461 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3462 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3463 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3464
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3465 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3466 * Assignment to a vector with a range index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3467 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3468 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3469 tree_constant_rep::do_vector_assign (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3470 Range& ri)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3471 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3472 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3473 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3474 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3475 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3476
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3477 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3478
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3479 int b = tree_to_mat_idx (ri.min ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3480 int l = tree_to_mat_idx (ri.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3481 if (b < 0 || l >= len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3482 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3483 ::error ("A(range) = []: index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3484 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3485 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3486
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3487 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3488 delete_columns (ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3489 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3490 delete_rows (ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3491 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3492 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3493 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3494 else if (rhs.is_scalar_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3495 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3496 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3497 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3498
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3499 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3500 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3501 ::error ("A(range) = X: where A is a row vector, X must also be a");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3502 ::error ("row vector with the same number of elements as range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3503 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3504 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3505 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3506 ::error ("A(range) = X: where A is a column vector, X must also be a");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3507 ::error ("column vector with the same number of elements as range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3508 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3509 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3510 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3511 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3512 else if (rhs.is_matrix_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3513 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3514 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3515
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3516 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3517 check_vector_assign (rhs_nr, rhs_nc, ilen, "range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3518 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3519 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3520
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3521 force_orient f_orient = no_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3522 if (rhs_nr == 1 && rhs_nc != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3523 f_orient = row_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3524 else if (rhs_nc == 1 && rhs_nr != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3525 f_orient = column_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3526
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3527 maybe_resize (tree_to_mat_idx (ri.max ()), f_orient);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3528 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3529 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3530
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3531 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3532 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3533
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3534 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3535 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3536
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3537 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3538 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3539 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3540 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3541 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3542 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3543 REP_ELEM_ASSIGN (0, col, rhs_m.elem (0, i), rhs_cm.elem (0, i),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3544 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3545 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3546 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3547 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3548 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3549 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3550 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3551 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3552 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3553 REP_ELEM_ASSIGN (row, 0, rhs_m.elem (i, 0), rhs_cm.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3554 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3555 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3556 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3557 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3558 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3559 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3560 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3561 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3562 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3563
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3564 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3565 * Matrix assignment indexed by two values. This function determines
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3566 * the type of the first arugment, checks as much as possible, and
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3567 * then calls one of a set of functions to handle the specific cases:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3568 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3569 * M (integer, arg2) = RHS (MA1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3570 * M (vector, arg2) = RHS (MA2)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3571 * M (range, arg2) = RHS (MA3)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3572 * M (colon, arg2) = RHS (MA4)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3573 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3574 * Each of those functions determines the type of the second argument
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3575 * and calls another function to handle the real work of doing the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3576 * assignment.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3577 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3578 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3579 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3580 const tree_constant& i_arg,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3581 const tree_constant& j_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3582 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3583 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3584
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3585 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3586
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3587 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3588 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3589 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3590 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3591 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3592 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3593 if (index_check (i, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3594 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3595 do_matrix_assignment (rhs, i, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3596 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3597 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3598 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3599 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3600 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3601 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3602 idx_vector iv (mi, user_pref.do_fortran_indexing, "row", rows ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3603 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3604 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3605
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3606 do_matrix_assignment (rhs, iv, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3607 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3608 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3609 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3610 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3611 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3612 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3613 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3614 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3615 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3616 if (nr == 2 && is_zero_one (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3617 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3618 do_matrix_assignment (rhs, 1, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3619 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3620 else if (nr == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3621 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3622 do_matrix_assignment (rhs, 0, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3623 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3624 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3625 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3626 if (index_check (ri, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3627 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3628 do_matrix_assignment (rhs, ri, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3629 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3630 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3631 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3632 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3633 do_matrix_assignment (rhs, magic_colon, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3634 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3635 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3636 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3637 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3638 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3639 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3640
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3641 /* MA1 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3642 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3643 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs, int i,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3644 const tree_constant& j_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3645 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3646 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3647
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3648 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3649
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3650 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3651 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3652
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3653 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3654 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3655 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3656 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3657 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3658 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3659 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3660 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3661 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3662 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3663 ::error ("A(int,int) = X, X must be a scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3664 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3665 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3666 maybe_resize (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3667 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3668 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3669
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3670 do_matrix_assignment (rhs, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3671 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3672 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3673 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3674 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3675 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3676 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3677 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3678 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3679 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3680 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3681
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3682 if (! indexed_assign_conforms (1, jv.capacity (), rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3683 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3684 ::error ("A(int,matrix) = X: X must be a row vector with the same");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3685 ::error ("number of elements as matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3686 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3687 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3688 maybe_resize (i, jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3689 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3690 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3691
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3692 do_matrix_assignment (rhs, i, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3693 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3694 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3695 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3696 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3697 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3698 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3699 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3700 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3701 if (! indexed_assign_conforms (1, rj.nelem (), rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3702 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3703 ::error ("A(int,range) = X: X must be a row vector with the same");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3704 ::error ("number of elements as range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3705 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3706 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3707
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3708 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3709 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3710 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3711 do_matrix_assignment (rhs, i, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3712 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3713 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3714 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3715 do_matrix_assignment (rhs, i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3716 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3717 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3718 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3719 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3720 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3721 maybe_resize (i, tree_to_mat_idx (rj.max ()));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3722 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3723 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3724
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3725 do_matrix_assignment (rhs, i, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3726 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3727 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3728 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3729 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3730 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3731 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3732 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3733 if (nc == 0 && nr == 0 && rhs_nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3734 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3735 if (rhs.is_complex_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3736 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3737 complex_matrix = new ComplexMatrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3738 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3739 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3740 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3741 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3742 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3743 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3744 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3745 maybe_resize (i, rhs_nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3746 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3747 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3748 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3749 else if (indexed_assign_conforms (1, nc, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3750 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3751 maybe_resize (i, nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3752 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3753 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3754 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3755 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3756 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3757 if (i < 0 || i >= nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3758 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3759 ::error ("A(int,:) = []: row index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3760 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3761 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3762 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3763 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3764 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3765 ::error ("A(int,:) = X: X must be a row vector with the same");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3766 ::error ("number of columns as A");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3767 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3768 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3769
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3770 do_matrix_assignment (rhs, i, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3771 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3772 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3773 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3774 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3775 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3776 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3777 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3778
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3779 /* MA2 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3780 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3781 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3782 idx_vector& iv,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3783 const tree_constant& j_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3784 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3785 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3786
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3787 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3788
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3789 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3790 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3791
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3792 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3793 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3794 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3795 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3796 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3797 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3798 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3799 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3800 if (! indexed_assign_conforms (iv.capacity (), 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3801 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3802 ::error ("A(matrix,int) = X: X must be a column vector with the");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3803 ::error ("same number of elements as matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3804 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3805 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3806 maybe_resize (iv.max (), j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3807 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3808 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3809
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3810 do_matrix_assignment (rhs, iv, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3811 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3812 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3813 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3814 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3815 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3816 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3817 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3818 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3819 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3820 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3821
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3822 if (! indexed_assign_conforms (iv.capacity (), jv.capacity (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3823 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3824 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3825 ::error ("A(r_mat,c_mat) = X: the number of rows in X must match");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3826 ::error ("the number of elements in r_mat and the number of");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3827 ::error ("columns in X must match the number of elements in c_mat");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3828 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3829 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3830 maybe_resize (iv.max (), jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3831 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3832 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3833
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3834 do_matrix_assignment (rhs, iv, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3835 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3836 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3837 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3838 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3839 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3840 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3841 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3842 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3843 if (! indexed_assign_conforms (iv.capacity (), rj.nelem (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3844 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3845 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3846 ::error ("A(matrix,range) = X: the number of rows in X must match");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3847 ::error ("the number of elements in matrix and the number of");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3848 ::error ("columns in X must match the number of elements in range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3849 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3850 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3851
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3852 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3853 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3854 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3855 do_matrix_assignment (rhs, iv, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3856 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3857 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3858 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3859 do_matrix_assignment (rhs, iv, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3860 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3861 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3862 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3863 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3864 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3865 maybe_resize (iv.max (), tree_to_mat_idx (rj.max ()));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3866 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3867 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3868
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3869 do_matrix_assignment (rhs, iv, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3870 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3871 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3872 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3873 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3874 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3875 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3876 int new_nc = nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3877 if (nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3878 new_nc = rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3879
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3880 if (indexed_assign_conforms (iv.capacity (), new_nc,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3881 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3882 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3883 maybe_resize (iv.max (), new_nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3884 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3885 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3886 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3887 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3888 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3889 if (iv.max () >= rows ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3890 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3891 ::error ("A(matrix,:) = []: row index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3892 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3893 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3894 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3895 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3896 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3897 ::error ("A(matrix,:) = X: the number of rows in X must match the");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3898 ::error ("number of elements in matrix, and the number of columns");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3899 ::error ("in X must match the number of columns in A");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3900 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3901 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3902
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3903 do_matrix_assignment (rhs, iv, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3904 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3905 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3906 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3907 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3908 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3909 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3910 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3911
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3912 /* MA3 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3913 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3914 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3915 Range& ri,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
3916 const tree_constant& j_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3917 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3918 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3919
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3920 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3921
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3922 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3923 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3924
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3925 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3926 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3927 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3928 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3929 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3930 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3931 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3932 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3933 if (! indexed_assign_conforms (ri.nelem (), 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3934 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3935 ::error ("A(range,int) = X: X must be a column vector with the");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3936 ::error ("same number of elements as range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3937 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3938 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3939 maybe_resize (tree_to_mat_idx (ri.max ()), j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3940 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3941 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3942
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3943 do_matrix_assignment (rhs, ri, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3944 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3945 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3946 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3947 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3948 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3949 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3950 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3951 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3952 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3953 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3954
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3955 if (! indexed_assign_conforms (ri.nelem (), jv.capacity (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3956 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3957 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3958 ::error ("A(range,matrix) = X: the number of rows in X must match");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3959 ::error ("the number of elements in range and the number of");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3960 ::error ("columns in X must match the number of elements in matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3961 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3962 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3963 maybe_resize (tree_to_mat_idx (ri.max ()), jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3964 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3965 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3966
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3967 do_matrix_assignment (rhs, ri, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3968 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3969 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3970 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3971 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3972 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3973 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3974 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3975 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3976 if (! indexed_assign_conforms (ri.nelem (), rj.nelem (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3977 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3978 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3979 ::error ("A(r_range,c_range) = X: the number of rows in X must");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3980 ::error ("match the number of elements in r_range and the number");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3981 ::error ("of columns in X must match the number of elements in");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3982 ::error ("c_range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3983 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3984 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3985
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3986 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3987 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3988 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3989 do_matrix_assignment (rhs, ri, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3990 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3991 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3992 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3993 do_matrix_assignment (rhs, ri, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3994 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3995 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3996 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3997 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3998 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3999
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4000 maybe_resize (tree_to_mat_idx (ri.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4001 tree_to_mat_idx (rj.max ()));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4002
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4003 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4004 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4005
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4006 do_matrix_assignment (rhs, ri, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4007 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4008 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4009 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4010 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4011 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4012 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4013 int new_nc = nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4014 if (nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4015 new_nc = rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4016
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4017 if (indexed_assign_conforms (ri.nelem (), new_nc, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4018 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4019 maybe_resize (tree_to_mat_idx (ri.max ()), new_nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4020 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4021 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4022 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4023 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4024 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4025 int b = tree_to_mat_idx (ri.min ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4026 int l = tree_to_mat_idx (ri.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4027 if (b < 0 || l >= rows ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4028 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4029 ::error ("A(range,:) = []: row index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4030 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4031 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4032 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4033 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4034 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4035 ::error ("A(range,:) = X: the number of rows in X must match the");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4036 ::error ("number of elements in range, and the number of columns");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4037 ::error ("in X must match the number of columns in A");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4038 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4039 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4040
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4041 do_matrix_assignment (rhs, ri, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4042 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4043 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4044 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4045 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4046 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4047 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4048 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4049
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4050 /* MA4 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4051 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4052 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4053 tree_constant_rep::constant_type i,
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4054 const tree_constant& j_arg)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4055 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4056 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4057
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4058 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4059
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4060 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4061 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4062
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4063 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4064 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4065 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4066 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4067 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4068 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4069 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4070 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4071 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4072 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4073 if (nr == 0 && nc == 0 && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4074 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4075 if (rhs.is_complex_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4076 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4077 complex_matrix = new ComplexMatrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4078 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4079 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4080 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4081 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4082 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4083 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4084 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4085 maybe_resize (rhs_nr-1, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4086 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4087 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4088 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4089 else if (indexed_assign_conforms (nr, 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4090 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4091 maybe_resize (nr-1, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4092 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4093 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4094 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4095 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4096 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4097 if (j < 0 || j >= nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4098 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4099 ::error ("A(:,int) = []: column index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4100 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4101 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4102 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4103 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4104 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4105 ::error ("A(:,int) = X: X must be a column vector with the same");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4106 ::error ("number of rows as A");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4107 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4108 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4109
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4110 do_matrix_assignment (rhs, magic_colon, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4111 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4112 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4113 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4114 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4115 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4116 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4117 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4118 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4119 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4120 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4121
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4122 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4123 int new_nr = nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4124 if (nr == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4125 new_nr = rhs_nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4126
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4127 if (indexed_assign_conforms (new_nr, jv.capacity (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4128 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4129 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4130 maybe_resize (new_nr-1, jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4131 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4132 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4133 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4134 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4135 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4136 if (jv.max () >= columns ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4137 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4138 ::error ("A(:,matrix) = []: column index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4139 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4140 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4141 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4142 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4143 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4144 ::error ("A(:,matrix) = X: the number of rows in X must match the");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4145 ::error ("number of rows in A, and the number of columns in X must");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4146 ::error ("match the number of elements in matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4147 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4148 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4149
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4150 do_matrix_assignment (rhs, magic_colon, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4151 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4152 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4153 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4154 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4155 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4156 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4157 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4158 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4159 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4160 int new_nr = nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4161 if (nr == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4162 new_nr = rhs_nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4163
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4164 if (indexed_assign_conforms (new_nr, rj.nelem (), rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4165 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4166 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4167 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4168 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4169 do_matrix_assignment (rhs, magic_colon, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4170 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4171 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4172 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4173 do_matrix_assignment (rhs, magic_colon, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4174 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4175 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4176 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4177 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4178 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4179 maybe_resize (new_nr-1, tree_to_mat_idx (rj.max ()));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4180 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4181 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4182 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4183 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4184 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4185 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4186 int b = tree_to_mat_idx (rj.min ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4187 int l = tree_to_mat_idx (rj.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4188 if (b < 0 || l >= columns ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4189 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4190 ::error ("A(:,range) = []: column index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4191 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4192 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4193 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4194 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4195 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4196 ::error ("A(:,range) = X: the number of rows in X must match the");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4197 ::error ("number of rows in A, and the number of columns in X");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4198 ::error ("must match the number of elements in range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4199 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4200 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4201
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4202 do_matrix_assignment (rhs, magic_colon, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4203 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4204 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4205 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4206 // a(:,:) = foo is equivalent to a = foo.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4207 do_matrix_assignment (rhs, magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4208 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4209 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4210 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4211 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4212 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4213 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4214
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4215 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4216 * Functions that actually handle assignment to a matrix using two
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4217 * index values.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4218 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4219 * idx2
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4220 * +---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4221 * idx1 | i | v | r | c |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4222 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4223 * integer | 1 | 5 | 9 | 13 |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4224 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4225 * vector | 2 | 6 | 10 | 14 |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4226 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4227 * range | 3 | 7 | 11 | 15 |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4228 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4229 * colon | 4 | 8 | 12 | 16 |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4230 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4231 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4232
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4233 /* 1 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4234 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4235 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4236 int i, int j)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4237 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4238 REP_ELEM_ASSIGN (i, j, rhs.double_value (), rhs.complex_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4239 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4240 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4241
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4242 /* 2 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4243 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4244 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs, int i,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4245 idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4246 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4247 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4248
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4249 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4250 REP_ELEM_ASSIGN (i, jv.elem (j), rhs_m.elem (0, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4251 rhs_cm.elem (0, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4252 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4253
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4254 /* 3 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4255 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4256 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4257 int i, Range& rj)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4258 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4259 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4260
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4261 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4262 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4263
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4264 for (int j = 0; j < rj.nelem (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4265 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4266 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4267 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4268 REP_ELEM_ASSIGN (i, col, rhs_m.elem (0, j), rhs_cm.elem (0, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4269 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4270 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4271 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4272
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4273 /* 4 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4274 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4275 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs, int i,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4276 tree_constant_rep::constant_type mcj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4277 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4278 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4279
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4280 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4281
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4282 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4283 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4284 delete_row (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4285 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4286 else if (rhs.is_matrix_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4287 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4288 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4289
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4290 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4291 REP_ELEM_ASSIGN (i, j, rhs_m.elem (0, j), rhs_cm.elem (0, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4292 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4293 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4294 else if (rhs.is_scalar_type () && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4295 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4296 REP_ELEM_ASSIGN (i, 0, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4297 rhs.complex_value (), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4298 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4299 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4300 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4301 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4302
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4303 /* 5 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4304 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4305 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4306 idx_vector& iv, int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4307 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4308 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4309
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4310 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4311 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4312 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4313 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4314 rhs_cm.elem (i, 0), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4315 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4316 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4317
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4318 /* 6 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4319 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4320 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4321 idx_vector& iv,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4322 idx_vector& jv)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4323 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4324 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4325
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4326 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4327 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4328 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4329 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4330 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4331 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4332 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4333 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4334 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4335 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4336 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4337
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4338 /* 7 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4339 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4340 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4341 idx_vector& iv,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4342 Range& rj)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4343 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4344 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4345
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4346 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4347 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4348
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4349 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4350 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4351 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4352 for (int j = 0; j < rj.nelem (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4353 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4354 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4355 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4356 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4357 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4358 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4359 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4360 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4361
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4362 /* 8 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4363 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4364 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4365 idx_vector& iv,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4366 tree_constant_rep::constant_type mcj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4367 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4368 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4369
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4370 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4371 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4372 delete_rows (iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4373 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4374 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4375 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4376 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4377
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4378 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4379
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4380 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4381 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4382 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4383 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4384 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4385 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4386 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4387 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4388 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4389 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4390 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4391
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4392 /* 9 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4393 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4394 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4395 Range& ri, int j)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4396 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4397 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4398
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4399 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4400 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4401
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4402 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4403 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4404 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4405 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4406 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4407 rhs_cm.elem (i, 0), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4408 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4409 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4410
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4411 /* 10 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4412 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4413 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4414 Range& ri,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4415 idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4416 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4417 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4418
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4419 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4420 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4421
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4422 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4423 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4424 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4425 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4426 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4427 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4428 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4429 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4430 rhs_m.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4431 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4432 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4433 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4434
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4435 /* 11 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4436 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4437 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4438 Range& ri,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4439 Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4440 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4441 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4442 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4443 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4444 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4445
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4446 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4447
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4448 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4449 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4450 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4451 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4452 for (int j = 0; j < rj.nelem (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4453 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4454 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4455 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4456 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4457 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4458 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4459 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4460 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4461
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4462 /* 12 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4463 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4464 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4465 Range& ri,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4466 tree_constant_rep::constant_type mcj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4467 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4468 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4469
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4470 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4471 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4472 delete_rows (ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4473 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4474 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4475 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4476 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4477
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4478 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4479 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4480
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4481 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4482
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4483 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4484 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4485 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4486 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4487 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4488 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4489 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4490 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4491 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4492 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4493
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4494 /* 13 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4495 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4496 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4497 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4498 int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4499 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4500 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4501
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4502 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4503
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4504 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4505 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4506 delete_column (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4507 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4508 else if (rhs.is_matrix_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4509 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4510 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4511
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4512 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4513 REP_ELEM_ASSIGN (i, j, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4514 rhs_cm.elem (i, 0), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4515 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4516 else if (rhs.is_scalar_type () && nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4517 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4518 REP_ELEM_ASSIGN (0, j, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4519 rhs.complex_value (), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4520 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4521 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4522 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4523 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4524
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4525 /* 14 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4526 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4527 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4528 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4529 idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4530 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4531 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4532
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4533 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4534 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4535 delete_columns (jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4536 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4537 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4538 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4539 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4540
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4541 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4542
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4543 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4544 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4545 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4546 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4547 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4548 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4549 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4550 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4551 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4552 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4553 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4554
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4555 /* 15 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4556 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4557 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4558 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4559 Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4560 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4561 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4562
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4563 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4564 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4565 delete_columns (rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4566 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4567 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4568 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4569 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4570
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4571 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4572
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4573 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4574 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4575
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4576 for (int j = 0; j < rj.nelem (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4577 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4578 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4579 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4580 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4581 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4582 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4583 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4584 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4585 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4586 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4587 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4588
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4589 /* 16 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4590 void
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
4591 tree_constant_rep::do_matrix_assignment (const tree_constant& rhs,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4592 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4593 tree_constant_rep::constant_type mcj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4594 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4595 assert (mci == magic_colon && mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4596
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4597 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4598 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4599 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4600 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4601 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4602 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4603 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4604 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4605 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4606 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4607 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4608 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4609 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4610 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4611 delete [] string;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4612 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4613 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4614 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4615 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4616 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4617 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4618 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4619 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4620 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4621
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4622 type_tag = rhs.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4623
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4624 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4625 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4626 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4627 scalar = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4628 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4629 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4630 matrix = new Matrix (rhs.matrix_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4631 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4632 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4633 string = strsave (rhs.string_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4634 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4635 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4636 complex_matrix = new ComplexMatrix (rhs.complex_matrix_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4637 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4638 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4639 complex_scalar = new Complex (rhs.complex_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4640 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4641 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4642 range = new Range (rhs.range_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4643 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4644 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4645 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4646 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4647 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4648 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4649 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4650
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4651 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4652 * Functions for deleting rows or columns of a matrix. These are used
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4653 * to handle statements like
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4654 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4655 * M (i, j) = []
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4656 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4657 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4658 tree_constant_rep::delete_row (int idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4659 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4660 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4661 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4662 int nr = matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4663 int nc = matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4664 Matrix *new_matrix = new Matrix (nr-1, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4665 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4666 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4667 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4668 if (i != idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4669 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4670 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4671 new_matrix->elem (ii, j) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4672 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4673 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4674 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4675 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4676 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4677 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4678 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4679 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4680 int nr = complex_matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4681 int nc = complex_matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4682 ComplexMatrix *new_matrix = new ComplexMatrix (nr-1, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4683 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4684 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4685 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4686 if (i != idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4687 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4688 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4689 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4690 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4691 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4692 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4693 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4694 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4695 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4696 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4697 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4698 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4699
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4700 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4701 tree_constant_rep::delete_rows (idx_vector& iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4702 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4703 iv.sort_uniq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4704 int num_to_delete = iv.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4705
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4706 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4707 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4708
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4709 // If deleting all rows of a column vector, make result 0x0.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4710 if (nc == 1 && num_to_delete == nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4711 nc = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4712
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4713 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4714 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4715 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4716 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4717 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4718 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4719 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4720 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4721 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4722 if (i == iv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4723 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4724 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4725 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4726 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4727 new_matrix->elem (ii, j) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4728 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4729 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4730 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4731 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4732 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4733 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4734 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4735 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4736 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4737 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4738 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4739 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4740 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4741 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4742 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4743 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4744 if (i == iv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4745 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4746 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4747 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4748 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4749 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4750 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4751 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4752 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4753 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4754 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4755 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4756 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4757 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4758 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4759 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4760
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4761 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4762 tree_constant_rep::delete_rows (Range& ri)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4763 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4764 ri.sort ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4765 int num_to_delete = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4766
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4767 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4768 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4769
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4770 // If deleting all rows of a column vector, make result 0x0.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4771 if (nc == 1 && num_to_delete == nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4772 nc = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4773
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4774 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4775 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4776
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4777 int max_idx = tree_to_mat_idx (ri.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4778
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4779 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4780 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4781 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4782 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4783 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4784 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4785 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4786 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4787 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4788 double itmp = ib + idx * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4789 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4790
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4791 if (i == row && row <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4792 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4793 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4794 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4795 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4796 new_matrix->elem (ii, j) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4797 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4798 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4799 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4800 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4801 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4802 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4803 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4804 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4805 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4806 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4807 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4808 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4809 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4810 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4811 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4812 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4813 double itmp = ib + idx * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4814 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4815
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4816 if (i == row && row <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4817 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4818 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4819 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4820 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4821 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4822 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4823 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4824 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4825 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4826 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4827 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4828 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4829 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4830 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4831 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4832
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4833 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4834 tree_constant_rep::delete_column (int idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4835 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4836 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4837 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4838 int nr = matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4839 int nc = matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4840 Matrix *new_matrix = new Matrix (nr, nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4841 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4842 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4843 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4844 if (j != idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4845 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4846 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4847 new_matrix->elem (i, jj) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4848 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4849 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4850 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4851 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4852 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4853 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4854 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4855 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4856 int nr = complex_matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4857 int nc = complex_matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4858 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4859 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4860 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4861 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4862 if (j != idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4863 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4864 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4865 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4866 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4867 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4868 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4869 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4870 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4871 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4872 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4873 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4874 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4875
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4876 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4877 tree_constant_rep::delete_columns (idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4878 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4879 jv.sort_uniq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4880 int num_to_delete = jv.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4881
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4882 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4883 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4884
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4885 // If deleting all columns of a row vector, make result 0x0.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4886 if (nr == 1 && num_to_delete == nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4887 nr = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4888
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4889 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4890 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4891 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4892 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4893 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4894 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4895 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4896 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4897 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4898 if (j == jv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4899 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4900 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4901 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4902 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4903 new_matrix->elem (i, jj) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4904 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4905 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4906 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4907 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4908 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4909 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4910 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4911 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4912 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4913 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4914 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4915 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4916 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4917 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4918 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4919 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4920 if (j == jv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4921 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4922 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4923 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4924 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4925 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4926 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4927 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4928 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4929 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4930 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4931 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4932 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4933 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4934 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4935 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4936
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4937 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4938 tree_constant_rep::delete_columns (Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4939 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4940 rj.sort ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4941 int num_to_delete = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4942
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4943 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4944 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4945
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4946 // If deleting all columns of a row vector, make result 0x0.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4947 if (nr == 1 && num_to_delete == nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4948 nr = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4949
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4950 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4951 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4952
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4953 int max_idx = tree_to_mat_idx (rj.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4954
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4955 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4956 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4957 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4958 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4959 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4960 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4961 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4962 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4963 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4964 double jtmp = jb + idx * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4965 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4966
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4967 if (j == col && col <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4968 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4969 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4970 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4971 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4972 new_matrix->elem (i, jj) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4973 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4974 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4975 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4976 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4977 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4978 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4979 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4980 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4981 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4982 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4983 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4984 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4985 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4986 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4987 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4988 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4989 double jtmp = jb + idx * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4990 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4991
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4992 if (j == col && col <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4993 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4994 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4995 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4996 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4997 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4998 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4999 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5000 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5001 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5002 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5003 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5004 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5005 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5006 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5007 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5008
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5009 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5010 * Indexing functions.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5011 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5012 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5013 tree_constant_rep::valid_as_scalar_index (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5014 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5015 int valid = type_tag == magic_colon
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5016 || (type_tag == scalar_constant && NINT (scalar) == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5017 || (type_tag == range_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5018 && range->nelem () == 1 && NINT (range->base ()) == 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5019
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5020 return valid;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5021 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5022
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5023 tree_constant
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5024 tree_constant_rep::do_scalar_index (const Octave_object& args) const
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5025 {
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5026 if (valid_scalar_indices (args))
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5027 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5028 if (type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5029 return tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5030 else if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5031 return tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5032 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5033 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5034 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5035 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5036 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5037 int rows = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5038 int cols = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5039
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5040 int nargin = args.length ();
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5041
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5042 switch (nargin)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5043 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5044 case 3:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5045 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5046 if (args(2).is_matrix_type ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5047 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5048 Matrix mj = args(2).matrix_value ();
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5049
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5050 idx_vector j (mj, user_pref.do_fortran_indexing, "");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5051 if (! j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5052 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5053
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5054 int len = j.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5055 if (len == j.ones_count ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5056 cols = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5057 }
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5058 else if (args(2).const_type () == magic_colon
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5059 || (args(2).is_scalar_type ()
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5060 && NINT (args(2).double_value ()) == 1))
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5061 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5062 cols = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5063 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5064 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5065 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5066 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5067 // Fall through...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5068 case 2:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5069 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5070 if (args(1).is_matrix_type ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5071 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5072 Matrix mi = args(1).matrix_value ();
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5073
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5074 idx_vector i (mi, user_pref.do_fortran_indexing, "");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5075 if (! i)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5076 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5077
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5078 int len = i.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5079 if (len == i.ones_count ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5080 rows = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5081 }
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5082 else if (args(1).const_type () == magic_colon
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5083 || (args(1).is_scalar_type ()
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5084 && NINT (args(1).double_value ()) == 1))
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5085 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5086 rows = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5087 }
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5088 else if (args(1).is_scalar_type ()
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5089 && NINT (args(1).double_value ()) == 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5090 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5091 Matrix m (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5092 return tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5093 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5094 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5095 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5096
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5097 if (cols == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5098 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5099 if (user_pref.prefer_column_vectors)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5100 cols = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5101 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5102 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5103 cols = rows;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5104 rows = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5105 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5106 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5107
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5108 if (type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5109 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5110 Matrix m (rows, cols, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5111 return tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5112 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5113 else if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5114 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5115 ComplexMatrix cm (rows, cols, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5116 return tree_constant (cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5117 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5118 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5119 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5120 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5121 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5122 default:
504
be155b3d5a2f [project @ 1994-07-08 23:45:33 by jwe]
jwe
parents: 500
diff changeset
5123 ::error ("invalid number of arguments for scalar type");
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5124 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5125 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5126 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5127 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5128
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5129 ::error ("index invalid or out of range for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5130 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5131 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5132
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5133 tree_constant
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5134 tree_constant_rep::do_matrix_index (const Octave_object& args) const
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5135 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5136 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5137
506
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5138 int nargin = args.length ();
0f388340e607 [project @ 1994-07-09 06:10:34 by jwe]
jwe
parents: 504
diff changeset
5139
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5140 switch (nargin)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5141 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5142 case 2:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5143 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5144 ::error ("matrix index is null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5145 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5146 ::error ("matrix index is a null expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5147 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5148 retval = do_matrix_index (args(1));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5149 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5150 case 3:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5151 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5152 ::error ("matrix indices are null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5153 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5154 ::error ("first matrix index is a null expression");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5155 else if (args(2).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5156 ::error ("second matrix index is a null expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5157 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5158 retval = do_matrix_index (args(1), args(2));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5159 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5160 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5161 ::error ("too many indices for matrix expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5162 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5163 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5164
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5165 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5166 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5167
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5168 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5169 tree_constant_rep::do_matrix_index (const tree_constant& i_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5170 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5171 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5172
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5173 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5174 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5175
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5176 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5177 retval = fortran_style_matrix_index (i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5178 else if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5179 retval = do_vector_index (i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5180 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5181 ::error ("single index only valid for row or column vector");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5182
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5183 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5184 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5185
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5186 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5187 tree_constant_rep::fortran_style_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5188 (const tree_constant& i_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5189 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5190 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5191
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5192 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5193
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5194 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5195
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5196 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5197 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5198
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5199 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5200 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5201 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5202 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5203 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5204 int i = NINT (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5205 int ii = fortran_row (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5206 int jj = fortran_column (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5207 if (index_check (i-1, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5208 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5209 if (range_max_check (i-1, nr * nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5210 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5211 retval = do_matrix_index (ii, jj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5212 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5213 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5214 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5215 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5216 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5217 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5218 if (mi.rows () == 0 || mi.columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5219 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5220 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5221 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5222 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5223 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5224 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5225 // Yes, we really do want to call this with mi.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5226 retval = fortran_style_matrix_index (mi);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5227 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5228 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5229 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5230 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5231 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5232 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5233 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5234 gripe_range_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5235 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5236 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5237 retval = do_matrix_index (magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5238 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5239 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5240 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5241 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5242 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5243
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5244 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5245 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5246
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5247 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5248 tree_constant_rep::fortran_style_matrix_index (const Matrix& mi) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5249 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5250 assert (is_matrix_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5251
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5252 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5253
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5254 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5255 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5256
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5257 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5258
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5259 int index_nr = mi.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5260 int index_nc = mi.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5261
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5262 if (index_nr >= 1 && index_nc >= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5263 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
5264 const double *cop_out = 0;
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
5265 const Complex *c_cop_out = 0;
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5266 int real_type = type_tag == matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5267 if (real_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5268 cop_out = matrix->data ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5269 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5270 c_cop_out = complex_matrix->data ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5271
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5272 const double *cop_out_index = mi.data ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5273
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5274 idx_vector iv (mi, 1, "", len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5275 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5276 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5277
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5278 int result_size = iv.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5279
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5280 if (nc == 1 || (nr != 1 && iv.one_zero_only ()))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5281 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5282 CRMATRIX (m, cm, result_size, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5283
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5284 for (int i = 0; i < result_size; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5285 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5286 int idx = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5287 CRMATRIX_ASSIGN_ELEM (m, cm, i, 0, cop_out [idx],
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5288 c_cop_out [idx], real_type);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5289 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5290
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5291 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5292 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5293 else if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5294 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5295 CRMATRIX (m, cm, 1, result_size);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5296
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5297 for (int i = 0; i < result_size; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5298 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5299 int idx = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5300 CRMATRIX_ASSIGN_ELEM (m, cm, 0, i, cop_out [idx],
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5301 c_cop_out [idx], real_type);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5302 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5303
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5304 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5305 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5306 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5307 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5308 CRMATRIX (m, cm, index_nr, index_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5309
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5310 for (int j = 0; j < index_nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5311 for (int i = 0; i < index_nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5312 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5313 double tmp = *cop_out_index++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5314 int idx = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5315 CRMATRIX_ASSIGN_ELEM (m, cm, i, j, cop_out [idx],
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5316 c_cop_out [idx], real_type);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5317 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5318
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5319 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5320 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5321 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5322 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5323 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5324 if (index_nr == 0 || index_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5325 ::error ("empty matrix invalid as index");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5326 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5327 ::error ("invalid matrix index");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5328 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5329 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5330
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5331 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5332 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5333
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5334 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5335 tree_constant_rep::do_vector_index (const tree_constant& i_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5336 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5337 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5338
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5339 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5340
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5341 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5342
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5343 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5344 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5345
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5346 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5347
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5348 assert ((nr == 1 || nc == 1) && ! user_pref.do_fortran_indexing);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5349
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5350 int swap_indices = (nr == 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5351
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5352 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5353 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5354 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5355 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5356 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5357 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5358 if (index_check (i, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5359 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5360 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5361 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5362 if (range_max_check (i, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5363 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5364 retval = do_matrix_index (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5365 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5366 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5367 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5368 if (range_max_check (i, nr) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5369 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5370 retval = do_matrix_index (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5371 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5372 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5373 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5374 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5375 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5376 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5377 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5378 if (mi.rows () == 0 || mi.columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5379 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5380 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5381 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5382 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5383 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5384 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5385 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5386 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5387 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5388
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5389 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5390 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5391 if (range_max_check (iv.max (), nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5392 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5393 retval = do_matrix_index (0, iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5394 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5395 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5396 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5397 if (range_max_check (iv.max (), nr) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5398 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5399 retval = do_matrix_index (iv, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5400 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5401 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5402 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5403 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5404 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5405 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5406 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5407 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5408 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5409 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5410 if (len == 2 && is_zero_one (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5411 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5412 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5413 retval = do_matrix_index (0, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5414 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5415 retval = do_matrix_index (1, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5416 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5417 else if (len == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5418 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5419 retval = do_matrix_index (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5420 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5421 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5422 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5423 if (index_check (ri, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5424 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5425 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5426 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5427 if (range_max_check (tree_to_mat_idx (ri.max ()), nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5428 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5429 retval = do_matrix_index (0, ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5430 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5431 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5432 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5433 if (range_max_check (tree_to_mat_idx (ri.max ()), nr) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5434 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5435 retval = do_matrix_index (ri, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5436 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5437 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5438 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5439 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5440 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5441 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5442 retval = do_matrix_index (0, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5443 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5444 retval = do_matrix_index (magic_colon, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5445 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5446 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5447 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5448 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5449 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5450
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5451 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5452 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5453
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5454 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5455 tree_constant_rep::do_matrix_index (const tree_constant& i_arg,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5456 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5457 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5458 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5459
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5460 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5461
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5462 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5463
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5464 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5465 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5466 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5467 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5468 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5469 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5470 if (index_check (i, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5471 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5472 retval = do_matrix_index (i, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5473 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5474 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5475 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5476 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5477 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5478 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5479 idx_vector iv (mi, user_pref.do_fortran_indexing, "row", rows ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5480 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5481 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5482
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5483 if (iv.length () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5484 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5485 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5486 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5487 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5488 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5489 retval = do_matrix_index (iv, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5490 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5491 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5492 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5493 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5494 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5495 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5496 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5497 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5498 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5499 if (nr == 2 && is_zero_one (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5500 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5501 retval = do_matrix_index (1, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5502 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5503 else if (nr == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5504 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5505 retval = do_matrix_index (0, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5506 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5507 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5508 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5509 if (index_check (ri, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5510 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5511 retval = do_matrix_index (ri, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5512 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5513 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5514 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5515 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5516 retval = do_matrix_index (magic_colon, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5517 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5518 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5519 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5520 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5521 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5522
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5523 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5524 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5525
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5526 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5527 tree_constant_rep::do_matrix_index (int i, const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5528 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5529 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5530
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5531 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5532
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5533 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5534
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5535 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5536 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5537
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5538 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5539 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5540 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5541 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5542 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5543 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5544 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5545 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5546 if (range_max_check (i, j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5547 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5548 retval = do_matrix_index (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5549 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5550 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5551 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5552 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5553 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5554 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5555 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5556 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5557 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5558
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5559 if (jv.length () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5560 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5561 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5562 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5563 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5564 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5565 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5566 if (range_max_check (i, jv.max (), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5567 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5568 retval = do_matrix_index (i, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5569 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5570 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5571 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5572 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5573 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5574 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5575 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5576 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5577 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5578 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5579 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5580 retval = do_matrix_index (i, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5581 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5582 else if (nc == 2 && is_one_zero (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5583 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5584 retval = do_matrix_index (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5585 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5586 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5587 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5588 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5589 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5590 if (range_max_check (i, tree_to_mat_idx (rj.max ()), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5591 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5592 retval = do_matrix_index (i, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5593 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5594 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5595 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5596 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5597 if (range_max_check (i, 0, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5598 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5599 retval = do_matrix_index (i, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5600 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5601 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5602 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5603 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5604 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5605
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5606 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5607 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5608
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5609 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5610 tree_constant_rep::do_matrix_index (const idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5611 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5612 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5613 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5614
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5615 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5616
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5617 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5618
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5619 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5620 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5621
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5622 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5623 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5624 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5625 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5626 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5627 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5628 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5629 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5630 if (range_max_check (iv.max (), j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5631 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5632 retval = do_matrix_index (iv, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5633 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5634 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5635 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5636 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5637 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5638 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5639 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5640 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5641 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5642
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5643 if (jv.length () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5644 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5645 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5646 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5647 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5648 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5649 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5650 if (range_max_check (iv.max (), jv.max (), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5651 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5652 retval = do_matrix_index (iv, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5653 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5654 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5655 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5656 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5657 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5658 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5659 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5660 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5661 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5662 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5663 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5664 retval = do_matrix_index (iv, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5665 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5666 else if (nc == 2 && is_one_zero (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5667 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5668 retval = do_matrix_index (iv, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5669 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5670 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5671 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5672 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5673 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5674 if (range_max_check (iv.max (), tree_to_mat_idx (rj.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5675 nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5676 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5677 retval = do_matrix_index (iv, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5678 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5679 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5680 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5681 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5682 if (range_max_check (iv.max (), 0, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5683 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5684 retval = do_matrix_index (iv, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5685 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5686 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5687 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5688 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5689 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5690
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5691 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5692 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5693
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5694 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5695 tree_constant_rep::do_matrix_index (const Range& ri,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5696 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5697 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5698 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5699
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5700 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5701
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5702 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5703
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5704 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5705 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5706
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5707 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5708 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5709 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5710 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5711 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5712 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5713 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5714 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5715 if (range_max_check (tree_to_mat_idx (ri.max ()), j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5716 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5717 retval = do_matrix_index (ri, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5718 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5719 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5720 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5721 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5722 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5723 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5724 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5725 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5726 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5727
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5728 if (jv.length () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5729 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5730 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5731 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5732 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5733 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5734 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5735 if (range_max_check (tree_to_mat_idx (ri.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5736 jv.max (), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5737 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5738 retval = do_matrix_index (ri, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5739 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5740 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5741 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5742 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5743 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5744 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5745 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5746 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5747 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5748 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5749 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5750 retval = do_matrix_index (ri, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5751 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5752 else if (nc == 2 && is_one_zero (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5753 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5754 retval = do_matrix_index (ri, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5755 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5756 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5757 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5758 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5759 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5760 if (range_max_check (tree_to_mat_idx (ri.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5761 tree_to_mat_idx (rj.max ()), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5762 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5763 retval = do_matrix_index (ri, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5764 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5765 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5766 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5767 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5768 retval = do_matrix_index (ri, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5769 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5770 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5771 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5772 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5773 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5774
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5775 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5776 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5777
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5778 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5779 tree_constant_rep::do_matrix_index (tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5780 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5781 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5782 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5783
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5784 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5785
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5786 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5787
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5788 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5789 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5790
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5791 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5792 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5793 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5794 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5795 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5796 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5797 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5798 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5799 if (range_max_check (0, j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5800 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5801 retval = do_matrix_index (magic_colon, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5802 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5803 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5804 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5805 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5806 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5807 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5808 idx_vector jv (mj, user_pref.do_fortran_indexing, "column", nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5809 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5810 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5811
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5812 if (jv.length () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5813 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5814 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5815 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5816 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5817 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5818 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5819 if (range_max_check (0, jv.max (), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5820 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5821 retval = do_matrix_index (magic_colon, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5822 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5823 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5824 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5825 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5826 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5827 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5828 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5829 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5830 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5831 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5832 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5833 retval = do_matrix_index (magic_colon, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5834 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5835 else if (nc == 2 && is_one_zero (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5836 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5837 retval = do_matrix_index (magic_colon, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5838 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5839 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5840 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5841 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5842 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5843 if (range_max_check (0, tree_to_mat_idx (rj.max ()), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5844 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5845 retval = do_matrix_index (magic_colon, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5846 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5847 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5848 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5849 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5850 retval = do_matrix_index (magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5851 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5852 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5853 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5854 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5855 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5856
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5857 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5858 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5859
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5860 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5861 tree_constant_rep::do_matrix_index (int i, int j) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5862 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5863 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5864
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5865 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5866 retval = tree_constant (matrix->elem (i, j));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5867 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5868 retval = tree_constant (complex_matrix->elem (i, j));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5869
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5870 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5871 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5872
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5873 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5874 tree_constant_rep::do_matrix_index (int i, const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5875 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5876 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5877
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5878 int jlen = jv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5879
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5880 CRMATRIX (m, cm, 1, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5881
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5882 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5883 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5884 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5885 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5886 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5887 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5888
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5889 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5890 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5891
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5892 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5893 tree_constant_rep::do_matrix_index (int i, const Range& rj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5894 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5895 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5896
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5897 int jlen = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5898
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5899 CRMATRIX (m, cm, 1, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5900
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5901 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5902 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5903 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5904 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5905 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5906 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5907 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5908 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5909
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5910 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5911
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5912 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5913 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5914
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5915 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5916 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5917 (int i, tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5918 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5919 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5920
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5921 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5922
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5923 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5924
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5925 CRMATRIX (m, cm, 1, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5926
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5927 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5928 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5929 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5930 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5931
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5932 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5933
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5934 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5935 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5936
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5937 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5938 tree_constant_rep::do_matrix_index (const idx_vector& iv, int j) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5939 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5940 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5941
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5942 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5943
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5944 CRMATRIX (m, cm, ilen, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5945
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5946 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5947 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5948 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5949 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, row, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5950 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5951
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5952 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5953
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5954 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5955 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5956
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5957 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5958 tree_constant_rep::do_matrix_index (const idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5959 const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5960 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5961 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5962
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5963 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5964 int jlen = jv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5965
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5966 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5967
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5968 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5969 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5970 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5971 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5972 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5973 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5974 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5975 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5976 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5977
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5978 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5979
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5980 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5981 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5982
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5983 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5984 tree_constant_rep::do_matrix_index (const idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5985 const Range& rj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5986 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5987 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5988
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5989 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5990 int jlen = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5991
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5992 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5993
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5994 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5995 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5996
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5997 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5998 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5999 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6000 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6001 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6002 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6003 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6004 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6005 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6006 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6007
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6008 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6009
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6010 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6011 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6012
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6013 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6014 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6015 (const idx_vector& iv, tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6016 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6017 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6018
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6019 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6020
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6021 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6022 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6023
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6024 CRMATRIX (m, cm, ilen, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6025
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6026 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6027 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6028 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6029 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6030 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6031 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6032 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6033 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6034
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6035 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6036
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6037 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6038 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6039
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6040 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6041 tree_constant_rep::do_matrix_index (const Range& ri, int j) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6042 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6043 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6044
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6045 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6046
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6047 CRMATRIX (m, cm, ilen, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6048
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6049 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6050 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6051 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6052 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6053 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6054 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6055 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, row, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6056 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6057
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6058 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6059
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6060 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6061 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6062
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6063 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6064 tree_constant_rep::do_matrix_index (const Range& ri,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6065 const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6066 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6067 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6068
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6069 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6070 int jlen = jv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6071
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6072 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6073
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6074 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6075 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6076 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6077 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6078 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6079 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6080 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6081 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6082 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6083 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6084 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6085 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6086
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6087 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6088
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6089 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6090 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6091
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6092 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6093 tree_constant_rep::do_matrix_index (const Range& ri, const Range& rj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6094 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6095 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6096
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6097 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6098 int jlen = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6099
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6100 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6101
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6102 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6103 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6104 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6105 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6106
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6107 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6108 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6109 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6110 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6111 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6112 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6113 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6114 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6115
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6116 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6117 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6118 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6119
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6120 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6121
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6122 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6123 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6124
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6125 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6126 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6127 (const Range& ri, tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6128 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6129 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6130
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6131 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6132
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6133 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6134
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6135 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6136
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6137 CRMATRIX (m, cm, ilen, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6138
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6139 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6140 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6141
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6142 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6143 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6144 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6145 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6146 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6147 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6148 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6149 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6150 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6151
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6152 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6153
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6154 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6155 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6156
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6157 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6158 tree_constant_rep::do_matrix_index (tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6159 int j) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6160 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6161 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6162
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6163 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6164
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6165 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6166
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6167 CRMATRIX (m, cm, nr, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6168
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6169 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6170 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6171 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6172 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6173
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6174 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6175
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6176 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6177 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6178
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6179 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6180 tree_constant_rep::do_matrix_index (tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6181 const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6182 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6183 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6184
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6185 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6186
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6187 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6188 int jlen = jv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6189
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6190 CRMATRIX (m, cm, nr, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6191
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6192 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6193 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6194 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6195 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6196 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6197 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6198 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6199 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6200
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6201 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6202
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6203 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6204 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6205
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6206 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6207 tree_constant_rep::do_matrix_index (tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6208 const Range& rj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6209 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6210 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6211
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6212 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6213
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6214 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6215 int jlen = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6216
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6217 CRMATRIX (m, cm, nr, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6218
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6219 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6220 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6221
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6222 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6223 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6224 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6225 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6226 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6227 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6228 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6229 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6230 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6231
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6232 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6233
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6234 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6235 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6236
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6237 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6238 tree_constant_rep::do_matrix_index (tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6239 tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6240 {
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
6241 tree_constant retval;
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6242 assert (mci == magic_colon && mcj == magic_colon);
529
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
6243 retval = tree_constant (*this);
7ea224e713cd [project @ 1994-07-20 18:54:27 by jwe]
jwe
parents: 509
diff changeset
6244 return retval;
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6245 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6246
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6247 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6248 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6249 (tree_constant_rep::constant_type mci) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6250 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6251 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6252
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6253 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6254 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6255 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6256 int size = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6257 if (size > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6258 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6259 CRMATRIX (m, cm, size, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6260 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6261 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6262 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6263 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6264 CRMATRIX_ASSIGN_REP_ELEM (m, cm, idx, 0, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6265 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6266 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6267 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6268 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6269 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6270 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6271
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6272 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6273 ;;; Local Variables: ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6274 ;;; mode: C++ ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6275 ;;; page-delimiter: "^/\\*" ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6276 ;;; End: ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6277 */