Example #1
0
        public async Task Test_CutFillTile_TAGFile_FilterToFilter()
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();
            AddDesignProfilerGridRouting();

            // Construct a site model from a single TAG file
            var tagFiles  = new[] { Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag") };
            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var palette   = PVMPaletteFactory.GetPalette(siteModel, DisplayMode.CutFill, siteModel.SiteModelExtent);
            var request   = new TileRenderRequest();

            var arg = SimpleTileRequestArgument(siteModel, DisplayMode.CutFill, palette, volumeType: VolumeComputationType.Between2Filters);

            // Create a pair of filters to support first -> last cell pass comparison
            arg.Filters = new FilterSet(new CombinedFilter(), new CombinedFilter());
            arg.Filters.Filters[0].AttributeFilter.ReturnEarliestFilteredCellPass = true;

            // Add the cut/fill design reference to the request, and set the rendering extents to the cell in question,
            // with an additional 1 meter border around the cell
            arg.Extents = siteModel.SiteModelExtent;
            arg.Extents.Expand(1.0, 1.0);

            var response = await request.ExecuteAsync(arg);

            response.Should().NotBeNull();
            response.ResultStatus.Should().Be(RequestErrorStatus.OK);

            var fileName = "FilterToFilter-CutFill-TestTAGFile.bmp";
            var path     = Path.Combine("TestData", "RenderedTiles", "CutFillTile", fileName);

            var saveFileName = ""; // @"C:\Temp\FilterToFilter-CutFill-TestTAGFile.bmp";

            CheckSimpleRenderTileResponse(response, DisplayMode.CutFill, saveFileName, path);
        }
Example #2
0
        private ISiteModel BuildModelForSingleCellLiftAnalysis(DateTime baseTime)
        {
            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            siteModel.MachinesTargetValues[bulldozerMachineIndex].VibrationStateEvents.PutValueAtDate(Consts.MIN_DATETIME_AS_UTC, VibrationState.On);

            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(baseTime, ProductionEventType.StartEvent);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].LayerIDStateEvents.PutValueAtDate(baseTime, LAYER_ID1);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].LayerIDStateEvents.PutValueAtDate(baseTime.AddMinutes(5).AddSeconds(1), LAYER_ID2);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(baseTime.AddMinutes(11), ProductionEventType.EndEvent);

            siteModel.MachinesTargetValues[bulldozerMachineIndex].SaveMachineEventsToPersistentStore(siteModel.PrimaryStorageProxy);

            var cellPasses = Enumerable.Range(1, 10).Select(x =>
                                                            new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time     = baseTime.AddMinutes(x),
                Height   = 1.0f + x * 0.5f,
                PassType = PassType.Front,
                CCV      = (short)(10 + 10 * x)
            }).ToArray();

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses, 1, cellPasses.Length);

            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            return(siteModel);
        }
Example #3
0
        public async Task Test_SummaryCMVStatistics_SiteModelWithSingleTAGFile_FullExtents_WithCMVTargetOverrides
            (short target, double minPercentage, double maxPercentage, double percentBelow, double percentWithin, double percentAbove)
        {
            AddClusterComputeGridRouting();
            AddApplicationGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var operation = new CMVStatisticsOperation();

            var cmvSummaryResult = await operation.ExecuteAsync(SimpleCMVStatisticsArgument(siteModel, target, minPercentage, maxPercentage));

            cmvSummaryResult.Should().NotBeNull();
            cmvSummaryResult.ResultStatus.Should().Be(RequestErrorStatus.OK);
            cmvSummaryResult.ReturnCode.Should().Be(MissingTargetDataResultType.NoProblems);
            cmvSummaryResult.ConstantTargetCMV.Should().Be(target == 0 ? MACHINE_TARGET_CMV : target);
            cmvSummaryResult.IsTargetCMVConstant.Should().BeTrue();
            cmvSummaryResult.Counts.Should().BeNull();
            cmvSummaryResult.Percents.Should().BeNull();
            cmvSummaryResult.BelowTargetPercent.Should().BeApproximately(percentBelow, 0.001);
            cmvSummaryResult.AboveTargetPercent.Should().BeApproximately(percentAbove, 0.001);
            cmvSummaryResult.WithinTargetPercent.Should().BeApproximately(percentWithin, 0.001);
            cmvSummaryResult.TotalAreaCoveredSqMeters.Should().BeApproximately(2164 * SubGridTreeConsts.DefaultCellSize * SubGridTreeConsts.DefaultCellSize, 0.000001);
        }
Example #4
0
        public async Task CSVExportRequest_Execute_ExceedsLimit()
        {
            DILoggingFixture.SetMaxExportRowsConfig(1);

            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var tempFileName = MockS3FileTransfer_UploadToBucket();
            var siteModel    = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var request      = new CSVExportRequest();
            var baseDate     = DateTime.SpecifyKind(new DateTime(2000, 1, 1, 1, 0, 0, 0), DateTimeKind.Utc);

            var cellPasses = new CellPass[SubGridTreeConsts.SubGridTreeDimension, SubGridTreeConsts.SubGridTreeDimension][];

            SubGridUtilities.SubGridDimensionalIterator((x, y) =>
            {
                cellPasses[x, y] = new[] { new CellPass {
                                               Time = baseDate, Height = 1.0f
                                           } };
            });
            DITAGFileAndSubGridRequestsFixture.AddSingleSubGridWithPasses(siteModel,
                                                                          SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            var response = await request.ExecuteAsync(SimpleCSVExportRequestArgument(siteModel.ID));

            response.Should().NotBeNull();
            response.ResultStatus.Should().Be(RequestErrorStatus.ExportExceededRowLimit);

            CleanupMockedFile(tempFileName, siteModel.ID);
        }
Example #5
0
        private ISiteModel BuildModelForCellsElevation(float elevationIncrement)
        {
            var baseTime      = DateTime.UtcNow;
            var baseElevation = 1.0F;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            CellPass[, ][] cellPasses = new CellPass[32, 32][];

            SubGridUtilities.SubGridDimensionalIterator((x, y) =>
            {
                cellPasses[x, y] = Enumerable.Range(0, 1).Select(p =>
                                                                 new CellPass
                {
                    InternalSiteModelMachineIndex = bulldozerMachineIndex,
                    Time     = baseTime.AddMinutes(p),
                    Height   = baseElevation + (x + y) * elevationIncrement, // incrementally increase height across the sub grid
                    PassType = PassType.Front
                }).ToArray();
            });

            DITAGFileAndSubGridRequestsFixture.AddSingleSubGridWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            return(siteModel);
        }
Example #6
0
        public async Task Test_PatchRequest_Execute_SingleTAGFileSiteModel()
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var request   = new PatchRequest();
            var response  = await request.ExecuteAsync(SimplePatchRequestArgument(siteModel.ID));

            response.Should().NotBeNull();
            response.SubGrids.Should().NotBeNull();
            response.SubGrids.Count.Should().Be(12);

            response.SubGrids.ForEach(x => x.Should().BeOfType <ClientHeightAndTimeLeafSubGrid>());

            int nonNullCellCount = 0;

            response.SubGrids.ForEach(x => nonNullCellCount += ((ClientHeightAndTimeLeafSubGrid)x).CountNonNullCells());
            nonNullCellCount.Should().Be(3054);
        }
