示例#1
0
        public void Should_memoize()
        {
            var memoized = Memoize.Func <string, object>(x => new object());

            memoized("a").ShouldEqual(memoized("a"));
            memoized("a").ShouldNotEqual(memoized("b"));
        }
示例#2
0
        public void WhenMemoizedIsCalledItReturnsValueReturnedByFactory()
        {
            var memoized = Memoize.Create((int arg) => $"Result: {arg}");

            memoized(1).Should().Be("Result: 1");
            memoized(43).Should().Be("Result: 43");
        }
示例#3
0
        public void WhenMemoizedIsCalledWithNullItAlwaysInvokesFactory()
        {
            int numberOfFactoryCalls = 0;
            var memoized             = Memoize.Create((object arg) => ++ numberOfFactoryCalls);

            memoized(null).Should().Be(1);
            memoized(null).Should().Be(2);
        }
示例#4
0
        public void WhenMemoizedIsCalledWithSameArgumentItReturnsCachedResult()
        {
            int numberOfFactoryCalls = 0;
            var memoized             = Memoize.Create((long arg) => ++ numberOfFactoryCalls);

            memoized(3).Should().Be(1);
            memoized(3).Should().Be(1);
        }
示例#5
0
 static void Main(string[] args)
 {
     Memoize.ResultOf <int, int, int>(test, 1, 2, 100000);
     Memoize.ResultOf <int, int, int>(test, 2, 1, 100000);
     Memoize.ResultOf <int, int, int>(Inner.test, 1, 2, 100000);
     Memoize.ResultOf <int, int, int>(Inner.test, 2, 1, 100000);
     Memoize.ResultOf <int, object, int>(test2, 1, 2, 100000);
     Memoize.ResultOf <int, object, int>(test2, 2, 1, 100000);
 }
示例#6
0
        public void CallingMemoizedFunctionForTheSecondTimeDoesNotInvokeFactory()
        {
            int numberOfFactoryCalls = 0;
            var memoized             = Memoize.Create((string arg) => numberOfFactoryCalls++);

            memoized("test");
            memoized("test");

            numberOfFactoryCalls.Should().Be(1);
        }
示例#7
0
        public void CallingMemoizedFunctionWithDifferentArgumentInvokesFactory()
        {
            int numberOfFactoryCalls = 0;
            var memoized             = Memoize.Create((string arg) => numberOfFactoryCalls++);

            memoized("test");
            memoized("test2");

            numberOfFactoryCalls.Should().Be(2);
        }
示例#8
0
        public static void MemoizeExamples()
        {
            Func <double, double> f = t =>
                                      FuncMethods.DefInteg.GaussKronrod.GaussKronrodSum(x => Math.Exp(-(x - t).Sqr() - x * x), a: -20, b: 10, n: 61, count: 12);

            var f_Memoized = new Memoize <double, double>(f, capacity: 10, concurrencyLevel: 1).Value;

            var t = DateTime.Now;

            void show_time()
            {
                (DateTime.Now - t).Ticks.Show();
                t = DateTime.Now;
            }

            f_Memoized(2).Show();   // 0,16961762375804412

            show_time();            // 842753

            f_Memoized(2.5).Show(); // 0,05506678006050927

            show_time();            // 8179

            f_Memoized(3).Show();   // 0,013923062412768037

            show_time();            // 7991

            f_Memoized(2.5).Show(); // 0,05506678006050927

            show_time();            // 1442



            // not only real functions!

            Func <(double, Complex, bool), (int, int)> c = tuple =>
            {
                var x = tuple.Item1;
                var z = tuple.Item2;
                var b = tuple.Item3;

                if (b)
                {
                    return((int)(x + z.Re), (int)(x + z.Im));
                }
                else
                {
                    return(0, 0);
                }
            };

            var c_tmp = new Memoize <(double, Complex, bool), (int, int)>(c, 100, 4).Value;

            Func <double, Complex, bool, (int, int)> c_Memoized = (double x, Complex z, bool b) => c_tmp((x, z, b));
        }
