NeuroPype Version: 2026.0.0

(Note: There was no Neuropype 2025.x release.)

Summary

This release brings a large Bayesian machine-learning expansion (a new family of sparse Bayesian logistic-regression classifiers), new connectivity and spectral methods (cross-spectral density, phase slope index, ridge/ARD MVAR), new diagnostics and signal-quality nodes, new real-time visualization nodes (including a new PlotDashboard node that can aggregate realtime plots from other visualization nodes into a single tiled window, and a new "stacked lines" mode to the TimeSeriesPlot). A new Notification node sends alerts via Email, Slack, Teams, Discord, or Pushover. The Resample node has been upgraded to perform realtime resampling on streaming data.

The major change in this release is the addition of a new, human-readable YAML-based pipeline file format (retains the .pyp extension) as an alternative to the legacy XML .pyp format. Unlike the old format, YAML pipelines are plain-text throughout (no base64 blobs), embed each node's properties directly in the node definition, and are diff- and merge-friendly, making them well suited to version control. The Neuropype API reads and writes both formats and auto-detects the legacy XML vs. YAML by inspecting the file content, so existing pipelines keep loading regardless of extension. Beyond full pipelines, NeuroPype can now load lightweight YAML parameter-override files that apply per-node property values to an already-loaded graph (matched by node UUID) — handy for parameter sweeps and configuration variants — and these can be supplied over the API. The bundled example pipelines have been converted to YAML. While the XML format will continue to be supported the YAML-based format will be the default going forward (the separate Pipeline Designer app has been updated to save in YAML format by default). You can load one of the example pipelines (in resources/examples/pipelines) in a plain text editor to see the format in action.

NeuroPype's REST API adds new endpoints and configuration options, including new /inputs and /outputs endpoints that return the files received / generated by an offline pipeline. Under the hood, the engine moves to NumPy 2.x, enables JAX 64-bit support by default, adds a graceful compute-backend fallback, and gains a number of new user-configurable settings.

As always, plenty of minor improvements, bugfixes, node documentation improvements/clarifications, etc.

