Пример #1
0
        public void Test_DivideDouble()
        {
            int errorCode = 0;

            // success?
            try {
                ILPerformer p     = new ILPerformer();
                double[]    data1 = new double[10] {
                    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
                };
                double[] data2 = new double[10] {
                    11, 12, -13, 14, 15, 16, -17, 18, 19, 110
                };
                double   tmp     = ((double)13.0) / ((double)3.0);
                double[] results = new double[18] {
                    11.0000, (double)-13.0 / (double)3.0, 15.0 / 5.0, 19.0 / 9.0, 11
                    , 3.0000, 6.0000, 3.5000, 16.0 / 6.0, 11.0000, 6.0000, 16.0 / 6.0, 11.0000
                    , -13.0 / 3.0, 3.0000, 19.0 / 9.0, 11.0000, 3.0000
                };
                ILArray <double> C  = new ILArray <double>(data1, 2, 5);
                ILArray <double> B  = new ILArray <double>(data2, 2, 5);
                ILArray <double> R  = new ILArray <double>(results, 6, 3);
                ILArray <double> BR = (ILArray <double>)B[1, "0:1,0;0,1,2,4,0,2"];
                ILArray <double> CR = (ILArray <double>)C[1, "0:1,0;0,1,2,4,0,2"];
                C = (ILArray <double>)CR.T.T;
                B = (ILArray <double>)BR.T.T;
                C.Detach();
                B.Detach();
                ILArray <double> A = B / C;
                errorCode = 1;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = B / CR;
                errorCode = 2;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = BR / CR;
                errorCode = 3;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = BR / CR;
                errorCode = 4;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                Success("Test_DivideDouble successful. (" + p.Toc() + "ms needed)");
            }
            catch (Exception e) {
                Error("Test_DivideDouble failed at step: " + errorCode + " Msg: " + e.Message);
            }
        }
Пример #2
0
        public void Test_MultiplyElementsDouble()
        {
            int errorCode = 0;

            // success?
            try {
                ILPerformer p     = new ILPerformer();
                double[]    data1 = new double[10] {
                    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
                };
                double[] data2 = new double[10] {
                    11, 12, -13, 14, 15, 16, -17, 18, 19, 110
                };
                double[] results = new double[18] {
                    11, -39, 75, 171, 11, 75, 24, 56, 96, 1100
                    , 24, 96, 11, -39, 75, 171, 11, 75
                };
                ILArray <double> C  = new ILArray <double>(data1, 2, 5);
                ILArray <double> B  = new ILArray <double>(data2, 2, 5);
                ILArray <double> R  = new ILArray <double>(results, 6, 3);
                ILArray <double> BR = (ILArray <double>)B[1, "0:1,0;0,1,2,4,0,2"];
                ILArray <double> CR = (ILArray <double>)C[1, "0:1,0;0,1,2,4,0,2"];
                C = (ILArray <double>)CR.T.T;
                B = (ILArray <double>)BR.T.T;
                C.Detach();
                B.Detach();
                ILArray <double> A = B * C;
                errorCode = 1;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = B * CR;
                errorCode = 2;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = BR * CR;
                errorCode = 3;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = BR * CR;
                errorCode = 4;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                Success("Test_MultiplyElementsDouble successful. (" + p.Toc() + "ms needed)");
            }
            catch (Exception e) {
                Error("Test_MultiplyElementsDouble failed at step: " + errorCode + " Msg: " + e.Message);
            }
        }
Пример #3
0
        public void Test_AddDouble()
        {
            int errorCode = 0;

            // success?
            try {
                ILPerformer p     = new ILPerformer();
                double[]    data1 = new double[10] {
                    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
                };
                double[] data2 = new double[10] {
                    11, 12, -13, 14, 15, 16, -17, 18, 19, 110
                };
                double[] results = new double[18] {
                    12, -10, 20, 28, 12, 20, 14, 18, 22, 120, 14, 22, 12, -10
                    , 20, 28, 12, 20
                };
                ILArray <double> C  = new ILArray <double>(data1, 2, 5);
                ILArray <double> B  = new ILArray <double>(data2, 2, 5);
                ILArray <double> R  = new ILArray <double>(results, 6, 3);
                ILArray <double> BR = (ILArray <double>)B[1, "0:1,0;0,1,2,4,0,2"];
                ILArray <double> CR = (ILArray <double>)C[1, "0:1,0;0,1,2,4,0,2"];
                C = CR.R;                    // creates reference only
                B = BR.R;
                C.Detach();
                B.Detach();
                ILArray <double> A = B + C;
                errorCode = 1;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = B + CR;
                errorCode = 2;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = BR + CR;
                errorCode = 3;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                A         = BR + CR;
                errorCode = 4;
                if (!A.Equals(R))
                {
                    throw new Exception("Values did not match!");
                }
                Success("Test_AddDouble successful. (" + p.Toc() + "ms needed)");
            }
            catch (Exception e) {
                Error("Test_AddDouble failed at step: " + errorCode + " Msg: " + e.Message);
            }
        }
