public void Should_memoize() { var memoized = Memoize.Func <string, object>(x => new object()); memoized("a").ShouldEqual(memoized("a")); memoized("a").ShouldNotEqual(memoized("b")); }
public void WhenMemoizedIsCalledItReturnsValueReturnedByFactory() { var memoized = Memoize.Create((int arg) => $"Result: {arg}"); memoized(1).Should().Be("Result: 1"); memoized(43).Should().Be("Result: 43"); }
public void WhenMemoizedIsCalledWithNullItAlwaysInvokesFactory() { int numberOfFactoryCalls = 0; var memoized = Memoize.Create((object arg) => ++ numberOfFactoryCalls); memoized(null).Should().Be(1); memoized(null).Should().Be(2); }
public void WhenMemoizedIsCalledWithSameArgumentItReturnsCachedResult() { int numberOfFactoryCalls = 0; var memoized = Memoize.Create((long arg) => ++ numberOfFactoryCalls); memoized(3).Should().Be(1); memoized(3).Should().Be(1); }
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); }
public void CallingMemoizedFunctionForTheSecondTimeDoesNotInvokeFactory() { int numberOfFactoryCalls = 0; var memoized = Memoize.Create((string arg) => numberOfFactoryCalls++); memoized("test"); memoized("test"); numberOfFactoryCalls.Should().Be(1); }
public void CallingMemoizedFunctionWithDifferentArgumentInvokesFactory() { int numberOfFactoryCalls = 0; var memoized = Memoize.Create((string arg) => numberOfFactoryCalls++); memoized("test"); memoized("test2"); numberOfFactoryCalls.Should().Be(2); }
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)); }
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); }
public LalrItemSet Closure(GrammarProductionDatabase db) { return(Memoize.Function(ClosureName, Tuple.Create(this, db), (arg) => arg.Item1.InternalClosure(arg.Item2))); }
public LalrItemSet ToCoreSet() { return(Memoize.Function(ToCoreSetName, this, (arg) => arg.InternalToCoreSet())); }
public Dictionary <Symbol, LalrItemSet> Goto(GrammarProductionDatabase db) { return(Memoize.Function(GotoName2, Tuple.Create(this, db), (arg) => arg.Item1.InternalGoto(arg.Item2))); }
public LalrItemSet Goto(Symbol symbol) { return(Memoize.Function(GotoName1, Tuple.Create(this, symbol), (arg) => arg.Item1.InternalGoto(arg.Item2))); }
public HashSet <TerminalSymbol> FirstSet(GrammarProductionDatabase db) { return(Memoize.Function(FirstSetName, Tuple.Create(this, db), (input) => input.Item1.InternalFirstSet(input.Item2))); }