Example #7
0
        public async Task Test_SummaryPassCountStatistics_SiteModelWithSingleTAGFile_FullExtents_WithPassCountTargetOverrides
            (ushort minTarget, ushort maxTarget, double percentBelow, double percentWithin, double percentAbove, double totalArea)
        {
            AddClusterComputeGridRouting();
            AddApplicationGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var operation = new PassCountStatisticsOperation();

            var passCountSummaryResult = await operation.ExecuteAsync(SimplePassCountStatisticsArgument(siteModel, minTarget, maxTarget));

            passCountSummaryResult.Should().NotBeNull();
            passCountSummaryResult.ResultStatus.Should().Be(RequestErrorStatus.OK);
            passCountSummaryResult.ReturnCode.Should().Be(MissingTargetDataResultType.NoResult);
            passCountSummaryResult.BelowTargetPercent.Should().BeApproximately(percentBelow, 0.001);
            passCountSummaryResult.AboveTargetPercent.Should().BeApproximately(percentAbove, 0.001);
            passCountSummaryResult.WithinTargetPercent.Should().BeApproximately(percentWithin, 0.001);
            passCountSummaryResult.TotalAreaCoveredSqMeters.Should().BeApproximately(totalArea, 0.000001);
            passCountSummaryResult.IsTargetPassCountConstant.Should().BeTrue();
            passCountSummaryResult.Counts.Should().BeNull();
            passCountSummaryResult.Percents.Should().BeNull();
        }
Example #8
0
        public async Task Test_SimpleVolumesRequest_ApplicationService_FilterToFilter_EarliestToMidTime_Execute_SingleTAGFile()
        {
            const string expectedResponseText = "{\"Cut\":0.6670116119384769,\"Fill\":2.2439066680908204,\"TotalCoverageArea\":279.75200000000007,\"CutArea\":78.72360000000002,\"FillArea\":175.24960000000004,\"BoundingExtentGrid\":{\"MinX\":537669.2000000001,\"MinY\":5427396.54,\"MaxX\":537675.6600000001,\"MaxY\":5427509.76,\"MinZ\":1E+308,\"MaxZ\":1E+308,\"Area\":731.4012000072782,\"CenterX\":537672.4300000002,\"CenterY\":5427453.15,\"CenterZ\":1E+308,\"IsMaximalPlanConverage\":false,\"IsValidHeightExtent\":false,\"IsValidPlanExtent\":true,\"LargestPlanDimension\":113.21999999973923,\"SizeX\":6.460000000079162,\"SizeY\":113.21999999973923,\"SizeZ\":0.0},\"BoundingExtentLLH\":{\"MinX\":1E+308,\"MinY\":1E+308,\"MaxX\":1E+308,\"MaxY\":1E+308,\"MinZ\":1E+308,\"MaxZ\":1E+308,\"Area\":0.0,\"CenterX\":1E+308,\"CenterY\":1E+308,\"CenterZ\":1E+308,\"IsMaximalPlanConverage\":false,\"IsValidHeightExtent\":false,\"IsValidPlanExtent\":false,\"LargestPlanDimension\":1E+308,\"SizeX\":0.0,\"SizeY\":0.0,\"SizeZ\":0.0},\"ResponseCode\":1,\"ClusterNode\":\"\",\"NumSubgridsProcessed\":0,\"NumSubgridsExamined\":0,\"NumProdDataSubGridsProcessed\":0,\"NumProdDataSubGridsExamined\":0,\"NumSurveyedSurfaceSubGridsProcessed\":0,\"NumSurveyedSurfaceSubGridsExamined\":0}";

            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);

            var request = new SimpleVolumesRequest_ApplicationService();
            var arg     = SimpleDefaultRequestArg(siteModel.ID);

            var(startUtc, endUtc) = siteModel.GetDateRange();

            arg.TopFilter.AttributeFilter.HasTimeFilter = true;
            arg.TopFilter.AttributeFilter.StartTime     = DateTime.SpecifyKind(new DateTime((startUtc.Ticks + endUtc.Ticks) / 2), DateTimeKind.Utc);

            var response = await request.ExecuteAsync(arg);

            // var responseText = JsonConvert.SerializeObject(response);
            JsonConvert.DeserializeObject <SimpleVolumesResponse>(expectedResponseText).Should().BeEquivalentTo(response);
        }
Example #9
0
        protected ISiteModel BuildModelForSingleCellTileRender(float heightIncrement, int cellX = SubGridTreeConsts.DefaultIndexOriginOffset, int cellY = SubGridTreeConsts.DefaultIndexOriginOffset)
        {
            var baseTime   = DateTime.UtcNow;
            var baseHeight = 1.0f;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            siteModel.MachinesTargetValues[bulldozerMachineIndex].TargetCCAStateEvents.PutValueAtDate(VSS.TRex.Common.Consts.MIN_DATETIME_AS_UTC, 5);

            var referenceDate      = DateTime.UtcNow;
            var startReportPeriod1 = referenceDate.AddMinutes(-60);
            var endReportPeriod1   = referenceDate.AddMinutes(-30);

            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(startReportPeriod1, ProductionEventType.StartEvent);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(endReportPeriod1, ProductionEventType.EndEvent);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].LayerIDStateEvents.PutValueAtDate(endReportPeriod1, 1);

            var cellPasses = Enumerable.Range(0, 10).Select(x =>
                                                            new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time     = baseTime.AddMinutes(x),
                Height   = baseHeight + x * heightIncrement,
                PassType = PassType.Front
            }).ToArray();

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel, cellX, cellY, cellPasses, 1, cellPasses.Length);
            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            return(siteModel);
        }
