Skip to content

Commit

Permalink
Fixes #1536 container criteria molecule
Browse files Browse the repository at this point in the history
  • Loading branch information
msevestre committed Mar 9, 2022
1 parent 7b1a204 commit bd9d149
Show file tree
Hide file tree
Showing 15 changed files with 148 additions and 144 deletions.
78 changes: 16 additions & 62 deletions src/OSPSuite.Core/Domain/Builder/MoleculeBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System.Collections.Generic;
using OSPSuite.Utility.Collections;
using OSPSuite.Utility.Extensions;
using OSPSuite.Core.Domain.Formulas;
using OSPSuite.Core.Domain.Services;
using OSPSuite.Core.Domain.UnitSystem;
using OSPSuite.Utility.Collections;
using OSPSuite.Utility.Extensions;

namespace OSPSuite.Core.Domain.Builder
{
Expand Down Expand Up @@ -84,70 +84,34 @@ public MoleculeBuilder()
QuantityType = QuantityType.Undefined;
}

public void AddParameter(IParameter parameter)
{
Add(parameter);
}
public void AddParameter(IParameter parameter) => Add(parameter);

public void RemoveParameter(IParameter parameterToRemove)
{
RemoveChild(parameterToRemove);
}
public void RemoveParameter(IParameter parameterToRemove) => RemoveChild(parameterToRemove);

public IEnumerable<IParameter> Parameters
{
get { return GetChildren<IParameter>(); }
}
public IEnumerable<IParameter> Parameters => GetChildren<IParameter>();

public IEnumerable<TransporterMoleculeContainer> TransporterMoleculeContainerCollection
{
get { return GetChildren<TransporterMoleculeContainer>(); }
}
public IEnumerable<TransporterMoleculeContainer> TransporterMoleculeContainerCollection => GetChildren<TransporterMoleculeContainer>();

public void AddTransporterMoleculeContainer(TransporterMoleculeContainer transporterMolecule)
{
Add(transporterMolecule);
}
public void AddTransporterMoleculeContainer(TransporterMoleculeContainer transporterMolecule) => Add(transporterMolecule);

public void RemoveTransporterMoleculeContainer(TransporterMoleculeContainer transporterMoleculeToRemove)
{
RemoveChild(transporterMoleculeToRemove);
}
public void RemoveTransporterMoleculeContainer(TransporterMoleculeContainer transporterMoleculeToRemove) => RemoveChild(transporterMoleculeToRemove);

public IEnumerable<InteractionContainer> InteractionContainerCollection
{
get { return GetChildren<InteractionContainer>(); }
}
public IEnumerable<InteractionContainer> InteractionContainerCollection => GetChildren<InteractionContainer>();

public void AddInteractionContainer(InteractionContainer interactionContainer)
{
Add(interactionContainer);
}
public void AddInteractionContainer(InteractionContainer interactionContainer) => Add(interactionContainer);

public void RemoveInteractionContainer(InteractionContainer interactionContainer)
{
RemoveChild(interactionContainer);
}
public void RemoveInteractionContainer(InteractionContainer interactionContainer) => RemoveChild(interactionContainer);

public void AddUsedCalculationMethod(UsedCalculationMethod calculationMethod)
{
_usedCalculationMethods.Add(calculationMethod);
}
public void AddUsedCalculationMethod(UsedCalculationMethod calculationMethod) => _usedCalculationMethods.Add(calculationMethod);

public void AddUsedCalculationMethod(ICoreCalculationMethod calculationMethod)
{
AddUsedCalculationMethod(new UsedCalculationMethod(calculationMethod.Category, calculationMethod.Name));
}

public IEnumerable<UsedCalculationMethod> UsedCalculationMethods
{
get { return _usedCalculationMethods; }
}
public IEnumerable<UsedCalculationMethod> UsedCalculationMethods => _usedCalculationMethods;

public bool IsFloatingXenobiotic
{
get { return IsFloating && IsXenobiotic; }
}
public bool IsFloatingXenobiotic => IsFloating && IsXenobiotic;

