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);
}