OSCR

Adaptation modulates effective connectivity and network stability.

Code ↔ Paper

8 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 8 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
  1. [1] § Stability of networks without adaptation ↔ RandomMatrixTheory/RMT.m, lines 1–61 · score 0.76 · low rank structure, diagonal shifts, Random matrix theory, inhibitory neurons, outlier eigenvalue, sparse
  2. [2] § Stability of networks without adaptation ↔ RandomMatrixTheory/RMT.m, lines 1–61 · score 0.73 · inhibitory populations, random matrix theory, low rank, outlier eigenvalues, computations, weights
  3. [3] § Stability of networks without adaptation ↔ StabilityAnalysis/src/RMTMatrix.m, lines 1–50 · score 0.72 · inhibitory populations, random matrix theory, low rank, outlier eigenvalues, weights, excitatory
  4. [4] § Stability of networks without adaptation ↔ StabilityAnalysis/src/RMTMatrix.m, lines 1–50 · score 0.70 · low rank structure, Random matrix theory, inhibitory neurons, outlier eigenvalue, diagonal, sparse
  5. [5] § Adaptation modulates effective connectivity ↔ StabilityAnalysis/scripts/Fig_2_single_vs_dual_adaptation_example.m, lines 48–137 · score 0.64 · spike frequency adaptation, short term synaptic, abscissa, amplitude, rescaling, Benettin
  6. [6] § Adaptation modulates effective connectivity ↔ StabilityAnalysis/src/algorithms/Jacobian/compute_J_eff.m, the whole file · a weak match · score 0.59 · activation function derivative, synaptic depression, connectivity matrix, effective connectivity, Jacobian, network
  7. [7] § Adaptation modulates effective connectivity ↔ StabilityAnalysis/scripts/Fig_2_fraction_excitatory_load_and_plot.m, lines 82–227 · score 0.54 · Wilcoxon signed rank, median, stim, transient, simulated, excitatory
  8. [8] § Adaptation modulates effective connectivity ↔ StabilityAnalysis/scripts/Fig_2_single_vs_dual_adaptation_example.m, lines 48–137 · score 0.53 · spike frequency adaptation, short term synaptic, depression, SFA, modeling, STD

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

