public ICommand ExtractIndividualsFromPopulationCommand(Population population, IndividualExtractionOptions individualExtractionOptions) { if (population.IsAnImplementationOf <MoBiPopulation>()) { throw new PKSimException(PKSimConstants.Error.CannotExtractIndividualFrom(_executionContext.TypeFor(population))); } var allPopulationParameters = population.AllVectorialParameters(_entityPathResolver).ToList(); var allDistributedParameters = allPopulationParameters.Where(x => x.Formula.IsDistributed()).ToList(); var allConstantParameters = allPopulationParameters.Where(x => x.Formula.IsConstant()).ToList(); var allRemainingParameters = allPopulationParameters.Except(allConstantParameters).Except(allDistributedParameters); //Update constant parameters first, then distributed and last all others. This ensures that formula parameters in the extracted individuals are not updated with a constant value var allParametersOrderedByFormulaType = allConstantParameters.Union(allDistributedParameters).Union(allRemainingParameters).ToList(); var addCommands = individualExtractionOptions.IndividualIds.Distinct() .Select(individualId => extractIndividualFrom(population, individualId, allParametersOrderedByFormulaType, individualExtractionOptions)) .ToList(); var overallCommand = new PKSimMacroCommand { CommandType = PKSimConstants.Command.CommandTypeAdd, ObjectType = PKSimConstants.ObjectTypes.Population, Description = PKSimConstants.Command.ExtractingIndividualsDescription(population.Name), BuildingBlockName = population.Name, BuildingBlockType = PKSimConstants.ObjectTypes.Population }; overallCommand.AddRange(addCommands); return(overallCommand); }
private ICommand macroCommandFrom(Population population, ICommand baseCommand, IEnumerable <ICommand> commands) { var macroCommand = new PKSimMacroCommand { ObjectType = baseCommand.ObjectType, Description = baseCommand.Description, CommandType = baseCommand.CommandType }; macroCommand.AddRange(commands); _executionContext.UpdateBuildingBlockPropertiesInCommand(macroCommand, population); return(macroCommand); }