public double? GetDefaultMoleculeStartValue()
{
Expand Down Expand Up @@ -177,18 +141,8 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone

public virtual Unit DisplayUnit
{
get
{
if (_displayUnit != null)
return _displayUnit;

return Dimension != null ? Dimension.DefaultUnit : null;
}
set
{
_displayUnit = value;
OnPropertyChanged(() => DisplayUnit);
}
get => _displayUnit ?? Dimension?.DefaultUnit;
set => SetProperty(ref _displayUnit, value);
}
}
}
21 changes: 6 additions & 15 deletions src/OSPSuite.Core/Domain/Builder/ReactionBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ public interface IReactionBuilder : IProcessBuilder
/// </summary>
public class ReactionBuilder : ProcessBuilder, IReactionBuilder
{
private readonly IList<IReactionPartnerBuilder> _educts;
private readonly IList<IReactionPartnerBuilder> _products;
private readonly IList<string> _modifier;
private readonly List<IReactionPartnerBuilder> _educts;
private readonly List<IReactionPartnerBuilder> _products;
private readonly List<string> _modifier;
public DescriptorCriteria ContainerCriteria { get; set; }

public ReactionBuilder()
Expand Down Expand Up @@ -83,15 +83,9 @@ public void AddProduct(IReactionPartnerBuilder product)
OnChanged();
}

public void RemoveEduct(IReactionPartnerBuilder educt)
{
_educts.Remove(educt);
}
public void RemoveEduct(IReactionPartnerBuilder educt) => _educts.Remove(educt);

public void RemoveProduct(IReactionPartnerBuilder product)
{
_products.Remove(product);
}
public void RemoveProduct(IReactionPartnerBuilder product) => _products.Remove(product);

public IEnumerable<string> ModifierNames => _modifier;

Expand All @@ -110,10 +104,7 @@ public void RemoveModifier(string modifierToRemove)
_modifier.Remove(modifierToRemove);
}

public void ClearModifiers()
{
_modifier.Clear();
}
public void ClearModifiers() => _modifier.Clear();

public IReactionPartnerBuilder EductBy(string moleculeName)
{
Expand Down
5 changes: 4 additions & 1 deletion src/OSPSuite.Core/Domain/DistributedParameter.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using OSPSuite.Core.Domain.Formulas;
using OSPSuite.Core.Domain.Descriptors;
using OSPSuite.Core.Domain.Formulas;
using OSPSuite.Core.Domain.Services;
using OSPSuite.Core.Maths.Random;
using OSPSuite.Utility.Extensions;
Expand All @@ -24,6 +25,7 @@ public class DistributedParameter : QuantityAndContainer, IDistributedParameter
public ParameterInfo Info { get; set; }
public ParameterOrigin Origin { get; private set; }
public double? DefaultValue { get; set; }
public DescriptorCriteria ContainerCriteria { get; set; }

/// <inheritdoc />
public bool IsDefault { get; set; }
Expand Down Expand Up @@ -154,6 +156,7 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone
DefaultValue = sourceDistributedParameter.DefaultValue;
Origin = sourceDistributedParameter.Origin.Clone();
IsDefault = sourceDistributedParameter.IsDefault;
ContainerCriteria = sourceDistributedParameter.ContainerCriteria?.Clone();
}

