public Solution(FixedVector position, Fixed32 heuristic)
 {
     Path = new List <FixedVector>(2)
     {
         position
     };
     Heuristic = heuristic;
     Cost      = Path.Count + heuristic;
 }
        public static void Run()
        {
            int size = 1000000;

            var msVec = ImmutableList<int>.Empty;
            var fvec = new Fvec<int>();
            var fixedMergeVec = FixedMergeVector<int>.Empty;
            var mergeVec = MergeVector<int>.Empty;
            var fixedVec = new FixedVector<int>();
            var resizeVec = ResizeVector<int>.Empty;

            Console.WriteLine("=========================== Add ===========================");

            Benchmark.Time("Collections.ImmutableList", () =>
            {
                msVec = ImmutableList<int>.Empty;
                for (int i = 0; i < size; i++) msVec = msVec.Add(i);
            });

            Benchmark.Time("Fvec", () =>
            {
                fvec = new Fvec<int>();
                for (int i = 0; i < size; i++) fvec = fvec.Add(i);
            });

            Benchmark.Time("FixedMergeVector", () =>
            {
                fixedMergeVec = FixedMergeVector<int>.Empty;
                for (int i = 0; i < size; i++) fixedMergeVec = fixedMergeVec.Add(i);
            });

            Benchmark.Time("MergeVector", () =>
            {
                mergeVec = MergeVector<int>.Empty;
                for (int i = 0; i < size; i++) mergeVec = mergeVec.Add(i);
            });

            Benchmark.Time("FixedVector", () =>
            {
                fixedVec = new FixedVector<int>();
                for (int i = 0; i < size; i++) fixedVec = fixedVec.Add(i);
            });

            Benchmark.Time("ResizeVector", () =>
            {
                resizeVec = ResizeVector<int>.Empty;
                for (int i = 0; i < size; i++) resizeVec = resizeVec.Add(i);
            });

            Console.WriteLine("=========================== Set ===========================");

            Benchmark.Time("Collections.ImmutableList", () =>
            {
                for (int i = 0; i < size; i++) msVec = msVec.SetItem((i * 234) % size, -i);
            });

            Benchmark.Time("Fvec", () =>
            {
                for (int i = 0; i < size; i++) fvec = fvec.Set((i * 234) % size, -i);
            });

            Benchmark.Time("FixedMergeVector", () =>
            {
                for (int i = 0; i < size; i++) fixedMergeVec = fixedMergeVec.Set((i * 234) % size, -i);
            });

            Benchmark.Time("MergeVector", () =>
            {
                for (int i = 0; i < size; i++) mergeVec = mergeVec.Set((i * 234) % size, -i);
            });

            Benchmark.Time("FixedVector", () =>
            {
                for (int i = 0; i < size; i++) fixedVec = fixedVec.Set((i * 234) % size, -i);
            });

            Benchmark.Time("ResizeVector", () =>
            {
                for (int i = 0; i < size; i++) resizeVec = resizeVec.Set((i * 234) % size, -i);
            });

            Console.WriteLine("=========================== Lookup ===========================");
            int x;

            Benchmark.Time("Collections.ImmutableList", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = msVec[(i * 234) % size];
            });

            Benchmark.Time("Fvec", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = fvec[(i * 234) % size];
            });

            Benchmark.Time("FixedMergeVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = fixedMergeVec.Lookup((i * 234) % size);
            });

            Benchmark.Time("MergeVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = mergeVec.Lookup((i * 234) % size);
            });
            Benchmark.Time("MergeVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = mergeVec.Lookup((i * 234) % size);
            });
            Benchmark.Time("MergeVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = mergeVec.Lookup((i * 234) % size);
            });
            Benchmark.Time("MergeVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = mergeVec.Lookup((i * 234) % size);
            });

            Benchmark.Time("FixedVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = fixedVec.Lookup((i * 234) % size);
            });

            Benchmark.Time("ResizeVector", () =>
            {
                for (int k = 0; k < 10; k++)
                    for (int i = 0; i < size; i++) x = resizeVec.Lookup((i * 234) % size);
            });

            Console.WriteLine("=========================== Memory ===========================");

            msVec = ImmutableList<int>.Empty;
            Benchmark.Memory("Collections.ImmutableList", () =>
            {
                for (int i = 0; i < size; i++) msVec = msVec.Add(i);
            });

            fvec = new Fvec<int>();
            Benchmark.Memory("Fvec", () =>
            {
                for (int i = 0; i < size; i++) fvec = fvec.Add(i);
            });

            fixedMergeVec = FixedMergeVector<int>.Empty;
            Benchmark.Memory("FixedMergeVector", () =>
            {
                for (int i = 0; i < size; i++) fixedMergeVec = fixedMergeVec.Add(i);
            });

            mergeVec = MergeVector<int>.Empty;
            Benchmark.Memory("MergeVector", () =>
            {
                for (int i = 0; i < size; i++) mergeVec = mergeVec.Add(i);
            });

            fixedVec = new FixedVector<int>();
            Benchmark.Memory("FixedVector", () =>
            {
                for (int i = 0; i < size; i++) fixedVec = fixedVec.Add(i);
            });

            resizeVec = ResizeVector<int>.Empty;
            Benchmark.Memory("ResizeVector", () =>
            {
                for (int i = 0; i < size; i++) resizeVec = resizeVec.Add(i);
            });

            // necessary for accurate memory measurement, otherwise the CLR will get smart on us and GC them too early
            Console.WriteLine(msVec[0]);
            Console.WriteLine(fvec[0]);
            Console.WriteLine(fixedMergeVec.Lookup(0));
            Console.WriteLine(mergeVec.Lookup(0));
            Console.WriteLine(fixedVec.Lookup(0));
        }