When can neuronal activity-dependent homeostatic plasticity maintain circuit-level properties?
The 2 matches
- [1] § Results › Optimization of homeostatic mechanisms ↔ mainsimulateADHP.cpp, lines 1–53 · score 0.54 · activity dependent homeostatic, lower bound, ADHP mechanism, biases, plasticity, perturbations
- [2] § Results › Optimization of homeostatic mechanisms ↔ mainADHPevol.cpp, lines 58–87 · score 0.53 · sliding window duration, upper bound, clipped, width, neuron, ADHP
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
C++ · 239 lines · 8.6 KB · BSD-2-Clause · 1 match
- // --------------------------------------------------------------
- // Track the parameters and states of CTRNNs as they undergo
- // Activity-Dependent Homeostatic Plasticity
- // Record pyloric fitness before and after plasticity
- //
- // Run this script from the directory of the evolved pyloric circuit
- // which you are perturbing/measuring, and specify the ADHP mechanism
- // you want to test. If you don't want ADHP to be active (just to test
- // pyloricness), then choose the nullADHP.dat file. Only the parameters
- // indicated by your ADHP mechanism (first line) can be perturbed in the test.
- // Ensure that the ./res.dat file specifies ranges (step doesn't matter)
- // for each parameter that should be explored (lines read in order of plasticpars.dat)
- //
- // Test one specific point by setting num_ICs to 1 and the upper and lower bounds
- // of the ranges in res.dat to the values you want
- //
- // --------------------------------------------------------------
- #include "TSearch.h"
- #include "CTRNN.h"
- #include "random.h"
- #include "pyloric.h"
- // Simulation parameters
- const double TransientDuration = 50; //Seconds to equilibrate before measuring pyloricness and activating ADHP
- double PlasticDuration = 10000; //Seconds with ADHP running before re-measuring pyloricness (set to 0 if just measuring pyl)
- const bool trackoutputs = true;
- const int trackoutputsinterval = 1; //Track neural outputs for every X trials
- const bool trackparams = false;
- const int trackparamsinterval = 1; //Track biases for every X trials
- const int trackingstepinterval = 2; //make the tracking files smaller by only recording every Xth step (though all steps are integrated)
- const int num_ICs = 1; //how many initial points?
- //Input Files
- char Nfname[] = "./pyloriccircuit.ns";
- // char HPfname[] = "./0/bestind.dat";
- //null ADHP option
- char HPfname[] = "../../nullADHP.dat";
- char rangefname[] = "../../res.dat";
- //Output Files
- char Fitnessesfname[] = "./fit.dat"; //fitness of every point before and after regulation
- char ICsfname[] = "./ics.dat"; //full parameters of every point before and after regulation
- char biastrackfname[] = "./parstrack.dat"; //track all plastic parameters throughout the run (if trackparams==true)
- char statestrackfname[] = "./statestrack.dat"; //track all three neural output timeseries throughout the run (if trackoutputs==true)
- // Nervous system params
- const int N = 3;
- int CTRNNVectSize = N*N + 2*N;
- int paramboundVectSize = 2*(CTRNNVectSize - N);
- void GenPhenMapping(TVector<double> &gen, TVector<double> &phen, TVector<double> ¶mbounds)
- {
- int k = 1;
- // Time-constants
- for (int i = 1; i <= N; i++) {
- phen(k) = MapSearchParameter(gen(k), .1, 2); // Time constants cannot be perturbed or regulated
- k++;
- }
- int param_idx = 1;
- // Bias
- for (int i = 1; i <= N; i++) {
- phen(k) = MapSearchParameter(gen(k), parambounds(param_idx), parambounds(param_idx+1));
- k++;
- param_idx += 2;
- }
- // Weights
- for (int i = 1; i <= N; i++) {
- for (int j = 1; j <= N; j++) {
- phen(k) = MapSearchParameter(gen(k), parambounds(param_idx), parambounds(param_idx+1));
- k++;
- param_idx += 2;
- }
- }
- }
- int main(){
- // Create files to hold data
- ofstream fitnesses;
- fitnesses.open(Fitnessesfname);
- ofstream ICsfile;
- ICsfile.open(ICsfname);
- ofstream biastrack;
- biastrack.open(biastrackfname);
- ofstream statestrack;
- statestrack.open(statestrackfname);
- CTRNN Circuit(3);
- // Set circuit parameters (start with the given pyloric solution)
- ifstream ifs;
- ifs.open(Nfname);
- if (!ifs) {
- cerr << "File not found: " << Nfname << endl;
- exit(EXIT_FAILURE);
- }
- ifs >> Circuit;
- ifs.close();
- ifstream rangefile;
- rangefile.open(rangefname);
- if (!rangefile) {
- cerr << "File not found: " << rangefname << endl;
- exit(EXIT_FAILURE);
- }
- // Set the proper HP parameters
- ifstream HPifs;
- HPifs.open(HPfname);
- if (!HPifs) {
- cerr << "File not found: " << HPfname << endl;
- exit(EXIT_FAILURE);
- }
- Circuit.SetHPPhenotype(HPifs,StepSize);
- HPifs.close();
- bool ADHPon = false;
- TVector<double> parambounds(1,paramboundVectSize); //vector to hold all ranges
- if (Circuit.plasticitypars.Sum()>0){ //gets from the ADHP bestind.dat file
- ADHPon = true;
- int bound_idx = 1;
- // Read in specified Ranges
- for (int i=1;i<=Circuit.plasticitypars.UpperBound();i++){
- if (Circuit.plasticitypars(i) == 1){
- int step_throwaway;
- rangefile >> parambounds(bound_idx);
- rangefile >> parambounds(bound_idx+1);
- rangefile >> step_throwaway;
- }
- bound_idx += 2;
- }
- }
- else {PlasticDuration = 0;} //if no ADHP, then forego the plastic period
- rangefile.close();
- // Generate random circuit parameters within the allowed ranges
- TVector<double> genotype(1,CTRNNVectSize);
- TVector<double> phenotype(1,CTRNNVectSize);
- for (int i = 0;i<num_ICs;i++){
- long randomseed = static_cast<long>(time(NULL));
- // long randomseed = 123456789; //if need repeats or direct compare
- RandomState rs(randomseed+pow(i,2));
- for (int j = 1; j <= genotype.Size(); j++)
- {genotype[j] = rs.UniformRandom(-1,1);} //generate random genotype
- GenPhenMapping(genotype,phenotype,parambounds); //map into proper ranges (or to specific values)
- //use only the generated parameters that you need
- int k = 1;
- //check for biases
- for(int j=1; j<=N; j++){
- if (Circuit.plasticitypars[k]==1){
- Circuit.SetNeuronBias(j,phenotype(k+N)); //start after time constants
- }
- k++;
- }
- //check for weights
- for (int j=1; j<=N; j++){
- for (int l=1; l<=N; l++){
- if (Circuit.plasticitypars[k]==1){
- Circuit.SetConnectionWeight(j,l,phenotype(k+N)); //started after time constants
- }
- k++;
- }
- }
- //prepare circuit for run
- Circuit.RandomizeCircuitOutput(0.5,0.5);
- Circuit.WindowReset();
- // Run for transient without ADHP
- int tstep = 0;
- for(double t=0;t<TransientDuration;t+=StepSize){
- Circuit.EulerStep(StepSize,false);
- if (trackoutputs && (i%trackoutputsinterval==0) && (tstep % trackingstepinterval==0)){
- for (int j = 1; j <= Circuit.size; j++){
- statestrack << Circuit.NeuronOutput(j) << " ";
- }
- statestrack << endl;}
- tstep ++;
- }
- // Record initial parameters
- ICsfile << Circuit.taus << " " << Circuit.biases << " ";
- for(int j = 1; j <= N; j ++){
- for(int k=1;k<=N;k++){
- ICsfile << Circuit.ConnectionWeight(j,k) << " ";
- }
- }
- ICsfile << endl;
- // Run with HP for a time if ADHP is turned on
- for(double t=0;t<PlasticDuration;t+=StepSize){
- if (trackparams && (i%trackparamsinterval==0) && (tstep % trackingstepinterval == 0)){
- for(int j = 1; j<= Circuit.plasticitypars.Sum(); j++){
- biastrack << Circuit.ArbDParam(j) << " "; //record only the parameters that are changing throughout the run
- }
- biastrack << endl;
- }
- if (trackoutputs && (i%trackoutputsinterval==0) && (tstep % trackingstepinterval==0)){
- for (int j = 1; j <= Circuit.size; j++){
- statestrack << Circuit.NeuronOutput(j) << " ";
- }
- statestrack << endl;}
- Circuit.EulerStep(StepSize,true);
- tstep ++;
- }
- if (trackparams && (i%trackparamsinterval==0)) {biastrack << endl;}
- if (trackoutputs && (i%trackoutputsinterval==0)) {statestrack << endl;}
- // Record again, after HP
- ICsfile << Circuit.taus << " " << Circuit.biases << " ";
- for(int j = 1; j <= N; j ++){
- for(int k=1;k<=N;k++){
- ICsfile << Circuit.ConnectionWeight(j,k) << " ";
- }
- }
- ICsfile << endl << endl;
- // Test for Pyloricness (HP remains on if it was on during plastic period)
- double fit = PyloricPerformance(Circuit,true);
- fitnesses << fit << endl << endl;;
- // fitnesses << Circuit.rhos << endl << endl; //proxy for whether HP is satisfied at the end, or whether it just ran into a boundary or is in a limit cycle
- }
- fitnesses.close();
- ICsfile.close();
- biastrack.close();
- statestrack.close();
- return 0;
- }
mainsimulateADHP.cpp at commit 393a5cc, under BSD-2-Clause · at the source
Overview
Abstract
Neural circuits are remarkably robust to perturbations that threaten their function. Activity-dependent homeostatic plasticity (ADHP) is a stabilizing mechanism that supports robustness by tuning neuronal ion conductances to combat chronic over- or under-activity. Its restorative capacity has been demonstrated in the pyloric circuit of the crustacean stomatogastric ganglion, whose neurons must burst in a specific order to coordinate digestive muscles. After disruption by physical and pharmacological manipulations, this circuit reliably recovers not only the activity levels of constituent neurons, but also the proper burst order. But how could ADHP, operating only on local information about each neuron’s average activity, maintain higher-order circuit properties? We explored this question in a computational model of the pyloric pattern generator. We first optimized a set of pyloric-like networks, then optimized ADHP mechanisms for each network to restore its pyloric character after parametric perturbations. This was possible for some networks and impossible for others, so we aimed to explain this disparity. We found that successful homeostatic regulators target average neural activity levels which happen to occur only among pyloric circuits and not among non-pyloric ones, within the set of reachable circuit configurations. Therefore, in subsets of parameter space where such dissociation is possible, activity carries indirect information about burst order, which ADHP can exploit to maintain pyloricness. Other subsets, whose pyloric averages are inseparable from non-pyloric ones, cannot be perfectly regulated. This separability property may explain differences in recovery capacity across perturbations and across individuals.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 2 matches between paragraphs and lines of code.
Zenodo 18509900
Availability: 1 check, the latest on 28 September 2026: the link answers (HTTP 200)
- 28 September 2026: the link answers (HTTP 200)
18 files
- CTRNN.cpp, C++, 657 lines
- CTRNN.h, C/C++, 226 lines
- No Timing Requirements/
HPLCstats.ipynb , Jupyter, 144 lines - TSearch.cpp, C++, 1,022 lines
- TSearch.h, C/C++, 228 lines
- Timing Requirements/
15/ , Jupyter, 11 linestest.ipynb - VectorMatrix.h, C/C++, 517 lines
- mainADHPevol.cpp, C++, 308 lines
- mainADHPmetaparspace.cpp
, C++, 265 lines - mainavgpyloric.cpp, C++, 411 lines
- mainpyloricevol.cpp, C++, 161 lines
- mainsimulateADHP.cpp, C++, 239 lines
- pyloric.cpp, C++, 346 lines
- pyloric.h, C/C++, 47 lines
- random.cpp, C++, 208 lines
- random.h, C/C++, 77 lines
- LICENSE, License, 24 lines
- README.md, Text, 58 lines
ljstolting/adhp-maintains-pyloricness
393a5cc2481d2342d881d05ec8964c3aed43b4f8, 16 June 2026Availability: 1 check, the latest on 28 September 2026: the link answers
- 28 September 2026: the link answers
18 files
- CTRNN.cpp, C++, 657 lines
- CTRNN.h, C/C++, 226 lines
- No Timing Requirements/
HPLCstats.ipynb , Jupyter, 144 lines - TSearch.cpp, C++, 1,022 lines
- TSearch.h, C/C++, 228 lines
- Timing Requirements/
15/ , Jupyter, 11 linestest.ipynb - VectorMatrix.h, C/C++, 517 lines
- mainADHPevol.cpp, C++, 308 lines, 1 match
- mainADHPmetaparspace.cpp
, C++, 265 lines - mainavgpyloric.cpp, C++, 411 lines
- mainpyloricevol.cpp, C++, 161 lines
- mainsimulateADHP.cpp, C++, 239 lines, 1 match
- pyloric.cpp, C++, 346 lines
- pyloric.h, C/C++, 47 lines
- random.cpp, C++, 208 lines
- random.h, C/C++, 77 lines
- LICENSE, License, 24 lines
- README.md, Text, 57 lines
Code Availability
C++ and Python code required to reproduce all data is publicly available on Zenodo at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 32 scripts, each with its path and the digest of its content;
- 2 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability Statement
All code required to reproduce these simulations is publicly available on Zenodo at https://
C++ and Python code required to reproduce all data is publicly available on Zenodo at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 2, 28 September 2026
- Publisher: n/a → Springer Science+Business Media
- Funding: added Eli Lilly and Company; Lilly Endowment
Version 1, 28 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 2 authors, 4 keywords, 10 MeSH terms, 99 references.
Cite
This paper
Stolting, L. J., & Beer, R. D. (2026). When can neuronal activity-dependent homeostatic plasticity maintain circuit-level properties? Journal of computational neuroscience, 54(2), 365-391. https://
BibTeX
@article{stolting2026whe
author = {Stolting, Lindsay J and Beer, Randall D},
title = {{When can neuronal activity-dependent homeostatic plasticity maintain circuit-level properties?
journal = {Journal of computational neuroscience},
year = {2026},
month = may,
volume = {54},
number = {2},
pages = {365--391},
publisher = {Springer Science+Business Media},
issn = {0929-5313},
doi = {10.1007/
url = {https://
pmid = {42126467},
pmcid = {PMC13233920}
}
RIS
TY - JOUR
AU - Stolting, Lindsay J
AU - Beer, Randall D
TI - When can neuronal activity-dependent homeostatic plasticity maintain circuit-level properties?
T2 - Journal of computational neuroscience
J2 - J Comput Neurosci
PY - 2026
DA - 2026/
VL - 54
IS - 2
SP - 365
EP - 391
SN - 0929-5313
PB - Springer Science+Business Media
DO - 10.1007/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1007/
"type": "article-journal",
"title": "When can neuronal activity-dependent homeostatic plasticity maintain circuit-level properties?
"container-title": "Journal of computational neuroscience",
"author": [
{
"family": "Stolting",
"given": "Lindsay J"
},
{
"family": "Beer",
"given": "Randall D"
}
],
"container-title-short":
"volume": "54",
"issue": "2",
"page": "365-391",
"DOI": "10.1007/
"PMID": "42126467",
"PMCID": "PMC13233920",
"ISSN": "0929-5313",
"publisher": "Springer Science+Business Media",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
13
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1371/journal.pcbi.1014177 [code]
- Activity-dependent neuromodulation and calcium homeostasis cooperate to produce robust and modulable neuronal function.Journal: PLoS computational biologyIn common: none (in silico), computational modeling (no new data), 13 references
- [2] doi:10.1371/journal.pcbi.1014337 [code]
- Fast reconstruction of degenerate populations of conductance-based neuron models from spike times.Journal: PLoS computational biologyIn common: Matplotlib, NumPy, computational modeling (no new data), 6 references
- [3] doi:10.1523/jneurosci.0987-25.2026 [code]
- Cell-Type-Specific Synaptic Scaling Mechanisms Differentially Contribute to Associative Learning.Journal: The Journal of neuroscience : the official journal of the Society for NeuroscienceIn common: Matplotlib, NumPy, 4 references
- [4] doi:10.1371/journal.pcbi.1014458 [code]
- Neuronal excitability and parameter variability in the Hodgkin-Huxley model.Journal: PLoS computational biologyIn common: Matplotlib, NumPy, none (in silico), computational modeling (no new data), 3 references
- [5] doi:10.1038/s41467-026-74460-8 [code]
- Spike-based alignment learning solves the weight transport problem.Journal: Nature communicationsIn common: Matplotlib, NumPy, computational modeling (no new data), 3 references
- [6] doi:10.1007/s00422-026-01061-5 [code]
- Modeling synaptic interactions between mammalian breathing and swallowing central pattern generators.Journal: Biological cyberneticsIn common: Matplotlib, NumPy, none (in silico), computational modeling (no new data), 2 references
- [7] doi:10.1371/journal.pone.0354021 [code]
- A genetic algorithm for self-supervised models of oscillatory neurodynamics.Journal: PloS oneIn common: Matplotlib, NumPy, computational modeling (no new data), systems, 2 references
- [8] doi:10.7554/elife.107635 [code]
- Stable excitatory-inhibitory synapse balance despite dynamic turnover.Journal: eLifeIn common: Matplotlib, NumPy, 2 references
- [9] doi:10.3389/fncom.2026.1761735 [code]
- Adaptation modulates effective connectivity and network stability.Journal: Frontiers in computational neuroscienceIn common: 3 references
- [10] doi:10.3390/biomedicines14081670 [code]
- Limited Detectability of Network Functional Alterations in a Tauopathy Model Using Mouse Primary Cortical Cultures.Journal: BiomedicinesIn common: NumPy, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 2 repositories of the authors' code, each at its verified commit and with its license, 32 scripts, and 2 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:2d3b5ca75263d5cf…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