Example #10
0
        private ISiteModel BuildModelForSingleCellSummaryVolume(float heightIncrement)
        {
            var baseTime   = DateTime.UtcNow;
            var baseHeight = 1.0f;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            const int numCellPasses = 10;
            var       cellPasses    = Enumerable.Range(0, numCellPasses).Select(x =>
                                                                                new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time     = baseTime.AddMinutes(x),
                Height   = baseHeight + x * heightIncrement,
                PassType = PassType.Front
            });

            // Ensure the machine the cell passes are being added to has start and stop evens bracketing the cell passes
            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(baseTime, ProductionEventType.StartEvent);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(baseTime.AddMinutes(numCellPasses - 1), ProductionEventType.EndEvent);

            siteModel.MachinesTargetValues[bulldozerMachineIndex].SaveMachineEventsToPersistentStore(siteModel.PrimaryStorageProxy);

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses, 1, cellPasses.Count());

            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            return(siteModel);
        }
Example #11
0
        public async Task Test_SummarySpeedStatistics_SiteModelWithSingleTAGFile_FullExtents_WithSpeedTargetRange
            (ushort minTarget, ushort maxTarget, double percentBelow, double percentWithin, double percentAbove)
        {
            AddClusterComputeGridRouting();
            AddApplicationGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var operation = new SpeedStatisticsOperation();

            var cmvSummaryResult = await operation.ExecuteAsync(SimpleSpeedStatisticsArgument(siteModel, minTarget, maxTarget));

            cmvSummaryResult.Should().NotBeNull();
            cmvSummaryResult.ResultStatus.Should().Be(RequestErrorStatus.OK);
            cmvSummaryResult.Counts.Should().BeNull();
            cmvSummaryResult.Percents.Should().BeNull();
            cmvSummaryResult.BelowTargetPercent.Should().BeApproximately(percentBelow, 0.001);
            cmvSummaryResult.AboveTargetPercent.Should().BeApproximately(percentAbove, 0.001);
            cmvSummaryResult.WithinTargetPercent.Should().BeApproximately(percentWithin, 0.001);
            cmvSummaryResult.TotalAreaCoveredSqMeters.Should().BeApproximately(3054 * SubGridTreeConsts.DefaultCellSize * SubGridTreeConsts.DefaultCellSize, 0.000001);
        }
Example #12
0
        private ISiteModel BuildModelForSingleCellElevationAndCmv(float elevationIncrement, double originX = 0.0, double originY = 0.0)
        {
            var  baseTime      = DateTime.UtcNow;
            byte baseElevation = 1;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            // vibrationState is needed to get cmv values
            siteModel.MachinesTargetValues[0].VibrationStateEvents.PutValueAtDate(baseTime, VibrationState.On);
            siteModel.MachinesTargetValues[0].AutoVibrationStateEvents.PutValueAtDate(baseTime, AutoVibrationState.Manual);

            siteModel.MachinesTargetValues[0].SaveMachineEventsToPersistentStore(siteModel.PrimaryStorageProxy);

            var cellPasses = Enumerable.Range(0, 10).Select(x =>
                                                            new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time     = baseTime.AddMinutes(x),
                Height   = (byte)(baseElevation + x * elevationIncrement),
                PassType = PassType.Front,
                CCV      = 34
            }).ToArray();

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel,
                SubGridTreeConsts.DefaultIndexOriginOffset + (int)Math.Truncate(originX / siteModel.CellSize),
                SubGridTreeConsts.DefaultIndexOriginOffset + (int)Math.Truncate(originY / siteModel.CellSize),
                cellPasses, 1, cellPasses.Length);

            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            return(siteModel);
        }
Example #13
0
        private ISiteModel BuildModelForCellsCMV(short cmvIncrement, short targetCMV = CellPassConsts.NullCCV)
        {
            var   baseTime = DateTime.UtcNow;
            short baseCMV  = 10;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            if (targetCMV != CellPassConsts.NullCCV)
            {
                siteModel.MachinesTargetValues[bulldozerMachineIndex].TargetCCVStateEvents.PutValueAtDate(TRex.Common.Consts.MIN_DATETIME_AS_UTC, targetCMV);
            }

            CellPass[, ][] cellPasses = new CellPass[SubGridTreeConsts.SubGridTreeDimension, SubGridTreeConsts.SubGridTreeDimension][];

            SubGridUtilities.SubGridDimensionalIterator((x, y) =>
            {
                cellPasses[x, y] = Enumerable.Range(0, 1).Select(p =>
                                                                 new CellPass
                {
                    InternalSiteModelMachineIndex = bulldozerMachineIndex,
                    Time     = baseTime.AddMinutes(p),
                    CCV      = (short)(baseCMV + x * cmvIncrement), // incrementally increase CCV across the sub grid
                    PassType = PassType.Front
                }).ToArray();
            });

            DITAGFileAndSubGridRequestsFixture.AddSingleSubGridWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            return(siteModel);
        }
Example #14
0
        private ISiteModel BuildModelForSingleCellCMV(short cmvIncrement, short targetCMV = CellPassConsts.NullCCV)
        {
            var   baseTime = DateTime.UtcNow;
            short baseCMV  = 10;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            if (targetCMV != CellPassConsts.NullCCV)
            {
                siteModel.MachinesTargetValues[bulldozerMachineIndex].TargetCCVStateEvents.PutValueAtDate(TRex.Common.Consts.MIN_DATETIME_AS_UTC, targetCMV);
            }

            var cellPasses = Enumerable.Range(0, 10).Select(x =>
                                                            new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time     = baseTime.AddMinutes(x),
                CCV      = (short)(baseCMV + x * cmvIncrement),
                PassType = PassType.Front
            }).ToArray();

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses, 1, cellPasses.Length);
            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            return(siteModel);
        }