Пример #4
0
        private string[] generateStringsRandom(int count, int maxLen)
        {
            string []     ret  = new string[count];
            ILArray <int> r    = ILMath.toint32(ILMath.rand(maxLen, count) * 26) + (int)'a';
            ILArray <int> lens = ILMath.toint32(ILMath.rand(1, count) * (maxLen - 1));

            for (int i = 0; i < count; i++)
            {
                ILArray <double> rang  = ILMath.vector(0, lens.GetValue(i));
                ILArray <char>   chars = ILMath.tochar(r[rang, i]);
                ret[i] = new String(chars.Detach().m_data);
            }
            return(ret);
        }
Пример #5
0
        /// <summary>
        /// singular value decomposition 
        /// </summary>
        /// <param name="X">matrix X. The elements of X will not be altered.</param>
        /// <param name="U">(return value) left singular vectors of X as columns of matrix U. 
        /// If this parameter is set, it must be not null. It might be an empty array. On return
        /// it will be set to a physical array accordingly.</param>
        /// <param name="V">right singular vectors of X as rows of matrix V.
        /// If this parameter is set, it must be not null. It might be an empty array. On return
        /// it will be set to a physical array accordingly.</param>
        /// <param name="small">if true: return only first min(M,N) columns of U and S will be 
        /// of size [min(M,N),min(M,N)]</param>
        /// <param name="discardFiniteTest">if true: the matrix given will not be checked for infinte or NaN values. If such elements 
        /// are contained nevertheless, this may result in failing convergence or error. In worst case 
        /// the function may hang inside the Lapack lib. Use with care! </param>
        /// <returns>singluar values as diagonal matrix of same size as X</returns>
        /// <remarks>the right singular vectors V will be returned as reference array.</remarks>
        public static  ILArray<double> svd( ILArray<complex> X, ref  ILArray<complex> U, ref  ILArray<complex> V, bool small, bool discardFiniteTest) {
            if (!X.IsMatrix)
                throw new ILArgumentSizeException("svd is defined for matrices only!");
            // early exit for small matrices
            if (X.Dimensions[1] < 4 && X.Dimensions[0] == X.Dimensions[1]) { 
                switch (X.Dimensions[0]) {
                    case 1: 
                        if (!Object.Equals(U,null))
                            U = ( complex ) 1.0; 
                        if (!Object.Equals(V,null))
                            V = ( complex ) 1.0; 
                        return new  ILArray<double> ( ILMath.abs(X)); 
                    //case 2:
                    //    return -1; 
                    //case 3: 
                    //    return -1; 
                }
            }
            if (!discardFiniteTest && !all(all(isfinite( X )))) 
                throw new ILArgumentException("svd: input must have only finite elements!");
            if (Lapack == null)
                throw new ILMathException("No Lapack package available.");
            // parameter evaluation
            int M = X.Dimensions[0]; int N = X.Dimensions[1];
            int minMN = (M < N) ? M : N;
            int LDU = M; int LDVT = N;
            int LDA = M;
            double [] dS = new  double [minMN];
            char jobz = (small) ? 'S' : 'A';
            complex [] dU = null;
            complex [] dVT = null;
            int info = 0;
            if (!Object.Equals(U, null) || !Object.Equals(V, null)) {
                // need to return U and VT 
                if (small) {
                    dU = new  complex  [M * minMN];
                    dVT = new  complex [N * minMN];
                } else {
                    dU = new  complex [M * M];
                    dVT = new  complex [N * N];
                }
            } else {
                jobz = 'N';
            }

            if (X.IsReference) {
                X.Detach();
            }
            // must create copy of input ! 
            complex [] dInput = new  complex [X.m_data.Length]; 
            System.Array.Copy(X.m_data, dInput, X.m_data.Length);
            Lapack.zgesdd(jobz, M, N, dInput, LDA, dS, dU, LDU, dVT, LDVT, ref info);
            if (info < 0) 
                throw new ILArgumentException ("ILMath.svd: the " + (-info).ToString() +"th argument was invalid.");
            if (info > 0)
                throw new ILArgumentException("svd was not converging!");
            ILArray<double> ret = null; 
            if (info == 0) {
                // success
                if (!Object.Equals(U, null) || !Object.Equals(V, null)) {
                    if (small) {
                        ret =  ILArray<double> .zeros(minMN,minMN);
                    } else {
                        ret =  ILArray<double> .zeros(M, N);
                    }
                    for (int i = 0; i < minMN; i++) {
                        ret.SetValue(dS[i],i,i); 
                    }
                    if (!Object.Equals(U, null))
                        U = new  ILArray<complex> (dU,M,dU.Length / M);
                    if (!Object.Equals(V, null)) {
                        V = conj(new  ILArray<complex> (dVT,N,dVT.Length / N).T);
                    }
                } else {
                    ret = new  ILArray<double> (dS,minMN,1); 
                }
            }
            return ret;
        }
