annotate src/tc-rep-ass.cc @ 1245:85d1899047e1

[project @ 1995-04-11 00:45:35 by jwe]
author jwe
date Tue, 11 Apr 1995 00:45:35 +0000
parents b6360f2d4fa6
children 305162358727
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1 // tc-rep-ass.cc -*- C++ -*-
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2 /*
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
3
1009
dfe01093f657 [project @ 1995-01-04 04:05:12 by jwe]
jwe
parents: 915
diff changeset
4 Copyright (C) 1992, 1993, 1994, 1995 John W. Eaton
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
5
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
7
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
11 later version.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
12
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
16 for more details.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
17
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
21
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
22 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
23
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
1192
b6360f2d4fa6 [project @ 1995-03-30 21:38:35 by jwe]
jwe
parents: 1086
diff changeset
25 #include <config.h>
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
26 #endif
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
27
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
28 #include <ctype.h>
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
29 #include <string.h>
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
30 #include <fstream.h>
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
31 #include <iostream.h>
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
32 #include <strstream.h>
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
33
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
34 #include "mx-base.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
35 #include "Range.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
36
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
37 #include "arith-ops.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
38 #include "variables.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
39 #include "sysdep.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
40 #include "error.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
41 #include "gripes.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
42 #include "user-prefs.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
43 #include "utils.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
44 #include "pager.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
45 #include "pr-output.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
46 #include "tree-const.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
47 #include "idx-vector.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
48 #include "oct-map.h"
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
49
759
3fc1ccd5a9db [project @ 1994-10-02 15:34:26 by jwe]
jwe
parents: 743
diff changeset
50 #include "tc-inlines.h"
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
51
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
52 // Top-level tree-constant function that handles assignments. Only
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
53 // decide if the left-hand side is currently a scalar or a matrix and
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
54 // hand off to other functions to do the real work.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
55
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
56 void
783
d4605a02f1f8 [project @ 1994-10-07 19:06:00 by jwe]
jwe
parents: 777
diff changeset
57 TC_REP::assign (tree_constant& rhs, const Octave_object& args)
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
58 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
59 tree_constant rhs_tmp = rhs.make_numeric ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
60
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
61 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
62 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
63
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
64 // This is easier than actually handling assignments to strings.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
65 // An assignment to a range will normally require a conversion to a
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
66 // vector since it will normally destroy the equally-spaced property
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
67 // of the range elements.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
68
784
07b48e7ddd9b [project @ 1994-10-10 02:04:09 by jwe]
jwe
parents: 783
diff changeset
69 if (is_defined () && ! is_numeric_type ())
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
70 force_numeric ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
71
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
72 if (error_state)
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
73 return;
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
74
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
75 switch (type_tag)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
76 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
77 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
78 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
79 case unknown_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
80 do_scalar_assignment (rhs_tmp, args);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
81 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
82
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
83 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
84 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
85 do_matrix_assignment (rhs_tmp, args);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
86 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
87
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
88 default:
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
89 ::error ("invalid assignment to %s", type_as_string ());
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
90 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
91 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
92 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
93
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
94 // Assignments to scalars. If resize_on_range_error is true,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
95 // this can convert the left-hand side to a matrix.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
96
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
97 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
98 TC_REP::do_scalar_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
99 const Octave_object& args)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
100 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
101 assert (type_tag == unknown_constant
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
102 || type_tag == scalar_constant
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
103 || type_tag == complex_scalar_constant);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
104
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
105 int nargin = args.length ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
106
1041
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
107 if (rhs.is_zero_by_zero ())
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
108 {
1041
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
109 if (valid_scalar_indices (args))
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
110 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
111 if (type_tag == complex_scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
112 delete complex_scalar;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
113
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
114 matrix = new Matrix (0, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
115 type_tag = matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
116 }
1041
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
117 else if (! valid_zero_index (args))
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
118 {
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
119 ::error ("invalid assigment of empty matrix to scalar");
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
120 return;
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
121 }
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
122 }
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
123 else if (rhs.is_scalar_type () && valid_scalar_indices (args))
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
124 {
7dbf5bb19bde [project @ 1995-01-18 15:06:19 by jwe]
jwe
parents: 1037
diff changeset
125 if (type_tag == unknown_constant || type_tag == scalar_constant)
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
126 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
127 if (rhs.const_type () == scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
128 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
129 scalar = rhs.double_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
130 type_tag = scalar_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
131 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
132 else if (rhs.const_type () == complex_scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
133 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
134 complex_scalar = new Complex (rhs.complex_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
135 type_tag = complex_scalar_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
136 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
137 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
138 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
139 ::error ("invalid assignment to scalar");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
140 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
141 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
142 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
143 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
144 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
145 if (rhs.const_type () == scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
146 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
147 delete complex_scalar;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
148 scalar = rhs.double_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
149 type_tag = scalar_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
150 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
151 else if (rhs.const_type () == complex_scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
152 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
153 *complex_scalar = rhs.complex_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
154 type_tag = complex_scalar_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
155 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
156 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
157 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
158 ::error ("invalid assignment to scalar");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
159 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
160 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
161 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
162 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
163 else if (user_pref.resize_on_range_error)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
164 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
165 TC_REP::constant_type old_type_tag = type_tag;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
166
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
167 if (type_tag == complex_scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
168 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
169 Complex *old_complex = complex_scalar;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
170 complex_matrix = new ComplexMatrix (1, 1, *complex_scalar);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
171 type_tag = complex_matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
172 delete old_complex;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
173 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
174 else if (type_tag == scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
175 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
176 matrix = new Matrix (1, 1, scalar);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
177 type_tag = matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
178 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
179
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
180 // If there is an error, the call to do_matrix_assignment should not
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
181 // destroy the current value.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
182 // TC_REP::eval(int) will take
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
183 // care of converting single element matrices back to scalars.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
184
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
185 do_matrix_assignment (rhs, args);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
186
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
187 // I don't think there's any other way to revert back to unknown
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
188 // constant types, so here it is.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
189
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
190 if (old_type_tag == unknown_constant && error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
191 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
192 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
193 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
194 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
195 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
196
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
197 type_tag = unknown_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
198 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
199 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
200 else if (nargin > 2 || nargin < 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
201 ::error ("invalid index expression for scalar type");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
202 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
203 ::error ("index invalid or out of range for scalar type");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
204 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
205
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
206 // Assignments to matrices (and vectors).
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
207 //
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
208 // For compatibility with Matlab, we allow assignment of an empty
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
209 // matrix to an expression with empty indices to do nothing.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
210
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
211 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
212 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
213 const Octave_object& args)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
214 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
215 assert (type_tag == unknown_constant
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
216 || type_tag == matrix_constant
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
217 || type_tag == complex_matrix_constant);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
218
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
219 if (type_tag == matrix_constant && rhs.is_complex_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
220 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
221 Matrix *old_matrix = matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
222 complex_matrix = new ComplexMatrix (*matrix);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
223 type_tag = complex_matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
224 delete old_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
225 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
226 else if (type_tag == unknown_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
227 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
228 if (rhs.is_complex_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
229 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
230 complex_matrix = new ComplexMatrix ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
231 type_tag = complex_matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
232 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
233 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
234 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
235 matrix = new Matrix ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
236 type_tag = matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
237 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
238 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
239
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
240 int nargin = args.length ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
241
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
242 // The do_matrix_assignment functions can't handle empty matrices, so
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
243 // don't let any pass through here.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
244 switch (nargin)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
245 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
246 case 1:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
247 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
248 tree_constant arg = args(0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
249
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
250 if (arg.is_undefined ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
251 ::error ("matrix index is undefined");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
252 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
253 do_matrix_assignment (rhs, arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
254 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
255 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
256
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
257 case 2:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
258 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
259 tree_constant arg_a = args(0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
260 tree_constant arg_b = args(1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
261
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
262 if (arg_a.is_undefined ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
263 ::error ("first matrix index is undefined");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
264 else if (arg_b.is_undefined ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
265 ::error ("second matrix index is undefined");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
266 else if (arg_a.is_empty () || arg_b.is_empty ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
267 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
268 if (! rhs.is_empty ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
269 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
270 ::error ("in assignment expression, a matrix index is empty");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
271 ::error ("but the right hand side is not an empty matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
272 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
273 // XXX FIXME XXX -- to really be correct here, we should probably
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
274 // check to see if the assignment conforms, but that seems like more
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
275 // work than it's worth right now...
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
276 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
277 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
278 do_matrix_assignment (rhs, arg_a, arg_b);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
279 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
280 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
281
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
282 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
283 if (nargin == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
284 ::error ("matrix indices expected, but none provided");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
285 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
286 ::error ("too many indices for matrix expression");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
287 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
288 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
289 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
290
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
291 // Matrix assignments indexed by a single value.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
292
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
293 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
294 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
295 const tree_constant& i_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
296 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
297 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
298 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
299
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
300 if (user_pref.do_fortran_indexing || nr <= 1 || nc <= 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
301 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
302 if (i_arg.is_empty ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
303 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
304 if (! rhs.is_empty ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
305 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
306 ::error ("in assignment expression, matrix index is empty but");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
307 ::error ("right hand side is not an empty matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
308 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
309 // XXX FIXME XXX -- to really be correct here, we should probably
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
310 // check to see if the assignment conforms, but that seems like more
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
311 // work than it's worth right now...
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
312
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
313 // The assignment functions can't handle empty matrices, so don't let
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
314 // any pass through here.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
315 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
316 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
317
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
318 // We can't handle the case of assigning to a vector first, since even
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
319 // then, the two operations are not equivalent. For example, the
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
320 // expression V(:) = M is handled differently depending on whether the
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
321 // user specified do_fortran_indexing = "true".
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
322
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
323 if (user_pref.do_fortran_indexing)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
324 fortran_style_matrix_assignment (rhs, i_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
325 else if (nr <= 1 || nc <= 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
326 vector_assignment (rhs, i_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
327 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
328 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
329 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
330 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
331 ::error ("single index only valid for row or column vector");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
332 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
333
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
334 // Fortran-style assignments. Matrices are assumed to be stored in
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
335 // column-major order and it is ok to use a single index for
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
336 // multi-dimensional matrices.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
337
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
338 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
339 TC_REP::fortran_style_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
340 const tree_constant& i_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
341 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
342 tree_constant tmp_i = i_arg.make_numeric_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
343
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
344 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
345 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
346
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
347 TC_REP::constant_type itype = tmp_i.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
348
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
349 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
350 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
351
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
352 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
353 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
354
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
355 switch (itype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
356 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
357 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
358 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
359 {
1086
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
360 double dval = tmp_i.double_value ();
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
361
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
362 if (xisnan (dval))
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
363 {
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
364 error ("NaN is invalid as a matrix index");
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
365 return;
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
366 }
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
367
75fc98220389 [project @ 1995-01-31 04:17:15 by jwe]
jwe
parents: 1041
diff changeset
368 int i = NINT (dval);
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
369 int idx = i - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
370
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
371 if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
372 {
1037
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
373 int len = nr * nc;
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
374
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
375 if (idx < len && len > 0)
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
376 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
377 convert_to_row_or_column_vector ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
378
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
379 nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
380 nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
381
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
382 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
383 delete_column (idx);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
384 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
385 delete_row (idx);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
386 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
387 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
388 }
1037
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
389 else if (idx < 0)
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
390 {
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
391 error ("invalid index = %d", idx+1);
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
392 }
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
393
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
394 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
395 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
396
1037
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
397 if (index_check (idx, "") < 0)
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
398 return;
d383ec996ee1 [project @ 1995-01-17 03:20:16 by jwe]
jwe
parents: 1033
diff changeset
399
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
400 if (nr <= 1 || nc <= 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
401 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
402 maybe_resize (idx);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
403 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
404 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
405 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
406 else if (range_max_check (idx, nr * nc) < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
407 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
408
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
409 nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
410 nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
411
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
412 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
413 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
414 ::error ("for A(int) = X: X must be a scalar");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
415 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
416 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
417 int ii = fortran_row (i, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
418 int jj = fortran_column (i, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
419 do_matrix_assignment (rhs, ii, jj);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
420 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
421 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
422
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
423 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
424 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
425 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
426 Matrix mi = tmp_i.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
427 int len = nr * nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
428 idx_vector ii (mi, 1, "", len); // Always do fortran indexing here...
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
429 if (! ii)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
430 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
431
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
432 if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
433 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
434 ii.sort_uniq ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
435 int num_to_delete = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
436 for (int i = 0; i < ii.length (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
437 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
438 if (ii.elem (i) < len)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
439 num_to_delete++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
440 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
441 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
442 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
443
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
444 if (num_to_delete > 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
445 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
446 if (num_to_delete != ii.length ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
447 ii.shorten (num_to_delete);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
448
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
449 convert_to_row_or_column_vector ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
450
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
451 nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
452 nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
453
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
454 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
455 delete_columns (ii);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
456 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
457 delete_rows (ii);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
458 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
459 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
460 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
461 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
462 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
463
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
464 if (nr <= 1 || nc <= 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
465 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
466 maybe_resize (ii.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
467 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
468 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
469 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
470 else if (range_max_check (ii.max (), len) < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
471 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
472
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
473 int ilen = ii.capacity ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
474
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
475 if (ilen != rhs_nr * rhs_nc)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
476 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
477 ::error ("A(matrix) = X: X and matrix must have the same number");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
478 ::error ("of elements");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
479 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
480 else if (ilen == 1 && rhs.is_scalar_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
481 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
482 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
483 int idx = ii.elem (0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
484 int ii = fortran_row (idx + 1, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
485 int jj = fortran_column (idx + 1, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
486
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
487 if (rhs.const_type () == scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
488 matrix->elem (ii, jj) = rhs.double_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
489 else if (rhs.const_type () == complex_scalar_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
490 complex_matrix->elem (ii, jj) = rhs.complex_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
491 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
492 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
493 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
494 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
495 fortran_style_matrix_assignment (rhs, ii);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
496 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
497 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
498
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
499 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
500 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
501 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
502
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
503 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
504 gripe_range_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
505 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
506
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
507 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
508 // a(:) = [] is equivalent to a(:,:) = [].
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
509 if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
510 do_matrix_assignment (rhs, magic_colon, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
511 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
512 fortran_style_matrix_assignment (rhs, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
513 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
514
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
515 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
516 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
517 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
518 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
519 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
520
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
521 // Fortran-style assignment for vector index.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
522
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
523 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
524 TC_REP::fortran_style_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
525 idx_vector& i)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
526 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
527 assert (rhs.is_matrix_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
528
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
529 int ilen = i.capacity ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
530
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
531 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
532
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
533 int len = rhs_nr * rhs_nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
534
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
535 if (len == ilen)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
536 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
537 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
538 if (rhs.const_type () == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
539 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
540 double *cop_out = rhs_m.fortran_vec ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
541 for (int k = 0; k < len; k++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
542 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
543 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
544 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
545
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
546 matrix->elem (ii, jj) = *cop_out++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
547 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
548 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
549 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
550 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
551 Complex *cop_out = rhs_cm.fortran_vec ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
552 for (int k = 0; k < len; k++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
553 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
554 int ii = fortran_row (i.elem (k) + 1, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
555 int jj = fortran_column (i.elem (k) + 1, nr) - 1;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
556
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
557 complex_matrix->elem (ii, jj) = *cop_out++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
558 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
559 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
560 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
561 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
562 ::error ("number of rows and columns must match for indexed assignment");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
563 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
564
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
565 // Fortran-style assignment for colon index.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
566
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
567 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
568 TC_REP::fortran_style_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
569 TC_REP::constant_type mci)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
570 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
571 assert (rhs.is_matrix_type () && mci == TC_REP::magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
572
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
573 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
574 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
575
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
576 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
577
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
578 int rhs_size = rhs_nr * rhs_nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
579 if (rhs_size == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
580 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
581 if (rhs.const_type () == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
582 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
583 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
584 matrix = new Matrix (0, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
585 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
586 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
587 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
588 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
589 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
590 else if (nr*nc != rhs_size)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
591 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
592 ::error ("A(:) = X: X and A must have the same number of elements");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
593 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
594 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
595
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
596 if (rhs.const_type () == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
597 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
598 double *cop_out = rhs_m.fortran_vec ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
599 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
600 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
601 matrix->elem (i, j) = *cop_out++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
602 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
603 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
604 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
605 Complex *cop_out = rhs_cm.fortran_vec ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
606 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
607 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
608 complex_matrix->elem (i, j) = *cop_out++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
609 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
610 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
611
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
612 // Assignments to vectors. Hand off to other functions once we know
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
613 // what kind of index we have. For a colon, it is the same as
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
614 // assignment to a matrix indexed by two colons.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
615
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
616 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
617 TC_REP::vector_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
618 const tree_constant& i_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
619 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
620 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
621 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
622
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
623 assert ((nr == 1 || nc == 1 || (nr == 0 && nc == 0))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
624 && ! user_pref.do_fortran_indexing);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
625
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
626 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
627
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
628 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
629 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
630
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
631 TC_REP::constant_type itype = tmp_i.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
632
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
633 switch (itype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
634 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
635 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
636 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
637 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
638 int i = tree_to_mat_idx (tmp_i.double_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
639 if (index_check (i, "") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
640 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
641 do_vector_assign (rhs, i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
642 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
643 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
644
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
645 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
646 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
647 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
648 Matrix mi = tmp_i.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
649 int len = nr * nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
650 idx_vector iv (mi, user_pref.do_fortran_indexing, "", len);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
651 if (! iv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
652 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
653
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
654 do_vector_assign (rhs, iv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
655 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
656 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
657
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
658 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
659 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
660 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
661
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
662 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
663 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
664 Range ri = tmp_i.range_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
665 int len = nr * nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
666 if (len == 2 && is_zero_one (ri))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
667 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
668 do_vector_assign (rhs, 1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
669 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
670 else if (len == 2 && is_one_zero (ri))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
671 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
672 do_vector_assign (rhs, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
673 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
674 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
675 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
676 if (index_check (ri, "") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
677 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
678 do_vector_assign (rhs, ri);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
679 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
680 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
681 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
682
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
683 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
684 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
685 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
686 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
687
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
688 if (! indexed_assign_conforms (nr, nc, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
689 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
690 ::error ("A(:) = X: X and A must have the same dimensions");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
691 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
692 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
693 do_matrix_assignment (rhs, magic_colon, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
694 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
695 break;
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
696
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
697 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
698 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
699 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
700 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
701 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
702
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
703 // Check whether an indexed assignment to a vector is valid.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
704
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
705 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
706 TC_REP::check_vector_assign (int rhs_nr, int rhs_nc, int ilen, const char *rm)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
707 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
708 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
709 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
710
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
711 if ((nr == 1 && nc == 1) || nr == 0 || nc == 0) // No orientation.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
712 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
713 if (! (ilen == rhs_nr || ilen == rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
714 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
715 ::error ("A(%s) = X: X and %s must have the same number of elements",
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
716 rm, rm);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
717 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
718 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
719 else if (nr == 1) // Preserve current row orientation.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
720 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
721 if (! (rhs_nr == 1 && rhs_nc == ilen))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
722 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
723 ::error ("A(%s) = X: where A is a row vector, X must also be a", rm);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
724 ::error ("row vector with the same number of elements as %s", rm);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
725 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
726 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
727 else if (nc == 1) // Preserve current column orientation.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
728 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
729 if (! (rhs_nc == 1 && rhs_nr == ilen))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
730 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
731 ::error ("A(%s) = X: where A is a column vector, X must also be", rm);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
732 ::error ("a column vector with the same number of elements as %s", rm);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
733 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
734 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
735 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
736 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
737 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
738
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
739 // Assignment to a vector with an integer index.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
740
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
741 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
742 TC_REP::do_vector_assign (const tree_constant& rhs, int i)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
743 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
744 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
745 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
746
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
747 if (indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
748 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
749 maybe_resize (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
750 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
751 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
752
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
753 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
754 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
755
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
756 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
757 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
758 REP_ELEM_ASSIGN (0, i, rhs.double_value (), rhs.complex_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
759 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
760 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
761 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
762 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
763 REP_ELEM_ASSIGN (i, 0, rhs.double_value (), rhs.complex_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
764 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
765 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
766 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
767 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
768 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
769 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
770 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
771 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
772 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
773
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
774 int len = MAX (nr, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
775
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
776 if (i < 0 || i >= len)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
777 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
778 ::error ("A(int) = []: index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
779 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
780 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
781
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
782 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
783 delete_column (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
784 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
785 delete_row (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
786 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
787 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
788 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
789 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
790 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
791 ::error ("for A(int) = X: X must be a scalar");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
792 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
793 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
794 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
795
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
796 // Assignment to a vector with a vector index.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
797
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
798 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
799 TC_REP::do_vector_assign (const tree_constant& rhs, idx_vector& iv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
800 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
801 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
802 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
803 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
804 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
805
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
806 int len = MAX (nr, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
807
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
808 if (iv.max () >= len)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
809 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
810 ::error ("A(matrix) = []: index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
811 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
812 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
813
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
814 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
815 delete_columns (iv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
816 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
817 delete_rows (iv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
818 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
819 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
820 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
821 else if (rhs.is_scalar_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
822 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
823 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
824 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
825
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
826 if (iv.capacity () == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
827 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
828 int idx = iv.elem (0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
829
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
830 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
831 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
832 REP_ELEM_ASSIGN (0, idx, rhs.double_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
833 rhs.complex_value (), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
834 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
835 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
836 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
837 REP_ELEM_ASSIGN (idx, 0, rhs.double_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
838 rhs.complex_value (), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
839 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
840 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
841 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
842 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
843 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
844 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
845 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
846 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
847 ::error ("A(matrix) = X: where A is a row vector, X must also be a");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
848 ::error ("row vector with the same number of elements as matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
849 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
850 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
851 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
852 ::error ("A(matrix) = X: where A is a column vector, X must also be a");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
853 ::error ("column vector with the same number of elements as matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
854 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
855 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
856 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
857 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
858 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
859 else if (rhs.is_matrix_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
860 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
861 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
862
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
863 int ilen = iv.capacity ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
864 check_vector_assign (rhs_nr, rhs_nc, ilen, "matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
865 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
866 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
867
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
868 force_orient f_orient = no_orient;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
869 if (rhs_nr == 1 && rhs_nc != 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
870 f_orient = row_orient;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
871 else if (rhs_nc == 1 && rhs_nr != 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
872 f_orient = column_orient;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
873
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
874 maybe_resize (iv.max (), f_orient);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
875 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
876 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
877
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
878 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
879 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
880
855
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
881 if (nr == 1 && rhs_nr == 1)
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
882 {
855
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
883 for (int i = 0; i < iv.capacity (); i++)
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
884 REP_ELEM_ASSIGN (0, iv.elem (i), rhs_m.elem (0, i),
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
885 rhs_cm.elem (0, i), rhs.is_real_type ());
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
886 }
855
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
887 else if (nc == 1 && rhs_nc == 1)
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
888 {
855
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
889 for (int i = 0; i < iv.capacity (); i++)
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
890 REP_ELEM_ASSIGN (iv.elem (i), 0, rhs_m.elem (i, 0),
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
891 rhs_cm.elem (i, 0), rhs.is_real_type ());
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
892 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
893 else
855
f4feb9b57f12 [project @ 1994-10-21 19:22:27 by jwe]
jwe
parents: 854
diff changeset
894 ::error ("A(vector) = X: X must be the same size as vector");
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
895 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
896 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
897 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
898 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
899
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
900 // Assignment to a vector with a range index.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
901
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
902 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
903 TC_REP::do_vector_assign (const tree_constant& rhs, Range& ri)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
904 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
905 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
906 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
907 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
908 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
909
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
910 int len = MAX (nr, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
911
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
912 int b = tree_to_mat_idx (ri.min ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
913 int l = tree_to_mat_idx (ri.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
914 if (b < 0 || l >= len)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
915 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
916 ::error ("A(range) = []: index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
917 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
918 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
919
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
920 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
921 delete_columns (ri);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
922 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
923 delete_rows (ri);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
924 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
925 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
926 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
927 else if (rhs.is_scalar_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
928 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
929 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
930 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
931
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
932 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
933 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
934 ::error ("A(range) = X: where A is a row vector, X must also be a");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
935 ::error ("row vector with the same number of elements as range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
936 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
937 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
938 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
939 ::error ("A(range) = X: where A is a column vector, X must also be a");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
940 ::error ("column vector with the same number of elements as range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
941 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
942 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
943 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
944 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
945 else if (rhs.is_matrix_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
946 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
947 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
948
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
949 int ilen = ri.nelem ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
950 check_vector_assign (rhs_nr, rhs_nc, ilen, "range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
951 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
952 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
953
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
954 force_orient f_orient = no_orient;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
955 if (rhs_nr == 1 && rhs_nc != 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
956 f_orient = row_orient;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
957 else if (rhs_nc == 1 && rhs_nr != 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
958 f_orient = column_orient;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
959
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
960 maybe_resize (tree_to_mat_idx (ri.max ()), f_orient);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
961 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
962 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
963
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
964 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
965 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
966
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
967 double b = ri.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
968 double increment = ri.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
969
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
970 if (nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
971 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
972 for (int i = 0; i < ri.nelem (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
973 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
974 double tmp = b + i * increment;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
975 int col = tree_to_mat_idx (tmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
976 REP_ELEM_ASSIGN (0, col, rhs_m.elem (0, i), rhs_cm.elem (0, i),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
977 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
978 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
979 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
980 else if (nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
981 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
982 for (int i = 0; i < ri.nelem (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
983 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
984 double tmp = b + i * increment;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
985 int row = tree_to_mat_idx (tmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
986 REP_ELEM_ASSIGN (row, 0, rhs_m.elem (i, 0), rhs_cm.elem (i, 0),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
987 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
988 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
989 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
990 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
991 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
992 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
993 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
994 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
995 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
996
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
997 // Matrix assignment indexed by two values. This function determines
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
998 // the type of the first arugment, checks as much as possible, and
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
999 // then calls one of a set of functions to handle the specific cases:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1000 //
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1001 // M (integer, arg2) = RHS (MA1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1002 // M (vector, arg2) = RHS (MA2)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1003 // M (range, arg2) = RHS (MA3)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1004 // M (colon, arg2) = RHS (MA4)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1005 //
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1006 // Each of those functions determines the type of the second argument
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1007 // and calls another function to handle the real work of doing the
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1008 // assignment.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1009
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1010 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1011 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1012 const tree_constant& i_arg,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1013 const tree_constant& j_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1014 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1015 tree_constant tmp_i = i_arg.make_numeric_or_range_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1016
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1017 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1018 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1019
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1020 TC_REP::constant_type itype = tmp_i.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1021
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1022 switch (itype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1023 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1024 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1025 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1026 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1027 int i = tree_to_mat_idx (tmp_i.double_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1028 do_matrix_assignment (rhs, i, j_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1029 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1030 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1031
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1032 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1033 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1034 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1035 Matrix mi = tmp_i.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1036 idx_vector iv (mi, user_pref.do_fortran_indexing, "row", rows ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1037 if (! iv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1038 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1039
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1040 do_matrix_assignment (rhs, iv, j_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1041 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1042 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1043
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1044 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1045 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1046 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1047
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1048 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1049 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1050 Range ri = tmp_i.range_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1051 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1052 if (nr == 2 && is_zero_one (ri))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1053 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1054 do_matrix_assignment (rhs, 1, j_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1055 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1056 else if (nr == 2 && is_one_zero (ri))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1057 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1058 do_matrix_assignment (rhs, 0, j_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1059 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1060 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1061 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1062 if (index_check (ri, "row") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1063 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1064 do_matrix_assignment (rhs, ri, j_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1065 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1066 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1067 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1068
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1069 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1070 do_matrix_assignment (rhs, magic_colon, j_arg);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1071 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1072
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1073 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1074 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1075 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1076 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1077 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1078
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1079 /* MA1 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1080 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1081 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1082 const tree_constant& j_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1083 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1084 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1085
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1086 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1087 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1088
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1089 TC_REP::constant_type jtype = tmp_j.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1090
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1091 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1092 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1093
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1094 switch (jtype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1095 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1096 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1097 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1098 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1099 if (index_check (i, "row") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1100 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1101 int j = tree_to_mat_idx (tmp_j.double_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1102 if (index_check (j, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1103 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1104 if (! indexed_assign_conforms (1, 1, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1105 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1106 ::error ("A(int,int) = X, X must be a scalar");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1107 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1108 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1109 maybe_resize (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1110 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1111 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1112
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1113 do_matrix_assignment (rhs, i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1114 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1115 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1116
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1117 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1118 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1119 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1120 if (index_check (i, "row") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1121 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1122 Matrix mj = tmp_j.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1123 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1124 columns ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1125 if (! jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1126 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1127
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1128 if (! indexed_assign_conforms (1, jv.capacity (), rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1129 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1130 ::error ("A(int,matrix) = X: X must be a row vector with the same");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1131 ::error ("number of elements as matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1132 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1133 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1134 maybe_resize (i, jv.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1135 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1136 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1137
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1138 do_matrix_assignment (rhs, i, jv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1139 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1140 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1141
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1142 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1143 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1144 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1145
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1146 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1147 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1148 if (index_check (i, "row") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1149 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1150 Range rj = tmp_j.range_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1151 if (! indexed_assign_conforms (1, rj.nelem (), rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1152 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1153 ::error ("A(int,range) = X: X must be a row vector with the same");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1154 ::error ("number of elements as range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1155 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1156 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1157
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1158 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1159 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1160 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1161 do_matrix_assignment (rhs, i, 1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1162 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1163 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1164 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1165 do_matrix_assignment (rhs, i, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1166 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1167 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1168 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1169 if (index_check (rj, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1170 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1171 maybe_resize (i, tree_to_mat_idx (rj.max ()));
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1172 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1173 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1174
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1175 do_matrix_assignment (rhs, i, rj);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1176 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1177 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1178 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1179
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1180 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1181 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1182 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1183 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1184 if (i == -1 && nr == 1 && rhs_nr == 0 && rhs_nc == 0
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1185 || index_check (i, "row") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1186 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1187 else if (nc == 0 && nr == 0 && rhs_nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1188 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1189 if (rhs.is_complex_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1190 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1191 complex_matrix = new ComplexMatrix ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1192 type_tag = complex_matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1193 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1194 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1195 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1196 matrix = new Matrix ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1197 type_tag = matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1198 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1199 maybe_resize (i, rhs_nc-1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1200 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1201 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1202 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1203 else if (indexed_assign_conforms (1, nc, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1204 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1205 maybe_resize (i, nc-1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1206 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1207 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1208 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1209 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1210 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1211 if (i < 0 || i >= nr)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1212 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1213 ::error ("A(int,:) = []: row index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1214 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1215 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1216 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1217 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1218 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1219 ::error ("A(int,:) = X: X must be a row vector with the same");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1220 ::error ("number of columns as A");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1221 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1222 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1223
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1224 do_matrix_assignment (rhs, i, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1225 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1226 break;
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
1227
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1228 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1229 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1230 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1231 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1232 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1233
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1234 /* MA2 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1235 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1236 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1237 idx_vector& iv, const tree_constant& j_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1238 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1239 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1240
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1241 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1242 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1243
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1244 TC_REP::constant_type jtype = tmp_j.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1245
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1246 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1247 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1248
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1249 switch (jtype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1250 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1251 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1252 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1253 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1254 int j = tree_to_mat_idx (tmp_j.double_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1255 if (index_check (j, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1256 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1257 if (! indexed_assign_conforms (iv.capacity (), 1, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1258 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1259 ::error ("A(matrix,int) = X: X must be a column vector with the");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1260 ::error ("same number of elements as matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1261 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1262 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1263 maybe_resize (iv.max (), j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1264 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1265 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1266
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1267 do_matrix_assignment (rhs, iv, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1268 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1269 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1270
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1271 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1272 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1273 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1274 Matrix mj = tmp_j.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1275 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1276 columns ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1277 if (! jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1278 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1279
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1280 if (! indexed_assign_conforms (iv.capacity (), jv.capacity (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1281 rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1282 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1283 ::error ("A(r_mat,c_mat) = X: the number of rows in X must match");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1284 ::error ("the number of elements in r_mat and the number of");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1285 ::error ("columns in X must match the number of elements in c_mat");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1286 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1287 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1288 maybe_resize (iv.max (), jv.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1289 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1290 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1291
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1292 do_matrix_assignment (rhs, iv, jv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1293 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1294 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1295
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1296 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1297 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1298 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1299
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1300 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1301 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1302 Range rj = tmp_j.range_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1303 if (! indexed_assign_conforms (iv.capacity (), rj.nelem (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1304 rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1305 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1306 ::error ("A(matrix,range) = X: the number of rows in X must match");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1307 ::error ("the number of elements in matrix and the number of");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1308 ::error ("columns in X must match the number of elements in range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1309 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1310 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1311
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1312 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1313 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1314 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1315 do_matrix_assignment (rhs, iv, 1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1316 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1317 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1318 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1319 do_matrix_assignment (rhs, iv, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1320 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1321 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1322 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1323 if (index_check (rj, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1324 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1325 maybe_resize (iv.max (), tree_to_mat_idx (rj.max ()));
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1326 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1327 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1328
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1329 do_matrix_assignment (rhs, iv, rj);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1330 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1331 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1332 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1333
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1334 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1335 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1336 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1337 int new_nc = nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1338 if (nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1339 new_nc = rhs_nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1340
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1341 if (indexed_assign_conforms (iv.capacity (), new_nc,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1342 rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1343 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1344 maybe_resize (iv.max (), new_nc-1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1345 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1346 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1347 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1348 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1349 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1350 if (iv.max () >= rows ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1351 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1352 ::error ("A(matrix,:) = []: row index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1353 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1354 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1355 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1356 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1357 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1358 ::error ("A(matrix,:) = X: the number of rows in X must match the");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1359 ::error ("number of elements in matrix, and the number of columns");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1360 ::error ("in X must match the number of columns in A");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1361 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1362 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1363
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1364 do_matrix_assignment (rhs, iv, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1365 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1366 break;
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
1367
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1368 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1369 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1370 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1371 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1372 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1373
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1374 /* MA3 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1375 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1376 TC_REP::do_matrix_assignment (const tree_constant& rhs, Range& ri,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1377 const tree_constant& j_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1378 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1379 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1380
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1381 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1382 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1383
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1384 TC_REP::constant_type jtype = tmp_j.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1385
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1386 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1387 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1388
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1389 switch (jtype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1390 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1391 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1392 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1393 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1394 int j = tree_to_mat_idx (tmp_j.double_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1395 if (index_check (j, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1396 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1397 if (! indexed_assign_conforms (ri.nelem (), 1, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1398 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1399 ::error ("A(range,int) = X: X must be a column vector with the");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1400 ::error ("same number of elements as range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1401 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1402 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1403 maybe_resize (tree_to_mat_idx (ri.max ()), j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1404 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1405 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1406
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1407 do_matrix_assignment (rhs, ri, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1408 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1409 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1410
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1411 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1412 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1413 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1414 Matrix mj = tmp_j.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1415 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1416 columns ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1417 if (! jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1418 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1419
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1420 if (! indexed_assign_conforms (ri.nelem (), jv.capacity (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1421 rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1422 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1423 ::error ("A(range,matrix) = X: the number of rows in X must match");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1424 ::error ("the number of elements in range and the number of");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1425 ::error ("columns in X must match the number of elements in matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1426 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1427 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1428 maybe_resize (tree_to_mat_idx (ri.max ()), jv.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1429 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1430 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1431
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1432 do_matrix_assignment (rhs, ri, jv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1433 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1434 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1435
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1436 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1437 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1438 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1439
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1440 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1441 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1442 Range rj = tmp_j.range_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1443 if (! indexed_assign_conforms (ri.nelem (), rj.nelem (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1444 rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1445 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1446 ::error ("A(r_range,c_range) = X: the number of rows in X must");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1447 ::error ("match the number of elements in r_range and the number");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1448 ::error ("of columns in X must match the number of elements in");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1449 ::error ("c_range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1450 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1451 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1452
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1453 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1454 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1455 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1456 do_matrix_assignment (rhs, ri, 1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1457 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1458 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1459 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1460 do_matrix_assignment (rhs, ri, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1461 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1462 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1463 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1464 if (index_check (rj, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1465 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1466
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1467 maybe_resize (tree_to_mat_idx (ri.max ()),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1468 tree_to_mat_idx (rj.max ()));
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1469
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1470 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1471 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1472
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1473 do_matrix_assignment (rhs, ri, rj);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1474 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1475 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1476 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1477
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1478 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1479 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1480 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1481 int new_nc = nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1482 if (nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1483 new_nc = rhs_nc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1484
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1485 if (indexed_assign_conforms (ri.nelem (), new_nc, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1486 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1487 maybe_resize (tree_to_mat_idx (ri.max ()), new_nc-1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1488 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1489 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1490 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1491 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1492 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1493 int b = tree_to_mat_idx (ri.min ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1494 int l = tree_to_mat_idx (ri.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1495 if (b < 0 || l >= rows ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1496 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1497 ::error ("A(range,:) = []: row index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1498 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1499 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1500 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1501 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1502 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1503 ::error ("A(range,:) = X: the number of rows in X must match the");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1504 ::error ("number of elements in range, and the number of columns");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1505 ::error ("in X must match the number of columns in A");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1506 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1507 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1508
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1509 do_matrix_assignment (rhs, ri, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1510 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1511 break;
777
a2f9d3fd720c [project @ 1994-10-07 14:01:53 by jwe]
jwe
parents: 759
diff changeset
1512
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1513 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1514 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1515 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1516 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1517 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1518
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1519 /* MA4 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1520 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1521 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1522 TC_REP::constant_type i,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1523 const tree_constant& j_arg)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1524 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1525 tree_constant tmp_j = j_arg.make_numeric_or_range_or_magic ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1526
915
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1527 if (error_state)
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1528 return;
b632b159b4ed [project @ 1994-11-11 00:23:27 by jwe]
jwe
parents: 855
diff changeset
1529
743
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1530 TC_REP::constant_type jtype = tmp_j.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1531
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1532 int rhs_nr = rhs.rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1533 int rhs_nc = rhs.columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1534
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1535 switch (jtype)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1536 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1537 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1538 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1539 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1540 int j = tree_to_mat_idx (tmp_j.double_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1541 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1542 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1543 if (j == -1 && nc == 1 && rhs_nr == 0 && rhs_nc == 0
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1544 || index_check (j, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1545 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1546 if (nr == 0 && nc == 0 && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1547 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1548 if (rhs.is_complex_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1549 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1550 complex_matrix = new ComplexMatrix ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1551 type_tag = complex_matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1552 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1553 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1554 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1555 matrix = new Matrix ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1556 type_tag = matrix_constant;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1557 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1558 maybe_resize (rhs_nr-1, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1559 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1560 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1561 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1562 else if (indexed_assign_conforms (nr, 1, rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1563 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1564 maybe_resize (nr-1, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1565 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1566 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1567 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1568 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1569 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1570 if (j < 0 || j >= nc)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1571 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1572 ::error ("A(:,int) = []: column index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1573 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1574 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1575 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1576 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1577 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1578 ::error ("A(:,int) = X: X must be a column vector with the same");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1579 ::error ("number of rows as A");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1580 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1581 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1582
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1583 do_matrix_assignment (rhs, magic_colon, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1584 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1585 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1586
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1587 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1588 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1589 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1590 Matrix mj = tmp_j.matrix_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1591 idx_vector jv (mj, user_pref.do_fortran_indexing, "column",
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1592 columns ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1593 if (! jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1594 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1595
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1596 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1597 int new_nr = nr;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1598 if (nr == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1599 new_nr = rhs_nr;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1600
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1601 if (indexed_assign_conforms (new_nr, jv.capacity (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1602 rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1603 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1604 maybe_resize (new_nr-1, jv.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1605 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1606 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1607 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1608 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1609 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1610 if (jv.max () >= columns ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1611 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1612 ::error ("A(:,matrix) = []: column index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1613 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1614 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1615 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1616 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1617 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1618 ::error ("A(:,matrix) = X: the number of rows in X must match the");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1619 ::error ("number of rows in A, and the number of columns in X must");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1620 ::error ("match the number of elements in matrix");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1621 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1622 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1623
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1624 do_matrix_assignment (rhs, magic_colon, jv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1625 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1626 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1627
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1628 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1629 gripe_string_invalid ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1630 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1631
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1632 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1633 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1634 Range rj = tmp_j.range_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1635 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1636 int new_nr = nr;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1637 if (nr == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1638 new_nr = rhs_nr;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1639
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1640 if (indexed_assign_conforms (new_nr, rj.nelem (), rhs_nr, rhs_nc))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1641 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1642 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1643 if (nc == 2 && is_zero_one (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1644 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1645 do_matrix_assignment (rhs, magic_colon, 1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1646 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1647 else if (nc == 2 && is_one_zero (rj) && rhs_nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1648 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1649 do_matrix_assignment (rhs, magic_colon, 0);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1650 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1651 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1652 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1653 if (index_check (rj, "column") < 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1654 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1655 maybe_resize (new_nr-1, tree_to_mat_idx (rj.max ()));
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1656 if (error_state)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1657 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1658 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1659 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1660 else if (rhs_nr == 0 && rhs_nc == 0)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1661 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1662 int b = tree_to_mat_idx (rj.min ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1663 int l = tree_to_mat_idx (rj.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1664 if (b < 0 || l >= columns ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1665 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1666 ::error ("A(:,range) = []: column index out of range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1667 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1668 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1669 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1670 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1671 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1672 ::error ("A(:,range) = X: the number of rows in X must match the");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1673 ::error ("number of rows in A, and the number of columns in X");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1674 ::error ("must match the number of elements in range");
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1675 return;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1676 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1677
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1678 do_matrix_assignment (rhs, magic_colon, rj);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1679 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1680 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1681
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1682 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1683 // a(:,:) = foo is equivalent to a = foo.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1684 do_matrix_assignment (rhs, magic_colon, magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1685 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1686
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1687 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1688 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1689 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1690 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1691 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1692
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1693 // Functions that actually handle assignment to a matrix using two
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1694 // index values.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1695 //
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1696 // idx2
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1697 // +---+---+----+----+
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1698 // idx1 | i | v | r | c |
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1699 // ---------+---+---+----+----+
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1700 // integer | 1 | 5 | 9 | 13 |
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1701 // ---------+---+---+----+----+
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1702 // vector | 2 | 6 | 10 | 14 |
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1703 // ---------+---+---+----+----+
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1704 // range | 3 | 7 | 11 | 15 |
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1705 // ---------+---+---+----+----+
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1706 // colon | 4 | 8 | 12 | 16 |
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1707 // ---------+---+---+----+----+
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1708
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1709 /* 1 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1710 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1711 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i, int j)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1712 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1713 REP_ELEM_ASSIGN (i, j, rhs.double_value (), rhs.complex_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1714 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1715 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1716
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1717 /* 2 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1718 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1719 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i, idx_vector& jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1720 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1721 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1722
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1723 for (int j = 0; j < jv.capacity (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1724 REP_ELEM_ASSIGN (i, jv.elem (j), rhs_m.elem (0, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1725 rhs_cm.elem (0, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1726 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1727
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1728 /* 3 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1729 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1730 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i, Range& rj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1731 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1732 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1733
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1734 double b = rj.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1735 double increment = rj.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1736
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1737 for (int j = 0; j < rj.nelem (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1738 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1739 double tmp = b + j * increment;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1740 int col = tree_to_mat_idx (tmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1741 REP_ELEM_ASSIGN (i, col, rhs_m.elem (0, j), rhs_cm.elem (0, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1742 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1743 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1744 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1745
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1746 /* 4 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1747 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1748 TC_REP::do_matrix_assignment (const tree_constant& rhs, int i,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1749 TC_REP::constant_type mcj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1750 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1751 assert (mcj == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1752
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1753 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1754
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1755 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1756 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1757 delete_row (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1758 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1759 else if (rhs.is_matrix_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1760 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1761 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1762
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1763 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1764 REP_ELEM_ASSIGN (i, j, rhs_m.elem (0, j), rhs_cm.elem (0, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1765 rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1766 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1767 else if (rhs.is_scalar_type () && nc == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1768 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1769 REP_ELEM_ASSIGN (i, 0, rhs.double_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1770 rhs.complex_value (), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1771 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1772 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1773 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1774 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1775
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1776 /* 5 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1777 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1778 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1779 idx_vector& iv, int j)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1780 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1781 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1782
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1783 for (int i = 0; i < iv.capacity (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1784 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1785 int row = iv.elem (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1786 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1787 rhs_cm.elem (i, 0), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1788 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1789 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1790
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1791 /* 6 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1792 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1793 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1794 idx_vector& iv, idx_vector& jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1795 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1796 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1797
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1798 for (int i = 0; i < iv.capacity (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1799 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1800 int row = iv.elem (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1801 for (int j = 0; j < jv.capacity (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1802 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1803 int col = jv.elem (j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1804 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1805 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1806 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1807 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1808 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1809
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1810 /* 7 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1811 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1812 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1813 idx_vector& iv, Range& rj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1814 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1815 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1816
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1817 double b = rj.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1818 double increment = rj.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1819
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1820 for (int i = 0; i < iv.capacity (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1821 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1822 int row = iv.elem (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1823 for (int j = 0; j < rj.nelem (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1824 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1825 double tmp = b + j * increment;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1826 int col = tree_to_mat_idx (tmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1827 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1828 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1829 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1830 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1831 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1832
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1833 /* 8 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1834 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1835 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1836 idx_vector& iv, TC_REP::constant_type mcj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1837 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1838 assert (mcj == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1839
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1840 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1841 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1842 delete_rows (iv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1843 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1844 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1845 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1846 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1847
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1848 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1849
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1850 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1851 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1852 for (int i = 0; i < iv.capacity (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1853 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1854 int row = iv.elem (i);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1855 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1856 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1857 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1858 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1859 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1860 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1861
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1862 /* 9 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1863 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1864 TC_REP::do_matrix_assignment (const tree_constant& rhs, Range& ri, int j)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1865 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1866 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1867
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1868 double b = ri.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1869 double increment = ri.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1870
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1871 for (int i = 0; i < ri.nelem (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1872 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1873 double tmp = b + i * increment;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1874 int row = tree_to_mat_idx (tmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1875 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, 0),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1876 rhs_cm.elem (i, 0), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1877 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1878 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1879
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1880 /* 10 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1881 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1882 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1883 Range& ri, idx_vector& jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1884 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1885 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1886
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1887 double b = ri.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1888 double increment = ri.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1889
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1890 for (int j = 0; j < jv.capacity (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1891 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1892 int col = jv.elem (j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1893 for (int i = 0; i < ri.nelem (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1894 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1895 double tmp = b + i * increment;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1896 int row = tree_to_mat_idx (tmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1897 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1898 rhs_m.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1899 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1900 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1901 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1902
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1903 /* 11 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1904 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1905 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1906 Range& ri, Range& rj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1907 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1908 double ib = ri.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1909 double iinc = ri.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1910 double jb = rj.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1911 double jinc = rj.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1912
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1913 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1914
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1915 for (int i = 0; i < ri.nelem (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1916 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1917 double itmp = ib + i * iinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1918 int row = tree_to_mat_idx (itmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1919 for (int j = 0; j < rj.nelem (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1920 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1921 double jtmp = jb + j * jinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1922 int col = tree_to_mat_idx (jtmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1923 REP_ELEM_ASSIGN (row, col, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1924 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1925 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1926 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1927 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1928
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1929 /* 12 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1930 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1931 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1932 Range& ri, TC_REP::constant_type mcj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1933 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1934 assert (mcj == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1935
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1936 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1937 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1938 delete_rows (ri);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1939 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1940 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1941 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1942 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1943
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1944 double ib = ri.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1945 double iinc = ri.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1946
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1947 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1948
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1949 for (int i = 0; i < ri.nelem (); i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1950 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1951 double itmp = ib + i * iinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1952 int row = tree_to_mat_idx (itmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1953 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1954 REP_ELEM_ASSIGN (row, j, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1955 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1956 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1957 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1958 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1959
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1960 /* 13 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1961 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1962 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1963 TC_REP::constant_type mci, int j)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1964 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1965 assert (mci == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1966
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1967 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1968
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1969 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1970 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1971 delete_column (j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1972 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1973 else if (rhs.is_matrix_type ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1974 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1975 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1976
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1977 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1978 REP_ELEM_ASSIGN (i, j, rhs_m.elem (i, 0),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1979 rhs_cm.elem (i, 0), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1980 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1981 else if (rhs.is_scalar_type () && nr == 1)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1982 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1983 REP_ELEM_ASSIGN (0, j, rhs.double_value (),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1984 rhs.complex_value (), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1985 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1986 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1987 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1988 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1989
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1990 /* 14 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1991 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1992 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1993 TC_REP::constant_type mci, idx_vector& jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1994 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1995 assert (mci == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1996
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1997 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1998 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
1999 delete_columns (jv);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2000 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2001 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2002 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2003 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2004
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2005 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2006
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2007 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2008 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2009 for (int j = 0; j < jv.capacity (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2010 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2011 int col = jv.elem (j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2012 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2013 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2014 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2015 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2016 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2017 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2018
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2019 /* 15 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2020 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2021 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2022 TC_REP::constant_type mci, Range& rj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2023 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2024 assert (mci == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2025
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2026 if (rhs.is_zero_by_zero ())
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2027 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2028 delete_columns (rj);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2029 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2030 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2031 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2032 REP_RHS_MATRIX (rhs, rhs_m, rhs_cm, rhs_nr, rhs_nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2033
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2034 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2035
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2036 double jb = rj.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2037 double jinc = rj.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2038
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2039 for (int j = 0; j < rj.nelem (); j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2040 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2041 double jtmp = jb + j * jinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2042 int col = tree_to_mat_idx (jtmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2043 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2044 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2045 REP_ELEM_ASSIGN (i, col, rhs_m.elem (i, j),
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2046 rhs_cm.elem (i, j), rhs.is_real_type ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2047 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2048 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2049 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2050 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2051
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2052 /* 16 */
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2053 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2054 TC_REP::do_matrix_assignment (const tree_constant& rhs,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2055 TC_REP::constant_type mci,
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2056 TC_REP::constant_type mcj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2057 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2058 assert (mci == magic_colon && mcj == magic_colon);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2059
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2060 switch (type_tag)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2061 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2062 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2063 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2064
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2065 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2066 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2067 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2068
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2069 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2070 delete complex_scalar;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2071 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2072
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2073 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2074 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2075 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2076
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2077 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2078 delete [] string;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2079 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2080
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2081 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2082 delete range;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2083 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2084
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2085 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2086 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2087 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2088 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2089 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2090
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2091 type_tag = rhs.const_type ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2092
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2093 switch (type_tag)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2094 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2095 case scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2096 scalar = rhs.double_value ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2097 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2098
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2099 case matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2100 matrix = new Matrix (rhs.matrix_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2101 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2102
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2103 case string_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2104 string = strsave (rhs.string_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2105 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2106
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2107 case complex_matrix_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2108 complex_matrix = new ComplexMatrix (rhs.complex_matrix_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2109 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2110
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2111 case complex_scalar_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2112 complex_scalar = new Complex (rhs.complex_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2113 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2114
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2115 case range_constant:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2116 range = new Range (rhs.range_value ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2117 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2118
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2119 case magic_colon:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2120 default:
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2121 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2122 break;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2123 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2124 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2125
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2126 // Functions for deleting rows or columns of a matrix. These are used
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2127 // to handle statements like
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2128 //
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2129 // M (i, j) = []
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2130
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2131 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2132 TC_REP::delete_row (int idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2133 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2134 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2135 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2136 int nr = matrix->rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2137 int nc = matrix->columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2138 Matrix *new_matrix = new Matrix (nr-1, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2139 int ii = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2140 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2141 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2142 if (i != idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2143 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2144 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2145 new_matrix->elem (ii, j) = matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2146 ii++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2147 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2148 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2149 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2150 matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2151 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2152 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2153 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2154 int nr = complex_matrix->rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2155 int nc = complex_matrix->columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2156 ComplexMatrix *new_matrix = new ComplexMatrix (nr-1, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2157 int ii = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2158 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2159 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2160 if (i != idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2161 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2162 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2163 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2164 ii++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2165 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2166 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2167 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2168 complex_matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2169 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2170 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2171 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2172 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2173
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2174 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2175 TC_REP::delete_rows (idx_vector& iv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2176 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2177 iv.sort_uniq ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2178 int num_to_delete = iv.length ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2179
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2180 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2181 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2182
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2183 // If deleting all rows of a column vector, make result 0x0.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2184 if (nc == 1 && num_to_delete == nr)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2185 nc = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2186
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2187 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2188 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2189 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2190 if (nr > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2191 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2192 int ii = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2193 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2194 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2195 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2196 if (i == iv.elem (idx))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2197 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2198 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2199 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2200 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2201 new_matrix->elem (ii, j) = matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2202 ii++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2203 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2204 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2205 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2206 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2207 matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2208 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2209 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2210 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2211 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2212 if (nr > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2213 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2214 int ii = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2215 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2216 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2217 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2218 if (i == iv.elem (idx))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2219 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2220 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2221 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2222 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2223 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2224 ii++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2225 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2226 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2227 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2228 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2229 complex_matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2230 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2231 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2232 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2233 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2234
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2235 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2236 TC_REP::delete_rows (Range& ri)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2237 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2238 ri.sort ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2239 int num_to_delete = ri.nelem ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2240
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2241 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2242 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2243
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2244 // If deleting all rows of a column vector, make result 0x0.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2245 if (nc == 1 && num_to_delete == nr)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2246 nc = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2247
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2248 double ib = ri.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2249 double iinc = ri.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2250
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2251 int max_idx = tree_to_mat_idx (ri.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2252
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2253 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2254 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2255 Matrix *new_matrix = new Matrix (nr-num_to_delete, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2256 if (nr > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2257 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2258 int ii = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2259 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2260 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2261 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2262 double itmp = ib + idx * iinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2263 int row = tree_to_mat_idx (itmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2264
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2265 if (i == row && row <= max_idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2266 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2267 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2268 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2269 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2270 new_matrix->elem (ii, j) = matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2271 ii++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2272 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2273 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2274 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2275 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2276 matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2277 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2278 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2279 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2280 ComplexMatrix *new_matrix = new ComplexMatrix (nr-num_to_delete, nc);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2281 if (nr > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2282 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2283 int ii = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2284 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2285 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2286 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2287 double itmp = ib + idx * iinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2288 int row = tree_to_mat_idx (itmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2289
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2290 if (i == row && row <= max_idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2291 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2292 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2293 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2294 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2295 new_matrix->elem (ii, j) = complex_matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2296 ii++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2297 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2298 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2299 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2300 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2301 complex_matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2302 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2303 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2304 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2305 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2306
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2307 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2308 TC_REP::delete_column (int idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2309 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2310 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2311 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2312 int nr = matrix->rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2313 int nc = matrix->columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2314 Matrix *new_matrix = new Matrix (nr, nc-1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2315 int jj = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2316 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2317 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2318 if (j != idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2319 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2320 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2321 new_matrix->elem (i, jj) = matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2322 jj++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2323 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2324 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2325 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2326 matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2327 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2328 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2329 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2330 int nr = complex_matrix->rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2331 int nc = complex_matrix->columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2332 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-1);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2333 int jj = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2334 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2335 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2336 if (j != idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2337 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2338 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2339 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2340 jj++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2341 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2342 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2343 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2344 complex_matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2345 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2346 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2347 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2348 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2349
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2350 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2351 TC_REP::delete_columns (idx_vector& jv)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2352 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2353 jv.sort_uniq ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2354 int num_to_delete = jv.length ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2355
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2356 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2357 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2358
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2359 // If deleting all columns of a row vector, make result 0x0.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2360 if (nr == 1 && num_to_delete == nc)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2361 nr = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2362
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2363 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2364 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2365 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2366 if (nc > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2367 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2368 int jj = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2369 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2370 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2371 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2372 if (j == jv.elem (idx))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2373 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2374 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2375 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2376 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2377 new_matrix->elem (i, jj) = matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2378 jj++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2379 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2380 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2381 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2382 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2383 matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2384 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2385 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2386 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2387 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2388 if (nc > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2389 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2390 int jj = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2391 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2392 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2393 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2394 if (j == jv.elem (idx))
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2395 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2396 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2397 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2398 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2399 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2400 jj++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2401 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2402 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2403 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2404 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2405 complex_matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2406 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2407 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2408 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2409 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2410
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2411 void
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2412 TC_REP::delete_columns (Range& rj)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2413 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2414 rj.sort ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2415 int num_to_delete = rj.nelem ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2416
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2417 int nr = rows ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2418 int nc = columns ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2419
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2420 // If deleting all columns of a row vector, make result 0x0.
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2421 if (nr == 1 && num_to_delete == nc)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2422 nr = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2423
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2424 double jb = rj.base ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2425 double jinc = rj.inc ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2426
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2427 int max_idx = tree_to_mat_idx (rj.max ());
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2428
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2429 if (type_tag == matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2430 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2431 Matrix *new_matrix = new Matrix (nr, nc-num_to_delete);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2432 if (nc > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2433 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2434 int jj = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2435 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2436 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2437 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2438 double jtmp = jb + idx * jinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2439 int col = tree_to_mat_idx (jtmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2440
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2441 if (j == col && col <= max_idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2442 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2443 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2444 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2445 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2446 new_matrix->elem (i, jj) = matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2447 jj++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2448 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2449 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2450 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2451 delete matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2452 matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2453 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2454 else if (type_tag == complex_matrix_constant)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2455 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2456 ComplexMatrix *new_matrix = new ComplexMatrix (nr, nc-num_to_delete);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2457 if (nc > num_to_delete)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2458 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2459 int jj = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2460 int idx = 0;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2461 for (int j = 0; j < nc; j++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2462 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2463 double jtmp = jb + idx * jinc;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2464 int col = tree_to_mat_idx (jtmp);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2465
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2466 if (j == col && col <= max_idx)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2467 idx++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2468 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2469 {
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2470 for (int i = 0; i < nr; i++)
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2471 new_matrix->elem (i, jj) = complex_matrix->elem (i, j);
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2472 jj++;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2473 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2474 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2475 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2476 delete complex_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2477 complex_matrix = new_matrix;
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2478 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2479 else
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2480 panic_impossible ();
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2481 }
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2482
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2483 /*
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2484 ;;; Local Variables: ***
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2485 ;;; mode: C++ ***
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2486 ;;; page-delimiter: "^/\\*" ***
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2487 ;;; End: ***
a778feb295b4 [project @ 1994-09-30 14:54:07 by jwe]
jwe
parents:
diff changeset
2488 */