Example #15
0
        private ISiteModel BuildTestSiteModel(DateTime baseTime, int count = 10)
        {
            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            siteModel.MachinesTargetValues[bulldozerMachineIndex].VibrationStateEvents.PutValueAtDate(Consts.MIN_DATETIME_AS_UTC, VibrationState.On);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].GPSAccuracyAndToleranceStateEvents.PutValueAtDate(Consts.MIN_DATETIME_AS_UTC, new GPSAccuracyAndTolerance(GPSAccuracy.Fine, 20));

            var cellPasses = Enumerable.Range(1, count).Select(x =>
                                                               new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time                = baseTime.AddMinutes(x),
                Height              = 1.0f + x * 0.5f,
                PassType            = PassType.Front,
                CCV                 = (short)(10 + 10 * x),
                MachineSpeed        = (ushort)(650 + x),
                MDP                 = (short)(20 + 20 * x),
                MaterialTemperature = (ushort)(1000 + x)
            }).ToArray();

            for (var i = 0; i < cellPasses.Length; i++)
            {
                siteModel.MachinesTargetValues[bulldozerMachineIndex].LayerIDStateEvents.PutValueAtDate(cellPasses[i].Time, (ushort)(i % 5));
            }

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses, 1, cellPasses.Length);
            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);
            return(siteModel);
        }
Example #16
0
        public void BuildLiftsForSinglePassCell_CMVPercentChange(float[] heights, short[] cmvs)
        {
            var siteModel = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var baseTime  = DateTime.UtcNow;

            var cellPasses = new[]
            {
                new CellPass
                {
                    Time   = baseTime,
                    Height = heights[0],
                    CCV    = cmvs[0]
                },
                new CellPass
                {
                    Time   = baseTime.AddHours(1),
                    Height = heights[1],
                    CCV    = cmvs[1]
                },
                new CellPass
                {
                    Time   = baseTime.AddHours(2),
                    Height = heights[2],
                    CCV    = cmvs[2]
                },
                new CellPass
                {
                    Time   = baseTime.AddHours(3),
                    Height = heights[3],
                    CCV    = cmvs[3]
                }
            };

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            IClientLeafSubGrid clientGrid = ClientLeafSubGridFactoryFactory.CreateClientSubGridFactory().GetSubGrid(GridDataType.CCVPercentChange) as ClientCMVLeafSubGrid;

            var serverGrid = TRex.SubGridTrees.Server.Utilities.SubGridUtilities.LocateSubGridContaining(
                siteModel.PrimaryStorageProxy, siteModel.Grid,
                SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset,
                siteModel.Grid.NumLevels, false, false) as IServerLeafSubGrid;

            var builder = new CellLiftBuilder(siteModel, GridDataType.CCVPercentChange, new FilteredValuePopulationControl(),
                                              new FilterSet(new CombinedFilter()), new CellPassFastEventLookerUpper(siteModel));

            var cell = new ProfileCell();

            var segmentIterator  = new SubGridSegmentIterator(serverGrid, serverGrid.Directory, siteModel.PrimaryStorageProxy);
            var cellPassIterator = new SubGridSegmentCellPassIterator_NonStatic(segmentIterator);

            var filteredValueAssignmentContext = new FilteredValueAssignmentContext();

            builder.Build(cell, new LiftParameters(), clientGrid, filteredValueAssignmentContext, cellPassIterator, true).Should().BeTrue();

            cell.Layers.Count().Should().Be(1);
            cell.Layers[0].PassCount.Should().Be(4);
            filteredValueAssignmentContext.FilteredValue.FilteredPassData.FilteredPass.CCV.Should().Be(cmvs[cmvs.Length - 1]);
            filteredValueAssignmentContext.PreviousFilteredValue.FilteredPassData.FilteredPass.CCV.Should().Be(cmvs[cmvs.Length - 2]);
        }
Example #17
0
        public void Notify_TAGFileDerivedChangeMap_SiteModelsMediatedNotification()
        {
            // Build a site model from a TAG file and verify there is a change map written to the queue that matches the existence map
            // for the newly created model
            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);

            // The notifier uses the non-transacted storage proxy:
            var proxy = DIContext.Obtain <Func <IStorageProxyCache <ISiteModelChangeBufferQueueKey, ISiteModelChangeBufferQueueItem> > >()();

            proxy.Should().NotBeNull();

            // Check the new item was placed into the cache
            var testProxy = proxy as IStorageProxyCacheTransacted_TestHarness <ISiteModelChangeBufferQueueKey, ISiteModelChangeBufferQueueItem>;

            testProxy.GetPendingTransactedWrites().Count.Should().Be(1);
            var cachedItem = testProxy.GetPendingTransactedWrites().Values.First();

            cachedItem.Should().NotBeNull();
            cachedItem.ProjectUID.Should().Be(siteModel.ID);
            cachedItem.Operation.Should().Be(SiteModelChangeMapOperation.AddSpatialChanges);
            cachedItem.Origin.Should().Be(SiteModelChangeMapOrigin.Ingest);

            var readMap = new SubGridTreeSubGridExistenceBitMask();

            readMap.FromBytes(cachedItem.Content);

            readMap.CountBits().Should().Be(12);
            readMap.CountBits().Should().Be(siteModel.ExistenceMap.CountBits());
            readMap.ScanAllSetBitsAsSubGridAddresses(x => siteModel.ExistenceMap[x.X >> SubGridTreeConsts.SubGridIndexBitsPerLevel, x.Y >> SubGridTreeConsts.SubGridIndexBitsPerLevel].Should().BeTrue());
        }
Example #18
0
    private ISiteModel BuildModelForSingleCellCCA(byte ccaIncrement, byte targetCCA = CellPassConsts.NullCCATarget)
    {
      var baseTime = DateTime.UtcNow;
      byte baseCCA = 1;

      var siteModel = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
      var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

      if (targetCCA != CellPassConsts.NullCCATarget)
        siteModel.MachinesTargetValues[bulldozerMachineIndex].TargetCCAStateEvents.PutValueAtDate(VSS.TRex.Common.Consts.MIN_DATETIME_AS_UTC, targetCCA);

      var referenceDate = DateTime.UtcNow;
      var startReportPeriod1 = referenceDate.AddMinutes(-60);
      var endReportPeriod1 = referenceDate.AddMinutes(-30);

      siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(startReportPeriod1, ProductionEventType.StartEvent);
      siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(endReportPeriod1, ProductionEventType.EndEvent);
      siteModel.MachinesTargetValues[bulldozerMachineIndex].LayerIDStateEvents.PutValueAtDate(endReportPeriod1, LAYER_ID);

      var cellPasses = Enumerable.Range(0, 10).Select(x =>
        new CellPass
        {
          InternalSiteModelMachineIndex = bulldozerMachineIndex,
          Time = baseTime.AddMinutes(x),
          CCA = (byte)(baseCCA + x * ccaIncrement),
          PassType = PassType.Front
        }).ToArray();

      DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
        (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses, 1, cellPasses.Length);
      DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

      return siteModel;
    }
