From 8e2d2be85ebcfd78f485509ab2a52fcdf488ea5c Mon Sep 17 00:00:00 2001 From: Simon Oehrl <oehrl@vr.rwth-aachen.de> Date: Tue, 24 Mar 2020 11:50:22 +0100 Subject: [PATCH] Change position to array --- recording_backend_insite.cpp | 88 +++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/recording_backend_insite.cpp b/recording_backend_insite.cpp index c76ce06..1fe1114 100644 --- a/recording_backend_insite.cpp +++ b/recording_backend_insite.cpp @@ -23,11 +23,14 @@ RecordingBackendInsite::RecordingBackendInsite() database_connection_("postgresql://postgres@database") { pqxx::work txn(database_connection_); simulation_node_id_ = txn.exec1( - "INSERT INTO nest_simulation_node (address) " - "VALUES ('http://insite-nest-module:" + get_port_string() + "') " - "RETURNING id;" - )[0].as<int>(); - std::cout << "Simulation node registered to database. Node ID: " << simulation_node_id_ << std::endl; + "INSERT INTO nest_simulation_node (address) " + "VALUES ('http://insite-nest-module:" + + get_port_string() + + "') " + "RETURNING id;")[0] + .as<int>(); + std::cout << "Simulation node registered to database. Node ID: " + << simulation_node_id_ << std::endl; txn.commit(); } @@ -44,7 +47,7 @@ void RecordingBackendInsite::finalize() { void RecordingBackendInsite::enroll(const nest::RecordingDevice& device, const DictionaryDatum& params) { std::cout << "RecordingBackendInsite::enroll(" << device.get_label() << ")\n"; - + if (device.get_type() == nest::RecordingDevice::MULTIMETER) { auto id = device.get_node_id(); multimeter_infos_.emplace(std::make_pair(id, MultimeterInfo{id, true})); @@ -66,10 +69,9 @@ void RecordingBackendInsite::set_value_names( auto& multimeter = multimeter_infos_.at(device.get_node_id()); std::stringstream multimeter_query; - multimeter_query - << "INSERT INTO nest_multimeter (id, attributes) " - << "VALUES (" << device.get_node_id() << ",\'{"; - + multimeter_query << "INSERT INTO nest_multimeter (id, attributes) " + << "VALUES (" << device.get_node_id() << ",\'{"; + bool first = true; for (auto& name : double_value_names) { const auto& name_string = name.toString(); @@ -114,18 +116,20 @@ void RecordingBackendInsite::post_step_hook() { { pqxx::work txn(database_connection_); txn.exec0( - "UPDATE nest_simulation_node " - "SET current_simulation_time = " + std::to_string(latest_simulation_time_) + "" - "WHERE id = " + std::to_string(simulation_node_id_) - ); + "UPDATE nest_simulation_node " + "SET current_simulation_time = " + + std::to_string(latest_simulation_time_) + + "" + "WHERE id = " + + std::to_string(simulation_node_id_)); txn.commit(); } if (new_neuron_infos_.size() > 0) { std::stringstream neuron_query; - neuron_query - << "INSERT INTO nest_neuron (id, simulation_node_id, population_id, position_x, position_y, position_z) " - << "VALUES "; + neuron_query << "INSERT INTO nest_neuron (id, simulation_node_id, " + "population_id, position) " + << "VALUES "; for (auto& neuron_info : new_neuron_infos_) { const bool first = neuron_info.gid == new_neuron_infos_[0].gid; if (!first) { @@ -133,16 +137,26 @@ void RecordingBackendInsite::post_step_hook() { } uint64_t population_id = 0; - for (const nest::NodeIDTriple& node_id_triple : *neuron_info.gid_collection.get()) { + for (const nest::NodeIDTriple& node_id_triple : + *neuron_info.gid_collection.get()) { population_id ^= node_id_triple.node_id * 938831; } - neuron_query << "(" << neuron_info.gid << "," << simulation_node_id_ << "," << population_id % 0x800000; - for (const auto position_entry : neuron_info.position) { - neuron_query << "," << position_entry; - } - assert(neuron_info.position.size() <= 3); - for (auto i = 3 - neuron_info.position.size(); i != 0; --i) { + neuron_query << "(" << neuron_info.gid << "," << simulation_node_id_ + << "," << population_id % 0x800000; + + const auto position_size = neuron_info.position.size(); + if (position_size > 0) { + assert(position_size <= 3); + neuron_query << ",\'{"; + for (size_t i = 0; i < position_size; ++i) { + if (i > 0) { + neuron_query << ","; + } + neuron_query << neuron_info.position[i]; + } + neuron_query << "}\'"; + } else { neuron_query << ",NULL"; } neuron_query << ")"; @@ -162,19 +176,19 @@ void RecordingBackendInsite::post_step_hook() { // Send multimeter info for (auto& kvp : multimeter_infos_) { auto& multimeter = kvp.second; - if (!multimeter.needs_update) - continue; + if (!multimeter.needs_update) continue; multimeter.needs_update = false; if (multimeter.gids.size() > 0) { std::stringstream neuron_multimeter_query; neuron_multimeter_query - << "INSERT INTO nest_neuron_multimeter (neuron_id, multimeter_id) " - << "VALUES "; + << "INSERT INTO nest_neuron_multimeter (neuron_id, multimeter_id) " + << "VALUES "; for (const auto& neuron_id : multimeter.gids) { const bool first = neuron_id == multimeter.gids[0]; - neuron_multimeter_query << (first ? "" : ",") << "(" << neuron_id << "," << multimeter.device_id << ")"; + neuron_multimeter_query << (first ? "" : ",") << "(" << neuron_id << "," + << multimeter.device_id << ")"; } neuron_multimeter_query << " ON CONFLICT DO NOTHING;"; @@ -202,19 +216,19 @@ void RecordingBackendInsite::write(const nest::RecordingDevice& device, // If the measurement is from a GID we previously do not know, add. if (!binary_search(gids.begin(), gids.end(), sender_gid)) { - gids.insert(std::lower_bound(gids.begin(), gids.end(), sender_gid), - sender_gid); + gids.insert(std::lower_bound(gids.begin(), gids.end(), sender_gid), + sender_gid); multimeter.needs_update = true; } for (std::size_t i = 0; i < double_values.size(); ++i) - data_storage_.AddMultimeterMeasurement(device_id, - multimeter.double_attributes[i], time_stamp, sender_gid, - double_values[i]); + data_storage_.AddMultimeterMeasurement( + device_id, multimeter.double_attributes[i], time_stamp, sender_gid, + double_values[i]); for (std::size_t i = 0; i < long_values.size(); ++i) - data_storage_.AddMultimeterMeasurement(device_id, - multimeter.long_attributes[i], time_stamp, sender_gid, - double(long_values[i])); + data_storage_.AddMultimeterMeasurement( + device_id, multimeter.long_attributes[i], time_stamp, sender_gid, + double(long_values[i])); } latest_simulation_time_ = std::max(latest_simulation_time_, time_stamp); -- GitLab