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