Example #19
0
        //[InlineData(0, 0, 25.540275049115913, 2.226588081204977, 72.2331368696791, 353.04240000000004)]
        public async Task Test_DetailedPassCountStatistics_SiteModelWithSingleTAGFile_FullExtents
            (ushort minTarget, ushort maxTarget, double percentBelow, double percentWithin, double percentAbove, double totalArea)
        {
            AddClusterComputeGridRouting();
            AddApplicationGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var operation = new PassCountStatisticsOperation();

            var arg = SimplePassCountStatisticsArgument(siteModel, minTarget, maxTarget);

            arg.PassCountDetailValues = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
            var passCountDetailResult = await operation.ExecuteAsync(arg);

            passCountDetailResult.Should().NotBeNull();

            // Checks counts and percentages
            long[] expectedCounts = { 755, 442, 663, 1038, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//      long[] expectedCounts = { 93, 687, 68, 385, 57, 598, 65, 986, 52, 63, 0, 0, 0, 0, 0 };
            long expectedCountsSum = 0;

            for (int i = 0; i < expectedCounts.Length; i++)
            {
                expectedCountsSum += (i + 1) * expectedCounts[i];
            }

            // Is sum of counts the same?
            long passCountDetailResultSum = 0;

            for (int i = 0; i < passCountDetailResult.Counts.Length; i++)
            {
                passCountDetailResultSum += (i + 1) * passCountDetailResult.Counts[i];
            }

            passCountDetailResultSum.Should().Be(expectedCountsSum);

            // Are all counts the same and do percentages match?

            long totalCount = passCountDetailResult.Counts.Sum();

            for (int i = 0; i < expectedCounts.Length; i++)
            {
                expectedCounts[i].Should().Be(passCountDetailResult.Counts[i]);
                passCountDetailResult.Percents[i].Should().BeApproximately(100.0 * expectedCounts[i] / (1.0 * totalCount), 0.001);
            }

            // Check summary related fields are zero
            passCountDetailResult.ResultStatus.Should().Be(RequestErrorStatus.OK);
            passCountDetailResult.ReturnCode.Should().Be(MissingTargetDataResultType.NoResult);
            passCountDetailResult.BelowTargetPercent.Should().BeApproximately(percentBelow, 0.001);
            passCountDetailResult.AboveTargetPercent.Should().BeApproximately(percentAbove, 0.001);
            passCountDetailResult.WithinTargetPercent.Should().BeApproximately(percentWithin, 0.001);
            passCountDetailResult.TotalAreaCoveredSqMeters.Should().BeApproximately(totalArea, 0.000001);
            passCountDetailResult.IsTargetPassCountConstant.Should().BeTrue();
        }
Example #20
0
        private ISiteModel BuildModelForSingleCellProgressiveVolume(int numCellPasses, DateTime baseTime, TimeSpan timeIncrement, float baseHeight, float heightIncrement)
        {
            var dummy = new ClientHeightLeafSubGrid(); // Ensure NullCells is intialised for this class,

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            var cellPasses = Enumerable.Range(0, numCellPasses).Select(x =>
                                                                       new CellPass {
                InternalSiteModelMachineIndex = bulldozerMachineIndex, Time = baseTime + x * timeIncrement, Height = baseHeight + x * heightIncrement, PassType = PassType.Front
            }).ToList();

            // Ensure the machine the cell passes are being added to has start and stop evens bracketing the cell passes
            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(baseTime, ProductionEventType.StartEvent);
            siteModel.MachinesTargetValues[bulldozerMachineIndex].StartEndRecordedDataEvents.PutValueAtDate(baseTime + (numCellPasses - 1) * timeIncrement, ProductionEventType.EndEvent);

            siteModel.MachinesTargetValues[bulldozerMachineIndex].SaveMachineEventsToPersistentStore(siteModel.PrimaryStorageProxy);

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses, 1, cellPasses.Count());

            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            return(siteModel);
        }
Example #21
0
        public async Task CalculateFromTAGFileDerivedModel_ShouldHaveNoPointValues()
        {
            var tagFiles  = Directory.GetFiles(Path.Combine("TestData", "TAGFiles", "ElevationMappingMode-KettlewellDrive"), "*.tag").ToArray();
            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out var processedTasks);

            // Ask for a point that does not exist in the model the response should be a row with null values (???)
            var executor = new ComputeStationOffsetReportExecutor_ClusterCompute
                               (new StationOffsetReportRequestArgument_ClusterCompute
            {
                ProjectID = siteModel.ID,
                Filters   = new FilterSet(new CombinedFilter()),
                Points    = new List <StationOffsetPoint> {
                    new StationOffsetPoint(0, 0, 0, 0)
                },
                ReportElevation = true
            });

            var result = await executor.ExecuteAsync();

            result.ResultStatus.Should().Be(RequestErrorStatus.OK);
            result.ReturnCode.Should().Be(ReportReturnCode.NoError);
            result.StationOffsetRows.Count.Should().Be(1);
            result.StationOffsetRows[0].Northing.Should().Be(0);
            result.StationOffsetRows[0].Easting.Should().Be(0);
            result.StationOffsetRows[0].Elevation.Should().Be(Consts.NullHeight);
        }
