Esempio n. 1
0
        /// <summary>
        /// Generates a new Partition Key value for the record
        /// </summary>
        /// <returns>Partition Key value</returns>
        public static string GetPartitionKey(Region region)
        {
            int lat = (int)PrecisionHelper.Round(region.LatitudePrefix, 0);
            int lon = (int)PrecisionHelper.Round(region.LongitudePrefix, 0);

            return($"{lat},{lon}");
        }
Esempio n. 2
0
        public void Test3(float value, int expectedNumbers)
        {
            //Act
            var result = PrecisionHelper.NumbersAfterDot(value);

            //Assert
            Assert.AreEqual(expectedNumbers, result);
        }
Esempio n. 3
0
 public void StepTest()
 {
     Assert.AreEqual(1.0, PrecisionHelper.GetStep(0));
     Assert.AreEqual(0.5, PrecisionHelper.GetStep(1));
     Assert.AreEqual(0.25, PrecisionHelper.GetStep(2));
     Assert.AreEqual(0.125, PrecisionHelper.GetStep(3));
     Assert.AreEqual(0.0625, PrecisionHelper.GetStep(4));
     Assert.AreEqual(2.0, PrecisionHelper.GetStep(-1));
     Assert.AreEqual(4.0, PrecisionHelper.GetStep(-2));
     Assert.AreEqual(8.0, PrecisionHelper.GetStep(-3));
     Assert.AreEqual(16.0, PrecisionHelper.GetStep(-4));
 }
        public void GetRangeTest()
        {
            Assert.AreEqual(Tuple.Create(7, 8), PrecisionHelper.GetRange(7, 8));
            Assert.AreEqual(Tuple.Create(6, 8), PrecisionHelper.GetRange(7, 7));
            Assert.AreEqual(Tuple.Create(4, 8), PrecisionHelper.GetRange(7, 6));
            Assert.AreEqual(Tuple.Create(-8, 8), PrecisionHelper.GetRange(7, 5));
            Assert.AreEqual(Tuple.Create(-16, 16), PrecisionHelper.GetRange(7, 4));
            Assert.AreEqual(Tuple.Create(-32, 32), PrecisionHelper.GetRange(7, 3));
            Assert.AreEqual(Tuple.Create(-64, 64), PrecisionHelper.GetRange(7, 2));
            Assert.AreEqual(Tuple.Create(-128, 128), PrecisionHelper.GetRange(7, 1));
            Assert.AreEqual(Tuple.Create(-256, 256), PrecisionHelper.GetRange(7, 0));

            Assert.AreEqual(Tuple.Create(-8, -7), PrecisionHelper.GetRange(-7, 8));
            Assert.AreEqual(Tuple.Create(-8, -6), PrecisionHelper.GetRange(-7, 7));
            Assert.AreEqual(Tuple.Create(-8, -4), PrecisionHelper.GetRange(-7, 6));
            Assert.AreEqual(Tuple.Create(-8, 8), PrecisionHelper.GetRange(-7, 5));
            Assert.AreEqual(Tuple.Create(-16, 16), PrecisionHelper.GetRange(-7, 4));
            Assert.AreEqual(Tuple.Create(-32, 32), PrecisionHelper.GetRange(-7, 3));
            Assert.AreEqual(Tuple.Create(-64, 64), PrecisionHelper.GetRange(-7, 2));
            Assert.AreEqual(Tuple.Create(-128, 128), PrecisionHelper.GetRange(-7, 1));
            Assert.AreEqual(Tuple.Create(-256, 256), PrecisionHelper.GetRange(-7, 0));
        }
        public void RoundTest()
        {
            Assert.AreEqual(0, PrecisionHelper.Round(0, 0));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 1));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 2));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 3));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 4));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 5));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 6));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 7));
            Assert.AreEqual(0, PrecisionHelper.Round(0, 8));

            Assert.AreEqual(0, PrecisionHelper.Round(1, 0));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 1));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 2));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 3));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 4));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 5));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 6));
            Assert.AreEqual(0, PrecisionHelper.Round(1, 7));
            Assert.AreEqual(1, PrecisionHelper.Round(1, 8));

            Assert.AreEqual(0, PrecisionHelper.Round(-1, 0));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 1));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 2));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 3));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 4));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 5));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 6));
            Assert.AreEqual(0, PrecisionHelper.Round(-1, 7));
            Assert.AreEqual(-1, PrecisionHelper.Round(-1, 8));

            Assert.AreEqual(0, PrecisionHelper.Round(37, 0));
            Assert.AreEqual(0, PrecisionHelper.Round(37, 1));
            Assert.AreEqual(0, PrecisionHelper.Round(37, 2));
            Assert.AreEqual(32, PrecisionHelper.Round(37, 3));
            Assert.AreEqual(32, PrecisionHelper.Round(37, 4));
            Assert.AreEqual(32, PrecisionHelper.Round(37, 5));
            Assert.AreEqual(36, PrecisionHelper.Round(37, 6));
            Assert.AreEqual(36, PrecisionHelper.Round(37, 7));
            Assert.AreEqual(37, PrecisionHelper.Round(37, 8));

            Assert.AreEqual(0, PrecisionHelper.Round(-37, 0));
            Assert.AreEqual(0, PrecisionHelper.Round(-37, 1));
            Assert.AreEqual(0, PrecisionHelper.Round(-37, 2));
            Assert.AreEqual(-32, PrecisionHelper.Round(-37, 3));
            Assert.AreEqual(-32, PrecisionHelper.Round(-37, 4));
            Assert.AreEqual(-32, PrecisionHelper.Round(-37, 5));
            Assert.AreEqual(-36, PrecisionHelper.Round(-37, 6));
            Assert.AreEqual(-36, PrecisionHelper.Round(-37, 7));
            Assert.AreEqual(-37, PrecisionHelper.Round(-37, 8));

            Assert.AreEqual(0, PrecisionHelper.Round(179.999, 0));
            Assert.AreEqual(128, PrecisionHelper.Round(179.999, 1));
            Assert.AreEqual(128, PrecisionHelper.Round(179.999, 2));
            Assert.AreEqual(160, PrecisionHelper.Round(179.999, 3));
            Assert.AreEqual(176, PrecisionHelper.Round(179.999, 4));
            Assert.AreEqual(176, PrecisionHelper.Round(179.999, 5));
            Assert.AreEqual(176, PrecisionHelper.Round(179.999, 6));
            Assert.AreEqual(178, PrecisionHelper.Round(179.999, 7));
            Assert.AreEqual(179, PrecisionHelper.Round(179.999, 8));
        }
