From 56dc86b351251f7b24608415bfbf88923cf3e1da Mon Sep 17 00:00:00 2001 From: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Date: Fri, 2 Jun 2023 12:07:30 -0400 Subject: [PATCH 1/4] Fixes #2022 Add common interface to indicate a building block contains initial conditions --- .../ExpressionProfileDiffBuilder.cs | 5 ++- .../Builder/ExpressionProfileBuildingBlock.cs | 39 ++++++++++--------- .../Domain/Builder/SimulationBuilder.cs | 2 +- src/OSPSuite.Core/Domain/Constants.cs | 1 + .../Domain/Services/QuantityValuesUpdater.cs | 2 +- .../Xml/BuildingBlockXmlSerializer.cs | 2 +- .../ExpressionProfileBuildingBlockSpecs.cs | 6 +-- 7 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs b/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs index f06e84a89..701177507 100644 --- a/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs +++ b/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs @@ -1,4 +1,5 @@ -using OSPSuite.Core.Domain.Builder; +using OSPSuite.Core.Domain; +using OSPSuite.Core.Domain.Builder; namespace OSPSuite.Core.Comparison { @@ -12,7 +13,7 @@ public override void Compare(IComparison compari { base.Compare(comparison); CompareValues(x => x.Type, x => x.Type, comparison); - _enumerableComparer.CompareEnumerables(comparison, x => x.InitialConditions, x => x.Path); + _enumerableComparer.CompareEnumerables(comparison, x => x, x => x.Path); } } diff --git a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs index d34e7c4c4..8695d04ab 100644 --- a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs +++ b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs @@ -6,7 +6,7 @@ namespace OSPSuite.Core.Domain.Builder { - public class ExpressionProfileBuildingBlock : PathAndValueEntityBuildingBlockFromPKSim + public class ExpressionProfileBuildingBlock : PathAndValueEntityBuildingBlockFromPKSim, IBuildingBlock { private readonly StartValueCache _initialConditions = new StartValueCache(); public override string Icon => Type.IconName; @@ -40,29 +40,12 @@ public override string Name } } - public void RemoveInitialCondition(InitialCondition initialCondition) - { - if (initialCondition == null) - return; - - _initialConditions.Remove(initialCondition.Path); - initialCondition.BuildingBlock = null; - } - - public void AddInitialCondition(InitialCondition initialCondition) - { - _initialConditions.Add(initialCondition); - initialCondition.BuildingBlock = this; - } - public override void AcceptVisitor(IVisitor visitor) { base.AcceptVisitor(visitor); _initialConditions.Each(ic => ic.AcceptVisitor(visitor)); } - public IReadOnlyCollection InitialConditions => _initialConditions; - public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) { base.UpdatePropertiesFrom(source, cloneManager); @@ -76,7 +59,25 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone Name = sourceExpressionProfile.Name; _initialConditions.Clear(); - sourceExpressionProfile.InitialConditions.Each(initialCondition => AddInitialCondition(cloneManager.Clone(initialCondition))); + sourceExpressionProfile.Each(initialCondition => Add(cloneManager.Clone(initialCondition))); + } + + public IEnumerator GetEnumerator() + { + return _initialConditions.GetEnumerator(); + } + + public void Add(InitialCondition pathAndValueEntity) + { + _initialConditions.Add(pathAndValueEntity); + pathAndValueEntity.BuildingBlock = this; + } + + public void Remove(InitialCondition pathAndValueEntity) + { + if (pathAndValueEntity == null) + return; + _initialConditions.Remove(pathAndValueEntity.Path); } } } \ No newline at end of file diff --git a/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs b/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs index 6a7d2e0d0..c6bd92c80 100644 --- a/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs +++ b/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs @@ -93,7 +93,7 @@ private void performMerge() _molecules.AddRange(allBuilder(x => x.Molecules)); _parameterValues.AddRange(allStartValueBuilder(x => x.SelectedParameterValues)); _initialConditions.AddRange(allStartValueBuilder(x => x.SelectedInitialConditions) - .Concat(_simulationConfiguration.ExpressionProfiles.SelectMany(x => x.InitialConditions))); + .Concat(_simulationConfiguration.ExpressionProfiles.SelectMany(x => x))); } internal IReadOnlyList SpatialStructures => all(x => x.SpatialStructure); diff --git a/src/OSPSuite.Core/Domain/Constants.cs b/src/OSPSuite.Core/Domain/Constants.cs index 3a3fd357e..ba906e1ef 100644 --- a/src/OSPSuite.Core/Domain/Constants.cs +++ b/src/OSPSuite.Core/Domain/Constants.cs @@ -534,6 +534,7 @@ private static string compositeNameFor(char separator, params string[] names) public static class Serialization { + public const string INITIAL_CONDITIONS = "InitialConditions"; public const string MACRO_COMMAND = "MacroCommand"; public const string SIMPLE_COMMAND = "SimpleCommand"; public const string LABEL_COMMAND = "LabelCommand"; diff --git a/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs b/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs index 983698ae8..c2623bb99 100644 --- a/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs +++ b/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs @@ -59,7 +59,7 @@ public void UpdateQuantitiesValues(ModelConfiguration modelConfiguration) private void updateParameterFromExpressionProfiles(ModelConfiguration modelConfiguration) { - modelConfiguration.SimulationConfiguration.ExpressionProfiles?.SelectMany(x => x).Each(x => updateParameterValueFromStartValue(modelConfiguration, x, getParameter)); + modelConfiguration.SimulationConfiguration.ExpressionProfiles?.SelectMany(x => x).Each(x => updateParameterValueFromStartValue(modelConfiguration, x, getParameter)); } private void updateParameterFromIndividualValues(ModelConfiguration modelConfiguration) diff --git a/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs b/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs index 62f810958..cf5f77162 100644 --- a/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs +++ b/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs @@ -118,7 +118,7 @@ public override void PerformMapping() { base.PerformMapping(); Map(x => x.Type); - MapEnumerable(x => x.InitialConditions, x => x.AddInitialCondition); + MapEnumerable(bb => bb, bb => bb.Add).WithMappingName(Constants.Serialization.INITIAL_CONDITIONS); } } diff --git a/tests/OSPSuite.Core.Tests/Domain/ExpressionProfileBuildingBlockSpecs.cs b/tests/OSPSuite.Core.Tests/Domain/ExpressionProfileBuildingBlockSpecs.cs index 74ad90fc8..a53256aad 100644 --- a/tests/OSPSuite.Core.Tests/Domain/ExpressionProfileBuildingBlockSpecs.cs +++ b/tests/OSPSuite.Core.Tests/Domain/ExpressionProfileBuildingBlockSpecs.cs @@ -41,7 +41,7 @@ protected override void Context() _expressionProfileBuildingBlock.Add(new ExpressionParameter().WithName("name1")); var initialCondition = new InitialCondition().WithName("ic1"); initialCondition.Path = new ObjectPath("path1"); - _expressionProfileBuildingBlock.AddInitialCondition(initialCondition); + _expressionProfileBuildingBlock.Add(initialCondition); var clonedInitialCondition = new InitialCondition().WithName(initialCondition.Name); clonedInitialCondition.Path = initialCondition.Path; @@ -58,8 +58,8 @@ public void the_updated_expression_profile_should_have_properties_set() sut.Name.ShouldBeEqualTo("Molecule|Species|Name"); sut.Type.ShouldBeEqualTo(ExpressionTypes.MetabolizingEnzyme); sut.PKSimVersion.ShouldBeEqualTo("11.1"); - sut.Count().ShouldBeEqualTo(1); - sut.InitialConditions.Count().ShouldBeEqualTo(1); + sut.Count().ShouldBeEqualTo(1); + sut.Count().ShouldBeEqualTo(1); } } From 12c977bfbc3f07a372adca5c524c651137896c95 Mon Sep 17 00:00:00 2001 From: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Date: Mon, 5 Jun 2023 07:23:14 -0400 Subject: [PATCH 2/4] PR feedback --- .../ExpressionProfileDiffBuilder.cs | 5 ++--- .../Builder/ExpressionProfileBuildingBlock.cs | 20 ++++++++++++++++++- .../Domain/Builder/SimulationBuilder.cs | 2 +- .../Xml/BuildingBlockXmlSerializer.cs | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs b/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs index 701177507..f06e84a89 100644 --- a/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs +++ b/src/OSPSuite.Core/Comparison/ExpressionProfileDiffBuilder.cs @@ -1,5 +1,4 @@ -using OSPSuite.Core.Domain; -using OSPSuite.Core.Domain.Builder; +using OSPSuite.Core.Domain.Builder; namespace OSPSuite.Core.Comparison { @@ -13,7 +12,7 @@ public override void Compare(IComparison compari { base.Compare(comparison); CompareValues(x => x.Type, x => x.Type, comparison); - _enumerableComparer.CompareEnumerables(comparison, x => x, x => x.Path); + _enumerableComparer.CompareEnumerables(comparison, x => x.InitialConditions, x => x.Path); } } diff --git a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs index 8695d04ab..e846b755b 100644 --- a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs +++ b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs @@ -40,12 +40,29 @@ public override string Name } } + public void RemoveInitialCondition(InitialCondition initialCondition) + { + if (initialCondition == null) + return; + + _initialConditions.Remove(initialCondition.Path); + initialCondition.BuildingBlock = null; + } + + public void AddInitialCondition(InitialCondition initialCondition) + { + _initialConditions.Add(initialCondition); + initialCondition.BuildingBlock = this; + } + public override void AcceptVisitor(IVisitor visitor) { base.AcceptVisitor(visitor); _initialConditions.Each(ic => ic.AcceptVisitor(visitor)); } + public IReadOnlyCollection InitialConditions => _initialConditions; + public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) { base.UpdatePropertiesFrom(source, cloneManager); @@ -59,7 +76,8 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone Name = sourceExpressionProfile.Name; _initialConditions.Clear(); - sourceExpressionProfile.Each(initialCondition => Add(cloneManager.Clone(initialCondition))); + sourceExpressionProfile.InitialConditions.Each(initialCondition => + AddInitialCondition(cloneManager.Clone(initialCondition))); } public IEnumerator GetEnumerator() diff --git a/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs b/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs index c6bd92c80..6a7d2e0d0 100644 --- a/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs +++ b/src/OSPSuite.Core/Domain/Builder/SimulationBuilder.cs @@ -93,7 +93,7 @@ private void performMerge() _molecules.AddRange(allBuilder(x => x.Molecules)); _parameterValues.AddRange(allStartValueBuilder(x => x.SelectedParameterValues)); _initialConditions.AddRange(allStartValueBuilder(x => x.SelectedInitialConditions) - .Concat(_simulationConfiguration.ExpressionProfiles.SelectMany(x => x))); + .Concat(_simulationConfiguration.ExpressionProfiles.SelectMany(x => x.InitialConditions))); } internal IReadOnlyList SpatialStructures => all(x => x.SpatialStructure); diff --git a/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs b/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs index cf5f77162..62f810958 100644 --- a/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs +++ b/src/OSPSuite.Core/Serialization/Xml/BuildingBlockXmlSerializer.cs @@ -118,7 +118,7 @@ public override void PerformMapping() { base.PerformMapping(); Map(x => x.Type); - MapEnumerable(bb => bb, bb => bb.Add).WithMappingName(Constants.Serialization.INITIAL_CONDITIONS); + MapEnumerable(x => x.InitialConditions, x => x.AddInitialCondition); } } From a15abb3a8303bc078900000a2eb15586e4a4010f Mon Sep 17 00:00:00 2001 From: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Date: Mon, 5 Jun 2023 07:27:14 -0400 Subject: [PATCH 3/4] PR feedback --- .../Domain/Builder/ExpressionProfileBuildingBlock.cs | 9 +++++---- .../Domain/Services/QuantityValuesUpdater.cs | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs index e846b755b..9ef362cb8 100644 --- a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs +++ b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs @@ -54,7 +54,7 @@ public void AddInitialCondition(InitialCondition initialCondition) _initialConditions.Add(initialCondition); initialCondition.BuildingBlock = this; } - + public override void AcceptVisitor(IVisitor visitor) { base.AcceptVisitor(visitor); @@ -62,7 +62,8 @@ public override void AcceptVisitor(IVisitor visitor) } public IReadOnlyCollection InitialConditions => _initialConditions; - + public IReadOnlyCollection ExpressionParameters => _allValues; + public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager cloneManager) { base.UpdatePropertiesFrom(source, cloneManager); @@ -76,7 +77,7 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone Name = sourceExpressionProfile.Name; _initialConditions.Clear(); - sourceExpressionProfile.InitialConditions.Each(initialCondition => + sourceExpressionProfile.InitialConditions.Each(initialCondition => AddInitialCondition(cloneManager.Clone(initialCondition))); } @@ -93,7 +94,7 @@ public void Add(InitialCondition pathAndValueEntity) public void Remove(InitialCondition pathAndValueEntity) { - if (pathAndValueEntity == null) + if (pathAndValueEntity == null) return; _initialConditions.Remove(pathAndValueEntity.Path); } diff --git a/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs b/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs index c2623bb99..9c05b3d25 100644 --- a/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs +++ b/src/OSPSuite.Core/Domain/Services/QuantityValuesUpdater.cs @@ -59,7 +59,7 @@ public void UpdateQuantitiesValues(ModelConfiguration modelConfiguration) private void updateParameterFromExpressionProfiles(ModelConfiguration modelConfiguration) { - modelConfiguration.SimulationConfiguration.ExpressionProfiles?.SelectMany(x => x).Each(x => updateParameterValueFromStartValue(modelConfiguration, x, getParameter)); + modelConfiguration.SimulationConfiguration.ExpressionProfiles?.SelectMany(x => x.ExpressionParameters).Each(x => updateParameterValueFromStartValue(modelConfiguration, x, getParameter)); } private void updateParameterFromIndividualValues(ModelConfiguration modelConfiguration) From 09fc6261aea08a56cf7e105a709f61ab90a7578b Mon Sep 17 00:00:00 2001 From: Robert McIntosh <261477+rwmcintosh@users.noreply.github.com> Date: Mon, 5 Jun 2023 10:08:21 -0400 Subject: [PATCH 4/4] PR feedback --- .../Domain/Builder/ExpressionProfileBuildingBlock.cs | 7 ++++++- .../Domain/Builder/InitialConditionsBuildingBlock.cs | 5 +++++ .../Domain/Builder/PathAndValueEntityBuildingBlock.cs | 7 ++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs index 9ef362cb8..a98142a38 100644 --- a/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs +++ b/src/OSPSuite.Core/Domain/Builder/ExpressionProfileBuildingBlock.cs @@ -6,7 +6,7 @@ namespace OSPSuite.Core.Domain.Builder { - public class ExpressionProfileBuildingBlock : PathAndValueEntityBuildingBlockFromPKSim, IBuildingBlock + public class ExpressionProfileBuildingBlock : PathAndValueEntityBuildingBlockFromPKSim, ILookupBuildingBlock { private readonly StartValueCache _initialConditions = new StartValueCache(); public override string Icon => Type.IconName; @@ -19,6 +19,11 @@ public class ExpressionProfileBuildingBlock : PathAndValueEntityBuildingBlockFro public virtual string Category { get; private set; } + InitialCondition ILookupBuildingBlock.ByPath(ObjectPath path) + { + return _initialConditions[path]; + } + public override string Name { get => ExpressionProfileName(MoleculeName, Species, Category); diff --git a/src/OSPSuite.Core/Domain/Builder/InitialConditionsBuildingBlock.cs b/src/OSPSuite.Core/Domain/Builder/InitialConditionsBuildingBlock.cs index ee4de07d2..f31417d7e 100644 --- a/src/OSPSuite.Core/Domain/Builder/InitialConditionsBuildingBlock.cs +++ b/src/OSPSuite.Core/Domain/Builder/InitialConditionsBuildingBlock.cs @@ -2,6 +2,11 @@ namespace OSPSuite.Core.Domain.Builder { + public interface ILookupBuildingBlock : IBuildingBlock where T : IBuilder + { + T ByPath(ObjectPath path); + } + public class InitialConditionsBuildingBlock : PathAndValueEntityBuildingBlock { public InitialConditionsBuildingBlock() diff --git a/src/OSPSuite.Core/Domain/Builder/PathAndValueEntityBuildingBlock.cs b/src/OSPSuite.Core/Domain/Builder/PathAndValueEntityBuildingBlock.cs index 4c80da5dd..0e852d611 100644 --- a/src/OSPSuite.Core/Domain/Builder/PathAndValueEntityBuildingBlock.cs +++ b/src/OSPSuite.Core/Domain/Builder/PathAndValueEntityBuildingBlock.cs @@ -8,7 +8,7 @@ namespace OSPSuite.Core.Domain.Builder { - public abstract class PathAndValueEntityBuildingBlock : BuildingBlock, IBuildingBlock where T : PathAndValueEntity + public abstract class PathAndValueEntityBuildingBlock : BuildingBlock, ILookupBuildingBlock where T : PathAndValueEntity { protected Cache _allValues = new Cache(x => x.Path, x => null); @@ -47,6 +47,11 @@ IEnumerator IEnumerable.GetEnumerator() return GetEnumerator(); } + T ILookupBuildingBlock.ByPath(ObjectPath path) + { + return this[path]; + } + public override void AcceptVisitor(IVisitor visitor) { base.AcceptVisitor(visitor);