Example #22
0
        public async Task Test_DetailedMDPStatistics_SiteModelWithSingleTAGFile_FullExtents
            (short target, double minPercentage, double maxPercentage, double percentBelow, double percentWithin, double percentAbove)
        {
            AddClusterComputeGridRouting();
            AddApplicationGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile-MDP.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var operation = new MDPStatisticsOperation();

            var arg = SimpleMDPStatisticsArgument(siteModel, target, minPercentage, maxPercentage);

            arg.MDPDetailValues = new[] { 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500 };
            var mdpDetailResult = await operation.ExecuteAsync(arg);

            mdpDetailResult.Should().NotBeNull();

            // Checks counts and percentages
            long[] expectedCounts    = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 321, 400, 535, 6 };
            long   expectedCountsSum = 0;

            for (int i = 0; i < expectedCounts.Length; i++)
            {
                expectedCountsSum += (i + 1) * expectedCounts[i];
            }

            // Is sum of counts the same?
            long cmvDetailResultSum = 0;

            for (int i = 0; i < mdpDetailResult.Counts.Length; i++)
            {
                cmvDetailResultSum += (i + 1) * mdpDetailResult.Counts[i];
            }

            cmvDetailResultSum.Should().Be(expectedCountsSum);

            // Are all counts the same and do percentages match?
            long totalCount = mdpDetailResult.Counts.Sum();

            for (int i = 0; i < expectedCounts.Length; i++)
            {
                expectedCounts[i].Should().Be(mdpDetailResult.Counts[i]);
                mdpDetailResult.Percents[i].Should().BeApproximately(100.0 * expectedCounts[i] / (1.0 * totalCount), 0.001);
            }

            // Check summary related fields are zero
            mdpDetailResult.ResultStatus.Should().Be(RequestErrorStatus.OK);
            mdpDetailResult.ReturnCode.Should().Be(MissingTargetDataResultType.NoProblems);
            mdpDetailResult.BelowTargetPercent.Should().BeApproximately(percentBelow, 0.001);
            mdpDetailResult.AboveTargetPercent.Should().BeApproximately(percentAbove, 0.001);
            mdpDetailResult.WithinTargetPercent.Should().BeApproximately(percentWithin, 0.001);
            mdpDetailResult.TotalAreaCoveredSqMeters.Should().BeApproximately(1283 * SubGridTreeConsts.DefaultCellSize * SubGridTreeConsts.DefaultCellSize, 0.000001);
            mdpDetailResult.ConstantTargetMDP.Should().Be(MACHINE_TARGET_MDP);
            mdpDetailResult.IsTargetMDPConstant.Should().BeTrue();
        }
Example #23
0
        public async Task Test_TileRenderRequest_NoSubGridData_EmptyTile(DisplayMode displayMode)
        {
            // See BUG# 86870
            // Test setup: Setup some production data in different sub grids
            // Request a tile in a sub grid with no data
            // Tile should return quickly, with an empty tile (previously it would sit for 2 minutes to timeout, and return null).
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var  baseTime   = DateTime.UtcNow;
            var  baseHeight = 1.0f;
            byte baseCCA    = 1;
            byte baseCCV    = 0;

            var siteModel             = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var bulldozerMachineIndex = siteModel.Machines.Locate("Bulldozer", false).InternalSiteModelMachineIndex;

            siteModel.MachinesTargetValues[bulldozerMachineIndex].TargetCCAStateEvents.PutValueAtDate(VSS.TRex.Common.Consts.MIN_DATETIME_AS_UTC, 5);

            var cellPasses = Enumerable.Range(0, 10).Select(x =>
                                                            new CellPass
            {
                InternalSiteModelMachineIndex = bulldozerMachineIndex,
                Time     = baseTime.AddMinutes(x),
                Height   = baseHeight + x * HEIGHT_INCREMENT_0_5,
                CCA      = (byte)(baseCCA + x),
                CCV      = (short)(baseCCV + x * CCV_INCREMENT),
                PassType = PassType.Front
            }).ToArray();

            // And offset to make sure we span multiple sub grids (if the tile request is in the same sub grid, even if empty, the bug was not applicable)
            const int offset = (2 * SubGridTreeConsts.CellsPerSubGrid) + 1;

            // Create some cell passes in 4 corners, but in separate sub grids
            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset + offset, SubGridTreeConsts.DefaultIndexOriginOffset + offset, cellPasses);
            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset + offset, SubGridTreeConsts.DefaultIndexOriginOffset - offset, cellPasses);
            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset - offset, SubGridTreeConsts.DefaultIndexOriginOffset - offset, cellPasses);
            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset - offset, SubGridTreeConsts.DefaultIndexOriginOffset + offset, cellPasses);
            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            // Now if we get a single cell pass in the center, which has no data we should get an empty tile (not a null tile)
            var tileExtents = siteModel.Grid.GetCellExtents(SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset);

            var request = new TileRenderRequest();
            var arg     = new TileRenderRequestArgument(siteModel.ID, displayMode, null, tileExtents, true, 256, 256, new FilterSet(new CombinedFilter(), new CombinedFilter()), new DesignOffset(), VolumeComputationType.None);

            var startTime = DateTime.UtcNow;
            var response  = await request.ExecuteAsync(arg);

            var duration = (DateTime.UtcNow - startTime).TotalMilliseconds;

            // 30 seconds should be ample time, even on a slow computer - but well under the 2 minute timeout which is enforced by the pipeline processor.
            duration.Should().BeLessThan(30 * 1000, "Empty tile should return quickly - see BUG# 86870");

            // And the tile should NOT be null
            CheckSimpleRenderTileResponse(response, displayMode);

            //      File.WriteAllBytes($@"c:\temp\TRexTileRender-Unit-Test-{displayMode}.bmp", ((TileRenderResponse) response).TileBitmapData);
        }
