Пример #1
0
    public void group_inverse_times_element_equals_unit()
    {
      var a = new Monoid<double>(0.0, (x, y) => x + y);
      var g = new Group<double>(a, (x) => -x);

      Assert.That(g.Monoid.Op(4.0,g.Inverse(4.0)), Is.EqualTo(g.Monoid.Unit));
    }
Пример #2
0
        public void group_inverse_times_element_equals_unit()
        {
            var a = new Monoid <double>(0.0, (x, y) => x + y);
            var g = new Group <double>(a, (x) => - x);

            Assert.That(g.Monoid.Op(4.0, g.Inverse(4.0)), Is.EqualTo(g.Monoid.Unit));
        }
Пример #3
0
 public Monoid <Id <List <int> > > Concat(Monoid <Id <List <int> > > m)
 {
     return
         (new Sum(new Id <Func <List <int>, Func <List <int>, List <int> > > >(x => y => x.Concat(y))
                  .Ap(m.Value)
                  .Ap(Value)));
 }
Пример #4
0
        public static bool IsAssociative <MONOID, T>(T x, T y, T z, IEqualityComparer <T> comparer = null)
            where MONOID : struct, IMonoid <T>
        {
            comparer ??= EqualityComparer <T> .Default;

            return(comparer.Equals(Monoid.Concat <MONOID, T>(x, Monoid.Concat <MONOID, T>(y, z)),
                                   Monoid.Concat <MONOID, T>(Monoid.Concat <MONOID, T>(x, y), z)));
        }
Пример #5
0
        public static bool HasIdentity <MONOID, T>(T x, IEqualityComparer <T> comparer = null)
            where MONOID : struct, IMonoid <T>
        {
            comparer ??= EqualityComparer <T> .Default;

            return(comparer.Equals(Monoid.Concat <MONOID, T>(x, Monoid.Empty <MONOID, T>()), x) &&
                   comparer.Equals(Monoid.Concat <MONOID, T>(Monoid.Empty <MONOID, T>(), x), x));
        }
Пример #6
0
        public void Test01()
        {
            var mInt = from m in Monoid.make <int>()
                       let combine = Monoid.combine(seq(1, 2, 3, 4, 5), m)
                                     select combine;

            claim.equal(15, mInt);
        }
Пример #7
0
        public static void LastOrDefaultMonoidTest()
        {
            var m = Monoid.LastOrDefault(99);

            Assert.Equal(99, m.Neutral);
            Assert.Equal(5, m.Op(99, 5));
            Assert.Equal(99, m.Op(5, 99));
        }
Пример #8
0
        public void Test05()
        {
            var mString = from m in Monoid.make <string>()
                          let combine = Monoid.combine(seq("1", "2", "3", "4", "5"), m)
                                        select combine;

            claim.equal("12345", mString);
        }
Пример #9
0
        public static void IntMonoidTest()
        {
            var intMult = new Monoid <int>(1, (x, y) => x * y);

            Assert.Equal(5, intMult.Op(intMult.Neutral, 5));
            Assert.Equal(5, intMult.Op(5, intMult.Neutral));
            Assert.Equal(15, intMult.Op(3, 5));
        }
Пример #10
0
        public static void FoldMapTreeEnum(Tree <int> t)
        {
            var expected = t.Select(x => x * 2).ToList();
            var actual   = t.FoldMap(Monoid.ListAppend <int>(), x => new List <int> {
                x * 2
            });

            Assert.Equal(expected, actual);
        }
Пример #11
0
        public static void UnsafeTest()
        {
            var x = new IntWithAddMonoid(5);
            var y = new IntWithAddMonoid(7);

            Assert.Equal(0, Monoid.NeutralUnsafe <IntWithAddMonoid, IntWithAddMonoid>().Value);
            Assert.Equal(12, Monoid.OpUnsafe <IntWithAddMonoid, IntWithAddMonoid>()(x, y).Value);

            Assert.Equal(new GenericPerson <Info>("", new Info()), Monoid.NeutralUnsafe <GenericPerson <Info>, PersonMonoid <Info> >());
        }
