-
Brent Huisman authored
* Add Python version of brunel.cpp example. * Enforce consistency in units: both C++ and Python APIs use unit `kHz` for all frequencies. * Align Python version `poisson_schedule` signature with C++ equivalent. * Update unit tests to suit API changes. * Update documentation to suit, along with minor additions related to networks and interconnectivity. * Add `brunel.py` to `basic.yml` tests
Unverifiedc326ab3b
schedule.hpp 3.19 KiB
#pragma once
#include <optional>
#include <random>
#include <vector>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <arbor/schedule.hpp>
#include <arbor/common_types.hpp>
namespace pyarb {
// Schedule shim base class provides virtual interface for conversion
// to an arb::schedule object.
struct schedule_shim_base {
schedule_shim_base() = default;
schedule_shim_base(const schedule_shim_base&) = delete;
schedule_shim_base& operator=(schedule_shim_base&) = delete;
virtual ~schedule_shim_base() {}
virtual arb::schedule schedule() const = 0;
};
// A Python shim that holds the information that describes an
// arb::regular_schedule. This is wrapped in pybind11, and users constructing
// a regular_schedule in python are manipulating this type. This is converted to
// an arb::regular_schedule when a C++ recipe is created from a Python recipe.
struct regular_schedule_shim: schedule_shim_base {
using time_type = arb::time_type;
using opt_time_type = std::optional<time_type>;
time_type tstart = {};
time_type dt = 0;
opt_time_type tstop = {};
regular_schedule_shim(time_type t0, time_type delta_t, pybind11::object t1);
explicit regular_schedule_shim(time_type delta_t);
// getter and setter (in order to assert when being set)
void set_tstart(time_type t);
void set_dt(time_type delta_t);
void set_tstop(pybind11::object t);
time_type get_tstart() const;
time_type get_dt() const;
opt_time_type get_tstop() const;
arb::schedule schedule() const override;
std::vector<arb::time_type> events(arb::time_type t0, arb::time_type t1);
};
// A Python shim for arb::explicit_schedule.
// This is wrapped in pybind11, and users constructing an explicit_schedule in
// Python are manipulating this type. This is converted to an
// arb::explicit_schedule when a C++ recipe is created from a Python recipe.
struct explicit_schedule_shim: schedule_shim_base {
std::vector<arb::time_type> times;
explicit_schedule_shim() = default;
explicit_schedule_shim(std::vector<arb::time_type> t);
// getter and setter (in order to assert when being set)
void set_times(std::vector<arb::time_type> t);
std::vector<arb::time_type> get_times() const;
arb::schedule schedule() const override;
std::vector<arb::time_type> events(arb::time_type t0, arb::time_type t1);
};
// A Python shim for arb::poisson_schedule.
// This is wrapped in pybind11, and users constructing a poisson_schedule in
// Python are manipulating this type. This is converted to an
// arb::poisson_schedule when a C++ recipe is created from a Python recipe.
struct poisson_schedule_shim: schedule_shim_base {
using rng_type = std::mt19937_64;
arb::time_type tstart; // ms
arb::time_type freq; // kHz
rng_type::result_type seed;
poisson_schedule_shim(arb::time_type ts, arb::time_type f, rng_type::result_type s);
poisson_schedule_shim(arb::time_type f);
void set_tstart(arb::time_type t);
void set_freq(arb::time_type f);
arb::time_type get_tstart() const;
arb::time_type get_freq() const;
arb::schedule schedule() const override;
std::vector<arb::time_type> events(arb::time_type t0, arb::time_type t1);
};
}