Esempio n. 6
0
        private static void DisplayDiff(IEnumerable <Benchmark[]> allBenchmarks, IEnumerable <string> allNames)
        {
            // Use the first job's benchmarks as the reference for the rows:
            var firstBenchmarks = allBenchmarks.FirstOrDefault();

            if (firstBenchmarks == null || firstBenchmarks.Length < 1)
            {
                return;
            }

            var summaries = new Dictionary <string, List <BenchmarkSummary> >();

            foreach (var benchmark in firstBenchmarks)
            {
                summaries[benchmark.FullName] = new List <BenchmarkSummary>();
            }

            foreach (var benchmarks in allBenchmarks)
            {
                foreach (var benchmark in benchmarks)
                {
                    summaries[benchmark.FullName].Add(new BenchmarkSummary()
                    {
                        Name                         = benchmark.FullName,
                        MeanNanoseconds              = benchmark.Statistics.Mean,
                        StandardErrorNanoseconds     = benchmark.Statistics.StandardError,
                        StandardDeviationNanoseconds = benchmark.Statistics.StandardDeviation,
                        MedianNanoseconds            = benchmark.Statistics.Median,
                        Gen0                         = benchmark.Memory?.Gen0Collections ?? 0,
                        Gen1                         = benchmark.Memory?.Gen1Collections ?? 0,
                        Gen2                         = benchmark.Memory?.Gen2Collections ?? 0,
                        AllocatedBytes               = benchmark.Memory?.BytesAllocatedPerOperation ?? 0
                    });
                }
            }

            // Simplfy the benchmarks' names where possible to remove prefixes that
            // are all the same to reduce the width of the first column of the table
            // to the shortest unique string required across all benchmarks.
            var nameSegments = summaries.Keys.ToDictionary(key => key, value => value.Split('.'));

            while (true)
            {
                var areAllFirstSegmentsTheSame = nameSegments.Values
                                                 .Select(segments => segments[0])
                                                 .Distinct()
                                                 .Count() == 1;

                if (!areAllFirstSegmentsTheSame)
                {
                    // The names cannot be simplified further
                    break;
                }

                foreach (var pair in nameSegments)
                {
                    nameSegments[pair.Key] = pair.Value.Skip(1).ToArray();
                }
            }

            // Map the full names to their simplified name
            var simplifiedNames = nameSegments.ToDictionary(key => key.Key, value => string.Join(".", value.Value));

            var anyAllocations = summaries.Values
                                 .SelectMany(list => list)
                                 .Select(summary => summary.AllocatedBytes)
                                 .Any(allocatedBytes => allocatedBytes > 0);

            // Name + baseline mean (firstBenchmarks) + (other benchmarks' mean * 2 (value + ratio)) +
            // baseline allocations + (other benchmarks' mean * 2 (value + ratio))
            var otherCount = allNames.Count() - 1;
            var table      = new ResultTable(1 + 1 + (anyAllocations ? 1 : 0) + (otherCount * (anyAllocations ? 4 : 2)));

            var firstName = allNames.First();

            table.Headers.Add("benchmark");
            table.Headers.Add($"mean ({firstName})");

            foreach (var name in allNames.Skip(1))
            {
                table.Headers.Add($"mean ({name})");
                table.Headers.Add("ratio");
            }

            if (anyAllocations)
            {
                table.Headers.Add($"allocated ({firstName})");

                foreach (var name in allNames.Skip(1))
                {
                    table.Headers.Add($"allocated ({name})");
                    table.Headers.Add("ratio");
                }
            }

            foreach (var benchmark in summaries.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value))
            {
                var firstBenchmark = benchmark.First();
                var simplifiedName = simplifiedNames[firstBenchmark.Name];

                var benchmarks = summaries[firstBenchmark.Name];

                var row  = table.AddRow();
                var cell = new Cell();
                cell.Elements.Add(new CellElement()
                {
                    Text = simplifiedName, Alignment = CellTextAlignment.Left
                });
                row.Add(cell);

                AddCells(row, summary => summary.MeanNanoseconds, UnitType.Time, benchmarks);

                if (anyAllocations)
                {
                    AddCells(row, summary => summary.AllocatedBytes, UnitType.Size, benchmarks);
                }
            }

            Console.WriteLine("```md"); // Format as a GitHub-flavored Markdown table

            table.Render(Console.Out);

            Console.WriteLine("```");

            void AddCells(
                List <Cell> row,
                Func <BenchmarkSummary, object> valueFactory,
                UnitType unitType,
                List <BenchmarkSummary> summaries)
            {
                var rawValues = summaries
                                .Select(summary => valueFactory(summary))
                                .Select(value => Convert.ToDouble(value))
                                .ToArray();

                var precision = PrecisionHelper.GetPrecision(rawValues);
                var sizeUnit  = unitType == UnitType.Size ? SizeUnit.GetBestSizeUnit(rawValues) : null;
                var timeUnit  = unitType == UnitType.Time ? TimeUnit.GetBestTimeUnit(rawValues) : null;

                var units = unitType switch
                {
                    UnitType.Size => sizeUnit.Name,
                    UnitType.Time => timeUnit.Name,
                    _ => string.Empty
                };

                var baseline = summaries[0];

                for (var i = 0; i < summaries.Count; i++)
                {
                    var measure  = rawValues[i];
                    var previous = rawValues[0];

                    var ratio = measure == 0
                    ? 0
                    : measure / previous;

                    var formattedValue = unitType switch
                    {
                        UnitType.Size => new SizeValue((long)measure).ToString(sizeUnit),
                        UnitType.Time => new TimeInterval(measure).ToString(timeUnit, precision),
                        _ => measure.ToString("N" + precision, CultureInfo.InvariantCulture)
                    };

                    var cell = new Cell();
                    cell.Elements.Add(new CellElement
                    {
                        Text      = $"{formattedValue} {units}",
                        Alignment = CellTextAlignment.Right
                    });
                    row.Add(cell);

                    // Don't render the ratio on baseline benchmark
                    if (summaries[i] != baseline)
                    {
                        row.Add(cell = new Cell());

                        if (measure != 0)
                        {
                            cell.Elements.Add(new CellElement
                            {
                                Text      = ratio.ToString("N2", CultureInfo.InvariantCulture),
                                Alignment = CellTextAlignment.Right
                            });
                        }
                    }
                }
            }
        }
