Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GaussianProcessTuning/ILNumerics.2.14.4735.573/Functions/builtin/new.cs @ 11316

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

#1967: ILNumerics source for experimentation

File size: 6.5 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 System.Collections.Generic;
42using System.Linq;
43using System.Text;
44
45namespace ILNumerics {
46    public partial class ILMath {
47        /// <summary>
48        /// Request System.Array <typeparamref name="T"/>[] from ILNumerics Memory Pool
49        /// </summary>
50        /// <typeparam name="T">the element type</typeparam>
51        /// <param name="length"><b>minimal</b> length of the array returned</param>
52        /// <returns>A system array of element type <typeparamref name="T"/> and minimal length <paramref name="length"/>.</returns>
53        /// <remarks>
54        /// <para>This function fetches a System.Array from the collection of available arrays with matching properties which are currently held in the ILNumerics Memory Pool.
55        /// This simplifies usage scenarios where the user must handle System.Arrays in computational loops and still wants to profit from the ILNumerics memory management.</para>
56        /// <para>The array returned is fetched from the collection of available arrays in the pool. If no matching array was found, a new array is requested from the managed heap.</para>
57        /// <para>The user is reponsible to return the array to the pool once finished using it. The <see cref="ILNumerics.ILMath.free{T}"/> method should be used for returning an array.</para>
58        /// <para>Keep in mind, the array returned may be <b>longer</b> as requested! Therefore, in order to reference its elements use the <paramref name="length"/> parameter rather than the System.Array.Length property.</para>
59        /// <example>A system array is needed inside a computational loop. The loop calls a native function repeatedly which requests a working array. The System.Array is requested from the pool and returned to the pool after usage.
60        /// <code>
61        ///[System.Runtime.InteropServices.DllImport("myDLL")]
62        ///private static extern void MyDllFunc(double[] a, int lenA, double[] b, double[] work, int lenWork);
63        ///
64        ///public static ILRetArray<double> MyFunc(ILInArray<double> A) {
65        ///    using (ILScope.Enter(A)) {
66        ///        // myDllFunc needs storage for the result
67        ///        ILArray<double> ret = zeros(A.Size);
68        ///        ILArray<double> tmpRow = zeros(1, A.S[1]);
69        ///
70        ///        // myDllFunc needs a working storage:
71        ///        double[] work = New<double>(A.S[1]);
72        ///        // for all rows of A use the same working array
73        ///        for (int i = 0; i < A.S[0]; i++) {
74        ///            using (ILScope.Enter()) {
75        ///                ILArray<double> ARow = A[i, full];
76        ///                MyDllFunc(ARow.GetArrayForRead(), A.Length, tmpRow.GetArrayForWrite(), work, A.Length);
77        ///                ret[i, full] = tmpRow;
78        ///            }
79        ///        }
80        ///        // return the System.Array to the pool
81        ///        free(work);
82        ///        return ret;
83        ///    }
84        ///}
85        /// </code>
86        /// However, in most situations, the handling of system.arrays directly can be circumvented. The same goal as in the example could be archieved as follows:
87        /// <code>       
88        /// public static ILRetArray<double> MyFunc(ILInArray<double> A) {
89        ///using (ILScope.Enter(A)) {
90        ///    // myDllFunc needs storage for the result
91        ///    ILArray<double> ret = zeros(A.Size);
92        ///    ILArray<double> tmpRow = zeros(1, A.S[1]);
93        ///    // myDllFunc needs a working storage. We us a regular ILNumerics array
94        ///    // which we dont have to free afterwards.
95        ///    ILArray<double> work = zeros(tmpRow.S);
96        ///
97        ///    // for all rows of A use the same working array
98        ///    for (int i = 0; i < A.S[0]; i++) {
99        ///        using (ILScope.Enter()) {
100        ///            ILArray<double> ARow = A[i, full];
101        ///            MyDllFunc(ARow.GetArrayForRead(), A.Length, tmpRow.GetArrayForWrite(), work.GetArrayForWrite(), A.Length);
102        ///            ret[i, full] = tmpRow;
103        ///        }
104        ///    }
105        ///    // returning the working storage is not needed here...
106        ///
107        ///    return ret;
108        ///}
109        ///}</code>
110        /// Both examples archieve a 100% memory efficiency by completely reusing the memory needed within the function.
111        /// </example>
112        /// </remarks>
113        public static T[] New<T>(int length) {
114            return ILMemoryPool.Pool.New<T>(length);
115        }
116    }
117}
Note: See TracBrowser for help on using the repository browser.