Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.IO/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformer.cs =================================================================== diff -u -r57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff -rc5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.IO/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformer.cs (.../MacroStabilityInwardsStochasticSoilModelTransformer.cs) (revision 57bc6a475f6cdd57b1a0ebf70cdf533014afd1ff) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.IO/SoilProfiles/MacroStabilityInwardsStochasticSoilModelTransformer.cs (.../MacroStabilityInwardsStochasticSoilModelTransformer.cs) (revision c5c91f8ca724aef52a6cd9055a2a32bcd6bc0c03) @@ -22,6 +22,7 @@ using System; using System.Collections.Generic; using System.Linq; +using log4net; using Ringtoets.Common.IO.Exceptions; using Ringtoets.Common.IO.SoilProfile; using Ringtoets.Common.IO.SoilProfile.Schema; @@ -36,6 +37,7 @@ public class MacroStabilityInwardsStochasticSoilModelTransformer : IStochasticSoilModelTransformer { private readonly Dictionary soilProfiles = new Dictionary(); + private static readonly ILog log = LogManager.GetLogger(typeof(MacroStabilityInwardsStochasticSoilModelTransformer)); public MacroStabilityInwardsStochasticSoilModel Transform(StochasticSoilModel stochasticSoilModel) { @@ -79,14 +81,12 @@ IEnumerable stochasticSoilProfiles, string soilModelName) { - IEnumerable profilesToTransform = - StochasticSoilProfileHelper.GetValidatedStochasticSoilProfilesToTransform(stochasticSoilProfiles, - soilModelName); - - return profilesToTransform.Select( + MacroStabilityInwardsStochasticSoilProfile[] transformedProfiles = stochasticSoilProfiles.Select( ssp => MacroStabilityInwardsStochasticSoilProfileTransformer.Transform( ssp, GetTransformedSoilProfile(ssp.SoilProfile))).ToArray(); + + return GetUniqueStochasticSoilProfiles(transformedProfiles, soilModelName); } /// @@ -110,5 +110,47 @@ } return macroStabilityInwardsSoilProfile; } + + /// + /// Filters a collection of to determine which items + /// are unique. + /// + /// The collection of + /// to filter. + /// The name of the soil model. + /// A collection of unique . + /// Thrown when a + /// is invalid. + private static IEnumerable GetUniqueStochasticSoilProfiles( + IEnumerable stochasticSoilProfiles, + string soilModelName) + { + List uniqueStochasticSoilProfiles = stochasticSoilProfiles.ToList(); + MacroStabilityInwardsStochasticSoilProfile[] allStochasticSoilProfiles = uniqueStochasticSoilProfiles.ToArray(); + + try + { + for (var i = 1; i < allStochasticSoilProfiles.Length; i++) + { + MacroStabilityInwardsStochasticSoilProfile previousProfile = allStochasticSoilProfiles[i - 1]; + MacroStabilityInwardsStochasticSoilProfile currentProfile = allStochasticSoilProfiles[i]; + if (ReferenceEquals(currentProfile.SoilProfile, previousProfile.SoilProfile)) + { + log.Warn(string.Format(RingtoetsCommonIOResources.SoilModelTransformer_GetUniqueStochasticSoilProfiles_StochasticSoilProfile_0_has_multiple_occurences_in_SoilModel_1_Probability_Summed, + previousProfile.SoilProfile.Name, + soilModelName)); + + previousProfile.AddProbability(currentProfile.Probability); + uniqueStochasticSoilProfiles.Remove(currentProfile); + } + } + } + catch (ArgumentOutOfRangeException e) + { + throw new ImportedDataTransformException(e.Message, e); + } + + return uniqueStochasticSoilProfiles; + } } } \ No newline at end of file