Program Listing for File LoggingConfig.cu

Return to documentation for file (src/flamegpu/simulation/LoggingConfig.cu)

#include "flamegpu/simulation/LoggingConfig.h"

#include <utility>
#include <string>

#include "flamegpu/simulation/AgentLoggingConfig.h"
#include "flamegpu/model/ModelDescription.h"
#include "flamegpu/model/ModelData.h"
#include "flamegpu/model/AgentData.h"
#include "flamegpu/model/EnvironmentData.h"

namespace flamegpu {

LoggingConfig::LoggingConfig(const ModelDescription &_model)
    :model(_model.model->clone())
    , log_timing(false) { }
LoggingConfig::LoggingConfig(const ModelData &_model)
    :model(_model.clone())
    , log_timing(false) { }
LoggingConfig::LoggingConfig(const LoggingConfig &other)
    : model(other.model->clone())
    , environment(other.environment)
    , agents(other.agents)
    , log_timing(other.log_timing) { }
AgentLoggingConfig LoggingConfig::agent(const std::string &agent_name, const std::string &agent_state) {
    // Validate the agent state combination exists
    auto model_agent_it = model->agents.find(agent_name);
    if (model_agent_it == model->agents.end()) {
        THROW exception::InvalidAgentName("Agent '%s' was not found in the model description, "
            "in LoggingConfig::agent()\n",
            agent_name.c_str());
    }
    if (model_agent_it->second->states.find(agent_state) == model_agent_it->second->states.end()) {
        THROW exception::InvalidAgentState("State '%s' was not found within agent '%s' in the model description, "
            "in LoggingConfig::agent()\n",
            agent_state.c_str(), agent_name.c_str());
    }
    util::StringPair name = std::make_pair(agent_name, agent_state);
    auto agent_it = agents.find(name);
    if (agent_it== agents.end())
        agent_it = agents.emplace(name, std::make_pair(std::make_shared<std::set<NameReductionFn>>(), false)).first;
    return AgentLoggingConfig(model_agent_it->second, agent_it->second);
}

void LoggingConfig::logEnvironment(const std::string &property_name) {
    // Validate the environment property exists
    const auto &env_map = model->environment->properties;
    if (env_map.find(property_name) == env_map.end()) {
        THROW exception::InvalidEnvProperty("Environment property '%s' was not found in the model description, "
            "in LoggingConfig::logEnvironment()\n",
            property_name.c_str());
    }
    // Log the property
    if (!environment.emplace(property_name).second) {
        THROW exception::InvalidEnvProperty("Environment property '%s' has already been marked for logging, "
            "in LoggingConfig::logEnvironment()\n",
            property_name.c_str());
    }
}
void LoggingConfig::logTiming(bool doLogTiming) {
    log_timing = doLogTiming;
}
StepLoggingConfig::StepLoggingConfig(const ModelDescription &model)
    : LoggingConfig(model)
    , frequency(1) { }
StepLoggingConfig::StepLoggingConfig(const ModelData &model)
    : LoggingConfig(model)
    , frequency(1) { }
StepLoggingConfig::StepLoggingConfig(const StepLoggingConfig &other)
    : LoggingConfig(other)
    , frequency(other.frequency) { }
StepLoggingConfig::StepLoggingConfig(const LoggingConfig &other)
    : LoggingConfig(other)
    , frequency(1) { }
void StepLoggingConfig::setFrequency(const unsigned int steps) {
    frequency = steps;
}

}  // namespace flamegpu