/// <summary> /// Gets the value for the initial failure mechanism result per failure mechanism section as a probability. /// </summary> /// <param name="sectionResult">The section result to get the initial failure mechanism result probability for.</param> /// <param name="calculationScenarios">All semi probabilistic calculation scenarios in the failure mechanism.</param> /// <param name="norm">The norm to assess for.</param> /// <returns>The calculated initial failure mechanism result probability; or <see cref="double.NaN"/> when there /// are no relevant calculations, when not all relevant calculations are performed or when the /// contributions of the relevant calculations don't add up to 1.</returns> /// <exception cref="ArgumentNullException">Thrown when any parameter is <c>null</c>.</exception> public static double GetInitialFailureMechanismResultProbability(this AdoptableWithProfileProbabilityFailureMechanismSectionResult sectionResult, IEnumerable <SemiProbabilisticPipingCalculationScenario> calculationScenarios, double norm) { if (sectionResult == null) { throw new ArgumentNullException(nameof(sectionResult)); } if (calculationScenarios == null) { throw new ArgumentNullException(nameof(calculationScenarios)); } SemiProbabilisticPipingCalculationScenario[] relevantScenarios = sectionResult.GetRelevantCalculationScenarios <SemiProbabilisticPipingCalculationScenario>( calculationScenarios, (scenario, lineSegments) => scenario.IsSurfaceLineIntersectionWithReferenceLineInSection(lineSegments)) .ToArray(); if (!CalculationScenarioHelper.ScenariosAreValid(relevantScenarios)) { return(double.NaN); } double totalInitialFailureMechanismResult = 0; foreach (SemiProbabilisticPipingCalculationScenario scenario in relevantScenarios) { DerivedSemiProbabilisticPipingOutput derivedOutput = DerivedSemiProbabilisticPipingOutputFactory.Create(scenario.Output, norm); totalInitialFailureMechanismResult += derivedOutput.PipingProbability * (double)scenario.Contribution; } return(totalInitialFailureMechanismResult); }
/// <summary> /// Gets the value for the initial failure mechanism result per failure mechanism section as a probability. /// </summary> /// <param name="sectionResult">The section result to get the initial failure mechanism result probability for.</param> /// <param name="calculationScenarios">All probabilistic calculation scenarios in the failure mechanism.</param> /// <returns>The calculated initial failure mechanism result probability; or <see cref="double.NaN"/> when there /// are no relevant calculations, when not all relevant calculations are performed or when the /// contributions of the relevant calculations don't add up to 1.</returns> /// <exception cref="ArgumentNullException">Thrown when any parameter is <c>null</c>.</exception> public static double GetInitialFailureMechanismResultProbability(this AdoptableWithProfileProbabilityFailureMechanismSectionResult sectionResult, IEnumerable <GrassCoverErosionInwardsCalculationScenario> calculationScenarios) { if (sectionResult == null) { throw new ArgumentNullException(nameof(sectionResult)); } if (calculationScenarios == null) { throw new ArgumentNullException(nameof(calculationScenarios)); } GrassCoverErosionInwardsCalculationScenario[] relevantScenarios = sectionResult.GetRelevantCalculationScenarios <GrassCoverErosionInwardsCalculationScenario>( calculationScenarios, (scenario, lineSegments) => scenario.IsDikeProfileIntersectionWithReferenceLineInSection(lineSegments)) .ToArray(); if (!CalculationScenarioHelper.ScenariosAreValid(relevantScenarios)) { return(double.NaN); } double totalInitialFailureMechanismResult = 0; foreach (GrassCoverErosionInwardsCalculationScenario scenario in relevantScenarios) { ProbabilityAssessmentOutput derivedOutput = ProbabilityAssessmentOutputFactory.Create(scenario.Output.OvertoppingOutput.Reliability); totalInitialFailureMechanismResult += derivedOutput.Probability * (double)scenario.Contribution; } return(totalInitialFailureMechanismResult); }
/// <summary> /// Gets the value for the initial failure mechanism result per failure mechanism section as a probability. /// </summary> /// <param name="sectionResult">The section result to get the initial failure mechanism result probability for.</param> /// <param name="calculationScenarios">All probabilistic calculation scenarios in the failure mechanism.</param> /// <param name="getOutputFunc">The function to get the output from a calculation scenario.</param> /// <returns>The calculated initial failure mechanism result probability; or <see cref="double.NaN"/> when there /// are no relevant calculations, when not all relevant calculations are performed or when the /// contributions of the relevant calculations don't add up to 1.</returns> /// <exception cref="ArgumentNullException">Thrown when any parameter is <c>null</c>.</exception> public static double GetInitialFailureMechanismResultProbability(this AdoptableWithProfileProbabilityFailureMechanismSectionResult sectionResult, IEnumerable <ProbabilisticPipingCalculationScenario> calculationScenarios, Func <ProbabilisticPipingCalculationScenario, IPartialProbabilisticPipingOutput> getOutputFunc) { if (sectionResult == null) { throw new ArgumentNullException(nameof(sectionResult)); } if (calculationScenarios == null) { throw new ArgumentNullException(nameof(calculationScenarios)); } if (getOutputFunc == null) { throw new ArgumentNullException(nameof(getOutputFunc)); } ProbabilisticPipingCalculationScenario[] relevantScenarios = sectionResult.GetRelevantCalculationScenarios <ProbabilisticPipingCalculationScenario>( calculationScenarios, (scenario, lineSegments) => scenario.IsSurfaceLineIntersectionWithReferenceLineInSection(lineSegments)) .ToArray(); return(CalculationScenarioHelper.ScenariosAreValid(relevantScenarios) ? relevantScenarios.Sum(scenario => StatisticsConverter.ReliabilityToProbability(getOutputFunc(scenario).Reliability) * (double)scenario.Contribution) : double.NaN); }
public void GivenCalculationsViewGenerateCalculationsButtonClicked_WhenDikeProfileSelectedAndDialogClosed_ThenUpdateSectionResultScenarios() { // Given var mocks = new MockRepository(); var assessmentSection = mocks.Stub <IAssessmentSection>(); assessmentSection.Stub(section => section.FailureMechanismContribution).Return(new FailureMechanismContribution(0.01, 0.001)); ConfigureHydraulicBoundaryDatabase(assessmentSection); mocks.ReplayAll(); GrassCoverErosionInwardsFailureMechanism failureMechanism = ConfigureFailureMechanism(); ShowCalculationsView(failureMechanism.CalculationsGroup, failureMechanism, assessmentSection); var button = new ButtonTester("generateButton", testForm); DialogBoxHandler = (name, wnd) => { var selectionDialog = (GrassCoverErosionInwardsDikeProfileSelectionDialog) new FormTester(name).TheObject; var selectionView = (DataGridViewControl) new ControlTester("DataGridViewControl", selectionDialog).TheObject; selectionView.Rows[0].Cells[0].Value = true; // When new ButtonTester("DoForSelectedButton", selectionDialog).Click(); }; button.Click(); // Then GrassCoverErosionInwardsCalculationScenario[] calculationScenarios = failureMechanism.Calculations.OfType <GrassCoverErosionInwardsCalculationScenario>().ToArray(); AdoptableWithProfileProbabilityFailureMechanismSectionResult failureMechanismSectionResult1 = failureMechanism.SectionResults.First(); AdoptableWithProfileProbabilityFailureMechanismSectionResult failureMechanismSectionResult2 = failureMechanism.SectionResults.ElementAt(1); Func <GrassCoverErosionInwardsCalculationScenario, IEnumerable <Segment2D>, bool> intersectionFunc = (scenario, lineSegments) => scenario.IsDikeProfileIntersectionWithReferenceLineInSection(lineSegments); Assert.AreEqual(1, failureMechanismSectionResult1.GetRelevantCalculationScenarios(calculationScenarios, intersectionFunc).Count()); CollectionAssert.IsEmpty(failureMechanismSectionResult2.GetRelevantCalculationScenarios(calculationScenarios, intersectionFunc)); mocks.VerifyAll(); }