diff --git a/test/ubench/CMakeLists.txt b/test/ubench/CMakeLists.txt
index 17fc59a8c6c05318a016413e76685bf3b78ccce4..0d372e371548729560db22d11e9aa8b51db7bc26 100644
--- a/test/ubench/CMakeLists.txt
+++ b/test/ubench/CMakeLists.txt
@@ -8,7 +8,7 @@ set(bench_sources
event_setup.cpp
event_binning.cpp
fvm_discretize.cpp
- # mech_vec.cpp --- requires rework for new API.
+ mech_vec.cpp
task_system.cpp
)
diff --git a/test/ubench/mech_vec.cpp b/test/ubench/mech_vec.cpp
index 157d044fabe0cf2cb6aa23ee8e7a2d6a4a70c3dc..7130039c7353632463cc443fa02118bb01cf4dad 100644
--- a/test/ubench/mech_vec.cpp
+++ b/test/ubench/mech_vec.cpp
@@ -34,173 +34,231 @@ mechanism_ptr& find_mechanism(const std::string& name, fvm_cell& cell) {
class recipe_expsyn_1_branch: public recipe {
unsigned num_comp_;
unsigned num_synapse_;
+ arb::cable_cell_global_properties gprop_;
+
public:
recipe_expsyn_1_branch(unsigned num_comp, unsigned num_synapse):
- num_comp_(num_comp), num_synapse_(num_synapse) {}
+ num_comp_(num_comp), num_synapse_(num_synapse) {
+ gprop_.default_parameters = arb::neuron_parameter_defaults;
+ }
cell_size_type num_cells() const override {
return 1;
}
virtual util::unique_any get_cell_description(cell_gid_type gid) const override {
- cable_cell c;
+ arb::sample_tree tree;
- auto soma = c.add_soma(12.6157/2.0);
- soma->add_mechanism("pas");
+ double soma_radius = 12.6157/2.0;
+ double dend_radius = 1.0/2;
+ double dend_length = 200;
- c.add_cable(0, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
+ // Add soma.
+ tree.append(arb::mnpos, {{0,0,0,soma_radius}, 1});
- for (auto& seg: c.segments()) {
- if (seg->is_dendrite()) {
- seg->set_compartments(num_comp_-1);
- }
- }
+ // Add dendrite
+ tree.append(0, {{0,0,soma_radius, dend_radius}, 3});
+ tree.append(1, {{0,0,soma_radius+dend_length, dend_radius}, 3});
- auto distribution = std::uniform_real_distribution<float>(0.f, 1.0f);
+ arb::label_dict d;
+ d.set("soma", arb::reg::tagged(1));
+ arb::cable_cell cell(arb::morphology(tree, true), d);
+ cell.paint("soma", "pas");
+ auto distribution = std::uniform_real_distribution<float>(0.f, 1.0f);
for(unsigned i = 0; i < num_synapse_; i++) {
auto gen = std::mt19937(i);
- c.add_synapse({1, distribution(gen)}, "expsyn");
+ cell.place(arb::mlocation{1, distribution(gen)}, "expsyn");
}
- return std::move(c);
+ cell.default_parameters = arb::neuron_parameter_defaults;
+ cell.default_parameters.discretization = arb::cv_policy_max_extent(dend_length/num_comp_);
+ return std::move(cell);
}
virtual cell_kind get_cell_kind(cell_gid_type) const override {
return cell_kind::cable;
}
+ arb::util::any get_global_properties(arb::cell_kind) const override {
+ return gprop_;
+ }
};
class recipe_pas_1_branch: public recipe {
unsigned num_comp_;
+ arb::cable_cell_global_properties gprop_;
public:
- recipe_pas_1_branch(unsigned num_comp): num_comp_(num_comp) {}
+ recipe_pas_1_branch(unsigned num_comp): num_comp_(num_comp) {
+ gprop_.default_parameters = arb::neuron_parameter_defaults;
+ }
cell_size_type num_cells() const override {
return 1;
}
virtual util::unique_any get_cell_description(cell_gid_type gid) const override {
- cable_cell c;
+ arb::sample_tree tree;
- auto soma = c.add_soma(12.6157/2.0);
- soma->add_mechanism("pas");
+ double soma_radius = 12.6157/2.0;
+ double dend_radius = 1.0/2;
+ double dend_length = 200;
- c.add_cable(0, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
+ // Add soma.
+ tree.append(arb::mnpos, {{0,0,0,soma_radius}, 1});
- for (auto& seg: c.segments()) {
- if (seg->is_dendrite()) {
- seg->add_mechanism("pas");
- seg->set_compartments(num_comp_-1);
- }
- }
- return std::move(c);
+ // Add dendrite
+ tree.append(0, {{0,0,soma_radius, dend_radius}, 3});
+ tree.append(1, {{0,0,soma_radius+dend_length, dend_radius}, 3});
+
+ arb::cable_cell cell(arb::morphology(tree, true));
+ cell.paint(arb::reg::all(), "pas");
+
+ cell.default_parameters = arb::neuron_parameter_defaults;
+ cell.default_parameters.discretization = arb::cv_policy_max_extent(dend_length/num_comp_);
+ return std::move(cell);
}
virtual cell_kind get_cell_kind(cell_gid_type) const override {
return cell_kind::cable;
}
+ arb::util::any get_global_properties(arb::cell_kind) const override {
+ return gprop_;
+ }
};
class recipe_pas_3_branches: public recipe {
unsigned num_comp_;
+ arb::cable_cell_global_properties gprop_;
public:
- recipe_pas_3_branches(unsigned num_comp): num_comp_(num_comp) {}
+ recipe_pas_3_branches(unsigned num_comp): num_comp_(num_comp) {
+ gprop_.default_parameters = arb::neuron_parameter_defaults;
+ }
cell_size_type num_cells() const override {
return 1;
}
virtual util::unique_any get_cell_description(cell_gid_type gid) const override {
- cable_cell c;
+ arb::sample_tree tree;
- auto soma = c.add_soma(12.6157/2.0);
- soma->add_mechanism("pas");
+ double soma_radius = 12.6157/2.0;
+ double dend_radius = 1.0/2;
+ double dend_length = 200;
- c.add_cable(0, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
- c.add_cable(1, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
- c.add_cable(1, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
+ // Add soma.
+ tree.append(arb::mnpos, {{0,0,0,soma_radius}, 1});
- for (auto& seg: c.segments()) {
- if (seg->is_dendrite()) {
- seg->add_mechanism("pas");
- seg->set_compartments(num_comp_-1);
- }
- }
- return std::move(c);
+ // Add dendrite
+ tree.append(0, {{0 ,0 ,soma_radius, dend_radius}, 3});
+ tree.append(1, {{0 ,0 ,soma_radius+dend_length, dend_radius}, 3});
+ tree.append(2, {{0 ,dend_length,soma_radius+dend_length, dend_radius}, 3});
+ tree.append(2, {{dend_length,0 ,soma_radius+dend_length, dend_radius}, 3});
+
+ arb::cable_cell cell(arb::morphology(tree, true));
+ cell.paint(arb::reg::all(), "pas");
+
+ cell.default_parameters = arb::neuron_parameter_defaults;
+ cell.default_parameters.discretization = arb::cv_policy_max_extent(dend_length*3/num_comp_);
+ return std::move(cell);
}
virtual cell_kind get_cell_kind(cell_gid_type) const override {
return cell_kind::cable;
}
+ arb::util::any get_global_properties(arb::cell_kind) const override {
+ return gprop_;
+ }
};
class recipe_hh_1_branch: public recipe {
unsigned num_comp_;
+ arb::cable_cell_global_properties gprop_;
public:
- recipe_hh_1_branch(unsigned num_comp): num_comp_(num_comp) {}
+ recipe_hh_1_branch(unsigned num_comp): num_comp_(num_comp) {
+ gprop_.default_parameters = arb::neuron_parameter_defaults;
+ }
cell_size_type num_cells() const override {
return 1;
}
virtual util::unique_any get_cell_description(cell_gid_type gid) const override {
- cable_cell c;
+ arb::sample_tree tree;
- auto soma = c.add_soma(12.6157/2.0);
- soma->add_mechanism("hh");
+ double soma_radius = 12.6157/2.0;
+ double dend_radius = 1.0/2;
+ double dend_length = 200;
- c.add_cable(0, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
+ // Add soma.
+ tree.append(arb::mnpos, {{0,0,0,soma_radius}, 1});
- for (auto& seg: c.segments()) {
- if (seg->is_dendrite()) {
- seg->add_mechanism("hh");
- seg->set_compartments(num_comp_-1);
- }
- }
- return std::move(c);
+ // Add dendrite
+ tree.append(0, {{0,0,soma_radius, dend_radius}, 3});
+ tree.append(1, {{0,0,soma_radius+dend_length, dend_radius}, 3});
+
+ arb::cable_cell cell(arb::morphology(tree, true));
+ cell.paint(arb::reg::all(), "hh");
+
+ cell.default_parameters = arb::neuron_parameter_defaults;
+ cell.default_parameters.discretization = arb::cv_policy_max_extent(dend_length/num_comp_);
+ return std::move(cell);
}
virtual cell_kind get_cell_kind(cell_gid_type) const override {
return cell_kind::cable;
}
+ arb::util::any get_global_properties(arb::cell_kind) const override {
+ return gprop_;
+ }
};
class recipe_hh_3_branches: public recipe {
unsigned num_comp_;
+ arb::cable_cell_global_properties gprop_;
public:
- recipe_hh_3_branches(unsigned num_comp): num_comp_(num_comp) {}
+ recipe_hh_3_branches(unsigned num_comp): num_comp_(num_comp) {
+ gprop_.default_parameters = arb::neuron_parameter_defaults;
+ }
cell_size_type num_cells() const override {
return 1;
}
virtual util::unique_any get_cell_description(cell_gid_type gid) const override {
- cable_cell c;
+ arb::sample_tree tree;
- auto soma = c.add_soma(12.6157/2.0);
- soma->add_mechanism("pas");
+ double soma_radius = 12.6157/2.0;
+ double dend_radius = 1.0/2;
+ double dend_length = 200;
- c.add_cable(0, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
- c.add_cable(1, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
- c.add_cable(1, section_kind::dendrite, 1.0/2, 1.0/2, 200.0);
+ // Add soma.
+ tree.append(arb::mnpos, {{0,0,0,soma_radius}, 1});
- for (auto& seg: c.segments()) {
- if (seg->is_dendrite()) {
- seg->add_mechanism("hh");
- seg->set_compartments(num_comp_-1);
- }
- }
- return std::move(c);
+ // Add dendrite
+ tree.append(0, {{0 ,0 ,soma_radius, dend_radius}, 3});
+ tree.append(1, {{0 ,0 ,soma_radius+dend_length, dend_radius}, 3});
+ tree.append(2, {{0 ,dend_length,soma_radius+dend_length, dend_radius}, 3});
+ tree.append(2, {{dend_length,0 ,soma_radius+dend_length, dend_radius}, 3});
+
+ arb::cable_cell cell(arb::morphology(tree, true));
+ cell.paint(arb::reg::all(), "hh");
+
+ cell.default_parameters = arb::neuron_parameter_defaults;
+ cell.default_parameters.discretization = arb::cv_policy_max_extent(dend_length*3/num_comp_);
+ return std::move(cell);
}
virtual cell_kind get_cell_kind(cell_gid_type) const override {
return cell_kind::cable;
}
+
+ arb::util::any get_global_properties(arb::cell_kind) const override {
+ return gprop_;
+ }
};
void expsyn_1_branch_current(benchmark::State& state) {
@@ -358,12 +416,12 @@ void hh_3_branches_current(benchmark::State& state) {
}
void run_custom_arguments(benchmark::internal::Benchmark* b) {
- for (auto ncomps: {10, 100, 1000, 10000, 100000, 1000000, 10000000}) {
+ for (auto ncomps: {10, 100, 1000, 10000, 100000}) {
b->Args({ncomps});
}
}
void run_exp_custom_arguments(benchmark::internal::Benchmark* b) {
- for (auto ncomps: {10, 100, 1000, 10000, 100000, 1000000}) {
+ for (auto ncomps: {10, 100, 1000, 10000}) {
b->Args({ncomps, ncomps*10});
}
}