Пример #6
0
        /// <summary>
        /// singular value decomposition
        /// </summary>
        /// <param name="X">matrix X. The elements of X will not be altered.</param>
        /// <param name="U">(return value) left singular vectors of X as columns of matrix U.
        /// If this parameter is set, it must be not null. It might be an empty array. On return
        /// it will be set to a physical array accordingly.</param>
        /// <param name="V">right singular vectors of X as rows of matrix V.
        /// If this parameter is set, it must be not null. It might be an empty array. On return
        /// it will be set to a physical array accordingly.</param>
        /// <param name="small">if true: return only first min(M,N) columns of U and S will be
        /// of size [min(M,N),min(M,N)]</param>
        /// <param name="discardFiniteTest">if true: the matrix given will not be checked for infinte or NaN values. If such elements
        /// are contained nevertheless, this may result in failing convergence or error. In worst case
        /// the function may hang inside the Lapack lib. Use with care! </param>
        /// <returns>singluar values as diagonal matrix of same size as X</returns>
        /// <remarks>the right singular vectors V will be returned as reference array.</remarks>
        public static ILArray <double> svd(ILArray <complex> X, ref ILArray <complex> U, ref ILArray <complex> V, bool small, bool discardFiniteTest)
        {
            if (!X.IsMatrix)
            {
                throw new ILArgumentSizeException("svd is defined for matrices only!");
            }
            // early exit for small matrices
            if (X.Dimensions[1] < 4 && X.Dimensions[0] == X.Dimensions[1])
            {
                switch (X.Dimensions[0])
                {
                case 1:
                    if (!Object.Equals(U, null))
                    {
                        U = ( complex )1.0;
                    }
                    if (!Object.Equals(V, null))
                    {
                        V = ( complex )1.0;
                    }
                    return(new  ILArray <double> (ILMath.abs(X)));
                    //case 2:
                    //    return -1;
                    //case 3:
                    //    return -1;
                }
            }
            if (!discardFiniteTest && !all(all(isfinite(X))))
            {
                throw new ILArgumentException("svd: input must have only finite elements!");
            }
            if (Lapack == null)
            {
                throw new ILMathException("No Lapack package available.");
            }
            // parameter evaluation
            int M = X.Dimensions[0]; int N = X.Dimensions[1];
            int minMN = (M < N) ? M : N;
            int LDU = M; int LDVT = N;
            int LDA = M;

            double [] dS   = new  double [minMN];
            char      jobz = (small) ? 'S' : 'A';

            complex [] dU   = null;
            complex [] dVT  = null;
            int        info = 0;

            if (!Object.Equals(U, null) || !Object.Equals(V, null))
            {
                // need to return U and VT
                if (small)
                {
                    dU  = new  complex  [M * minMN];
                    dVT = new  complex [N * minMN];
                }
                else
                {
                    dU  = new  complex [M * M];
                    dVT = new  complex [N * N];
                }
            }
            else
            {
                jobz = 'N';
            }

            if (X.IsReference)
            {
                X.Detach();
            }
            // must create copy of input !
            complex [] dInput = new  complex [X.m_data.Length];
            System.Array.Copy(X.m_data, dInput, X.m_data.Length);
            Lapack.zgesdd(jobz, M, N, dInput, LDA, dS, dU, LDU, dVT, LDVT, ref info);
            if (info < 0)
            {
                throw new ILArgumentException("ILMath.svd: the " + (-info).ToString() + "th argument was invalid.");
            }
            if (info > 0)
            {
                throw new ILArgumentException("svd was not converging!");
            }
            ILArray <double> ret = null;

            if (info == 0)
            {
                // success
                if (!Object.Equals(U, null) || !Object.Equals(V, null))
                {
                    if (small)
                    {
                        ret = ILArray <double> .zeros(minMN, minMN);
                    }
                    else
                    {
                        ret = ILArray <double> .zeros(M, N);
                    }
                    for (int i = 0; i < minMN; i++)
                    {
                        ret.SetValue(dS[i], i, i);
                    }
                    if (!Object.Equals(U, null))
                    {
                        U = new  ILArray <complex> (dU, M, dU.Length / M);
                    }
                    if (!Object.Equals(V, null))
                    {
                        V = conj(new  ILArray <complex> (dVT, N, dVT.Length / N).T);
                    }
                }
                else
                {
                    ret = new  ILArray <double> (dS, minMN, 1);
                }
            }
            return(ret);
        }
