Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/courses/hopfield_brody_network_in_python.rst
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ How it works

The synchronization mechanism requires that all of the cells fire spontaneously at similar frequencies. It is obvious that if all cells are started at the same time, they will still be roughly synchronous after one cycle (since they have similar intrinsic cycle periods). After two cycles, they will have drifted further apart. After many cycles, differences in period will be magnified, leading to no temporal relationship of firing.

The key observation utilized here is that firing is fairly synchronized one cycle after onset. The trick is to reset the cells after each cycle so that they start together again. They then fire with temporal differences equal to the differences in their intrinsic periods. This resetting can be provided by an inhibitory input which pushes state variable *m* down far from threshold (hyperpolarized, as it were). This could be accomplished through an external pacemaker that reset all the cells, thereby imposing an external frequency onto the network. The interesting observation in this network is that pacemaking can also be imposed from within, though an intrinsic connectivity that enslaves all members to the will of the masses.
The key observation utilized here is that firing is fairly synchronized one cycle after onset. The trick is to reset the cells after each cycle so that they start together again. They then fire with temporal differences equal to the differences in their intrinsic periods. This resetting can be provided by an inhibitory input which pushes state variable *m* down far from threshold (hyperpolarized, as it were). This could be accomplished through an external pacemaker that reset all the cells, thereby imposing an external frequency onto the network. The interesting observation in this network is that pacemaking can also be imposed from within, through an intrinsic connectivity that synchronizes all members via collective dynamics.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe that one can attain quite a bit more conceptual clarity about why inhibitory networks of neurons with limited differences in intrinsic firing rate can approximately synchronize than vaguely appealing to will of the masses or collective dynamics. It really helps to look at a plot of the M trajactories of a selection of cells that includes the slowest and fastest. Two features are critical. 1) Suppose given inhibitory event occurs at time t_e before the cell would othewise fire. And the time the cell actually will fire due to this event is t_e + t_d ( the inhibitory event increases the interval to firing). It is the case for this integrate and fire cell that t_d is larger when t_e is smaller. The closer one is to threshold, the greater is the delay effect for a given inhibitory event. The shape of M() is convex with time so subracting an amount from M() has more delay effect the closer one is to firing. 2) substantial delay between cell firing and delivery of those (inhibitory) events to target cells is essential. Basically, all cells have to fire before the fastest cell reaches threshold again. Here is a plot of M derived from neurondemo for the fastest, slowest, and medium interval cell of the 10 cell inhibitory synchronization demo
(all parameters are default except delay set to 7 (ms)).

Image


Exercises to gain familiarity with the model
----------
Expand Down
2 changes: 1 addition & 1 deletion docs/guide/specify_and_verify_the_functions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Under apicals_x, we select gnabar_hh

. . . and the right lower corner of the CellBuilder shows us that the default function is a Boltzmann function.

Our model isn't smart enough for a Boltzmann function. We just want a plain, dumb, linear ramp.
Our model doesn't require a Boltzmann function. We just want a plain, simple, linear ramp.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this case, suppose that our model requires that the parameter vary linearly over the chosen spatial domain.


That's easy enough--we click on f(p) in the right panel and scroll down to Ramp . . .

