1 | ///
|
---|
2 | /// This file is part of ILNumerics Community Edition.
|
---|
3 | ///
|
---|
4 | /// ILNumerics Community Edition - high performance computing for applications.
|
---|
5 | /// Copyright (C) 2006 - 2012 Haymo Kutschbach, http://ilnumerics.net
|
---|
6 | ///
|
---|
7 | /// ILNumerics Community Edition is free software: you can redistribute it and/or modify
|
---|
8 | /// it under the terms of the GNU General Public License version 3 as published by
|
---|
9 | /// the Free Software Foundation.
|
---|
10 | ///
|
---|
11 | /// ILNumerics Community Edition is distributed in the hope that it will be useful,
|
---|
12 | /// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
14 | /// GNU General Public License for more details.
|
---|
15 | ///
|
---|
16 | /// You should have received a copy of the GNU General Public License
|
---|
17 | /// along with ILNumerics Community Edition. See the file License.txt in the root
|
---|
18 | /// of your distribution package. If not, see <http://www.gnu.org/licenses/>.
|
---|
19 | ///
|
---|
20 | /// In addition this software uses the following components and/or licenses:
|
---|
21 | ///
|
---|
22 | /// =================================================================================
|
---|
23 | /// The Open Toolkit Library License
|
---|
24 | ///
|
---|
25 | /// Copyright (c) 2006 - 2009 the Open Toolkit library.
|
---|
26 | ///
|
---|
27 | /// Permission is hereby granted, free of charge, to any person obtaining a copy
|
---|
28 | /// of this software and associated documentation files (the "Software"), to deal
|
---|
29 | /// in the Software without restriction, including without limitation the rights to
|
---|
30 | /// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
---|
31 | /// the Software, and to permit persons to whom the Software is furnished to do
|
---|
32 | /// so, subject to the following conditions:
|
---|
33 | ///
|
---|
34 | /// The above copyright notice and this permission notice shall be included in all
|
---|
35 | /// copies or substantial portions of the Software.
|
---|
36 | ///
|
---|
37 | /// =================================================================================
|
---|
38 | ///
|
---|
39 |
|
---|
40 | using System;
|
---|
41 | using System.Collections.Generic;
|
---|
42 | using System.Text;
|
---|
43 | using System.IO;
|
---|
44 | using System.Runtime.Serialization;
|
---|
45 | using System.Runtime.CompilerServices;
|
---|
46 | using System.Numerics;
|
---|
47 | using ILNumerics.Misc;
|
---|
48 | using ILNumerics.Data;
|
---|
49 | using ILNumerics.Exceptions;
|
---|
50 | using System.Linq.Expressions;
|
---|
51 |
|
---|
52 | namespace ILNumerics.Storage {
|
---|
53 |
|
---|
54 | /// <summary>
|
---|
55 | /// The class realizes an internal storage wrapper. It stores the internal data array
|
---|
56 | /// and the dimension specifications for both: ILRetArray and ILDenseStorage (reference and solid).
|
---|
57 | /// </summary>
|
---|
58 | [System.Diagnostics.DebuggerTypeProxy(typeof(ILNumerics.Misc.ILArrayDebuggerProxy<>))]
|
---|
59 | [System.Diagnostics.DebuggerDisplay("{ShortInfo(),nq}")]
|
---|
60 | [Serializable]
|
---|
61 | internal partial class ILDenseStorage<ElementType> : ILStorage<ElementType> {
|
---|
62 |
|
---|
63 | #region attributes
|
---|
64 | /// <summary>
|
---|
65 | /// Internal storage object. Contains the final System.Array storage and a reference counter.
|
---|
66 | /// </summary>
|
---|
67 | [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
|
---|
68 | protected ILCountableArray<ElementType> m_data;
|
---|
69 | #endregion
|
---|
70 |
|
---|
71 | #region properties
|
---|
72 |
|
---|
73 | /// <summary>
|
---|
74 | /// number of storages referencing the current data array
|
---|
75 | /// </summary>
|
---|
76 | internal int ReferenceCount {
|
---|
77 | get {
|
---|
78 | return m_data.ReferenceCount;
|
---|
79 | }
|
---|
80 | }
|
---|
81 |
|
---|
82 | /// <summary>
|
---|
83 | /// Determine, if this storage has already been disposed.
|
---|
84 | /// </summary>
|
---|
85 | internal override bool IsDisposed {
|
---|
86 | get {
|
---|
87 | return m_data == null;
|
---|
88 | }
|
---|
89 | }
|
---|
90 | protected ILCountableArray<ElementType> Data {
|
---|
91 | get {
|
---|
92 | return m_data;
|
---|
93 | }
|
---|
94 | set {
|
---|
95 | ILCountableArray<ElementType> old = m_data;
|
---|
96 | m_data = value;
|
---|
97 | m_data.IncreaseReference();
|
---|
98 | if (old != null)
|
---|
99 | old.DecreaseReference();
|
---|
100 | }
|
---|
101 | }
|
---|
102 | /// <summary>
|
---|
103 | /// Get minimum and maximum value of all elements - if these exist.
|
---|
104 | /// </summary>
|
---|
105 | /// <param name="minValue">Output: minimum value.</param>
|
---|
106 | /// <param name="maxValue">Output: maximum value.</param>
|
---|
107 | /// <returns>True if the limits exists and could be computed, false otherwise.</returns>
|
---|
108 | /// <remarks>Empty arrays will return false. The output parameter will be default(type).</remarks>
|
---|
109 | internal override bool GetLimits(out ElementType minValue, out ElementType maxValue) {
|
---|
110 | return GetLimits(out minValue, out maxValue, true);
|
---|
111 | }
|
---|
112 | /// <summary>
|
---|
113 | /// Get minimum and maximum value of all elements - if existing
|
---|
114 | /// </summary>
|
---|
115 | /// <param name="minValue">Output: minimum value.</param>
|
---|
116 | /// <param name="maxValue">Output: maximum value.</param>
|
---|
117 | /// <param name="includeInfNaNs">true: recognize Inf, NaN values; false: ignore those values</param>
|
---|
118 | /// <returns>True if the limits exists and could be computed, false otherwise.</returns>
|
---|
119 | /// <remarks>Empty arrays will return false. The output parameter will be default(ElementType) then.</remarks>
|
---|
120 | internal override bool GetLimits(out ElementType minValue, out ElementType maxValue, bool includeInfNaNs) {
|
---|
121 | minValue = default(ElementType);
|
---|
122 | maxValue = default(ElementType);
|
---|
123 | if (m_size.NumberOfElements == 0)
|
---|
124 | return false;
|
---|
125 | if (false) {
|
---|
126 | |
---|
127 |
|
---|
128 | } else if (this is ILDenseStorage<double> ) {
|
---|
129 | double [] data = ( double [])(object) GetArrayForRead();
|
---|
130 | double curVal;
|
---|
131 | double curMin = Double.PositiveInfinity ;
|
---|
132 | double curMax = Double.NegativeInfinity ;
|
---|
133 | int curMinInd = 0;
|
---|
134 | int curMaxInd = 0;
|
---|
135 | int len = m_size.NumberOfElements;
|
---|
136 |
|
---|
137 | for (int i = 0; i < len; i++) {
|
---|
138 | curVal = data[i];
|
---|
139 |
|
---|
140 | if (double.IsInfinity(curVal)) continue;
|
---|
141 | if (curVal < curMin) {
|
---|
142 | curMin = curVal;
|
---|
143 | curMinInd = i;
|
---|
144 | }
|
---|
145 | if (curVal > curMax) {
|
---|
146 | curMax = curVal;
|
---|
147 | curMaxInd = i;
|
---|
148 | }
|
---|
149 | }
|
---|
150 | maxValue = m_data.Data[curMaxInd];
|
---|
151 | minValue = m_data.Data[curMinInd];
|
---|
152 | return (curMax > Double.NegativeInfinity || curMin < Double.PositiveInfinity );
|
---|
153 | |
---|
154 | #region HYCALPER AUTO GENERATED CODE
|
---|
155 | |
---|
156 |
|
---|
157 | } else if (this is ILDenseStorage<fcomplex> ) {
|
---|
158 | fcomplex [] data = ( fcomplex [])(object) GetArrayForRead();
|
---|
159 | fcomplex curVal;
|
---|
160 | fcomplex curMin = new fcomplex(float.PositiveInfinity,float.PositiveInfinity) ;
|
---|
161 | fcomplex curMax = new fcomplex(float.NegativeInfinity,float.NegativeInfinity) ;
|
---|
162 | int curMinInd = 0;
|
---|
163 | int curMaxInd = 0;
|
---|
164 | int len = m_size.NumberOfElements;
|
---|
165 |
|
---|
166 | for (int i = 0; i < len; i++) {
|
---|
167 | curVal = data[i];
|
---|
168 | if (fcomplex.IsInfinity(curVal)) continue;
|
---|
169 | if (curVal < curMin) {
|
---|
170 | curMin = curVal;
|
---|
171 | curMinInd = i;
|
---|
172 | }
|
---|
173 | if (curVal > curMax) {
|
---|
174 | curMax = curVal;
|
---|
175 | curMaxInd = i;
|
---|
176 | }
|
---|
177 | }
|
---|
178 | maxValue = m_data.Data[curMaxInd];
|
---|
179 | minValue = m_data.Data[curMinInd];
|
---|
180 | return (curMax > new fcomplex(float.NegativeInfinity,float.NegativeInfinity) || curMin < new fcomplex(float.NegativeInfinity,float.NegativeInfinity) );
|
---|
181 |
|
---|
182 | } else if (this is ILDenseStorage<complex> ) {
|
---|
183 | complex [] data = ( complex [])(object) GetArrayForRead();
|
---|
184 | complex curVal;
|
---|
185 | complex curMin = new complex(Double.PositiveInfinity,Double.PositiveInfinity) ;
|
---|
186 | complex curMax = new complex(Double.NegativeInfinity,Double.NegativeInfinity) ;
|
---|
187 | int curMinInd = 0;
|
---|
188 | int curMaxInd = 0;
|
---|
189 | int len = m_size.NumberOfElements;
|
---|
190 |
|
---|
191 | for (int i = 0; i < len; i++) {
|
---|
192 | curVal = data[i];
|
---|
193 | if (complex.IsInfinity(curVal)) continue;
|
---|
194 | if (curVal < curMin) {
|
---|
195 | curMin = curVal;
|
---|
196 | curMinInd = i;
|
---|
197 | }
|
---|
198 | if (curVal > curMax) {
|
---|
199 | curMax = curVal;
|
---|
200 | curMaxInd = i;
|
---|
201 | }
|
---|
202 | }
|
---|
203 | maxValue = m_data.Data[curMaxInd];
|
---|
204 | minValue = m_data.Data[curMinInd];
|
---|
205 | return (curMax > new complex(Double.NegativeInfinity,Double.NegativeInfinity) || curMin < new complex(Double.NegativeInfinity,Double.NegativeInfinity) );
|
---|
206 |
|
---|
207 | } else if (this is ILDenseStorage<byte> ) {
|
---|
208 | byte [] data = ( byte [])(object) GetArrayForRead();
|
---|
209 | byte curVal;
|
---|
210 | byte curMin = Byte.MaxValue ;
|
---|
211 | byte curMax = Byte.MinValue ;
|
---|
212 | int curMinInd = 0;
|
---|
213 | int curMaxInd = 0;
|
---|
214 | int len = m_size.NumberOfElements;
|
---|
215 |
|
---|
216 | for (int i = 0; i < len; i++) {
|
---|
217 | curVal = data[i];
|
---|
218 |
|
---|
219 | if (curVal < curMin) {
|
---|
220 | curMin = curVal;
|
---|
221 | curMinInd = i;
|
---|
222 | }
|
---|
223 | if (curVal > curMax) {
|
---|
224 | curMax = curVal;
|
---|
225 | curMaxInd = i;
|
---|
226 | }
|
---|
227 | }
|
---|
228 | maxValue = m_data.Data[curMaxInd];
|
---|
229 | minValue = m_data.Data[curMinInd];
|
---|
230 | return (curMax > Byte.MinValue || curMin < Byte.MinValue );
|
---|
231 |
|
---|
232 | } else if (this is ILDenseStorage<Int64> ) {
|
---|
233 | Int64 [] data = ( Int64 [])(object) GetArrayForRead();
|
---|
234 | Int64 curVal;
|
---|
235 | Int64 curMin = Int64.MaxValue ;
|
---|
236 | Int64 curMax = Int64.MinValue ;
|
---|
237 | int curMinInd = 0;
|
---|
238 | int curMaxInd = 0;
|
---|
239 | int len = m_size.NumberOfElements;
|
---|
240 |
|
---|
241 | for (int i = 0; i < len; i++) {
|
---|
242 | curVal = data[i];
|
---|
243 |
|
---|
244 | if (curVal < curMin) {
|
---|
245 | curMin = curVal;
|
---|
246 | curMinInd = i;
|
---|
247 | }
|
---|
248 | if (curVal > curMax) {
|
---|
249 | curMax = curVal;
|
---|
250 | curMaxInd = i;
|
---|
251 | }
|
---|
252 | }
|
---|
253 | maxValue = m_data.Data[curMaxInd];
|
---|
254 | minValue = m_data.Data[curMinInd];
|
---|
255 | return (curMax > Int64.MinValue || curMin < Int64.MinValue );
|
---|
256 |
|
---|
257 | } else if (this is ILDenseStorage<Int32> ) {
|
---|
258 | Int32 [] data = ( Int32 [])(object) GetArrayForRead();
|
---|
259 | Int32 curVal;
|
---|
260 | Int32 curMin = Int32.MaxValue ;
|
---|
261 | Int32 curMax = Int32.MinValue ;
|
---|
262 | int curMinInd = 0;
|
---|
263 | int curMaxInd = 0;
|
---|
264 | int len = m_size.NumberOfElements;
|
---|
265 |
|
---|
266 | for (int i = 0; i < len; i++) {
|
---|
267 | curVal = data[i];
|
---|
268 |
|
---|
269 | if (curVal < curMin) {
|
---|
270 | curMin = curVal;
|
---|
271 | curMinInd = i;
|
---|
272 | }
|
---|
273 | if (curVal > curMax) {
|
---|
274 | curMax = curVal;
|
---|
275 | curMaxInd = i;
|
---|
276 | }
|
---|
277 | }
|
---|
278 | maxValue = m_data.Data[curMaxInd];
|
---|
279 | minValue = m_data.Data[curMinInd];
|
---|
280 | return (curMax > Int32.MinValue || curMin < Int32.MinValue );
|
---|
281 |
|
---|
282 | } else if (this is ILDenseStorage<float> ) {
|
---|
283 | float [] data = ( float [])(object) GetArrayForRead();
|
---|
284 | float curVal;
|
---|
285 | float curMin = float.PositiveInfinity ;
|
---|
286 | float curMax = float.NegativeInfinity ;
|
---|
287 | int curMinInd = 0;
|
---|
288 | int curMaxInd = 0;
|
---|
289 | int len = m_size.NumberOfElements;
|
---|
290 |
|
---|
291 | for (int i = 0; i < len; i++) {
|
---|
292 | curVal = data[i];
|
---|
293 | if(float.IsInfinity(curVal)) continue;
|
---|
294 | if (curVal < curMin) {
|
---|
295 | curMin = curVal;
|
---|
296 | curMinInd = i;
|
---|
297 | }
|
---|
298 | if (curVal > curMax) {
|
---|
299 | curMax = curVal;
|
---|
300 | curMaxInd = i;
|
---|
301 | }
|
---|
302 | }
|
---|
303 | maxValue = m_data.Data[curMaxInd];
|
---|
304 | minValue = m_data.Data[curMinInd];
|
---|
305 | return (curMax > float.NegativeInfinity || curMin < float.NegativeInfinity );
|
---|
306 |
|
---|
307 | #endregion HYCALPER AUTO GENERATED CODE
|
---|
308 | } else if ((typeof(ElementType) is IComparable<ElementType>)) {
|
---|
309 | ElementType[] tmpArr = GetArrayForRead();
|
---|
310 | for (int i = 0; i < m_size.NumberOfElements; i++) {
|
---|
311 | ElementType val = tmpArr[i];
|
---|
312 | if (((IComparable<ElementType>)val).CompareTo(minValue) < 0)
|
---|
313 | minValue = val;
|
---|
314 | if (((IComparable<ElementType>)val).CompareTo(minValue) > 0)
|
---|
315 | maxValue = val;
|
---|
316 | }
|
---|
317 | return true;
|
---|
318 | }
|
---|
319 | return false;
|
---|
320 | }
|
---|
321 | #endregion
|
---|
322 |
|
---|
323 | #region overriding object.ToString(), Equals()
|
---|
324 | /// <summary>
|
---|
325 | /// Write information about the ILDenseStorage to string.
|
---|
326 | /// </summary>
|
---|
327 | /// <returns>String containing general information about the current instance of
|
---|
328 | /// ILDenseStorage and the formatted elements' values.</returns>
|
---|
329 | /// <remarks>If the number of elements exceeds a certain amount, the display will be abreviated.</remarks>
|
---|
330 | public override string ToString() {
|
---|
331 | return ValuesToString(0).ToString();
|
---|
332 | }
|
---|
333 | /// <summary>
|
---|
334 | /// print formated values to string
|
---|
335 | /// </summary>
|
---|
336 | /// <param name="maxLength">Maximum number of characters per line. 0: no limit</param>
|
---|
337 | /// <returns>StringBuilder object filled with formated values.</returns>
|
---|
338 | internal override StringBuilder ValuesToString(int maxLength) {
|
---|
339 | StringBuilder s = new StringBuilder();
|
---|
340 | if (maxLength <= 0) maxLength = int.MaxValue;
|
---|
341 | //if (m_dimensions.NumberOfElements > 100000) {
|
---|
342 | // s.Append(String.Format("({0})", m_dimensions.ToString()));
|
---|
343 | // return s;
|
---|
344 | //}
|
---|
345 | if (m_size.NumberOfElements < 1)
|
---|
346 | return new StringBuilder("(Empty)");
|
---|
347 | int[] acc = new int[m_size.NumberOfDimensions];
|
---|
348 | int d;
|
---|
349 | String sElement;
|
---|
350 | int elemLength = 10;
|
---|
351 | //string format = "{0,20: E13;-E13; 0.0 } ";
|
---|
352 | int curLineLength = 0, curRowsCount = 0;
|
---|
353 | int maxRows = (maxLength == int.MaxValue) ? int.MaxValue : 500; // limit data rows in debugger view
|
---|
354 | if (false) {
|
---|
355 | |
---|
356 |
|
---|
357 | } else if (this.Data.Data.GetType() == typeof( double [] )) {
|
---|
358 | #region
|
---|
359 | double element;
|
---|
360 | double [] elements = (this.Data.Data as double []);
|
---|
361 | elemLength = 10 ;
|
---|
362 |
|
---|
363 | double scaling = getScalingForPrint();
|
---|
364 | elemLength++;
|
---|
365 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
366 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
367 | // show only two first dimensions at the same time ...
|
---|
368 | // print header
|
---|
369 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
370 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
371 | s.Append("(:,:");
|
---|
372 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
373 | s.Append(String.Format(",{0}", acc[d]));
|
---|
374 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
375 | }
|
---|
376 | // show this for 2 leading dimensions
|
---|
377 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
378 | if (++curRowsCount > maxRows) {
|
---|
379 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
380 | return s;
|
---|
381 | }
|
---|
382 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
383 | acc[0] = d0; curLineLength = 0;
|
---|
384 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
385 | acc[1] = d1;
|
---|
386 | element = elements [m_size.IndexFromArray(acc)];
|
---|
387 | if (!Object.ReferenceEquals(element,null)) {
|
---|
388 |
|
---|
389 | sElement = String.Format ((scaling == 1 && (int)element == element) ? "{0} " : "{0:f5} ", element / scaling).PadLeft(elemLength);
|
---|
390 | } else {
|
---|
391 | sElement = "(null)".PadLeft(elemLength);
|
---|
392 | }
|
---|
393 | curLineLength += sElement.Length;
|
---|
394 | if (curLineLength > maxLength - " ...".Length) {
|
---|
395 | s.Append(" ...");
|
---|
396 | break;
|
---|
397 | } else {
|
---|
398 | s.Append(sElement);
|
---|
399 | }
|
---|
400 | }
|
---|
401 | }
|
---|
402 | // increase higher dimension
|
---|
403 | d = 2;
|
---|
404 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
405 | acc[d]++;
|
---|
406 | if (acc[d] < m_size[d]) break;
|
---|
407 | acc[d] = 0;
|
---|
408 | d++;
|
---|
409 | }
|
---|
410 | if (d >= m_size.NumberOfDimensions) break;
|
---|
411 | }
|
---|
412 | #endregion
|
---|
413 | |
---|
414 | #region HYCALPER AUTO GENERATED CODE
|
---|
415 | |
---|
416 |
|
---|
417 | } else if (this.Data.Data.GetType() == typeof( float [] )) {
|
---|
418 | #region
|
---|
419 | float element;
|
---|
420 | float [] elements = (this.Data.Data as float []);
|
---|
421 | elemLength = 5 ;
|
---|
422 | float scaling = (float)getScalingForPrint();
|
---|
423 | elemLength++;
|
---|
424 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
425 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
426 | // show only two first dimensions at the same time ...
|
---|
427 | // print header
|
---|
428 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
429 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
430 | s.Append("(:,:");
|
---|
431 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
432 | s.Append(String.Format(",{0}", acc[d]));
|
---|
433 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
434 | }
|
---|
435 | // show this for 2 leading dimensions
|
---|
436 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
437 | if (++curRowsCount > maxRows) {
|
---|
438 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
439 | return s;
|
---|
440 | }
|
---|
441 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
442 | acc[0] = d0; curLineLength = 0;
|
---|
443 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
444 | acc[1] = d1;
|
---|
445 | element = elements [m_size.IndexFromArray(acc)];
|
---|
446 | if (!Object.ReferenceEquals(element,null)) {
|
---|
447 | sElement = String.Format ("{0:f5} ", element / scaling).PadLeft(elemLength);
|
---|
448 | } else {
|
---|
449 | sElement = "(null)".PadLeft(elemLength);
|
---|
450 | }
|
---|
451 | curLineLength += sElement.Length;
|
---|
452 | if (curLineLength > maxLength - " ...".Length) {
|
---|
453 | s.Append(" ...");
|
---|
454 | break;
|
---|
455 | } else {
|
---|
456 | s.Append(sElement);
|
---|
457 | }
|
---|
458 | }
|
---|
459 | }
|
---|
460 | // increase higher dimension
|
---|
461 | d = 2;
|
---|
462 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
463 | acc[d]++;
|
---|
464 | if (acc[d] < m_size[d]) break;
|
---|
465 | acc[d] = 0;
|
---|
466 | d++;
|
---|
467 | }
|
---|
468 | if (d >= m_size.NumberOfDimensions) break;
|
---|
469 | }
|
---|
470 | #endregion
|
---|
471 |
|
---|
472 | } else if (this.Data.Data.GetType() == typeof( fcomplex [] )) {
|
---|
473 | #region
|
---|
474 | fcomplex element;
|
---|
475 | fcomplex [] elements = (this.Data.Data as fcomplex []);
|
---|
476 | elemLength = 24 ;
|
---|
477 | float scaling = (float)getScalingForPrint();
|
---|
478 | elemLength++;
|
---|
479 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
480 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
481 | // show only two first dimensions at the same time ...
|
---|
482 | // print header
|
---|
483 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
484 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
485 | s.Append("(:,:");
|
---|
486 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
487 | s.Append(String.Format(",{0}", acc[d]));
|
---|
488 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
489 | }
|
---|
490 | // show this for 2 leading dimensions
|
---|
491 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
492 | if (++curRowsCount > maxRows) {
|
---|
493 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
494 | return s;
|
---|
495 | }
|
---|
496 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
497 | acc[0] = d0; curLineLength = 0;
|
---|
498 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
499 | acc[1] = d1;
|
---|
500 | element = elements [m_size.IndexFromArray(acc)];
|
---|
501 | if (!Object.ReferenceEquals(element,null)) {
|
---|
502 | sElement = String.Format ("{0} ", (element / scaling).ToString(5)).PadLeft(elemLength);
|
---|
503 | } else {
|
---|
504 | sElement = "(null)".PadLeft(elemLength);
|
---|
505 | }
|
---|
506 | curLineLength += sElement.Length;
|
---|
507 | if (curLineLength > maxLength - " ...".Length) {
|
---|
508 | s.Append(" ...");
|
---|
509 | break;
|
---|
510 | } else {
|
---|
511 | s.Append(sElement);
|
---|
512 | }
|
---|
513 | }
|
---|
514 | }
|
---|
515 | // increase higher dimension
|
---|
516 | d = 2;
|
---|
517 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
518 | acc[d]++;
|
---|
519 | if (acc[d] < m_size[d]) break;
|
---|
520 | acc[d] = 0;
|
---|
521 | d++;
|
---|
522 | }
|
---|
523 | if (d >= m_size.NumberOfDimensions) break;
|
---|
524 | }
|
---|
525 | #endregion
|
---|
526 |
|
---|
527 | } else if (this.Data.Data.GetType() == typeof( complex [] )) {
|
---|
528 | #region
|
---|
529 | complex element;
|
---|
530 | complex [] elements = (this.Data.Data as complex []);
|
---|
531 | elemLength = 36 ;
|
---|
532 | double scaling = getScalingForPrint();
|
---|
533 | elemLength++;
|
---|
534 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
535 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
536 | // show only two first dimensions at the same time ...
|
---|
537 | // print header
|
---|
538 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
539 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
540 | s.Append("(:,:");
|
---|
541 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
542 | s.Append(String.Format(",{0}", acc[d]));
|
---|
543 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
544 | }
|
---|
545 | // show this for 2 leading dimensions
|
---|
546 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
547 | if (++curRowsCount > maxRows) {
|
---|
548 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
549 | return s;
|
---|
550 | }
|
---|
551 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
552 | acc[0] = d0; curLineLength = 0;
|
---|
553 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
554 | acc[1] = d1;
|
---|
555 | element = elements [m_size.IndexFromArray(acc)];
|
---|
556 | if (!Object.ReferenceEquals(element,null)) {
|
---|
557 | sElement = String.Format ("{0} ", (element / scaling).ToString(5)).PadLeft(elemLength);
|
---|
558 | } else {
|
---|
559 | sElement = "(null)".PadLeft(elemLength);
|
---|
560 | }
|
---|
561 | curLineLength += sElement.Length;
|
---|
562 | if (curLineLength > maxLength - " ...".Length) {
|
---|
563 | s.Append(" ...");
|
---|
564 | break;
|
---|
565 | } else {
|
---|
566 | s.Append(sElement);
|
---|
567 | }
|
---|
568 | }
|
---|
569 | }
|
---|
570 | // increase higher dimension
|
---|
571 | d = 2;
|
---|
572 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
573 | acc[d]++;
|
---|
574 | if (acc[d] < m_size[d]) break;
|
---|
575 | acc[d] = 0;
|
---|
576 | d++;
|
---|
577 | }
|
---|
578 | if (d >= m_size.NumberOfDimensions) break;
|
---|
579 | }
|
---|
580 | #endregion
|
---|
581 |
|
---|
582 | } else if (this.Data.Data.GetType() == typeof( Complex [] )) {
|
---|
583 | #region
|
---|
584 | Complex element;
|
---|
585 | Complex [] elements = (this.Data.Data as Complex []);
|
---|
586 | elemLength = 36 ;
|
---|
587 | double scaling = getScalingForPrint();
|
---|
588 | elemLength++;
|
---|
589 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
590 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
591 | // show only two first dimensions at the same time ...
|
---|
592 | // print header
|
---|
593 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
594 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
595 | s.Append("(:,:");
|
---|
596 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
597 | s.Append(String.Format(",{0}", acc[d]));
|
---|
598 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
599 | }
|
---|
600 | // show this for 2 leading dimensions
|
---|
601 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
602 | if (++curRowsCount > maxRows) {
|
---|
603 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
604 | return s;
|
---|
605 | }
|
---|
606 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
607 | acc[0] = d0; curLineLength = 0;
|
---|
608 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
609 | acc[1] = d1;
|
---|
610 | element = elements [m_size.IndexFromArray(acc)];
|
---|
611 | if (!Object.ReferenceEquals(element,null)) {
|
---|
612 | sElement = String.Format ("{0} ", ComplexHelper(element / scaling,5)).PadLeft(elemLength);
|
---|
613 | } else {
|
---|
614 | sElement = "(null)".PadLeft(elemLength);
|
---|
615 | }
|
---|
616 | curLineLength += sElement.Length;
|
---|
617 | if (curLineLength > maxLength - " ...".Length) {
|
---|
618 | s.Append(" ...");
|
---|
619 | break;
|
---|
620 | } else {
|
---|
621 | s.Append(sElement);
|
---|
622 | }
|
---|
623 | }
|
---|
624 | }
|
---|
625 | // increase higher dimension
|
---|
626 | d = 2;
|
---|
627 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
628 | acc[d]++;
|
---|
629 | if (acc[d] < m_size[d]) break;
|
---|
630 | acc[d] = 0;
|
---|
631 | d++;
|
---|
632 | }
|
---|
633 | if (d >= m_size.NumberOfDimensions) break;
|
---|
634 | }
|
---|
635 | #endregion
|
---|
636 |
|
---|
637 | } else if (this.Data.Data.GetType() == typeof( byte [] )) {
|
---|
638 | #region
|
---|
639 | byte element;
|
---|
640 | byte [] elements = (this.Data.Data as byte []);
|
---|
641 | elemLength = 3 ;
|
---|
642 | double scaling = 1.0;
|
---|
643 | elemLength++;
|
---|
644 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
645 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
646 | // show only two first dimensions at the same time ...
|
---|
647 | // print header
|
---|
648 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
649 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
650 | s.Append("(:,:");
|
---|
651 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
652 | s.Append(String.Format(",{0}", acc[d]));
|
---|
653 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
654 | }
|
---|
655 | // show this for 2 leading dimensions
|
---|
656 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
657 | if (++curRowsCount > maxRows) {
|
---|
658 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
659 | return s;
|
---|
660 | }
|
---|
661 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
662 | acc[0] = d0; curLineLength = 0;
|
---|
663 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
664 | acc[1] = d1;
|
---|
665 | element = elements [m_size.IndexFromArray(acc)];
|
---|
666 | if (!Object.ReferenceEquals(element,null)) {
|
---|
667 | sElement = String.Format ("{0,3:G} ", element).PadLeft(elemLength);
|
---|
668 | } else {
|
---|
669 | sElement = "(null)".PadLeft(elemLength);
|
---|
670 | }
|
---|
671 | curLineLength += sElement.Length;
|
---|
672 | if (curLineLength > maxLength - " ...".Length) {
|
---|
673 | s.Append(" ...");
|
---|
674 | break;
|
---|
675 | } else {
|
---|
676 | s.Append(sElement);
|
---|
677 | }
|
---|
678 | }
|
---|
679 | }
|
---|
680 | // increase higher dimension
|
---|
681 | d = 2;
|
---|
682 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
683 | acc[d]++;
|
---|
684 | if (acc[d] < m_size[d]) break;
|
---|
685 | acc[d] = 0;
|
---|
686 | d++;
|
---|
687 | }
|
---|
688 | if (d >= m_size.NumberOfDimensions) break;
|
---|
689 | }
|
---|
690 | #endregion
|
---|
691 |
|
---|
692 | } else if (this.Data.Data.GetType() == typeof( char [] )) {
|
---|
693 | #region
|
---|
694 | char element;
|
---|
695 | char [] elements = (this.Data.Data as char []);
|
---|
696 | elemLength = 3 ;
|
---|
697 | double scaling = 1.0;
|
---|
698 | elemLength++;
|
---|
699 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
700 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
701 | // show only two first dimensions at the same time ...
|
---|
702 | // print header
|
---|
703 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
704 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
705 | s.Append("(:,:");
|
---|
706 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
707 | s.Append(String.Format(",{0}", acc[d]));
|
---|
708 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
709 | }
|
---|
710 | // show this for 2 leading dimensions
|
---|
711 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
712 | if (++curRowsCount > maxRows) {
|
---|
713 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
714 | return s;
|
---|
715 | }
|
---|
716 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
717 | acc[0] = d0; curLineLength = 0;
|
---|
718 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
719 | acc[1] = d1;
|
---|
720 | element = elements [m_size.IndexFromArray(acc)];
|
---|
721 | if (!Object.ReferenceEquals(element,null)) {
|
---|
722 | sElement = String.Format ("{0,3:G} ", element).PadLeft(elemLength);
|
---|
723 | } else {
|
---|
724 | sElement = "(null)".PadLeft(elemLength);
|
---|
725 | }
|
---|
726 | curLineLength += sElement.Length;
|
---|
727 | if (curLineLength > maxLength - " ...".Length) {
|
---|
728 | s.Append(" ...");
|
---|
729 | break;
|
---|
730 | } else {
|
---|
731 | s.Append(sElement);
|
---|
732 | }
|
---|
733 | }
|
---|
734 | }
|
---|
735 | // increase higher dimension
|
---|
736 | d = 2;
|
---|
737 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
738 | acc[d]++;
|
---|
739 | if (acc[d] < m_size[d]) break;
|
---|
740 | acc[d] = 0;
|
---|
741 | d++;
|
---|
742 | }
|
---|
743 | if (d >= m_size.NumberOfDimensions) break;
|
---|
744 | }
|
---|
745 | #endregion
|
---|
746 |
|
---|
747 | } else if (this.Data.Data.GetType() == typeof( UInt64 [] )) {
|
---|
748 | #region
|
---|
749 | UInt64 element;
|
---|
750 | UInt64 [] elements = (this.Data.Data as UInt64 []);
|
---|
751 | elemLength = 18 ;
|
---|
752 | double scaling = 1.0;
|
---|
753 | elemLength++;
|
---|
754 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
755 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
756 | // show only two first dimensions at the same time ...
|
---|
757 | // print header
|
---|
758 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
759 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
760 | s.Append("(:,:");
|
---|
761 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
762 | s.Append(String.Format(",{0}", acc[d]));
|
---|
763 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
764 | }
|
---|
765 | // show this for 2 leading dimensions
|
---|
766 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
767 | if (++curRowsCount > maxRows) {
|
---|
768 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
769 | return s;
|
---|
770 | }
|
---|
771 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
772 | acc[0] = d0; curLineLength = 0;
|
---|
773 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
774 | acc[1] = d1;
|
---|
775 | element = elements [m_size.IndexFromArray(acc)];
|
---|
776 | if (!Object.ReferenceEquals(element,null)) {
|
---|
777 | sElement = String.Format ("{0,18:G} ", element).PadLeft(elemLength);
|
---|
778 | } else {
|
---|
779 | sElement = "(null)".PadLeft(elemLength);
|
---|
780 | }
|
---|
781 | curLineLength += sElement.Length;
|
---|
782 | if (curLineLength > maxLength - " ...".Length) {
|
---|
783 | s.Append(" ...");
|
---|
784 | break;
|
---|
785 | } else {
|
---|
786 | s.Append(sElement);
|
---|
787 | }
|
---|
788 | }
|
---|
789 | }
|
---|
790 | // increase higher dimension
|
---|
791 | d = 2;
|
---|
792 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
793 | acc[d]++;
|
---|
794 | if (acc[d] < m_size[d]) break;
|
---|
795 | acc[d] = 0;
|
---|
796 | d++;
|
---|
797 | }
|
---|
798 | if (d >= m_size.NumberOfDimensions) break;
|
---|
799 | }
|
---|
800 | #endregion
|
---|
801 |
|
---|
802 | } else if (this.Data.Data.GetType() == typeof( UInt32 [] )) {
|
---|
803 | #region
|
---|
804 | UInt32 element;
|
---|
805 | UInt32 [] elements = (this.Data.Data as UInt32 []);
|
---|
806 | elemLength = 10 ;
|
---|
807 | double scaling = 1.0;
|
---|
808 | elemLength++;
|
---|
809 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
810 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
811 | // show only two first dimensions at the same time ...
|
---|
812 | // print header
|
---|
813 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
814 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
815 | s.Append("(:,:");
|
---|
816 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
817 | s.Append(String.Format(",{0}", acc[d]));
|
---|
818 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
819 | }
|
---|
820 | // show this for 2 leading dimensions
|
---|
821 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
822 | if (++curRowsCount > maxRows) {
|
---|
823 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
824 | return s;
|
---|
825 | }
|
---|
826 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
827 | acc[0] = d0; curLineLength = 0;
|
---|
828 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
829 | acc[1] = d1;
|
---|
830 | element = elements [m_size.IndexFromArray(acc)];
|
---|
831 | if (!Object.ReferenceEquals(element,null)) {
|
---|
832 | sElement = String.Format ("{0,10:G} ", element).PadLeft(elemLength);
|
---|
833 | } else {
|
---|
834 | sElement = "(null)".PadLeft(elemLength);
|
---|
835 | }
|
---|
836 | curLineLength += sElement.Length;
|
---|
837 | if (curLineLength > maxLength - " ...".Length) {
|
---|
838 | s.Append(" ...");
|
---|
839 | break;
|
---|
840 | } else {
|
---|
841 | s.Append(sElement);
|
---|
842 | }
|
---|
843 | }
|
---|
844 | }
|
---|
845 | // increase higher dimension
|
---|
846 | d = 2;
|
---|
847 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
848 | acc[d]++;
|
---|
849 | if (acc[d] < m_size[d]) break;
|
---|
850 | acc[d] = 0;
|
---|
851 | d++;
|
---|
852 | }
|
---|
853 | if (d >= m_size.NumberOfDimensions) break;
|
---|
854 | }
|
---|
855 | #endregion
|
---|
856 |
|
---|
857 | } else if (this.Data.Data.GetType() == typeof( UInt16 [] )) {
|
---|
858 | #region
|
---|
859 | UInt16 element;
|
---|
860 | UInt16 [] elements = (this.Data.Data as UInt16 []);
|
---|
861 | elemLength = 5 ;
|
---|
862 | double scaling = 1.0;
|
---|
863 | elemLength++;
|
---|
864 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
865 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
866 | // show only two first dimensions at the same time ...
|
---|
867 | // print header
|
---|
868 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
869 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
870 | s.Append("(:,:");
|
---|
871 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
872 | s.Append(String.Format(",{0}", acc[d]));
|
---|
873 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
874 | }
|
---|
875 | // show this for 2 leading dimensions
|
---|
876 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
877 | if (++curRowsCount > maxRows) {
|
---|
878 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
879 | return s;
|
---|
880 | }
|
---|
881 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
882 | acc[0] = d0; curLineLength = 0;
|
---|
883 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
884 | acc[1] = d1;
|
---|
885 | element = elements [m_size.IndexFromArray(acc)];
|
---|
886 | if (!Object.ReferenceEquals(element,null)) {
|
---|
887 | sElement = String.Format ("{0,5:G} ", element).PadLeft(elemLength);
|
---|
888 | } else {
|
---|
889 | sElement = "(null)".PadLeft(elemLength);
|
---|
890 | }
|
---|
891 | curLineLength += sElement.Length;
|
---|
892 | if (curLineLength > maxLength - " ...".Length) {
|
---|
893 | s.Append(" ...");
|
---|
894 | break;
|
---|
895 | } else {
|
---|
896 | s.Append(sElement);
|
---|
897 | }
|
---|
898 | }
|
---|
899 | }
|
---|
900 | // increase higher dimension
|
---|
901 | d = 2;
|
---|
902 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
903 | acc[d]++;
|
---|
904 | if (acc[d] < m_size[d]) break;
|
---|
905 | acc[d] = 0;
|
---|
906 | d++;
|
---|
907 | }
|
---|
908 | if (d >= m_size.NumberOfDimensions) break;
|
---|
909 | }
|
---|
910 | #endregion
|
---|
911 |
|
---|
912 | } else if (this.Data.Data.GetType() == typeof( Int64 [] )) {
|
---|
913 | #region
|
---|
914 | Int64 element;
|
---|
915 | Int64 [] elements = (this.Data.Data as Int64 []);
|
---|
916 | elemLength = 18 ;
|
---|
917 | double scaling = 1.0;
|
---|
918 | elemLength++;
|
---|
919 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
920 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
921 | // show only two first dimensions at the same time ...
|
---|
922 | // print header
|
---|
923 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
924 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
925 | s.Append("(:,:");
|
---|
926 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
927 | s.Append(String.Format(",{0}", acc[d]));
|
---|
928 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
929 | }
|
---|
930 | // show this for 2 leading dimensions
|
---|
931 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
932 | if (++curRowsCount > maxRows) {
|
---|
933 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
934 | return s;
|
---|
935 | }
|
---|
936 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
937 | acc[0] = d0; curLineLength = 0;
|
---|
938 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
939 | acc[1] = d1;
|
---|
940 | element = elements [m_size.IndexFromArray(acc)];
|
---|
941 | if (!Object.ReferenceEquals(element,null)) {
|
---|
942 | sElement = String.Format ("{0,18:G} ", element).PadLeft(elemLength);
|
---|
943 | } else {
|
---|
944 | sElement = "(null)".PadLeft(elemLength);
|
---|
945 | }
|
---|
946 | curLineLength += sElement.Length;
|
---|
947 | if (curLineLength > maxLength - " ...".Length) {
|
---|
948 | s.Append(" ...");
|
---|
949 | break;
|
---|
950 | } else {
|
---|
951 | s.Append(sElement);
|
---|
952 | }
|
---|
953 | }
|
---|
954 | }
|
---|
955 | // increase higher dimension
|
---|
956 | d = 2;
|
---|
957 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
958 | acc[d]++;
|
---|
959 | if (acc[d] < m_size[d]) break;
|
---|
960 | acc[d] = 0;
|
---|
961 | d++;
|
---|
962 | }
|
---|
963 | if (d >= m_size.NumberOfDimensions) break;
|
---|
964 | }
|
---|
965 | #endregion
|
---|
966 |
|
---|
967 | } else if (this.Data.Data.GetType() == typeof( Int32 [] )) {
|
---|
968 | #region
|
---|
969 | Int32 element;
|
---|
970 | Int32 [] elements = (this.Data.Data as Int32 []);
|
---|
971 | elemLength = 10 ;
|
---|
972 | double scaling = 1.0;
|
---|
973 | elemLength++;
|
---|
974 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
975 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
976 | // show only two first dimensions at the same time ...
|
---|
977 | // print header
|
---|
978 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
979 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
980 | s.Append("(:,:");
|
---|
981 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
982 | s.Append(String.Format(",{0}", acc[d]));
|
---|
983 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
984 | }
|
---|
985 | // show this for 2 leading dimensions
|
---|
986 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
987 | if (++curRowsCount > maxRows) {
|
---|
988 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
989 | return s;
|
---|
990 | }
|
---|
991 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
992 | acc[0] = d0; curLineLength = 0;
|
---|
993 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
994 | acc[1] = d1;
|
---|
995 | element = elements [m_size.IndexFromArray(acc)];
|
---|
996 | if (!Object.ReferenceEquals(element,null)) {
|
---|
997 | sElement = String.Format ("{0,10:G} ", element).PadLeft(elemLength);
|
---|
998 | } else {
|
---|
999 | sElement = "(null)".PadLeft(elemLength);
|
---|
1000 | }
|
---|
1001 | curLineLength += sElement.Length;
|
---|
1002 | if (curLineLength > maxLength - " ...".Length) {
|
---|
1003 | s.Append(" ...");
|
---|
1004 | break;
|
---|
1005 | } else {
|
---|
1006 | s.Append(sElement);
|
---|
1007 | }
|
---|
1008 | }
|
---|
1009 | }
|
---|
1010 | // increase higher dimension
|
---|
1011 | d = 2;
|
---|
1012 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
1013 | acc[d]++;
|
---|
1014 | if (acc[d] < m_size[d]) break;
|
---|
1015 | acc[d] = 0;
|
---|
1016 | d++;
|
---|
1017 | }
|
---|
1018 | if (d >= m_size.NumberOfDimensions) break;
|
---|
1019 | }
|
---|
1020 | #endregion
|
---|
1021 |
|
---|
1022 | } else if (this.Data.Data.GetType() == typeof( Int16 [] )) {
|
---|
1023 | #region
|
---|
1024 | Int16 element;
|
---|
1025 | Int16 [] elements = (this.Data.Data as Int16 []);
|
---|
1026 | elemLength = 5 ;
|
---|
1027 | double scaling = 1.0;
|
---|
1028 | elemLength++;
|
---|
1029 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
1030 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
1031 | // show only two first dimensions at the same time ...
|
---|
1032 | // print header
|
---|
1033 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
1034 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1035 | s.Append("(:,:");
|
---|
1036 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
1037 | s.Append(String.Format(",{0}", acc[d]));
|
---|
1038 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
1039 | }
|
---|
1040 | // show this for 2 leading dimensions
|
---|
1041 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
1042 | if (++curRowsCount > maxRows) {
|
---|
1043 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
1044 | return s;
|
---|
1045 | }
|
---|
1046 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1047 | acc[0] = d0; curLineLength = 0;
|
---|
1048 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
1049 | acc[1] = d1;
|
---|
1050 | element = elements [m_size.IndexFromArray(acc)];
|
---|
1051 | if (!Object.ReferenceEquals(element,null)) {
|
---|
1052 | sElement = String.Format ("{0,5:G} ", element).PadLeft(elemLength);
|
---|
1053 | } else {
|
---|
1054 | sElement = "(null)".PadLeft(elemLength);
|
---|
1055 | }
|
---|
1056 | curLineLength += sElement.Length;
|
---|
1057 | if (curLineLength > maxLength - " ...".Length) {
|
---|
1058 | s.Append(" ...");
|
---|
1059 | break;
|
---|
1060 | } else {
|
---|
1061 | s.Append(sElement);
|
---|
1062 | }
|
---|
1063 | }
|
---|
1064 | }
|
---|
1065 | // increase higher dimension
|
---|
1066 | d = 2;
|
---|
1067 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
1068 | acc[d]++;
|
---|
1069 | if (acc[d] < m_size[d]) break;
|
---|
1070 | acc[d] = 0;
|
---|
1071 | d++;
|
---|
1072 | }
|
---|
1073 | if (d >= m_size.NumberOfDimensions) break;
|
---|
1074 | }
|
---|
1075 | #endregion
|
---|
1076 |
|
---|
1077 | } else if (this.Data.Data.GetType() == typeof( ILStorage [] )) {
|
---|
1078 | #region
|
---|
1079 | ILStorage element;
|
---|
1080 | ILStorage [] elements = (this.Data.Data as ILStorage []);
|
---|
1081 | elemLength = 0 ;
|
---|
1082 | double scaling = 1.0;
|
---|
1083 | for (int i = 0; i < m_size.NumberOfElements; i++) {
|
---|
1084 | element = elements[i];
|
---|
1085 | int l = (element == null)? 6 : element.ShortInfo().Length;
|
---|
1086 | if (l > elemLength) elemLength = l;
|
---|
1087 | }
|
---|
1088 |
|
---|
1089 | elemLength++;
|
---|
1090 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
1091 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
1092 | // show only two first dimensions at the same time ...
|
---|
1093 | // print header
|
---|
1094 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
1095 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1096 | s.Append("(:,:");
|
---|
1097 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
1098 | s.Append(String.Format(",{0}", acc[d]));
|
---|
1099 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
1100 | }
|
---|
1101 | // show this for 2 leading dimensions
|
---|
1102 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
1103 | if (++curRowsCount > maxRows) {
|
---|
1104 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
1105 | return s;
|
---|
1106 | }
|
---|
1107 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1108 | acc[0] = d0; curLineLength = 0;
|
---|
1109 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
1110 | acc[1] = d1;
|
---|
1111 | element = elements [m_size.IndexFromArray(acc)];
|
---|
1112 | if (!Object.ReferenceEquals(element,null)) {
|
---|
1113 | sElement = element.ShortInfo().PadRight(elemLength);
|
---|
1114 | } else {
|
---|
1115 | sElement = "(null)".PadLeft(elemLength);
|
---|
1116 | }
|
---|
1117 | curLineLength += sElement.Length;
|
---|
1118 | if (curLineLength > maxLength - " ...".Length) {
|
---|
1119 | s.Append(" ...");
|
---|
1120 | break;
|
---|
1121 | } else {
|
---|
1122 | s.Append(sElement);
|
---|
1123 | }
|
---|
1124 | }
|
---|
1125 | }
|
---|
1126 | // increase higher dimension
|
---|
1127 | d = 2;
|
---|
1128 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
1129 | acc[d]++;
|
---|
1130 | if (acc[d] < m_size[d]) break;
|
---|
1131 | acc[d] = 0;
|
---|
1132 | d++;
|
---|
1133 | }
|
---|
1134 | if (d >= m_size.NumberOfDimensions) break;
|
---|
1135 | }
|
---|
1136 | #endregion
|
---|
1137 |
|
---|
1138 | } else if (this.Data.Data.GetType() == typeof( object [] )) {
|
---|
1139 | #region
|
---|
1140 | object element;
|
---|
1141 | object [] elements = (this.Data.Data as object []);
|
---|
1142 | elemLength = 18 ;
|
---|
1143 | double scaling = 1.0;
|
---|
1144 | elemLength++;
|
---|
1145 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
1146 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
1147 | // show only two first dimensions at the same time ...
|
---|
1148 | // print header
|
---|
1149 | if (m_size.NumberOfDimensions > 2 || scaling != 1) {
|
---|
1150 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1151 | s.Append("(:,:");
|
---|
1152 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
1153 | s.Append(String.Format(",{0}", acc[d]));
|
---|
1154 | s.Append(") " + ((scaling!=1.0)? (scaling.ToString("e0") + " * "):""));
|
---|
1155 | }
|
---|
1156 | // show this for 2 leading dimensions
|
---|
1157 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
1158 | if (++curRowsCount > maxRows) {
|
---|
1159 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
1160 | return s;
|
---|
1161 | }
|
---|
1162 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1163 | acc[0] = d0; curLineLength = 0;
|
---|
1164 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
1165 | acc[1] = d1;
|
---|
1166 | element = elements [m_size.IndexFromArray(acc)];
|
---|
1167 | if (!Object.ReferenceEquals(element,null)) {
|
---|
1168 | sElement = String.Format ("{0} ", element).PadLeft(elemLength);
|
---|
1169 | } else {
|
---|
1170 | sElement = "(null)".PadLeft(elemLength);
|
---|
1171 | }
|
---|
1172 | curLineLength += sElement.Length;
|
---|
1173 | if (curLineLength > maxLength - " ...".Length) {
|
---|
1174 | s.Append(" ...");
|
---|
1175 | break;
|
---|
1176 | } else {
|
---|
1177 | s.Append(sElement);
|
---|
1178 | }
|
---|
1179 | }
|
---|
1180 | }
|
---|
1181 | // increase higher dimension
|
---|
1182 | d = 2;
|
---|
1183 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
1184 | acc[d]++;
|
---|
1185 | if (acc[d] < m_size[d]) break;
|
---|
1186 | acc[d] = 0;
|
---|
1187 | d++;
|
---|
1188 | }
|
---|
1189 | if (d >= m_size.NumberOfDimensions) break;
|
---|
1190 | }
|
---|
1191 | #endregion
|
---|
1192 |
|
---|
1193 | #endregion HYCALPER AUTO GENERATED CODE
|
---|
1194 | } else if (this is ILDenseStorage<string> ) {
|
---|
1195 | #region
|
---|
1196 | string element;
|
---|
1197 | string[] elements = (this.Data.Data as string[]);
|
---|
1198 | elemLength = 18;
|
---|
1199 | int maxElemLength = 50; // todo: may better be a setting? abreviate after as many chars
|
---|
1200 | elemLength++;
|
---|
1201 | while (acc[m_size.NumberOfDimensions - 1] <
|
---|
1202 | m_size[m_size.NumberOfDimensions - 1]) {
|
---|
1203 | // show only two first dimensions at the same time ...
|
---|
1204 | // print header
|
---|
1205 | if (m_size.NumberOfDimensions > 2) {
|
---|
1206 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1207 | s.Append("(:,:");
|
---|
1208 | for (d = 2; d < m_size.NumberOfDimensions; d++)
|
---|
1209 | s.Append(String.Format(",{0}", acc[d]));
|
---|
1210 | s.Append(") ");
|
---|
1211 | }
|
---|
1212 | // show this for 2 leading dimensions
|
---|
1213 | for (int d0 = 0; d0 < m_size[0]; d0++) {
|
---|
1214 | if (++curRowsCount > maxRows) {
|
---|
1215 | s.Append(Environment.NewLine + "( ... more rows exist)");
|
---|
1216 | return s;
|
---|
1217 | }
|
---|
1218 | if (s.Length > 0) s.Append(Environment.NewLine);
|
---|
1219 | acc[0] = d0; curLineLength = 0;
|
---|
1220 | for (int d1 = 0; d1 < m_size[1]; d1++) {
|
---|
1221 | acc[1] = d1;
|
---|
1222 | element = elements[m_size.IndexFromArray(acc)];
|
---|
1223 | if (!Object.ReferenceEquals(element, null)) {
|
---|
1224 | if (element.Length > maxElemLength) {
|
---|
1225 | sElement = element.Substring(0,maxElemLength - 3) + "...";
|
---|
1226 | } else {
|
---|
1227 | sElement = String.Format("{0} ", element).PadLeft(elemLength);
|
---|
1228 | }
|
---|
1229 | } else {
|
---|
1230 | sElement = "(null)".PadLeft(elemLength);
|
---|
1231 | }
|
---|
1232 | curLineLength += sElement.Length;
|
---|
1233 | if (curLineLength > maxLength - " ...".Length) {
|
---|
1234 | s.Append(" ...");
|
---|
1235 | break;
|
---|
1236 | } else {
|
---|
1237 | s.Append(sElement);
|
---|
1238 | }
|
---|
1239 | }
|
---|
1240 | }
|
---|
1241 | // increase higher dimension
|
---|
1242 | d = 2;
|
---|
1243 | while (d <= m_size.NumberOfDimensions - 1) {
|
---|
1244 | acc[d]++;
|
---|
1245 | if (acc[d] < m_size[d]) break;
|
---|
1246 | acc[d] = 0;
|
---|
1247 | d++;
|
---|
1248 | }
|
---|
1249 | if (d >= m_size.NumberOfDimensions) break;
|
---|
1250 | }
|
---|
1251 | #endregion
|
---|
1252 | } else {
|
---|
1253 | return new StringBuilder ("(Unknown data type.)");
|
---|
1254 | }
|
---|
1255 | return s;
|
---|
1256 | }
|
---|
1257 | private double getScalingForPrint() {
|
---|
1258 | ElementType min, max;
|
---|
1259 | if (GetLimits(out min, out max, false)) {
|
---|
1260 | try {
|
---|
1261 | double scaling = Math.Max(
|
---|
1262 | Math.Abs(double.Parse(min.ToString())),
|
---|
1263 | Math.Abs( double.Parse(max.ToString()))
|
---|
1264 | );
|
---|
1265 | if (scaling == 0 || (scaling > 1e-1 && scaling < 1e1))
|
---|
1266 | scaling = 1;
|
---|
1267 | scaling = Math.Pow(10,Math.Floor(Math.Log10(scaling)));
|
---|
1268 | if (scaling < 10000 && scaling >= 1)
|
---|
1269 | scaling = 1;
|
---|
1270 | return scaling;
|
---|
1271 | } catch (Exception) {
|
---|
1272 | return 1.0;
|
---|
1273 | }
|
---|
1274 | } else {
|
---|
1275 | return 1.0;
|
---|
1276 | }
|
---|
1277 | }
|
---|
1278 | private int GetTypedElementStringProperties(double scaling, out string format) {
|
---|
1279 | format = "E+00000000000000;0.0;-E+00000000000000";
|
---|
1280 | if (this is ILDenseStorage<double>) {
|
---|
1281 | return double.MaxValue.ToString().Length;
|
---|
1282 | } else if (this is ILDenseStorage<float>) {
|
---|
1283 | return float.MaxValue.ToString().Length;
|
---|
1284 | } else if (this is ILDenseStorage<Complex>) {
|
---|
1285 | return double.MaxValue.ToString().Length * 2 + 2;
|
---|
1286 | } else if (this is ILDenseStorage<complex>) {
|
---|
1287 | return double.MaxValue.ToString().Length * 2 + 2;
|
---|
1288 | } else if (this is ILDenseStorage<fcomplex>) {
|
---|
1289 | return float.MaxValue.ToString().Length * 2 + 2;
|
---|
1290 | } else if (this is ILDenseStorage<char>) {
|
---|
1291 | return char.MaxValue.ToString().Length;
|
---|
1292 | } else if (this is ILDenseStorage<byte>) {
|
---|
1293 | return byte.MaxValue.ToString().Length;
|
---|
1294 | } else if (this is ILDenseStorage<Int16>) {
|
---|
1295 | return Int16.MaxValue.ToString().Length;
|
---|
1296 | } else if (this is ILDenseStorage<Int32>) {
|
---|
1297 | return Int32.MaxValue.ToString().Length;
|
---|
1298 | } else if (this is ILDenseStorage<Int64>) {
|
---|
1299 | return Int64.MaxValue.ToString().Length;
|
---|
1300 | } else if (this is ILDenseStorage<UInt16>) {
|
---|
1301 | return UInt16.MaxValue.ToString().Length;
|
---|
1302 | } else if (this is ILDenseStorage<UInt32>) {
|
---|
1303 | return UInt32.MaxValue.ToString().Length;
|
---|
1304 | } else if (this is ILDenseStorage<UInt64>) {
|
---|
1305 | return UInt64.MaxValue.ToString().Length;
|
---|
1306 | } else
|
---|
1307 | return 10;
|
---|
1308 | }
|
---|
1309 | private string ComplexHelper(Complex a, int digits) {
|
---|
1310 | if (digits < 1) return "";
|
---|
1311 | if (a.Imaginary >= 0) {
|
---|
1312 | return String.Format("{0:f10}+{1:f10}", a.Real, a.Imaginary);
|
---|
1313 | } else {
|
---|
1314 | return String.Format("{0:f10}-{1:f10}", a.Real, -a.Imaginary);
|
---|
1315 | }
|
---|
1316 | }
|
---|
1317 | /// <summary>
|
---|
1318 | /// Check if the content of this array equals the content of obj.
|
---|
1319 | /// </summary>
|
---|
1320 | /// <param name="obj">storage containing the values with which to compare this array.</param>
|
---|
1321 | /// <returns>True if all elements contained in obj are equal to the
|
---|
1322 | /// elements of this array, false otherwise.</returns>
|
---|
1323 | /// <remarks>This method compares the object references of corresponding elements.
|
---|
1324 | /// The size and type of both arrays must match. Otherwise false will be returned.</remarks>
|
---|
1325 | internal override bool Equals(object obj) {
|
---|
1326 | if (object.Equals(obj,null)) return false;
|
---|
1327 | if (obj is ElementType)
|
---|
1328 | if (Size.NumberOfElements == 1
|
---|
1329 | && obj.ToString() == GetValueTyped(0).ToString())
|
---|
1330 | return true;
|
---|
1331 | else
|
---|
1332 | return false;
|
---|
1333 | ILDenseStorage<ElementType> denseStorage = obj as ILDenseStorage<ElementType>;
|
---|
1334 | if (object.Equals(denseStorage,null))
|
---|
1335 | return false;
|
---|
1336 | return Equals(denseStorage);
|
---|
1337 | }
|
---|
1338 | /// <summary>
|
---|
1339 | /// Test if this dense storage equals another dense storage.
|
---|
1340 | /// </summary>
|
---|
1341 | /// <param name="A">storage to compare this storage with</param>
|
---|
1342 | /// <returns>True if all elements and dimension sizes match, false otherwise.</returns>
|
---|
1343 | internal bool Equals(ILDenseStorage<ElementType> A) {
|
---|
1344 | if (A == null) return false;
|
---|
1345 | if (!A.Size.IsSameSize(m_size))
|
---|
1346 | return false;
|
---|
1347 | int len = m_size.NumberOfElements;
|
---|
1348 | if (typeof(ElementType).IsValueType) {
|
---|
1349 | for (int i = 0; i < len;i++) {
|
---|
1350 | if (!GetValueTyped(i).Equals(A.GetValueTyped(i)))
|
---|
1351 | return false;
|
---|
1352 | }
|
---|
1353 | } else {
|
---|
1354 | // references may contain null element values!
|
---|
1355 | for (int i = 0; i < len;i++) {
|
---|
1356 | ElementType t1 = GetValueTyped(i);
|
---|
1357 | if (t1 == null) {
|
---|
1358 | if (!A.GetValueTyped(i).Equals(null))
|
---|
1359 | return false;
|
---|
1360 | } else {
|
---|
1361 | if (!t1.Equals(A.GetValueTyped(i)))
|
---|
1362 | return false;
|
---|
1363 | }
|
---|
1364 | }
|
---|
1365 | }
|
---|
1366 | return true;
|
---|
1367 | }
|
---|
1368 | /// <summary>
|
---|
1369 | /// generate a hash code based on the current arrays values
|
---|
1370 | /// </summary>
|
---|
1371 | /// <returns>hash code</returns>
|
---|
1372 | /// <remarks>The hashcode is generated by taking the values currently stored in the array into account.
|
---|
1373 | /// Therefore, the function must iterate over all elements in the array - which makes it somehow a expensive
|
---|
1374 | /// operation. Take this into account, if you consider using large arrays in collections like dictionaries
|
---|
1375 | /// or hashtables, which make great use of hash codes.</remarks>
|
---|
1376 | public override int GetHashCode() {
|
---|
1377 | if (IsDisposed) return base.GetHashCode();
|
---|
1378 | int ret = Size.GetHashCode();
|
---|
1379 | ElementType[] data = GetArrayForRead();
|
---|
1380 | ret = (ret * 17) + data.Length;
|
---|
1381 | foreach (ElementType t in data) {
|
---|
1382 | ret = unchecked( ret * 17 );
|
---|
1383 | if (t != null)
|
---|
1384 | ret = unchecked(ret + t.GetHashCode());
|
---|
1385 | }
|
---|
1386 | return (int)ret;
|
---|
1387 | }
|
---|
1388 | #endregion
|
---|
1389 |
|
---|
1390 | #region subarray + range get / set
|
---|
1391 | /// <summary>
|
---|
1392 | /// Alter values specified by range.
|
---|
1393 | /// </summary>
|
---|
1394 | /// <param name="range">ILRange specifying the dimensions/indices to be altered.</param>
|
---|
1395 | /// <param name="values">new values</param>
|
---|
1396 | /// <remarks>
|
---|
1397 | /// The values pointed to by range will be replaced with the values
|
---|
1398 | /// found in 'values'. Important: the range cannot specify indices outside of my dimensions!
|
---|
1399 | /// Therefore, the storage must have been expanded in advance, if needed!</remarks>
|
---|
1400 | public virtual void SetRange(ILRange range, ILDenseStorage<ElementType> values) {
|
---|
1401 | if (range.Size.NumberOfElements == 0) return;
|
---|
1402 | int rangeDimLen = range.RangeArray.Length,higherDimSum = 0;
|
---|
1403 | int leadDimLenRange = range[0].Count, leadDimLen = m_size[0];
|
---|
1404 | int d, outElemCount = range.Size.NumberOfElements;
|
---|
1405 | ElementType[] myArr = GetArrayForWrite();
|
---|
1406 | int[] idxArr = new int[rangeDimLen]; // used to store current position inside higher dims
|
---|
1407 | ILIntList[] rng = range.RangeArray;
|
---|
1408 | int[] seqDistances = m_size.GetSequentialIndexDistances(range.Size.NumberOfDimensions);
|
---|
1409 | int[] inFullDim = new int[rangeDimLen];
|
---|
1410 | // initialize higher dimension summand and inFullDim[] flag array
|
---|
1411 | for (int i = 1; i < idxArr.Length; i++) {
|
---|
1412 | if (rng[i][0] < 0) {
|
---|
1413 | inFullDim[i] = rng[i][0];
|
---|
1414 | } else {
|
---|
1415 | inFullDim[i] = 0;
|
---|
1416 | higherDimSum += seqDistances[i] * rng[i][0];
|
---|
1417 | }
|
---|
1418 | }
|
---|
1419 | //for (int lIdx = 0; lIdx < leadDimLenRange; lIdx ++) {
|
---|
1420 | // retArr[curPosOut++] = myArr[higherDimSum + rleadDim[lIdx]];
|
---|
1421 | //}
|
---|
1422 | if (values.Size.NumberOfElements == 1) {
|
---|
1423 | #region scalar case
|
---|
1424 | ElementType scalar = values.GetValueTyped(0);
|
---|
1425 | while (true) {
|
---|
1426 | // copy along leading dimension
|
---|
1427 | for (int i = 0; i < rng[0].Count; i++) {
|
---|
1428 | if (rng[0][i] < 0) {
|
---|
1429 | for (int c = -rng[0][i]; c-- >= 0; ) {
|
---|
1430 | // we need a upward counter variable anyway, initialized with
|
---|
1431 | // higherDimSum. So we simply take that and reset it after the loop:
|
---|
1432 | myArr[ higherDimSum++ ] = scalar;
|
---|
1433 | }
|
---|
1434 | higherDimSum += (rng[0][i]-1); // negative value in rng!
|
---|
1435 | } else {
|
---|
1436 | myArr[ higherDimSum + rng[0][i] ] = scalar;
|
---|
1437 | }
|
---|
1438 |
|
---|
1439 | }
|
---|
1440 |
|
---|
1441 | // increase higher dims
|
---|
1442 | d = 1;
|
---|
1443 | while (d < idxArr.Length) {
|
---|
1444 | if (inFullDim[d] < 0) {
|
---|
1445 | higherDimSum += seqDistances[d];
|
---|
1446 | inFullDim[d]++;
|
---|
1447 | break;
|
---|
1448 | }
|
---|
1449 |
|
---|
1450 | if (rng[d][idxArr[d]] >= 0) {
|
---|
1451 | higherDimSum -= (rng[d][idxArr[d]] * seqDistances[d]);
|
---|
1452 | } else {
|
---|
1453 | higherDimSum += (rng[d][idxArr[d]] * seqDistances[d]);
|
---|
1454 | }
|
---|
1455 | idxArr[d]++;
|
---|
1456 | if (idxArr[d] == rng[d].Count) {
|
---|
1457 | idxArr[d] = 0;
|
---|
1458 | if (rng[d][0] < 0) {
|
---|
1459 | inFullDim[d] = rng[d][idxArr[d]];
|
---|
1460 | } else {
|
---|
1461 | higherDimSum += (rng[d][0] * seqDistances[d]);
|
---|
1462 | }
|
---|
1463 | d++;
|
---|
1464 | } else if (rng[d][idxArr[d]] < 0) {
|
---|
1465 | inFullDim[d] = rng[d][idxArr[d]];
|
---|
1466 | break;
|
---|
1467 | } else {
|
---|
1468 | higherDimSum += seqDistances[d] * rng[d][idxArr[d]];
|
---|
1469 | break;
|
---|
1470 | }
|
---|
1471 |
|
---|
1472 | }
|
---|
1473 | if (d >= idxArr.Length)
|
---|
1474 | break;
|
---|
1475 | }
|
---|
1476 | #endregion
|
---|
1477 | } else {
|
---|
1478 | #region non scalar case
|
---|
1479 | ElementType [] valuesArr = values.GetArrayForRead();
|
---|
1480 | int valuesPos = 0;
|
---|
1481 | while (true) {
|
---|
1482 | // copy along leading dimension
|
---|
1483 | for (int i = 0; i < rng[0].Count; i++) {
|
---|
1484 | if (rng[0][i] < 0) {
|
---|
1485 | for (int c = -rng[0][i]; c-- >= 0; ) {
|
---|
1486 | myArr[ higherDimSum++ ] = valuesArr[ valuesPos++ ];
|
---|
1487 | }
|
---|
1488 | higherDimSum += (rng[0][i]-1); // negative value in rng!
|
---|
1489 | } else {
|
---|
1490 | myArr[ higherDimSum + rng[0][i] ] = valuesArr[ valuesPos++ ];
|
---|
1491 | }
|
---|
1492 | }
|
---|
1493 |
|
---|
1494 | // increase higher dims
|
---|
1495 | d = 1;
|
---|
1496 | while (d < idxArr.Length) {
|
---|
1497 | if (inFullDim[d] < 0) {
|
---|
1498 | higherDimSum += seqDistances[d];
|
---|
1499 | inFullDim[d]++;
|
---|
1500 | break;
|
---|
1501 | }
|
---|
1502 |
|
---|
1503 | if (rng[d][idxArr[d]] >= 0) {
|
---|
1504 | higherDimSum -= (rng[d][idxArr[d]] * seqDistances[d]);
|
---|
1505 | } else {
|
---|
1506 | higherDimSum += (rng[d][idxArr[d]] * seqDistances[d]);
|
---|
1507 | }
|
---|
1508 | idxArr[d]++;
|
---|
1509 | if (idxArr[d] == rng[d].Count) {
|
---|
1510 | idxArr[d] = 0;
|
---|
1511 | if (rng[d][idxArr[d]] < 0) {
|
---|
1512 | inFullDim[d] = rng[d][idxArr[d]];
|
---|
1513 | } else {
|
---|
1514 | higherDimSum += (rng[d][0] * seqDistances[d]);
|
---|
1515 | }
|
---|
1516 | d++;
|
---|
1517 | } else if (rng[d][idxArr[d]] < 0) {
|
---|
1518 | inFullDim[d] = rng[d][idxArr[d]];
|
---|
1519 | break;
|
---|
1520 | } else {
|
---|
1521 | higherDimSum += seqDistances[d] * rng[d][idxArr[d]];
|
---|
1522 | break;
|
---|
1523 | }
|
---|
1524 |
|
---|
1525 | }
|
---|
1526 | if (d >= idxArr.Length)
|
---|
1527 | break;
|
---|
1528 | }
|
---|
1529 | #endregion
|
---|
1530 | }
|
---|
1531 | }
|
---|
1532 |
|
---|
1533 | internal virtual void SetRangeFull(ILDenseStorage<ElementType> values) {
|
---|
1534 | if (values.Size.NumberOfElements != 1 && values.Size.NumberOfElements != Size.NumberOfElements)
|
---|
1535 | throw new ILArgumentException("source and destination array must have the same number of arguments");
|
---|
1536 | ElementType[] myArr = GetArrayForWrite();
|
---|
1537 | if (values.Size.NumberOfElements == 1) {
|
---|
1538 | ElementType scal = values.GetValueTyped(0);
|
---|
1539 | for (int i = 0; i < myArr.Length; i++) {
|
---|
1540 | myArr[i] = scal;
|
---|
1541 | }
|
---|
1542 | } else {
|
---|
1543 | ElementType[] valArr = values.GetArrayForRead();
|
---|
1544 | System.Array.Copy(valArr,myArr,Size.NumberOfElements);
|
---|
1545 | }
|
---|
1546 | }
|
---|
1547 |
|
---|
1548 | |
---|
1549 |
|
---|
1550 | /// <summary>
|
---|
1551 | /// Alter elements of this storage adressed by sequential indices
|
---|
1552 | /// </summary>
|
---|
1553 | /// <param name="indices">array specifying the elements to be altered, sequential indexing</param>
|
---|
1554 | /// <param name="values">ILBaseArray of the same type than this array, holding the new values.
|
---|
1555 | /// The number of elements of storage must match the
|
---|
1556 | /// number of elements of indices. The only exception to this rule is if 'values' is a scalar array. The
|
---|
1557 | /// single value of 'values' is than used to set all elements addressed by 'indices'.</param>
|
---|
1558 | /// <remarks><para>For empty arrays, scalar or vectors, indices outside the current bounds for
|
---|
1559 | /// this array will expand this array to the size neccessary.
|
---|
1560 | /// For other arrays the sequential indices given must fit inside this arrays dimensions. </para></remarks>
|
---|
1561 | public virtual void SetRange(ILBaseArray<double> indices, ILDenseStorage<ElementType> values) {
|
---|
1562 | //if (object.Equals(indices,null))
|
---|
1563 | // throw new ILArgumentException("indices given must not be null");
|
---|
1564 | if (object.Equals(values, null))
|
---|
1565 | throw new ILArgumentException("values given must not be null. Use A[ind] = null; if removal was intended.");
|
---|
1566 | using (ILScope.Enter(indices)) {
|
---|
1567 | #region set full shortcut
|
---|
1568 | if (indices is ILFullRange || object.Equals(indices, null)) {
|
---|
1569 | int pos;
|
---|
1570 | ElementType[] myArray = GetArrayForWrite();
|
---|
1571 | if (values.Size.NumberOfElements == 1) {
|
---|
1572 | pos = Size.NumberOfElements;
|
---|
1573 | ElementType val = values.GetValueTyped(0);
|
---|
1574 | while (pos-- > 0)
|
---|
1575 | myArray[pos] = val;
|
---|
1576 | } else {
|
---|
1577 | if (values.Size.NumberOfElements != Size.NumberOfElements)
|
---|
1578 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1579 | pos = 0;
|
---|
1580 | foreach (ElementType val in values) {
|
---|
1581 | myArray[pos++] = val;
|
---|
1582 | }
|
---|
1583 | }
|
---|
1584 | } else if (indices.Size.NumberOfElements != values.Size.NumberOfElements
|
---|
1585 | && values.Size.NumberOfElements != 1)
|
---|
1586 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1587 | #endregion
|
---|
1588 | if (indices.IsEmpty)
|
---|
1589 | return;
|
---|
1590 | if (indices.Storage is ILDenseStorage< double>) {
|
---|
1591 |
|
---|
1592 | double maxIndex, minIndex;
|
---|
1593 | ILDenseStorage< double> indStorage = indices.Storage as ILDenseStorage< double>;
|
---|
1594 | indStorage.GetLimits(out minIndex, out maxIndex);
|
---|
1595 | if (minIndex < 0)
|
---|
1596 | throw new ILArgumentException("sequential indices can not be negative");
|
---|
1597 | if ((int)maxIndex >= m_size.NumberOfElements) {
|
---|
1598 | // handle resize
|
---|
1599 | if (m_size.NumberOfDimensions == 2) {
|
---|
1600 | if (m_size.NumberOfElements <= 1) {
|
---|
1601 | // scalar or empty -> expand along 1
|
---|
1602 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1603 | } else if (m_size[0] > 1 && m_size[1] == 1) {
|
---|
1604 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1605 | } else if (m_size[0] == 1 && m_size[1] > 1) {
|
---|
1606 | ExpandArray(new int[] { 1, (int)maxIndex + 1 });
|
---|
1607 | } else
|
---|
1608 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1609 | } else
|
---|
1610 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1611 | }
|
---|
1612 | ElementType[] myArray = GetArrayForWrite();
|
---|
1613 |
|
---|
1614 | double[] indArray = indStorage.GetArrayForRead();
|
---|
1615 |
|
---|
1616 | int len = indices.Size.NumberOfElements;
|
---|
1617 | if (values.Size.NumberOfElements == 1) {
|
---|
1618 | ElementType scalarElement = values.GetValueTyped(0);
|
---|
1619 | for (int i = 0; i < len; ) {
|
---|
1620 | myArray[(int)indArray[i++]] = scalarElement;
|
---|
1621 | }
|
---|
1622 | } else {
|
---|
1623 | ElementType[] valArray = values.GetArrayForRead();
|
---|
1624 | for (int i = 0; i < len; ) {
|
---|
1625 | myArray[(int)indArray[i]] = valArray[i++];
|
---|
1626 | }
|
---|
1627 | }
|
---|
1628 | } else {
|
---|
1629 | throw new ILArgumentException("storage type of given indices is not supported");
|
---|
1630 | }
|
---|
1631 | }
|
---|
1632 | }
|
---|
1633 | |
---|
1634 | #region HYCALPER AUTO GENERATED CODE
|
---|
1635 | |
---|
1636 |
|
---|
1637 | /// <summary>
|
---|
1638 | /// Alter elements of this storage adressed by sequential indices
|
---|
1639 | /// </summary>
|
---|
1640 | /// <param name="indices">array specifying the elements to be altered, sequential indexing</param>
|
---|
1641 | /// <param name="values">ILBaseArray of the same type than this array, holding the new values.
|
---|
1642 | /// The number of elements of storage must match the
|
---|
1643 | /// number of elements of indices. The only exception to this rule is if 'values' is a scalar array. The
|
---|
1644 | /// single value of 'values' is than used to set all elements addressed by 'indices'.</param>
|
---|
1645 | /// <remarks><para>For empty arrays, scalar or vectors, indices outside the current bounds for
|
---|
1646 | /// this array will expand this array to the size neccessary.
|
---|
1647 | /// For other arrays the sequential indices given must fit inside this arrays dimensions. </para></remarks>
|
---|
1648 | public virtual void SetRange(ILBaseArray<Int64> indices, ILDenseStorage<ElementType> values) {
|
---|
1649 | //if (object.Equals(indices,null))
|
---|
1650 | // throw new ILArgumentException("indices given must not be null");
|
---|
1651 | if (object.Equals(values, null))
|
---|
1652 | throw new ILArgumentException("values given must not be null. Use A[ind] = null; if removal was intended.");
|
---|
1653 | using (ILScope.Enter(indices)) {
|
---|
1654 | #region set full shortcut
|
---|
1655 | if (indices is ILFullRange || object.Equals(indices, null)) {
|
---|
1656 | int pos;
|
---|
1657 | ElementType[] myArray = GetArrayForWrite();
|
---|
1658 | if (values.Size.NumberOfElements == 1) {
|
---|
1659 | pos = Size.NumberOfElements;
|
---|
1660 | ElementType val = values.GetValueTyped(0);
|
---|
1661 | while (pos-- > 0)
|
---|
1662 | myArray[pos] = val;
|
---|
1663 | } else {
|
---|
1664 | if (values.Size.NumberOfElements != Size.NumberOfElements)
|
---|
1665 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1666 | pos = 0;
|
---|
1667 | foreach (ElementType val in values) {
|
---|
1668 | myArray[pos++] = val;
|
---|
1669 | }
|
---|
1670 | }
|
---|
1671 | } else if (indices.Size.NumberOfElements != values.Size.NumberOfElements
|
---|
1672 | && values.Size.NumberOfElements != 1)
|
---|
1673 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1674 | #endregion
|
---|
1675 | if (indices.IsEmpty)
|
---|
1676 | return;
|
---|
1677 | if (indices.Storage is ILDenseStorage< Int64>) {
|
---|
1678 |
|
---|
1679 | Int64 maxIndex, minIndex;
|
---|
1680 | ILDenseStorage< Int64> indStorage = indices.Storage as ILDenseStorage< Int64>;
|
---|
1681 | indStorage.GetLimits(out minIndex, out maxIndex);
|
---|
1682 | if (minIndex < 0)
|
---|
1683 | throw new ILArgumentException("sequential indices can not be negative");
|
---|
1684 | if ((int)maxIndex >= m_size.NumberOfElements) {
|
---|
1685 | // handle resize
|
---|
1686 | if (m_size.NumberOfDimensions == 2) {
|
---|
1687 | if (m_size.NumberOfElements <= 1) {
|
---|
1688 | // scalar or empty -> expand along 1
|
---|
1689 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1690 | } else if (m_size[0] > 1 && m_size[1] == 1) {
|
---|
1691 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1692 | } else if (m_size[0] == 1 && m_size[1] > 1) {
|
---|
1693 | ExpandArray(new int[] { 1, (int)maxIndex + 1 });
|
---|
1694 | } else
|
---|
1695 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1696 | } else
|
---|
1697 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1698 | }
|
---|
1699 | ElementType[] myArray = GetArrayForWrite();
|
---|
1700 |
|
---|
1701 | Int64[] indArray = indStorage.GetArrayForRead();
|
---|
1702 |
|
---|
1703 | int len = indices.Size.NumberOfElements;
|
---|
1704 | if (values.Size.NumberOfElements == 1) {
|
---|
1705 | ElementType scalarElement = values.GetValueTyped(0);
|
---|
1706 | for (int i = 0; i < len; ) {
|
---|
1707 | myArray[(int)indArray[i++]] = scalarElement;
|
---|
1708 | }
|
---|
1709 | } else {
|
---|
1710 | ElementType[] valArray = values.GetArrayForRead();
|
---|
1711 | for (int i = 0; i < len; ) {
|
---|
1712 | myArray[(int)indArray[i]] = valArray[i++];
|
---|
1713 | }
|
---|
1714 | }
|
---|
1715 | } else {
|
---|
1716 | throw new ILArgumentException("storage type of given indices is not supported");
|
---|
1717 | }
|
---|
1718 | }
|
---|
1719 | }
|
---|
1720 |
|
---|
1721 | /// <summary>
|
---|
1722 | /// Alter elements of this storage adressed by sequential indices
|
---|
1723 | /// </summary>
|
---|
1724 | /// <param name="indices">array specifying the elements to be altered, sequential indexing</param>
|
---|
1725 | /// <param name="values">ILBaseArray of the same type than this array, holding the new values.
|
---|
1726 | /// The number of elements of storage must match the
|
---|
1727 | /// number of elements of indices. The only exception to this rule is if 'values' is a scalar array. The
|
---|
1728 | /// single value of 'values' is than used to set all elements addressed by 'indices'.</param>
|
---|
1729 | /// <remarks><para>For empty arrays, scalar or vectors, indices outside the current bounds for
|
---|
1730 | /// this array will expand this array to the size neccessary.
|
---|
1731 | /// For other arrays the sequential indices given must fit inside this arrays dimensions. </para></remarks>
|
---|
1732 | public virtual void SetRange(ILBaseArray<Int32> indices, ILDenseStorage<ElementType> values) {
|
---|
1733 | //if (object.Equals(indices,null))
|
---|
1734 | // throw new ILArgumentException("indices given must not be null");
|
---|
1735 | if (object.Equals(values, null))
|
---|
1736 | throw new ILArgumentException("values given must not be null. Use A[ind] = null; if removal was intended.");
|
---|
1737 | using (ILScope.Enter(indices)) {
|
---|
1738 | #region set full shortcut
|
---|
1739 | if (indices is ILFullRange || object.Equals(indices, null)) {
|
---|
1740 | int pos;
|
---|
1741 | ElementType[] myArray = GetArrayForWrite();
|
---|
1742 | if (values.Size.NumberOfElements == 1) {
|
---|
1743 | pos = Size.NumberOfElements;
|
---|
1744 | ElementType val = values.GetValueTyped(0);
|
---|
1745 | while (pos-- > 0)
|
---|
1746 | myArray[pos] = val;
|
---|
1747 | } else {
|
---|
1748 | if (values.Size.NumberOfElements != Size.NumberOfElements)
|
---|
1749 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1750 | pos = 0;
|
---|
1751 | foreach (ElementType val in values) {
|
---|
1752 | myArray[pos++] = val;
|
---|
1753 | }
|
---|
1754 | }
|
---|
1755 | } else if (indices.Size.NumberOfElements != values.Size.NumberOfElements
|
---|
1756 | && values.Size.NumberOfElements != 1)
|
---|
1757 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1758 | #endregion
|
---|
1759 | if (indices.IsEmpty)
|
---|
1760 | return;
|
---|
1761 | if (indices.Storage is ILDenseStorage< Int32>) {
|
---|
1762 |
|
---|
1763 | Int32 maxIndex, minIndex;
|
---|
1764 | ILDenseStorage< Int32> indStorage = indices.Storage as ILDenseStorage< Int32>;
|
---|
1765 | indStorage.GetLimits(out minIndex, out maxIndex);
|
---|
1766 | if (minIndex < 0)
|
---|
1767 | throw new ILArgumentException("sequential indices can not be negative");
|
---|
1768 | if ((int)maxIndex >= m_size.NumberOfElements) {
|
---|
1769 | // handle resize
|
---|
1770 | if (m_size.NumberOfDimensions == 2) {
|
---|
1771 | if (m_size.NumberOfElements <= 1) {
|
---|
1772 | // scalar or empty -> expand along 1
|
---|
1773 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1774 | } else if (m_size[0] > 1 && m_size[1] == 1) {
|
---|
1775 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1776 | } else if (m_size[0] == 1 && m_size[1] > 1) {
|
---|
1777 | ExpandArray(new int[] { 1, (int)maxIndex + 1 });
|
---|
1778 | } else
|
---|
1779 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1780 | } else
|
---|
1781 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1782 | }
|
---|
1783 | ElementType[] myArray = GetArrayForWrite();
|
---|
1784 |
|
---|
1785 | Int32[] indArray = indStorage.GetArrayForRead();
|
---|
1786 |
|
---|
1787 | int len = indices.Size.NumberOfElements;
|
---|
1788 | if (values.Size.NumberOfElements == 1) {
|
---|
1789 | ElementType scalarElement = values.GetValueTyped(0);
|
---|
1790 | for (int i = 0; i < len; ) {
|
---|
1791 | myArray[(int)indArray[i++]] = scalarElement;
|
---|
1792 | }
|
---|
1793 | } else {
|
---|
1794 | ElementType[] valArray = values.GetArrayForRead();
|
---|
1795 | for (int i = 0; i < len; ) {
|
---|
1796 | myArray[(int)indArray[i]] = valArray[i++];
|
---|
1797 | }
|
---|
1798 | }
|
---|
1799 | } else {
|
---|
1800 | throw new ILArgumentException("storage type of given indices is not supported");
|
---|
1801 | }
|
---|
1802 | }
|
---|
1803 | }
|
---|
1804 |
|
---|
1805 | /// <summary>
|
---|
1806 | /// Alter elements of this storage adressed by sequential indices
|
---|
1807 | /// </summary>
|
---|
1808 | /// <param name="indices">array specifying the elements to be altered, sequential indexing</param>
|
---|
1809 | /// <param name="values">ILBaseArray of the same type than this array, holding the new values.
|
---|
1810 | /// The number of elements of storage must match the
|
---|
1811 | /// number of elements of indices. The only exception to this rule is if 'values' is a scalar array. The
|
---|
1812 | /// single value of 'values' is than used to set all elements addressed by 'indices'.</param>
|
---|
1813 | /// <remarks><para>For empty arrays, scalar or vectors, indices outside the current bounds for
|
---|
1814 | /// this array will expand this array to the size neccessary.
|
---|
1815 | /// For other arrays the sequential indices given must fit inside this arrays dimensions. </para></remarks>
|
---|
1816 | public virtual void SetRange(ILBaseArray<Int16> indices, ILDenseStorage<ElementType> values) {
|
---|
1817 | //if (object.Equals(indices,null))
|
---|
1818 | // throw new ILArgumentException("indices given must not be null");
|
---|
1819 | if (object.Equals(values, null))
|
---|
1820 | throw new ILArgumentException("values given must not be null. Use A[ind] = null; if removal was intended.");
|
---|
1821 | using (ILScope.Enter(indices)) {
|
---|
1822 | #region set full shortcut
|
---|
1823 | if (indices is ILFullRange || object.Equals(indices, null)) {
|
---|
1824 | int pos;
|
---|
1825 | ElementType[] myArray = GetArrayForWrite();
|
---|
1826 | if (values.Size.NumberOfElements == 1) {
|
---|
1827 | pos = Size.NumberOfElements;
|
---|
1828 | ElementType val = values.GetValueTyped(0);
|
---|
1829 | while (pos-- > 0)
|
---|
1830 | myArray[pos] = val;
|
---|
1831 | } else {
|
---|
1832 | if (values.Size.NumberOfElements != Size.NumberOfElements)
|
---|
1833 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1834 | pos = 0;
|
---|
1835 | foreach (ElementType val in values) {
|
---|
1836 | myArray[pos++] = val;
|
---|
1837 | }
|
---|
1838 | }
|
---|
1839 | } else if (indices.Size.NumberOfElements != values.Size.NumberOfElements
|
---|
1840 | && values.Size.NumberOfElements != 1)
|
---|
1841 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1842 | #endregion
|
---|
1843 | if (indices.IsEmpty)
|
---|
1844 | return;
|
---|
1845 | if (indices.Storage is ILDenseStorage< Int16>) {
|
---|
1846 |
|
---|
1847 | Int16 maxIndex, minIndex;
|
---|
1848 | ILDenseStorage< Int16> indStorage = indices.Storage as ILDenseStorage< Int16>;
|
---|
1849 | indStorage.GetLimits(out minIndex, out maxIndex);
|
---|
1850 | if (minIndex < 0)
|
---|
1851 | throw new ILArgumentException("sequential indices can not be negative");
|
---|
1852 | if ((int)maxIndex >= m_size.NumberOfElements) {
|
---|
1853 | // handle resize
|
---|
1854 | if (m_size.NumberOfDimensions == 2) {
|
---|
1855 | if (m_size.NumberOfElements <= 1) {
|
---|
1856 | // scalar or empty -> expand along 1
|
---|
1857 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1858 | } else if (m_size[0] > 1 && m_size[1] == 1) {
|
---|
1859 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1860 | } else if (m_size[0] == 1 && m_size[1] > 1) {
|
---|
1861 | ExpandArray(new int[] { 1, (int)maxIndex + 1 });
|
---|
1862 | } else
|
---|
1863 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1864 | } else
|
---|
1865 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1866 | }
|
---|
1867 | ElementType[] myArray = GetArrayForWrite();
|
---|
1868 |
|
---|
1869 | Int16[] indArray = indStorage.GetArrayForRead();
|
---|
1870 |
|
---|
1871 | int len = indices.Size.NumberOfElements;
|
---|
1872 | if (values.Size.NumberOfElements == 1) {
|
---|
1873 | ElementType scalarElement = values.GetValueTyped(0);
|
---|
1874 | for (int i = 0; i < len; ) {
|
---|
1875 | myArray[(int)indArray[i++]] = scalarElement;
|
---|
1876 | }
|
---|
1877 | } else {
|
---|
1878 | ElementType[] valArray = values.GetArrayForRead();
|
---|
1879 | for (int i = 0; i < len; ) {
|
---|
1880 | myArray[(int)indArray[i]] = valArray[i++];
|
---|
1881 | }
|
---|
1882 | }
|
---|
1883 | } else {
|
---|
1884 | throw new ILArgumentException("storage type of given indices is not supported");
|
---|
1885 | }
|
---|
1886 | }
|
---|
1887 | }
|
---|
1888 |
|
---|
1889 | /// <summary>
|
---|
1890 | /// Alter elements of this storage adressed by sequential indices
|
---|
1891 | /// </summary>
|
---|
1892 | /// <param name="indices">array specifying the elements to be altered, sequential indexing</param>
|
---|
1893 | /// <param name="values">ILBaseArray of the same type than this array, holding the new values.
|
---|
1894 | /// The number of elements of storage must match the
|
---|
1895 | /// number of elements of indices. The only exception to this rule is if 'values' is a scalar array. The
|
---|
1896 | /// single value of 'values' is than used to set all elements addressed by 'indices'.</param>
|
---|
1897 | /// <remarks><para>For empty arrays, scalar or vectors, indices outside the current bounds for
|
---|
1898 | /// this array will expand this array to the size neccessary.
|
---|
1899 | /// For other arrays the sequential indices given must fit inside this arrays dimensions. </para></remarks>
|
---|
1900 | public virtual void SetRange(ILBaseArray<float> indices, ILDenseStorage<ElementType> values) {
|
---|
1901 | //if (object.Equals(indices,null))
|
---|
1902 | // throw new ILArgumentException("indices given must not be null");
|
---|
1903 | if (object.Equals(values, null))
|
---|
1904 | throw new ILArgumentException("values given must not be null. Use A[ind] = null; if removal was intended.");
|
---|
1905 | using (ILScope.Enter(indices)) {
|
---|
1906 | #region set full shortcut
|
---|
1907 | if (indices is ILFullRange || object.Equals(indices, null)) {
|
---|
1908 | int pos;
|
---|
1909 | ElementType[] myArray = GetArrayForWrite();
|
---|
1910 | if (values.Size.NumberOfElements == 1) {
|
---|
1911 | pos = Size.NumberOfElements;
|
---|
1912 | ElementType val = values.GetValueTyped(0);
|
---|
1913 | while (pos-- > 0)
|
---|
1914 | myArray[pos] = val;
|
---|
1915 | } else {
|
---|
1916 | if (values.Size.NumberOfElements != Size.NumberOfElements)
|
---|
1917 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1918 | pos = 0;
|
---|
1919 | foreach (ElementType val in values) {
|
---|
1920 | myArray[pos++] = val;
|
---|
1921 | }
|
---|
1922 | }
|
---|
1923 | } else if (indices.Size.NumberOfElements != values.Size.NumberOfElements
|
---|
1924 | && values.Size.NumberOfElements != 1)
|
---|
1925 | throw new ILArgumentException("number of elements in source must match number of elements in destination array");
|
---|
1926 | #endregion
|
---|
1927 | if (indices.IsEmpty)
|
---|
1928 | return;
|
---|
1929 | if (indices.Storage is ILDenseStorage< float>) {
|
---|
1930 |
|
---|
1931 | float maxIndex, minIndex;
|
---|
1932 | ILDenseStorage< float> indStorage = indices.Storage as ILDenseStorage< float>;
|
---|
1933 | indStorage.GetLimits(out minIndex, out maxIndex);
|
---|
1934 | if (minIndex < 0)
|
---|
1935 | throw new ILArgumentException("sequential indices can not be negative");
|
---|
1936 | if ((int)maxIndex >= m_size.NumberOfElements) {
|
---|
1937 | // handle resize
|
---|
1938 | if (m_size.NumberOfDimensions == 2) {
|
---|
1939 | if (m_size.NumberOfElements <= 1) {
|
---|
1940 | // scalar or empty -> expand along 1
|
---|
1941 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1942 | } else if (m_size[0] > 1 && m_size[1] == 1) {
|
---|
1943 | ExpandArray(new int[] { (int)maxIndex + 1, 1 });
|
---|
1944 | } else if (m_size[0] == 1 && m_size[1] > 1) {
|
---|
1945 | ExpandArray(new int[] { 1, (int)maxIndex + 1 });
|
---|
1946 | } else
|
---|
1947 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1948 | } else
|
---|
1949 | throw new ILArgumentException("resizing array via sequential index access is supported for empty, scalar or vector only");
|
---|
1950 | }
|
---|
1951 | ElementType[] myArray = GetArrayForWrite();
|
---|
1952 |
|
---|
1953 | float[] indArray = indStorage.GetArrayForRead();
|
---|
1954 |
|
---|
1955 | int len = indices.Size.NumberOfElements;
|
---|
1956 | if (values.Size.NumberOfElements == 1) {
|
---|
1957 | ElementType scalarElement = values.GetValueTyped(0);
|
---|
1958 | for (int i = 0; i < len; ) {
|
---|
1959 | myArray[(int)indArray[i++]] = scalarElement;
|
---|
1960 | }
|
---|
1961 | } else {
|
---|
1962 | ElementType[] valArray = values.GetArrayForRead();
|
---|
1963 | for (int i = 0; i < len; ) {
|
---|
1964 | myArray[(int)indArray[i]] = valArray[i++];
|
---|
1965 | }
|
---|
1966 | }
|
---|
1967 | } else {
|
---|
1968 | throw new ILArgumentException("storage type of given indices is not supported");
|
---|
1969 | }
|
---|
1970 | }
|
---|
1971 | }
|
---|
1972 |
|
---|
1973 | #endregion HYCALPER AUTO GENERATED CODE
|
---|
1974 |
|
---|
1975 | /// <summary>
|
---|
1976 | /// Create referencing or solid array from this array, with shifted dimensions.
|
---|
1977 | /// </summary>
|
---|
1978 | /// <param name="shift">Number of dimensions to shift the array.</param>
|
---|
1979 | /// <returns>Shifted ILDenseStorage of the same type.</returns>
|
---|
1980 | /// <remarks><para>Shift is done 'to the left'.</para></remarks>
|
---|
1981 | public virtual ILDenseStorage<ElementType> ShiftDimensions (int shift) {
|
---|
1982 | return CreateShiftedStorage(shift);
|
---|
1983 | }
|
---|
1984 |
|
---|
1985 | #endregion
|
---|
1986 |
|
---|
1987 | #region Reshape, Concat, Repmat - overriding ILBaseArray<ElementType>
|
---|
1988 |
|
---|
1989 | /// <summary>
|
---|
1990 | /// reshape <b>this</b> storage
|
---|
1991 | /// </summary>
|
---|
1992 | /// <param name="newDimensions">new dimensions of the storage.</param>
|
---|
1993 | /// <remarks><para>This storage will be changed! The operation is cheap, since the
|
---|
1994 | /// number of elements (and their values) do not change. The same countable array
|
---|
1995 | /// is used in conjunction with a new dimension specifier. </para>
|
---|
1996 | /// </remarks>
|
---|
1997 | /// <exception cref="ILNumerics.Exceptions.ILArgumentException">If the number of elements in 'newDimension'
|
---|
1998 | /// do not match the number of elements in this storage.</exception>
|
---|
1999 | internal void Reshape(ILSize newDimensions) {
|
---|
2000 | if (newDimensions.NumberOfElements != m_size.NumberOfElements)
|
---|
2001 | throw new ILArgumentSizeException ("the number of elements must not change");
|
---|
2002 | m_size = newDimensions;
|
---|
2003 | }
|
---|
2004 | /// <summary>
|
---|
2005 | /// reshape <b>this</b> storage
|
---|
2006 | /// </summary>
|
---|
2007 | /// <param name="dims">new dimension length of the storage.</param>
|
---|
2008 | /// <remarks><para>This storage will be changed! The operation is cheap, since the
|
---|
2009 | /// number of elements (and their values) do not change. The same underlying storage
|
---|
2010 | /// is used in conjunction with the new dimension specifier.</para>
|
---|
2011 | /// </remarks>
|
---|
2012 | /// <exception cref="ILNumerics.Exceptions.ILArgumentException">If the number of elements in 'newDimension'
|
---|
2013 | /// do not match the number of elements in this storage.</exception>
|
---|
2014 | public void Reshape(params int[] dims) {
|
---|
2015 | ILSize newDimension = new ILSize(dims);
|
---|
2016 | Reshape(newDimension);
|
---|
2017 | }
|
---|
2018 | /// <summary>
|
---|
2019 | /// concatenate this storage
|
---|
2020 | /// </summary>
|
---|
2021 | /// <param name="A">n dimensional storage</param>
|
---|
2022 | /// <param name="dim">Index of dimension along which to concatenate the arrays.
|
---|
2023 | /// If dim is larger than the number of dimensions of one of the arrays
|
---|
2024 | /// its value will be used in modulus.</param>
|
---|
2025 | /// <returns>Array having the size of both input arrays laid beside one
|
---|
2026 | /// another along the <paramref name="dim"/>'s-dimension</returns>
|
---|
2027 | /// <remarks>The array returned will be a copy of both arrays involved. None
|
---|
2028 | /// of the input arrays will be altered.</remarks>
|
---|
2029 | public virtual ILDenseStorage<ElementType> Concat(ILDenseStorage<ElementType> A, int dim) {
|
---|
2030 | ILSize inDim = A.m_size;
|
---|
2031 | for (int i = 0; i < Math.Max(inDim.NumberOfDimensions, m_size.NumberOfDimensions); i++) {
|
---|
2032 | if (i != dim)
|
---|
2033 | if (m_size[i] != inDim[i])
|
---|
2034 | throw new ILArgumentSizeException("the length of dimensions of both arrays (except the dimension "
|
---|
2035 | + "to be concatenated) must match");
|
---|
2036 | }
|
---|
2037 | // concatenate
|
---|
2038 | if (inDim.NumberOfElements == 1 && m_size.NumberOfElements == 1) {
|
---|
2039 | // both scalars
|
---|
2040 | int[] dims = new int[2] { 1, 1 };
|
---|
2041 | dims[dim] = 2;
|
---|
2042 | ElementType[] retArr = ILMemoryPool.Pool.New<ElementType>(2);
|
---|
2043 | retArr[0] = m_data.Data[0];
|
---|
2044 | retArr[1] = A.m_data.Data[0];
|
---|
2045 | return CreateSelf(retArr, new ILSize(dims));
|
---|
2046 | }
|
---|
2047 | int lenOutArr = m_size.NumberOfElements + inDim.NumberOfElements;
|
---|
2048 | int[] retDims = m_size.ToIntArray(dim+1);
|
---|
2049 | retDims[dim] += inDim[dim];
|
---|
2050 | ILSize retDimension = new ILSize(retDims);
|
---|
2051 | ElementType[] retData = ILMemoryPool.Pool.New<ElementType>(retDimension.NumberOfElements);
|
---|
2052 | ElementType[] myData = GetArrayForRead();
|
---|
2053 | ElementType[] inData = A.GetArrayForRead();
|
---|
2054 |
|
---|
2055 | int len1 = m_size.SequentialIndexDistance(dim + 1);
|
---|
2056 | int len2 = inDim.SequentialIndexDistance(dim + 1);
|
---|
2057 | int posOutArr = 0, inPos = 0, myPos = 0;
|
---|
2058 | while (posOutArr < lenOutArr) {
|
---|
2059 | for (int i = 0; i < len1; i++)
|
---|
2060 | retData[posOutArr++] = myData[myPos++];
|
---|
2061 | for (int i = 0; i < len2; i++)
|
---|
2062 | retData[posOutArr++] = inData[inPos++];
|
---|
2063 | }
|
---|
2064 | return CreateSelf(retData,retDimension);
|
---|
2065 | }
|
---|
2066 |
|
---|
2067 | /// <summary>
|
---|
2068 | /// Replicate this storage to create a larger array.
|
---|
2069 | /// </summary>
|
---|
2070 | /// <param name="sizes">Sizes description. This may be a
|
---|
2071 | /// list or an array of integer values. If the number of elements in <paramref name="sizes"/> is
|
---|
2072 | /// less the number of dimensions in this array, the trailing dimensions will
|
---|
2073 | /// be set to 1 (singleton dimensions). On the other hand, if the number specified
|
---|
2074 | /// is larger then the number of dimensions of this array, the result
|
---|
2075 | /// will have its number of dimensions extended accordingly. </param>
|
---|
2076 | /// <returns>array which is made out of multiple copies of this array along
|
---|
2077 | /// specified dimensions, according to <paramref name="sizes"/>.</returns>
|
---|
2078 | internal virtual ILDenseStorage<ElementType> Repmat(params int[] sizes) {
|
---|
2079 | if (m_size.NumberOfElements == 0)
|
---|
2080 | return CreateSelf(new ILSize(sizes));
|
---|
2081 | ILRightSideRange rsRange = new ILRightSideRange(m_size, sizes);
|
---|
2082 | return CreateSubarrayStorage(rsRange);
|
---|
2083 |
|
---|
2084 |
|
---|
2085 | // experimental: via subindexing full dimensions
|
---|
2086 | //ILBaseArray[] dimArrays = new ILBaseArray[dims.Length];
|
---|
2087 | //for (int i = 0; i < dimArrays.Length; i++) {
|
---|
2088 | // dimArrays[i] = ILMath.cell(ILMath.full)[ILMath.zeros(1,dims[i])];
|
---|
2089 | //}
|
---|
2090 | //return Subarray(dimArrays);
|
---|
2091 |
|
---|
2092 | //build return dimensions
|
---|
2093 | //int[] newDim = new int[Math.Max(dims.Length, m_dimensions.NumberOfDimensions)];
|
---|
2094 | //for (int d = 0; d < newDim.Length; d++) {
|
---|
2095 | // if (d < dims.Length) {
|
---|
2096 | // newDim[d] = m_dimensions[d] * dims[d];
|
---|
2097 | // } else {
|
---|
2098 | // newDim[d] = m_dimensions[d];
|
---|
2099 | // }
|
---|
2100 | //}
|
---|
2101 | //ILSize outDim = new ILSize(true, newDim);
|
---|
2102 | //if (m_dimensions.NumberOfElements == 0 || outDim.NumberOfElements == 0)
|
---|
2103 | // return new ILDenseStorage<ElementType>(new ILCountableArray<ElementType>(0), outDim);
|
---|
2104 | //ILDenseStorage<ElementType> ret = new ILDenseStorage<ElementType>(
|
---|
2105 | // new ILCountableArray<ElementType>(outDim.NumberOfElements), outDim);
|
---|
2106 | //ElementType[] retArray = ret.GetArrayForWrite();
|
---|
2107 | //ElementType[] myArray = GetArrayForRead();
|
---|
2108 | //int[] outStrides = outDim.GetSequentialIndexDistances(m_dimensions.NumberOfDimensions);
|
---|
2109 | //int[] myStrides = m_dimensions.GetSequentialIndexDistances(m_dimensions.NumberOfDimensions);
|
---|
2110 | //retArray[0] = myArray[0];
|
---|
2111 | //if (outDim.NumberOfElements < ILNumerics.Settings.s_minParallelElement1Count) {
|
---|
2112 | // for (int outPos = 1; outPos < outDim.NumberOfElements; ) {
|
---|
2113 | // int inPos = 0;
|
---|
2114 | // for (int d = m_dimensions.NumberOfDimensions; d-- > 0; ) {
|
---|
2115 | // inPos += ((outPos / outStrides[d]) % m_dimensions[d])
|
---|
2116 | // * myStrides[d];
|
---|
2117 | // }
|
---|
2118 | // retArray[outPos++] = myArray[inPos];
|
---|
2119 | // }
|
---|
2120 | //} else {
|
---|
2121 | // System.Threading.Tasks.Parallel.For(1,outDim.NumberOfElements, i => {
|
---|
2122 | // int inPos = 0;
|
---|
2123 | // for (int d = m_dimensions.NumberOfDimensions; d-- > 0; ) {
|
---|
2124 | // inPos += ((i / outStrides[d]) % m_dimensions[d])
|
---|
2125 | // * myStrides[d];
|
---|
2126 | // }
|
---|
2127 | // retArray[i] = myArray[inPos];
|
---|
2128 | // });
|
---|
2129 | //}
|
---|
2130 | //return ret;
|
---|
2131 | }
|
---|
2132 |
|
---|
2133 | /// <summary>
|
---|
2134 | /// Remove individual parts of a dimension from <b>this</b> storage
|
---|
2135 | /// </summary>
|
---|
2136 | /// <param name="dimension">index of the dimension, where <c>indices</c> are to be removed</param>
|
---|
2137 | /// <param name="indices">indices to be removed from <paramref name="dimension"/>, -1 for "wipe" (make this an empty storage)</param>
|
---|
2138 | /// <remarks>The function directly operates on <b>this</b> storage! After the function returns,
|
---|
2139 | /// this storage may have its dimensions changed!</remarks>
|
---|
2140 | internal virtual void Remove(int dimension, ILIntList indices) {
|
---|
2141 | using (ILScope.Enter()) {
|
---|
2142 | if (dimension >= Size.NumberOfDimensions)
|
---|
2143 | throw new ILArgumentException("index out of range");
|
---|
2144 | if (dimension == -1) {
|
---|
2145 | Data = new ILCountableArray<ElementType>(0);
|
---|
2146 | m_size = ILSize.Empty00;
|
---|
2147 | return;
|
---|
2148 | }
|
---|
2149 | // TODO: may should be replaced with a faster (&fancier? ) version... ??
|
---|
2150 | ILBaseArray[] dims = new ILBaseArray[Size.NumberOfDimensions];
|
---|
2151 | ILIntList keepInd = ILIntList.Create();
|
---|
2152 | ILIntList remvInd = indices;
|
---|
2153 | int max = Size[dimension];
|
---|
2154 | foreach (int i in indices)
|
---|
2155 | if (i >= max || i < 0) throw new ILArgumentException("removal index out of range");
|
---|
2156 | for (int i = 0; i < max; i++) {
|
---|
2157 | if (!remvInd.Contains(i)) {
|
---|
2158 | keepInd.Add(i);
|
---|
2159 | }
|
---|
2160 | }
|
---|
2161 | // we give the indices to _keep_ to the subarray function
|
---|
2162 | int keepIndCount = keepInd.Count;
|
---|
2163 | ILArray<int> remIndices = ILMath.array<int>(keepInd.GetArray(), new ILSize(1, keepIndCount));
|
---|
2164 | if (remIndices.Size.NumberOfElements == Size[dimension]) {
|
---|
2165 | // nothing to do
|
---|
2166 | return;
|
---|
2167 | }
|
---|
2168 | for (int i = 0; i < dims.Length; i++) {
|
---|
2169 | dims[i] = ILMath.full;
|
---|
2170 | }
|
---|
2171 | dims[dimension] = remIndices;
|
---|
2172 | ILDenseStorage<ElementType> ret = Subarray(dims);
|
---|
2173 | Dispose(); // this will for reference element types (e.g. ILCell) also dispose the removed elements
|
---|
2174 |
|
---|
2175 | Data = ret.Data;
|
---|
2176 | m_size = ret.Size;
|
---|
2177 |
|
---|
2178 | }
|
---|
2179 | }
|
---|
2180 |
|
---|
2181 | #endregion
|
---|
2182 |
|
---|
2183 | #region serialize
|
---|
2184 | /// <summary>
|
---|
2185 | /// Prepare for serialization.
|
---|
2186 | /// </summary>
|
---|
2187 | /// <param name="context">Streaming Context - provided by the formatter.</param>
|
---|
2188 | /// <remarks>nothing to do here</remarks>
|
---|
2189 | [OnSerializing]
|
---|
2190 | private void OnSerialize(StreamingContext context) {
|
---|
2191 | }
|
---|
2192 |
|
---|
2193 | /// <summary>
|
---|
2194 | /// Post operations aftre deserializing is finished.
|
---|
2195 | /// </summary>
|
---|
2196 | /// <param name="context">Streaming context provided by the formatter.</param>
|
---|
2197 | /// <remarks>nothing to do here</remarks>
|
---|
2198 | [OnDeserialized]
|
---|
2199 | void OnDeserialized(StreamingContext context) {
|
---|
2200 | }
|
---|
2201 |
|
---|
2202 | #endregion
|
---|
2203 |
|
---|
2204 | #region single element access
|
---|
2205 |
|
---|
2206 | /// <summary>
|
---|
2207 | /// Get single value from this storage.
|
---|
2208 | /// </summary>
|
---|
2209 | /// <param name="idx">Integer array holding the dimension specifier</param>
|
---|
2210 | /// <returns>Element at the position pointed to by idx.</returns>
|
---|
2211 | internal override object GetValue(params int[] idx) {
|
---|
2212 | return GetValueTyped(idx);
|
---|
2213 | }
|
---|
2214 | /// <summary>
|
---|
2215 | /// Get single value from this storage.
|
---|
2216 | /// </summary>
|
---|
2217 | /// <param name="idx">Integer array holding the dimension specifier</param>
|
---|
2218 | /// <returns>Element at the position pointed to by idx.</returns>
|
---|
2219 | internal override ElementType GetValueTyped(params int[] idx) {
|
---|
2220 | if (idx.Length == 1)
|
---|
2221 | return m_data.Data[idx[0]];
|
---|
2222 | int destIdx = idx[0], d, highDims;
|
---|
2223 | if (destIdx >= m_size[0] || destIdx < 0)
|
---|
2224 | throw new ILArgumentException("GetValue: index out of bound for dimensions: 0");
|
---|
2225 | int [] seqDist = m_size.GetSequentialIndexDistances(0);
|
---|
2226 | if (idx.Length <= m_size.NumberOfDimensions) {
|
---|
2227 | for (d = 1; d < idx.Length - 1; d++) {
|
---|
2228 | if (idx[d] >= m_size[d] || idx[d] < 0)
|
---|
2229 | throw new ILArgumentException("GetValue: index out of bound for dimensions: " + d.ToString());
|
---|
2230 | destIdx += idx[d] * seqDist[d];
|
---|
2231 | }
|
---|
2232 | for (highDims = idx[d]; d<m_size.NumberOfDimensions && highDims > 0; d++) {
|
---|
2233 | destIdx += (highDims % m_size[d]) * seqDist[d];
|
---|
2234 | highDims /= m_size[d];
|
---|
2235 | }
|
---|
2236 | if (highDims > 0) throw new ILArgumentException ("GetValue: index out of bound!");
|
---|
2237 | return m_data.Data[destIdx];
|
---|
2238 | } else {
|
---|
2239 | highDims = m_size.NumberOfDimensions;
|
---|
2240 | for (d = 1; d < highDims; d++) {
|
---|
2241 | if (idx[d] >= m_size[d] || idx[d] < 0)
|
---|
2242 | throw new ILArgumentException("GetValue: index out of bound for dimensions: " + d.ToString());
|
---|
2243 | destIdx += idx[d] * seqDist[d];
|
---|
2244 | }
|
---|
2245 | for (; d<idx.Length; d++) {
|
---|
2246 | if (idx[d] != 0)
|
---|
2247 | throw new ILArgumentException("GetValue: index out of bound for dimension: " + d.ToString() + ". Trailing indices must be 0!");
|
---|
2248 | }
|
---|
2249 | return m_data.Data[destIdx];
|
---|
2250 | }
|
---|
2251 | }
|
---|
2252 | internal override ILStorage GetValueAsStorage(params int[] innerIndices) {
|
---|
2253 | return new ILDenseStorage<ElementType>(new ElementType[1] { GetValueTyped(innerIndices) }, ILSize.Scalar1_1);
|
---|
2254 | }
|
---|
2255 | internal override ILBaseArray GetAsBaseArray() {
|
---|
2256 | return new ILRetArray<ElementType>((ILDenseStorage<ElementType>)Clone());
|
---|
2257 | }
|
---|
2258 |
|
---|
2259 | /// <summary>
|
---|
2260 | /// Get single value from this storage by a single sequential access.
|
---|
2261 | /// </summary>
|
---|
2262 | /// <param name="idx">Integer array holding the dimension specifier
|
---|
2263 | /// pointing to the value.</param>
|
---|
2264 | /// <param name="dims">Out value: return position mapped to dimensions.</param>
|
---|
2265 | /// <returns>Object in the position pointed to by idx.</returns>
|
---|
2266 | /// <remarks>dims is the final position into the array for the sequential index specification <c>idx</c>.</remarks>
|
---|
2267 | internal override object GetValueSeq(int idx, ref int[] dims) {
|
---|
2268 | int IdxCpy = idx;
|
---|
2269 | for (int d = 0; d<m_size.NumberOfDimensions; d++) {
|
---|
2270 | dims[d] = (IdxCpy % m_size[d]);
|
---|
2271 | IdxCpy /= m_size[d]; // must go to end, to fully clear dims
|
---|
2272 | }
|
---|
2273 | return m_data.Data[idx];
|
---|
2274 | }
|
---|
2275 | /// <summary>
|
---|
2276 | /// Set single value to element at the specified index.
|
---|
2277 | /// </summary>
|
---|
2278 | /// <param name="value">New value.</param>
|
---|
2279 | /// <param name="idx">Index of the element to be altered.</param>
|
---|
2280 | internal override void SetValue(object value, params int[] idx) {
|
---|
2281 | try {
|
---|
2282 | SetValueTyped((ElementType)value, idx);
|
---|
2283 | } catch (InvalidCastException) {
|
---|
2284 | SetValueTyped((ElementType)Convert.ChangeType(value, typeof(ElementType)), idx);
|
---|
2285 | }
|
---|
2286 | }
|
---|
2287 | /// <summary>
|
---|
2288 | /// Set value of element at the specified position.
|
---|
2289 | /// </summary>
|
---|
2290 | /// <param name="value">new value</param>
|
---|
2291 | /// <param name="idx">position of the element to be altered</param>
|
---|
2292 | /// <remarks><para>This function does support automatic expansion of the array
|
---|
2293 | /// if indices lay outside the dimension limits of the array. However, because
|
---|
2294 | /// of ambiguity reasons this is not reliable supported for vector sized arrays.</para></remarks>
|
---|
2295 | internal override void SetValueTyped(ElementType value, params int[] idx) {
|
---|
2296 | try {
|
---|
2297 | if (idx.Length < 2) {
|
---|
2298 | if (idx.Length == 1) {
|
---|
2299 | if (idx[0] >= m_size.NumberOfElements)
|
---|
2300 | throw new IndexOutOfRangeException();
|
---|
2301 | GetArrayForWrite()[idx[0]] = value;
|
---|
2302 | }
|
---|
2303 | return;
|
---|
2304 | }
|
---|
2305 | int i = m_size.IndexFromArray(idx);
|
---|
2306 | if (i >= m_size.NumberOfElements)
|
---|
2307 | throw new IndexOutOfRangeException();
|
---|
2308 | GetArrayForWrite()[i] = (ElementType)value;
|
---|
2309 | } catch (Exception exc) {
|
---|
2310 | if (exc is ILArgumentException
|
---|
2311 | || exc is IndexOutOfRangeException ) {
|
---|
2312 | // expanding ?
|
---|
2313 | int [] dimensions = m_size.ToIntArray(Math.Max(idx.Length,m_size.NumberOfDimensions));
|
---|
2314 | bool mustExpand = false;
|
---|
2315 | int i = m_size.IndexFromArray(ref mustExpand, ref dimensions, idx);
|
---|
2316 | if (mustExpand) {
|
---|
2317 | ExpandArray(dimensions);
|
---|
2318 | m_data.Data[i] = value;
|
---|
2319 | } else {
|
---|
2320 | throw;
|
---|
2321 | }
|
---|
2322 | }
|
---|
2323 | }
|
---|
2324 | }
|
---|
2325 |
|
---|
2326 | /// <summary>
|
---|
2327 | /// [depricated] Convert index array into sequential index for storage access.
|
---|
2328 | /// </summary>
|
---|
2329 | /// <param name="idx">int array with dimension specification.</param>
|
---|
2330 | /// <returns>Index of requested value inside the solid storage. This
|
---|
2331 | /// value can directly be used to query the corresponding value via GetArrayForRead()[return_value].
|
---|
2332 | /// </returns>
|
---|
2333 | /// <remarks><b>This function is deprecated! Use <see cref="ILNumerics.ILSize.IndexFromArray(int[])"/> instead!</b><br/>
|
---|
2334 | /// If the length of idx is smaler than the number of dimensions
|
---|
2335 | /// of this storage, the trailing dimensions will be replaced with "0". I.e
|
---|
2336 | /// the first index of each non specified dimension will be used.
|
---|
2337 | /// If length of idx is larger than the dimensions of this storage, the behavior
|
---|
2338 | /// is undefined. Therefore this function should be enclosed in try, catch blocks
|
---|
2339 | /// to handle this case!</remarks>
|
---|
2340 | internal int getBaseIndex(params int[] idx) {
|
---|
2341 | // arghs! -> ugly! piuh!!
|
---|
2342 | if (idx == null) throw new ILArgumentException("indices specified must not be null");
|
---|
2343 | if (idx.Length < m_size.NumberOfDimensions) {
|
---|
2344 | bool dummy;
|
---|
2345 | int [] tmp = ILMemoryPool.Pool.New<int>(m_size.NumberOfDimensions,true, out dummy);
|
---|
2346 | for (int i = 0; i < idx.Length; i++) {
|
---|
2347 | tmp[i] = idx[i];
|
---|
2348 | }
|
---|
2349 | return m_size.IndexFromArray(tmp);
|
---|
2350 | }
|
---|
2351 | return m_size.IndexFromArray(idx);
|
---|
2352 | }
|
---|
2353 | /// <summary>
|
---|
2354 | /// [depricated] Convert index array into sequential index for storage access. Ommit any bound checking.
|
---|
2355 | /// </summary>
|
---|
2356 | /// <param name="idx">int array with dimensions specification.</param>
|
---|
2357 | /// <param name="MustExpand">Output parameter. On return determine, if the index
|
---|
2358 | /// specification points outside of the dimensions of this ILDenseStorage and the array
|
---|
2359 | /// must be expanded before accessing elements on that position.</param>
|
---|
2360 | /// <param name="dimensions">if the array was found to be expanded, this are the
|
---|
2361 | /// needed dimension sizes for the new array. The sizes are computed from the range
|
---|
2362 | /// specification given.</param>
|
---|
2363 | /// <returns>Index of requested value inside the solid storage. This
|
---|
2364 | /// value may directly be used to query the value via m_data[return_value].
|
---|
2365 | /// The value returned is valid for solid storages as well as for reference
|
---|
2366 | /// storages.
|
---|
2367 | /// </returns>
|
---|
2368 | /// <remarks>
|
---|
2369 | /// <para>idx must be not null and must contain at least one element.</para>
|
---|
2370 | /// <para>If the length of idx is smaler than the number of dimensions
|
---|
2371 | /// of this storage, the trailing dimensions will be replaced with "0". I.e
|
---|
2372 | /// the first index of each non specified dimensions will be used.
|
---|
2373 | /// If length of idx is larger than the dimensions of this storage, the index of
|
---|
2374 | /// the expanded array will be returned.</para></remarks>
|
---|
2375 | internal int getBaseIndex(ref bool MustExpand, ref int[] dimensions, params int[] idx) {
|
---|
2376 | int destIdx = 0;
|
---|
2377 | if (idx.Length == 1) {
|
---|
2378 | destIdx = idx[0];
|
---|
2379 | if (destIdx < 0)
|
---|
2380 | throw new ILArgumentException("check index for dimension 0!");
|
---|
2381 | if (destIdx >= m_size.NumberOfElements) {
|
---|
2382 | MustExpand = true;
|
---|
2383 | dimensions[0] = destIdx + 1;
|
---|
2384 | }
|
---|
2385 | return destIdx;
|
---|
2386 | }
|
---|
2387 | return m_size.IndexFromArray(ref MustExpand, ref dimensions, idx);
|
---|
2388 | }
|
---|
2389 | /// <summary>
|
---|
2390 | /// Copy values of all elements into System.Array.
|
---|
2391 | /// </summary>
|
---|
2392 | /// <param name="result">System.Array, holding all element values of this ILDenseStorage.</param>
|
---|
2393 | /// <remarks>The System.Array may be predefined. If its length is sufficient, it will be used and
|
---|
2394 | /// its leading elements will be overwritten when function returns. If 'result' is null or has too few elements,
|
---|
2395 | /// it will be recreated from the ILNumerics memory pool.</remarks>
|
---|
2396 | public void ExportValues(ref ElementType[] result) {
|
---|
2397 | if (result == null || result.Length < m_size.NumberOfElements)
|
---|
2398 | result = ILMemoryPool.Pool.New<ElementType>(m_size.NumberOfElements);
|
---|
2399 | int pos = 0;
|
---|
2400 | foreach (ElementType v in this) {
|
---|
2401 | result[pos++] = v;
|
---|
2402 | }
|
---|
2403 | }
|
---|
2404 | /// <summary>
|
---|
2405 | /// Get direct reference to inner System.Array storage for <b>write access</b>
|
---|
2406 | /// </summary>
|
---|
2407 | /// <returns>reference to inner System.Array</returns>
|
---|
2408 | /// <remarks>Altering this array can be done directly. If necessary, the array is detached before
|
---|
2409 | /// returned. Watch the column order format of storages in ILNumerics! Keep in minds, the length
|
---|
2410 | /// of the array may exceeds the number of elements.
|
---|
2411 | /// <para>Accessing the inner system array directly should be left to ILNumerics experts only!
|
---|
2412 | /// Unless you really know, what you are doing, you should rather use the higher order access
|
---|
2413 | /// methods provided by ILArray<T>! (You have been warned!)</para></remarks>
|
---|
2414 | internal ElementType[] GetArrayForWrite() {
|
---|
2415 | if (m_data.ReferenceCount > 1) {
|
---|
2416 | Detach();
|
---|
2417 | }
|
---|
2418 | return m_data.Data;
|
---|
2419 | }
|
---|
2420 | /// <summary>
|
---|
2421 | /// Get direct reference to inner System.Array storage for <b>read access</b>
|
---|
2422 | /// </summary>
|
---|
2423 | /// <returns>reference to inner System.Array for reading</returns>
|
---|
2424 | /// <remarks>This method is provided for experts only! Altering elements of this
|
---|
2425 | /// array may cause the data to be invalidated or corrupted! Use this array only for reading! Note
|
---|
2426 | /// the ILNumerics array storage format (column major). Keep in mind, the length
|
---|
2427 | /// of the array may exceeds the number of elements!
|
---|
2428 | /// <para>Accessing the inner system array directly should be left to ILNumerics experts only!
|
---|
2429 | /// Unless you really know, what you are doing, you should rather use the higher order access
|
---|
2430 | /// methods provided by ILArray<T>! (You have been warned!)</para></remarks>
|
---|
2431 | internal ElementType[] GetArrayForRead() {
|
---|
2432 | //if (PendingTasks > 0)
|
---|
2433 | // System.Threading.SpinWait.SpinUntil(() => { return PendingTasks == 0; });
|
---|
2434 | return m_data.Data;
|
---|
2435 | }
|
---|
2436 |
|
---|
2437 | #endregion
|
---|
2438 |
|
---|
2439 | /// <summary>
|
---|
2440 | /// Create lazy,shallow copy of this array
|
---|
2441 | /// </summary>
|
---|
2442 | /// <returns>ILDenseStorage as copy of this storage.</returns>
|
---|
2443 | /// <remarks>The ILDenseStorage object returned will be of the same size and type than this object.
|
---|
2444 | /// <para>The copy is done lazy. This means, the new storage will at first share the memory
|
---|
2445 | /// with that storage. This will take almost no memory / processor time. As soon as attempts
|
---|
2446 | /// are made to <b>alter</b> the new storage, it will be detached from this storage and use own memeory.</para></remarks>
|
---|
2447 | internal override ILStorage Clone() {
|
---|
2448 | return CreateSelf(m_data,m_size);
|
---|
2449 | }
|
---|
2450 | internal ILCountableArray<ElementType> GetDataArray() {
|
---|
2451 | return m_data;
|
---|
2452 | }
|
---|
2453 | internal virtual void IndexSubrange(ILDenseStorage<ElementType> value, ILBaseArray[] range) {
|
---|
2454 | using (ILScope.Enter(range)) {
|
---|
2455 | if (Object.ReferenceEquals(value, null) || value.Size.NumberOfElements == 0) {
|
---|
2456 | #region remove
|
---|
2457 | if (range == null) return;
|
---|
2458 |
|
---|
2459 | ILLeftSideRange rng = new ILLeftSideRange(Size, range);
|
---|
2460 | if (rng.Expanding) {
|
---|
2461 | throw new ILArgumentException("invalid range for removal specified");
|
---|
2462 | }
|
---|
2463 | if (rng.Size.NumberOfElements == 0) {
|
---|
2464 | return;
|
---|
2465 | }
|
---|
2466 | int nonFullDims = 0;
|
---|
2467 | int dimIdx = -1;
|
---|
2468 | // check validity
|
---|
2469 | for (int i = 0; i < rng.RangeArray.Length; i++) {
|
---|
2470 | if (rng[i].Count != 1 || rng[i][0] >= 0) {
|
---|
2471 | if (++nonFullDims > 1)
|
---|
2472 | throw new ILArgumentException("for removal only one dimension can be 'non-full'");
|
---|
2473 | dimIdx = i;
|
---|
2474 | foreach (int ind in rng[i]) {
|
---|
2475 | if (ind < 0) {
|
---|
2476 | throw new ILArgumentException("invalid removal indices: all but at most one dimensions must be specified as 'full'. check dimension #" + i.ToString());
|
---|
2477 | }
|
---|
2478 | }
|
---|
2479 | }
|
---|
2480 | }
|
---|
2481 | // remove
|
---|
2482 | ILSize newDim = new ILSize(Size.ToIntArrayEx(rng.RangeArray.Length));
|
---|
2483 | ILSize oldDimensions = Size;
|
---|
2484 | try {
|
---|
2485 | Reshape(newDim); // <- cheap!
|
---|
2486 | if (dimIdx >= 0) {
|
---|
2487 | Remove(dimIdx, rng[dimIdx]); // <- expensive!
|
---|
2488 | } else {
|
---|
2489 | // all dims full specified
|
---|
2490 | Remove(dimIdx, null); // <- expensive!
|
---|
2491 | }
|
---|
2492 | } catch (Exception) {
|
---|
2493 | Reshape(oldDimensions);
|
---|
2494 | throw;
|
---|
2495 | }
|
---|
2496 | #endregion
|
---|
2497 | } else {
|
---|
2498 | #region setrange
|
---|
2499 | if (range == null || range.Length == 0) {
|
---|
2500 | return;
|
---|
2501 | } else if (range.Length == 1) {
|
---|
2502 | if (range[0] is ILDenseArray<double>) {
|
---|
2503 | SetRange(range[0] as ILDenseArray<double>, value);
|
---|
2504 | return;
|
---|
2505 | } else if (range[0] is ILDenseArray<string>) {
|
---|
2506 | // special case? A[":;0:3;0:end;..."] -> multiple dimensions given as single string
|
---|
2507 | string indStr = (string)(range[0] as ILDenseArray<string>).GetValue(0);
|
---|
2508 | string[] dimParts = indStr.Split(';');
|
---|
2509 | if (dimParts.Length == 0) {
|
---|
2510 | // empty range given
|
---|
2511 | return;
|
---|
2512 | } else if (dimParts.Length > 1) {
|
---|
2513 | range = new ILBaseArray[dimParts.Length];
|
---|
2514 | for (int i = 0; i < dimParts.Length; i++) {
|
---|
2515 | range[i] = dimParts[i];
|
---|
2516 | }
|
---|
2517 | // re-enter function to push the new arrays into scope
|
---|
2518 | IndexSubrange(value,range);
|
---|
2519 | return;
|
---|
2520 | } else {
|
---|
2521 | ILBaseArray indices = ILRange.ParseDimension(indStr, Size.NumberOfElements);
|
---|
2522 | if (indices is ILBaseArray<Misc.ILFullRange>) {
|
---|
2523 | SetRangeFull(value);
|
---|
2524 | } else {
|
---|
2525 | SetRange(indices as ILDenseArray<int>, value);
|
---|
2526 | }
|
---|
2527 | return;
|
---|
2528 | }
|
---|
2529 | } else if (range[0] is ILDenseArray<float>) {
|
---|
2530 | SetRange(range[0] as ILDenseArray<float>, value);
|
---|
2531 | return;
|
---|
2532 | } else if (range[0] is ILDenseArray<Int32>) {
|
---|
2533 | SetRange(range[0] as ILDenseArray<Int32>, value);
|
---|
2534 | return;
|
---|
2535 | } else if (range[0] is ILDenseArray<Int64>) {
|
---|
2536 | SetRange(range[0] as ILDenseArray<Int64>, value);
|
---|
2537 | return;
|
---|
2538 | } else if (range[0] is ILLogical) {
|
---|
2539 | SetRange(ILNumerics.ILMath.find(range[0] as ILLogical), value);
|
---|
2540 | return;
|
---|
2541 | } else if (range[0] is ILRetLogical) {
|
---|
2542 | SetRange(ILNumerics.ILMath.find(range[0] as ILRetLogical), value);
|
---|
2543 | return;
|
---|
2544 | }
|
---|
2545 | }
|
---|
2546 | ILLeftSideRange rng = new ILLeftSideRange(Size, range);
|
---|
2547 | if (rng.Expanding) {
|
---|
2548 | ExpandArray(rng);
|
---|
2549 | }
|
---|
2550 | SetRange(rng, value);
|
---|
2551 | #endregion
|
---|
2552 | }
|
---|
2553 | }
|
---|
2554 | }
|
---|
2555 |
|
---|
2556 | #region IEnumerable<ILBaseArray<ElementType>> Member
|
---|
2557 |
|
---|
2558 | /// <summary>
|
---|
2559 | /// enumerator returning elements as ElementType
|
---|
2560 | /// </summary>
|
---|
2561 | public override IEnumerator<ElementType> GetEnumerator ( ) {
|
---|
2562 | int len = m_size.NumberOfElements;
|
---|
2563 | ElementType[] myData = GetArrayForRead();
|
---|
2564 | for (int i = 0; i < len; i++)
|
---|
2565 | yield return myData[i];
|
---|
2566 | }
|
---|
2567 | #endregion
|
---|
2568 |
|
---|
2569 | #region private helper
|
---|
2570 | /// <summary>
|
---|
2571 | /// helper function to gather some parameters for partial dimension removal
|
---|
2572 | /// </summary>
|
---|
2573 | /// <param name="rng">object with index specifications. May be of
|
---|
2574 | /// type ILBaseArray[] with numeric arrays or a string array according
|
---|
2575 | /// to the format of <see cref="ILNumerics.Storage.ILRange"/>.
|
---|
2576 | /// </param>
|
---|
2577 | /// <param name="dimensionIdx">Out parameter: index of dimension the indices to be removed lie in.</param>
|
---|
2578 | /// <param name="indices">Indices to be removed.</param>
|
---|
2579 | /// <param name="dimensions">Dimension structure, can be used to reshape the storage <b>before</b> the removal</param>
|
---|
2580 | /// <remarks>If range comprises a range dimension specification which is smaller than
|
---|
2581 | /// the actual number of dimension of this storage, the storage must be reshaped in advance of the removal.
|
---|
2582 | /// This reshaping proccess will <b>not</b> be done inside this function! However
|
---|
2583 | /// the <c>dimension</c> value returned reflects the size of the storage before removing and therefore
|
---|
2584 | /// can be utilized for reshaping the storage.</remarks>
|
---|
2585 | /// <exception cref="ILNumerics.Exceptions.ILArgumentException">If:<list type="bullet">
|
---|
2586 | /// <item>The length of range exceeds the dimensions of this storage.</item>
|
---|
2587 | /// <item>More than one or less than one dimension of <c>range</c> was not null.</item>
|
---|
2588 | /// <item>The type of range was invalid, or</item>
|
---|
2589 | /// <item>Range is of type <see cref="ILNumerics.ILBaseArray"/>, but the element type is not numeric</item>
|
---|
2590 | /// </list></exception>
|
---|
2591 | internal void ExtractRemovalParameter(ILBaseArray[] rng, out int dimensionIdx, ref ILIntList indices, out ILSize dimensions) {
|
---|
2592 | dimensionIdx = 0;
|
---|
2593 | dimensions = null;
|
---|
2594 | if (rng.Length > m_size.NumberOfDimensions)
|
---|
2595 | throw new ILArgumentException("Error removing: dimension specification exceeds matrix dimensions.");
|
---|
2596 | int specCount = 0;
|
---|
2597 | int tmp = 0;
|
---|
2598 | if (rng.Length == 1 && rng[0] is ILBaseArray<string>) {
|
---|
2599 | string allRangeString = (string)(rng[0] as ILBaseArray<string>).GetValue(0);
|
---|
2600 | string[] ranges = allRangeString.Split(';');
|
---|
2601 | if (ranges.Length > 1) {
|
---|
2602 | rng = new ILBaseArray[ranges.Length];
|
---|
2603 | for (int i = 0; i < ranges.Length; i++) {
|
---|
2604 | rng[i] = ranges[i];
|
---|
2605 | }
|
---|
2606 | }
|
---|
2607 | }
|
---|
2608 | int[] outDim = Size.GetReshapedSize(rng.Length);
|
---|
2609 | for (int i = 0; i < rng.Length; i++) {
|
---|
2610 | if (object.Equals(rng[i], null)) {
|
---|
2611 | // nothing to remove
|
---|
2612 | if (indices != null) {
|
---|
2613 | indices.Clear();
|
---|
2614 | }
|
---|
2615 | return;
|
---|
2616 | } else if (!rng[i].IsEmpty) {
|
---|
2617 | if (rng[i] is ILDenseArray<string>) {
|
---|
2618 | string stringVal = (rng[i] as ILDenseArray<string>).GetValue(0);
|
---|
2619 | ILBaseArray indFromString = ILRange.ParseDimension(stringVal,outDim[i]);
|
---|
2620 | if (!(indFromString is ILBaseArray<ILFullRange>)) {
|
---|
2621 | if (specCount++ > 0) {
|
---|
2622 | throw new ILArgumentException("only one dimension can be non-fully specified for removal");
|
---|
2623 | }
|
---|
2624 | dimensionIdx = i;
|
---|
2625 | indices = new ILIntList(indFromString as ILDenseArray<int>);
|
---|
2626 | }
|
---|
2627 | continue;
|
---|
2628 | }
|
---|
2629 | dimensionIdx = i;
|
---|
2630 | if (specCount++ > 0) {
|
---|
2631 | throw new ILArgumentException("only one dimension can be non-fully specified for removal");
|
---|
2632 | }
|
---|
2633 | if (rng[i] is ILBaseArray<Expression>) {
|
---|
2634 | // A[end + ...] given
|
---|
2635 | Expression expr = (rng[i] as ILBaseArray<Expression>).GetValue(0);
|
---|
2636 | int exprVal = ILExpression.Evaluate(expr, Size[i] - 1);
|
---|
2637 | indices = ILIntList.Create();
|
---|
2638 | for (int p = 0; p < tmp; p++) {
|
---|
2639 | indices.Add(exprVal);
|
---|
2640 | }
|
---|
2641 | } else if (rng[i] is ILLogical) {
|
---|
2642 | ILArray<double> ind = ILNumerics.ILMath.find((ILLogical) rng[i]);
|
---|
2643 | tmp = ind.Size.NumberOfElements;
|
---|
2644 | indices = ILIntList.Create();
|
---|
2645 | for (int p = 0; p < tmp; p++) {
|
---|
2646 | indices.Add((int)ind.GetValue(p));
|
---|
2647 | }
|
---|
2648 | } else if (rng[i] is ILRetLogical) {
|
---|
2649 | ILArray<double> ind = ILNumerics.ILMath.find((ILRetLogical) rng[i]);
|
---|
2650 | tmp = ind.Size.NumberOfElements;
|
---|
2651 | indices = ILIntList.Create();
|
---|
2652 | for (int p = 0; p < tmp; p++) {
|
---|
2653 | indices.Add((int)ind.GetValue(p));
|
---|
2654 | }
|
---|
2655 | |
---|
2656 | /* !HC:TYPELIST:
|
---|
2657 | <hycalper>
|
---|
2658 | <type>
|
---|
2659 | <source locate="after">
|
---|
2660 | inArr1
|
---|
2661 | </source>
|
---|
2662 | <destination>float</destination>
|
---|
2663 | <destination>Int16</destination>
|
---|
2664 | <destination>Int32</destination>
|
---|
2665 | <destination>Int64</destination>
|
---|
2666 | <destination>byte</destination>
|
---|
2667 | </type>
|
---|
2668 | </hycalper>
|
---|
2669 | */
|
---|
2670 |
|
---|
2671 | } else if (rng[i] is ILDenseArray<double> ) {
|
---|
2672 | ILDenseArray<double> ind = rng[i] as ILDenseArray<double> ;
|
---|
2673 | tmp = ind.Size.NumberOfElements;
|
---|
2674 | indices = ILIntList.Create();
|
---|
2675 | for (int p = 0; p < tmp; p++) {
|
---|
2676 | indices.Add((int)ind.GetValue(p));
|
---|
2677 | }
|
---|
2678 | |
---|
2679 | #region HYCALPER AUTO GENERATED CODE
|
---|
2680 | |
---|
2681 | /* !HC:TYPELIST:
|
---|
2682 |
|
---|
2683 | */
|
---|
2684 |
|
---|
2685 | } else if (rng[i] is ILDenseArray<byte> ) {
|
---|
2686 | ILDenseArray<byte> ind = rng[i] as ILDenseArray<byte> ;
|
---|
2687 | tmp = ind.Size.NumberOfElements;
|
---|
2688 | indices = ILIntList.Create();
|
---|
2689 | for (int p = 0; p < tmp; p++) {
|
---|
2690 | indices.Add((int)ind.GetValue(p));
|
---|
2691 | }
|
---|
2692 | /* !HC:TYPELIST:
|
---|
2693 |
|
---|
2694 | */
|
---|
2695 |
|
---|
2696 | } else if (rng[i] is ILDenseArray<Int64> ) {
|
---|
2697 | ILDenseArray<Int64> ind = rng[i] as ILDenseArray<Int64> ;
|
---|
2698 | tmp = ind.Size.NumberOfElements;
|
---|
2699 | indices = ILIntList.Create();
|
---|
2700 | for (int p = 0; p < tmp; p++) {
|
---|
2701 | indices.Add((int)ind.GetValue(p));
|
---|
2702 | }
|
---|
2703 | /* !HC:TYPELIST:
|
---|
2704 |
|
---|
2705 | */
|
---|
2706 |
|
---|
2707 | } else if (rng[i] is ILDenseArray<Int32> ) {
|
---|
2708 | ILDenseArray<Int32> ind = rng[i] as ILDenseArray<Int32> ;
|
---|
2709 | tmp = ind.Size.NumberOfElements;
|
---|
2710 | indices = ILIntList.Create();
|
---|
2711 | for (int p = 0; p < tmp; p++) {
|
---|
2712 | indices.Add((int)ind.GetValue(p));
|
---|
2713 | }
|
---|
2714 | /* !HC:TYPELIST:
|
---|
2715 |
|
---|
2716 | */
|
---|
2717 |
|
---|
2718 | } else if (rng[i] is ILDenseArray<Int16> ) {
|
---|
2719 | ILDenseArray<Int16> ind = rng[i] as ILDenseArray<Int16> ;
|
---|
2720 | tmp = ind.Size.NumberOfElements;
|
---|
2721 | indices = ILIntList.Create();
|
---|
2722 | for (int p = 0; p < tmp; p++) {
|
---|
2723 | indices.Add((int)ind.GetValue(p));
|
---|
2724 | }
|
---|
2725 | /* !HC:TYPELIST:
|
---|
2726 |
|
---|
2727 | */
|
---|
2728 |
|
---|
2729 | } else if (rng[i] is ILDenseArray<float> ) {
|
---|
2730 | ILDenseArray<float> ind = rng[i] as ILDenseArray<float> ;
|
---|
2731 | tmp = ind.Size.NumberOfElements;
|
---|
2732 | indices = ILIntList.Create();
|
---|
2733 | for (int p = 0; p < tmp; p++) {
|
---|
2734 | indices.Add((int)ind.GetValue(p));
|
---|
2735 | }
|
---|
2736 |
|
---|
2737 | #endregion HYCALPER AUTO GENERATED CODE
|
---|
2738 | } else
|
---|
2739 | throw new ILArgumentTypeException("error removing: invalid dimensions specifier, dimension #" + i.ToString());
|
---|
2740 | }
|
---|
2741 | }
|
---|
2742 | if (indices == null) {
|
---|
2743 | dimensionIdx = 0;
|
---|
2744 | dimensions = m_size;
|
---|
2745 | //indices = new int[0] { };
|
---|
2746 | return;
|
---|
2747 | }
|
---|
2748 | // if only one dimension specified -> make row vector
|
---|
2749 | //if (rng.Length < 2) {
|
---|
2750 | // outDim[1] = outDim[0];
|
---|
2751 | // outDim[0] = 1;
|
---|
2752 | // dimensionIdx = 1;
|
---|
2753 | //}
|
---|
2754 | dimensions = new ILSize(outDim);
|
---|
2755 | }
|
---|
2756 |
|
---|
2757 | /// <summary>
|
---|
2758 | /// Expanded <b>this</b> storage for index addressing outside of my dimensions
|
---|
2759 | /// </summary>
|
---|
2760 | /// <param name="range">range specification with size for destination array</param>
|
---|
2761 | internal void ExpandArray (ILLeftSideRange range) {
|
---|
2762 | int[] outDims;
|
---|
2763 | int i= 0;
|
---|
2764 | ILSize outDimensions;
|
---|
2765 | if (range.Size.NumberOfDimensions > m_size.NumberOfDimensions) {
|
---|
2766 | outDims = new int[range.Size.NumberOfDimensions];
|
---|
2767 | for (; i < m_size.NumberOfDimensions; i ++) {
|
---|
2768 | outDims[i] = (range.ExpandDimensions[i] > m_size[i]) ?
|
---|
2769 | range.ExpandDimensions[i] : m_size[i];
|
---|
2770 | }
|
---|
2771 | for(; i < range.Size.NumberOfDimensions; i++)
|
---|
2772 | outDims[i] = range.ExpandDimensions[i];
|
---|
2773 | } else {
|
---|
2774 | outDims = new int[m_size.NumberOfDimensions];
|
---|
2775 | for (; i < range.Size.NumberOfDimensions; i ++) {
|
---|
2776 | outDims[i] = (range.ExpandDimensions[i] > m_size[i]) ?
|
---|
2777 | range.ExpandDimensions[i] : m_size[i];
|
---|
2778 | }
|
---|
2779 | for(; i < m_size.NumberOfDimensions; i++)
|
---|
2780 | outDims[i] = m_size[i];
|
---|
2781 | }
|
---|
2782 | outDimensions = new ILSize(outDims);
|
---|
2783 | ElementType [] outData = ILMemoryPool.Pool.New<ElementType>(outDimensions.NumberOfElements);
|
---|
2784 | // transfer old data to new array
|
---|
2785 | int [] tmpIdx = new int[outDims.Length];
|
---|
2786 | for (i = 0; i < m_size.NumberOfElements; i++) {
|
---|
2787 | ElementType tmp = (ElementType)GetValueSeq(i,ref tmpIdx);
|
---|
2788 | outData[outDimensions.IndexFromArray(tmpIdx)] = tmp;
|
---|
2789 | }
|
---|
2790 | // exchange my data
|
---|
2791 | Data = new ILCountableArray<ElementType>(outData, outDimensions.NumberOfElements);
|
---|
2792 | m_size = outDimensions;
|
---|
2793 | }
|
---|
2794 | /// <summary>
|
---|
2795 | /// Expand <b>this</b> storage for index addressing outside of my dimensions
|
---|
2796 | /// </summary>
|
---|
2797 | /// <param name="indices">sizes of dimensions for the new storage</param>
|
---|
2798 | protected void ExpandArray(int[] indices) {
|
---|
2799 | if (indices.Length == 2 && (indices[0] * indices[1] == 0)) {
|
---|
2800 | if (indices[0] > 0)
|
---|
2801 | indices[1] = 1;
|
---|
2802 | else if (indices[1] > 0)
|
---|
2803 | indices[0] = 1;
|
---|
2804 | }
|
---|
2805 | ILSize outDimensions = new ILSize(indices);
|
---|
2806 | bool cleared;
|
---|
2807 | ElementType [] outData = ILMemoryPool.Pool.New<ElementType>(outDimensions.NumberOfElements,true,out cleared);
|
---|
2808 | // transfer old data to new array
|
---|
2809 | int [] tmpIdx = new int[indices.Length];
|
---|
2810 | for (int i = 0; i < m_size.NumberOfElements; i++) {
|
---|
2811 | ElementType tmpData = (ElementType)GetValueSeq(i,ref tmpIdx);
|
---|
2812 | outData[outDimensions.IndexFromArray(tmpIdx)] = tmpData;
|
---|
2813 | }
|
---|
2814 | // replace with my data
|
---|
2815 | Data = new ILCountableArray<ElementType>(outData,outDimensions.NumberOfElements);
|
---|
2816 | m_size = outDimensions;
|
---|
2817 | }
|
---|
2818 | /// <summary>
|
---|
2819 | /// Copy upper triangular part of this array into new solid array.
|
---|
2820 | /// </summary>
|
---|
2821 | /// <param name="n">Length of first dimension of destination array.</param>
|
---|
2822 | /// <returns>Solid array of size [n x {ThisColumnCount})].</returns>
|
---|
2823 | internal ILDenseStorage<ElementType> copyUpperTriangle(int n) {
|
---|
2824 | ILDenseStorage<ElementType> ret = new ILDenseStorage<ElementType>(new ILSize(n,n));
|
---|
2825 | ElementType[] arr = ret.GetArrayForWrite();
|
---|
2826 | ElementType[] myData = GetArrayForRead();
|
---|
2827 | if (m_size[0] == n) {
|
---|
2828 | for (int rcount = 0 , pos = 0; rcount < n; rcount++) {
|
---|
2829 | for (int i = 0; i <= rcount; i++) {
|
---|
2830 | arr[pos] = myData[pos++];
|
---|
2831 | }
|
---|
2832 | pos += (n - rcount - 1);
|
---|
2833 | }
|
---|
2834 | } else {
|
---|
2835 | for (int rcount = 0 , posIn = 0, posOut = 0, lenA = m_size[0]; rcount < n; rcount++) {
|
---|
2836 | for (int i = 0; i <= rcount; i++) {
|
---|
2837 | arr[posOut++] = myData[posIn++];
|
---|
2838 | }
|
---|
2839 | posOut += (n - rcount - 1);
|
---|
2840 | posIn += (lenA - rcount - 1);
|
---|
2841 | }
|
---|
2842 | }
|
---|
2843 | return ret;
|
---|
2844 | }
|
---|
2845 | /// <summary>
|
---|
2846 | /// Copy lower triangular part of this array into new solid array.
|
---|
2847 | /// </summary>
|
---|
2848 | /// <returns>Solid array of same size than this array.</returns>
|
---|
2849 | /// <remarks>If this is not a 2D array, only the first dimension is referenced.</remarks>
|
---|
2850 | internal ILDenseStorage<ElementType> copyLowerTriangle() {
|
---|
2851 | int n = m_size[0],pos = 0;
|
---|
2852 | ILDenseStorage<ElementType> ret = new ILDenseStorage<ElementType>(new ILSize(n,n));
|
---|
2853 | ElementType[] arr = ret.GetArrayForRead();
|
---|
2854 | ElementType[] myData = GetArrayForRead();
|
---|
2855 | for (int c = 0; c < m_size[1]; c++) {
|
---|
2856 | pos += c;
|
---|
2857 | for (int r = c; r < n; r++,pos++) {
|
---|
2858 | arr[pos] = myData[pos];
|
---|
2859 | pos++;
|
---|
2860 | }
|
---|
2861 | }
|
---|
2862 | return ret;
|
---|
2863 | }
|
---|
2864 |
|
---|
2865 | #endregion
|
---|
2866 |
|
---|
2867 | }
|
---|
2868 | }
|
---|