Пример #7
0
		public void Test_setrange_of_reference() {
			int errorCode = 0;
			// success? 
			try {
				object[] data = new object[120];
				for (int i = 120; i-- > 0; )
					data[i] = (double)i;
                ILArray<object> B = new ILArray<object>(data, 5, 4, 1, 3, 2, 1);
				int oldRefDim = ILSettings.MinimumRefDimensions; 
                ILSettings.MinimumRefDimensions = 2; 
                ILArray<object> A = B[3,"0:2,4;1,3;0;2,1,0,1"];
				// make A writable
				ILArray<object>.DetachReferences = ILDetachingBehavior.DetachNever; 
				B.Detach();
				errorCode = 1;
				// new values
				double[] vals = new double[12] { 101, 102, 103, 104, 105, 106, 107, 
												 108, 109, 110, 111, 112 };
				object[] valso = new object[vals.Length];
				for (int i = 0; i < vals.Length; i++)
					valso[i] = vals[i];
				ILArray<object> C = new ILArray<object>(valso, 3, 2, 2);
				// should replace missing trailing dimension by 0
				// inner singleton dimensions should be ok! 
				ILArray<object>.DetachReferences = ILDetachingBehavior.DetachSave;
				A["0,2,3;0,3;0,1"] = C;
				errorCode = 2;

				double[] results = new double[32] {101,103,102,103,46,26, 6,26,47
						,27, 7,27,104,106,105,106,107,109,108,109,56,36,16,36,57,37,17
						,37,110,112,111,112};
				ILIterator<object> I = A.CreateIterator(ILIteratorPositions.ILStart, 0);
				int count = 0;
				do {
					if (((Double)I.Value).CompareTo(results[count++]) != 0)
						throw new Exception("Values did not match!");
					I.Increment();
				} while (!I.IsAtStart());
				errorCode = 3; 
				// test detaching before altering 
				ILArray<object>.DetachReferences = ILDetachingBehavior.DetachOnWrite;
				A = B[3,"0:2,4;1,3;0;2,1,0,1"];
				B.Detach();
				A.SetRange(new ILRange(A.Dimensions,RangeSide.Left,"0,2,3;0,3;0,1"), C);
				errorCode = 4;

				results = new double[32] {101,25,102,103,46,26, 6,26,47
						,27, 7,27,104,29,105,106,107,35,108,109,56,36,16,36,57,37,17
						,37,110,39,111,112};
				I = A.CreateIterator(ILIteratorPositions.ILStart, 0);
				count = 0;
				do {
					if (((Double)I.Value).CompareTo(results[count++]) != 0)
						throw new Exception("The values did not match!");
					I.Increment();
				} while (!I.IsAtStart());
				// complain if dimensions do not match
				errorCode = 5;
				ILArray<object> D = new ILArray<object>(new object[4] { 1, 1, 1, 1 }, 1, 2, 2);
				try {
					A["0,1,0,0:2"] = D;
				} catch (ILArgumentSizeException) {
					Info("setrange: dimension mismatch signaled correctly"); 
				}
				errorCode = 4;
                ILSettings.MinimumRefDimensions = oldRefDim; 
				Success();
			} catch (Exception e) {
				Error(errorCode, e.Message);
			}
		}