Expand Down
2 changes: 1 addition & 1 deletion share/lib/hoc/binfo.hoc
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ proc multisplit_divide() {local i, x \
//printf("%d %s pc.multisplit(%g, %d, 2)\n", pc.id, secname(), px.x[i], sids.x[i])
pc.multisplit(px.x[i], sids.x[i], 2)
v(px.x[i]) = sids.x[i]
}else if (v(px.x[i]) != sids.x[i]) { // sanity check
}else if (v(px.x[i]) != sids.x[i]) { // consistency check
printf("i=%d px.x[i]=%d v=%g sids.x[i]=%g\n", i, px.x[i], v(px.x[i]), sids.x[i])
execerror("Subtrees at same parent with different sid", "")
}
Expand Down
2 changes: 1 addition & 1 deletion share/lib/python/neuron/rxd/geometry3d/surfaces.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ cpdef _triangulate_surface_given_chunks(list objects, xs, ys, zs, internal_membr
objs = chunk_objsa[b][c]
cells = chunk_ptsa[b][c]
if cells and not objs:
# we should never get here; this is just a sanity check
# we should never get here; this is just a consistency check
missing_objs += 1
continue
for i, j, k in cells:
Expand Down
2 changes: 1 addition & 1 deletion share/lib/python/neuron/rxd/species.py
Original file line number Diff line number Diff line change
Expand Up @@ -1409,7 +1409,7 @@ def ijk_from_index(self, index):
jk = index - nynz * i
j = int(jk / self._nz)
k = jk % self._nz
# sanity check
# consistency check
assert index == self._nodes_by_location(i, j, k)
return i, j, k

Expand Down
4 changes: 2 additions & 2 deletions src/coreneuron/network/partrans_setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,13 @@ void nrn_partrans::gap_mpi_setup(int ngroup) {

int nhost = nrnmpi_numprocs;

// sanity check. all the sgids we are asked to send, we actually have
// verify: all the sgids we are asked to send, we actually have
for (int i = 0; i < outsrcdspl_[nhost]; ++i) {
sgid_t sgid = send_to_want[i];
assert(src2info.find(sgid) != src2info.end());
}

// sanity check. all the sgids we receive, we actually need.
// verify: all the sgids we receive, we actually need.
for (int i = 0; i < insrcdspl_[nhost]; ++i) {
sgid_t sgid = recv_from_have[i];
assert(tar2info.find(sgid) != tar2info.end());
Expand Down
6 changes: 3 additions & 3 deletions src/mswin/nrnsetupmingw.nsi.in
Original file line number Diff line number Diff line change
Expand Up @@ -271,11 +271,11 @@ SectionEnd
; modifies no other variables.
;
; Usage:
; Push "this is a long ass string"
; Push "ass"
; Push "this is a long example string"
; Push "example"
; Call StrStr
; Pop $R0
; ($R0 at this point is "ass string")
; ($R0 at this point is "example string")

Function StrStr
Exch $R1 ; st=haystack,old$R1, $R1=needle
Expand Down
2 changes: 1 addition & 1 deletion src/nrncvode/netcvode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6380,7 +6380,7 @@ bool Cvode::is_owner(neuron::container::data_handle<double> const& handle) {
for (int it = 0; it < nrn_nthread; ++it) {
CvodeThreadData& z = CTD(it);
NrnThread* nt_ = nrn_threads + it;
// ugly start but include root in single for loop
// inelegant start but include root in single for loop
for (int i = -1; i < z.vnode_end_index_; ++i) {
int in = (i == -1) ? z.rootnode_begin_index_ : i;
if (i == -1) {
Expand Down
2 changes: 1 addition & 1 deletion src/nrniv/bbsavestate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1272,7 +1272,7 @@ static void tqcallback(const TQItem* tq, int i) {
// all spikes from a PreSyn were delivered before that PreSyn fired
// again. The assumption did not hold for existing Blue Brain models.
// Therefore we extend the algorithm to any number of spikes with
// different initiation times from the same PreSyn. For sanity we
// different initiation times from the same PreSyn. For simplicity we
// assume Presyns do not fire more than once every 0.1 ms.
// Unfortunately this possibility makes mpi exchange much more
// difficult as the number of doubles exchanged can be greater than
Expand Down
4 changes: 2 additions & 2 deletions src/nrniv/nrncore_write/callbacks/nrncore_callbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ void nrnthreads_all_weights_return(std::vector<double*>& weights) {
* i_membrane_, or time. See coreneuron/io/nrn_setup.cpp:legacy_index2pointer.
* We allow coreneuron to copy to NEURON's AoS data as CoreNEURON knows
* how its data is arranged (SoA and possibly permuted).
* This function figures out the size (just for sanity check)
* This function figures out the size (for validation)
* and data pointer to be returned based on type and thread id.
* The ARTIFICIAL_CELL type case is special as there is no thread specific
* Memb_list for those.
Expand Down Expand Up @@ -618,7 +618,7 @@ int core2nrn_nmodlrandom(int tid,
assert(ml);
}

auto& nrnindices = nrn_mech_random_indices(type); // for sanity checking
auto& nrnindices = nrn_mech_random_indices(type); // for validation
assert(nrnindices == indices);
assert(nmodlrandom.size() == indices.size() * ml->nodecount);

Expand Down
4 changes: 2 additions & 2 deletions src/nrniv/partrans.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -708,9 +708,9 @@ void nrnmpi_setup_transfer() {
// 2) Call the have_to_want function.
auto [send_to_want, recv_from_have] = have_to_want<sgid_t>(ownsrc, needsrc, sgid_alltoallv);

// sanity check. all the sgids we are asked to send, we actually have
// verify: all the sgids we are asked to send, we actually have
int n = send_to_want.displ[nhost];
// sanity check. all the sgids we receive, we actually need.
// verify: all the sgids we receive, we actually need.
// also set the sid2insrc_ value to the proper recv_from_have index.
n = recv_from_have.displ[nhost];
for (int i = 0; i < n; ++i) {
Expand Down
2 changes: 1 addition & 1 deletion test/coreneuron/unit/solver/test_solver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ struct ToyModelConfig {
produce_rhs{[](auto, auto) { return -16.0; }};
};

// TODO include some global lock as a sanity check (only one instance of
// TODO include some global lock as a consistency check (only one instance of
// SetupThreads should exist at any given time)
struct SetupThreads {
SetupThreads(SolverImplementation impl, ToyModelConfig config = {}) {
Expand Down
2 changes: 1 addition & 1 deletion test/unit_tests/container/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,7 @@ TEST_CASE("Deleting a row from a frozen SoA container causes a fatal error",
"[.][tests_that_abort]") {
auto& node_data = neuron::model().node_data(); // SoA data store
std::optional<::Node> node{std::in_place}; // take ownership of a row in node_data
REQUIRE(node_data.size() == 1); // quick sanity check
REQUIRE(node_data.size() == 1); // quick consistency check
auto const frozen_token = node_data.issue_frozen_token(); // mark node_data frozen
node.reset(); // Node destructor will trigger a call to std::terminate.
}
Loading