Example #24
0
        public void MasksOutValues_WithoutSurveyedSurfaces()
        {
            SetupTestIgniteRouting();

            var(siteModel, filter) = CreateSiteModelWithSimpleDesign();

            // Create a sub grid at the Northwest origin so that it covers the small TIN design surrounding the
            // [CellSize / 2, CellSize / 2] point

            var baseTime   = DateTime.UtcNow;
            var cellPasses = new CellPass[32, 32][];

            SubGridUtilities.SubGridDimensionalIterator((x, y) =>
            {
                cellPasses[x, y] = Enumerable.Range(0, 1).Select(p =>
                                                                 new CellPass
                {
                    Height = 1.0f,
                    InternalSiteModelMachineIndex = siteModel.Machines[0].InternalSiteModelMachineIndex,
                    Time     = baseTime.AddMinutes(p),
                    PassType = PassType.Front
                }).ToArray();
            });

            DITAGFileAndSubGridRequestsFixture.AddSingleSubGridWithPasses(siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            // Construct a requestor and ask it to retrieve the sub grid from the site model, using the filter
            // with the surface design mask

            var utilities  = DIContext.Obtain <IRequestorUtilities>();
            var requestors = utilities.ConstructRequestors(null, siteModel,
                                                           new OverrideParameters(),
                                                           new LiftParameters(),
                                                           utilities.ConstructRequestorIntermediaries(siteModel,
                                                                                                      new FilterSet(filter), false, GridDataType.Height),
                                                           AreaControlSet.CreateAreaControlSet(),
                                                           siteModel.ExistenceMap);

            requestors.Length.Should().Be(1);

            var response = requestors[0].RequestSubGridInternal
                               (new SubGridCellAddress(SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset),
                               true, false);

            response.requestResult.Should().Be(ServerRequestResult.NoError);
            response.clientGrid.Should().NotBeNull();

            // Ensure the filtered cell has data
            response.clientGrid.FilterMap[0, 0].Should().BeTrue();
            (response.clientGrid as IClientHeightLeafSubGrid).Cells[0, 0].Should().Be(1.0f);

            // Ensure no other cells have data
            response.clientGrid.FilterMap.CountBits().Should().Be(1);
            var subGrid = response.clientGrid as IClientHeightLeafSubGrid;
            var count   = 0;

            subGrid.ForEach((x, y) => count += subGrid.Cells[x, y] == 1.0f ? 1 : 0);
            count.Should().Be(1);
        }
Example #25
0
        public async Task CSVExportRequest_Execute_SingleCellSinglePass_CellProfileAllPasses()
        {
            AddApplicationGridRouting();
            AddClusterComputeGridRouting();

            var tempFileName = MockS3FileTransfer_UploadToBucket();
            var siteModel    = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var request      = new CSVExportRequest();

            var baseDate   = DateTime.SpecifyKind(new DateTime(2000, 1, 1, 1, 0, 0, 0), DateTimeKind.Utc);
            var cellPasses = new[] { new CellPass {
                                         Time = baseDate, Height = 1.0f
                                     } };

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses(siteModel,
                                                                       SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            var invalidatedStreams = new List <ISubGridSpatialAffinityKey>();

            siteModel.ExistenceMap.ScanAllSubGrids(leaf =>
            {
                if (leaf is IServerLeafSubGrid serverLeaf)
                {
                    (serverLeaf.Owner as ServerSubGridTree).SaveLeafSubGrid(serverLeaf, siteModel.PrimaryStorageProxy, siteModel.PrimaryStorageProxy, invalidatedStreams);
                }

                return(true);
            });

            siteModel.PrimaryStorageProxy.Commit();

            DITAGFileAndSubGridRequestsFixture.ConvertSiteModelToImmutable(siteModel);

            var response = await request.ExecuteAsync(SimpleCSVExportRequestArgument(siteModel.ID, OutputTypes.PassCountAllPasses));

            response.Should().NotBeNull();
            response.ResultStatus.Should().Be(RequestErrorStatus.OK);

            // Read back the zip file
            using (var archive = ZipFile.Open(tempFileName, ZipArchiveMode.Read))
            {
                var extractedFileName = tempFileName.Remove(tempFileName.Length - 4) + ".csv";
                archive.Entries[0].ExtractToFile(extractedFileName);

                var lines = File.ReadAllLines(extractedFileName);
                lines.Length.Should().Be(2);
                lines[0].Should()
                .Be(
                    "Time,CellN,CellE,Elevation,PassNumber,LastRadioLtncy,DesignName,Machine,Speed,LastGPSMode,GPSAccTol,TargPassCount,ValidPos,Lift,LastCMV,TargCMV,LastMDP,TargMDP,LastRMV,LastFreq,LastAmp,TargThickness,MachineGear,VibeState,LastTemp");
                lines[1].Should()
                .Be(
                    @"2000/Jan/01 01:00:00.000,0.170m,0.170m,1.000m,1,0,?,""Unknown"",0.0km/h,Old Position,?,?,0,1,?,?,0.0,?,?,?,?,?,?,?,0.0°C");
            }

            CleanupMockedFile(tempFileName, siteModel.ID);
        }
Example #26
0
        public async Task Test_CMVChangeStatisticsRequest_SiteModelWithMultipleCells_FullExtents()
        {
            const double TOLERANCE               = 0.000001;
            const short  NUMBER_OF_CELLS         = 2165;
            const short  NUMBER_OF_CELLS_SCANNED = 2165;

            double[] expectedPercentages =
            {
                2.3094688221709005,
                11.36258660508083,
                28.175519630484992,
                25.496535796766747,
                12.979214780600461,
                5.3579676674364896,
                14.318706697459586
            };

            int[] expectedCounts = { 50, 246, 610, 552, 281, 116, 310 };

            AddClusterComputeGridRouting();
            AddApplicationGridRouting();

            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            var siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var operation = new CMVChangeStatisticsOperation();

            var cmvChangeStatisticsResult = await operation.ExecuteAsync(SimpleCMVChangeStatisticsArgument(siteModel, new[] { -50.0, -20.0, -10.0, 0.0, 10.0, 20.0, 50.0 }));

            cmvChangeStatisticsResult.Should().NotBeNull();
            cmvChangeStatisticsResult.ResultStatus.Should().Be(RequestErrorStatus.OK);
            cmvChangeStatisticsResult.BelowTargetPercent.Should().Be(0);
            cmvChangeStatisticsResult.AboveTargetPercent.Should().Be(0);
            cmvChangeStatisticsResult.WithinTargetPercent.Should().Be(0);
            cmvChangeStatisticsResult.TotalAreaCoveredSqMeters.Should().BeApproximately(NUMBER_OF_CELLS_SCANNED * SubGridTreeConsts.DefaultCellSize * SubGridTreeConsts.DefaultCellSize, TOLERANCE);
            cmvChangeStatisticsResult.Counts.Should().NotBeNull();
            cmvChangeStatisticsResult.Counts.Length.Should().Be(LENGTH);
            cmvChangeStatisticsResult.Counts.Sum().Should().Be(NUMBER_OF_CELLS);

            for (var i = 0; i < cmvChangeStatisticsResult.Counts.Length; i++)
            {
                cmvChangeStatisticsResult.Counts[i].Should().Be(expectedCounts[i]);
            }

            cmvChangeStatisticsResult.Percents.Should().NotBeNull();
            cmvChangeStatisticsResult.Percents.Length.Should().Be(LENGTH);

            for (var i = 0; i < cmvChangeStatisticsResult.Percents.Length; i++)
            {
                cmvChangeStatisticsResult.Percents[i].Should().BeApproximately(expectedPercentages[i], TOLERANCE);
            }
        }
Example #27
0
        private void SetupTest()
        {
            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile-QMesh.tag"),
            };

            siteModel = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _);
            var boundary = new List <Fence>()
            {
                new Fence()
            };

            boundary[0].Points.Add(new FencePoint(2700.20170260547, 1225.08445683629, 0.0));
            boundary[0].Points.Add(new FencePoint(2700.16517351542, 1224.38744027628, 0.0));
            boundary[0].Points.Add(new FencePoint(2700.10136538994, 1223.16990871245, 0.0));
            boundary[0].Points.Add(new FencePoint(2889.7599542129, 1178.36648123432, 0.0));

            // Mocked ConvertCoordinates expected result.
            var neeCoords = new XYZ[boundary[0].Points.Count];

            // mock tile boundary within model extents
            //WS
            neeCoords[0].X = Math.Round(2847.26, DECIMALS);
            neeCoords[0].Y = Math.Round(1219.93, DECIMALS);
            //EN
            neeCoords[1].X = Math.Round(2879.11, DECIMALS);
            neeCoords[1].Y = Math.Round(1276.37, DECIMALS);
            //WN
            neeCoords[2].X = Math.Round(2847.26, DECIMALS);
            neeCoords[2].Y = Math.Round(1276.37, DECIMALS);
            // ES
            neeCoords[3].X = Math.Round(2879.11, DECIMALS);
            neeCoords[3].Y = Math.Round(1219.93, DECIMALS);

            var llhCoords = new XYZ[2500];

            for (int i = 0; i < 2500; i++)
            {
                llhCoords[i].X = Math.Round(2847.26 + i, DECIMALS);
                llhCoords[i].Y = Math.Round(1219.93 + i, DECIMALS);
            }

            var expectedCoordinateConversionResult  = neeCoords.ToCoreX_XYZ();
            var expectedCoordinateConversionResult2 = llhCoords.ToCoreX_XYZ();

            // LL to NEE
            var convertCoordinatesMock = new Mock <ICoreXWrapper>();

            convertCoordinatesMock.Setup(x => x.LLHToNEE(It.IsAny <string>(), It.IsAny <CoreXModels.XYZ[]>(), CoreX.Types.InputAs.Radians)).Returns(expectedCoordinateConversionResult);
            convertCoordinatesMock.Setup(x => x.NEEToLLH(It.IsAny <string>(), It.IsAny <CoreXModels.XYZ[]>(), CoreX.Types.ReturnAs.Radians)).Returns(expectedCoordinateConversionResult2);
            DIBuilder.Continue().Add(x => x.AddSingleton(convertCoordinatesMock.Object)).Complete();

            filter = new FilterSet(new CombinedFilter());
        }
