protected IFormulaUsablePath CreateAlwaysAbsolutePaths(IObjectBase objectBase, IFormulaUsable formulaUsable) { if (formulaUsable.IsAtMolecule()) { return(_objectPathFactory.CreateAbsoluteFormulaUsablePath(formulaUsable)); } return(CreateFormulaUsablePathFrom(new[] { getReactionNameFor(formulaUsable), objectBase.Name }, formulaUsable)); }
protected override void Context() { var organism = new Container().WithName("Organism"); _objectPathFactory = new ObjectPathFactory(new AliasCreator()); _fuParameter = new Parameter().WithName("fu").WithValue(0.5); organism.Add(_fuParameter); var liver = new Container().WithName("Liver").WithParentContainer(organism); var liverVolume = new Parameter().WithName("Volume").WithValue(10).WithParentContainer(liver); var f_vas_liver = new Parameter().WithName("f_vas").WithValue(0.1); liver.Add(f_vas_liver); var kidney = new Container().WithName("Kidney").WithParentContainer(organism); var kidneyVolume = new Parameter().WithName("Volume").WithValue(20).WithParentContainer(kidney); kidney.Add(new Parameter().WithName("f_vas").WithValue(0.2)); sut = new SumFormula(); sut.Criteria = Create.Criteria(x => x.With("Volume")); sut.Variable = "V"; sut.FormulaString = "fu * V_#i * f_vas_#i"; sut.AddObjectPath(_objectPathFactory.CreateRelativeFormulaUsablePath(liverVolume, f_vas_liver).WithAlias("f_vas_#i")); sut.AddObjectPath(_objectPathFactory.CreateAbsoluteFormulaUsablePath(_fuParameter).WithAlias("fu")); sut.Dimension = new Dimension(new BaseDimensionRepresentation(), "dim1", "unit1"); _allFormulaUsable = organism.GetAllChildren <IFormulaUsable>().ToEntityDescriptorMapList(); _objectBaseFactory = A.Fake <IObjectBaseFactory>(); A.CallTo(() => _objectBaseFactory.Create <ExplicitFormula>()).Returns(new ExplicitFormula()); }
private void addDynamicVariablesToFormula(ExplicitFormula explicitFormula, StringBuilder stringBuilder, IFormulaUsable formulaUsable, int index0, IObjectPathFactory objectPathFactory) { string index1 = $"{index0 + 1}"; string currentVariable = $"{Variable}_{index1}"; //replace current variable in formula string and add reference to the explicit formula string formulaStringPart = FormulaString.Replace(VariablePattern, currentVariable); explicitFormula.AddObjectPath(objectPathFactory.CreateAbsoluteFormulaUsablePath(formulaUsable).WithAlias(currentVariable)); foreach (var objectPath in ObjectPaths) { if (explicitFormula.ObjectPaths.Contains(objectPath)) { continue; } if (objectPath.Alias.Contains(_iterationPattern)) { bool success; var referenceVariable = objectPath.TryResolve <IFormulaUsable>(formulaUsable, out success); if (!success) { throw new UnableToResolvePathException(objectPath, formulaUsable); } var referenceAlias = objectPath.Alias.Replace(_iterationPattern, index1); formulaStringPart = formulaStringPart.Replace(objectPath.Alias, referenceAlias); explicitFormula.AddObjectPath(objectPathFactory.CreateAbsoluteFormulaUsablePath(referenceVariable).WithAlias(referenceAlias)); } else { //it is an usable path that is not dynamic. Simply add it explicitFormula.AddObjectPath(objectPath); } } stringBuilder.Append(formulaStringPart); }
private IFormulaUsablePath createFormulaUsablePath(IContainer container, string usableName, string alias) { return(_objectPathFactory.CreateAbsoluteFormulaUsablePath(container.GetSingleChildByName <IFormulaUsable>(usableName)).WithAlias(alias)); }