annotate src/tc-rep.cc @ 500:5f91088cb98e

[project @ 1994-07-08 02:16:02 by jwe]
author jwe
date Fri, 08 Jul 1994 02:24:43 +0000
parents d45bdf960233
children be155b3d5a2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1 // The constants for the tree class. -*- C++ -*-
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
41 #include "variables.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
42 #include "error.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
43 #include "gripes.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
44 #include "user-prefs.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
45 #include "utils.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
46 #include "pager.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
47 #include "pr-output.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
48 #include "tree-const.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
49 #include "idx-vector.h"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
50
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
51 #include "tc-inlines.cc"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
52
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 * How about a few macros?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
55 */
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 #ifndef MAX
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
58 #define MAX(a,b) ((a) > (b) ? (a) : (b))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
59 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
60
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
61 #ifndef MIN
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
62 #define MIN(a,b) ((a) < (b) ? (a) : (b))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
63 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
64
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
65 #ifndef ABS
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
66 #define ABS(x) (((x) < 0) ? (-x) : (x))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
67 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
68
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 * 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
71 * 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
72 * matrices. This was not done with overloaded or virtual functions
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
73 * 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
74 * the necessary functions (like elem) need to return values of
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
75 * different types...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
76 */
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 // 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
79 // complex matrix and their dimensions, declare a real or complex
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
80 // 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
81 // 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
82 // 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
83 // 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
84
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
85 // 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
86 // the tree_constant_rep class
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
87
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
88 #define REP_RHS_MATRIX(tc,m,cm,nr,nc) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
89 int nr = 0; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
90 int nc = 0; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
91 Matrix m; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
92 ComplexMatrix cm; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
93 if ((tc).const_type () == tree_constant_rep::complex_matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
94 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
95 cm = (tc).complex_matrix_value (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
96 nr = (cm).rows (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
97 nc = (cm).columns (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
98 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
99 else if ((tc).const_type () == tree_constant_rep::matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
100 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
101 m = (tc).matrix_value (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
102 nr = (m).rows (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
103 nc = (m).columns (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
104 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
105 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
106 abort ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
107
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
108 // Assign a real or complex value to a tree_constant.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
109 //
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
110 // 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
111 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
112
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
113 #define REP_ELEM_ASSIGN(i,j,rval,cval,real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
114 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
115 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
116 if (type_tag == tree_constant_rep::matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
117 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
118 if (real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
119 matrix->elem ((i), (j)) = (rval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
120 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
121 abort (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
122 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
123 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
124 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
125 if (real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
126 complex_matrix->elem ((i), (j)) = (rval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
127 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
128 complex_matrix->elem ((i), (j)) = (cval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
129 } \
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 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
132
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
133 // 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
134 // 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
135 // be used after this macro has been used.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
136
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
137 // 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
138 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
139
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
140 #define CRMATRIX(m,cm,nr,nc) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
141 Matrix m; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
142 ComplexMatrix cm; \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
143 if (type_tag == tree_constant_rep::matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
144 (m).resize ((nr), (nc)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
145 else if (type_tag == complex_matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
146 (cm).resize ((nr), (nc)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
147 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
148 abort (); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
149
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
150 // Assign a real or complex matrix to a tree constant.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
151
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
152 // 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
153 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
154
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
155 #define ASSIGN_CRMATRIX_TO(tc,m,cm) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
156 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
157 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
158 if (type_tag == matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
159 tc = tree_constant (m); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
160 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
161 tc = tree_constant (cm); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
162 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
163 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
164
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
165 // 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
166 // matrix to another real or complex matrix.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
167
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
168 // 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
169 // the tree_constant_rep class.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
170
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
171 #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
172 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
173 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
174 if (type_tag == matrix_constant) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
175 (m).elem ((i1), (j1)) = matrix->elem ((i2), (j2)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
176 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
177 (cm).elem ((i1), (j1)) = complex_matrix->elem ((i2), (j2)); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
178 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
179 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
180
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
181 // 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
182 // 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
183
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
184 #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
185 do \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
186 { \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
187 if (real_type) \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
188 (m).elem ((i), (j)) = (rval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
189 else \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
190 (cm).elem ((i), (j)) = (cval); \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
191 } \
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
192 while (0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
193
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 // A couple of handy helper functions.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
196
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
197 static int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
198 any_element_less_than (const Matrix& a, double val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
199 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
200 int nr = a.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
201 int nc = a.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
202 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
203 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
204 if (a.elem (i, j) < val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
205 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
206 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
207 }
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 static int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
210 any_element_greater_than (const Matrix& a, double val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
211 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
212 int nr = a.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
213 int nc = a.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
214 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
215 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
216 if (a.elem (i, j) > val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
217 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
218 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
219 }
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 static int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
222 any_element_is_complex (const ComplexMatrix& a)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
223 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
224 int nr = a.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
225 int nc = a.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
226 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
227 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
228 if (imag (a.elem (i, j)) != 0.0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
229 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
230 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
231 }
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 // Now, the classes.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
234
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 * The real representation of constants.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
237 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
238 tree_constant_rep::tree_constant_rep (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
239 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
240 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
241 }
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 tree_constant_rep::tree_constant_rep (double d)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
244 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
245 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
246 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
247 }
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 tree_constant_rep::tree_constant_rep (const Matrix& m)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
250 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
251 if (m.rows () == 1 && m.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
252 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
253 scalar = m.elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
254 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
255 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
256 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
257 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
258 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
259 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
260 }
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 tree_constant_rep::tree_constant_rep (const DiagMatrix& d)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
264 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
265 if (d.rows () == 1 && d.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
266 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
267 scalar = d.elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
268 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
269 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
270 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
271 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
272 matrix = new Matrix (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
273 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
274 }
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 tree_constant_rep::tree_constant_rep (const RowVector& v, int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
278 prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
279 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
280 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
281 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
282 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
283 scalar = v.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
284 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
285 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
286 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
287 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
288 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
289 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
290 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
291
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
292 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
293 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
294 Matrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
295 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
296 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
297 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
298 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
299 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
300 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
301 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
302 Matrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
303 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
304 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
305 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
306 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
307 }
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 tree_constant_rep::tree_constant_rep (const ColumnVector& v,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
312 int prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
313 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
314 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
315 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
316 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
317 scalar = v.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
318 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
319 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
320 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
321 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
322 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
323 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
324 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
325
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
326 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
327 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
328 Matrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
329 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
330 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
331 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
332 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
333 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
334 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
335 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
336 Matrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
337 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
338 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
339 matrix = new Matrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
340 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
341 }
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 tree_constant_rep::tree_constant_rep (const Complex& c)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
346 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
347 complex_scalar = new Complex (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
348 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
349 }
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 tree_constant_rep::tree_constant_rep (const ComplexMatrix& m)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
352 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
353 if (m.rows () == 1 && m.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
354 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
355 complex_scalar = new Complex (m.elem (0, 0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
356 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
357 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
358 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
359 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
360 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
361 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
362 }
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 tree_constant_rep::tree_constant_rep (const ComplexDiagMatrix& d)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
366 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
367 if (d.rows () == 1 && d.columns () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
368 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
369 complex_scalar = new Complex (d.elem (0, 0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
370 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
371 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
372 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
373 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
374 complex_matrix = new ComplexMatrix (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
375 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
376 }
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 tree_constant_rep::tree_constant_rep (const ComplexRowVector& v,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
380 int prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
381 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
382 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
383 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
384 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
385 complex_scalar = new Complex (v.elem (0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
386 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
387 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
388 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
389 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
390 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
391 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
392 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
393
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
394 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
395 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
396 ComplexMatrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
397 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
398 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
399 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
400 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
401 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
402 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
403 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
404 ComplexMatrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
405 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
406 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
407 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
408 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
409 }
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 tree_constant_rep::tree_constant_rep (const ComplexColumnVector& v,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
414 int prefer_column_vector)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
415 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
416 int len = v.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
417 if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
418 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
419 complex_scalar = new Complex (v.elem (0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
420 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
421 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
422 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
423 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
424 int pcv = (prefer_column_vector < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
425 ? user_pref.prefer_column_vectors
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
426 : prefer_column_vector;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
427
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
428 if (pcv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
429 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
430 ComplexMatrix m (len, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
431 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
432 m.elem (i, 0) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
433 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
434 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
435 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
436 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
437 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
438 ComplexMatrix m (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
439 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
440 m.elem (0, i) = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
441 complex_matrix = new ComplexMatrix (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
442 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
443 }
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 tree_constant_rep::tree_constant_rep (const char *s)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
448 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
449 string = strsave (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
450 type_tag = string_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
451 }
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 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
454 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
455 range = new Range (b, l, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
456 int nel = range->nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
457 if (nel < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
458 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
459 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
460 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
461 if (nel == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
462 ::error ("number of elements in range exceeds INT_MAX");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
463 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
464 ::error ("invalid range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
465 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
466 else if (nel > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
467 type_tag = range_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
468 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
469 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
470 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
471 if (nel == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
472 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
473 scalar = b;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
474 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
475 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
476 else if (nel == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
477 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
478 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
479 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
480 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
481 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
482 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
483 }
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 tree_constant_rep::tree_constant_rep (const Range& r)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
487 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
488 if (r.nelem () > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
489 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
490 range = new Range (r);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
491 type_tag = range_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
492 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
493 else if (r.nelem () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
494 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
495 scalar = r.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
496 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
497 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
498 else if (r.nelem () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
499 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
500 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
501 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
502 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
503 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
504 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
505 }
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 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
508 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
509 assert (t == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
510
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
511 type_tag = magic_colon;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
512 }
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 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
515 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
516 type_tag = t.type_tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
517
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
518 switch (t.type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
519 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
520 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
521 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
522 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
523 scalar = t.scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
524 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
525 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
526 matrix = new Matrix (*(t.matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
527 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
528 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
529 string = strsave (t.string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
530 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
531 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
532 complex_matrix = new ComplexMatrix (*(t.complex_matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
533 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
534 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
535 complex_scalar = new Complex (*(t.complex_scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
536 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
537 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
538 range = new Range (*(t.range));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
539 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
540 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
541 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
542 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
543 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
544 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
545 }
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 tree_constant_rep::~tree_constant_rep (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
549 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
550 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
551 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
552 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
553 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
554 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
555 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
556 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
557 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
558 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
559 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
560 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
561 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
562 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
563 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
564 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
565 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
566 delete [] string;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
567 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
568 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
569 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
570 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
571 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
572 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
573 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
574 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
575 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
576 }
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 #if defined (MDEBUG)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
580 void *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
581 tree_constant_rep::operator new (size_t size)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
582 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
583 tree_constant_rep *p = ::new tree_constant_rep;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
584 cerr << "tree_constant_rep::new(): " << p << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
585 return p;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
586 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
589 tree_constant_rep::operator delete (void *p, size_t size)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
590 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
591 cerr << "tree_constant_rep::delete(): " << p << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
592 ::delete p;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
593 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
594 #endif
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
595
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
596 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
597 tree_constant_rep::resize (int i, int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
598 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
599 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
600 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
601 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
602 matrix->resize (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
603 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
604 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
605 complex_matrix->resize (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
606 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
607 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
608 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
609 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
610 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
614 tree_constant_rep::resize (int i, int j, double val)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
615 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
616 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
617 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
618 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
619 matrix->resize (i, j, val);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
620 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
621 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
622 complex_matrix->resize (i, j, val);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
623 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
624 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
625 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
626 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
627 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
631 tree_constant_rep::maybe_resize (int i, int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
632 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
633 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
634 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
635
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
636 i++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
637 j++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
638
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
639 assert (i > 0 && j > 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
640
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
641 if (i > nr || j > nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
642 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
643 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
644 resize (MAX (i, nr), MAX (j, nc), 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
645 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
646 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
647 if (i > nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
648 ::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
649
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
650 if (j > nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
651 ::error ("column index = %d exceeds max column dimension = %d",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
652 j, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
653 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
658 tree_constant_rep::maybe_resize (int i, force_orient f_orient = no_orient)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
659 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
660 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
661 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
662
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
663 i++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
664
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
665 assert (i >= 0 && (nr <= 1 || nc <= 1));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
666
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
667 // 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
668 // 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
669 // 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
670 // 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
671 // 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
672 if (i == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
673 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
674
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
675 if (nr <= 1 && nc <= 1 && i >= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
676 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
677 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
678 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
679 if (f_orient == row_orient)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
680 resize (1, i, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
681 else if (f_orient == column_orient)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
682 resize (i, 1, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
683 else if (user_pref.prefer_column_vectors)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
684 resize (i, 1, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
685 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
686 resize (1, i, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
687 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
688 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
689 ::error ("matrix index = %d exceeds max dimension = %d", i, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
690 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
691 else if (nr == 1 && i > nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
692 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
693 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
694 resize (1, i, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
695 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
696 ::error ("matrix index = %d exceeds max dimension = %d", i, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
697 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
698 else if (nc == 1 && i > nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
699 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
700 if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
701 resize (i, 1, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
702 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
703 ::error ("matrix index = %d exceeds max dimension = ", i, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
704 }
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 double
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
708 tree_constant_rep::to_scalar (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
709 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
710 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
711
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
712 double retval = 0.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
713
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
714 switch (tmp.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
715 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
716 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
717 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
718 retval = tmp.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
719 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
720 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
721 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
722 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
723 Matrix m = tmp.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
724 retval = m (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
725 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
726 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
727 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
728 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
729 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
730 int flag = user_pref.ok_to_lose_imaginary_part;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
731 if (flag == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
732 warning ("implicit conversion of complex value to real value");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
733
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
734 if (flag != 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
735 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
736 ComplexMatrix m = tmp.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
737 return ::real (m (0, 0));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
738 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
739 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
740 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
741 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
742 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
743 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
744 ::error ("complex matrix used in invalid context");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
745 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
746 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
747 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
748 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
749 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
750 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
751 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
752 }
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 ColumnVector
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
755 tree_constant_rep::to_vector (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
756 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
757 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
758
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
759 ColumnVector retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
760
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
761 switch (tmp.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
762 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
763 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
764 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
765 retval.resize (1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
766 retval.elem (0) = tmp.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
767 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
768 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
769 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
770 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
771 Matrix m = tmp.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
772 int nr = m.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
773 int nc = m.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
774 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
775 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
776 retval.resize (nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
777 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
778 retval.elem (i) = m (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
779 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
780 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
781 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
782 retval.resize (nr);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
783 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
784 retval.elem (i) = m.elem (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
785 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
788 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
789 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
790 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
791 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
792 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
793 }
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 Matrix
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
796 tree_constant_rep::to_matrix (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
797 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
798 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
799
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
800 Matrix retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
801
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
802 switch (tmp.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
803 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
804 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
805 retval.resize (1, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
806 retval.elem (0, 0) = tmp.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
807 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
808 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
809 retval = tmp.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
810 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
811 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
812 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
813 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
814 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
815 }
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 tree_constant_rep::constant_type
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
818 tree_constant_rep::force_numeric (int force_str_conv = 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
819 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
820 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
821 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
822 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
823 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
824 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
825 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
826 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
827 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
828 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
829 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
830 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
831 ::error ("failed to convert `%s' to a numeric type --", string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
832 ::error ("default conversion turned off");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
833 // Abort!
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
834 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
835 }
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 int len = strlen (string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
838 if (len > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
839 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
840 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
841 Matrix *tm = new Matrix (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
842 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
843 tm->elem (0, i) = toascii ((int) string[i]);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
844 matrix = tm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
845 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
846 else if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
847 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
848 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
849 scalar = toascii ((int) string[0]);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
850 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
851 else if (len == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
852 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
853 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
854 matrix = new Matrix (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
855 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
856 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
857 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
858 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
859 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
860 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
861 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
862 int len = range->nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
863 if (len > 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
864 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
865 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
866 Matrix *tm = new Matrix (1, len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
867 double b = range->base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
868 double increment = range->inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
869 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
870 tm->elem (0, i) = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
871 matrix = tm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
872 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
873 else if (len == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
874 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
875 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
876 scalar = range->base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
877 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
880 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
881 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
882 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
883 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
884 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
885 return type_tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
886 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
889 tree_constant_rep::make_numeric (int force_str_conv = 0) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
890 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
891 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
892 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
893 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
894 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
895 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
896 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
897 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
898 retval = tree_constant (*matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
899 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
900 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
901 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
902 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
903 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
904 retval = tree_constant (*complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
905 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
906 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
907 retval = tree_constant (string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
908 retval.force_numeric (force_str_conv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
909 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
910 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
911 retval = tree_constant (*range);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
912 retval.force_numeric (force_str_conv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
913 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
914 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
915 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
916 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
917 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
918 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
919 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
920 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
923 do_binary_op (tree_constant& a, tree_constant& b, tree::expression_type t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
924 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
925 tree_constant ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
926
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
927 int first_empty = (a.rows () == 0 || a.columns () == 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
928 int second_empty = (b.rows () == 0 || b.columns () == 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
929
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
930 if (first_empty || second_empty)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
931 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
932 int flag = user_pref.propagate_empty_matrices;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
933 if (flag < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
934 warning ("binary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
935 else if (flag == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
936 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
937 ::error ("invalid binary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
938 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
939 }
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 tree_constant tmp_a = a.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
943 tree_constant tmp_b = b.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
944
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
945 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
946 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
947
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
948 double d1, d2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
949 Matrix m1, m2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
950 Complex c1, c2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
951 ComplexMatrix cm1, cm2;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
952
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
953 switch (a_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
954 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
955 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
956 d1 = tmp_a.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
957 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
958 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
959 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
960 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
961 ans = do_binary_op (d1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
962 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
963 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
964 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
965 ans = do_binary_op (d1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
966 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
967 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
968 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
969 ans = do_binary_op (d1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
970 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
971 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
972 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
973 ans = do_binary_op (d1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
974 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
975 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
976 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
977 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
978 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
979 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
980 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
981 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
982 m1 = tmp_a.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
983 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
984 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
985 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
986 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
987 ans = do_binary_op (m1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
988 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
989 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
990 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
991 ans = do_binary_op (m1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
992 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
993 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
994 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
995 ans = do_binary_op (m1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
996 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
997 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
998 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
999 ans = do_binary_op (m1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1000 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1001 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1002 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1003 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1004 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1005 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1006 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1007 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1008 c1 = tmp_a.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1009 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1010 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1011 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1012 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1013 ans = do_binary_op (c1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1014 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1015 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1016 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1017 ans = do_binary_op (c1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1018 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1019 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1020 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1021 ans = do_binary_op (c1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1022 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1023 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1024 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1025 ans = do_binary_op (c1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1026 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1027 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1028 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1029 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1030 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1031 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1032 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1033 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1034 cm1 = tmp_a.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1035 switch (b_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1036 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1037 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1038 d2 = tmp_b.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1039 ans = do_binary_op (cm1, d2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1040 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1041 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1042 m2 = tmp_b.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1043 ans = do_binary_op (cm1, m2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1044 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1045 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1046 c2 = tmp_b.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1047 ans = do_binary_op (cm1, c2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1048 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1049 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1050 cm2 = tmp_b.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1051 ans = do_binary_op (cm1, cm2, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1052 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1053 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1054 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1055 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1056 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1057 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1058 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1059 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1060 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1061 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1062 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1063 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1064 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1065 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1068 do_unary_op (tree_constant& a, tree::expression_type t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1069 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1070 tree_constant ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1071
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1072 if (a.rows () == 0 || a.columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1073 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1074 int flag = user_pref.propagate_empty_matrices;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1075 if (flag < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1076 warning ("unary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1077 else if (flag == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1078 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1079 ::error ("invalid unary operation on empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1080 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1081 }
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 tree_constant tmp_a = a.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1085
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1086 switch (tmp_a.const_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1087 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1088 case tree_constant_rep::scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1089 ans = do_unary_op (tmp_a.double_value (), t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1090 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1091 case tree_constant_rep::matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1092 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1093 Matrix m = tmp_a.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1094 ans = do_unary_op (m, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1095 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1096 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1097 case tree_constant_rep::complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1098 ans = do_unary_op (tmp_a.complex_value (), t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1099 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1100 case tree_constant_rep::complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1101 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1102 ComplexMatrix m = tmp_a.complex_matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1103 ans = do_unary_op (m, t);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1104 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1105 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1106 case tree_constant_rep::magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1107 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1108 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1109 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1110 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1111 return ans;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1112 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1115 tree_constant_rep::bump_value (tree::expression_type etype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1116 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1117 switch (etype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1118 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1119 case tree::increment:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1120 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1121 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1122 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1123 scalar++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1124 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1125 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1126 *matrix = *matrix + 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1127 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1128 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1129 *complex_scalar = *complex_scalar + 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1130 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1131 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1132 *complex_matrix = *complex_matrix + 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1133 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1134 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1135 ::error ("string++ and ++string not implemented yet, ok?");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1136 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1137 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1138 range->set_base (range->base () + 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1139 range->set_limit (range->limit () + 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1140 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1141 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1142 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1143 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1144 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1145 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1146 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1147 case tree::decrement:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1148 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1149 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1150 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1151 scalar--;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1152 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1153 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1154 *matrix = *matrix - 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1155 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1156 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1157 ::error ("string-- and -- string not implemented yet, ok?");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1158 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1159 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1160 range->set_base (range->base () - 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1161 range->set_limit (range->limit () - 1.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1162 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1163 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1164 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1165 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1166 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1167 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1168 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1169 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1170 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1171 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1172 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1176 tree_constant_rep::maybe_mutate (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1177 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1178 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1179 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1180
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1181 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1182 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1183 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1184 if (::imag (*complex_scalar) == 0.0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1185 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1186 double d = ::real (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1187 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1188 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1189 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1190 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1191 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1192 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1193 if (! any_element_is_complex (*complex_matrix))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1194 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1195 Matrix *m = new Matrix (::real (*complex_matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1196 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1197 matrix = m;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1198 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1199 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1200 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1201 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1202 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1203 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1204 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1205 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1206 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1207 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1208 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1209 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1210 }
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 // Avoid calling rows() and columns() for things like magic_colon.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1213
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1214 int nr = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1215 int nc = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1216 if (type_tag == matrix_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1217 || type_tag == complex_matrix_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1218 || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1219 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1220 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1221 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1222 }
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 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1225 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1226 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1227 if (nr == 1 && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1228 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1229 double d = matrix->elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1230 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1231 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1232 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1233 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1234 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1235 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1236 if (nr == 1 && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1237 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1238 Complex c = complex_matrix->elem (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1239 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1240 complex_scalar = new Complex (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1241 type_tag = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1242 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1243 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1244 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1245 if (nr == 1 && nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1246 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1247 double d = range->base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1248 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1249 scalar = d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1250 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1251 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1252 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1253 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1254 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1255 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1259 tree_constant_rep::print (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1260 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1261 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1262 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1263
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1264 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1265 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1266
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1267 if (print)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1268 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1269 ostrstream output_buf;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1270 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1271 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1272 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1273 octave_print_internal (output_buf, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1274 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1275 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1276 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1277 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1278 output_buf << "[]";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1279 if (user_pref.print_empty_dimensions)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1280 output_buf << "(" << nr << "x" << nc << ")";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1281 output_buf << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1282 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1283 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1284 octave_print_internal (output_buf, *matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1285 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1286 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1287 octave_print_internal (output_buf, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1288 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1289 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1290 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1291 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1292 output_buf << "[]";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1293 if (user_pref.print_empty_dimensions)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1294 output_buf << "(" << nr << "x" << nc << ")";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1295 output_buf << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1296 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1297 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1298 octave_print_internal (output_buf, *complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1299 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1300 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1301 output_buf << string << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1302 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1303 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1304 octave_print_internal (output_buf, *range);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1305 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1306 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1307 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1308 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1309 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1310 }
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 output_buf << ends;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1313 maybe_page_output (output_buf);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1314 }
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 tree_constant
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
1318 tree_constant_rep::do_index (const Octave_object& args, int nargin)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1319 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1320 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1321
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1322 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1323 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1324
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1325 if (rows () == 0 || columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1326 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1327 ::error ("attempt to index empty matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1328 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1329 }
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 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1332 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1333 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1334 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1335 retval = do_scalar_index (args, nargin);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1336 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1337 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1338 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1339 retval = do_matrix_index (args, nargin);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1340 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1341 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1342 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1343 // retval = do_string_index (args, nargin);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1344 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1345 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1346 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1347 // 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
1348 // range indexing functions.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1349 force_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1350 assert (type_tag != magic_colon && type_tag != range_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1351 retval = do_index (args, nargin);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1352 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1353 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1354 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1355 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1356 }
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 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1359 }
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 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1362 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
1363 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1364 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1365 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1366 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1367 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1368 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1369 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1370 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1371 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1372 if (mark_as_global)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1373 os << "# type: global ";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1374 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1375 os << "# type: ";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1376 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1377 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1378 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1379 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1380 }
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 long old_precision = os.precision ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1383 os.precision (precision);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1384
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1385 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1386 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1387 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1388 os << "scalar\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1389 << scalar << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1390 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1391 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1392 os << "matrix\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1393 << "# rows: " << rows () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1394 << "# columns: " << columns () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1395 << *matrix ;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1396 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1397 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1398 os << "complex scalar\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1399 << *complex_scalar << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1400 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1401 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1402 os << "complex matrix\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1403 << "# rows: " << rows () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1404 << "# columns: " << columns () << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1405 << *complex_matrix ;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1406 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1407 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1408 os << "string\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1409 << "# length: " << strlen (string) << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1410 << string << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1411 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1412 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1413 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1414 os << "range\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1415 << "# base, limit, increment\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1416 << range->base () << " "
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1417 << range->limit () << " "
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1418 << range->inc () << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1419 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1420 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1421 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1422 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1423 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1424 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1425 }
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 os.precision (old_precision);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1428
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1429 // Really want to return 1 only if write is successful.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1430 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1431 }
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 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1434 tree_constant_rep::save_three_d (ostream& os, int parametric)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1435 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1436 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1437 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1438
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1439 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1440 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1441 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1442 os << "# 3D data...\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1443 << "# type: matrix\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1444 << "# total rows: " << nr << "\n"
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1445 << "# total columns: " << nc << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1446
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1447 if (parametric)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1448 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1449 int extras = nc % 3;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1450 if (extras)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1451 warning ("ignoring last %d columns", extras);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1452
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1453 for (int i = 0; i < nc-extras; i += 3)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1454 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1455 os << matrix->extract (0, i, nr-1, i+2);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1456 if (i+3 < nc-extras)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1457 os << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1458 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1461 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1462 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1463 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1464 os << matrix->extract (0, i, nr-1, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1465 if (i+1 < nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1466 os << "\n";
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1467 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1470 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1471 ::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
1472 return 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1473 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1474 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1475 // Really want to return 1 only if write is successful.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1476 return 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1477 }
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 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1480 tree_constant_rep::load (istream& is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1481 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1482 int is_global = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1483
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1484 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1485
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1486 // Look for type keyword
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1487
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1488 char *tag = extract_keyword (is, "type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1489
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1490 if (tag != (char *) NULL && *tag != '\0')
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1491 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1492 char *ptr = strchr (tag, ' ');
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1493 if (ptr != (char *) NULL)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1494 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1495 *ptr = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1496 is_global = (strncmp (tag, "global", 6) == 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1497 *ptr = ' ';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1498 if (is_global)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1499 ptr++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1500 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1501 ptr = tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1502 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1503 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1504 ptr = tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1505
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1506 if (strncmp (ptr, "scalar", 6) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1507 type_tag = load (is, scalar_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1508 else if (strncmp (ptr, "matrix", 6) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1509 type_tag = load (is, matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1510 else if (strncmp (ptr, "complex scalar", 14) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1511 type_tag = load (is, complex_scalar_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1512 else if (strncmp (ptr, "complex matrix", 14) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1513 type_tag = load (is, complex_matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1514 else if (strncmp (ptr, "string", 6) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1515 type_tag = load (is, string_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1516 else if (strncmp (ptr, "range", 5) == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1517 type_tag = load (is, range_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1518 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1519 ::error ("unknown constant type `%s'", tag);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1520 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1521 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1522 ::error ("failed to extract keyword specifying value type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1523
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1524 delete [] tag;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1525
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1526 return is_global;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1527 }
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 tree_constant_rep::constant_type
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1530 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
1531 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1532 tree_constant_rep::constant_type status = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1533
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1534 switch (t)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1535 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1536 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1537 is >> scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1538 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1539 status = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1540 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1541 ::error ("failed to load scalar constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1542 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1543 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1544 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1545 int nr = 0, nc = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1546
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1547 if (extract_keyword (is, "rows", nr) && nr > 0
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1548 && extract_keyword (is, "columns", nc) && nc > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1549 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1550 matrix = new Matrix (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1551 is >> *matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1552 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1553 status = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1554 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1555 ::error ("failed to load matrix constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1556 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1557 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1558 ::error ("failed to extract number of rows and columns");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1559 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1560 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1561 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1562 complex_scalar = new Complex;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1563 is >> *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1564 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1565 status = complex_scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1566 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1567 ::error ("failed to load complex scalar constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1568 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1569 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1570 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1571 int nr = 0, nc = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1572
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1573 if (extract_keyword (is, "rows", nr) && nr > 0
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1574 && extract_keyword (is, "columns", nc) && nc > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1575 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1576 complex_matrix = new ComplexMatrix (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1577 is >> *complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1578 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1579 status = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1580 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1581 ::error ("failed to load complex matrix constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1582 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1583 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1584 ::error ("failed to extract number of rows and columns");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1585 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1586 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1587 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1588 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1589 int len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1590 if (extract_keyword (is, "length", len) && len > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1591 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1592 string = new char [len+1];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1593 is.get (string, len+1, EOF);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1594 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1595 status = string_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1596 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1597 ::error ("failed to load string constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1598 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1599 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1600 ::error ("failed to extract string length");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1601 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1602 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1603 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1604 skip_comments (is);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1605 range = new Range ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1606 is >> *range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1607 if (is)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1608 status = range_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1609 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1610 ::error ("failed to load range constant");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1611 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1612 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1613 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1614 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1615 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1616 return status;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1617 }
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 double
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1620 tree_constant_rep::double_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1621 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1622 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1623 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1624 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1625 return scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1626 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1627 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1628 int flag = user_pref.ok_to_lose_imaginary_part;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1629 if (flag == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1630 warning ("implicit conversion of complex value to real value");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1631
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1632 if (flag != 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1633 return ::real (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1634
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1635 ::error ("implicit conversion of complex value to real value");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1636 ::error ("not allowed");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1637 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1638 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1639 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1640 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1641 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1642 }
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 Matrix
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1646 tree_constant_rep::matrix_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1647 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1648 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1649 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1650 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1651 return Matrix (1, 1, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1652 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1653 return *matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1654 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1655 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1656 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1657 int flag = user_pref.ok_to_lose_imaginary_part;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1658 if (flag == -1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1659 warning ("implicit conversion of complex matrix to real matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1660
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1661 if (flag != 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1662 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1663 if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1664 return Matrix (1, 1, ::real (*complex_scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1665 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1666 return ::real (*complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1667 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1668 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1669 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1670 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1671 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1672 ::error ("implicit conversion of complex matrix to real matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1673 ::error ("not allowed");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1674 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1675 jump_to_top_level ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1676 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1677 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1678 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1679 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1680 }
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 Complex
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1684 tree_constant_rep::complex_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1685 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1686 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1687 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1688 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1689 return *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1690 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1691 return Complex (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1692 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1693 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1694 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1695 }
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 ComplexMatrix
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1699 tree_constant_rep::complex_matrix_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1700 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1701 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1702 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1703 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1704 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1705 return ComplexMatrix (1, 1, Complex (scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1706 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1707 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1708 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1709 return ComplexMatrix (1, 1, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1710 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1711 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1712 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1713 return ComplexMatrix (*matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1714 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1715 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1716 return *complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1717 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1718 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1719 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1720 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1721 }
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 char *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1725 tree_constant_rep::string_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1726 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1727 assert (type_tag == string_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1728 return string;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1729 }
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 Range
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1732 tree_constant_rep::range_value (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1733 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1734 assert (type_tag == range_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1735 return *range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1736 }
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 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1739 tree_constant_rep::rows (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1740 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1741 int retval = -1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1742 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1743 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1744 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1745 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1746 retval = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1747 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1748 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1749 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1750 retval = (columns () > 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1751 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1752 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1753 retval = matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1754 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1755 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1756 retval = complex_matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1757 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1758 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1759 ::error ("invalid use of colon operator");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1760 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1761 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1762 retval = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1763 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1764 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1765 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1766 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1767 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1768 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1769 }
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 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1772 tree_constant_rep::columns (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1773 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1774 int retval = -1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1775 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1776 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1777 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1778 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1779 retval = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1780 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1781 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1782 retval = matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1783 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1784 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1785 retval = complex_matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1786 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1787 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1788 retval = strlen (string);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1789 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1790 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1791 retval = range->nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1792 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1793 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1794 ::error ("invalid use of colon operator");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1795 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1796 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1797 retval = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1798 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1799 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1800 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1801 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1802 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1803 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1804 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1807 tree_constant_rep::all (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1808 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1809 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1810 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1811 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1812 return tmp.all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1813 }
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1816 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1817 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1818 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1819 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1820 double status = (scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1821 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1822 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1823 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1824 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1825 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1826 Matrix m = matrix->all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1827 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1828 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1829 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1830 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1831 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1832 double status = (*complex_scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1833 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1834 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1835 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1836 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1837 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1838 Matrix m = complex_matrix->all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1839 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1840 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1841 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1842 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1843 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1844 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1845 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1846 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1847 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1848 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1849 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1850 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1853 tree_constant_rep::any (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1854 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1855 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1856 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1857 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1858 return tmp.any ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1859 }
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1862 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1863 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1864 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1865 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1866 double status = (scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1867 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1868 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1869 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1870 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1871 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1872 Matrix m = matrix->any ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1873 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1874 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1875 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1876 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1877 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1878 double status = (*complex_scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1879 retval = tree_constant (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1880 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1881 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1882 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1883 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1884 Matrix m = complex_matrix->any ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1885 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1886 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1887 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1888 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1889 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1890 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1891 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1892 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1893 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1894 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1895 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1896 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1899 tree_constant_rep::isstr (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1900 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1901 double status = 0.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1902 if (type_tag == string_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1903 status = 1.0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1904 tree_constant retval (status);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1905 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1906 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1909 tree_constant_rep::convert_to_str (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1910 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1911 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1912
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1913 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1914 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1915 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1916 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1917 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1918 double d = double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1919 int i = NINT (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1920 // Warn about out of range conversions?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1921 char s[2];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1922 s[0] = (char) i;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1923 s[1] = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1924 retval = tree_constant (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1925 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1926 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1927 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1928 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1929 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1930 ColumnVector v = to_vector ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1931 int len = v.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1932 if (len == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1933 ::error ("can only convert vectors and scalars to strings");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1934 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1935 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1936 char *s = new char [len+1];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1937 s[len] = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1938 for (int i = 0; i < len; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1939 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1940 double d = v.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1941 int ival = NINT (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1942 // Warn about out of range conversions?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1943 s[i] = (char) ival;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1944 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1945 retval = tree_constant (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1946 delete [] s;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1947 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1950 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1951 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1952 Range r = range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1953 double b = r.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1954 double incr = r.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1955 int nel = r.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1956 char *s = new char [nel+1];
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1957 s[nel] = '\0';
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1958 for (int i = 0; i < nel; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1959 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1960 double d = b + i * incr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1961 int ival = NINT (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1962 // Warn about out of range conversions?
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1963 s[i] = (char) ival;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1964 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1965 retval = tree_constant (s);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1966 delete [] s;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1967 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1968 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1969 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1970 retval = tree_constant (*this);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1971 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1972 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1973 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1974 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1975 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1976 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1977 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1978 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1981 tree_constant_rep::convert_to_row_or_column_vector (void)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1982 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1983 assert (type_tag == matrix_constant || type_tag == complex_matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1984
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1985 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1986 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1987
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1988 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1989
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1990 assert (len > 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1991
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1992 int new_nr = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1993 int new_nc = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1994
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1995 if (user_pref.prefer_column_vectors)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1996 new_nr = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1997 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1998 new_nc = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
1999
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2000 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2001 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2002 Matrix *m = new Matrix (new_nr, new_nc);
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 double *cop_out = matrix->fortran_vec ();
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 for (int i = 0; i < len; i++)
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 if (new_nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2009 m->elem (0, i) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2010 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2011 m->elem (i, 0) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2012 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2013
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2014 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2015 matrix = m;
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2018 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2019 ComplexMatrix *cm = new ComplexMatrix (new_nr, new_nc);
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 Complex *cop_out = complex_matrix->fortran_vec ();
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 for (int i = 0; i < len; i++)
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 if (new_nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2026 cm->elem (0, i) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2027 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2028 cm->elem (i, 0) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2029 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2030
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2031 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2032 complex_matrix = cm;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2036 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2037 tree_constant_rep::is_true (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2040 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2041 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2042 return tmp.is_true ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2043 }
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 int retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2046 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2049 retval = (scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2050 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2051 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2052 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2053 Matrix m = (matrix->all ()) . all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2054 retval = (m.rows () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2055 && m.columns () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2056 && m.elem (0, 0) != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2057 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2058 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2059 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2060 retval = (*complex_scalar != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2061 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2062 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2063 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2064 Matrix m = (complex_matrix->all ()) . all ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2065 retval = (m.rows () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2066 && m.columns () == 1
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2067 && m.elem (0, 0) != 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2068 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2069 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2070 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2071 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2072 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2073 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2074 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2075 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2076 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2077 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2078 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2079
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2080 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2081 tree_constant_rep::cumprod (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2084 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2085 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2086 return tmp.cumprod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2087 }
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 retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2090 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2093 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2094 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2095 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2096 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2097 Matrix m = matrix->cumprod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2098 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2099 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2100 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2101 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2102 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2103 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2104 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2105 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2106 ComplexMatrix m = complex_matrix->cumprod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2107 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2108 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2109 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2110 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2111 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2112 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2113 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2114 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2115 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2116 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2117 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2118 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2119
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2120 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2121 tree_constant_rep::cumsum (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2124 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2125 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2126 return tmp.cumsum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2127 }
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 retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2130 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2133 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2134 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2135 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2136 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2137 Matrix m = matrix->cumsum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2138 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2139 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2140 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2141 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2142 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2143 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2144 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2145 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2146 ComplexMatrix m = complex_matrix->cumsum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2147 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2148 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2149 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2150 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2151 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2152 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2153 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2154 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2155 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2156 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2157 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2158 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2159
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2160 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2161 tree_constant_rep::prod (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2164 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2165 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2166 return tmp.prod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2167 }
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 retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2170 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2173 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2174 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2175 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2176 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2177 Matrix m = matrix->prod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2178 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2179 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2180 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2181 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2182 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2183 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2184 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2185 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2186 ComplexMatrix m = complex_matrix->prod ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2187 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2188 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2189 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2190 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2191 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2192 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2193 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2194 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2195 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2196 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2197 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2198 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2199
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2200 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2201 tree_constant_rep::sum (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2204 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2205 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2206 return tmp.sum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2207 }
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 retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2210 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2213 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2214 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2215 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2216 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2217 Matrix m = matrix->sum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2218 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2219 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2220 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2221 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2222 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2223 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2224 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2225 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2226 ComplexMatrix m = complex_matrix->sum ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2227 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2228 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2229 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2230 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2231 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2232 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2233 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2234 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2235 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2236 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2237 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2238 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2239
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2240 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2241 tree_constant_rep::sumsq (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2244 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2245 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2246 return tmp.sumsq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2247 }
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 retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2250 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2253 retval = tree_constant (scalar * scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2254 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2255 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2256 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2257 Matrix m = matrix->sumsq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2258 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2259 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2260 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2261 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2262 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2263 Complex c (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2264 retval = tree_constant (c * c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2265 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2266 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2267 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2268 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2269 ComplexMatrix m = complex_matrix->sumsq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2270 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2271 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2272 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2273 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2274 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2275 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2276 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2277 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2278 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2279 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2280 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2281 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2282
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2283 static tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2284 make_diag (const Matrix& v, int k)
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 int nr = v.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2287 int nc = v.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2288 assert (nc == 1 || nr == 1);
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2291
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2292 int roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2293 int coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2294 if (k > 0)
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 roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2297 coff = k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2298 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2299 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2300 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2301 roff = -k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2302 coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2303 }
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 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2306 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2307 int n = nc + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2308 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2309 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2310 m.elem (i+roff, i+coff) = v.elem (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2311 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2312 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2313 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2314 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2315 int n = nr + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2316 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2317 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2318 m.elem (i+roff, i+coff) = v.elem (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2319 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2320 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2321
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2322 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2323 }
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 static tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2326 make_diag (const ComplexMatrix& v, int k)
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 int nr = v.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2329 int nc = v.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2330 assert (nc == 1 || nr == 1);
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2333
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2334 int roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2335 int coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2336 if (k > 0)
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 roff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2339 coff = k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2340 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2341 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2342 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2343 roff = -k;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2344 coff = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2345 }
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 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2348 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2349 int n = nc + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2350 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2351 for (int i = 0; i < nc; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2352 m.elem (i+roff, i+coff) = v.elem (0, i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2353 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2354 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2355 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2356 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2357 int n = nr + ABS (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2358 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2359 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2360 m.elem (i+roff, i+coff) = v.elem (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2361 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2362 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2363
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2364 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2365 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2368 tree_constant_rep::diag (void) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2371 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2372 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2373 return tmp.diag ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2374 }
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 retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2377 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2380 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2381 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2382 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2383 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2384 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2385 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2386 if (nr == 0 || nc == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2389 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2390 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2391 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2392 retval = make_diag (matrix_value (), 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2393 else
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 ColumnVector v = matrix->diag ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2396 if (v.capacity () > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2397 retval = tree_constant (v);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2400 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2401 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2402 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2403 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2404 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2405 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2406 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2407 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2408 if (nr == 0 || nc == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2411 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2412 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2413 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2414 retval = make_diag (complex_matrix_value (), 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2415 else
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 ComplexColumnVector v = complex_matrix->diag ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2418 if (v.capacity () > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2419 retval = tree_constant (v);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2422 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2423 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2424 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2425 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2426 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2427 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2428 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2429 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2430 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2431 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2432
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2433 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2434 tree_constant_rep::diag (const tree_constant& a) const
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 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2437 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2438 tree_constant tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2439 return tmp.diag (a);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2440 }
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_a = a.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2443
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2444 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
2445
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2446 tree_constant retval;
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 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2451 if (a_type == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2452 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2453 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2454 int n = ABS (k) + 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2455 if (k == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2456 retval = tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2457 else if (k > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2458 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2459 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2460 m.elem (0, k) = scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2461 retval = tree_constant (m);
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 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2464 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2465 Matrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2466 m.elem (-k, 0) = scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2467 retval = tree_constant (m);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2470 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2471 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2472 if (a_type == scalar_constant)
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 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2475 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2476 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2477 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2478 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2479 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2480 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2481 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2482 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2483 retval = make_diag (matrix_value (), k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2484 else
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 ColumnVector d = matrix->diag (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2487 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2488 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2491 ::error ("diag: invalid second argument");
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2494 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2495 if (a_type == scalar_constant)
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 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2498 int n = ABS (k) + 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2499 if (k == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2500 retval = tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2501 else if (k > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2502 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2503 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2504 m.elem (0, k) = *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2505 retval = tree_constant (m);
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 else if (k < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2508 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2509 ComplexMatrix m (n, n, 0.0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2510 m.elem (-k, 0) = *complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2511 retval = tree_constant (m);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2514 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2515 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2516 if (a_type == scalar_constant)
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 int k = NINT (tmp_a.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2519 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2520 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2521 if (nr == 0 || nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2522 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2523 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2524 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2525 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2526 else if (nr == 1 || nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2527 retval = make_diag (complex_matrix_value (), k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2528 else
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 ComplexColumnVector d = complex_matrix->diag (k);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2531 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2532 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2535 ::error ("diag: invalid second argument");
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2538 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2539 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2540 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2541 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2542 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2543 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2544 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2545 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2546 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2547
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2548 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2549 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
2550 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2551 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2552
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2553 if (type_tag == string_constant || type_tag == range_constant)
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 tmp = make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2556 return tmp.mapper (m_fcn, print);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2557 }
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 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2560 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2561 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2562 if (m_fcn.can_return_complex_for_real_arg
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2563 && (scalar < m_fcn.lower_limit
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2564 || scalar > m_fcn.upper_limit))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2565 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2566 if (m_fcn.c_c_mapper != NULL)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2567 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2568 Complex c = m_fcn.c_c_mapper (Complex (scalar));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2569 retval = tree_constant (c);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2570 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2571 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2572 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2573 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2574 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2575 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2576 if (m_fcn.d_d_mapper != NULL)
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 double d = m_fcn.d_d_mapper (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2579 retval = tree_constant (d);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2580 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2581 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2582 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2583 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2584 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2585 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2586 if (m_fcn.can_return_complex_for_real_arg
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2587 && (any_element_less_than (*matrix, m_fcn.lower_limit)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2588 || any_element_greater_than (*matrix, m_fcn.upper_limit)))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2589 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2590 if (m_fcn.c_c_mapper != NULL)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2591 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2592 ComplexMatrix cm = map (m_fcn.c_c_mapper,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2593 ComplexMatrix (*matrix));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2594 retval = tree_constant (cm);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2597 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2598 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2599 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2600 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2601 if (m_fcn.d_d_mapper != NULL)
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 Matrix m = map (m_fcn.d_d_mapper, *matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2604 retval = tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2605 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2606 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2607 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2608 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2609 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2610 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2611 if (m_fcn.d_c_mapper != NULL)
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 double d;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2614 d = m_fcn.d_c_mapper (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2615 retval = tree_constant (d);
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 else if (m_fcn.c_c_mapper != NULL)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2618 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2619 Complex c;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2620 c = m_fcn.c_c_mapper (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2621 retval = tree_constant (c);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2624 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2625 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2626 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2627 if (m_fcn.d_c_mapper != NULL)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2628 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2629 Matrix m;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2630 m = map (m_fcn.d_c_mapper, *complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2631 retval = tree_constant (m);
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 else if (m_fcn.c_c_mapper != NULL)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2634 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2635 ComplexMatrix cm;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2636 cm = map (m_fcn.c_c_mapper, *complex_matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2637 retval = tree_constant (cm);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2640 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2641 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2642 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2643 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2644 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2645 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2646 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2647 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2648 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2649 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2650 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2651
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 * Top-level tree-constant function that handles assignments. Only
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2654 * 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
2655 * hand off to other functions to do the real work.
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 void
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2658 tree_constant_rep::assign (tree_constant& rhs,
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2659 const Octave_object& args, int nargs)
492
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 tree_constant rhs_tmp = rhs.make_numeric ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2662
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2663 // This is easier than actually handling assignments to strings.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2664 // 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
2665 // vector since it will normally destroy the equally-spaced property
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2666 // of the range elements.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2667
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2668 if (type_tag == string_constant || type_tag == range_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2669 force_numeric ();
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 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2672 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2673 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2674 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2675 case unknown_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2676 do_scalar_assignment (rhs_tmp, args, nargs);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2677 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2678 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2679 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2680 do_matrix_assignment (rhs_tmp, args, nargs);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2681 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2682 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2683 ::error ("invalid assignment to string type");
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 range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2686 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2687 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2688 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2689 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2690 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2691 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2692
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 * Assignments to scalars. If resize_on_range_error is true,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2695 * this can convert the left-hand side to a matrix.
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2698 tree_constant_rep::do_scalar_assignment (tree_constant& rhs,
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2699 const Octave_object& args, int nargs)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2700 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2701 assert (type_tag == unknown_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2702 || type_tag == scalar_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2703 || type_tag == complex_scalar_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2704
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2705 if ((rhs.is_scalar_type () || rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2706 && valid_scalar_indices (args, nargs))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2707 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2708 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2709 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2710 if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2711 delete complex_scalar;
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 matrix = new Matrix (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2714 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2715 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2716 else if (type_tag == unknown_constant || type_tag == scalar_constant)
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 if (rhs.const_type () == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2719 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2720 scalar = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2721 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 else if (rhs.const_type () == complex_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 complex_scalar = new Complex (rhs.complex_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2726 type_tag = complex_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
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 ::error ("invalid assignment to scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2731 return;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2734 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2735 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2736 if (rhs.const_type () == scalar_constant)
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 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2739 scalar = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2740 type_tag = scalar_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2741 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2742 else if (rhs.const_type () == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2743 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2744 *complex_scalar = rhs.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2745 type_tag = complex_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
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 ::error ("invalid assignment to scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2750 return;
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 }
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 else if (user_pref.resize_on_range_error)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2755 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2756 tree_constant_rep::constant_type old_type_tag = type_tag;
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 if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2759 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2760 Complex *old_complex = complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2761 complex_matrix = new ComplexMatrix (1, 1, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2762 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2763 delete old_complex;
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 else if (type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2766 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2767 matrix = new Matrix (1, 1, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2768 type_tag = matrix_constant;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2771 // 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
2772 // 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
2773 // care of converting single element matrices back to scalars.
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 do_matrix_assignment (rhs, args, nargs);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2776
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2777 // 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
2778 // constant types, so here it is.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2779
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2780 if (old_type_tag == unknown_constant && error_state)
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 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2783 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2784 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2785 delete complex_matrix;
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 type_tag = unknown_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2788 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2789 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2790 else if (nargs > 3 || nargs < 2)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2791 ::error ("invalid index expression for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2792 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2793 ::error ("index invalid or out of range for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2794 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2795
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2796 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2797 * Assignments to matrices (and vectors).
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2798 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2799 * For compatibility with Matlab, we allow assignment of an empty
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2800 * matrix to an expression with empty indices to do nothing.
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2803 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2804 const Octave_object& args, int nargs)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2805 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2806 assert (type_tag == unknown_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2807 || type_tag == matrix_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2808 || type_tag == complex_matrix_constant);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2809
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2810 if (type_tag == matrix_constant && rhs.is_complex_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2811 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2812 Matrix *old_matrix = matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2813 complex_matrix = new ComplexMatrix (*matrix);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2814 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2815 delete old_matrix;
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 else if (type_tag == unknown_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2818 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2819 if (rhs.is_complex_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2820 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2821 complex_matrix = new ComplexMatrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2822 type_tag = complex_matrix_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 else
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 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2827 type_tag = 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 }
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 // 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
2832 // don't let any pass through here.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2833 switch (nargs)
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 case 2:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2836 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2837 ::error ("matrix index is null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2838 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2839 ::error ("matrix index is undefined");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2840 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2841 do_matrix_assignment (rhs, args(1));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2842 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2843 case 3:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2844 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2845 ::error ("matrix indices are null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2846 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2847 ::error ("first matrix index is undefined");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2848 else if (args(2).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2849 ::error ("second matrix index is undefined");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2850 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
2851 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2852 if (! rhs.is_empty ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2853 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2854 ::error ("in assignment expression, a matrix index is empty");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2855 ::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
2856 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2857 // 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
2858 // 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
2859 // work than it's worth right now...
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 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
2862 do_matrix_assignment (rhs, args(1), args(2));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2863 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2864 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2865 ::error ("too many indices for matrix expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2866 break;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2869
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2870 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2871 * Matrix assignments indexed by a single value.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2872 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2873 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2874 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2875 tree_constant& i_arg)
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2878 int nc = columns ();
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 if (user_pref.do_fortran_indexing || nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2881 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2882 if (i_arg.is_empty ())
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 if (! rhs.is_empty ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2885 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2886 ::error ("in assignment expression, matrix index is empty but");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2887 ::error ("right hand side is not an empty matrix");
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 // 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
2890 // 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
2891 // work than it's worth right now...
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 // 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
2894 // any pass through here.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2895 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2896 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2897
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2898 // 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
2899 // then, the two operations are not equivalent. For example, the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2900 // expression V(:) = M is handled differently depending on whether the
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2901 // user specified do_fortran_indexing = "true".
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2902
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2903 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2904 fortran_style_matrix_assignment (rhs, i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2905 else if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2906 vector_assignment (rhs, i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2907 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2908 panic_impossible ();
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2911 ::error ("single index only valid for row or column vector");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2912 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2913
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2914 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2915 * Fortran-style assignments. Matrices are assumed to be stored in
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2916 * 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
2917 * multi-dimensional matrices.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2918 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2919 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2920 tree_constant_rep::fortran_style_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2921 tree_constant& i_arg)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2922 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2923 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2924
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2925 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2926
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2927 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2928 int nc = columns ();
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 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2931 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2932
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2933 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2934 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2935 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2936 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2937 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2938 int i = NINT (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2939 int idx = i - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2940
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2941 if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2942 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2943 if (idx < nr * nc)
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 convert_to_row_or_column_vector ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2946
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2947 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2948 nc = columns ();
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 (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2951 delete_column (idx);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2952 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2953 delete_row (idx);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2954 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2955 panic_impossible ();
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 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2958 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2959
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2960 if (index_check (idx, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2961 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2962
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2963 if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2964 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2965 maybe_resize (idx);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2966 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2967 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2968 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2969 else if (range_max_check (idx, nr * nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2970 return;
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 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2973 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2974
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2975 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2976 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2977 ::error ("for A(int) = X: X must be a scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2978 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2979 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2980 int ii = fortran_row (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2981 int jj = fortran_column (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2982 do_matrix_assignment (rhs, ii, jj);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2985 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2986 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2987 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2988 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2989 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2990 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
2991 if (! ii)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2992 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2993
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2994 if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2995 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2996 ii.sort_uniq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2997 int num_to_delete = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2998 for (int i = 0; i < ii.length (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
2999 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3000 if (ii.elem (i) < len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3001 num_to_delete++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3002 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3003 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3004 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3005
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3006 if (num_to_delete > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3007 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3008 if (num_to_delete != ii.length ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3009 ii.shorten (num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3010
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3011 convert_to_row_or_column_vector ();
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 nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3014 nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3015
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3016 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3017 delete_columns (ii);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3018 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3019 delete_rows (ii);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3020 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3021 panic_impossible ();
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 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3024 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3025
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3026 if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3027 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3028 maybe_resize (ii.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3029 if (error_state)
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 else if (range_max_check (ii.max (), len) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3033 return;
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 int ilen = ii.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3036
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3037 if (ilen != rhs_nr * rhs_nc)
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 ::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
3040 ::error ("of elements");
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 else if (ilen == 1 && rhs.is_scalar_type ())
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3045 int idx = ii.elem (0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3046 int ii = fortran_row (idx + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3047 int jj = fortran_column (idx + 1, nr) - 1;
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 if (rhs.const_type () == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3050 matrix->elem (ii, jj) = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3051 else if (rhs.const_type () == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3052 complex_matrix->elem (ii, jj) = rhs.complex_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3053 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3054 panic_impossible ();
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3057 fortran_style_matrix_assignment (rhs, ii);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3058 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3059 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3060 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3061 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3062 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3063 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3064 gripe_range_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3065 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3066 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3067 // a(:) = [] is equivalent to a(:,:) = [].
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3068 if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3069 do_matrix_assignment (rhs, magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3070 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3071 fortran_style_matrix_assignment (rhs, magic_colon);
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 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3074 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3075 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3076 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3077 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3078
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3079 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3080 * Fortran-style assignment for vector index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3081 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3082 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3083 tree_constant_rep::fortran_style_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3084 idx_vector& i)
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 assert (rhs.is_matrix_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3087
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3088 int ilen = i.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3089
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3090 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
3091
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3092 int len = rhs_nr * rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3093
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3094 if (len == ilen)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3095 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3096 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3097 if (rhs.const_type () == matrix_constant)
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 double *cop_out = rhs_m.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3100 for (int k = 0; k < len; k++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3101 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3102 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3103 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3104
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3105 matrix->elem (ii, jj) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3106 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3107 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3108 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3109 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3110 Complex *cop_out = rhs_cm.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3111 for (int k = 0; k < len; k++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3112 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3113 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3114 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3115
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3116 complex_matrix->elem (ii, jj) = *cop_out++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3117 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3118 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3121 ::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
3122 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3123
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 * Fortran-style assignment for colon index.
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3128 tree_constant_rep::fortran_style_matrix_assignment
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3129 (tree_constant& rhs, tree_constant_rep::constant_type mci)
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 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
3132
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3133 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3134 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3135
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3136 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
3137
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3138 int rhs_size = rhs_nr * rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3139 if (rhs_size == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3140 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3141 if (rhs.const_type () == matrix_constant)
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 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3144 matrix = new Matrix (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3145 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3146 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3147 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3148 panic_impossible ();
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 else if (nr*nc != rhs_size)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3151 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3152 ::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
3153 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3154 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3155
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3156 if (rhs.const_type () == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3157 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3158 double *cop_out = rhs_m.fortran_vec ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3159 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3160 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3161 matrix->elem (i, j) = *cop_out++;
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 else
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 Complex *cop_out = rhs_cm.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 complex_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 }
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 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3173 * 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
3174 * 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
3175 * assignment to a matrix indexed by two colons.
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3178 tree_constant_rep::vector_assignment (tree_constant& rhs, tree_constant& i_arg)
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3181 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3182
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3183 assert ((nr == 1 || nc == 1 || (nr == 0 && nc == 0))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3184 && ! user_pref.do_fortran_indexing);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3185
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3186 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
3187
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3188 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3189
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3190 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3191 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3192 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3193 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3194 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3195 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3196 if (index_check (i, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3197 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3198 do_vector_assign (rhs, i);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3201 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3202 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3203 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3204 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3205 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3206 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3207 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3208 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3209
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3210 do_vector_assign (rhs, iv);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3213 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3214 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3215 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3216 case range_constant:
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 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3219 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3220 if (len == 2 && is_zero_one (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3221 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3222 do_vector_assign (rhs, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3223 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3224 else if (len == 2 && is_one_zero (ri))
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 do_vector_assign (rhs, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3227 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3228 else
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 if (index_check (ri, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3231 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3232 do_vector_assign (rhs, 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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3235 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3236 case magic_colon:
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 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3239 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3240
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3241 if (! indexed_assign_conforms (nr, nc, rhs_nr, rhs_nc))
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 ::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
3244 return;
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 do_matrix_assignment (rhs, magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3247 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3248 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3249 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3250 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3251 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3252 }
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
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 * Check whether an indexed assignment to a vector is valid.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3257 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3258 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3259 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
3260 int ilen, const char *rm)
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3263 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3264
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3265 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
3266 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3267 if (! (ilen == rhs_nr || ilen == rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3268 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3269 ::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
3270 rm, rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3271 }
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 else if (nr == 1) // Preserve current row 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 (! (rhs_nr == 1 && rhs_nc == ilen))
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: 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
3278 ::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
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 (nc == 1) // Preserve current column 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_nc == 1 && rhs_nr == 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 column vector, X must also be", rm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3286 ::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
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3290 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3291 }
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 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3294 * Assignment to a vector with an integer index.
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3297 tree_constant_rep::do_vector_assign (tree_constant& rhs, int i)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3298 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3299 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3300 int rhs_nc = rhs.columns ();
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 if (indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
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 maybe_resize (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3305 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3306 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3307
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3308 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3309 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3310
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3311 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3312 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3313 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
3314 rhs.is_real_type ());
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 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3317 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3318 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
3319 rhs.is_real_type ());
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3322 panic_impossible ();
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 (rhs_nr == 0 && rhs_nc == 0)
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3327 int nc = columns ();
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 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3330
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3331 if (i < 0 || i >= len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3332 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3333 ::error ("A(int) = []: index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3334 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3335 }
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 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3338 delete_column (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3339 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3340 delete_row (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3341 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3342 panic_impossible ();
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3345 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3346 ::error ("for A(int) = X: X must be a scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3347 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3348 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3349 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3350
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 * Assignment to a vector with a vector index.
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3355 tree_constant_rep::do_vector_assign (tree_constant& rhs, idx_vector& iv)
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 if (rhs.is_zero_by_zero ())
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3360 int nc = columns ();
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 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3363
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3364 if (iv.max () >= len)
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 ::error ("A(matrix) = []: index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3367 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3368 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3369
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3370 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3371 delete_columns (iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3372 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3373 delete_rows (iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3374 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3375 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3376 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3377 else if (rhs.is_scalar_type ())
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3380 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3381
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3382 if (iv.capacity () == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3383 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3384 int idx = iv.elem (0);
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 if (nr == 1)
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 REP_ELEM_ASSIGN (0, idx, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3389 rhs.complex_value (), rhs.is_real_type ());
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 else if (nc == 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 REP_ELEM_ASSIGN (idx, 0, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3394 rhs.complex_value (), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3395 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3396 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3397 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3398 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3399 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3400 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3401 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3402 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3403 ::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
3404 ::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
3405 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3406 else if (nc == 1)
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 ::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
3409 ::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
3410 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3411 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3412 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3413 }
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 (rhs.is_matrix_type ())
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 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
3418
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3419 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3420 check_vector_assign (rhs_nr, rhs_nc, ilen, "matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3421 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3422 return;
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 force_orient f_orient = no_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3425 if (rhs_nr == 1 && rhs_nc != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3426 f_orient = row_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3427 else if (rhs_nc == 1 && rhs_nr != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3428 f_orient = column_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3429
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3430 maybe_resize (iv.max (), f_orient);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3431 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3432 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3433
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3434 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3435 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3436
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3437 if (nr == 1)
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 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3440 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
3441 rhs_cm.elem (0, i), rhs.is_real_type ());
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 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3444 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3445 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3446 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
3447 rhs_cm.elem (i, 0), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3448 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3449 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3450 panic_impossible ();
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3453 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3454 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3455
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3456 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3457 * Assignment to a vector with a range index.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3458 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3459 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3460 tree_constant_rep::do_vector_assign (tree_constant& rhs, Range& ri)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3461 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3462 if (rhs.is_zero_by_zero ())
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3465 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3466
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3467 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3468
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3469 int b = tree_to_mat_idx (ri.min ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3470 int l = tree_to_mat_idx (ri.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3471 if (b < 0 || l >= len)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3472 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3473 ::error ("A(range) = []: index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3474 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3475 }
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 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3478 delete_columns (ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3479 else if (nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3480 delete_rows (ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3481 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3482 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3483 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3484 else if (rhs.is_scalar_type ())
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3487 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3488
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3489 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3490 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3491 ::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
3492 ::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
3493 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3494 else if (nc == 1)
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 ::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
3497 ::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
3498 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3499 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3500 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3501 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3502 else if (rhs.is_matrix_type ())
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 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
3505
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3506 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3507 check_vector_assign (rhs_nr, rhs_nc, ilen, "range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3508 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3509 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3510
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3511 force_orient f_orient = no_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3512 if (rhs_nr == 1 && rhs_nc != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3513 f_orient = row_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3514 else if (rhs_nc == 1 && rhs_nr != 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3515 f_orient = column_orient;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3516
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3517 maybe_resize (tree_to_mat_idx (ri.max ()), f_orient);
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3522 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3523
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3524 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3525 double increment = ri.inc ();
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 if (nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3528 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3529 for (int i = 0; i < ri.nelem (); i++)
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 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3532 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3533 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
3534 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3535 }
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 else if (nc == 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 row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3543 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
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3548 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3549 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3550 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3551 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3552 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3553
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3554 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3555 * Matrix assignment indexed by two values. This function determines
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3556 * 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
3557 * 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
3558 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3559 * M (integer, arg2) = RHS (MA1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3560 * M (vector, arg2) = RHS (MA2)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3561 * M (range, arg2) = RHS (MA3)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3562 * M (colon, arg2) = RHS (MA4)
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 * 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
3565 * 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
3566 * assignment.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3567 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3568 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3569 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3570 tree_constant& i_arg,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3571 tree_constant& j_arg)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3572 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3573 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
3574
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3575 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3576
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3577 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3578 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3579 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3580 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3581 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3582 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3583 if (index_check (i, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3584 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3585 do_matrix_assignment (rhs, i, j_arg);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3588 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3589 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3590 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3591 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3592 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
3593 if (! iv)
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3596 do_matrix_assignment (rhs, iv, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3597 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3598 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3599 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3600 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3601 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3602 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3603 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3604 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3605 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3606 if (nr == 2 && is_zero_one (ri))
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 do_matrix_assignment (rhs, 1, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3609 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3610 else if (nr == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3611 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3612 do_matrix_assignment (rhs, 0, j_arg);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3615 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3616 if (index_check (ri, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3617 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3618 do_matrix_assignment (rhs, ri, 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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3621 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3622 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3623 do_matrix_assignment (rhs, magic_colon, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3624 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3625 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3626 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3627 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3628 }
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 /* MA1 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3632 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3633 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, int i,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3634 tree_constant& j_arg)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3635 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3636 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
3637
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3638 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
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 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3641 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3642
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3643 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3644 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3645 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3646 case scalar_constant:
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 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3649 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3650 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3651 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
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 ::error ("A(int,int) = X, X must be a scalar");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3654 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3655 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3656 maybe_resize (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3657 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3658 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3659
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3660 do_matrix_assignment (rhs, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3661 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3662 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3663 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3664 case matrix_constant:
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 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3667 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3668 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3669 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3670 return;
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 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
3673 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3674 ::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
3675 ::error ("number of elements as matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3676 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3677 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3678 maybe_resize (i, jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3679 if (error_state)
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 do_matrix_assignment (rhs, i, jv);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3685 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3686 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3687 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3688 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3689 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3690 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3691 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
3692 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3693 ::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
3694 ::error ("number of elements as range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3695 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3696 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3697
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3698 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3699 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3700 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3701 do_matrix_assignment (rhs, i, 1);
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 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
3704 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3705 do_matrix_assignment (rhs, i, 0);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3708 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3709 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3710 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3711 maybe_resize (i, tree_to_mat_idx (rj.max ()));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3712 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3713 return;
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, rj);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3718 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3719 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3720 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3721 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3722 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3723 if (nc == 0 && nr == 0 && rhs_nr == 1)
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 if (rhs.is_complex_type ())
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 complex_matrix = new ComplexMatrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3728 type_tag = complex_matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3729 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3730 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3731 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3732 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3733 type_tag = matrix_constant;
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 maybe_resize (i, rhs_nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3736 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3737 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3738 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3739 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
3740 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3741 maybe_resize (i, nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3742 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3743 return;
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 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3746 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3747 if (i < 0 || i >= nr)
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 ::error ("A(int,:) = []: row index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3750 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3751 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3752 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3753 else
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 ::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
3756 ::error ("number of columns as A");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3757 return;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3760 do_matrix_assignment (rhs, i, magic_colon);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3763 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3764 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3765 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3766 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3767 }
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 /* MA2 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3770 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3771 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3772 tree_constant& j_arg)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3773 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3774 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
3775
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3776 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
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 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3779 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3780
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3781 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3782 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3783 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3784 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3785 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3786 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3787 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3788 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3789 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
3790 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3791 ::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
3792 ::error ("same number of elements as matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3793 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3794 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3795 maybe_resize (iv.max (), j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3796 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3797 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3798
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3799 do_matrix_assignment (rhs, iv, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3800 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3801 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3802 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3803 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3804 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3805 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3806 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3807 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3808 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3809 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3810
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3811 if (! indexed_assign_conforms (iv.capacity (), jv.capacity (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3812 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3813 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3814 ::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
3815 ::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
3816 ::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
3817 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3818 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3819 maybe_resize (iv.max (), jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3820 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3821 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3822
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3823 do_matrix_assignment (rhs, iv, jv);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3826 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3827 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3828 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3829 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3830 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3831 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3832 if (! indexed_assign_conforms (iv.capacity (), rj.nelem (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3833 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3834 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3835 ::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
3836 ::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
3837 ::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
3838 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3839 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3840
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3841 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3842 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3843 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3844 do_matrix_assignment (rhs, iv, 1);
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 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
3847 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3848 do_matrix_assignment (rhs, iv, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3849 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3850 else
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 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3853 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3854 maybe_resize (iv.max (), tree_to_mat_idx (rj.max ()));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3855 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3856 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3857
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3858 do_matrix_assignment (rhs, iv, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3859 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3862 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3863 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3864 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3865 int new_nc = nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3866 if (nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3867 new_nc = rhs_nc;
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 if (indexed_assign_conforms (iv.capacity (), new_nc,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3870 rhs_nr, rhs_nc))
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 maybe_resize (iv.max (), new_nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3873 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3874 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3875 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3876 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3877 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3878 if (iv.max () >= rows ())
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 ::error ("A(matrix,:) = []: row index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3881 return;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3884 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3885 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3886 ::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
3887 ::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
3888 ::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
3889 return;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3892 do_matrix_assignment (rhs, iv, magic_colon);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3895 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3896 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3897 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3898 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3899 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3900
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3901 /* MA3 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3902 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3903 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3904 Range& ri, tree_constant& j_arg)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3905 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3906 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
3907
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3908 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
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 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3911 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3912
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3913 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3914 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3915 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3916 case scalar_constant:
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 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3919 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3920 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3921 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
3922 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3923 ::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
3924 ::error ("same number of elements as range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3925 return;
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 maybe_resize (tree_to_mat_idx (ri.max ()), j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3928 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3929 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3930
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3931 do_matrix_assignment (rhs, ri, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3932 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3933 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3934 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3935 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3936 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3937 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3938 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3939 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3940 if (! jv)
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 if (! indexed_assign_conforms (ri.nelem (), jv.capacity (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3944 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3945 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3946 ::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
3947 ::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
3948 ::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
3949 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3950 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3951 maybe_resize (tree_to_mat_idx (ri.max ()), jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3952 if (error_state)
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 do_matrix_assignment (rhs, ri, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3956 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3957 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3958 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3959 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3960 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3961 case range_constant:
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 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3964 if (! indexed_assign_conforms (ri.nelem (), rj.nelem (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3965 rhs_nr, rhs_nc))
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 ::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
3968 ::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
3969 ::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
3970 ::error ("c_range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3971 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3972 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3973
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3974 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3975 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3976 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3977 do_matrix_assignment (rhs, ri, 1);
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 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
3980 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3981 do_matrix_assignment (rhs, ri, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3982 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3983 else
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 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3986 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3987
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3988 maybe_resize (tree_to_mat_idx (ri.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3989 tree_to_mat_idx (rj.max ()));
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 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3992 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3993
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3994 do_matrix_assignment (rhs, ri, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3995 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
3998 case magic_colon:
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 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4001 int new_nc = nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4002 if (nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4003 new_nc = rhs_nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4004
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4005 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
4006 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4007 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
4008 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4009 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4010 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4011 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4012 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4013 int b = tree_to_mat_idx (ri.min ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4014 int l = tree_to_mat_idx (ri.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4015 if (b < 0 || l >= rows ())
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 ::error ("A(range,:) = []: row index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4018 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4019 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4020 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4021 else
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 ::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
4024 ::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
4025 ::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
4026 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4027 }
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 do_matrix_assignment (rhs, ri, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4030 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4031 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4032 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4033 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4034 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4035 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4036 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4037
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4038 /* MA4 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4039 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4040 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4041 tree_constant_rep::constant_type i,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4042 tree_constant& j_arg)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4043 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4044 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
4045
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4046 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
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 int rhs_nr = rhs.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4049 int rhs_nc = rhs.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4050
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4051 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4052 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4053 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4054 case scalar_constant:
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 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4057 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4058 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4059 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4060 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4061 if (nr == 0 && nc == 0 && rhs_nc == 1)
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 if (rhs.is_complex_type ())
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 complex_matrix = new ComplexMatrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4066 type_tag = complex_matrix_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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4069 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4070 matrix = new Matrix ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4071 type_tag = matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4072 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4073 maybe_resize (rhs_nr-1, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4074 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4075 return;
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 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
4078 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4079 maybe_resize (nr-1, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4080 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4081 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4082 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4083 else if (rhs_nr == 0 && rhs_nc == 0)
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 if (j < 0 || j >= nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4086 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4087 ::error ("A(:,int) = []: column index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4088 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4089 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4092 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4093 ::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
4094 ::error ("number of rows as A");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4095 return;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4098 do_matrix_assignment (rhs, magic_colon, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4099 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4100 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4101 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4102 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4103 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4104 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4105 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4106 columns ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4107 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4108 return;
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4111 int new_nr = nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4112 if (nr == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4113 new_nr = rhs_nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4114
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4115 if (indexed_assign_conforms (new_nr, jv.capacity (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4116 rhs_nr, rhs_nc))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4117 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4118 maybe_resize (new_nr-1, jv.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4119 if (error_state)
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 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4123 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4124 if (jv.max () >= columns ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4125 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4126 ::error ("A(:,matrix) = []: column index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4127 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4128 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4131 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4132 ::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
4133 ::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
4134 ::error ("match the number of elements in matrix");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4135 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4136 }
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 do_matrix_assignment (rhs, magic_colon, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4139 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4140 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4141 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4142 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4143 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4144 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4145 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4146 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4147 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4148 int new_nr = nr;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4149 if (nr == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4150 new_nr = rhs_nr;
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 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
4153 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4154 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4155 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4156 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4157 do_matrix_assignment (rhs, magic_colon, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4158 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4159 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
4160 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4161 do_matrix_assignment (rhs, magic_colon, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4162 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4163 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4164 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4165 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4166 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4167 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
4168 if (error_state)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4169 return;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4172 else if (rhs_nr == 0 && rhs_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4173 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4174 int b = tree_to_mat_idx (rj.min ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4175 int l = tree_to_mat_idx (rj.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4176 if (b < 0 || l >= columns ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4177 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4178 ::error ("A(:,range) = []: column index out of range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4179 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4180 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4181 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4182 else
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 ::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
4185 ::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
4186 ::error ("must match the number of elements in range");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4187 return;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4188 }
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 do_matrix_assignment (rhs, magic_colon, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4191 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4192 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4193 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4194 // a(:,:) = foo is equivalent to a = foo.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4195 do_matrix_assignment (rhs, magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4196 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4197 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4198 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4199 break;
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
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 * Functions that actually handle assignment to a matrix using two
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4205 * index values.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4206 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4207 * idx2
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4208 * +---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4209 * idx1 | i | v | r | c |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4210 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4211 * integer | 1 | 5 | 9 | 13 |
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 * vector | 2 | 6 | 10 | 14 |
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 * range | 3 | 7 | 11 | 15 |
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4216 * ---------+---+---+----+----+
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4217 * colon | 4 | 8 | 12 | 16 |
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 */
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 /* 1 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4222 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4223 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, int i, int j)
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 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
4226 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4227 }
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 /* 2 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4230 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4231 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, int i,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4232 idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4233 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4234 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
4235
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4236 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4237 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
4238 rhs_cm.elem (0, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4239 }
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 /* 3 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4242 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4243 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, int i, Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4244 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4245 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
4246
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4247 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4248 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4249
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4250 for (int j = 0; j < rj.nelem (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4251 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4252 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4253 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4254 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
4255 rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4256 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4257 }
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 /* 4 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4260 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4261 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, int i,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4262 tree_constant_rep::constant_type mcj)
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 assert (mcj == magic_colon);
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 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4267
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4268 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4269 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4270 delete_row (i);
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 else if (rhs.is_matrix_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4273 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4274 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
4275
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4276 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4277 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
4278 rhs.is_real_type ());
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 else if (rhs.is_scalar_type () && nc == 1)
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 REP_ELEM_ASSIGN (i, 0, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4283 rhs.complex_value (), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4284 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4285 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4286 panic_impossible ();
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4289 /* 5 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4290 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4291 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4292 idx_vector& iv, int j)
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 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
4295
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4296 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4297 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4298 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4299 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4300 rhs_cm.elem (i, 0), rhs.is_real_type ());
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4304 /* 6 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4305 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4306 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4307 idx_vector& iv, idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4308 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4309 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
4310
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4311 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4312 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4313 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4314 for (int j = 0; j < jv.capacity (); j++)
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 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4317 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4318 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4319 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4320 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4321 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4322
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4323 /* 7 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4324 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4325 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4326 idx_vector& iv, Range& rj)
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 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
4329
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4330 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4331 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4332
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4333 for (int i = 0; i < iv.capacity (); i++)
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 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4336 for (int j = 0; j < rj.nelem (); j++)
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 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4339 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4340 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4341 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4342 }
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 }
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 /* 8 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4347 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4348 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4349 tree_constant_rep::constant_type mcj)
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 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4352
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4353 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4354 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4355 delete_rows (iv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4356 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4357 else
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 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
4360
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4361 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4362
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4363 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4364 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4365 for (int i = 0; i < iv.capacity (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4366 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4367 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4368 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4369 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4370 }
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 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4375 /* 9 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4376 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4377 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, Range& ri, int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4378 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4379 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
4380
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4381 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4382 double increment = ri.inc ();
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 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4385 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4386 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4387 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4388 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4389 rhs_cm.elem (i, 0), rhs.is_real_type ());
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4393 /* 10 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4394 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4395 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, Range& ri,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4396 idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4397 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4398 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
4399
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4400 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4401 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4402
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4403 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4404 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4405 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4406 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4407 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4408 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4409 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4410 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4411 rhs_m.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4412 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4413 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4414 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4415
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4416 /* 11 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4417 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4418 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, Range& ri,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4419 Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4420 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4421 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4422 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4423 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4424 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4425
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4426 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
4427
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4428 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4429 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4430 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4431 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4432 for (int j = 0; j < rj.nelem (); j++)
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 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4435 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4436 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4437 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4438 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4439 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4442 /* 12 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4443 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4444 tree_constant_rep::do_matrix_assignment (tree_constant& rhs, Range& ri,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4445 tree_constant_rep::constant_type mcj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4446 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4447 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4448
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4449 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4450 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4451 delete_rows (ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4452 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4453 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4454 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4455 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
4456
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4457 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4458 double iinc = ri.inc ();
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 int nc = columns ();
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 for (int i = 0; i < ri.nelem (); i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4463 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4464 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4465 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4466 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4467 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4468 rhs_cm.elem (i, j), rhs.is_real_type ());
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 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4473 /* 13 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4474 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4475 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4476 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4477 int j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4478 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4479 assert (mci == magic_colon);
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 nr = rows ();
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 if (rhs.is_zero_by_zero ())
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 delete_column (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4486 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4487 else if (rhs.is_matrix_type ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4488 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4489 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
4490
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4491 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4492 REP_ELEM_ASSIGN (i, j, rhs_m.elem (i, 0),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4493 rhs_cm.elem (i, 0), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4494 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4495 else if (rhs.is_scalar_type () && nr == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4496 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4497 REP_ELEM_ASSIGN (0, j, rhs.double_value (),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4498 rhs.complex_value (), rhs.is_real_type ());
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4501 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4502 }
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 /* 14 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4505 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4506 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4507 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4508 idx_vector& jv)
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 assert (mci == magic_colon);
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 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4513 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4514 delete_columns (jv);
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
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_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
4519
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4520 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4521
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4522 for (int i = 0; i < nr; i++)
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 for (int j = 0; j < jv.capacity (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4525 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4526 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4527 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4528 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4529 }
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 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4534 /* 15 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4535 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4536 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4537 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4538 Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4539 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4540 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4541
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4542 if (rhs.is_zero_by_zero ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4543 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4544 delete_columns (rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4545 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4546 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4547 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4548 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
4549
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4550 int nr = rows ();
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 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4553 double jinc = rj.inc ();
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 for (int j = 0; j < rj.nelem (); j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4556 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4557 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4558 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4559 for (int i = 0; i < nr; i++)
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 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4562 rhs_cm.elem (i, j), rhs.is_real_type ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4563 }
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 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4568 /* 16 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4569 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4570 tree_constant_rep::do_matrix_assignment (tree_constant& rhs,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4571 tree_constant_rep::constant_type mci,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4572 tree_constant_rep::constant_type mcj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4573 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4574 assert (mci == magic_colon && mcj == magic_colon);
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 switch (type_tag)
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 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4579 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4580 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4581 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4582 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4583 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4584 delete complex_scalar;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4585 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4586 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4587 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4588 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4589 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4590 delete [] string;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4591 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4592 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4593 delete range;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4594 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4595 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4596 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4597 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4598 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4599 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4600
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4601 type_tag = rhs.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4602
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4603 switch (type_tag)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4604 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4605 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4606 scalar = rhs.double_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4607 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4608 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4609 matrix = new Matrix (rhs.matrix_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4610 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4611 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4612 string = strsave (rhs.string_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4613 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4614 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4615 complex_matrix = new ComplexMatrix (rhs.complex_matrix_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4616 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4617 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4618 complex_scalar = new Complex (rhs.complex_value ());
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 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4621 range = new Range (rhs.range_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4622 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4623 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4624 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4625 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4626 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4627 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4628 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4629
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4630 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4631 * 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
4632 * to handle statements like
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4633 *
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4634 * M (i, j) = []
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4635 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4636 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4637 tree_constant_rep::delete_row (int idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4638 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4639 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4640 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4641 int nr = matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4642 int nc = matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4643 Matrix *new_matrix = new Matrix (nr-1, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4644 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4645 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4646 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4647 if (i != idx)
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 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4650 new_matrix->elem (ii, j) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4651 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4652 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4653 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4654 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4655 matrix = new_matrix;
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 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4658 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4659 int nr = complex_matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4660 int nc = complex_matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4661 ComplexMatrix *new_matrix = new ComplexMatrix (nr-1, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4662 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4663 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4664 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4665 if (i != idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4666 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4667 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4668 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4669 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4670 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4671 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4672 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4673 complex_matrix = new_matrix;
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4676 panic_impossible ();
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4679 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4680 tree_constant_rep::delete_rows (idx_vector& iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4681 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4682 iv.sort_uniq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4683 int num_to_delete = iv.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4684
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4685 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4686 int nc = columns ();
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 // 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
4689 if (nc == 1 && num_to_delete == nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4690 nc = 0;
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 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4693 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4694 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4695 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4696 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4697 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4698 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4699 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4700 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4701 if (i == iv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4702 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4703 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4704 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4705 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4706 new_matrix->elem (ii, j) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4707 ii++;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4710 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4711 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4712 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4713 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4714 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4715 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4716 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4717 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4718 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4719 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4720 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4721 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4722 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4723 if (i == iv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4724 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4725 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4726 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4727 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4728 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4729 ii++;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4733 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4734 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4735 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4736 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4737 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4738 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4741 tree_constant_rep::delete_rows (Range& ri)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4742 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4743 ri.sort ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4744 int num_to_delete = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4745
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4746 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4747 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4748
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4749 // 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
4750 if (nc == 1 && num_to_delete == nr)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4751 nc = 0;
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 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4754 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4755
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4756 int max_idx = tree_to_mat_idx (ri.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4757
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4758 if (type_tag == matrix_constant)
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 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4761 if (nr > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4762 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4763 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4764 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4765 for (int i = 0; i < nr; i++)
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 double itmp = ib + idx * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4768 int row = tree_to_mat_idx (itmp);
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 (i == row && row <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4771 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4772 else
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 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4775 new_matrix->elem (ii, j) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4776 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4777 }
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4780 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4781 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4782 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4783 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4784 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4785 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4786 if (nr > num_to_delete)
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 int ii = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4789 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4790 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4791 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4792 double itmp = ib + idx * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4793 int row = tree_to_mat_idx (itmp);
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 if (i == row && row <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4796 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4797 else
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 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4800 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4801 ii++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4802 }
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4805 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4806 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4807 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4808 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4809 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4810 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4811
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4812 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4813 tree_constant_rep::delete_column (int idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4814 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4815 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4816 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4817 int nr = matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4818 int nc = matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4819 Matrix *new_matrix = new Matrix (nr, nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4820 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4821 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4822 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4823 if (j != idx)
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 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4826 new_matrix->elem (i, jj) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4827 jj++;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4830 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4831 matrix = new_matrix;
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 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4834 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4835 int nr = complex_matrix->rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4836 int nc = complex_matrix->columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4837 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4838 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4839 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4840 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4841 if (j != idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4842 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4843 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4844 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4845 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4846 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4847 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4848 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4849 complex_matrix = new_matrix;
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4852 panic_impossible ();
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4855 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4856 tree_constant_rep::delete_columns (idx_vector& jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4857 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4858 jv.sort_uniq ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4859 int num_to_delete = jv.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4860
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4861 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4862 int nc = columns ();
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 // 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
4865 if (nr == 1 && num_to_delete == nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4866 nr = 0;
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 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4869 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4870 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4871 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4872 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4873 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4874 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4875 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4876 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4877 if (j == jv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4878 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4879 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4880 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4881 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4882 new_matrix->elem (i, jj) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4883 jj++;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4886 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4887 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4888 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4889 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4890 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4891 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4892 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4893 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4894 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4895 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4896 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4897 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4898 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4899 if (j == jv.elem (idx))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4900 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4901 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4902 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4903 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4904 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4905 jj++;
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4909 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4910 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4911 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4912 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4913 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4914 }
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 void
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4917 tree_constant_rep::delete_columns (Range& rj)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4918 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4919 rj.sort ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4920 int num_to_delete = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4921
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4922 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4923 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4924
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4925 // 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
4926 if (nr == 1 && num_to_delete == nc)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4927 nr = 0;
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 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4930 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4931
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4932 int max_idx = tree_to_mat_idx (rj.max ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4933
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4934 if (type_tag == matrix_constant)
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 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4937 if (nc > num_to_delete)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4938 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4939 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4940 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4941 for (int j = 0; j < nc; j++)
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 double jtmp = jb + idx * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4944 int col = tree_to_mat_idx (jtmp);
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 (j == col && col <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4947 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4948 else
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 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4951 new_matrix->elem (i, jj) = matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4952 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4953 }
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4956 delete matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4957 matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4958 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4959 else if (type_tag == complex_matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4960 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4961 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4962 if (nc > num_to_delete)
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 int jj = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4965 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4966 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4967 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4968 double jtmp = jb + idx * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4969 int col = tree_to_mat_idx (jtmp);
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 if (j == col && col <= max_idx)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4972 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4973 else
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 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4976 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4977 jj++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4978 }
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4981 delete complex_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4982 complex_matrix = new_matrix;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4983 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4984 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4985 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4986 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4987
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 * Indexing functions.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4990 */
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4991 int
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4992 tree_constant_rep::valid_as_scalar_index (void) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4993 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4994 int valid = type_tag == magic_colon
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4995 || (type_tag == scalar_constant && NINT (scalar) == 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4996 || (type_tag == range_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4997 && range->nelem () == 1 && NINT (range->base ()) == 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4998
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
4999 return valid;
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 tree_constant
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5003 tree_constant_rep::do_scalar_index (const Octave_object& args,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5004 int nargs) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5005 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5006 if (valid_scalar_indices (args, nargs))
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 if (type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5009 return tree_constant (scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5010 else if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5011 return tree_constant (*complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5012 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5013 panic_impossible ();
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5016 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5017 int rows = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5018 int cols = 0;
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 switch (nargs)
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 case 3:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5023 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5024 if (args(2).is_matrix_type ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5025 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5026 Matrix mj = args(2).matrix_value ();
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 idx_vector j (mj, user_pref.do_fortran_indexing, "");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5029 if (! j)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5030 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5031
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5032 int len = j.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5033 if (len == j.ones_count ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5034 cols = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5035 }
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5036 else if (args(2).const_type () == magic_colon
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5037 || (args(2).is_scalar_type ()
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5038 && NINT (args(2).double_value ()) == 1))
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5039 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5040 cols = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5041 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5042 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5043 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5044 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5045 // Fall through...
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5046 case 2:
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 if (args(1).is_matrix_type ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5049 {
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5050 Matrix mi = args(1).matrix_value ();
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5051
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5052 idx_vector i (mi, user_pref.do_fortran_indexing, "");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5053 if (! i)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5054 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5055
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5056 int len = i.length ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5057 if (len == i.ones_count ())
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5058 rows = len;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5059 }
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5060 else if (args(1).const_type () == magic_colon
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5061 || (args(1).is_scalar_type ()
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5062 && NINT (args(1).double_value ()) == 1))
492
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 rows = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5065 }
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5066 else if (args(1).is_scalar_type ()
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5067 && NINT (args(1).double_value ()) == 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5068 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5069 Matrix m (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5070 return tree_constant (m);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5071 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5072 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5073 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5074
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5075 if (cols == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5076 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5077 if (user_pref.prefer_column_vectors)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5078 cols = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5079 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5080 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5081 cols = rows;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5082 rows = 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5083 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5084 }
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 if (type_tag == scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5087 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5088 Matrix m (rows, cols, scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5089 return tree_constant (m);
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 else if (type_tag == complex_scalar_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5092 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5093 ComplexMatrix cm (rows, cols, *complex_scalar);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5094 return tree_constant (cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5095 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5096 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5097 panic_impossible ();
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5100 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5101 ::error ("illegal number of arguments for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5102 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5103 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5104 }
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 ::error ("index invalid or out of range for scalar type");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5108 return tree_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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5111 tree_constant
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5112 tree_constant_rep::do_matrix_index (const Octave_object& args,
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5113 int nargin) const
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5116
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5117 switch (nargin)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5118 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5119 case 2:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5120 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5121 ::error ("matrix index is null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5122 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5123 ::error ("matrix index is a null expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5124 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5125 retval = do_matrix_index (args(1));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5126 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5127 case 3:
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5128 if (args.length () <= 0)
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5129 ::error ("matrix indices are null");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5130 else if (args(1).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5131 ::error ("first matrix index is a null expression");
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5132 else if (args(2).is_undefined ())
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5133 ::error ("second matrix index is a null expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5134 else
500
5f91088cb98e [project @ 1994-07-08 02:16:02 by jwe]
jwe
parents: 492
diff changeset
5135 retval = do_matrix_index (args(1), args(2));
492
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5136 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5137 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5138 ::error ("too many indices for matrix expression");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5139 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5140 }
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 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5143 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5144
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5145 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5146 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
5147 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5148 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5149
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5150 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5151 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5152
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5153 if (user_pref.do_fortran_indexing)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5154 retval = fortran_style_matrix_index (i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5155 else if (nr <= 1 || nc <= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5156 retval = do_vector_index (i_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5157 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5158 ::error ("single index only valid for row or column vector");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5159
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5160 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5161 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5162
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5163 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5164 tree_constant_rep::fortran_style_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5165 (const tree_constant& i_arg) const
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5168
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5169 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
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_rep::constant_type itype = tmp_i.const_type ();
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 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5177 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5178 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5179 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5180 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5181 int i = NINT (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5182 int ii = fortran_row (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5183 int jj = fortran_column (i, nr) - 1;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5184 if (index_check (i-1, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5185 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5186 if (range_max_check (i-1, nr * nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5187 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5188 retval = do_matrix_index (ii, jj);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5191 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5192 case matrix_constant:
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 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5195 if (mi.rows () == 0 || mi.columns () == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5196 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5197 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5198 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5199 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5200 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5201 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5202 // Yes, we really do want to call this with mi.
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5203 retval = fortran_style_matrix_index (mi);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5204 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5205 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5206 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5207 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5208 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5209 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5210 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5211 gripe_range_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5212 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5213 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5214 retval = do_matrix_index (magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5215 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5216 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5217 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5218 break;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5221 return retval;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5224 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5225 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
5226 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5227 assert (is_matrix_type ());
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 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5230
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5231 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5232 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5233
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5234 int len = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5235
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5236 int index_nr = mi.rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5237 int index_nc = mi.columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5238
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5239 if (index_nr >= 1 && index_nc >= 1)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5240 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5241 const double *cop_out = (const double *) NULL;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5242 const Complex *c_cop_out = (const Complex *) NULL;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5243 int real_type = type_tag == matrix_constant;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5244 if (real_type)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5245 cop_out = matrix->data ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5246 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5247 c_cop_out = complex_matrix->data ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5248
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5249 const double *cop_out_index = mi.data ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5250
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5251 idx_vector iv (mi, 1, "", len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5252 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5253 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5254
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5255 int result_size = iv.length ();
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 if (nc == 1 || (nr != 1 && iv.one_zero_only ()))
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 CRMATRIX (m, cm, result_size, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5260
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5261 for (int i = 0; i < result_size; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5262 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5263 int idx = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5264 CRMATRIX_ASSIGN_ELEM (m, cm, i, 0, cop_out [idx],
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5265 c_cop_out [idx], real_type);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5266 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5267
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5268 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5269 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5270 else if (nr == 1)
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 CRMATRIX (m, cm, 1, result_size);
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 for (int i = 0; i < result_size; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5275 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5276 int idx = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5277 CRMATRIX_ASSIGN_ELEM (m, cm, 0, i, cop_out [idx],
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5278 c_cop_out [idx], real_type);
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5281 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5282 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5283 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5284 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5285 CRMATRIX (m, cm, index_nr, index_nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5286
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5287 for (int j = 0; j < index_nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5288 for (int i = 0; i < index_nr; i++)
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 double tmp = *cop_out_index++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5291 int idx = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5292 CRMATRIX_ASSIGN_ELEM (m, cm, i, j, cop_out [idx],
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5293 c_cop_out [idx], real_type);
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5296 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5297 }
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5300 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5301 if (index_nr == 0 || index_nc == 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5302 ::error ("empty matrix invalid as index");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5303 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5304 ::error ("invalid matrix index");
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5305 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5306 }
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 return retval;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5311 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5312 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
5313 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5314 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5315
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5316 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
5317
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5318 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5319
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5320 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5321 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5322
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5323 int len = MAX (nr, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5324
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5325 assert ((nr == 1 || nc == 1) && ! user_pref.do_fortran_indexing);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5326
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5327 int swap_indices = (nr == 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5328
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5329 switch (itype)
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 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5332 case scalar_constant:
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 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5335 if (index_check (i, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5336 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5337 if (swap_indices)
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 if (range_max_check (i, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5340 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5341 retval = do_matrix_index (0, i);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5344 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5345 if (range_max_check (i, nr) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5346 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5347 retval = do_matrix_index (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5348 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5351 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5352 case matrix_constant:
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 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5355 if (mi.rows () == 0 || mi.columns () == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5358 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5359 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5360 else
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 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5363 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5364 return tree_constant ();
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 if (swap_indices)
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 (iv.max (), nc) < 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 (0, iv);
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 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5373 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5374 if (range_max_check (iv.max (), nr) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5375 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5376 retval = do_matrix_index (iv, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5377 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5378 }
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5381 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5382 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5383 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5384 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5385 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5386 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5387 if (len == 2 && is_zero_one (ri))
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 retval = do_matrix_index (0, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5391 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5392 retval = do_matrix_index (1, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5393 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5394 else if (len == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5395 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5396 retval = do_matrix_index (0, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5397 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5398 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5399 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5400 if (index_check (ri, "") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5401 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5402 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5403 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5404 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
5405 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5406 retval = do_matrix_index (0, ri);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5407 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5408 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5409 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5410 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
5411 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5412 retval = do_matrix_index (ri, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5413 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5414 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5415 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5416 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5417 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5418 if (swap_indices)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5419 retval = do_matrix_index (0, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5420 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5421 retval = do_matrix_index (magic_colon, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5422 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5423 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5424 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5425 break;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5428 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5429 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5432 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
5433 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5434 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5435 tree_constant retval;
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 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
5438
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5439 tree_constant_rep::constant_type itype = tmp_i.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5440
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5441 switch (itype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5442 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5443 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5444 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5445 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5446 int i = tree_to_mat_idx (tmp_i.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5447 if (index_check (i, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5448 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5449 retval = do_matrix_index (i, j_arg);
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 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5452 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5453 case matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5454 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5455 Matrix mi = tmp_i.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5456 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
5457 if (! iv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5458 return tree_constant ();
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 if (iv.length () == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5463 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5464 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5465 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5466 retval = do_matrix_index (iv, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5467 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5468 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5469 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5470 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5471 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5472 case range_constant:
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 Range ri = tmp_i.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5475 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5476 if (nr == 2 && is_zero_one (ri))
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 retval = do_matrix_index (1, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5479 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5480 else if (nr == 2 && is_one_zero (ri))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5481 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5482 retval = do_matrix_index (0, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5483 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5484 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5485 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5486 if (index_check (ri, "row") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5487 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5488 retval = do_matrix_index (ri, j_arg);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5489 }
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 magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5493 retval = do_matrix_index (magic_colon, j_arg);
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 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5496 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5497 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5498 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5499
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5500 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5501 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5504 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
5505 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5506 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5507
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5508 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
5509
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5510 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5511
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5512 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5513 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5514
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5515 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5516 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5517 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5518 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5519 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5520 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5521 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5522 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5523 if (range_max_check (i, j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5524 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5525 retval = do_matrix_index (i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5526 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5527 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5528 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5529 case matrix_constant:
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 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5532 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
5533 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5534 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5535
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5536 if (jv.length () == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5539 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5540 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5541 else
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 if (range_max_check (i, jv.max (), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5544 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5545 retval = do_matrix_index (i, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5546 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5547 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5548 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5549 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5550 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5551 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5552 case range_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 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5555 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5556 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5557 retval = do_matrix_index (i, 1);
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 else if (nc == 2 && is_one_zero (rj))
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 retval = do_matrix_index (i, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5562 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5563 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5564 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5565 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5566 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5567 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
5568 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5569 retval = do_matrix_index (i, rj);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5572 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5573 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5574 if (range_max_check (i, 0, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5575 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5576 retval = do_matrix_index (i, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5577 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5578 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5579 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5580 break;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5583 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5584 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5587 tree_constant_rep::do_matrix_index (const idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5588 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5589 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5590 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5591
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5592 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
5593
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5594 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5595
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5596 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5597 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5598
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5599 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5600 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5601 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5602 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5603 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5604 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5605 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5606 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5607 if (range_max_check (iv.max (), j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5608 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5609 retval = do_matrix_index (iv, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5610 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5611 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5612 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5613 case matrix_constant:
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 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5616 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
5617 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5618 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5619
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5620 if (jv.length () == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5623 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5624 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5625 else
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 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
5628 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5629 retval = do_matrix_index (iv, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5630 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5631 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5632 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5633 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5634 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5635 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5636 case range_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 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5639 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5640 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5641 retval = do_matrix_index (iv, 1);
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 else if (nc == 2 && is_one_zero (rj))
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 retval = do_matrix_index (iv, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5646 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5647 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5648 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5649 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5650 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5651 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
5652 nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5653 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5654 retval = do_matrix_index (iv, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5655 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5656 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5657 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5658 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5659 if (range_max_check (iv.max (), 0, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5660 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5661 retval = do_matrix_index (iv, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5662 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5663 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5664 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5665 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5666 }
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 return retval;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5671 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5672 tree_constant_rep::do_matrix_index (const Range& ri,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5673 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5674 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5675 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5676
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5677 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
5678
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5679 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5680
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5681 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5682 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5683
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5684 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5685 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5686 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5687 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5688 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5689 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5690 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5691 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5692 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
5693 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5694 retval = do_matrix_index (ri, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5695 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5696 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5697 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5698 case matrix_constant:
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 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5701 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
5702 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5703 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5704
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5705 if (jv.length () == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5708 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5709 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5710 else
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 if (range_max_check (tree_to_mat_idx (ri.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5713 jv.max (), nr, nc) < 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 retval = do_matrix_index (ri, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5716 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5717 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5718 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5719 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5720 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5721 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5722 case range_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5723 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5724 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5725 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5726 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5727 retval = do_matrix_index (ri, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5728 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5729 else if (nc == 2 && is_one_zero (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5730 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5731 retval = do_matrix_index (ri, 0);
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 (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5736 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5737 if (range_max_check (tree_to_mat_idx (ri.max ()),
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5738 tree_to_mat_idx (rj.max ()), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5739 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5740 retval = do_matrix_index (ri, rj);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5741 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5742 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5743 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5744 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5745 retval = do_matrix_index (ri, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5746 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5747 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5748 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5749 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5750 }
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 return retval;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5755 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5756 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
5757 const tree_constant& j_arg) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5758 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5759 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5760
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5761 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
5762
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5763 tree_constant_rep::constant_type jtype = tmp_j.const_type ();
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 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5766 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5767
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5768 switch (jtype)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5769 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5770 case complex_scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5771 case scalar_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5772 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5773 int j = tree_to_mat_idx (tmp_j.double_value ());
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5774 if (index_check (j, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5775 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5776 if (range_max_check (0, j, nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5777 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5778 retval = do_matrix_index (magic_colon, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5779 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5780 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5781 case complex_matrix_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5782 case matrix_constant:
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 Matrix mj = tmp_j.matrix_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5785 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
5786 if (! jv)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5787 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5788
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5789 if (jv.length () == 0)
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 Matrix mtmp;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5792 retval = tree_constant (mtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5793 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5794 else
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 if (range_max_check (0, jv.max (), nr, nc) < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5797 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5798 retval = do_matrix_index (magic_colon, jv);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5799 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5800 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5801 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5802 case string_constant:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5803 gripe_string_invalid ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5804 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5805 case range_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 Range rj = tmp_j.range_value ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5808 if (nc == 2 && is_zero_one (rj))
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5809 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5810 retval = do_matrix_index (magic_colon, 1);
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 else if (nc == 2 && is_one_zero (rj))
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 retval = do_matrix_index (magic_colon, 0);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5815 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5816 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5817 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5818 if (index_check (rj, "column") < 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5819 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5820 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
5821 return tree_constant ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5822 retval = do_matrix_index (magic_colon, rj);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5825 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5826 case magic_colon:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5827 retval = do_matrix_index (magic_colon, magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5828 break;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5829 default:
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5830 panic_impossible ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5831 break;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5834 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5835 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5838 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
5839 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5840 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5841
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5842 if (type_tag == matrix_constant)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5843 retval = tree_constant (matrix->elem (i, j));
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5844 else
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5845 retval = tree_constant (complex_matrix->elem (i, j));
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 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5848 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5849
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5850 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5851 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
5852 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5853 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5854
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5855 int jlen = jv.capacity ();
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 CRMATRIX (m, cm, 1, jlen);
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 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5860 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5861 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5862 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5863 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5864 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5865
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5866 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5867 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5868
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5869 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5870 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
5871 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5872 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5873
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5874 int jlen = rj.nelem ();
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 CRMATRIX (m, cm, 1, jlen);
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 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5879 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5880 for (int j = 0; j < jlen; j++)
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 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5883 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5884 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5885 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5894 (int i, tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5895 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5896 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5897
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5898 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5899
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5900 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5901
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5902 CRMATRIX (m, cm, 1, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5903
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5904 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5905 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5906 CRMATRIX_ASSIGN_REP_ELEM (m, cm, 0, j, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5907 }
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 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5910
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5911 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5912 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5915 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
5916 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5917 tree_constant retval;
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 int ilen = iv.capacity ();
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 CRMATRIX (m, cm, ilen, 1);
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 for (int i = 0; i < ilen; i++)
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 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5926 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, row, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5927 }
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 ASSIGN_CRMATRIX_TO (retval, m, cm);
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 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5932 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5935 tree_constant_rep::do_matrix_index (const idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5936 const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5937 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5938 tree_constant retval;
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 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5941 int jlen = jv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5942
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5943 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5944
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5945 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5946 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5947 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5948 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5949 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5950 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5951 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5952 }
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5955 ASSIGN_CRMATRIX_TO (retval, m, cm);
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 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5958 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5959
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5960 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5961 tree_constant_rep::do_matrix_index (const idx_vector& iv,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5962 const Range& rj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5963 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5964 tree_constant retval;
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 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5967 int jlen = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5968
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5969 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5970
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5971 double b = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5972 double increment = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5973
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5974 for (int i = 0; i < ilen; i++)
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 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5977 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5978 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5979 double tmp = b + j * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5980 int col = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5981 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
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 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5984
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5985 ASSIGN_CRMATRIX_TO (retval, m, cm);
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 return 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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5990 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5991 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5992 (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
5993 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5994 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5995
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5996 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5997
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5998 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
5999 int ilen = iv.capacity ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6000
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6001 CRMATRIX (m, cm, ilen, nc);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6002
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6003 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6004 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6005 for (int i = 0; i < ilen; i++)
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 int row = iv.elem (i);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6008 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, j);
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 }
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 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6013
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6014 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6015 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6018 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
6019 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6020 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6021
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6022 int ilen = ri.nelem ();
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, 1);
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 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6027 double increment = ri.inc ();
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 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6031 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6032 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, 0, row, j);
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,
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6042 const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6043 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6044 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6045
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6046 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6047 int jlen = jv.capacity ();
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 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6050
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6051 double b = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6052 double increment = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6053 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6054 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6055 double tmp = b + i * increment;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6056 int row = tree_to_mat_idx (tmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6057 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6058 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6059 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6060 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6064 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6065
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6066 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6067 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6070 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
6071 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6072 tree_constant retval;
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 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6075 int jlen = rj.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6076
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6077 CRMATRIX (m, cm, ilen, jlen);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6078
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6079 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6080 double iinc = ri.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6081 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6082 double jinc = rj.inc ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6083
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6084 for (int i = 0; i < ilen; i++)
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 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6087 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6088 for (int j = 0; j < jlen; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6089 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6090 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6091 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6092
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6093 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, col);
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 }
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 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6098
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6099 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6100 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6103 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6104 (const Range& ri, tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6105 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6106 assert (mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6107
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6108 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6109
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6110 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6111
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6112 int ilen = ri.nelem ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6113
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6114 CRMATRIX (m, cm, ilen, nc);
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 double ib = ri.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6117 double iinc = ri.inc ();
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 for (int i = 0; i < ilen; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6120 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6121 double itmp = ib + i * iinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6122 int row = tree_to_mat_idx (itmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6123 for (int j = 0; j < nc; j++)
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 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, row, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6126 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6127 }
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 ASSIGN_CRMATRIX_TO (retval, m, cm);
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 return 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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6134 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6135 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
6136 int j) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6137 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6138 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6139
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6140 tree_constant retval;
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 int nr = rows ();
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 CRMATRIX (m, cm, nr, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6145
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6146 for (int i = 0; i < nr; i++)
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, 0, i, 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 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6152
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6153 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6154 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6157 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
6158 const idx_vector& jv) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6159 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6160 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6161
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6162 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6163
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6164 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6165 int jlen = jv.capacity ();
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, jlen);
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 for (int j = 0; j < jlen; 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 int col = jv.elem (j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6174 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, i, col);
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 }
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 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6179
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6180 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6181 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6184 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
6185 const Range& rj) const
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 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6188
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6189 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6190
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6191 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6192 int jlen = rj.nelem ();
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 CRMATRIX (m, cm, nr, jlen);
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 double jb = rj.base ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6197 double jinc = rj.inc ();
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 for (int j = 0; j < jlen; j++)
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 double jtmp = jb + j * jinc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6202 int col = tree_to_mat_idx (jtmp);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6203 for (int i = 0; i < nr; i++)
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 CRMATRIX_ASSIGN_REP_ELEM (m, cm, i, j, i, col);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6206 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6207 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6208
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6209 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6210
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6211 return retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6212 }
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 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6215 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
6216 tree_constant_rep::constant_type mcj) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6217 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6218 assert (mci == magic_colon && mcj == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6219
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6220 return tree_constant (*this);
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6223 tree_constant
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6224 tree_constant_rep::do_matrix_index
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6225 (tree_constant_rep::constant_type mci) const
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6226 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6227 assert (mci == magic_colon);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6228
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6229 tree_constant retval;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6230 int nr = rows ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6231 int nc = columns ();
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6232 int size = nr * nc;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6233 if (size > 0)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6234 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6235 CRMATRIX (m, cm, size, 1);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6236 int idx = 0;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6237 for (int j = 0; j < nc; j++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6238 for (int i = 0; i < nr; i++)
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6239 {
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6240 CRMATRIX_ASSIGN_REP_ELEM (m, cm, idx, 0, i, j);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6241 idx++;
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6242 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6243 ASSIGN_CRMATRIX_TO (retval, m, cm);
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6244 }
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6245 return retval;
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
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6248 /*
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6249 ;;; Local Variables: ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6250 ;;; mode: C++ ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6251 ;;; page-delimiter: "^/\\*" ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6252 ;;; End: ***
d45bdf960233 [project @ 1994-07-06 14:54:58 by jwe]
jwe
parents:
diff changeset
6253 */