示例#9
0
        private void SetMemoized()
        {
            var uf = new Memoize <Tuple <double, double, double, Normal2D[], Func <double, Complex> >, Complex[]>((Tuple <double, double, double, Normal2D[], Func <double, Complex> > t) => UF(t.Item1, t.Item2, t.Item3, t.Item4, t.Item5));

            UFMemoized = (double x, double y, double w, Normal2D[] n, Func <double, Complex> f) => uf.Value(new Tuple <double, double, double, Normal2D[], Func <double, Complex> >(x, y, w, n, f));

            var ur = new Memoize <Tuple <double, double, double, Normal2D[]>, Complex[]>((Tuple <double, double, double, Normal2D[]> t) => URes(t.Item1, t.Item2, t.Item3, t.Item4));

            UResMemoized = (double x, double y, double w, Normal2D[] n) => ur.Value(new Tuple <double, double, double, Normal2D[]>(x, y, w, n));

            this.FormClosing += (object o, FormClosingEventArgs e) =>
            {
                uf.Dispose();
                ur.Dispose();
            };
        }
        /// <summary>
        /// Созадть систему матриц и векторов по базисным функция
        /// </summary>
        /// <param name="n">Число базисных функций. Если -1, то берутся все функции</param>
        public BiharmonicEquation(int n = -1)
        {
            if (n == -1)
            {
                n = masPoints.Length;
            }
            D1 = new SqMatrix(n);
            D2 = new SqMatrix(n);
            S  = new SqMatrix(n);
            R1 = new Vectors(n);
            R2 = new Vectors(n);

            Parallel.For(0, n, (int i) =>
            {
                for (int j = i; j < n; j++)
                {
                    D1[i, j] = IntegralClass.IntegralCurve((Point x) => alpha(x, i) * alpha(x, j) + alphanu(x, i) * alphanu(x, j), CIRCLE - 1);
                    D2[i, j] = IntegralClass.IntegralCurve((Point x) => beta(x, i) * beta(x, j) + betanu(x, i) * betanu(x, j), CIRCLE - 1);
                    S[i, j]  = IntegralClass.IntegralCurve((Point x) => alpha(x, i) * beta(x, j) + alphanu(x, i) * betanu(x, j), CIRCLE - 1);
                }
                R1[i] = IntegralClass.IntegralCurve((Point y) => alphanu(y, i) * Unu(y) + alpha(y, i) * U(y), CIRCLE - 1);
                R2[i] = IntegralClass.IntegralCurve((Point y) => betanu(y, i) * Unu(y) + beta(y, i) * U(y), CIRCLE - 1);

                for (int j = i + 1; j < n; j++)
                {
                    D1[j, i] = D1[i, j];
                    D2[j, i] = D2[i, j];
                    S[j, i]  = S[i, j];
                }
            });


            d    = new Vectors(n);
            cnew = new Vectors(n);

            ErrorsMasL = new double[n];
            ErrorsMasQ = new double[n];

            p1 = IntegralClass.IntegralCurve((Point y) => Unu(y).Sqr(), CIRCLE - 1);
            p2 = IntegralClass.IntegralCurve((Point y) => U(y).Sqr(), CIRCLE - 1);

            $"p1 = {p1}, p2 = {p2}".Show();

            var mems = new Memoize <Point, Vectors[]>((Point p) => {
                Vectors[] r = new Vectors[4];
                for (int i = 0; i < 4; i++)
                {
                    r[i] = new Vectors(dim);
                }
                for (int i = 0; i < dim; i++)
                {
                    r[0][i] = alpha(p, i);
                    r[1][i] = alphanu(p, i);
                    r[2][i] = beta(p, i);
                    r[3][i] = betanu(p, i);
                }
                return(r);
            }).Value;
            Func <Point, Vectors[]> AB = (Point p) => mems(p);

            Func <Vectors, double> FF = (Vectors v) =>
            {
                Vectors ce = new Vectors(this.dim);
                Vectors de = new Vectors(this.dim);
                for (int i = 0; i < v.Deg / 2; i++)
                {
                    ce[i] = v[i];
                    de[i] = v[i + v.Deg / 2];
                }

                Functional func = (Point p) => {
                    var vec = AB(p);
                    return((U(p) - ce * vec[0] - de * vec[2]).Sqr() + (Unu(p) - ce * vec[2] - de * vec[3]).Sqr());
                };
                return(IntegralClass.IntegralCurve(func, CIRCLE - 1));

                Functional f1 = (Point y) => {
                    double sum = U(y);
                    for (int i = 0; i < dim; i++)
                    {
                        sum -= ce[i] * alpha(y, i) + de[i] * beta(y, i);
                    }
                    return(sum * sum);
                };
                Functional f2 = (Point y) => {
                    double sum = Unu(y);
                    for (int i = 0; i < dim; i++)
                    {
                        sum -= ce[i] * alphanu(y, i) + de[i] * betanu(y, i);
                    }
                    return(sum * sum);
                };

                return(IntegralClass.IntegralCurve((Point p) => f1(p) + f2(p), CIRCLE - 1));
            };

            F = (Vectors v) =>
            {
                return(FF(v));

                Vectors cc = new Vectors(this.dim);
                Vectors dd = new Vectors(this.dim);
                for (int i = 0; i < v.Deg / 2; i++)
                {
                    cc[i] = v[i];
                    dd[i] = v[i + v.Deg / 2];
                }

                int    k   = this.dim;
                double sum = p1 + p2 - 2 * (cc * R1 + dd * R2);
                for (int i = 0; i < k; i++)
                {
                    for (int j = 0; j < k; j++)
                    {
                        sum += 2 * cc[i] * dd[j] * S[i, j] + cc[i] * cc[j] * D1[i, j] + dd[i] * dd[j] * D2[i, j];
                    }
                }

                return(sum);
            };


            Vectors tmp = Vectors.Union2(new Vectors(dim), Vectors.Random(dim, -4, 4));

            $"Error! {FF(tmp)} != {F(tmp)}".Show();


            //        Parallel.Invoke(
            //() => D1m = D1.Invertion,
            //() => D2m = D2.Invertion
            //);

            //        dl = D2 - S * (D1m * S);
            //        dr = R2 + S * D1m * R1;
            //        slau = new SLAU(dl, dr);
        }
示例#11
0
 public LalrItemSet Closure(GrammarProductionDatabase db)
 {
     return(Memoize.Function(ClosureName, Tuple.Create(this, db), (arg) => arg.Item1.InternalClosure(arg.Item2)));
 }
示例#12
0
 public LalrItemSet ToCoreSet()
 {
     return(Memoize.Function(ToCoreSetName, this, (arg) => arg.InternalToCoreSet()));
 }
示例#13
0
 public Dictionary <Symbol, LalrItemSet> Goto(GrammarProductionDatabase db)
 {
     return(Memoize.Function(GotoName2, Tuple.Create(this, db), (arg) => arg.Item1.InternalGoto(arg.Item2)));
 }
示例#14
0
 public LalrItemSet Goto(Symbol symbol)
 {
     return(Memoize.Function(GotoName1, Tuple.Create(this, symbol), (arg) => arg.Item1.InternalGoto(arg.Item2)));
 }
示例#15
0
 public HashSet <TerminalSymbol> FirstSet(GrammarProductionDatabase db)
 {
     return(Memoize.Function(FirstSetName, Tuple.Create(this, db), (input) => input.Item1.InternalFirstSet(input.Item2)));
 }