#region Parameter Info
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,12 @@ private void createApplication(IApplicationBuilder applicationBuilder, IEventGro
//---- add molecule amounts
foreach (var appMolecule in applicationBuilder.Molecules)
{
var molecule = _moleculeMapper.MapFrom(molecules[applicationBuilder.MoleculeName], buildConfiguration);
molecule.Formula = _formulaMapper.MapFrom(appMolecule.Formula, buildConfiguration);

//get container for the molecule
var moleculeContainer = appMolecule.RelativeContainerPath.Resolve<IContainer>(eventGroup);

var molecule = _moleculeMapper.MapFrom(molecules[applicationBuilder.MoleculeName], moleculeContainer, buildConfiguration);
molecule.Formula = _formulaMapper.MapFrom(appMolecule.Formula, buildConfiguration);

moleculeContainer.Add(molecule);

addVolumeParameterTo(moleculeContainer);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using OSPSuite.Core.Domain.Builder;
using System.Linq;
using OSPSuite.Core.Domain.Builder;
using OSPSuite.Core.Domain.Formulas;
using OSPSuite.Core.Domain.Services;
using OSPSuite.Core.Domain.UnitSystem;
using OSPSuite.Utility.Extensions;

namespace OSPSuite.Core.Domain.Mappers
{
Expand All @@ -14,23 +16,35 @@ namespace OSPSuite.Core.Domain.Mappers
/// <para></para>
/// (by the global molecule properties mapper)
/// </summary>
public interface IMoleculeBuilderToMoleculeAmountMapper : IBuilderMapper<IMoleculeBuilder, IMoleculeAmount>
public interface IMoleculeBuilderToMoleculeAmountMapper
{
/// <summary>
/// Maps the <paramref name="moleculeBuilder" /> to a MoleculeAmount. <paramref name="targetContainer" /> is where the
/// molecule amount will be added to.
/// </summary>
/// <param name="moleculeBuilder">Molecule builder to map to a MoleculeAmount</param>
/// <param name="targetContainer">
/// Container where the molecule amount will be added. This is required in order to evaluate
/// local parameters container criteria
/// </param>
/// <param name="buildConfiguration">Build configuration</param>
/// <returns></returns>
IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IContainer targetContainer, IBuildConfiguration buildConfiguration);
}

public class MoleculeBuilderToMoleculeAmountMapper : IMoleculeBuilderToMoleculeAmountMapper
{
private readonly IObjectBaseFactory _objectBaseFactory;
private readonly IFormulaBuilderToFormulaMapper _formulaMapper;
private readonly IParameterBuilderCollectionToParameterCollectionMapper _parameterMapper;
private readonly IParameterBuilderToParameterMapper _parameterMapper;
private readonly IKeywordReplacerTask _keywordReplacerTask;
private readonly IFormulaFactory _formulaFactory;
private readonly IParameterFactory _parameterFactory;
private readonly IDimension _amountDimension;

public MoleculeBuilderToMoleculeAmountMapper(IObjectBaseFactory objectBaseFactory,
IFormulaBuilderToFormulaMapper formulaMapper,
IParameterBuilderCollectionToParameterCollectionMapper parameterMapper,
IParameterBuilderToParameterMapper parameterMapper,
IDimensionFactory dimensionFactory, IKeywordReplacerTask keywordReplacerTask, IFormulaFactory formulaFactory,
IParameterFactory parameterFactory)
{
Expand All @@ -43,7 +57,7 @@ public MoleculeBuilderToMoleculeAmountMapper(IObjectBaseFactory objectBaseFactor
_amountDimension = dimensionFactory.Dimension(Constants.Dimension.MOLAR_AMOUNT);
}

public IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IBuildConfiguration buildConfiguration)
public IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IContainer targetContainer, IBuildConfiguration buildConfiguration)
{
//molecule amount always in amount
var moleculeAmount = _objectBaseFactory.Create<IMoleculeAmount>()
Expand All @@ -62,7 +76,11 @@ public IMoleculeAmount MapFrom(IMoleculeBuilder moleculeBuilder, IBuildConfigura
//map parameters. Only parameters having BuildMode="Local" will
//be added to the molecule amount. Global/Property-Parameters
//will be filled in elsewhere (by the GlobalProperties-Mapper)
moleculeAmount.AddChildren(_parameterMapper.MapLocalFrom(moleculeBuilder, buildConfiguration));
var allLocalParameters = moleculeBuilder.Parameters
.Where(x => x.BuildMode == ParameterBuildMode.Local)
.Where(x => x.ContainerCriteria?.IsSatisfiedBy(targetContainer) ?? true);

allLocalParameters.Each(x => moleculeAmount.Add(_parameterMapper.MapFrom(x, buildConfiguration)));

_keywordReplacerTask.ReplaceIn(moleculeAmount);
return moleculeAmount;
Expand All @@ -85,7 +103,7 @@ private void createMoleculeAmountDefaultFormula(IMoleculeBuilder moleculeBuilder

//create a start value parameter that will be referenced in the molecule formula
var startValueParameter = _parameterFactory.CreateStartValueParameter(moleculeAmount, modelFormula, moleculeBuilder.DisplayUnit);
buildConfiguration.AddBuilderReference(startValueParameter,moleculeBuilder);
buildConfiguration.AddBuilderReference(startValueParameter, moleculeBuilder);
moleculeAmount.Add(startValueParameter);
moleculeAmount.Formula = _formulaFactory.CreateMoleculeAmountReferenceToStartValue(startValueParameter);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public ParameterBuilderToParameterMapper(ICloneManagerForModel cloneManagerForMo
public IParameter MapFrom(IParameter parameterBuilder, IBuildConfiguration buildConfiguration)
{
var parameter = _cloneManagerForModel.Clone(parameterBuilder);
//We reset the container criteria explicitly in the model instance
parameter.ContainerCriteria = null;
buildConfiguration.AddBuilderReference(parameter, parameterBuilder);
return parameter;
}
Expand Down
9 changes: 9 additions & 0 deletions src/OSPSuite.Core/Domain/Parameter.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using OSPSuite.Assets;
using OSPSuite.Core.Domain.Descriptors;
using OSPSuite.Core.Domain.Formulas;
using OSPSuite.Core.Domain.Services;
using OSPSuite.Core.Maths.Random;
Expand Down Expand Up @@ -92,6 +93,11 @@ public interface IParameter : IQuantity, IWithDefaultState
/// Sets the RHS Formula to NULL. This is required for R-Only in order to be able to set the RHS formula to NULL
/// </summary>
void ClearRHSFormula();

/// <summary>
/// Criteria for containers where parameter should be created. This is only useful in builder and is not used in parameter instances
/// </summary>
DescriptorCriteria ContainerCriteria { set; get; }
}

public class Parameter : Quantity, IParameter
Expand All @@ -102,6 +108,8 @@ public class Parameter : Quantity, IParameter
public virtual ParameterOrigin Origin { get; private set; }
public virtual double? DefaultValue { get; set; }

public DescriptorCriteria ContainerCriteria { set; get; }

/// <inheritdoc />
public bool IsDefault { get; set; }

Expand Down Expand Up @@ -136,6 +144,7 @@ public override void UpdatePropertiesFrom(IUpdatable source, ICloneManager clone
Origin = sourceParameter.Origin.Clone();
DefaultValue = sourceParameter.DefaultValue;
IsDefault = sourceParameter.IsDefault;
ContainerCriteria = sourceParameter.ContainerCriteria?.Clone();
}

public double RandomDeviateIn(RandomGenerator randomGenerator, double? min = null, double? max = null)
Expand Down
31 changes: 8 additions & 23 deletions src/OSPSuite.Core/Domain/Reaction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ public interface IReaction : IProcess

public class Reaction : Process, IReaction
{
private readonly IList<IReactionPartner> _educts;
private readonly IList<IReactionPartner> _products;
private readonly IList<string> _modifier;
private readonly List<IReactionPartner> _educts;
private readonly List<IReactionPartner> _products;
private readonly List<string> _modifier;

public Reaction()
{
Expand All @@ -63,10 +63,7 @@ public Reaction()
Icon = IconNames.REACTION;
}

public IEnumerable<IReactionPartner> Educts
{
get { return _educts; }
}
public IEnumerable<IReactionPartner> Educts => _educts;

public void AddModifier(string modifierName)
{
Expand All @@ -77,29 +74,17 @@ public void AddModifier(string modifierName)
/// Adds the educt to the reactions educt list.
/// </summary>
/// <param name="newEduct">The new educt.</param>
public void AddEduct(IReactionPartner newEduct)
{
_educts.Add(newEduct);
}
public void AddEduct(IReactionPartner newEduct) => _educts.Add(newEduct);

public IEnumerable<IReactionPartner> Products
{
get { return _products; }
}
public IEnumerable<IReactionPartner> Products => _products;

public IEnumerable<string> ModifierNames
{
get { return _modifier; }
}
public IEnumerable<string> ModifierNames => _modifier;

/// <summary>
/// Adds the product to the reactions product list.
/// </summary>
/// <param name="newProduct">The new product.</param>
public void AddProduct(IReactionPartner newProduct)
{
_products.Add(newProduct);
}
public void AddProduct(IReactionPartner newProduct) => _products.Add(newProduct);

public override bool Uses(IMoleculeAmount amount)
{
Expand Down
Loading

0 comments on commit bd9d149

Please sign in to comment.