Example #28
0
        public void Test_TAGFile_DropSiteModel_WithImmutableRepresentation()
        {
            var tagFiles = new[]
            {
                Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"),
            };

            // Build the model, assess the contents, then drop the model and verify the contents are the same when
            // re-read from the persistence layer
            var siteModel  = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _, true, true);
            var siteModel2 = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _, true, false);

            CompareSiteModels(siteModel, siteModel2, 12, 16525, 3054);
        }
Example #29
0
        public void DeleteModel_WithTagFile(DeleteSiteModelSelectivity selectivity)
        {
            var tagFiles = new[] { Path.Combine(TestHelper.CommonTestDataPath, "TestTAGFile.tag"), };

            AddApplicationGridRouting();

            var model = DITAGFileAndSubGridRequestsFixture.BuildModel(tagFiles, out _, true, false);

            model.Should().NotBeNull();

            SaveAndVerifyNotEmpty(model);

            DeleteTheModel(ref model, selectivity, selectivity == DeleteSiteModelSelectivity.All);
        }
Example #30
0
        public void BuildLiftsForMultiplePassCell(float height1, float height2, float height3, float first, float last, float lowest, float heighest)
        {
            var siteModel  = DITAGFileAndSubGridRequestsWithIgniteFixture.NewEmptyModel();
            var baseTime   = DateTime.UtcNow;
            var cellPasses = new[]
            {
                new CellPass
                {
                    Time   = baseTime,
                    Height = height1
                },
                new CellPass
                {
                    Time   = baseTime.AddHours(1),
                    Height = height2
                },
                new CellPass
                {
                    Time   = baseTime.AddHours(2),
                    Height = height3
                }
            };

            DITAGFileAndSubGridRequestsFixture.AddSingleCellWithPasses
                (siteModel, SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset, cellPasses);

            IClientLeafSubGrid clientGrid = ClientLeafSubGridFactoryFactory.CreateClientSubGridFactory().GetSubGrid(GridDataType.Height) as ClientHeightLeafSubGrid;

            var serverGrid = TRex.SubGridTrees.Server.Utilities.SubGridUtilities.LocateSubGridContaining(
                siteModel.PrimaryStorageProxy, siteModel.Grid,
                SubGridTreeConsts.DefaultIndexOriginOffset, SubGridTreeConsts.DefaultIndexOriginOffset,
                siteModel.Grid.NumLevels, false, false) as IServerLeafSubGrid;

            var builder = new CellLiftBuilder(siteModel, GridDataType.Height, new FilteredValuePopulationControl(),
                                              new FilterSet(new CombinedFilter()), new CellPassFastEventLookerUpper(siteModel));

            var cell = new ProfileCell();

            var segmentIterator  = new SubGridSegmentIterator(serverGrid, serverGrid.Directory, siteModel.PrimaryStorageProxy);
            var cellPassIterator = new SubGridSegmentCellPassIterator_NonStatic(segmentIterator);

            builder.Build(cell, new LiftParameters(), clientGrid, new FilteredValueAssignmentContext(), cellPassIterator, false).Should().BeTrue();

            cell.Layers.Count().Should().Be(1);
            cell.Layers[0].PassCount.Should().Be(3);
            cell.Layers[0].MinimumPassHeight.Should().Be(lowest);
            cell.Layers[0].MaximumPassHeight.Should().Be(heighest);
            cell.Layers[0].FirstPassHeight.Should().Be(first);
            cell.Layers[0].LastPassHeight.Should().Be(last);
        }