Disinhibitory signaling enables flexible coding of top-down information in cortical networks.
The 20 matches · 4 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Methods › SVM decoding and state space analyses ↔ analysis/decoding/svm_decoding_timeseries.py, lines 238–302 · score 0.79 · fold cross validated, support vector, firing rate, SVC, SVM, classifier
- [2] § Methods › Experimental data ↔ analysis/decoding/svm_decoding.m, lines 1–21 · score 0.70 · linear SVM decoding, random train, sliding, trained models, Classifiers, splits
- [3] § Results › Two-module RNN model with hierarchical organization ↔ analysis/two_layer_connection_timeconstant.m, lines 1–95 · score 0.68 · connection strengths, feedforward inhibitory, synaptic decay, sensory module, module RNN, excitatory
- [4] § Methods › Identifying task and attention cue selective units ↔ analysis/helpers/fnc_instr2_neus.m, the whole file · a weak match · score 0.68 · Wilcoxon rank sum, instruction window, firing rate, pro DMS, DMS task, selective
- [5] § Methods › CEBRA analysis ↔ analysis/cebra/cebra_for_matlab.ipynb, lines 102–125 · score 0.68 · offset10 model architecture, batch, cosine, offsets, CEBRA, distance
- [6] § Results › Dynamic encoding of top-down information by RNNs ↔ analysis/cebra/two_modality_attended_unattended.m, lines 1–139 · score 0.66 · modality attended, pro task, unattended modality, stimulus identities, teal, modality DMS
- [7] § Methods › CEBRA analysis ↔ analysis/two_layer_lesion/cebra_for_matlab.ipynb, lines 70–85 · score 0.66 · offset10 model architecture, batch, cosine, offsets, CEBRA, distance
- [8] § Methods › Cross-temporal discriminability analysis ↔ analysis/decoding/cross_temporal_across_models.m, lines 200–244 · score 0.65 · cross temporal discriminability, Fisher, Pearson, diagonal, correlation, transformation
- [9] § Results › Dynamic encoding of top-down information by RNNs ↔ analysis/cebra_euclidean_distance/euclidean_distance.py, lines 1–32 · score 0.65 · Euclidean distance, trajectory separation, unattended modality, quantify, modality DMS, RNN
- [10] § Methods › SVM decoding and state space analyses ↔ analysis/fixed_points/run_RNN_search.py, lines 82–133 · score 0.65 · outlier distance scale, instruction period, optimization
- [11] § Methods › Identifying task and attention cue selective units ↔ analysis/helpers/fnc_task_neus_two_layers.m, the whole file · a weak match · score 0.63 · Wilcoxon rank sum, instruction window, firing rate, pro DMS, selective, anti
- [12] § Methods › Continuous-rate RNN model ↔ analysis/helpers/fnc_eval_model.m, the whole file · a weak match · score 0.63 · connection weights, weight matrix, firing rates, channels, sigmoid, variable
- [13] § Methods › Continuous-rate RNN model ↔ analysis/helpers/fnc_eval_model2.m, lines 12–88 · score 0.63 · connection weights, weight matrix, firing rates, channels, sigmoid, variable
- [14] § Methods › Centrality measure ↔ 3eh_centrality_time.py, lines 103–143 · score 0.63 · closeness centrality, distance matrix, NetworkX
- [15] § Results › Two-module RNN model with hierarchical organization ↔ analysis/two_layer_connection_timeconstant.m, lines 1–95 · score 0.61 · feedforward inhibitory, sensory module, module RNN, inhibitory connections, excitatory, trained
- [16] § Methods › Experimental data ↔ analysis/decoding/svm_decoding_timeseries.py, lines 238–302 · score 0.59 · fold cross validated, SVM decoding, linear, cue
- [17] § Results › Dynamic encoding of top-down information by RNNs ↔ analysis/cebra/two_modality_attended_unattended_eucl_dist.m, lines 1–49 · score 0.58 · trajectory separation, stimulus identities, quantify, Euclidean, modality DMS, unattended
- [18] § Results › Dynamic encoding of top-down information by RNNs ↔ analysis/cebra/two_modality_pro_anti.m, the whole file · a weak match · score 0.57 · pro task, stimulus identities, modality DMS task, pro DMS, teal, task cue
- [19] § Results › Introducing retro-cue condition elicits shift in strategy ↔ analysis/decoding/plot_cross_temporal.m, lines 25–174 · score 0.56 · epoch boundaries, unattended modality, discriminability, temporal, onset, delay
- [20] § Results › Inhibitory units play a critical role in both encoding and maintaining top-down information ↔ 3eh_centrality_time.py, lines 103–143 · score 0.52 · closeness centrality, functional connectivity, activation, distance, neurons
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
Python · 318 lines · 13 KB · CC-BY-4.0 · 2 matches
- import numpy as np
- import scipy.io as si
- import os
- import h5py
- from sklearn.model_selection import KFold
- from imblearn.over_sampling import RandomOverSampler
- from imblearn.under_sampling import RandomUnderSampler
- from sklearn.svm import SVC
- import sklearn.pipeline as skp
- from sklearn.preprocessing import StandardScaler
- import matplotlib.pyplot as plt
- from functools import partial
- from joblib import Parallel, delayed
- import json
- from matplotlib.patches import Rectangle
- import pdb
- import scipy.stats as sst
- #rootpath = os.path.join(os.getcwd(), '..')
- #sys.path.append(rootpath)
- from custom_loadmat import custom_loadmat
- class NumpyEncoder(json.JSONEncoder):
- def default(self, obj):
- if isinstance(obj, np.ndarray):
- return obj.tolist()
- return json.JSONEncoder.default(self, obj)
- def trim_to_match_mean(fr_inh, fr_exc, atol=1e-12):
- fr_inh = np.asarray(fr_inh, dtype=float)
- fr_exc = np.asarray(fr_exc, dtype=float)
- # Optionally ignore NaNs
- mask_valid = ~np.isnan(fr_inh)
- x = fr_inh[mask_valid]
- target = np.nanmean(fr_exc)
- if x.size == 0:
- return x, np.array([], dtype=int), np.nan
- S = x.sum()
- N = x.size
- mu0 = S / N
- # If already <= target, nothing to remove
- if mu0 <= target + atol:
- kept_idx_global = np.nonzero(mask_valid)[0] # keep all valid
- return fr_inh[mask_valid], kept_idx_global, mu0
- # If even the minimum element is above target, not achievable by removing top values
- xmin = x.min()
- if target < xmin - atol:
- # Best you can do is keep only the smallest element(s)
- # Here we keep all elements equal to xmin
- keep_local = np.where(x == xmin)[0]
- kept = x[keep_local]
- kept_idx_global = np.nonzero(mask_valid)[0][keep_local]
- return kept, kept_idx_global, kept.mean()
- # Sort descending so cumulative removal is from the top
- order_desc = np.argsort(-x)
- xd = x[order_desc]
- csum = np.concatenate(([0.0], np.cumsum(xd))) # csum[k] = sum of top k removed
- k = np.arange(0, N + 1)
- denom = (N - k).astype(float)
- denom[denom == 0] = np.nan # avoid divide-by-zero for k=N
- rem_mean = (S - csum) / denom # remaining mean after removing top k
- # Find smallest k with remaining mean <= target
- feasible = np.where(rem_mean <= target + atol)[0]
- if feasible.size == 0:
- k_star = N # degenerate; shouldn't happen due to xmin check above
- else:
- k_star = feasible[0]
- # Build kept set and map back to original indices
- keep_local_desc = np.arange(k_star, N) # indices in the desc-sorted array
- keep_local_orig = order_desc[keep_local_desc]
- kept_idx_global = np.nonzero(mask_valid)[0][keep_local_orig]
- kept = fr_inh[kept_idx_global]
- return kept, kept_idx_global, kept.mean()
- # This function looks up the identities of attended modality stimuli, depending on which modality is cued in each trial
- def get_attended_id(id1,id2,cue):
- nTrials = id1.shape[1]
- attended_id = np.zeros((2,nTrials))
- unattended_id = np.zeros((2,nTrials))
- for tI in np.arange(nTrials):
- if cue[0,tI] == -1:
- attended_id[:,tI] = id1[:,tI]
- unattended_id[:,tI] = id2[:,tI]
- elif cue[0,tI] == 1:
- attended_id[:,tI] = id2[:,tI]
- unattended_id[:,tI] = id1[:,tI]
- return attended_id, unattended_id
- # Model loader for each model type
- def load_model(mI,subfolders,model_type):
- print('Loading model ', mI)
- model_folder = subfolders[mI]
- trial_path = os.path.join(model_folder, 'trials.mat')
- trials = {}
- # Skip if trials have not yet been generated for this model
- if not os.path.isfile(trial_path):
- return {}
- # Getting excitatory and inhibitory neurons
- model_name = os.path.basename(os.path.normpath(model_folder))+'.mat'
- model_weights_folder = os.path.abspath(os.path.join(model_folder,os.pardir,os.pardir))
- model_weights_file = os.path.join(model_weights_folder,model_name)
- rnn_data = custom_loadmat(model_weights_file)
- exc = np.where(rnn_data['exc'])[0]
- inh = np.where(rnn_data['inh'])[0]
- # Get matrix of simulated trials
- with h5py.File(trial_path, "r") as f:
- simulated_trials = f['results']
- trials['instr_amp_trials'] = simulated_trials['instr_amp_trials'][()] # Instruction amplitude
- trials['instr_t_trials'] = simulated_trials['instr_t_trials'][()] # Instruction timing
- trials['oo_trials'] = simulated_trials['oo_trials'][()] # Outputs
- trials['rr_trials'] = simulated_trials['rr_trials'][()] # Firing rates
- trials['u_trials'] = simulated_trials['u_trials'][()] # Input to RNN
- if model_type == 'instr': # One-modality models
- trials['stim_id_trials'] = simulated_trials['stim_id_trials'][()]
- trials['stim_lab_trials'] = simulated_trials['stim_lab_trials'][()]
- elif model_type == 'instr2': # Two-modality models
- trials['stim_id1_trials'] = simulated_trials['stim_mod1_trials'][()]
- trials['stim_id2_trials'] = simulated_trials['stim_mod2_trials'][()]
- trials['stim_lab1_trials'] = simulated_trials['stim_lab1_trials'][()]
- trials['stim_lab2_trials'] = simulated_trials['stim_lab2_trials'][()]
- trials['cue_amp_trials'] = simulated_trials['cue_amp_trials'][()] # Modality cue
- # Get id of stim in attended/unattended modalities
- trials['attended_id_trials'],trials['unattended_id_trials'] = get_attended_id(trials['stim_id1_trials'],trials['stim_id2_trials'],trials['cue_amp_trials'])
- # Getting stims by order (stim1 / stim2)
- trials['attended_id_trials_1'], trials['attended_id_trials_2'] = trials['attended_id_trials'][0,:], trials['attended_id_trials'][1,:]
- trials['unattended_id_trials_1'], trials['unattended_id_trials_2'] = trials['unattended_id_trials'][0,:], trials['unattended_id_trials'][1,:]
- return trials, exc, inh
- def fit_svm(tI,X,y,train,test,ic):
- # Ensuring equal representation across classes with undersampling within fold
- undersample = RandomUnderSampler(sampling_strategy='all')
- X_train,X_test = np.squeeze(X[train,:]),np.squeeze(X[test,:])
- X_under, ic_under = undersample.fit_resample(X_train, ic[train])
- y_train,y_test = np.squeeze(y[train]),np.squeeze(y[test])
- y_under = y_train[undersample.sample_indices_]
- clf.fit(X_under, y_under)
- score = clf.score(X_test, y_test)
- return score
- def selectTrials(trials,sampleTrials_case):
- # Choosing which trials to decode from
- if sampleTrials_case == 'instruction_first':
- sampleTrials = np.squeeze(trials['instr_t_trials'] == -1) # Instruction first
- elif sampleTrials_case == 'instruction_second':
- sampleTrials = np.squeeze(trials['instr_t_trials'] == 1) # Instruction second
- elif sampleTrials_case == 'first_modality':
- sampleTrials = np.squeeze(trials['cue_amp_trials'] == -1) # First modality
- elif sampleTrials_case == 'second_modality':
- sampleTrials = np.squeeze(trials['cue_amp_trials'] == 1) # Second modality
- elif sampleTrials_case == 'first_modality_instruction_first':
- sampleTrials = np.squeeze((trials['cue_amp_trials'] == -1) & (trials['instr_t_trials'] == -1)) # First modality and instruction first
- elif sampleTrials_case == 'second_modality_instruction_first':
- sampleTrials = np.squeeze((trials['cue_amp_trials'] == 1) & (trials['instr_t_trials'] == -1)) # Second modality and instruction first
- elif sampleTrials_case == 'all_trials':
- sampleTrials = np.squeeze(trials['instr_t_trials'] != 0) # All trials
- return sampleTrials
- # Load data generated for each model separately
- base_folder = '/home/shared/instruction_timing/models/instr/P_rec_0.2_Taus_4.0_25.0/abs/' # One modality
- #base_folder = '/home/shared/instruction_timing/models/instr2/P_rec_0.2_Taus_4.0_25.0/abs/' # Two modalities
- #base_folder = '/home/shared/instruction_timing/models/instr/P_rec_0.2_Taus_4.0_25.0/abs_two_layers/' # One modality / two layers
- #base_folder = '/home/shared/instruction_timing/models/instr/P_rec_0.2_Taus_4.0_25.0/abs_two_layers_wo_inh_feedforward/' # One modality / two layers
- os.walk(os.path.join(base_folder,'results'))
- #folders = [x[0] for x in os.walk(base_folder)]
- folders = [x[0] for x in os.walk(os.path.join(base_folder,'results'))]
- subfolders = folders[1:]
- # How many separate models were fit
- nModels = len(subfolders)
- print('# loaded models: ', nModels)
- # Which model type is being used (1 modality vs. 2 modality)
- if 'instr2' in base_folder:
- model_type = 'instr2'
- elif 'instr' in base_folder:
- model_type = 'instr'
- # Decoding each model separately
- nFolds = 5
- # Choosing which variable to decode
- decoded_label = 'instr_amp_trials'
- #decoded_label = 'cue_amp_trials'
- #decoded_label = 'attended_id_trials'
- #decoded_label = 'unattended_id_trials'
- # Which stimulus to decode and time window (0/1/-1=all)
- #stim_idx = 0
- #stim_idx = 1
- stim_idx = -1
- # Time axis
- if stim_idx == 0:
- time_axis = np.arange(0,130)
- elif stim_idx == 1:
- time_axis = np.arange(130,230)
- elif stim_idx == -1:
- time_axis = np.arange(350)
- nTimes = len(time_axis)
- # Choosing which trials subset to decode from (instruction_first, instruction_second, all_trials)
- sampleTrials_case = 'instruction_first'
- #sampleTrials_case = 'instruction_second'
- # Target neurons for decoding
- #target_neurons = 'layer1_inh'
- #target_neurons = 'layer1_exc'
- #target_neurons = 'layer2_inh'
- #target_neurons = 'layer2_exc'
- target_neurons = 'inh'
- #target_neurons = 'exc'
- #target_neurons = 'matched'
- if 'layer1' in target_neurons:
- layer_neurons = np.arange(200)
- elif 'layer2' in target_neurons:
- layer_neurons = np.arange(200,1000)
- else:
- layer_neurons = np.arange(1000)
- # Decoding models separately
- score = np.zeros((nModels,nFolds,nTimes))
- for mI in np.arange(nModels):
- trials, exc, inh = load_model(mI,subfolders,model_type)
- if not trials: # Skip if trials have not yet been generated for this model
- continue
- if 'exc' in target_neurons:
- selected_neurons = np.intersect1d(layer_neurons,exc)
- elif 'inh' in target_neurons:
- selected_neurons = np.intersect1d(layer_neurons,inh)
- elif 'matched' in target_neurons:
- exc_layer = np.intersect1d(layer_neurons,exc)
- inh_layer = np.intersect1d(layer_neurons,inh)
- sampleTrials = selectTrials(trials,sampleTrials_case)
- X = np.transpose(trials['rr_trials'][:,:,sampleTrials],(2,1,0))
- fr_all = np.mean(np.mean(X,axis=0),axis=0)
- fr_inh = fr_all[inh_layer]
- fr_exc = fr_all[exc_layer]
- kept_values, kept_indices, final_mean = trim_to_match_mean(fr_inh, fr_exc)
- selected_neurons = np.sort(inh_layer[kept_indices])
- else:
- selected_neurons = layer_neurons
- sampleTrials = selectTrials(trials,sampleTrials_case)
- # Loading firing rate data (nTrials x nTimes x nNeurons)
- X = np.transpose(trials['rr_trials'][:,:,sampleTrials],(2,1,0))
- X = X[:,:,selected_neurons]
- # Loading labels to be decoded
- # These labels only allow stim_idx = 0
- if decoded_label == 'instr_amp_trials' or decoded_label == 'cue_amp_trials' or stim_idx == -1:
- decoded_idx = 0
- else:
- decoded_idx = stim_idx
- y = trials[decoded_label][decoded_idx,sampleTrials]
- # Ensuring all classes have equal representation
- instr_amp = np.expand_dims(trials['instr_amp_trials'][decoded_idx,sampleTrials],axis=1)
- if model_type == 'instr2':
- cue_amp = np.expand_dims(trials['cue_amp_trials'][decoded_idx,sampleTrials],axis=1)
- attended_id = np.expand_dims(trials['attended_id_trials'][decoded_idx,sampleTrials],axis=1)
- unattended_id = np.expand_dims(trials['unattended_id_trials'][decoded_idx,sampleTrials],axis=1)
- all_labels = np.concatenate((instr_amp,cue_amp,attended_id,unattended_id,np.expand_dims(y,axis=1)),axis=1)
- elif model_type == 'instr':
- all_labels = np.concatenate((instr_amp,np.expand_dims(y,axis=1)),axis=1)
- uniqueConditions,ic = np.unique(all_labels,axis=0,return_inverse=True)
- # Standard pipeline to z-score and run support vector classifcation
- clf = skp.make_pipeline(SVC(kernel='linear'))
- # Performing kFold cross-validated SVM decoding
- model_score = np.zeros((nFolds, nTimes))
- kf = KFold(n_splits=nFolds)
- for tI,time_val in enumerate(time_axis):
- timeX = np.squeeze(X[:,time_val,:])
- if tI % 50 == 0:
- print('Model: ', mI, ' / Time: ', time_val)
- # Parallelize results for each fold
- score[mI,:,tI] = Parallel(n_jobs=24)(
- delayed(fit_svm)(time_val,timeX,y,train_index,test_index,ic)
- for fI, (train_index, test_index) in enumerate(kf.split(timeX))
- )
- # Save score to file
- valid_models = (np.sum(np.sum(score,axis=1),axis=1)) != 0
- valid_score = score[valid_models,:,:]
- # Save score to file
- save_data = {'score':valid_score, 'time_axis':time_axis}
- base_save_folder = os.path.abspath(os.path.join(base_folder))
- if model_type == 'instr': # One-modality models
- save_folder = os.path.join(base_save_folder,'decoding',sampleTrials_case,decoded_label,target_neurons,str(stim_idx))
- elif model_type == 'instr2': # Two-modality models
- save_folder = os.path.join(base_save_folder,'decoding',sampleTrials_case,decoded_label,'modality'+str(stim_idx),target_neurons)
- if not os.path.exists(save_folder):
- os.makedirs(save_folder)
- with open(os.path.join(save_folder, 'score.json'), 'w') as f:
- json.dump(save_data, f, cls=NumpyEncoder)
svm_decoding_timeseries.py, under CC-BY-4.0 · at the source
Overview
- Department of Biomedical Engineering, Columbia University, New York, New York, United States of America
- Department of Neurology, Cedars-Sinai Medical Center, Los Angeles, California, United States of America
Abstract
Flexible behavior requires the ability to modulate sensory processing based on task context, yet the circuit-level mechanisms supporting this capacity remain poorly understood. Here, we combine recurrent neural network modeling and neural recordings from mouse visual cortex to investigate how task context shapes sensory coding. Networks trained on an instruction-based discrimination task develop a disinhibitory interneuron-to-interneur
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 20 matches between paragraphs and lines of code.
Zenodo 20148662
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
123 files
- 2_ab_plot_energy_landsca
pe_over_null.py , Python, 198 lines - 3eh_centrality_time.py, Python, 232 lines, 2 matches
- 3eh_plot_centrality_time
.py , Python, 297 lines - S15_16.m, MATLAB, 162 lines
- S6.m, MATLAB, 348 lines
- S7.m, MATLAB, 421 lines
- analysis/
S15_16.m , MATLAB, 162 lines - analysis/
S6.m , MATLAB, 348 lines - analysis/
S7.m , MATLAB, 421 lines - analysis/
cebra/ , Jupyter, 230 lines, 1 matchcebra_for_matlab.ipynb - analysis/
cebra/ , MATLAB, 108 linesone_modality_cebra.m - analysis/
cebra/ , MATLAB, 164 lines, 1 matchtwo_modality_attended_un attended.m - analysis/
cebra/ , MATLAB, 128 lines, 1 matchtwo_modality_attended_un attended_eucl_dist.m - analysis/
cebra/ , MATLAB, 135 lines, 1 matchtwo_modality_pro_anti.m - analysis/
cebra_euclidean_distance , Python, 189 lines, 1 match/ euclidean_distance.py - analysis/
centrality/ , Python, 232 lines3eh_centrality_time.py - analysis/
centrality/ , Python, 297 lines3eh_plot_centrality_time .py - analysis/
decoding/ , MATLAB, 295 lines, 1 matchcross_temporal_across_mo dels.m - analysis/
decoding/ , MATLAB, 175 lines, 1 matchplot_cross_temporal.m - analysis/
decoding/ , MATLAB, 114 linesplot_svm_decoding.m - analysis/
decoding/ , MATLAB, 199 lines, 1 matchsvm_decoding.m - analysis/
decoding/ , MATLAB, 188 linessvm_decoding_lesion.m - analysis/
decoding/ , Python, 318 lines, 2 matchessvm_decoding_timeseries. py - analysis/
energy_landscapes/ , Python, 198 lines2_ab_plot_energy_landsca pe_over_null.py - analysis/
fixed_points/ , Python, 166 linesplot_fixed_points.py - analysis/
fixed_points/ , Python, 213 lines, 1 matchrun_RNN_search.py - analysis/
helpers/ , MATLAB, 111 lines, 1 matchfnc_eval_model.m - analysis/
helpers/ , MATLAB, 90 lines, 1 matchfnc_eval_model2.m - analysis/
helpers/ , MATLAB, 510 linesfnc_generate_trials.m - analysis/
helpers/ , MATLAB, 115 lines, 1 matchfnc_instr2_neus.m - analysis/
helpers/ , MATLAB, 108 linesfnc_instr2_neus_v2.m - analysis/
helpers/ , MATLAB, 98 linesfnc_task_neus.m - analysis/
helpers/ , MATLAB, 112 lines, 1 matchfnc_task_neus_two_layers .m - analysis/
helpers/ , MATLAB, 70 linesfnc_time_bootstrap.m - analysis/
helpers/ , MATLAB, 146 linesfnc_time_bootstrap_clust er.m - analysis/
model_performance/ , Jupyter, 398 linesmodel_performance_review .ipynb - analysis/
one_layer_lesion/ , MATLAB, 106 linesexport_instr2_lesion_cue _fixed_to_mod1_to_excel. m - analysis/
one_layer_lesion/ , MATLAB, 106 linesexport_instr2_lesion_cue _fixed_to_mod2_to_excel. m - analysis/
one_layer_lesion/ , MATLAB, 122 linesexport_instr2_task_lesio n_uncue2_to_excel.m - analysis/
one_layer_lesion/ , MATLAB, 122 linesexport_instr2_task_lesio n_uncue_to_excel.m - analysis/
one_layer_lesion/ , MATLAB, 100 linesexport_instr_lesion_resu lts_to_excel.m - analysis/
one_layer_lesion/ , MATLAB, 120 linesone_modality_intact_acro ss_models.m - analysis/
one_layer_lesion/ , MATLAB, 188 linesone_modality_one_layer_l esion_across_models.m - analysis/
one_layer_lesion/ , MATLAB, 130 linesplot_one_modality.m - analysis/
one_layer_lesion/ , MATLAB, 438 linesplot_two_modality.m - analysis/
one_layer_lesion/ , MATLAB, 206 linestwo_modality_one_layer_i ntact.m - analysis/
one_layer_lesion/ , MATLAB, 210 linestwo_modality_one_layer_l esion_across_models_cue. m - analysis/
one_layer_lesion/ , MATLAB, 212 linestwo_modality_one_layer_l esion_across_models_task .m - analysis/
plot_timeconstant.m , MATLAB, 85 lines - analysis/
time_constants/ , Python, 114 linesplot_timeconstant_review .py - analysis/
two_layer_connection_tim , MATLAB, 130 lines, 2 matcheseconstant.m - analysis/
two_layer_lesion/ , Jupyter, 160 lines, 1 matchcebra_for_matlab.ipynb - analysis/
two_layer_lesion/ , MATLAB, 109 linesexport_two_layer_instr_l esion_results_to_excel.m - analysis/
two_layer_lesion/ , MATLAB, 119 linesgenerate_trials.m - analysis/
two_layer_lesion/ , MATLAB, 193 linesone_modality_two_layer_l esion_across_models.m - analysis/
two_layer_lesion/ , MATLAB, 144 linesplot_one_modality.m - analysis/
two_layer_lesion/ , MATLAB, 278 linesvisualize_cebra.m - analysis/
two_layer_models/ , Python, 223 linesconnection_comparison_re view.py - analysis/
vip_decoding/ , Python, 60 linescustom_loadmat.py - analysis/
vip_decoding/ , MATLAB, 75 linesdecode_vip_figure_ground .m - analysis/
vip_decoding/ , Python, 234 linesdecode_vip_inhibition.py - cebra_for_matlab.ipynb, Jupyter, 230 lines
- connection_comparison_re
view.py , Python, 223 lines - cross_temporal_across_mo
dels.m , MATLAB, 295 lines - custom_loadmat.py, Python, 60 lines
- decode_vip_figure_ground
.m , MATLAB, 75 lines - decode_vip_inhibition.py
, Python, 234 lines - euclidean_distance.py, Python, 189 lines
- export_instr2_lesion_cue
_fixed_to_mod1_to_excel. , MATLAB, 106 linesm - export_instr2_lesion_cue
_fixed_to_mod2_to_excel. , MATLAB, 106 linesm - export_instr2_task_lesio
n_uncue2_to_excel.m , MATLAB, 122 lines - export_instr2_task_lesio
n_uncue_to_excel.m , MATLAB, 122 lines - export_instr_lesion_resu
lts_to_excel.m , MATLAB, 100 lines - export_two_layer_instr_l
esion_results_to_excel.m , MATLAB, 109 lines - fnc_eval_model.m, MATLAB, 111 lines
- fnc_eval_model2.m, MATLAB, 90 lines
- fnc_generate_trials.m, MATLAB, 510 lines
- fnc_instr2_neus.m, MATLAB, 115 lines
- fnc_instr2_neus_v2.m, MATLAB, 108 lines
- fnc_task_neus.m, MATLAB, 98 lines
- fnc_task_neus_two_layers
.m , MATLAB, 112 lines - fnc_time_bootstrap.m, MATLAB, 70 lines
- fnc_time_bootstrap_clust
er.m , MATLAB, 146 lines - generate_trials.m, MATLAB, 119 lines
- instr.sh, Shell, 15 lines
- instr2.sh, Shell, 15 lines
- instr2_retro.sh, Shell, 15 lines
- instr_wo_inh_feedforward
.sh , Shell, 15 lines - main.py, Python, 693 lines
- model.py, Python, 1,131 lines
- model_performance_review
.ipynb , Jupyter, 398 lines - one_modality_cebra.m, MATLAB, 108 lines
- one_modality_intact_acro
ss_models.m , MATLAB, 120 lines - one_modality_one_layer_l
esion_across_models.m , MATLAB, 188 lines - one_modality_two_layer_l
esion_across_models.m , MATLAB, 193 lines - plot_cross_temporal.m, MATLAB, 175 lines
- plot_fixed_points.py, Python, 166 lines
- plot_one_modality.m, MATLAB, 130 lines
- plot_svm_decoding.m, MATLAB, 114 lines
- plot_timeconstant.m, MATLAB, 85 lines
- plot_timeconstant_review
.py , Python, 114 lines - plot_two_modality.m, MATLAB, 438 lines
- run_RNN_search.py, Python, 213 lines
- svm_decoding.m, MATLAB, 199 lines
- svm_decoding_lesion.m, MATLAB, 188 lines
- svm_decoding_timeseries.
py , Python, 318 lines - training/
instr.sh , Shell, 15 lines - training/
instr2.sh , Shell, 15 lines - training/
instr2_retro.sh , Shell, 15 lines - training/
instr_wo_inh_feedforward , Shell, 15 lines.sh - training/
main.py , Python, 693 lines - training/
model.py , Python, 1,131 lines - training/
utils.py , Python, 65 lines - two_layer_connection_tim
econstant.m , MATLAB, 130 lines - two_modality_attended_un
attended.m , MATLAB, 164 lines - two_modality_attended_un
attended_eucl_dist.m , MATLAB, 128 lines - two_modality_one_layer_i
ntact.m , MATLAB, 206 lines - two_modality_one_layer_l
esion_across_models_cue. , MATLAB, 210 linesm - two_modality_one_layer_l
esion_across_models_task , MATLAB, 212 lines.m - two_modality_pro_anti.m, MATLAB, 135 lines
- utils.py, Python, 65 lines
- visualize_cebra.m, MATLAB, 278 lines
- README.md, Text, 74 lines
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;
- 122 scripts, each with its path and the digest of its content;
- 20 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
Datasets cited
- zenodo:20148306, at Zenodo; found in “Data Availability”
Data Availability
The code for the analyses performed in this study is available in 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 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 3 authors, 8 MeSH terms, 1 funder, 96 references.
Cite
This paper
Aquino, T. G., Kim, R., & Rungratsameetaweemana, N. (2026). Disinhibitory signaling enables flexible coding of top-down information in cortical networks. PLoS biology, 24(7), e3003831. https://
BibTeX
@article{aquino2026disin
author = {Aquino, Tomas G. and Kim, Robert and Rungratsameetaweemana, Nuttida},
title = {{Disinhibitory signaling enables flexible coding of top-down information in cortical networks}},
journal = {PLoS biology},
year = {2026},
month = jul,
volume = {24},
number = {7},
pages = {e3003831},
publisher = {PLOS},
issn = {1544-9173},
doi = {10.1371/
url = {https://
pmid = {42391203},
pmcid = {PMC13327264}
}
RIS
TY - JOUR
AU - Aquino, Tomas G.
AU - Kim, Robert
AU - Rungratsameetaweemana, Nuttida
TI - Disinhibitory signaling enables flexible coding of top-down information in cortical networks
T2 - PLoS biology
J2 - PLoS Biol
PY - 2026
DA - 2026/
VL - 24
IS - 7
SP - e3003831
SN - 1544-9173
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Disinhibitory signaling enables flexible coding of top-down information in cortical networks",
"container-title": "PLoS biology",
"author": [
{
"family": "Aquino",
"given": "Tomas G."
},
{
"family": "Kim",
"given": "Robert"
},
{
"family": "Rungratsameetaweemana",
"given": "Nuttida"
}
],
"container-title-short":
"volume": "24",
"issue": "7",
"page": "e3003831",
"DOI": "10.1371/
"PMID": "42391203",
"PMCID": "PMC13327264",
"ISSN": "1544-9173",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
2
]
]
}
}
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.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: pandas, SciPy, Matplotlib, 1 other tool, 10 references
- [2] doi:10.1016/j.isci.2026.116776 [code]
- Selective perturbation of mirror and non-mirror neurons in an in silico model of the action observation network.Journal: iScienceIn common: TensorFlow, SciPy, NumPy, 9 references
- [3] doi:10.7554/elife.109717 [code]
- Retrosplenial cortex enables context-dependent goal-directed sensorimotor transformation.Journal: eLifeIn common: h5py, Statistics and Machine Learning Toolbox, scikit-learn, 4 other tools, systems, mouse, 5 references
- [4] doi:10.1038/s41467-026-76104-3 [code]
- Sensorimotor remapping drives task specialization in prefrontal cortex.Journal: Nature communicationsIn common: NetworkX, scikit-learn, pandas, 3 other tools, systems, 6 references
- [5] doi:10.1038/s41586-026-10448-0 [code]
- Plasticity and language in the anaesthetized human hippocampus.Journal: NatureIn common: TensorFlow, Image Processing Toolbox, PyTorch, 4 other tools, 1 reference, author Robert Kim
- [6] doi:10.1371/journal.pcbi.1014162 [code]
- Exploring neural manifolds across a wide range of intrinsic dimensions.Journal: PLoS computational biologyIn common: TensorFlow, h5py, scikit-learn, 4 other tools, 5 references
- [7] doi:10.7554/elife.110588 [code]
- Opening the black box toward a modular approach to spike sorting.Journal: eLifeIn common: imbalanced-learn, TensorFlow, NetworkX, 7 other tools, mouse, 1 reference
- [8] doi:10.1016/j.neuron.2026.03.034 [code]
- Dentate gyrus interneurons modulate winner-take-all network dynamics in freely behaving mice.Journal: NeuronIn common: boundedline, NetworkX, h5py, 8 other tools, systems, mouse
- [9] doi:10.1016/j.neuron.2026.07.016 [code]
- Inferring brain-wide interactions using data-constrained recurrent neural network models.Journal: NeuronIn common: Image Processing Toolbox, Statistics and Machine Learning Toolbox, Matplotlib, 1 other tool, systems, mouse, 6 references
- [10] doi:10.1016/j.isci.2026.117375 [code]
- Motor priming is associated with widespread recruitment into neural ensembles and more rapid ensemble transitions.Journal: iScienceIn common: scikit-posthocs, NetworkX, h5py, 8 other tools, systems
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: 1 repository of the authors' code, each at its verified commit and with its license, 122 scripts, and 20 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:b4d71d04fed37604…
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
[.
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.