Пример #12
0
        public void CompareToNaiveTest([Range(0, 30)] int n)
        {
            var y = "";

            bool SimpleQuery(Monoid x) => x.Value.Length <= y.Length;

            var oracle = new Oracle();
            var st     = new SegmentTree <Monoid>(n, oracle);

            Assert.That(st.Length, Is.EqualTo(n));
            var stn = new SegmentTreeNaive <Monoid>(n, oracle);

            for (var i = 0; i < n; i++)
            {
                var s = new Monoid($"a{i}");
                st.Set(i, s);
                stn.Set(i, s);
            }

            for (var i = 0; i < n; i++)
            {
                Assert.That(st.Get(i), Is.EqualTo(stn.Get(i)));
            }

            for (var l = 0; l <= n; l++)
            {
                for (var r = l; r <= n; r++)
                {
                    Assert.That(st.Query(l, r), Is.EqualTo(stn.Query(l, r)));
                }
            }

            for (var l = 0; l <= n; l++)
            {
                for (var r = l; r <= n; r++)
                {
                    y = st.Query(l, r).Value;
                    Assert.That(st.MaxRight(l, SimpleQuery), Is.EqualTo(stn.MaxRight(l, SimpleQuery)));
                    Assert.That(st.MaxRight(l, SimpleQuery),
                                Is.EqualTo(stn.MaxRight(l, x => x.Value.Length <= y.Length)));
                }
            }

            for (var r = 0; r <= n; r++)
            {
                for (var l = 0; l <= r; l++)
                {
                    y = st.Query(l, r).Value;
                    Assert.That(st.MinLeft(r, SimpleQuery), Is.EqualTo(stn.MinLeft(r, SimpleQuery)));
                    Assert.That(st.MinLeft(r, SimpleQuery),
                                Is.EqualTo(stn.MinLeft(r, x => x.Value.Length <= y.Length)));
                }
            }
        }
Пример #13
0
 // O(V^2)
 public AdjacencyMatrix(int v, Monoid <T> monoid, Monoid <T> comparer)
 {
     this.V        = v;
     this.Monoid   = monoid;
     this.Comparer = comparer;
     graph         = new T[v, v];
     for (var i = 0; i < v; i++)
     {
         for (var j = 0; j < v; j++)
         {
             graph[i, j] = i == j ? monoid.Unit : comparer.Unit;
         }
     }
 }
Пример #14
0
 public SegmentTree(int length, Monoid <T> monoid)
 {
     if (length > (int.MaxValue >> 1) + 1)
     {
         throw new ArgumentException();
     }
     _size = 1;
     while (_size < length)
     {
         _size <<= 1;
     }
     _tree       = Enumerable.Repeat(monoid.Unit, _size << 1).ToArray();
     this.Monoid = monoid;
     this.Length = length;
 }
Пример #15
0
 public RangeGetSegmentTree(int size, Monoid <T> monoid)
 {
     Size      = size;
     Monoid    = monoid;
     Height    = 1;
     LeafCount = 1;
     while (LeafCount < size)
     {
         Height++; LeafCount <<= 1;
     }
     Operators = new T[LeafCount << 1];
     for (int i = 0; i < Operators.Length; i++)
     {
         Operators[i] = monoid.Identity;
     }
 }
Пример #16
0
    public FenwickTree(IEnumerable <T> collection, Monoid <T> monoid)
    {
        var count = collection.Count();

        _monoid = monoid;
        _tree   = new T[count + 1];
        collection.ForEach((x, i) => { _tree[i + 1] = x; });
        for (var i = 1; i < count; i++)
        {
            var j = i + (i & -i);
            if (j < count)
            {
                _tree[j] = monoid.Append(_tree[j], _tree[i]);
            }
        }
    }
