diff --git a/data_storage.cpp b/data_storage.cpp index daef44f3d3156575c1de3665abf209a87bf96c17..c82b64998b5926e01c305e8bde19751cd515db87 100644 --- a/data_storage.cpp +++ b/data_storage.cpp @@ -41,6 +41,21 @@ DataStorage::DataStorage( buffered_spikes_.reserve(32 * 1024 * 1024 / sizeof(Spike)); // Reserve 32mb } +void DataStorage::AddNeuronId(uint64_t neuron_id) { + std::unique_lock<std::mutex> lock(neuron_ids_mutex_); + const auto insert_position = + std::lower_bound(neuron_ids_.begin(), neuron_ids_.end(), neuron_id); + if (insert_position == neuron_ids_.end() || *insert_position != neuron_id) { + neuron_ids_.insert(insert_position, neuron_id); + } +} + +std::vector<uint64_t> DataStorage::GetNeuronIds() { + std::unique_lock<std::mutex> lock(neuron_ids_mutex_); + std::vector<uint64_t> temp_neuron_ids = neuron_ids_; + return temp_neuron_ids; +} + void DataStorage::AddSpike(double simulation_time, std::uint64_t gid) { std::unique_lock<std::mutex> lock(spike_mutex_); constexpr auto spike_occured_before = [](const Spike& lhs, const Spike& rhs) { @@ -95,27 +110,31 @@ void DataStorage::Flush() { // buffered_spikes_.clear(); } -void DataStorage::AddMultimeterMeasurement(std::uint64_t device_id, - const std::string& attribute_name, const double simulation_time, - const std::uint64_t gid, const double value) { +void DataStorage::AddMultimeterMeasurement(std::uint64_t device_id, + const std::string& attribute_name, + const double simulation_time, + const std::uint64_t gid, + const double value) { std::unique_lock<std::mutex> lock(measurement_mutex_); auto& measurement = buffered_measurements_[device_id][attribute_name]; auto& simulation_times = measurement.simulation_times; auto& gids = measurement.gids; auto& values = measurement.values; - auto time_iterator = std::lower_bound(simulation_times.begin(), - simulation_times.end(), simulation_time); + auto time_iterator = std::lower_bound( + simulation_times.begin(), simulation_times.end(), simulation_time); auto time_index = std::distance(simulation_times.begin(), time_iterator); - if (time_iterator == simulation_times.end() || + if (time_iterator == simulation_times.end() || *time_iterator != simulation_time) { simulation_times.insert(time_iterator, simulation_time); - - auto new_values = std::vector<double>(simulation_times.size() * gids.size(), 0.0); + + auto new_values = + std::vector<double>(simulation_times.size() * gids.size(), 0.0); for (std::size_t t = 0; t < simulation_times.size(); ++t) for (std::size_t g = 0; g < gids.size(); ++g) if (t != time_index) - new_values[t * gids.size() + g] = values[(t > time_index ? t - 1 : t) * gids.size() + g]; + new_values[t * gids.size() + g] = + values[(t > time_index ? t - 1 : t) * gids.size() + g]; values = new_values; } @@ -123,20 +142,23 @@ void DataStorage::AddMultimeterMeasurement(std::uint64_t device_id, auto gid_index = std::distance(gids.begin(), gid_iterator); if (gid_iterator == gids.end() || *gid_iterator != gid) { gids.insert(gid_iterator, gid); - - auto new_values = std::vector<double>(simulation_times.size() * gids.size(), 0.0); + + auto new_values = + std::vector<double>(simulation_times.size() * gids.size(), 0.0); for (std::size_t t = 0; t < simulation_times.size(); ++t) for (std::size_t g = 0; g < gids.size(); ++g) if (g != gid_index) - new_values[t * gids.size() + g] = values[t * gids.size() + (g > gid_index ? g - 1 : g)]; + new_values[t * gids.size() + g] = + values[t * gids.size() + (g > gid_index ? g - 1 : g)]; values = new_values; } - + values[time_index * gids.size() + gid_index] = value; } -std::unordered_map<std::uint64_t, std::unordered_map<std::string, - MultimeterMeasurements>> DataStorage::GetMultimeterMeasurements() { +std::unordered_map<std::uint64_t, + std::unordered_map<std::string, MultimeterMeasurements>> +DataStorage::GetMultimeterMeasurements() { std::unique_lock<std::mutex> lock(measurement_mutex_); auto measurements = buffered_measurements_; return measurements; diff --git a/data_storage.hpp b/data_storage.hpp index 0ecdbefd9dce8bacc09dbdfdcfa1bb917e87db84..580a0c9348982197007202626aed2075394689f7 100644 --- a/data_storage.hpp +++ b/data_storage.hpp @@ -36,6 +36,9 @@ class DataStorage { DataStorage(const std::string& filename /*, hsize_t time_chunk_size, hsize_t neuronids_chunk_size*/); + void AddNeuronId(uint64_t neuron_ids); + std::vector<uint64_t> GetNeuronIds(); + void AddSpike(double simulation_time, std::uint64_t gid); std::vector<Spike> GetSpikes(); void Flush(); @@ -52,6 +55,9 @@ class DataStorage { private: // std::unique_ptr<H5::H5File> h5_file_; + std::mutex neuron_ids_mutex_; + std::vector<uint64_t> neuron_ids_; + // uint64_t flushed_spikes_count = 0; std::vector<Spike> buffered_spikes_; // H5::DataSet spikes_times_dataset_; diff --git a/recording_backend_insite.cpp b/recording_backend_insite.cpp index 7b80a00eb4a890b5bef7eec68a3ca074cdac3504..2810505e55910583045398cc08d381088f889e61 100644 --- a/recording_backend_insite.cpp +++ b/recording_backend_insite.cpp @@ -31,12 +31,12 @@ std::string ReadDatabaseHost() { } } -} +} // namespace RecordingBackendInsite::RecordingBackendInsite() : data_storage_("tgest"), - http_server_("http://0.0.0.0:" + get_port_string(), &data_storage_), - database_connection_("postgresql://postgres@" + ReadDatabaseHost()) { + database_connection_("postgresql://postgres@" + ReadDatabaseHost()), + http_server_("http://0.0.0.0:" + get_port_string(), &data_storage_, &database_connection_) { pqxx::work txn(database_connection_); simulation_node_id_ = txn.exec1( "INSERT INTO nest_simulation_node (address) " @@ -266,6 +266,7 @@ void RecordingBackendInsite::write(const nest::RecordingDevice& device, std::lower_bound(new_neuron_infos_.begin(), new_neuron_infos_.end(), neuron_info), neuron_info); + data_storage_.AddNeuronId(neuron_info.gid); } } diff --git a/recording_backend_insite.h b/recording_backend_insite.h index aa8ec277c0b42494f00ca8a632c7cf690c100d52..93c071e3d9e575e041af79e9cac5ac5c8026b6c9 100644 --- a/recording_backend_insite.h +++ b/recording_backend_insite.h @@ -62,8 +62,8 @@ class RecordingBackendInsite : public nest::RecordingBackend { std::string get_port_string() const; DataStorage data_storage_; - HttpServer http_server_; pqxx::connection database_connection_; + HttpServer http_server_; int simulation_node_id_; std::vector<NeuronInfo> neuron_infos_; std::vector<NeuronInfo> new_neuron_infos_;