Index: Riskeer/Common/src/Riskeer.Common.Data/AssemblyTool/FailureMechanismSectionAssemblyGroupFactory.cs =================================================================== diff -u -r1630d6c8d176e19206db5bdd3622809d498aa127 -r5c4a6ebf810153f46422f536305920b3ce360922 --- Riskeer/Common/src/Riskeer.Common.Data/AssemblyTool/FailureMechanismSectionAssemblyGroupFactory.cs (.../FailureMechanismSectionAssemblyGroupFactory.cs) (revision 1630d6c8d176e19206db5bdd3622809d498aa127) +++ Riskeer/Common/src/Riskeer.Common.Data/AssemblyTool/FailureMechanismSectionAssemblyGroupFactory.cs (.../FailureMechanismSectionAssemblyGroupFactory.cs) (revision 5c4a6ebf810153f46422f536305920b3ce360922) @@ -48,35 +48,54 @@ /// The indicator whether the section needs further analysis. /// The refined probability for the profile. /// The refined probability for the section. - /// Thrown when is null. - /// Thrown when is invalid. + /// The of the section. + /// The to get the N of the section. + /// Thrown when + /// or is null. + /// Thrown when + /// or is invalid. /// Thrown when the section could not be successfully assembled. - public static FailureMechanismSectionAssemblyResult AssembleSection(IAssessmentSection assessmentSection, - bool isRelevant, InitialFailureMechanismResultType initialFailureMechanismResultType, - double initialProfileProbability, double initialSectionProbability, - bool furtherAnalysisNeeded, - double refinedProfileProbability, double refinedSectionProbability) + public static FailureMechanismSectionAssemblyResult AssembleSection( + IAssessmentSection assessmentSection, + bool isRelevant, InitialFailureMechanismResultType initialFailureMechanismResultType, + double initialProfileProbability, double initialSectionProbability, + bool furtherAnalysisNeeded, + double refinedProfileProbability, double refinedSectionProbability, + ProbabilityRefinementType probabilityRefinementType, Func getNFunc) { if (assessmentSection == null) { throw new ArgumentNullException(nameof(assessmentSection)); } + if (getNFunc == null) + { + throw new ArgumentNullException(nameof(getNFunc)); + } + if (!Enum.IsDefined(typeof(InitialFailureMechanismResultType), initialFailureMechanismResultType)) { throw new InvalidEnumArgumentException(nameof(initialFailureMechanismResultType), (int) initialFailureMechanismResultType, typeof(InitialFailureMechanismResultType)); } + if (!Enum.IsDefined(typeof(ProbabilityRefinementType), probabilityRefinementType)) + { + throw new InvalidEnumArgumentException(nameof(probabilityRefinementType), + (int) probabilityRefinementType, + typeof(ProbabilityRefinementType)); + } + IFailureMechanismSectionAssemblyCalculator calculator = AssemblyToolCalculatorFactory.Instance.CreateFailureMechanismSectionAssemblyCalculator( AssemblyToolKernelFactory.Instance); try { FailureMechanismSectionAssemblyInput input = CreateInput( - assessmentSection, isRelevant, initialFailureMechanismResultType != InitialFailureMechanismResultType.NoFailureProbability, - initialProfileProbability, initialSectionProbability, furtherAnalysisNeeded, refinedProfileProbability, refinedSectionProbability); + assessmentSection, isRelevant, initialFailureMechanismResultType, + initialProfileProbability, initialSectionProbability, furtherAnalysisNeeded, + refinedProfileProbability, refinedSectionProbability, probabilityRefinementType, getNFunc); return calculator.AssembleFailureMechanismSection(input); } @@ -87,17 +106,31 @@ } private static FailureMechanismSectionAssemblyInput CreateInput(IAssessmentSection assessmentSection, - bool isRelevant, bool hasProbabilitySpecified, + bool isRelevant, InitialFailureMechanismResultType initialFailureMechanismResultType, double initialProfileProbability, double initialSectionProbability, bool furtherAnalysisNeeded, - double refinedProfileProbability, double refinedSectionProbability) + double refinedProfileProbability, double refinedSectionProbability, + ProbabilityRefinementType probabilityRefinementType, Func getNFunc) { FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; - return new FailureMechanismSectionAssemblyInput(failureMechanismContribution.LowerLimitNorm, failureMechanismContribution.SignalingNorm, - isRelevant, hasProbabilitySpecified, - initialProfileProbability, initialSectionProbability, - furtherAnalysisNeeded, - refinedProfileProbability, refinedSectionProbability); + bool hasProbabilitySpecified = initialFailureMechanismResultType != InitialFailureMechanismResultType.NoFailureProbability; + + double sectionN = getNFunc(); + + if (probabilityRefinementType == ProbabilityRefinementType.Profile) + { + refinedSectionProbability = refinedProfileProbability * sectionN; + } + + if (probabilityRefinementType == ProbabilityRefinementType.Section) + { + refinedProfileProbability = refinedSectionProbability / sectionN; + } + + return new FailureMechanismSectionAssemblyInput( + failureMechanismContribution.LowerLimitNorm, failureMechanismContribution.SignalingNorm, + isRelevant, hasProbabilitySpecified, initialProfileProbability, initialSectionProbability, + furtherAnalysisNeeded, refinedProfileProbability, refinedSectionProbability); } } } \ No newline at end of file Index: Riskeer/Common/test/Riskeer.Common.Data.Test/AssemblyTool/FailureMechanismSectionAssemblyGroupFactoryTest.cs =================================================================== diff -u -r1630d6c8d176e19206db5bdd3622809d498aa127 -r5c4a6ebf810153f46422f536305920b3ce360922 --- Riskeer/Common/test/Riskeer.Common.Data.Test/AssemblyTool/FailureMechanismSectionAssemblyGroupFactoryTest.cs (.../FailureMechanismSectionAssemblyGroupFactoryTest.cs) (revision 1630d6c8d176e19206db5bdd3622809d498aa127) +++ Riskeer/Common/test/Riskeer.Common.Data.Test/AssemblyTool/FailureMechanismSectionAssemblyGroupFactoryTest.cs (.../FailureMechanismSectionAssemblyGroupFactoryTest.cs) (revision 5c4a6ebf810153f46422f536305920b3ce360922) @@ -48,40 +48,70 @@ // Call void Call() => FailureMechanismSectionAssemblyGroupFactory.AssembleSection( null, random.NextBoolean(), random.NextEnumValue(), random.NextDouble(), - random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble()); + random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble(), + random.NextEnumValue(), () => double.NaN); // Assert var exception = Assert.Throws(Call); Assert.AreEqual("assessmentSection", exception.ParamName); } [Test] - public void AssembleSection_InvalidInitialFailureMechanismResultType_ThrowsInvalidEnumArgumentException() + public void AssembleSection_GetNFuncNull_ThrowsArgumentNullException() { // Setup var random = new Random(21); - bool isRelevant = random.NextBoolean(); - double profileProbability = random.NextDouble(); - double sectionProbability = random.NextDouble(); - bool furtherAnalysisNeeded = random.NextBoolean(); - double refinedProfileProbability = random.NextDouble(); - double refinedSectionProbability = random.NextDouble(); - var assessmentSection = new AssessmentSectionStub(); + // Call + void Call() => FailureMechanismSectionAssemblyGroupFactory.AssembleSection( + new AssessmentSectionStub(), random.NextBoolean(), random.NextEnumValue(), + random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble(), + random.NextEnumValue(), null); + // Assert + var exception = Assert.Throws(Call); + Assert.AreEqual("getNFunc", exception.ParamName); + } + + [Test] + public void AssembleSection_InvalidInitialFailureMechanismResultType_ThrowsInvalidEnumArgumentException() + { + // Setup + var random = new Random(21); + const InitialFailureMechanismResultType initialFailureMechanismResultType = (InitialFailureMechanismResultType) 99; // Call void Call() => FailureMechanismSectionAssemblyGroupFactory.AssembleSection( - assessmentSection, isRelevant, initialFailureMechanismResultType, profileProbability, sectionProbability, - furtherAnalysisNeeded, refinedProfileProbability, refinedSectionProbability); + new AssessmentSectionStub(), random.NextBoolean(), initialFailureMechanismResultType, + random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble(), + random.NextEnumValue(), () => double.NaN); // Assert var expectedMessage = $"The value of argument 'initialFailureMechanismResultType' ({initialFailureMechanismResultType}) is invalid for Enum type '{nameof(InitialFailureMechanismResultType)}'."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(Call, expectedMessage); } [Test] + public void AssembleSection_InvalidProbabilityRefinementType_ThrowsInvalidEnumArgumentException() + { + // Setup + var random = new Random(21); + + const ProbabilityRefinementType probabilityRefinementType = (ProbabilityRefinementType) 99; + + // Call + void Call() => FailureMechanismSectionAssemblyGroupFactory.AssembleSection( + new AssessmentSectionStub(), random.NextBoolean(), random.NextEnumValue(), + random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble(), + probabilityRefinementType, () => double.NaN); + + // Assert + var expectedMessage = $"The value of argument 'probabilityRefinementType' ({probabilityRefinementType}) is invalid for Enum type '{nameof(ProbabilityRefinementType)}'."; + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(Call, expectedMessage); + } + + [Test] [TestCase(InitialFailureMechanismResultType.Adopt, true)] [TestCase(InitialFailureMechanismResultType.Manual, true)] [TestCase(InitialFailureMechanismResultType.NoFailureProbability, false)] @@ -107,7 +137,8 @@ // Call FailureMechanismSectionAssemblyGroupFactory.AssembleSection( assessmentSection, isRelevant, initialFailureMechanismResultType, profileProbability, sectionProbability, - furtherAnalysisNeeded, refinedProfileProbability, refinedSectionProbability); + furtherAnalysisNeeded, refinedProfileProbability, refinedSectionProbability, + ProbabilityRefinementType.Both, () => 1.0); // Assert FailureMechanismSectionAssemblyInput calculatorInput = calculator.FailureMechanismSectionAssemblyInput; @@ -126,6 +157,37 @@ } [Test] + [TestCase(ProbabilityRefinementType.Both, 1.5, 1.6)] + [TestCase(ProbabilityRefinementType.Profile, 1.5, 3.0)] + [TestCase(ProbabilityRefinementType.Section, 0.8, 1.6)] + public void AssembleSection_WithRefinedProbabilities_SetsInputOnCalculator( + ProbabilityRefinementType probabilityRefinementType, double expectedRefinedProfileProbability, double expectedRefinedSectionProbability) + { + // Setup + var random = new Random(21); + const double refinedProfileProbability = 1.5; + const double refinedSectionProbability = 1.6; + + using (new AssemblyToolCalculatorFactoryConfig()) + { + var calculatorFactory = (TestAssemblyToolCalculatorFactory) AssemblyToolCalculatorFactory.Instance; + FailureMechanismSectionAssemblyCalculatorStub calculator = calculatorFactory.LastCreatedFailureMechanismSectionAssemblyCalculator; + + // Call + FailureMechanismSectionAssemblyGroupFactory.AssembleSection( + new AssessmentSectionStub(), random.NextBoolean(), random.NextEnumValue(), + random.NextDouble(), random.NextDouble(), random.NextBoolean(), refinedProfileProbability, refinedSectionProbability, + probabilityRefinementType, () => 2.0); + + // Assert + FailureMechanismSectionAssemblyInput calculatorInput = calculator.FailureMechanismSectionAssemblyInput; + + Assert.AreEqual(expectedRefinedProfileProbability, calculatorInput.RefinedProfileProbability); + Assert.AreEqual(expectedRefinedSectionProbability, calculatorInput.RefinedSectionProbability); + } + } + + [Test] public void AssembleSection_CalculatorRan_ReturnsOutput() { // Setup @@ -139,7 +201,8 @@ FailureMechanismSectionAssemblyResult output = FailureMechanismSectionAssemblyGroupFactory.AssembleSection( new AssessmentSectionStub(), random.NextBoolean(), random.NextEnumValue(), - random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble()); + random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble(), + random.NextEnumValue(), () => 1.0); // Assert FailureMechanismSectionAssemblyResult calculatorOutput = calculator.FailureMechanismSectionAssemblyResultOutput; @@ -164,7 +227,8 @@ // Call void Call() => FailureMechanismSectionAssemblyGroupFactory.AssembleSection( new AssessmentSectionStub(), random.NextBoolean(), random.NextEnumValue(), - random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble()); + random.NextDouble(), random.NextDouble(), random.NextBoolean(), random.NextDouble(), random.NextDouble(), + random.NextEnumValue(), () => double.NaN); // Assert var exception = Assert.Throws(Call); Index: Riskeer/Piping/src/Riskeer.Piping.Forms/Views/PipingFailureMechanismSectionResultRow.cs =================================================================== diff -u -r86a463ce6ccc8ea8e152f909503824a77d3b3942 -r5c4a6ebf810153f46422f536305920b3ce360922 --- Riskeer/Piping/src/Riskeer.Piping.Forms/Views/PipingFailureMechanismSectionResultRow.cs (.../PipingFailureMechanismSectionResultRow.cs) (revision 86a463ce6ccc8ea8e152f909503824a77d3b3942) +++ Riskeer/Piping/src/Riskeer.Piping.Forms/Views/PipingFailureMechanismSectionResultRow.cs (.../PipingFailureMechanismSectionResultRow.cs) (revision 5c4a6ebf810153f46422f536305920b3ce360922) @@ -286,7 +286,7 @@ calculateProbabilityStrategy.CalculateSectionProbability); } } - + private void UpdateDerivedData() { ResetErrorTexts(); @@ -305,25 +305,13 @@ private void TryGetAssemblyResult() { - double refinedProfileProbability = SectionResult.RefinedProfileProbability; - double refinedSectionProbability = SectionResult.RefinedSectionProbability; - double sectionN = failureMechanism.PipingProbabilityAssessmentInput.GetN(SectionResult.Section.Length); - - if (ProbabilityRefinementType == ProbabilityRefinementType.Profile) - { - refinedSectionProbability = SectionResult.RefinedProfileProbability * sectionN; - } - - if (ProbabilityRefinementType == ProbabilityRefinementType.Section) - { - refinedProfileProbability = SectionResult.RefinedSectionProbability / sectionN; - } - try { AssemblyResult = FailureMechanismSectionAssemblyGroupFactory.AssembleSection( assessmentSection, IsRelevant, InitialFailureMechanismResult, InitialFailureMechanismResultProfileProbability, - InitialFailureMechanismResultSectionProbability, FurtherAnalysisNeeded, refinedProfileProbability, refinedSectionProbability); + InitialFailureMechanismResultSectionProbability, FurtherAnalysisNeeded, + SectionResult.RefinedProfileProbability, SectionResult.RefinedSectionProbability, + ProbabilityRefinementType, () => failureMechanism.PipingProbabilityAssessmentInput.GetN(SectionResult.Section.Length)); } catch (AssemblyException e) { @@ -334,7 +322,7 @@ ColumnStateDefinitions[assemblyGroupIndex].ErrorText = e.Message; } } - + private void CreateColumnStateDefinitions() { ColumnStateDefinitions.Add(initialFailureMechanismResultIndex, new DataGridViewColumnStateDefinition()); @@ -379,7 +367,7 @@ ColumnStateHelper.EnableColumn(ColumnStateDefinitions[refinedProfileProbabilityIndex], ProbabilityRefinementType == ProbabilityRefinementType.Section); ColumnStateHelper.EnableColumn(ColumnStateDefinitions[refinedSectionProbabilityIndex], ProbabilityRefinementType == ProbabilityRefinementType.Profile); } - + FailureMechanismSectionResultRowHelper.SetAssemblyGroupStyle(ColumnStateDefinitions[assemblyGroupIndex], AssemblyResult.AssemblyGroup); }