public ParameterValue[] CreateIndividual(OriginData matlabOriginData, IEnumerable <MoleculeOntogeny> moleculeOntogenies) { var originData = originDataFrom(matlabOriginData); var individual = _individualFactory.CreateAndOptimizeFor(originData); var individualProperties = _individualValuesMapper.MapFrom(individual); var allIndividualParameters = individualProperties.ParameterValues.ToList(); allIndividualParameters.AddRange(_ontogenyFactorsRetriever.FactorsFor(originData, moleculeOntogenies)); return(allIndividualParameters.ToArray()); }
public CreateIndividualResults CreateIndividual(IndividualCharacteristics individualCharacteristics) { var originData = originDataFrom(individualCharacteristics); var moleculeOntogenies = individualCharacteristics.MoleculeOntogenies; var individual = _individualFactory.CreateAndOptimizeFor(originData, individualCharacteristics.Seed); var individualProperties = _individualValuesMapper.MapFrom(individual); var allIndividualParameters = individualProperties.ParameterValues; var ontogenyParameters = _ontogenyFactorsRetriever.FactorsFor(originData, moleculeOntogenies).Select(x => new ParameterValueWithUnit(x)); var allDistributedParameterCache = _containerTask.CacheAllChildren <IDistributedParameter>(individual); var allIndividualParametersCache = _containerTask.CacheAllChildren <IParameter>(individual); var distributedParameters = new Cache <string, ParameterValueWithUnit>(x => x.ParameterPath); var derivedParameters = new List <ParameterValueWithUnit>(); //Add Age and Height parameter that is not distributed at the moment if (originData.Population.IsAgeDependent) { distributedParameters.Add(parameterValueFrom(individual.Organism.Parameter(CoreConstants.Parameters.AGE))); distributedParameters.Add(parameterValueFrom(individual.Organism.Parameter(Constants.Parameters.GESTATIONAL_AGE))); } if (originData.Population.IsHeightDependent) { distributedParameters.Add(parameterValueFrom(individual.Organism.Parameter(CoreConstants.Parameters.HEIGHT))); } distributedParameters.Add(parameterValueFrom(individual.Organism.Parameter(CoreConstants.Parameters.ONTOGENY_FACTOR_AGP))); distributedParameters.Add(parameterValueFrom(individual.Organism.Parameter(CoreConstants.Parameters.ONTOGENY_FACTOR_ALBUMIN))); foreach (var individualParameter in allIndividualParameters) { var parameter = allIndividualParametersCache[individualParameter.ParameterPath]; if (parameter == null) { continue; } var parameterValue = new ParameterValueWithUnit(individualParameter, parameter?.BaseUnitName()); if (allDistributedParameterCache.Contains(individualParameter.ParameterPath)) { distributedParameters.Add(parameterValue); } //Do not add parameters that were added specifically else if (!distributedParameters.Contains(individualParameter.ParameterPath)) { derivedParameters.Add(parameterValue); } } //add Ontogeny parameters distributedParameters.AddRange(ontogenyParameters); return(new CreateIndividualResults(distributedParameters.ToArray(), derivedParameters.ToArray(), individual.Seed)); }
public Task <RandomPopulation> CreateFor(RandomPopulationSettings populationSettings, CancellationToken cancellationToken, int?seed = null, bool addMoleculeParametersVariability = true) { return(Task.Run(() => { using (var progressUpdater = _progressManager.Create()) { var randomPopulation = createPopulationFor(populationSettings, seed); fllUpGenderQueueBasedOn(populationSettings); progressUpdater.Initialize(populationSettings.NumberOfIndividuals, PKSimConstants.UI.CreatingPopulation); //the base individual is used to retrieve the default values. var baseIndividual = populationSettings.BaseIndividual; //current individual defined as a clone of the based individual. The current individual will be the one varying var currentIndividual = _cloner.Clone(populationSettings.BaseIndividual); //cache containing all parameters changed by the create individual from the current individual. This will be used just as reference to the current parameters var allChangedByCreatedIndividualParameters = getAllCreateIndividualParametersFrom(currentIndividual); //all distributed parameters. This will be used to update the distribution for the current individual var allDistributedParameters = getAllDistributedParametersFrom(currentIndividual); var allBaseDistributedParameters = getAllDistributedParametersFrom(baseIndividual); //all individual parameters. Just an optimization to avoid call GetAllChildren for each individual var allIndividualParameters = currentIndividual.GetAllChildren <IParameter>().ToList(); int maxTotalIterations = populationSettings.NumberOfIndividuals * _maxIterations; uint numberOfTry = 0; var currentGender = _genderQueue.Dequeue(); do { cancellationToken.ThrowIfCancellationRequested(); numberOfTry++; //could not create one item in max Iteration try=>exit if (numberOfTry > _maxIterations && randomPopulation.NumberOfItems == 0) { throw new CannotCreatePopulationWithConstraintsException(_reportGenerator.StringReportFor(populationSettings)); } //create a new individual based on population settings defined by the user updateCurrentIndividualFromSettings(populationSettings, currentIndividual, allDistributedParameters, allBaseDistributedParameters, currentGender, randomPopulation.RandomGenerator); bool success = tryRandomize(currentIndividual, populationSettings, allIndividualParameters, randomPopulation.RandomGenerator); if (!success) { continue; } randomPopulation.AddIndividualValues(_individualValuesMapper.MapFrom(currentIndividual, allChangedByCreatedIndividualParameters)); currentGender = _genderQueue.Dequeue(); progressUpdater.IncrementProgress(PKSimConstants.UI.CreatingIndividualInPopulation(randomPopulation.NumberOfItems, populationSettings.NumberOfIndividuals)); } while (randomPopulation.NumberOfItems < populationSettings.NumberOfIndividuals && numberOfTry < maxTotalIterations); if (numberOfTry >= maxTotalIterations) { throw new CannotCreatePopulationWithConstraintsException(_reportGenerator.StringReportFor(populationSettings)); } if (addMoleculeParametersVariability) { _moleculeParameterVariabilityCreator.AddVariabilityTo(randomPopulation); } _moleculeOntogenyVariabilityUpdater.UpdateAllOntogenies(randomPopulation); randomPopulation.IsLoaded = true; return randomPopulation; } }, cancellationToken)); }