MATLAB · 478 lines · 18 KB · MIT · 2 matches

  1. classdef RMT < handle
  2. % RMT - Random Matrix Theory class following Harris et al. (2023)
  3. % Variable names match the paper's notation for equations 15-18, 24-25, 30-31
  4. properties
  5. N % System size
  6. alpha % Sparsity/connection probability (0 < alpha <= 1)
  7. f % Fraction of excitatory neurons
  8. % Normalized population statistics (tilde notation from Harris 2023)
  9. % These are the pre-sparsity parameters: mu_tilde = mu/sqrt(N), sigma_tilde = sigma/sqrt(N)
  10. mu_tilde_e % Normalized mean of excitatory population
  11. mu_tilde_i % Normalized mean of inhibitory population
  12. sigma_tilde_e % Normalized std dev of excitatory population
  13. sigma_tilde_i % Normalized std dev of inhibitory population
  14. % Internal matrices
  15. A % Base random matrix (Gaussian, mean 0, var 1)
  16. S % Sparsity mask (logical)
  17. % Control flags
  18. zrs_mode % 'none', 'ZRS', 'SZRS', 'Partial_SZRS'
  19. shift % Scalar shift for eigenvalues (diagonal shift)
  20. % Visualization
  21. description
  22. outlier_threshold % Multiplier for R to determine outlier eigenvalues (default 1.03)
  23. end
  24. properties (Dependent)
  25. % Population indices (computed from f and N)
  26. E % Logical index for Excitatory neurons
  27. I % Logical index for Inhibitory neurons
  28. % Low-rank structure M = u * v' (Eq 12)
  29. u % Left vector: ones(N,1)
  30. v % Right vector: [mu_tilde_e repeated Nf times, mu_tilde_i repeated N(1-f) times]
  31. % Variance structure (Eq 11)
  32. D % Diagonal variance matrix: diag(sigma_tilde_e repeated Nf, sigma_tilde_i repeated N(1-f))
  33. % Weight/Jacobian matrix
  34. W % Jacobian matrix (computed on access)
  35. % Sparse statistics (Eq 15, 16)
  36. mu_se % Sparse excitatory mean: alpha * mu_tilde_e
  37. mu_si % Sparse inhibitory mean: alpha * mu_tilde_i
  38. sigma_se_sq % Sparse excitatory variance (Eq 16)
  39. sigma_si_sq % Sparse inhibitory variance (Eq 16)
  40. % Theoretical predictions (Eq 17, 18)
  41. lambda_O % Outlier eigenvalue
  42. R % Spectral radius
  43. end
  44. properties (Access = private)
  45. eigenvalues_cache % Cached eigenvalue computation
  46. eigenvalues_valid % Flag indicating if cache is valid
  47. end
  48. methods
  49. function obj = RMT(N)
  50. % RMT Constructor
  51. obj.N = N;
  52. % Defaults
  53. obj.alpha = 1.0;
  54. obj.f = 0.5;
  55. obj.mu_tilde_e = 0;
  56. obj.mu_tilde_i = 0;
  57. obj.sigma_tilde_e = 1/sqrt(N); % Default: unit variance when scaled by sqrt(N)
  58. obj.sigma_tilde_i = 1/sqrt(N);
  59. obj.zrs_mode = 'none';
  60. obj.shift = 0;
  61. obj.description = '';
  62. obj.outlier_threshold = 1.04;
  63. % Initialize random matrices
  64. obj.A = randn(N, N); % Mean 0, Var 1
  65. obj.update_sparsity();
  66. % Initialize eigenvalue cache
  67. obj.eigenvalues_cache = [];
  68. obj.eigenvalues_valid = false;
  69. end
  70. %% Dependent Property Getters
  71. function val = get.E(obj)
  72. val = false(obj.N, 1);
  73. val(1:round(obj.f * obj.N)) = true;
  74. end
  75. function val = get.I(obj)
  76. val = ~obj.E;
  77. end
  78. function val = get.u(obj)
  79. val = ones(obj.N, 1);
  80. end
  81. function val = get.v(obj)
  82. val = zeros(obj.N, 1);
  83. E_idx = obj.E;
  84. val(E_idx) = obj.mu_tilde_e;
  85. val(~E_idx) = obj.mu_tilde_i;
  86. end
  87. function val = get.D(obj)
  88. % Eq 11: D = diag(sigma_tilde_e repeated Nf times, sigma_tilde_i repeated N(1-f) times)
  89. D_vec = zeros(obj.N, 1);
  90. E_idx = obj.E;
  91. D_vec(E_idx) = obj.sigma_tilde_e;
  92. D_vec(~E_idx) = obj.sigma_tilde_i;
  93. val = diag(D_vec);
  94. end
  95. function val = get.W(obj)
  96. % Construct weight matrix W based on Harris 2023 equations
  97. % Get diagonal variance matrix D (Eq 11) and low-rank structure M (Eq 12)
  98. D = obj.D;
  99. M = obj.u * obj.v';
  100. switch obj.zrs_mode
  101. case 'none'
  102. % Standard construction: W = S .* (A*D + M) (Eq 6)
  103. W_dense = (obj.A * D) + M;
  104. val = obj.S .* W_dense;
  105. case 'ZRS'
  106. % Dense ZRS using Projection Operator P (Eq 24, 25)
  107. % Eq 24: P = I_N - (u*u')/N
  108. % Eq 25: W = A*D*P + u*v'
  109. if obj.alpha < 1
  110. warning('RMT:SparsityWarning', 'Using ''ZRS'' (projection) with sparse matrix. This will destroy sparsity. Consider ''SZRS''.');
  111. end
  112. % Eq 24: Projection operator
  113. P = eye(obj.N) - (obj.u * obj.u') / obj.N;
  114. % Eq 25: W = A*D*P + M
  115. val = (obj.A * D * P) + M;
  116. if obj.alpha < 1
  117. val = obj.S .* val;
  118. end
  119. case 'SZRS'
  120. % Sparse Zero Row Sum (Eq 30, 31)
  121. % Eq 30: W = S .* (A*D + u*v') - B
  122. % Eq 31: W_bar_i = sum_j W_ij / sum_j S_ij
  123. % Base sparse matrix
  124. W_base = obj.S .* ((obj.A * D) + M);
  125. % Eq 31: Row averages of non-zero elements
  126. row_sums = sum(W_base, 2);
  127. row_counts = sum(obj.S, 2);
  128. row_counts(row_counts == 0) = 1; % Avoid division by zero
  129. W_bar_i = row_sums ./ row_counts;
  130. % Correction matrix B: B_ij = S_ij * W_bar_i
  131. B = obj.S .* W_bar_i;
  132. % Eq 30: Final matrix
  133. val = W_base - B;
  134. case 'Partial_SZRS'
  135. % Partial SZRS (Eq 32)
  136. % Apply correction ONLY to random component J = S .* (A*D)
  137. % Keep M component (S .* M) intact to preserve imbalance
  138. % Random component
  139. J_base = obj.S .* (obj.A * D);
  140. % Mean structure component
  141. M_base = obj.S .* M;
  142. % Eq 32: Row averages of random component J only
  143. J_row_sums = sum(J_base, 2);
  144. row_counts = sum(obj.S, 2);
  145. row_counts(row_counts == 0) = 1;
  146. J_bar_i = J_row_sums ./ row_counts;
  147. % Partial correction B
  148. B_partial = obj.S .* J_bar_i;
  149. % W = (J_base - B_partial) + M_base
  150. val = (J_base - B_partial) + M_base;
  151. end
  152. % Apply diagonal shift
  153. val = val + obj.shift * eye(obj.N);
  154. end
  155. function val = get.mu_se(obj)
  156. % Eq 15: mu_se = alpha * mu_tilde_e
  157. val = obj.alpha * obj.mu_tilde_e;
  158. end
  159. function val = get.mu_si(obj)
  160. % Eq 15: mu_si = alpha * mu_tilde_i
  161. val = obj.alpha * obj.mu_tilde_i;
  162. end
  163. function val = get.sigma_se_sq(obj)
  164. % Eq 16: sigma_se^2 = alpha*(1-alpha)*mu_tilde_e^2 + alpha*sigma_tilde_e^2
  165. val = obj.alpha * (1 - obj.alpha) * obj.mu_tilde_e^2 + obj.alpha * obj.sigma_tilde_e^2;
  166. end
  167. function val = get.sigma_si_sq(obj)
  168. % Eq 16: sigma_si^2 = alpha*(1-alpha)*mu_tilde_i^2 + alpha*sigma_tilde_i^2
  169. val = obj.alpha * (1 - obj.alpha) * obj.mu_tilde_i^2 + obj.alpha * obj.sigma_tilde_i^2;
  170. end
  171. function val = get.lambda_O(obj)
  172. % Eq 17: lambda_O = N * [f * mu_se + (1-f) * mu_si]
  173. val = obj.N * (obj.f * obj.mu_se + (1 - obj.f) * obj.mu_si);
  174. end
  175. function val = get.R(obj)
  176. % Eq 18: R = sqrt(N * [f * sigma_se^2 + (1-f) * sigma_si^2])
  177. val = sqrt(obj.N * (obj.f * obj.sigma_se_sq + (1 - obj.f) * obj.sigma_si_sq));
  178. end
  179. %% Property Setters with cache invalidation
  180. function set.alpha(obj, val)
  181. obj.alpha = val;
  182. if ~isempty(obj.A)
  183. obj.update_sparsity();
  184. end
  185. obj.invalidate_eigenvalues();
  186. end
  187. function set.f(obj, val)
  188. obj.f = val;
  189. obj.invalidate_eigenvalues();
  190. end
  191. function set.mu_tilde_e(obj, val)
  192. obj.mu_tilde_e = val;
  193. obj.invalidate_eigenvalues();
  194. end
  195. function set.mu_tilde_i(obj, val)
  196. obj.mu_tilde_i = val;
  197. obj.invalidate_eigenvalues();
  198. end
  199. function set.sigma_tilde_e(obj, val)
  200. obj.sigma_tilde_e = val;
  201. obj.invalidate_eigenvalues();
  202. end
  203. function set.sigma_tilde_i(obj, val)
  204. obj.sigma_tilde_i = val;
  205. obj.invalidate_eigenvalues();
  206. end
  207. function set.zrs_mode(obj, val)
  208. obj.zrs_mode = val;
  209. obj.invalidate_eigenvalues();
  210. end
  211. function set.shift(obj, val)
  212. obj.shift = val;
  213. obj.invalidate_eigenvalues();
  214. end
  215. %% Parameter Setters
  216. function set_params(obj, mu_tilde_e, mu_tilde_i, sigma_tilde_e, sigma_tilde_i, f, alpha)
  217. % Set all parameters in Harris 2023 notation
  218. % Arguments: mu_tilde_e, mu_tilde_i, sigma_tilde_e, sigma_tilde_i, f, alpha
  219. if nargin > 1, obj.mu_tilde_e = mu_tilde_e; end
  220. if nargin > 2, obj.mu_tilde_i = mu_tilde_i; end
  221. if nargin > 3, obj.sigma_tilde_e = sigma_tilde_e; end
  222. if nargin > 4, obj.sigma_tilde_i = sigma_tilde_i; end
  223. if nargin > 5, obj.f = f; end
  224. if nargin > 6, obj.alpha = alpha; end
  225. end
  226. function set_alpha(obj, alpha)
  227. % Set alpha (sparsity) independently
  228. obj.alpha = alpha;
  229. end
  230. function set_zrs_mode(obj, mode)
  231. % Set the zero row-sum mode
  232. valid_modes = {'none', 'ZRS', 'SZRS', 'Partial_SZRS'};
  233. if ~ismember(mode, valid_modes)
  234. error('Invalid ZRS mode. Valid choices: %s', strjoin(valid_modes, ', '));
  235. end
  236. obj.zrs_mode = mode;
  237. end
  238. function sigma_tilde_i = compute_sigma_tilde_i_for_target_variance(obj, target_variance)
  239. % Compute sigma_tilde_i to achieve a target expected variance Var(W)
  240. % Check that alpha = 1 (dense case only)
  241. if obj.alpha < 1
  242. error('RMT:SparseCaseNotSupported', ...
  243. 'compute_sigma_tilde_i_for_target_variance only supports dense matrices (alpha=1). For alpha<1, a more complex solver is needed.');
  244. end
  245. % For dense case (alpha=1), sigma_se^2 = sigma_tilde_e^2
  246. sigma_se_sq = obj.sigma_tilde_e^2;
  247. sigma_si_sq = (target_variance - obj.f * sigma_se_sq) / (1 - obj.f);
  248. % Check that the result is valid (non-negative)
  249. if sigma_si_sq < 0
  250. error('RMT:InvalidTargetVariance', ...
  251. 'Target variance %.4f is too small. Minimum achievable is %.4f (when sigma_tilde_i=0).', ...
  252. target_variance, obj.f * sigma_se_sq);
  253. end
  254. sigma_tilde_i = sqrt(sigma_si_sq);
  255. end
  256. %% Internal Updates
  257. function update_sparsity(obj)
  258. obj.S = rand(obj.N, obj.N) < obj.alpha;
  259. obj.invalidate_eigenvalues();
  260. end
  261. %% Display and Diagnostics
  262. function display_parameters(obj)
  263. % Display measured statistics from W and compare to theoretical predictions
  264. W_mat = obj.W;
  265. % Remove diagonal for statistics since they may contain shift
  266. W_no_diag = W_mat;
  267. W_no_diag(1:obj.N+1:end) = NaN;
  268. % Extract E and I columns
  269. E_idx = obj.E;
  270. W_E = W_no_diag(:, E_idx);
  271. W_I = W_no_diag(:, ~E_idx);
  272. % For sparse matrices, only consider non-zero entries
  273. W_E_vals = W_E(~isnan(W_E) & (W_E ~= 0));
  274. W_I_vals = W_I(~isnan(W_I) & (W_I ~= 0));
  275. % Measured statistics (of non-zero entries)
  276. measured_mu_E = mean(W_E_vals);
  277. measured_mu_I = mean(W_I_vals);
  278. measured_sigma_E = std(W_E_vals, 1);
  279. measured_sigma_I = std(W_I_vals, 1);
  280. % Theoretical predictions (use dependent properties directly)
  281. mu_se = obj.mu_se;
  282. mu_si = obj.mu_si;
  283. sigma_se_sq = obj.sigma_se_sq;
  284. sigma_si_sq = obj.sigma_si_sq;
  285. lambda_O = obj.lambda_O;
  286. R = obj.R;
  287. fprintf('\n========== RMT Parameter Summary ==========\n');
  288. if ~isempty(obj.description)
  289. fprintf('Description: %s\n', obj.description);
  290. end
  291. fprintf('Mode: %s\n', obj.zrs_mode);
  292. fprintf('N: %d\n', obj.N);
  293. fprintf('alpha: %.4f\n', obj.alpha);
  294. fprintf('f: %.4f\n', obj.f);
  295. fprintf('\n--- Harris 2023 Notation ---\n');
  296. fprintf(' Set Value Sparse Eff. Measured(NZ)\n');
  297. fprintf('--------------------------------------------------------------\n');
  298. fprintf('mu_tilde_e %10.4f mu_se=%.4f %.4f\n', obj.mu_tilde_e, mu_se, measured_mu_E);
  299. fprintf('mu_tilde_i %10.4f mu_si=%.4f %.4f\n', obj.mu_tilde_i, mu_si, measured_mu_I);
  300. fprintf('sigma_tilde_e %10.4f sigma_se=%.4f %.4f\n', obj.sigma_tilde_e, sqrt(sigma_se_sq), measured_sigma_E);
  301. fprintf('sigma_tilde_i %10.4f sigma_si=%.4f %.4f\n', obj.sigma_tilde_i, sqrt(sigma_si_sq), measured_sigma_I);
  302. fprintf('\n--- Theoretical Predictions (Eq 17, 18) ---\n');
  303. fprintf('lambda_O (outlier): %.4f\n', lambda_O);
  304. fprintf('R (radius): %.4f\n', R);
  305. fprintf('==============================================\n\n');
  306. end
  307. %% Eigenvalue Computation (with caching)
  308. function eigs = get_eigenvalues(obj)
  309. % Get eigenvalues, computing only if cache is invalid
  310. if ~obj.eigenvalues_valid || isempty(obj.eigenvalues_cache)
  311. obj.eigenvalues_cache = eig(obj.W);
  312. obj.eigenvalues_valid = true;
  313. end
  314. eigs = obj.eigenvalues_cache;
  315. end
  316. function compute_eigenvalues(obj)
  317. % Force recomputation and cache update
  318. obj.eigenvalues_cache = eig(obj.W);
  319. obj.eigenvalues_valid = true;
  320. end
  321. function eigs = eigenvalues(obj)
  322. % Property-like access for eigenvalues
  323. eigs = obj.get_eigenvalues();
  324. end
  325. %% Plotting
  326. function plot_spectrum(obj, ax)
  327. if nargin < 2
  328. figure; ax = gca;
  329. end
  330. eigs = obj.get_eigenvalues();
  331. % Get theoretical radius and center
  332. R = obj.R;
  333. xc = obj.shift;
  334. yc = 0;
  335. % Compute distances from center for all eigenvalues
  336. distances = abs(eigs - xc - 1i*yc);
  337. % Plot interior eigenvalues (within R) as black circles
  338. mSize = 4;
  339. interior_mask = distances <= R;
  340. interior_eigs = eigs(interior_mask);
  341. plot(ax, real(interior_eigs), imag(interior_eigs), 'ko', 'MarkerSize', mSize, 'MarkerFaceColor', 'none', 'LineWidth', 0.5);
  342. hold(ax, 'on');
  343. % Plot theoretical radius (Eq 18)
  344. theta = linspace(0, 2*pi, 100);
  345. plot(ax, xc + R*cos(theta), yc + R*sin(theta), 'k-', 'LineWidth', 2);
  346. % Plot near outlier eigenvalues (between R and outlier_threshold*R) as black Xs
  347. near_outlier_mask = (distances > R) & (distances <= obj.outlier_threshold * R);
  348. near_outlier_eigs = eigs(near_outlier_mask);
  349. if ~isempty(near_outlier_eigs)
  350. plot(ax, real(near_outlier_eigs), imag(near_outlier_eigs), 'kx', 'MarkerSize', mSize, 'LineWidth', 0.5);
  351. end
  352. % Plot far outlier eigenvalues (beyond outlier_threshold*R) as green filled circles
  353. far_outlier_mask = distances > obj.outlier_threshold * R;
  354. far_outlier_eigs = eigs(far_outlier_mask);
  355. if ~isempty(far_outlier_eigs)
  356. plot(ax, real(far_outlier_eigs), imag(far_outlier_eigs), 'o', 'MarkerSize', mSize, 'MarkerFaceColor', [0 .7 0], 'MarkerEdgeColor', [0 .7 0]);
  357. end
  358. xlabel(ax, 'Re(\lambda)');
  359. ylabel(ax, 'Im(\lambda)');
  360. grid(ax, 'on');
  361. axis(ax, 'equal');
  362. hold(ax, 'off');
  363. end
  364. %% Deep Copy
  365. function new_obj = copy(obj)
  366. % Create new object with same N
  367. new_obj = RMT(obj.N);
  368. % Copy stored (non-dependent) properties
  369. new_obj.alpha = obj.alpha;
  370. new_obj.f = obj.f;
  371. new_obj.mu_tilde_e = obj.mu_tilde_e;
  372. new_obj.mu_tilde_i = obj.mu_tilde_i;
  373. new_obj.sigma_tilde_e = obj.sigma_tilde_e;
  374. new_obj.sigma_tilde_i = obj.sigma_tilde_i;
  375. new_obj.A = obj.A;
  376. new_obj.S = obj.S;
  377. new_obj.zrs_mode = obj.zrs_mode;
  378. new_obj.shift = obj.shift;
  379. new_obj.description = obj.description;
  380. new_obj.outlier_threshold = obj.outlier_threshold;
  381. new_obj.eigenvalues_cache = obj.eigenvalues_cache;
  382. new_obj.eigenvalues_valid = obj.eigenvalues_valid;
  383. end
  384. end
  385. methods (Access = private)
  386. function invalidate_eigenvalues(obj)
  387. obj.eigenvalues_valid = false;
  388. end
  389. end
  390. end

RMT.m at commit ac4d3b9, under MIT · at the source

Overview

Authors: Thomas J. Richner1, Martynas Dervinis1, Brian Nils Lundstrom1
  1. Department of Neurology, Mayo Clinic, Rochester, MN, United States
Institutions: Mayo Clinic (United States)
Journal: Frontiers in computational neuroscience, volume 20, article 1761735
Dates: received 5 December 2025; accepted 14 February 2026; published online 10 April 2026
Type: Brief report · Language: English
License: CC BY
Identifiers: DOI 10.3389/fncom.2026.1761735 · PMID 42038529 · PMCID PMC13106433 · OpenAlex W7153018175
Open access: gold, a free copy (OpenAlex)
Status: code verified
Methods: Statistics, Machine learning, Single-unit activity, calcium imaging
Keywords: adaptation, edge of chaos, recurrent neural networks, spike frequency adaptation, short-term synaptic depression, effective connectivity, random matrix theory, excitation-inhibition balance
Topic: Neural dynamics and brain function (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: NINDS (R01NS129622, K23NS112339)
Citations: cited by 1 paper (Europe PMC); 70 references in the paper

Abstract

The brain is a highly recurrent, nonlinear network hypothesized to remain near the edge of chaos for optimal performance. Excitation and inhibition must be balanced precisely within every neuron to ensure a consistent level of dynamical stability and rich dynamics during transition to chaos. However, analysis of biologically realistic synaptic weight matrices suggests that sparsity and low-dimensional structure interact such that there is no known synaptic balancing rule that constrains the stability (i.e., eigenvalues) of the network while also preserving computationally useful, low-dimensional structure. Further, even if a network were well-balanced, external stimuli interact with the nonlinear activation functions to unbalance the network in real time. Therefore, the brain must utilize dynamic, rather than static, mechanisms to actively regulate its level of stability. We propose that two specific adaptation mechanisms, spike frequency adaptation (SFA) and short-term synaptic depression (STD), continuously modulate the effective connectivity, keeping the brain near the edge of chaos and reducing dynamical fluctuations caused by stimuli. This theoretical framework links intrinsic and synaptic negative feedback mechanisms to network-level dynamics. This offers an explanation of why data-driven modeling of human brain signals, an exciting and useful method in epilepsy and anesthesiology research, seems to require linear time-varying (LTV) models which are refit every half second: difficult to observe adaptation processes interact with nonlinearities to make connectivity effectively dynamic at the macroelectrode scale. We suggest that compromised adaptation may underlie neurological conditions characterized by altered excitability, and that targeted brain stimulation could be used to probe the regulatory action of adaptation.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 8 matches between paragraphs and lines of code.

TomRichner/ConnectivityAdaptation

License: MIT
State: the link answers, verified on 29 September 2026
Evidence: files inventoried
Commit: ac4d3b92aa678686afd3e734248c743ed2a3614f, 7 May 2026
Languages: MATLAB (56), Shell (2)
Size: 188 files, 58 scripts
Software Heritage: not archived
Found in: “Data availability statement”
Holds: README, license file, documentation
Not found: CITATION.cff, environment file, tests, continuous integration
Availability: 1 check, the latest on 29 September 2026: the link answers
  • 29 September 2026: the link answers
60 files

The paper's code and data availability statement is in the Data section.

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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 58 scripts, each with its path and the digest of its content;
  • 8 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

The datasets presented in this study can be found in an online repository. Additional documentation, and all code to reproduce the data and figures, is available in the following repository: https://github.com/TomRichner/ConnectivityAdaptation.

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 1, 29 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 3 authors, 8 keywords, 1 funder, 68 references.

Cite

This paper

Richner, T. J., Dervinis, M., & Lundstrom, B. N. (2026). Adaptation modulates effective connectivity and network stability. Frontiers in computational neuroscience, 20, 1761735. https://doi.org/10.3389/fncom.2026.1761735

BibTeX

@article{richner2026adaptation,
author = {Richner, Thomas J. and Dervinis, Martynas and Lundstrom, Brian Nils},
title = {{Adaptation modulates effective connectivity and network stability}},
journal = {Frontiers in computational neuroscience},
year = {2026},
month = apr,
volume = {20},
pages = {1761735},
publisher = {Frontiers Media SA},
issn = {1662-5188},
doi = {10.3389/fncom.2026.1761735},
url = {https://doi.org/10.3389/fncom.2026.1761735},
pmid = {42038529},
pmcid = {PMC13106433}
}

RIS

TY - JOUR
AU - Richner, Thomas J.
AU - Dervinis, Martynas
AU - Lundstrom, Brian Nils
TI - Adaptation modulates effective connectivity and network stability
T2 - Frontiers in computational neuroscience
J2 - Front Comput Neurosci
PY - 2026
DA - 2026/04/10
VL - 20
SP - 1761735
SN - 1662-5188
PB - Frontiers Media SA
DO - 10.3389/fncom.2026.1761735
UR - https://doi.org/10.3389/fncom.2026.1761735
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fncom.2026.1761735",
"type": "article-journal",
"title": "Adaptation modulates effective connectivity and network stability",
"container-title": "Frontiers in computational neuroscience",
"author": [
{
"family": "Richner",
"given": "Thomas J."
},
{
"family": "Dervinis",
"given": "Martynas"
},
{
"family": "Lundstrom",
"given": "Brian Nils"
}
],
"container-title-short": "Front Comput Neurosci",
"volume": "20",
"page": "1761735",
"DOI": "10.3389/fncom.2026.1761735",
"PMID": "42038529",
"PMCID": "PMC13106433",
"ISSN": "1662-5188",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fncom.2026.1761735",
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
10
]
]
}
}

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.1038/s41467-026-74228-0 [code]
Spatial and network principles behind neural generation of locomotion.
Journal: Nature communications
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 3 references
[2] doi:10.1038/s41586-026-10528-1 [code]
A critical initialization for biological neural networks.
Journal: Nature
In common: 4 references
[3] doi:10.1038/s41467-026-74466-2 [code]
Neuromorphic hierarchical modular reservoirs.
Journal: Nature communications
In common: 3 references
[4] doi:10.1016/j.neurot.2026.e01031
Single-neuron responses to neurostimulation: Insights for epilepsy.
Journal: Neurotherapeutics : the journal of the American Society for Experimental NeuroTherapeutics
In common: 3 references
[5] doi:10.1038/s41598-026-53098-y
Illuminating the black box of reservoir computing.
Journal: Scientific reports
In common: 3 references
[6] doi:10.1007/s10827-026-00936-7 [code]
When can neuronal activity-dependent homeostatic plasticity maintain circuit-level properties?
Journal: Journal of computational neuroscience
In common: 3 references
[7] doi:10.1126/sciadv.aed6417 [code]
Intrinsic timing, not temporal prediction, underlies ramping dynamics in visual and parietal cortex during passive behavior.
Journal: Science advances
In common: 3 references
[8] doi:10.1038/s41467-026-74460-8 [code]
Spike-based alignment learning solves the weight transport problem.
Journal: Nature communications
In common: 3 references
[9] doi:10.7554/elife.110685 [code]
Sensory adaptation and pupil-linked arousal support flexible evidence accumulation during perceptual decision making.
Journal: eLife
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 1 reference
[10] doi:10.1371/journal.pbio.3003735 [code]
A widespread animal communication tempo may resonate with the receiver's brain.
Journal: PLoS biology
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 1 reference

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.

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.