Пример #8
0
		public void Test_DivideDouble() {
			int errorCode = 0;
			// success?  
			try {
				ILPerformer p = new ILPerformer();
				double[] data1 = new double[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
				double[] data2 = new double[10] { 11, 12, -13, 14, 15, 16, -17, 18, 19, 110 };
				double tmp = ((double)13.0) / ((double)3.0); 
                double[] results = new double[18] { 11.0000,(double)-13.0/(double)3.0,15.0/5.0,19.0/9.0,11
								,3.0000,6.0000,3.5000,16.0/6.0,11.0000,6.0000,16.0/6.0,11.0000
													,-13.0/3.0,3.0000,19.0/9.0,11.0000,3.0000};
				ILArray<double> C = new ILArray<double>(data1, 2, 5);
				ILArray<double> B = new ILArray<double>(data2, 2, 5);
				ILArray<double> R = new ILArray<double>(results, 6, 3);
				ILArray<double> BR = (ILArray<double>)B[1,"0:1,0;0,1,2,4,0,2"];
				ILArray<double> CR = (ILArray<double>)C[1,"0:1,0;0,1,2,4,0,2"];
				C = (ILArray<double>)CR.T.T;
				B = (ILArray<double>)BR.T.T;
				C.Detach();
				B.Detach();
				ILArray<double> A = B/C;
				errorCode = 1;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = B/CR;
				errorCode = 2;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = BR/CR;
				errorCode = 3;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = BR/CR;
				errorCode = 4;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				Success("Test_DivideDouble successful. (" + p.Toc() + "ms needed)");
			}
			catch (Exception e) {
				Error("Test_DivideDouble failed at step: " + errorCode + " Msg: " + e.Message);
			}
		}
Пример #9
0
		public void Test_MultiplyElementsDouble() {
			int errorCode = 0;
			// success? 
			try {
				ILPerformer p = new ILPerformer();
				double[] data1 = new double[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
				double[] data2 = new double[10] { 11, 12, -13, 14, 15, 16, -17, 18, 19, 110 };
				double[] results = new double[18] { 11, -39, 75, 171, 11, 75, 24, 56, 96, 1100
												   ,24, 96, 11, -39, 75, 171, 11, 75 };
				ILArray<double> C = new ILArray<double>(data1, 2, 5);
				ILArray<double> B = new ILArray<double>(data2, 2, 5);
				ILArray<double> R = new ILArray<double>(results, 6, 3);
				ILArray<double> BR = (ILArray<double>)B[1,"0:1,0;0,1,2,4,0,2"];
				ILArray<double> CR = (ILArray<double>)C[1,"0:1,0;0,1,2,4,0,2"];
				C = (ILArray<double>)CR.T.T;
				B = (ILArray<double>)BR.T.T;
				C.Detach();
				B.Detach();
				ILArray<double> A = B*C;
				errorCode = 1;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = B*CR;
				errorCode = 2;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = BR*CR;
				errorCode = 3;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = BR*CR;
				errorCode = 4;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				Success("Test_MultiplyElementsDouble successful. (" + p.Toc() + "ms needed)");
			}
			catch (Exception e) {
				Error("Test_MultiplyElementsDouble failed at step: " + errorCode + " Msg: " + e.Message);
			}
		}
Пример #10
0
		public void Test_AddDouble() {
			int errorCode = 0;
			// success? 
			try {
				ILPerformer p = new ILPerformer();
				double[] data1 = new double[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
				double[] data2 = new double[10] { 11, 12, -13, 14, 15, 16, -17, 18, 19, 110 };
				double[] results = new double[18] { 12,-10,20,28,12,20,14,18,22,120,14,22,12,-10
													,20,28,12,20};
				ILArray<double> C = new ILArray<double>(data1, 2, 5);
				ILArray<double> B = new ILArray<double>(data2, 2, 5);
				ILArray<double> R = new ILArray<double>(results, 6, 3);
				ILArray<double> BR = (ILArray<double>)B[1,"0:1,0;0,1,2,4,0,2"];
				ILArray<double> CR = (ILArray<double>)C[1,"0:1,0;0,1,2,4,0,2"];
				C = CR.R;    // creates reference only 
				B = BR.R;
				C.Detach();
				B.Detach();
				ILArray<double> A = B+C;
				errorCode = 1;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = B+CR;
				errorCode = 2;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = BR+CR;
				errorCode = 3;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				A = BR+CR;
				errorCode = 4;
				if (!A.Equals(R))
					throw new Exception("Values did not match!");
				Success("Test_AddDouble successful. (" + p.Toc() + "ms needed)");
			}
			catch (Exception e) {
				Error("Test_AddDouble failed at step: " + errorCode + " Msg: " + e.Message);
			}
		}
Пример #11
0
        public void Test_MMult() {
            int errorCode = 0;
            try {
                double[] data = new double[20];
				for (int i = 0; i < data.Length; i++)
					data[i] = i+1;
                ILArray<double> origA = new ILArray<double>(data,5,4); 
				ILArray<double> A = new ILArray<double>(origA);
                ILArray<double> B = new ILArray<double>(origA.T).Detach();

                ILArray<double> Res = new ILArray<double>(new double[] {414,448,482,516,550,448,486,524,562,600,482,524,566,608,650,516,562,608,654,700,550,600,650,700,750} ,5,5); 
                // test phy * phy
                if (!ILMath.Equals (ILMath.multiply(A,B),Res) )
                    throw new Exception ("Test MathBasic: MMult failed at A*B (phys * phys) due: invalid values"); 
                B = new ILArray<double> (origA.T);
                // test phy * ref 
                if (!ILMath.Equals (ILMath.multiply(A,B),Res) )
                    throw new Exception ("Test MathBasic: MMult failed at A*B (phys * ref) due: invalid values"); 
                // test ref * ref 
                A = origA.T.Detach().T; 
                if (!ILMath.Equals (ILMath.multiply(A,B),Res) )
                    throw new Exception ("Test MathBasic: MMult failed at A*B (ref * phys) due: invalid values"); 
                // test ref * phy 
                A = A.Detach(); 
                B = B.Detach(); 
                if (!ILMath.Equals (ILMath.multiply(A,B),Res) )
                    throw new Exception ("Test MathBasic: MMult failed at A*B (ref * ref) due: invalid values"); 
                ILPerformer p = new ILPerformer(); 
                data = new double[1000000];
                A = ILMath.ones(1000,1000); 
                p.Tic(); 
                    B = ILMath.multiply (A,A.T); 
                p.Toc(); 
                Info("MMult 1000x1000 procceeded in " + p.ToString() + "msec.");
                Success("MMult finished successfully"); 
            } catch (Exception e) {
				Error("Test_MMult failed at errorCode: " + errorCode + " Reason: " + e.Message);
            }
        }
Пример #12
0
// DO NOT EDIT INSIDE THIS REGION !! CHANGES WILL BE LOST !! 



        public ILArray< float > FFTBackwSym1D(ILArray< fcomplex > A, int dim) {
            if (A == null || dim < 0) 
                throw new ILArgumentException("invalid parameter!"); 
            if (A.IsEmpty) return ILArray< float >.empty(A.Dimensions); 
            if (A.IsScalar || A.Dimensions[dim] == 1) 
                return ILMath.real(A); 
            // prepare output array, if we query the memory directly from
            // memory pool, we prevent from clearing the elements since every 
            // single one will be overwritten by fft anyway
            int error = 0,inDim = A.Dimensions[dim];   
            float [] retArr = ILMemoryPool.Pool.New< float >(A.Dimensions.NumberOfElements); 
            ILArray< float > ret = new ILArray< float >(retArr,A.Dimensions); 
            if (A.IsReference) 
                A.Detach(); 
            string hash = hashPlan( MKLValues.SINGLE , MKLValues.REAL, 1, inDim); 
            IntPtr descriptor = IntPtr.Zero;
            // try to reuse existing descriptor
            lock (_lockobject) {
                if (!m_descriptors.TryGetValue(hash, out descriptor)) {
                    error = MKLImports.DftiCreateDescriptor(ref descriptor, MKLValues.SINGLE , MKLValues.REAL, 1, inDim);
                    if (isMKLError(error)) {
                        throw new ILInvalidOperationException ("error creating descriptor: " + MKLImports.DftiErrorMessage(error)); 
                    }
                    m_descriptors[hash] = descriptor; 
                }
            }
            // spacing between elements
            int tmp = A.Dimensions.SequentialIndexDistance(dim); 
            int[] stride = new int[]{0,tmp}; 
            MKLImports.DftiSetValue(descriptor,MKLParameter.INPUT_STRIDES, __arglist(stride)); 
            error = MKLImports.DftiSetValue(descriptor,MKLParameter.OUTPUT_STRIDES, __arglist(stride)); 
            if (isMKLError(error)) {
                throw new ILInvalidOperationException ("error: " + MKLImports.DftiErrorMessage(error)); 
            }
            // storage of subsequent transformations
            tmp = inDim * tmp; 
            MKLImports.DftiSetValue(descriptor,MKLParameter.INPUT_DISTANCE, __arglist(tmp)); 
            MKLImports.DftiSetValue(descriptor,MKLParameter.OUTPUT_DISTANCE, __arglist(tmp)); 
            // how many transformations ? 
            tmp = A.Dimensions.NumberOfElements / tmp; 
            MKLImports.DftiSetValue(descriptor,MKLParameter.NUMBER_OF_TRANSFORMS, __arglist(tmp)); 
            error = MKLImports.DftiSetValue(descriptor,MKLParameter.PLACEMENT,__arglist(MKLValues.NOT_INPLACE)); 
            error = MKLImports.DftiSetValue(descriptor,MKLParameter.REAL_STORAGE, __arglist(MKLValues.REAL_REAL)); 
            error = MKLImports.DftiSetValue(descriptor,MKLParameter.CONJUGATE_EVEN_STORAGE, __arglist(MKLValues.COMPLEX_COMPLEX)); 
            error = MKLImports.DftiSetValue(descriptor,MKLParameter.BACKWARD_SCALE, __arglist(1.0 / inDim)); 
            error = MKLImports.DftiCommitDescriptor(descriptor);
            if (isMKLError(error)) {
                throw new ILInvalidOperationException ("error: " + MKLImports.DftiErrorMessage(error)); 
            }
            // do the transform(s)
            tmp = A.Dimensions.SequentialIndexDistance(dim); 
            unsafe {
                fixed ( float * retArrP = ret.m_data) 
                fixed ( fcomplex * pA = A.m_data) {
                    for (int i = 0; i < tmp && error == 0; i++) 
                        error = MKLImports.DftiComputeBackward(descriptor, __arglist(pA + i,retArrP + i));
                }
            }
            if (isMKLError(error)) {
                throw new ILInvalidOperationException ("error: " + MKLImports.DftiErrorMessage(error)); 
            }
            return ret;
        }
Пример #13
0
 public void Test_EnumeratorPerf(ILArray<double> A) {
     int errorCode = 1; 
     try  {
         ILPerformer p = new ILPerformer();
         Info("Enumerator test A => " + A.Dimensions); 
         p.Tic();
         foreach (ILArray<double> a in A) { }
         p.Toc();
         Info(" foreach (ILArray<double> a in A){ ... => " + p.ToString() + " ms");
         errorCode = 2; 
         p.Tic(); 
         foreach (double a in A) { }
         p.Toc(); 
         Info(" foreach (double a in A){ }  => " + p.ToString() + " ms");
         errorCode = 3; 
         p.Tic(); 
         foreach (double a in A.Values) { }
         p.Toc();
         Info(" foreach (double a in A.Values){ } [solid] => " + p.ToString() + " ms");
         A = A.R;
         p.Tic(); 
         foreach (double a in A.Values) { }
         p.Toc();
         Info(" foreach (double a in A.Values){ } [Ref] => " + p.ToString() + " ms");
         int l = A.Dimensions.NumberOfElements; 
         double b;
         p.Tic(); 
         for (int i = 0; i < l; i++) { b = A.GetValue(i); }
         p.Toc();
         Info(" for (int i = 0; i < l; i++) { a = A.GetValue(i); } => " + p.ToString() + " ms");
         if (A.IsReference) 
             A.Detach(); 
         p.Tic(); 
         for (int i = 0; i < l; i++) { b = A.m_data[i]; }
         p.Toc();
         Info(" for (int i = 0; i < l; i++) { a = A.m_data[i]; } => " + p.ToString() + " ms");
         Success(); 
     } catch (Exception e) {
         Error(errorCode,e.Message); 
     }
 }