Esempio n. 7
0
        public void RoundTest()
        {
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, 0));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, 1));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, 2));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, 3));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, 4));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, -1));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, -2));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, -3));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.0, -4));

            Assert.AreEqual(0.0, PrecisionHelper.Round(0.5, 0));
            Assert.AreEqual(0.5, PrecisionHelper.Round(0.5, 1));
            Assert.AreEqual(0.5, PrecisionHelper.Round(0.5, 2));
            Assert.AreEqual(0.5, PrecisionHelper.Round(0.5, 3));
            Assert.AreEqual(0.5, PrecisionHelper.Round(0.5, 4));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.5, -1));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.5, -2));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.5, -3));
            Assert.AreEqual(0.0, PrecisionHelper.Round(0.5, -4));

            Assert.AreEqual(-1.0, PrecisionHelper.Round(-0.5, 0));
            Assert.AreEqual(-0.5, PrecisionHelper.Round(-0.5, 1));
            Assert.AreEqual(-0.5, PrecisionHelper.Round(-0.5, 2));
            Assert.AreEqual(-0.5, PrecisionHelper.Round(-0.5, 3));
            Assert.AreEqual(-0.5, PrecisionHelper.Round(-0.5, 4));
            Assert.AreEqual(-2.0, PrecisionHelper.Round(-0.5, -1));
            Assert.AreEqual(-4.0, PrecisionHelper.Round(-0.5, -2));
            Assert.AreEqual(-8.0, PrecisionHelper.Round(-0.5, -3));
            Assert.AreEqual(-16.0, PrecisionHelper.Round(-0.5, -4));

            Assert.AreEqual(1.0, PrecisionHelper.Round(1.0, 0));
            Assert.AreEqual(1.0, PrecisionHelper.Round(1.0, 1));
            Assert.AreEqual(1.0, PrecisionHelper.Round(1.0, 2));
            Assert.AreEqual(1.0, PrecisionHelper.Round(1.0, 3));
            Assert.AreEqual(1.0, PrecisionHelper.Round(1.0, 4));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.0, -1));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.0, -2));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.0, -3));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.0, -4));

            Assert.AreEqual(-1.0, PrecisionHelper.Round(-1.0, 0));
            Assert.AreEqual(-1.0, PrecisionHelper.Round(-1.0, 1));
            Assert.AreEqual(-1.0, PrecisionHelper.Round(-1.0, 2));
            Assert.AreEqual(-1.0, PrecisionHelper.Round(-1.0, 3));
            Assert.AreEqual(-1.0, PrecisionHelper.Round(-1.0, 4));
            Assert.AreEqual(-2.0, PrecisionHelper.Round(-1.0, -1));
            Assert.AreEqual(-4.0, PrecisionHelper.Round(-1.0, -2));
            Assert.AreEqual(-8.0, PrecisionHelper.Round(-1.0, -3));
            Assert.AreEqual(-16.0, PrecisionHelper.Round(-1.0, -4));

            Assert.AreEqual(1.0, PrecisionHelper.Round(1.3, 0));
            Assert.AreEqual(1.0, PrecisionHelper.Round(1.3, 1));
            Assert.AreEqual(1.25, PrecisionHelper.Round(1.3, 2));
            Assert.AreEqual(1.25, PrecisionHelper.Round(1.3, 3));
            Assert.AreEqual(1.25, PrecisionHelper.Round(1.3, 4));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.3, -1));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.3, -2));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.3, -3));
            Assert.AreEqual(0.0, PrecisionHelper.Round(1.3, -4));

            Assert.AreEqual(-2.0, PrecisionHelper.Round(-1.3, 0));
            Assert.AreEqual(-1.5, PrecisionHelper.Round(-1.3, 1));
            Assert.AreEqual(-1.5, PrecisionHelper.Round(-1.3, 2));
            Assert.AreEqual(-1.375, PrecisionHelper.Round(-1.3, 3));
            Assert.AreEqual(-1.3125, PrecisionHelper.Round(-1.3, 4));
            Assert.AreEqual(-2.0, PrecisionHelper.Round(-1.3, -1));
            Assert.AreEqual(-4.0, PrecisionHelper.Round(-1.3, -2));
            Assert.AreEqual(-8.0, PrecisionHelper.Round(-1.3, -3));
            Assert.AreEqual(-16.0, PrecisionHelper.Round(-1.3, -4));

            Assert.AreEqual(37.0, PrecisionHelper.Round(37.9, 0));
            Assert.AreEqual(37.5, PrecisionHelper.Round(37.9, 1));
            Assert.AreEqual(37.75, PrecisionHelper.Round(37.9, 2));
            Assert.AreEqual(37.875, PrecisionHelper.Round(37.9, 3));
            Assert.AreEqual(37.875, PrecisionHelper.Round(37.9, 4));
            Assert.AreEqual(36.0, PrecisionHelper.Round(37.9, -1));
            Assert.AreEqual(36.0, PrecisionHelper.Round(37.9, -2));
            Assert.AreEqual(32.0, PrecisionHelper.Round(37.9, -3));
            Assert.AreEqual(32.0, PrecisionHelper.Round(37.9, -4));

            Assert.AreEqual(-38.0, PrecisionHelper.Round(-37.9, 0));
            Assert.AreEqual(-38.0, PrecisionHelper.Round(-37.9, 1));
            Assert.AreEqual(-38.0, PrecisionHelper.Round(-37.9, 2));
            Assert.AreEqual(-38.0, PrecisionHelper.Round(-37.9, 3));
            Assert.AreEqual(-37.9375, PrecisionHelper.Round(-37.9, 4));
            Assert.AreEqual(-38.0, PrecisionHelper.Round(-37.9, -1));
            Assert.AreEqual(-40.0, PrecisionHelper.Round(-37.9, -2));
            Assert.AreEqual(-40.0, PrecisionHelper.Round(-37.9, -3));
            Assert.AreEqual(-48.0, PrecisionHelper.Round(-37.9, -4));
        }