Skip to content

Commit

Permalink
number of colonies to statistics added
Browse files Browse the repository at this point in the history
  • Loading branch information
chrxh committed Jun 16, 2024
1 parent 4003be8 commit fbef848
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 11 deletions.
2 changes: 1 addition & 1 deletion source/EngineGpuKernels/CellProcessor.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@ __inline__ __device__ void CellProcessor::decay(SimulationData& data)
}

auto cellMaxAge = cudaSimulationParameters.cellMaxAge[cell->color];
if (cudaSimulationParameters.features.cellAgeLimiter && cudaSimulationParameters.cellInactiveMaxAgeActivated /*&& cell->mutationId != 0*/
if (cudaSimulationParameters.features.cellAgeLimiter && cudaSimulationParameters.cellInactiveMaxAgeActivated && cell->mutationId != 0
&& cell->cellFunctionUsed == CellFunctionUsed_No && cell->livingState == LivingState_Ready && cell->activationTime == 0) {
bool adjacentCellsUsed = false;
for (int i = 0; i < cell->numConnections; ++i) {
Expand Down
33 changes: 31 additions & 2 deletions source/EngineGpuKernels/SimulationStatistics.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ public:
__host__ void init()
{
CudaMemoryManager::getInstance().acquireMemory<RawStatisticsData>(1, _data);
CudaMemoryManager::getInstance().acquireMemory<ColorCount>(MutantToColorCountMapSize, _mutantToColorCountMap);
CHECK_FOR_CUDA_ERROR(cudaMemset(_data, 0, sizeof(RawStatisticsData)));
}

__host__ void free()
{
CudaMemoryManager::getInstance().freeMemory(_data);
CudaMemoryManager::getInstance().freeMemory(_mutantToColorCountMap);
}

__host__ RawStatisticsData getStatistics()
Expand All @@ -30,7 +32,13 @@ public:
//timestep statistics
__inline__ __device__ void resetTimestepData()
{
_data->timeline.timestep = TimestepStatistics();
if (threadIdx.x == 0 && blockIdx.x == 0) {
_data->timeline.timestep = TimestepStatistics();
}
auto partition = calcAllThreadsPartition(MutantToColorCountMapSize);
for (int index = partition.startIndex; index <= partition.endIndex; ++index) {
_mutantToColorCountMap[index].count = 0;
}
}

__inline__ __device__ void incNumCells(int color) { atomicAdd(&(_data->timeline.timestep.numCells[color]), 1); }
Expand All @@ -43,12 +51,26 @@ public:
{
alienAtomicAdd64(&_data->timeline.timestep.numGenomeCells[color], valueToAdd);
}
__inline__ __device__ void incMutant(int color, uint32_t mutationId)
{
atomicAdd(&_mutantToColorCountMap[mutationId % MutantToColorCountMapSize].count, 1);
atomicExch(&_mutantToColorCountMap[mutationId % MutantToColorCountMapSize].color, color);
}
__inline__ __device__ void halveNumConnections()
{
for (int i = 0; i < MAX_COLORS; ++i) {
_data->timeline.timestep.numConnections[i] /= 2;
}
}
__inline__ __device__ void calcColonies()
{
auto partition = calcAllThreadsPartition(MutantToColorCountMapSize);
for (int index = partition.startIndex; index <= partition.endIndex; ++index) {
if (_mutantToColorCountMap[index].count > 10) {
atomicAdd(&_data->timeline.timestep.numColonies[_mutantToColorCountMap[index].color], 1);
}
}
}

//accumulated statistics
__host__ void resetAccumulatedStatistics()
Expand Down Expand Up @@ -99,6 +121,13 @@ public:

private:
RawStatisticsData* _data;
uint32_t* _mutantToColorCountMap;

static auto constexpr MutantToColorCountMapSize = 1 << 20;
struct ColorCount
{
uint32_t color;
uint32_t count;
};
ColorCount* _mutantToColorCountMap;
};

6 changes: 5 additions & 1 deletion source/EngineGpuKernels/StatisticsKernels.cu
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ __global__ void cudaUpdateTimestepStatistics_substep2(SimulationData data, Simul
statistics.addEnergy(cell->color, cell->energy);
if (cell->cellFunction == CellFunction_Constructor && GenomeDecoder::containsSelfReplication(cell->cellFunctionData.constructor)) {
statistics.incNumReplicator(cell->color);
statistics.incMutant(cell->color, cell->mutationId);
auto numNodes = GenomeDecoder::getNumNodesRecursively(cell->cellFunctionData.constructor.genome, cell->cellFunctionData.constructor.genomeSize, true, true);
statistics.addNumGenomeNodes(cell->color, numNodes);
}
Expand All @@ -42,7 +43,10 @@ __global__ void cudaUpdateTimestepStatistics_substep2(SimulationData data, Simul

__global__ void cudaUpdateTimestepStatistics_substep3(SimulationData data, SimulationStatistics statistics)
{
statistics.halveNumConnections();
if (threadIdx.x == 0 && blockIdx.x == 0) {
statistics.halveNumConnections();
}
statistics.calcColonies();
}

__global__ void cudaUpdateHistogramData_substep1(SimulationData data, SimulationStatistics statistics)
Expand Down
4 changes: 2 additions & 2 deletions source/EngineGpuKernels/StatisticsKernelsLauncher.cu
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

void _StatisticsKernelsLauncher::updateStatistics(GpuSettings const& gpuSettings, SimulationData const& data, SimulationStatistics const& simulationStatistics)
{
KERNEL_CALL_1_1(cudaUpdateTimestepStatistics_substep1, data, simulationStatistics);
KERNEL_CALL(cudaUpdateTimestepStatistics_substep1, data, simulationStatistics);
KERNEL_CALL(cudaUpdateTimestepStatistics_substep2, data, simulationStatistics);
KERNEL_CALL_1_1(cudaUpdateTimestepStatistics_substep3, data, simulationStatistics);
KERNEL_CALL(cudaUpdateTimestepStatistics_substep3, data, simulationStatistics);
KERNEL_CALL_1_1(cudaUpdateHistogramData_substep1, data, simulationStatistics);
KERNEL_CALL(cudaUpdateHistogramData_substep2, data, simulationStatistics);
KERNEL_CALL(cudaUpdateHistogramData_substep3, data, simulationStatistics);
Expand Down
2 changes: 2 additions & 0 deletions source/EngineInterface/DataPointCollection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ DataPointCollection DataPointCollection::operator+(DataPointCollection const& ot
result.time = time + other.time;
result.numCells = numCells + other.numCells;
result.numSelfReplicators = numSelfReplicators + other.numSelfReplicators;
result.numColonies = numColonies + other.numColonies;
result.numViruses = numViruses + other.numViruses;
result.numConnections = numConnections + other.numConnections;
result.numParticles = numParticles + other.numParticles;
Expand Down Expand Up @@ -54,6 +55,7 @@ DataPointCollection DataPointCollection::operator/(double divisor) const
result.time = time / divisor;
result.numCells = numCells / divisor;
result.numSelfReplicators = numSelfReplicators / divisor;
result.numColonies = numColonies / divisor;
result.numViruses = numViruses / divisor;
result.numConnections = numConnections / divisor;
result.numParticles = numParticles / divisor;
Expand Down
1 change: 1 addition & 0 deletions source/EngineInterface/DataPointCollection.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ struct DataPointCollection

DataPoint numCells;
DataPoint numSelfReplicators;
DataPoint numColonies;
DataPoint numViruses;
DataPoint numConnections;
DataPoint numParticles;
Expand Down
1 change: 1 addition & 0 deletions source/EngineInterface/RawStatisticsData.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ struct TimestepStatistics
{
ColorVector<int> numCells = {0, 0, 0, 0, 0, 0, 0};
ColorVector<int> numSelfReplicators = {0, 0, 0, 0, 0, 0, 0};
ColorVector<int> numColonies = {0, 0, 0, 0, 0, 0, 0};
ColorVector<int> numViruses = {0, 0, 0, 0, 0, 0, 0};
ColorVector<int> numConnections = {0, 0, 0, 0, 0, 0, 0};
ColorVector<int> numParticles = {0, 0, 0, 0, 0, 0, 0};
Expand Down
1 change: 1 addition & 0 deletions source/EngineInterface/StatisticsConverterService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ DataPointCollection StatisticsConverterService::convert(
result.time = time;
result.numCells = getDataPointForTimestepProperty(data.timestep.numCells);
result.numSelfReplicators = getDataPointForTimestepProperty(data.timestep.numSelfReplicators);
result.numColonies = getDataPointForTimestepProperty(data.timestep.numColonies);
result.numViruses = getDataPointForTimestepProperty(data.timestep.numViruses);
result.numConnections = getDataPointForTimestepProperty(data.timestep.numConnections);
result.numParticles = getDataPointForTimestepProperty(data.timestep.numParticles);
Expand Down
14 changes: 9 additions & 5 deletions source/Gui/StatisticsWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,12 @@ void _StatisticsWindow::processTimelineStatistics()
ImGui::TableSetColumnIndex(1);
AlienImGui::Text("Self-replicators");

ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
processPlot(row++, &DataPointCollection::numColonies);
ImGui::TableSetColumnIndex(1);
AlienImGui::Text("Colonies");

ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
processPlot(row++, &DataPointCollection::averageGenomeCells, 2);
Expand Down Expand Up @@ -426,11 +432,9 @@ void _StatisticsWindow::processBackground()
auto timestep = _simController->getCurrentTimestep();

auto timepoint = std::chrono::steady_clock::now();
if (!_liveStatisticsDataTimepoint) {
_liveStatisticsDataTimepoint = timepoint;
}
auto duration = static_cast<int>(std::chrono::duration_cast<std::chrono::milliseconds>(timepoint - *_liveStatisticsDataTimepoint).count());
if (duration > LiveStatisticsDeltaTime) {
auto duration = _liveStatisticsDataTimepoint.has_value()
? static_cast<int>(std::chrono::duration_cast<std::chrono::milliseconds>(timepoint - *_liveStatisticsDataTimepoint).count()) : 0;
if (!_liveStatisticsDataTimepoint || duration > LiveStatisticsDeltaTime) {
_lastStatisticsData = _simController->getRawStatistics();
_liveStatistics.add(_lastStatisticsData->timeline, timestep, toDouble(duration) / 1000);
_liveStatisticsDataTimepoint = timepoint;
Expand Down

0 comments on commit fbef848

Please sign in to comment.