New Nodes

  • Bayesian package:
    • TemplateModel: Classify data instances using Bayesian Logistic Regression with numpyro.
  • Connectivity package:
    • BayesianARDMVAR: Fit an adaptive multivariate autoregressive model (MVAR) using Bayesian regression with a grouped Automatic-Relevance-Determination (ARD) prior.
    • RidgeMVAR: Fit an adaptive multivariate autoregressive model (MVAR) using Tikhonov-regularized (ridge) regression.
  • Control_flow package:
    • Import: Import definitions from another pipeline.
  • Diagnostics package:
    • ChannelQualityClassification: This node inputs several other nodes, such as LineNoise, CorrelationMetric and HighFrequencyNoise, with provided classification cutoff values to threshold each metric and provide a final weighted "Bad Channel Classification" signal quality metric displayed as a single topoplot and/or output data packet as classification values 1, 2, or 3 (good, ok, bad).
    • DetectReferenceChannels: Automated detection of EEG channel(s) being used as a reference.
    • EEGQualityScore: Automated EEG quality scoring per channel based on weighted quality metrics.
    • EstimateTimeshift: Estimate the time shift between two streams in the given data, in seconds.
    • LowFrequencyNoise: A meta-node that obtains a ratio of low frequencies (e.g
    • PrintTable: Pretty-print tabular data to the console.
  • File_system package:
    • FileInfoExtraction: Extract metadata from a file containing signal data and (optionally) events, including filename, size, date created, date modified, number of channels, number of timepoints, sampling rate, and the list of channels.
  • File_system package:
    • ImportBIDSMetadata: Import metadata from BIDS sidecar files and apply it to an existing data packet.
  • Formatting package:
    • AxisToStream: Promote one or more axes in a packet to their own stream(s).
    • StreamToAxis: Reconstitute axes that had previously been promoted to a stream; this is the reverse operation of Axis to Stream.
  • Machine_learning package:
    • EmpiricalBayesClassification: Sparse Bayesian logistic regression using the empirical Bayes (type-II maximum likelihood) framework.
    • MethodEnsemblePredictor: Combine predictions from multiple distinct predictive pipelines.
    • R2D2BayesianClassification: Classify data instances using sparse Bayesian logistic regression with the R2-D2 prior.
    • RegularizedHorseshoeClassification: Classify data instances using sparse Bayesian logistic regression with a regularized horseshoe prior (Piironen and Vehtari, 2017).
    • RelaxedSpikeSlabClassification: Classify data instances using binary sparse Bayesian logistic regression with a relaxed (Gaussian) spike-and-slab prior.
    • SkinnyGibbsClassification: Binary sparse Bayesian logistic regression using the Skinny Gibbs Markov chain Monte Carlo sampler.
    • SpikeSlabHeredityClassification: Classify data instances using sparse Bayesian logistic regression with explicit main effects and interaction terms under a heredity-structured spike-and-slab prior.
    • SpikeSlabVBClassification: Classify data instances using binary sparse Bayesian logistic regression with a point-mass spike-and-slab variational posterior.
    • StackedPredictor: Learn a binary meta-predictor from out-of-fold predictions of several distinct base methods.
    • TangMartinClassification: Binary sparse logistic regression using the model- space variational empirical-Bayes approximation of Tang and Martin (2025).
  • Markers package:
    • ExtractMarkers: Extract (select) event markers that match one or more patterns, dropping all others.
  • Network package:
    • Notification: Send a notification via Email, Slack, Microsoft Teams, Discord, or Pushover.
  • Programming package:
    • StringSubstitute: Replace multiple placeholders in a string using a dictionary mapping.
  • Source_localization package:
    • ProjectOntoMesh: Projects each position on the space axis onto its nearest vertex on the mesh for the given headmodel.
  • Spectral package:
    • CrossSpectralDensity: Compute the complex multichannel cross-spectral density (CSD) matrix via the multi-taper method.
  • Statistics package:
    • CurveArea: Integrate area under the curve (AUC) using the composite trapezoidal rule of the data over a given axis.
  • Statistics package:
    • Mode: Compute the mode (most common value) of the data over a given axis value in the passed array.
  • Visualization package:
    • ImagePlotViewer: Plot streaming 2D data as a live image (heatmap) in real time.
    • MarkerTablePlot: Display event markers and their timestamps in a real-time table.
    • PlotDashboard: Display multiple plots side by side in a single window.
    • TablePlot: Display data values in a real-time table.
    • TimeSeriesDiff: Show the difference between two time series.

Renamed/Deprecated Nodes:

Newly deprecated (still available in this release, but slated for removal):

  • BreakStructure: replaced by DictSplit.
  • CreateStructure: replaced by CreateDict.
  • DateOperation: use ShiftTimestamps to shift timestamps.
  • ExtractMarkerTimestamps: use ExtractMarkers.
  • FindROIs: use SelectROIs.
  • LearningMethod: superseded by the pipeline import system (the Import node).
  • SanityCheck: use GateCheck instead, which now covers all of its checks.

Removed in this release (previously deprecated; no longer included in the build):

  • ArrayLookup: use GetItem (Get Item) instead.
  • CastValueToType: renamed to CastToType (Cast To Type).
  • ConcatStrings: renamed to StringConcatenate (String Concatenate).
  • CreateIndexRange: renamed to CreateSelectionInterval (Create Selection Interval).
  • InputPort, OutputPort: use the Input Slot / Output Slot nodes instead.
  • InspectData: renamed to InspectPacket (Inspect Packet).
  • Operate: renamed to OperateAxis (Operate Axis).
  • ProximalGradientDescentSolver: renamed to ProximalGradientDescentSolve (Proximal Gradient Descent Solve).
  • RenameAxisValues: renamed to ReplaceAxisValues (Replace Axis Values).
  • SelectTargetEvent: removed (use marker-selection nodes such as ExtractMarkers, optionally preceded by RewriteMarkers).
  • SplitList: replaced by BreakList (Break List), which counts outputs in a 0-based fashion.
  • VectorLength: renamed to VectorNorm (Vector Norm).

Node Features:

  • Array nodes: linear-algebra/array operations now also accept blocks, chunks, and packets as operands.
  • AssignChannelLocations: ignores EXG channels in location files when identifying the best-matching location file.
  • BadChannelRemovalNIRSSCI: channel-pair matching now uses the space-axis source/detector/wavelength metadata rather than channel-name strings, making matched-pair detection more reliable.
  • BalanceClasses: fixed a class-sorting issue that affected which samples are balanced.
  • BatchInstances: pad_value can be set to NaN; padding now works with integer-valued axis fields; can specify the axis to insert and optionally its label; can sort instances by order of appearance.
  • Bayesian inference (MCMC / SVI): fixed the reparameterization heuristic for the case where the distribution node is not wired directly into a Random Draw.
  • CastToType: now correctly handles 2-character strings with leading zeros when casting to int/float.
  • ChannelDiagnostics: visualization sub-nodes are no longer initialized when running with a headless Neuropype build.
  • ChannelRepair, CorrelationMetric: added a serial calibration-backend option (and exposed the calibration backend on CorrelationMetric).
  • CognionicsInput: an explicitly set headset model now takes precedence over the model inferred from the device name; non-signal channels are added only if not already present in the custom channel list.
  • ComputeImpedance: added automatic detection of the impedance carrier wave (auto_detect_carrier), an option to remove the carrier wave (remove_carrier_wave), and a target_freq parameter.
  • ConditionSwitch, ConditionTest: input ports are now re-evaluated each tick even when the incoming value is unchanged.
  • ConnectivityMeasure: added new measures — phase slope index (PSI) and renormalized PDC (rPDC); added basic support for time-reversed connectivity (e.g., TRGC); added control over the output stream name.
  • CoregisterExistingLocations: added optional thin-plate-spline denoising of locations (with regularization and spline-order controls), an on_error option (raise / ignore / fall back to template), a maximum-location-error threshold, and a 3D visualization option.
  • CorrelationCoefficient: added support for returning p-values.
  • CrossValidation: exposed the compute order; option to embed a FoldNum field in outputs; now also exports the RepeatNum and train_test_ratio properties; supports randomized (repeated) grouped cross-validation; ignores censor_labels for continuous data.
  • DeepModel: added fallbacks for the case where the model renames the stream.
  • DelayEmbedding: now supports delay-embedding along axes other than time.
  • ExportEDF: added a unit property (V/mV/uV/nV/noscaling) to scale signals to a target unit; fuse_streams (default True) to export each modality to a separate file when False; modality_prefix (default True) to prefix channel names with modality; now writes markers from all event streams; stores digital/physical min/max; rounds values to EDF's 8-character limit and warns when values appear out of range (suggesting FixSignalUnit).
  • ExtractStreams: added a streams parameter as an alias for stream_names (for consistency with other nodes).
  • FunctionCall: deep-copy of inputs is now optional.
  • FunctionDef: now defaults to export=True.
  • GateCheck: no longer writes an error .txt file — failures are now surfaced via the /errors API endpoint and raise a more specific ValidationError.
  • GetNested: now handles the case where the input data is None; the notfound property is now a combo (raise/ignore).
  • HighFrequencyNoise, ChannelDiagnostics: added an hf_stop_atten parameter (default 120) in place of a hardcoded value.
  • IfElse, Switch: added on_clear handling.
  • Import nodes (all): added a file_missing output port that routes downstream when the input file is missing; added cloud-storage support to import nodes that lacked it.
  • ImportCSV: added rows_header_column to designate a column as an Instance-axis row descriptor (removed from the Feature axis); added nondata_rows to drop leading non-data rows.
  • ImportEDF, ImportGDF: now use pyedflib for EDF (with MNE as an optional fallback) and MNE for GDF; added a unit parameter and a strip_modality option; read prefiltering/transducer acquisition fields; flag marker streams as non-signal; import digital channels as a separate stream.
  • ImportNirs: now verifies that the input file is a .nirs file.
  • ImportSnirf: fixed channel labels being misaligned with data rows; handles accelerometer/gyroscope channels of differing time lengths.
  • ImportStructure, ExportStructure: added YAML format support; ExportStructure's default pickle protocol bumped from 4 to 5; JSON/YAML import now uses UTF-8.
  • ImportVHDR: updated to work with the current neo library; fixed events import.
  • InspectPacket: table row colors now support dark mode; now respects the always_on_top option; reports done/finished when not streaming once data is shown and keep_window_active is enabled.
  • InterpolateMissingChannels: added a reinterpolate_existing option to reinterpolate channels even if they already have data.
  • MarkerStreamWindow: added a font_size property; now handles the always_on_top option.
  • MeasureLoss: added support for a t-test against negated metrics (losses) and the corrected resampled t-test; now outputs confidence intervals and can include the raw measure observations; improved batching support.
  • MovingAverage: automatically resets when the shape of incoming data changes (avoids an exception).
  • MplPlot nodes (TimeSeriesPlot, BarPlot, SpectrumPlot): added a max_redraw_hz property to control redraw rate (replacing the older every-N-ticks behavior); can now output a figure for use with the new PlotDashboard node; markers are no longer drawn outside the axes; handle the plot type changing while live.
  • MultipleComparisonCorrection: falls back to a scipy implementation when statsmodels is unavailable (BH and BY methods only).
  • ParallelForEach: the materialized option has graduated from experimental status.
  • ParameterPort: added a debug option to print unique values by parameter name across all ports in a pipeline.
  • PathIterator: added an allmeta output port (list of per-file metadata, including a FilePath entry); added support for participants.tsv when loading from BIDS (enabled by default).
  • PipelineDone: added a wait_n_ticks property to delay pipeline termination until N ticks after the Done node is reached; added an optional popup to inform the user when the pipeline is done.
  • PreprocessEEG: added a reference_channels parameter, with handling for the case where a scalp EEG channel is used as the reference.
  • PruneFlatlineChannels: fixed a bug where channels whose values are all exactly zero were not pruned.
  • QuadraticDiscriminantAnalysis: now reports a user-friendly rank-deficiency error instead of a raw sklearn exception.
  • RandomDraw: fixed incorrect behavior when both a batched distribution and a like= input were provided.
  • RecordToXDF, ImportXDF: now save all stream properties (except desc) into the XDF <desc><neuropype> section on export and read them back on import.
  • Resample: now supports resampling in realtime on streaming data.
  • RewriteMarkers: now drops event markers that are rewritten to an empty string.
  • SelectInstances: added support for wiring in a selection predicate as a graph (new pred input port).
  • SetMembership: fixed the result being written to the wrong output field.
  • ShiftTimestamps: now warns if all timestamps fall outside the timestamp_pairs range.
  • SignalToNoise: now checks that the data contains marker targets (required for the SNR computation).
  • SignalWhitening: added the ability to apply a loaded whitening model to all streams; added basic support for segmented data.
  • SplitStreams: can now also return the remaining (unselected) streams as a list.
  • SystemInformation: added options to query available system memory and CUDA device memory.
  • TimeSeriesPlot: added a stacked mode (default on) so channels can be stacked or superimposed on a shared Y axis; added a y_range property for unstacked mode; added a value data port (with value_label/value_decimals) to overlay a scalar value on the plot; more robust NaN handling, with a nans_as_zero option.
  • TopoPlotViewer: added a title_font_size property; can now output a figure for use with PlotDashboard; faster real-time redraws via blit (only electrodes redrawn each tick when not interpolating/NIRS); fixed the color array when plotting NIRS data.
  • TTest: grouping is now a regular (non-expert) parameter, and the grouping-deprecation warning has been removed.

New Engine Features:

  • New YAML-based pipeline file format (.pyp): Graph.load() reads XML or YAML with content-based auto-detection, and Graph.save() can write either format.
  • YAML parameter-override files: per-node property values can be applied to an already-loaded graph, matched by node UUID.
  • Pipelines can now carry and round-trip a description block (name, description, version, status, license, url) plus a free-form metadata dictionary.
  • Graceful compute-backend fallback: if a preferred backend (e.g., JAX) is not installed, nodes fall back to a configurable backend (default numpy) with a one-time warning instead of failing on import.
  • JAX 64-bit support is now enabled by default.
  • Upgraded to NumPy 2.x.
  • multiprocessing/loky now use the spawn() start method on all operating systems (previously the default only on Windows).
  • Many engine settings are now user-configurable via config.ini / CLI, including: a shorter default node-UID format, axis-tuning settings, LSL multicast scope settings (limit scope to the local segment, disable IPv6, specify known peers; written to lsl_api.cfg, now located in ~/.neuropype), a --skip-version-check flag, a tracemalloc toggle, warning-suppression toggles, and Linux display-server settings (force XWayland on Wayland). All CLI arguments are now mirrored by config variables settable in the .ini.
  • On startup, the engine now prints which config file was loaded.

New API Features:

  • New /inputs and /outputs endpoints that return the file paths imported/exported during an Execution.
  • /actions/configure now accepts a file parameter, so a set of parameters can be loaded from a (YAML, or XML) pipeline file in addition to the inline {'what': 'parameters', 'data': <dict>} form.
  • /actions/load and /actions/save understand the new YAML pipeline format (load auto-detects XML vs. YAML; save can target YAML).
  • /state now returns error_code and error_message, giving more detail than had_errors alone.
  • The number of REST API worker threads is now configurable (config.api_server_threads, default 4), as is the listen-socket backlog (config.api_server_listen_backlog).
  • config.cpe_api_port renamed to port (matching the CLI argument), and it is updated after launch so the Control Panel can pick up the actual port if it changed via CLI or auto-port discovery.

New / Improved Resources

  • The bundled example pipelines have been converted to the new YAML format.
  • The NeuroPype Control Panel can now load one or more .json/.yaml parameter files and apply them (parameter ports only) to a pipeline when loading it.