Пример #17
0
    public static void Solve()
    {
        var n = I;
        var m = I;
        var p = new long[m];
        var a = new double[m];
        var b = new double[m];

        Repeat(m, i =>
        {
            p[i] = L - 1;
            a[i] = D;
            b[i] = D;
        });

        if (m == 0)
        {
            Console.WriteLine(1.0);
            Console.WriteLine(1.0);
            return;
        }

        var comp = new CoordinateCompressor <long>(p);

        var st = SegmentTree.Create(m, Monoid.Create(
                                        Tuple.Create(1.0, 0.0),
                                        (x, y) => Tuple.Create(x.Item1 * y.Item1, x.Item2 * y.Item1 + y.Item2)));

        var min = 1.0;
        var max = 1.0;

        Repeat(m, i =>
        {
            var cp  = comp.Compress[p[i]];
            st[cp]  = Tuple.Create(a[i], b[i]);
            var crt = st[0, m - 1];
            var d   = crt.Item1 + crt.Item2;
            min     = Min(min, d);
            max     = Max(max, d);
        });

        Console.WriteLine(min);
        Console.WriteLine(max);
    }
Пример #18
0
        public void OneTest()
        {
            var oracle   = new Oracle();
            var identity = oracle.MonoidIdentity;
            var st       = new SegmentTree <Monoid>(1, oracle);

            Assert.That(st.Length, Is.EqualTo(1));
            Assert.That(st.QueryToAll(), Is.EqualTo(identity));
            Assert.That(st.Get(0), Is.EqualTo(identity));
            Assert.That(st.Query(0, 1), Is.EqualTo(identity));

            var expected = new Monoid("dummy");

            st.Set(0, expected);
            Assert.That(st.Get(0), Is.EqualTo(expected));
            Assert.That(st.Query(0, 0), Is.EqualTo(identity));
            Assert.That(st.Query(0, 1), Is.EqualTo(expected));
            Assert.That(st.Query(1, 1), Is.EqualTo(identity));
        }
Пример #19
0
        public static void IntLiftInfinityTest()
        {
            var intPlus    = new Monoid <int>(0, (x, y) => x + y);
            var intPlusInf = intPlus.LiftMonoidWithInfinity();

            Assert.True(intPlusInf.Neutral.HasValue);
            Assert.Equal(0, intPlusInf.Neutral.Value());

            var r = intPlusInf.Op(Maybe.Just(3), Maybe.Just(8));

            Assert.True(r.HasValue);
            Assert.Equal(11, r.Value());

            r = intPlusInf.Op(Maybe.Nothing <int>(), Maybe.Just(8));
            Assert.False(r.HasValue);

            r = intPlusInf.Op(Maybe.Just(3), Maybe.Nothing <int>());
            Assert.False(r.HasValue);

            r = intPlusInf.Op(Maybe.Nothing <int>(), Maybe.Nothing <int>());
            Assert.False(r.HasValue);
        }
Пример #20
0
        public static void ListAppendMonoidTest()
        {
            var m = Monoid.ListAppend <int>();

            var xs = new List <int> {
            };

            Assert.Empty(m.Neutral);
            Assert.Equal(new int[] { 3, 4 }, m.Op(xs, new List <int> {
                3, 4
            }));

            Assert.Equal(new int[] { 3, 4 }, xs);

            xs = new List <int> {
            };

            Assert.Equal(new int[] { 3, 4 }, m.Op(new List <int> {
                3, 4
            }, xs));

            Assert.Empty(xs);
        }
Пример #21
0
        public static void ImmutableListAppendMonoidTest()
        {
            var m = Monoid.ImmutableListAppend <int>();

            var xs = new List <int> {
            };
            var ys = new List <int> {
                1, 2, 3
            };
            var zs = new List <int> {
                4, 1, 2
            };

            Assert.Empty(m.Neutral);
            Assert.Empty(Monoid.NeutralUnsafe <IList <int>, Monoid.ListAppendImmutableMonoid <int> >());
            Assert.Equal(new int[] { 1, 2, 3 }, m.Op(xs, ys));
            Assert.Equal(new int[] { 1, 2, 3 }, m.Op(ys, xs));
            Assert.Equal(new int[] { 1, 2, 3, 4, 1, 2 }, m.Op(ys, zs));

            Assert.Empty(xs);
            Assert.Equal(new int[] { 1, 2, 3 }, ys);
            Assert.Equal(new int[] { 4, 1, 2 }, zs);
        }
