Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/CombinationType.cs
===================================================================
diff -u
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/CombinationType.cs (revision 0)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/CombinationType.cs (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -0,0 +1,28 @@
+// Copyright (C) Stichting Deltares 2017. All rights reserved.
+//
+// This file is part of Ringtoets.
+//
+// Ringtoets is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// All names, logos, and references to "Deltares" are registered trademarks of
+// Stichting Deltares and remain full property of Stichting Deltares at all times.
+// All rights reserved.
+
+namespace Ringtoets.HydraRing.Calculation.Parsers.IllustrationPoints
+{
+ public enum CombinationType
+ {
+ Or, And
+ }
+}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/FaultTreeIllustrationPoint.cs
===================================================================
diff -u -r64333fca8065563308e6e2c9870bad46807ba7d5 -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/FaultTreeIllustrationPoint.cs (.../FaultTreeIllustrationPoint.cs) (revision 64333fca8065563308e6e2c9870bad46807ba7d5)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/FaultTreeIllustrationPoint.cs (.../FaultTreeIllustrationPoint.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -19,43 +19,25 @@
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
-using System;
using System.Collections.Generic;
namespace Ringtoets.HydraRing.Calculation.Parsers.IllustrationPoints
{
public class FaultTreeIllustrationPoint : IIllustrationPoint
{
- private IIllustrationPoint[] children = new IIllustrationPoint[2];
-
- public IEnumerable Children
+ public FaultTreeIllustrationPoint()
{
- get
- {
- return children;
- }
+ Stochasts = new List();
}
- public string Combine { get; set; }
+ public ICollection Stochasts { get; }
- public void AddChild(IIllustrationPoint point)
- {
- if (ReferenceEquals(children[0], point) || ReferenceEquals(children[1], point))
- {
- return;
- }
- if (children[0] == null)
- {
- children[0] = point;
- }
- else if (children[1] == null)
- {
- children[1] = point;
- }
- else
- {
- throw new InvalidOperationException("Kan niet meer dan 2 kinderen toevoegen aan een foutenboomknoop.");
- }
- }
+ public double Beta { get; set; }
+
+ public WindDirection WindDirection { get; set; }
+
+ public string ClosingSituation { get; set; }
+
+ public CombinationType Combine { get; set; }
}
}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/GeneralResult.cs
===================================================================
diff -u -re73c8b159778b281ecb275512f42da65c0d02e9d -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/GeneralResult.cs (.../GeneralResult.cs) (revision e73c8b159778b281ecb275512f42da65c0d02e9d)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/GeneralResult.cs (.../GeneralResult.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -47,6 +47,6 @@
/// Gets or sets the tree of illustration points for each
/// wind direction and closing situation.
///
- public IEnumerable IllustrationPoints { get; set; }
+ public IEnumerable IllustrationPoints { get; set; }
}
}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointQueries.cs
===================================================================
diff -u -r64333fca8065563308e6e2c9870bad46807ba7d5 -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointQueries.cs (.../IllustrationPointQueries.cs) (revision 64333fca8065563308e6e2c9870bad46807ba7d5)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointQueries.cs (.../IllustrationPointQueries.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -54,8 +54,79 @@
"AND OuterIterationId = (SELECT MAX(OuterIterationId) FROM DesignAlpha) " +
"AND PeriodId = (SELECT MIN(PeriodId) FROM DesignAlpha);";
+ public static readonly string FaultTreeAlphaValues =
+ "SELECT " +
+ $"{IllustrationPointsDatabaseConstants.FaultTreeId}, " +
+ $"{IllustrationPointsDatabaseConstants.WindDirectionId}, " +
+ $"{IllustrationPointsDatabaseConstants.ClosingSituationId}, " +
+ $"{IllustrationPointsDatabaseConstants.StochastName}, " +
+ $"{IllustrationPointsDatabaseConstants.AlphaValue}," +
+ $"{IllustrationPointsDatabaseConstants.Duration} " +
+ "FROM FaultTrees " +
+ "JOIN DesignAlpha USING(FaultTreeId) " +
+ "JOIN Stochasts USING(StochastId) " +
+ "WHERE DesignAlpha.LevelTypeId = 5 " +
+ "AND PeriodId = (SELECT MIN(PeriodId) FROM DesignAlpha) " +
+ "AND OuterIterationId = (SELECT MAX(OuterIterationId) FROM DesignAlpha);";
+
+ public static readonly string FaultTreeBetaValues =
+ "SELECT " +
+ $"{IllustrationPointsDatabaseConstants.FaultTreeId}, " +
+ $"{IllustrationPointsDatabaseConstants.WindDirectionId}, " +
+ $"{IllustrationPointsDatabaseConstants.ClosingSituationId}, " +
+ $"{IllustrationPointsDatabaseConstants.BetaValue} " +
+ "FROM FaultTrees " +
+ "JOIN DesignBeta USING(FaultTreeId) " +
+ "WHERE DesignBeta.LevelTypeId = 5 " +
+ "AND PeriodId = (SELECT MIN(PeriodId) FROM DesignBeta) " +
+ "AND OuterIterationId = (SELECT MAX(OuterIterationId) FROM DesignBeta);";
+
+ public static readonly string SubMechanismAlphaValues =
+ "SELECT " +
+ $"{IllustrationPointsDatabaseConstants.SubMechanismId}, " +
+ $"{IllustrationPointsDatabaseConstants.WindDirectionId}, " +
+ $"{IllustrationPointsDatabaseConstants.ClosingSituationId}, " +
+ $"{IllustrationPointsDatabaseConstants.StochastName}, " +
+ $"{IllustrationPointsDatabaseConstants.AlphaValue}," +
+ $"{IllustrationPointsDatabaseConstants.Duration}, " +
+ $"{IllustrationPointsDatabaseConstants.Realization} " +
+ $"FROM SubMechanisms " +
+ "JOIN DesignAlpha USING(SubMechanismId) " +
+ "JOIN Stochasts USING(StochastId) " +
+ "WHERE DesignAlpha.LevelTypeId = 7 " +
+ "AND PeriodId = (SELECT MIN(PeriodId) FROM DesignAlpha) " +
+ "AND OuterIterationId = (SELECT MAX(OuterIterationId) FROM DesignAlpha);";
+
+ public static readonly string SubMechanismBetaValues =
+ "SELECT " +
+ $"{IllustrationPointsDatabaseConstants.SubMechanismId}, " +
+ $"{IllustrationPointsDatabaseConstants.WindDirectionId}, " +
+ $"{IllustrationPointsDatabaseConstants.ClosingSituationId}, " +
+ $"{IllustrationPointsDatabaseConstants.BetaValue} " +
+ "FROM SubMechanisms " +
+ "JOIN DesignBeta USING(SubMechanismId) " +
+ "WHERE DesignBeta.LevelTypeId = 7 " +
+ "AND PeriodId = (SELECT MIN(PeriodId) FROM DesignBeta) " +
+ "AND OuterIterationId = (SELECT MAX(OuterIterationId) FROM DesignBeta);";
+
+ public static readonly string SubMechanismIllustrationPointResults =
+ "SELECT " +
+ $"{IllustrationPointsDatabaseConstants.SubMechanismId}, " +
+ $"{IllustrationPointsDatabaseConstants.WindDirectionId}, " +
+ $"{IllustrationPointsDatabaseConstants.ClosingSituationId}, " +
+ $"DesignPointResults.{IllustrationPointsDatabaseConstants.IllustrationPointResultValue}, " +
+ $"{IllustrationPointsDatabaseConstants.IllustrationPointResultDescription} " +
+ "FROM SubMechanisms " +
+ "JOIN DesignPointResults USING(SubMechanismId) " +
+ "JOIN OutputVariables USING(OutputVariableId) " +
+ "WHERE PeriodId = (SELECT MIN(PeriodId) FROM DesignPointResults) " +
+ "AND OuterIterationId = (SELECT MAX(OuterIterationId) FROM DesignPointResults);";
+
public static readonly string RecursiveFaultTree =
"WITH RECURSIVE " +
+ "combineFunctions(id, combine) AS (" +
+ "SELECT FaultTreeId, CombinFunction " +
+ "FROM FaultTrees)," +
"child_of(" +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeId}, " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeChildId}, " +
@@ -64,21 +135,23 @@
") AS(" +
"SELECT FaultTreeId, Id1, Type1, CombinFunction " +
"FROM FaultTrees " +
+ "LEFT OUTER JOIN combineFunctions ON combineFunctions.id = Id1 " +
"UNION " +
"SELECT FaultTreeId, Id2, Type2, CombinFunction " +
- "FROM FaultTrees)," +
+ "FROM FaultTrees " +
+ "LEFT OUTER JOIN combineFunctions ON combineFunctions.id = Id2), " +
"children(" +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeParentId}, " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeId}, " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeType}, " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeCombine}" +
") AS(" +
- $"SELECT {IllustrationPointsDatabaseConstants.RecursiveFaultTreeId}, " +
- $"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeChildId}, " +
- $"child_of.{IllustrationPointsDatabaseConstants.RecursiveFaultTreeType}, " +
- $"child_of.{IllustrationPointsDatabaseConstants.RecursiveFaultTreeCombine} " +
- "FROM child_of " +
- "WHERE id NOT IN " +
+ "SELECT null, " +
+ "FaultTreeId, " +
+ "\"faulttree\", " +
+ "CombinFunction " +
+ "FROM FaultTrees " +
+ "WHERE FaultTreeId NOT IN " +
$"(SELECT {IllustrationPointsDatabaseConstants.RecursiveFaultTreeChildId} FROM child_of) " +
"UNION ALL " +
$"SELECT {IllustrationPointsDatabaseConstants.RecursiveFaultTreeId}, " +
@@ -88,7 +161,7 @@
"FROM child_of " +
$"JOIN children USING({IllustrationPointsDatabaseConstants.RecursiveFaultTreeId}) " +
$"WHERE children.{IllustrationPointsDatabaseConstants.RecursiveFaultTreeType} = \"faulttree\") " +
- "SELECT " +
+ "SELECT DISTINCT " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeParentId}, " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeId}, " +
$"{IllustrationPointsDatabaseConstants.RecursiveFaultTreeType}, " +
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointResult.cs
===================================================================
diff -u
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointResult.cs (revision 0)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointResult.cs (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -0,0 +1,29 @@
+// Copyright (C) Stichting Deltares 2017. All rights reserved.
+//
+// This file is part of Ringtoets.
+//
+// Ringtoets is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// All names, logos, and references to "Deltares" are registered trademarks of
+// Stichting Deltares and remain full property of Stichting Deltares at all times.
+// All rights reserved.
+
+namespace Ringtoets.HydraRing.Calculation.Parsers.IllustrationPoints
+{
+ public class IllustrationPointResult
+ {
+ public string Description { get; set; }
+ public double Value { get; set; }
+ }
+}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointTreeNode.cs
===================================================================
diff -u
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointTreeNode.cs (revision 0)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointTreeNode.cs (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -0,0 +1,37 @@
+// Copyright (C) Stichting Deltares 2017. All rights reserved.
+//
+// This file is part of Ringtoets.
+//
+// Ringtoets is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+// All names, logos, and references to "Deltares" are registered trademarks of
+// Stichting Deltares and remain full property of Stichting Deltares at all times.
+// All rights reserved.
+
+using System.Collections.Generic;
+
+namespace Ringtoets.HydraRing.Calculation.Parsers.IllustrationPoints
+{
+ public class IllustrationPointTreeNode
+ {
+ public IllustrationPointTreeNode(IIllustrationPoint data)
+ {
+ Data = data;
+ Children = new List(2);
+ }
+
+ public IIllustrationPoint Data { get; }
+ public IList Children { get; }
+ }
+}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsDatabaseConstants.cs
===================================================================
diff -u -re73c8b159778b281ecb275512f42da65c0d02e9d -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsDatabaseConstants.cs (.../IllustrationPointsDatabaseConstants.cs) (revision e73c8b159778b281ecb275512f42da65c0d02e9d)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsDatabaseConstants.cs (.../IllustrationPointsDatabaseConstants.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -23,6 +23,9 @@
{
public static class IllustrationPointsDatabaseConstants
{
+ public const string FaultTreeId = "FaultTreeId";
+ public const string SubMechanismId = "SubMechanismId";
+
public const string ClosingSituationId = "ClosingSituationId";
public const string ClosingSituationName = "ClosingSituationName";
@@ -34,9 +37,13 @@
public const string StochastName = "StochastName";
public const string AlphaValue = "AlphaValue";
public const string Duration = "Duration";
+ public const string Realization = "X";
public const string BetaValue = "BetaValue";
+ public const string IllustrationPointResultValue = "Value";
+ public const string IllustrationPointResultDescription = "OutputVarDescription";
+
public const string RecursiveFaultTreeId = "id";
public const string RecursiveFaultTreeChildId = "childId";
public const string RecursiveFaultTreeType = "type";
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsParser.cs
===================================================================
diff -u -r64333fca8065563308e6e2c9870bad46807ba7d5 -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsParser.cs (.../IllustrationPointsParser.cs) (revision 64333fca8065563308e6e2c9870bad46807ba7d5)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/IllustrationPointsParser.cs (.../IllustrationPointsParser.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -31,6 +31,12 @@
{
public class IllustrationPointsParser : IHydraRingFileParser
{
+ private readonly Dictionary> faultTreeStochasts = new Dictionary>();
+ private readonly Dictionary faultTreeBetaValues = new Dictionary();
+
+ private readonly Dictionary> subMechanismStochasts = new Dictionary>();
+ private readonly Dictionary subMechanismBetaValues = new Dictionary();
+ private readonly Dictionary> subMechanismResults = new Dictionary>();
public GeneralResult Output = new GeneralResult();
private IDictionary windDirections;
@@ -43,6 +49,11 @@
IllustrationPointQueries.WindDirections,
IllustrationPointQueries.GeneralAlphaValues,
IllustrationPointQueries.GeneralBetaValues,
+ IllustrationPointQueries.FaultTreeAlphaValues,
+ IllustrationPointQueries.FaultTreeBetaValues,
+ IllustrationPointQueries.SubMechanismAlphaValues,
+ IllustrationPointQueries.SubMechanismBetaValues,
+ IllustrationPointQueries.SubMechanismIllustrationPointResults,
IllustrationPointQueries.RecursiveFaultTree);
try
@@ -72,58 +83,227 @@
reader.NextResult();
ParseGeneralBetaValue(reader);
reader.NextResult();
- var faultTreeRoot = ParseFaultTree(reader);
+ ParseFaultTreeAlphaValues(reader);
+ reader.NextResult();
+ ParseFaultTreeBetaValues(reader);
+ reader.NextResult();
+ ParseSubMechanismAlphaValues(reader);
+ reader.NextResult();
+ ParseSubMechanismBetaValues(reader);
+ reader.NextResult();
+ ParseSubMechanismResults(reader);
+ reader.NextResult();
+ ParseFaultTree(reader);
+ }
- if (faultTreeRoot == null)
+ private void ParseFaultTreeAlphaValues(HydraRingDatabaseReader reader)
+ {
+ Dictionary[] readFaultTreeAlphaValues = GetIterator(reader).TakeWhile(r => r != null).ToArray();
+ foreach (Dictionary readFaultTreeAlphaValue in readFaultTreeAlphaValues)
{
-
+ int faultTreeId = Convert.ToInt32(readFaultTreeAlphaValue[IllustrationPointsDatabaseConstants.FaultTreeId]);
+ int windDirectionId = Convert.ToInt32(readFaultTreeAlphaValue[IllustrationPointsDatabaseConstants.WindDirectionId]);
+ int closingSituationid = Convert.ToInt32(readFaultTreeAlphaValue[IllustrationPointsDatabaseConstants.ClosingSituationId]);
+ string name = Convert.ToString(readFaultTreeAlphaValue[IllustrationPointsDatabaseConstants.StochastName]);
+ double duration = Convert.ToDouble(readFaultTreeAlphaValue[IllustrationPointsDatabaseConstants.Duration]);
+ double alpha = Convert.ToDouble(readFaultTreeAlphaValue[IllustrationPointsDatabaseConstants.AlphaValue]);
+
+ var key = new ThreeKeyIndex(windDirectionId, closingSituationid, faultTreeId);
+ if (!faultTreeStochasts.ContainsKey(key))
+ {
+ faultTreeStochasts[key] = new List();
+ }
+
+ faultTreeStochasts[key].Add(new Stochast
+ {
+ Name = name,
+ Duration = duration,
+ Alpha = alpha
+ });
}
}
- private FaultTreeIllustrationPoint ParseFaultTree(HydraRingDatabaseReader reader)
+ private void ParseFaultTreeBetaValues(HydraRingDatabaseReader reader)
{
- var faultTree = new Dictionary();
- var subMechanism = new Dictionary();
- FaultTreeIllustrationPoint root = null;
+ Dictionary[] readFaultTreeBetaValues = GetIterator(reader).TakeWhile(r => r != null).ToArray();
+ foreach (Dictionary readFaultTreeBetaValue in readFaultTreeBetaValues)
+ {
+ int faultTreeId = Convert.ToInt32(readFaultTreeBetaValue[IllustrationPointsDatabaseConstants.FaultTreeId]);
+ int windDirectionId = Convert.ToInt32(readFaultTreeBetaValue[IllustrationPointsDatabaseConstants.WindDirectionId]);
+ int closingSituationid = Convert.ToInt32(readFaultTreeBetaValue[IllustrationPointsDatabaseConstants.ClosingSituationId]);
+ double beta = Convert.ToDouble(readFaultTreeBetaValue[IllustrationPointsDatabaseConstants.BetaValue]);
+ faultTreeBetaValues[new ThreeKeyIndex(windDirectionId, closingSituationid, faultTreeId)] = beta;
+ }
+ }
+
+ private void ParseSubMechanismAlphaValues(HydraRingDatabaseReader reader)
+ {
+ Dictionary[] readSubMechanismAlphaValues = GetIterator(reader).TakeWhile(r => r != null).ToArray();
+ foreach (Dictionary readSubMechanismAlphaValue in readSubMechanismAlphaValues)
+ {
+ int subMechanismId = Convert.ToInt32(readSubMechanismAlphaValue[IllustrationPointsDatabaseConstants.SubMechanismId]);
+ int windDirectionId = Convert.ToInt32(readSubMechanismAlphaValue[IllustrationPointsDatabaseConstants.WindDirectionId]);
+ int closingSituationid = Convert.ToInt32(readSubMechanismAlphaValue[IllustrationPointsDatabaseConstants.ClosingSituationId]);
+ string name = Convert.ToString(readSubMechanismAlphaValue[IllustrationPointsDatabaseConstants.StochastName]);
+ double duration = Convert.ToDouble(readSubMechanismAlphaValue[IllustrationPointsDatabaseConstants.Duration]);
+ double alpha = Convert.ToDouble(readSubMechanismAlphaValue[IllustrationPointsDatabaseConstants.AlphaValue]);
+
+ var key = new ThreeKeyIndex(windDirectionId, closingSituationid, subMechanismId);
+ if (!subMechanismStochasts.ContainsKey(key))
+ {
+ subMechanismStochasts[key] = new List();
+ }
+
+ subMechanismStochasts[key].Add(new Stochast
+ {
+ Name = name,
+ Duration = duration,
+ Alpha = alpha
+ });
+ }
+ }
+
+ private void ParseSubMechanismBetaValues(HydraRingDatabaseReader reader)
+ {
+ Dictionary[] readSubMechanismBetaValues = GetIterator(reader).TakeWhile(r => r != null).ToArray();
+ foreach (Dictionary readSubMechanismBetaValue in readSubMechanismBetaValues)
+ {
+ int subMechanismId = Convert.ToInt32(readSubMechanismBetaValue[IllustrationPointsDatabaseConstants.SubMechanismId]);
+ int windDirectionId = Convert.ToInt32(readSubMechanismBetaValue[IllustrationPointsDatabaseConstants.WindDirectionId]);
+ int closingSituationid = Convert.ToInt32(readSubMechanismBetaValue[IllustrationPointsDatabaseConstants.ClosingSituationId]);
+ double beta = Convert.ToDouble(readSubMechanismBetaValue[IllustrationPointsDatabaseConstants.BetaValue]);
+
+ subMechanismBetaValues[new ThreeKeyIndex(windDirectionId, closingSituationid, subMechanismId)] = beta;
+ }
+ }
+
+ private void ParseSubMechanismResults(HydraRingDatabaseReader reader)
+ {
+ Dictionary[] readSubMechanismResults = GetIterator(reader).TakeWhile(r => r != null).ToArray();
+ foreach (Dictionary readSubMechanismResult in readSubMechanismResults)
+ {
+ int subMechanismId = Convert.ToInt32(readSubMechanismResult[IllustrationPointsDatabaseConstants.SubMechanismId]);
+ int windDirectionId = Convert.ToInt32(readSubMechanismResult[IllustrationPointsDatabaseConstants.WindDirectionId]);
+ int closingSituationid = Convert.ToInt32(readSubMechanismResult[IllustrationPointsDatabaseConstants.ClosingSituationId]);
+ string description = Convert.ToString(readSubMechanismResult[IllustrationPointsDatabaseConstants.IllustrationPointResultDescription]);
+ double value = Convert.ToDouble(readSubMechanismResult[IllustrationPointsDatabaseConstants.IllustrationPointResultValue]);
+
+ var key = new ThreeKeyIndex(windDirectionId, closingSituationid, subMechanismId);
+ if (!subMechanismResults.ContainsKey(key))
+ {
+ subMechanismResults[key] = new List();
+ }
+
+ subMechanismResults[key].Add(new IllustrationPointResult
+ {
+ Description = description,
+ Value = value
+ });
+ }
+ }
+
+ private void ParseFaultTree(HydraRingDatabaseReader reader)
+ {
+ var rootIllustrationPoints = new List();
+
+ IEnumerable> windDirectionClosingSituations =
+ GetAllWindDirectionClosingSituationCombinations();
+
Dictionary[] readFaultTrees = GetIterator(reader).TakeWhile(r => r != null).ToArray();
if (readFaultTrees.Length > 0)
{
+ var results = new List>();
+
foreach (Dictionary readFaultTree in readFaultTrees)
{
- int parentId = Convert.ToInt32(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeParentId]);
+ object parentIdObject = readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeParentId];
+ int? parentId = parentIdObject != DBNull.Value ? Convert.ToInt32(parentIdObject) : (int?) null;
int id = Convert.ToInt32(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeId]);
string type = Convert.ToString(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeType]);
string combine = Convert.ToString(readFaultTree[IllustrationPointsDatabaseConstants.RecursiveFaultTreeCombine]);
- if (!faultTree.ContainsKey(parentId))
- {
- root = new FaultTreeIllustrationPoint();
- faultTree[parentId] = root;
- }
+ results.Add(Tuple.Create(
+ parentId,
+ id,
+ type == "faulttree" ? typeof(FaultTreeIllustrationPoint) : typeof(SubmechanismIllustrationPoint),
+ combine == "and" ? CombinationType.And : CombinationType.Or));
+ }
- faultTree[parentId].Combine = combine;
- if (type == "faulttree")
- {
- if (!faultTree.ContainsKey(id))
- {
- faultTree[id] = new FaultTreeIllustrationPoint();
- }
- faultTree[parentId].AddChild(faultTree[id]);
- }
- if (type == "submechanism")
- {
- if (!subMechanism.ContainsKey(id))
- {
- subMechanism[id] = new SubmechanismIllustrationPoint();
- }
- faultTree[parentId].AddChild(subMechanism[id]);
- }
+ foreach (Tuple windDirectionClosingSituation in windDirectionClosingSituations)
+ {
+ Tuple root = results.Single(r => !r.Item1.HasValue);
+ rootIllustrationPoints.Add(BuildFaultTree(windDirectionClosingSituation, root.Item2, root.Item4, results));
}
}
- return root;
+
+ Output.IllustrationPoints = rootIllustrationPoints;
}
+ private IEnumerable> GetAllWindDirectionClosingSituationCombinations()
+ {
+ return windDirections.SelectMany(windDirection =>
+ closingSituations.Select(
+ closingSituation => Tuple.Create(windDirection.Key, windDirection.Value, closingSituation.Key, closingSituation.Value)));
+ }
+
+ private IllustrationPointTreeNode BuildFaultTree(
+ Tuple windDirectionClosingSituation,
+ int faultTreeId,
+ CombinationType combinationType,
+ ICollection> results)
+ {
+ var dataKey = new ThreeKeyIndex(windDirectionClosingSituation.Item1, windDirectionClosingSituation.Item3, faultTreeId);
+ var illustrationPoint = new FaultTreeIllustrationPoint
+ {
+ WindDirection = windDirectionClosingSituation.Item2,
+ ClosingSituation = windDirectionClosingSituation.Item4,
+ Beta = faultTreeBetaValues[dataKey],
+ Combine = combinationType
+ };
+ if (subMechanismStochasts.ContainsKey(dataKey))
+ {
+ AddRange(illustrationPoint.Stochasts, subMechanismStochasts[dataKey]);
+ }
+
+ var node = new IllustrationPointTreeNode(illustrationPoint);
+ foreach (Tuple child in results.Where(r => r.Item1 == faultTreeId))
+ {
+ node.Children.Add(child.Item3 == typeof(FaultTreeIllustrationPoint)
+ ? BuildFaultTree(windDirectionClosingSituation, child.Item2, child.Item4, results)
+ : BuildSubMechanism(windDirectionClosingSituation, child.Item2));
+ }
+ return node;
+ }
+
+ private IllustrationPointTreeNode BuildSubMechanism(Tuple windDirectionClosingSituation, int subMechanismId)
+ {
+ var dataKey = new ThreeKeyIndex(windDirectionClosingSituation.Item1, windDirectionClosingSituation.Item3, subMechanismId);
+ var illustrationPoint = new SubmechanismIllustrationPoint
+ {
+ WindDirection = windDirectionClosingSituation.Item2,
+ ClosingSituation = windDirectionClosingSituation.Item4,
+ Beta = subMechanismBetaValues[dataKey]
+ };
+ if (subMechanismStochasts.ContainsKey(dataKey))
+ {
+ AddRange(illustrationPoint.Stochasts, subMechanismStochasts[dataKey]);
+ }
+ if (subMechanismResults.ContainsKey(dataKey))
+ {
+ AddRange(illustrationPoint.Results, subMechanismResults[dataKey]);
+ }
+ return new IllustrationPointTreeNode(illustrationPoint);
+ }
+
+ private void AddRange(ICollection collection, IEnumerable itemsToAdd)
+ {
+ foreach (T item in itemsToAdd)
+ {
+ collection.Add(item);
+ }
+ }
+
private void ParseGeneralBetaValue(HydraRingDatabaseReader reader)
{
IEnumerable> betaValues = GetIterator(reader).TakeWhile(r => r != null).ToArray();
@@ -141,7 +321,7 @@
{
Name = Convert.ToString(a[IllustrationPointsDatabaseConstants.StochastName]),
Duration = Convert.ToDouble(a[IllustrationPointsDatabaseConstants.Duration]),
- Alpha= Convert.ToDouble(a[IllustrationPointsDatabaseConstants.AlphaValue])
+ Alpha = Convert.ToDouble(a[IllustrationPointsDatabaseConstants.AlphaValue])
});
}
@@ -188,5 +368,83 @@
nextLine = reader.ReadLine();
}
}
+
+ private struct ThreeKeyIndex
+ {
+ private readonly int windDirectionId;
+ private readonly int closingSituationId;
+ private readonly int illustrationPointId;
+
+ public ThreeKeyIndex(int windDirectionId, int closingSituationId, int illustrationPointId)
+ {
+ this.windDirectionId = windDirectionId;
+ this.closingSituationId = closingSituationId;
+ this.illustrationPointId = illustrationPointId;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (ReferenceEquals(null, obj))
+ {
+ return false;
+ }
+ return obj.GetType() == GetType()
+ && Equals((ThreeKeyIndex) obj);
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ int hashCode = windDirectionId;
+ hashCode = (hashCode * 397) ^ closingSituationId;
+ hashCode = (hashCode * 397) ^ illustrationPointId;
+ return hashCode;
+ }
+ }
+
+ private bool Equals(ThreeKeyIndex other)
+ {
+ return windDirectionId == other.windDirectionId
+ && closingSituationId == other.closingSituationId
+ && illustrationPointId == other.illustrationPointId;
+ }
+ }
+
+ private struct WindDirectionClosingSituation
+ {
+ private readonly WindDirection windDirection;
+ private readonly string closingSituation;
+
+ public WindDirectionClosingSituation(WindDirection windDirection, string closingSituation)
+ {
+ this.windDirection = windDirection;
+ this.closingSituation = closingSituation;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (ReferenceEquals(null, obj))
+ {
+ return false;
+ }
+ return obj is WindDirectionClosingSituation
+ && Equals((WindDirectionClosingSituation) obj);
+ }
+
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ return ((windDirection?.GetHashCode() ?? 0) * 397) ^ (closingSituation?.GetHashCode() ?? 0);
+ }
+ }
+
+ private bool Equals(WindDirectionClosingSituation other)
+ {
+ return Equals(windDirection, other.windDirection)
+ && string.Equals(closingSituation, other.closingSituation);
+ }
+ }
}
}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/SubmechanismIllustrationPoint.cs
===================================================================
diff -u -r64333fca8065563308e6e2c9870bad46807ba7d5 -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/SubmechanismIllustrationPoint.cs (.../SubmechanismIllustrationPoint.cs) (revision 64333fca8065563308e6e2c9870bad46807ba7d5)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Parsers/IllustrationPoints/SubmechanismIllustrationPoint.cs (.../SubmechanismIllustrationPoint.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -19,10 +19,26 @@
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
+using System.Collections.Generic;
+
namespace Ringtoets.HydraRing.Calculation.Parsers.IllustrationPoints
{
public class SubmechanismIllustrationPoint : IIllustrationPoint
{
-
+ public SubmechanismIllustrationPoint()
+ {
+ Results = new List();
+ Stochasts = new List();
+ }
+ public ICollection Stochasts { get; }
+
+ public double Beta { get; set; }
+
+ public WindDirection WindDirection { get; set; }
+
+ public string ClosingSituation { get; set; }
+
+ public ICollection Results { get; }
+
}
}
\ No newline at end of file
Index: Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Ringtoets.HydraRing.Calculation.csproj
===================================================================
diff -u -r64333fca8065563308e6e2c9870bad46807ba7d5 -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Ringtoets.HydraRing.Calculation.csproj (.../Ringtoets.HydraRing.Calculation.csproj) (revision 64333fca8065563308e6e2c9870bad46807ba7d5)
+++ Ringtoets/HydraRing/src/Ringtoets.HydraRing.Calculation/Ringtoets.HydraRing.Calculation.csproj (.../Ringtoets.HydraRing.Calculation.csproj) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -111,12 +111,15 @@
+
+
+
Index: Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/IllustrationPoints/IllustrationPointsParserTest.cs
===================================================================
diff -u -re73c8b159778b281ecb275512f42da65c0d02e9d -r79cd607bf75f24327b6889d8709b072c3da3c156
--- Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/IllustrationPoints/IllustrationPointsParserTest.cs (.../IllustrationPointsParserTest.cs) (revision e73c8b159778b281ecb275512f42da65c0d02e9d)
+++ Ringtoets/HydraRing/test/Ringtoets.HydraRing.Calculation.Test/Parsers/IllustrationPoints/IllustrationPointsParserTest.cs (.../IllustrationPointsParserTest.cs) (revision 79cd607bf75f24327b6889d8709b072c3da3c156)
@@ -139,6 +139,7 @@
Assert.NotNull(generalResult.GoverningWind);
Assert.AreEqual(1.19513, generalResult.Beta);
Assert.AreEqual(46, generalResult.Stochasts.Count());
+ Assert.AreEqual(12, generalResult.IllustrationPoints.Count());
}
}
}
\ No newline at end of file