Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GaussianProcessTuning/ILNumerics.2.14.4735.573/Array/ILBaseArrayGen.cs @ 10884

Last change on this file since 10884 was 9102, checked in by gkronber, 12 years ago

#1967: ILNumerics source for experimentation

File size: 11.6 KB
Line 
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
40using System;
41using ILNumerics;
42using ILNumerics.Misc;
43using ILNumerics.Storage;
44using ILNumerics.Exceptions;
45using System.Runtime.Serialization;
46using System.Runtime.Serialization.Formatters.Binary;
47using System.IO;
48using System.Text;
49using System.Collections.Generic;
50using System.Collections;
51
52namespace ILNumerics {
53
54    /// <summary>
55    /// Typed base class for all ILNumerics data storage classes for any storage type.
56    /// </summary>
57    /// <remarks><para>You should not use this type directly. It serves as a base class
58    /// for all typed storages only and will be used by derived classes like ILArray<![CDATA[<>]]>.</para>
59    /// <para>If you are looking for an (untyped) base class to be used as generic class for any ILArray types, you should use ILBaseArray instead!</para>
60    /// </remarks>
61    [Serializable]
62    public abstract partial class ILBaseArray<ElementType>
63        : ILBaseArray, IEnumerable<ElementType> {
64       
65        internal ILBaseArray(ILStorage storage, bool isTempArray) : base(storage, isTempArray) { }
66
67        #region attributes
68        #endregion
69
70        #region properties
71        /// <summary>
72        /// Determine if this array has complex elements.
73        /// </summary>
74        public override bool IsComplex {
75            get {
76                return (this is ILBaseArray<complex>
77                 || this is ILBaseArray<fcomplex>);
78            }
79        }
80        /// <summary>
81        /// Determine if this array holds numeric values.
82        /// </summary>
83        /// <remarks>An ILArray is numeric as long as its elements are one of the
84        /// following types:
85        /// <list type="table">
86        /// <listheader>
87        ///     <term>inner type</term>
88        /// </listheader>
89        /// <item>
90        ///     <term>System.double</term>
91        ///     <description>floating point, real, 8 bytes </description>
92        /// </item>
93        /// <item>
94        ///     <term>System.float</term>
95        ///     <description>floating point real, 4 bytes</description>
96        /// </item>
97        /// <item>
98        ///     <term>ILNumerics.complex</term>
99        ///     <description>floating point complex, 16 bytes</description>
100        /// </item>
101        /// <item>
102        ///     <term>ILNumerics.fcomplex</term>
103        ///     <description>floating point complex, 8 bytes</description>
104        /// </item>
105        /// <item>
106        ///     <term>System.char</term>
107        ///     <description>integer, real, 1 byte</description>
108        /// </item>
109        /// <item>
110        ///     <term>System.byte</term>
111        ///     <description>integer, real, 1 byte</description>
112        /// </item>
113        /// <item>
114        ///     <term>System.Int16</term>
115        ///     <description>integer, real, 2 byte</description>
116        /// </item>
117        /// <item>
118        ///     <term>System.Int32</term>
119        ///     <description>integer, real, 4 byte</description>
120        /// </item>
121        /// <item>
122        ///     <term>System.Int64</term>
123        ///     <description>integer, real, 8 byte</description>
124        /// </item>
125        /// <item>
126        ///     <term>System.UInt16</term>
127        ///     <description>unsigned integer, real, 2 byte</description>
128        /// </item>
129        /// <item>
130        ///     <term>System.UInt32</term>
131        ///     <description>unsigned integer, real, 4 byte</description>
132        /// </item>
133        /// <item>
134        ///     <term>System.UInt64</term>
135        ///     <description>unsigned integer, real, 8 byte</description>
136        /// </item>
137        /// </list>
138        /// </remarks>
139        public override bool IsNumeric {
140            get {
141                if (this is ILBaseArray<double> ||
142                    this is ILBaseArray<float> ||
143                    this is ILBaseArray<complex> ||
144                    this is ILBaseArray<fcomplex> ||
145                    this is ILBaseArray<byte> ||
146                    this is ILBaseArray<char> ||
147                    this is ILBaseArray<Int16> ||
148                    this is ILBaseArray<Int32> ||
149                    this is ILBaseArray<Int64> ||
150                    this is ILBaseArray<UInt16> ||
151                    this is ILBaseArray<UInt32> ||
152                    this is ILBaseArray<UInt64>)
153                    return true;
154                return false;
155            }
156        }
157
158        /// <summary>
159        /// Access to internal typed storage
160        /// </summary>
161        internal new ILStorage<ElementType> Storage {
162            get { return (m_storage as ILStorage<ElementType>); }
163        }
164
165        #endregion
166
167        #region public interface
168        /// <summary>
169        ///  Serialize this array into a binary stream.
170        /// </summary>
171        /// <param name="outStream">System.IO.Stream to receive the byte stream
172        /// for this ILBaseArray</param>
173        /// <returns>True on success, false on error.</returns>
174        public virtual bool Serialize(Stream outStream) {
175            try {
176                BinaryFormatter bf = new BinaryFormatter();
177                bf.Serialize(outStream, this);
178                return true;
179            } catch (Exception) {
180                return false;
181            }
182        }
183        /// <summary>
184        /// Deserialize / restore array from binary stream 'inStream'
185        /// </summary>
186        /// <param name="inStream">System.IO.Stream to reconstruct the
187        /// array from</param>
188        /// <returns>Array reconstructed from stream.</returns>
189        /// <exception cref="System.Runtime.Serialization.SerializationException">If the array could not get restored</exception>
190        public static ILBaseArray<ElementType> Deserialize(Stream inStream) {
191            try {
192                BinaryFormatter bf = new BinaryFormatter();
193                ILBaseArray<ElementType> ret = (ILBaseArray<ElementType>)bf.Deserialize(inStream);
194                return ret;
195            } catch (Exception e) {
196                throw e;
197            }
198        }
199
200        /// <summary>
201        /// Get single element from this array
202        /// </summary>
203        /// <param name="idx">Indices, location of element</param>
204        /// <returns>The selected value</returns>
205        public virtual ElementType GetValue(params int[] idx) {
206            return Storage.GetValueTyped(idx);
207        }
208        /// <summary>
209        /// Get minimum and maximum value of all elements - if any
210        /// </summary>
211        /// <param name="min">[Output] Minimum value</param>
212        /// <param name="max">[Output] Maximum value</param>
213        /// <returns>true if the limits exists and could be computed, false otherwise</returns>
214        /// <remarks>Empty arrays will return false. In this case the output parameter will be: default(ElementType).
215        /// </remarks>
216        public virtual bool GetLimits(out ElementType min, out ElementType max) {
217            return Storage.GetLimits(out min, out max);
218        }
219        /// <summary>
220        /// Get minimum and maximum value of all elements - if any
221        /// </summary>
222        /// <param name="min">[Output] Minimum value</param>
223        /// <param name="max">[Output] Maximum value</param>
224        /// <param name="includeInfNaNs">true: recognize Inf, NaN values; false: ignore those values</param>
225        /// <returns>true if the limits exists and could be computed, false otherwise</returns>
226        /// <remarks>Empty arrays will return false. In this case the output parameter will be: default(ElementType).</remarks>
227        internal bool GetLimits(out ElementType min, out ElementType max, bool includeInfNaNs) {
228            return Storage.GetLimits(out min, out max, includeInfNaNs);
229        }
230        #endregion
231
232        #region IEnumerable<ILBaseArray<ElementType>> Member
233
234        /// <summary>
235        /// Enumerator returning elements as ElementType
236        /// </summary>
237        /// <returns>Enumerator</returns>
238        /// <remarks>This method enables the us of ILNumerics arrays in foreach loops.
239        /// <para>This iterator implements IEnumerable&lt;ElementType> explicitely and is used in situations,
240        /// where instances of ILNumerics arrays are casted to instances of the IEnumerable interface. This iterator
241        /// is not integrated into the ILNumerics memory management.</para></remarks>
242        /// <example><code>ILDenseStorage&lt;T&gt; A = ILMath.rand(5,4,6);
243        /// foreach (double element in A) {
244        /// // all elements are scalar double values
245        /// String.Format("Element: {0} ",element);
246        /// // Note: 'element' cannot be used to alter the collection!
247        /// }
248        /// </code></example>
249        IEnumerator<ElementType> System.Collections.Generic.IEnumerable<ElementType>.GetEnumerator() {
250            return Storage.GetEnumerator();
251        }
252        /// <summary>
253        /// Enumerator returning elements as ElementType
254        /// </summary>
255        /// <returns>Enumerator</returns>
256        /// <remarks>This method enables the use of ILNumerics arrays in foreach loops directly.</remarks>
257        IEnumerator System.Collections.IEnumerable.GetEnumerator() {
258            return GetEnumerator();
259        }
260        /// <summary>
261        /// Enumerator returning elements as ElementType
262        /// </summary>
263        /// <returns>Enumerator</returns>
264        /// <remarks>This method enables the use of ILNumerics arrays in foreach loops directly.</remarks>
265        public abstract IEnumerator<ElementType> GetEnumerator();
266        #endregion
267
268        #region public interface
269        #endregion
270    }
271}
Note: See TracBrowser for help on using the repository browser.