Пример #22
0
 public SegmentTree(IList <T> collection, Monoid <T> monoid)
 {
     if (collection.Count > (int.MaxValue >> 1) + 1)
     {
         throw new ArgumentException();
     }
     _size = 1;
     while (_size < collection.Count)
     {
         _size <<= 1;
     }
     _tree = new T[_size << 1];
     for (var i = 0; i < _size; i++)
     {
         _tree[i + _size] = i < collection.Count ? collection[i] : monoid.Unit;
     }
     for (var i = _size - 1; i > 0; i--)
     {
         _tree[i] = monoid.Append(_tree[i << 1], _tree[(i << 1) + 1]);
     }
     this.Monoid = monoid;
     this.Length = collection.Count;
 }
Пример #23
0
        public static void ImmutableListAppendMonoidTest_String()
        {
            var m = Monoid.ImmutableListAppend <string>();

            var xs = new List <string> {
            };
            var ys = new List <string> {
                "a", "b", "c"
            };
            var zs = new List <string> {
                "d", "a", "b"
            };

            Assert.Empty(m.Neutral);
            Assert.Empty(Monoid.NeutralUnsafe <IList <string>, Monoid.ListAppendImmutableMonoid <string> >());
            Assert.Equal(new string[] { "a", "b", "c", "d", "a", "b" }, Monoid.OpUnsafe <IList <string>, Monoid.ListAppendImmutableMonoid <string> >()(ys, zs));
            Assert.Equal(new string[] { "a", "b", "c" }, m.Op(xs, ys));
            Assert.Equal(new string[] { "a", "b", "c" }, m.Op(ys, xs));
            Assert.Equal(new string[] { "a", "b", "c", "d", "a", "b" }, m.Op(ys, zs));

            Assert.Empty(xs);
            Assert.Equal(new string[] { "a", "b", "c" }, ys);
            Assert.Equal(new string[] { "d", "a", "b" }, zs);
        }
Пример #24
0
 public Vector(T[] data, Orientation direction, Monoid <T> add, Monoid <T> mult)
 {
     _data     = data;
     Direction = direction;
     Ring      = new SemiRing <T>(add, mult);
 }
Пример #25
0
 public static T runTest <T>(IEnumerable <T> list, Monoid <T> m)
 {
     list.Aggregate(m.MEmpty, (a, b) => m.MAppend(a, b));
 }
Пример #26
0
 public FenwickTree(int length, Monoid <T> monoid)
 {
     _tree   = Enumerable.Repeat(monoid.Unit, length + 1).ToArray();
     _monoid = monoid;
 }
Пример #27
0
 public static T Cond <T>(this Monoid <T> monoid, bool c, T then, T els) =>
 c ? then : els;
Пример #28
0
 public static T When <T>(this Monoid <T> monoid, bool c, T then) =>
 c ? then : monoid.Identity();
Пример #29
0
 public static T Appends <T>(this Monoid <T> monoid, params T[] x) =>
 monoid.Appends((IEnumerable <T>)x);
Пример #30
0
 public static T Appends <T>(this Monoid <T> monoid, IEnumerable <T> x) =>
 x.Aggregate(monoid.Identity(), monoid.BinaryOperation);
Пример #31
0
 public Vector(IEnumerable <T> data, Orientation direction, Monoid <T> add, Monoid <T> mult)
 {
     _data     = data.ToArray();
     Direction = direction;
     Ring      = new SemiRing <T>(add, mult);
 }
Пример #32
0
 public Monoid op(Monoid second)
 {
     return new IAMonoid (elt + ((IAMonoid) second).elt);
 }