Skip to main content
Ctrl+K
Logo image

Site Navigation

  • Getting started
  • User Guide
  • API reference
  • Developer guide

Site Navigation

  • Getting started
  • User Guide
  • API reference
  • Developer guide
Ctrl+K

Section Navigation

  • ReservoirPy Nodes (reservoirpy.nodes)
    • reservoirpy.nodes.Reservoir
    • reservoirpy.nodes.NVAR
    • reservoirpy.nodes.IPReservoir
    • reservoirpy.nodes.LocalPlasticityReservoir
    • reservoirpy.nodes.Ridge
    • reservoirpy.nodes.ScikitLearnNode
    • reservoirpy.nodes.LMS
    • reservoirpy.nodes.RLS
    • reservoirpy.nodes.FORCE
    • reservoirpy.nodes.ESN
    • reservoirpy.nodes.Tanh
    • reservoirpy.nodes.Sigmoid
    • reservoirpy.nodes.Softmax
    • reservoirpy.nodes.Softplus
    • reservoirpy.nodes.ReLU
    • reservoirpy.nodes.Identity
    • reservoirpy.nodes.Input
    • reservoirpy.nodes.Output
    • reservoirpy.nodes.Concat
    • reservoirpy.nodes.Delay
  • Weights initialization (reservoirpy.mat_gen)
    • reservoirpy.mat_gen.random_sparse
    • reservoirpy.mat_gen.uniform
    • reservoirpy.mat_gen.normal
    • reservoirpy.mat_gen.bernoulli
    • reservoirpy.mat_gen.ring
    • reservoirpy.mat_gen.line
    • reservoirpy.mat_gen.orthogonal
    • reservoirpy.mat_gen.cluster
    • reservoirpy.mat_gen.small_world
    • reservoirpy.mat_gen.zeros
    • reservoirpy.mat_gen.ones
    • reservoirpy.mat_gen.generate_internal_weights
    • reservoirpy.mat_gen.generate_input_weights
    • reservoirpy.mat_gen.fast_spectral_initialization
    • reservoirpy.mat_gen.Initializer
  • Activations functions (reservoirpy.activationsfunc)
    • reservoirpy.activationsfunc.get_function
    • reservoirpy.activationsfunc.identity
    • reservoirpy.activationsfunc.sigmoid
    • reservoirpy.activationsfunc.tanh
    • reservoirpy.activationsfunc.relu
    • reservoirpy.activationsfunc.softmax
    • reservoirpy.activationsfunc.softplus
  • Metrics and observables (reservoirpy.observables)
    • reservoirpy.observables.spectral_radius
    • reservoirpy.observables.mse
    • reservoirpy.observables.rmse
    • reservoirpy.observables.nrmse
    • reservoirpy.observables.rsquare
    • reservoirpy.observables.memory_capacity
    • reservoirpy.observables.effective_spectral_radius
  • Datasets (reservoirpy.datasets)
    • reservoirpy.datasets.mackey_glass
    • reservoirpy.datasets.lorenz
    • reservoirpy.datasets.multiscroll
    • reservoirpy.datasets.doublescroll
    • reservoirpy.datasets.rabinovich_fabrikant
    • reservoirpy.datasets.lorenz96
    • reservoirpy.datasets.rossler
    • reservoirpy.datasets.kuramoto_sivashinsky
    • reservoirpy.datasets.mso
    • reservoirpy.datasets.mso2
    • reservoirpy.datasets.mso8
    • reservoirpy.datasets.logistic_map
    • reservoirpy.datasets.henon_map
    • reservoirpy.datasets.narma
    • reservoirpy.datasets.japanese_vowels
    • reservoirpy.datasets.santafe_laser
    • reservoirpy.datasets.to_forecasting
    • reservoirpy.datasets.one_hot_encode
    • reservoirpy.datasets.from_aeon_classification
    • reservoirpy.datasets.set_seed
    • reservoirpy.datasets.get_seed
  • Hyperparameter optimization helpers (reservoirpy.hyper)
    • reservoirpy.hyper.research
    • reservoirpy.hyper.plot_hyperopt_report
  • Node API (reservoirpy.Node)
  • Models (reservoirpy.Model)
  • ReservoirPy v0.2 tools (reservoirpy.compat)
    • reservoirpy.compat.load_compat
    • reservoirpy.compat.load
    • reservoirpy.compat.ESN
    • reservoirpy.compat.ESNOnline
    • reservoirpy.compat.regression_models.RidgeRegression
  • Node operations - link, merge (reservoirpy.ops)
    • reservoirpy.ops.link
    • reservoirpy.ops.link_feedback
    • reservoirpy.ops.merge
  • ReservoirPy API reference
  • Node operations - link, merge (reservoirpy.ops)
  • reservoirpy.ops.link

reservoirpy.ops.link#

class reservoirpy.ops.link(node1, node2, name=None)[source]#

Link two Node instances to form a Model instance. node1 output will be used as input for node2 in the created model. This is similar to a function composition operation:

\[model(x) = (node1 \circ node2)(x) = node2(node1(x))\]

You can also perform this operation using the >> operator:

model = node1 >> node2

Or using this function:

model = link(node1, node2)

-node1 and node2 can also be Model instances. In this case, the new Model created will contain all nodes previously contained in all the models, and link all node1 outputs to all node2 inputs. This allows to chain the >> operator:

step1 = node0 >> node1  # this is a model
step2 = step1 >> node2  # this is another

-node1 and node2 can finally be lists or tuples of nodes. In this case, all node1 outputs will be linked to a Concat node to concatenate them, and the Concat node will be linked to all node2 inputs. You can still use the >> operator in this situation, except for many-to-many nodes connections:

# many-to-one
model = [node1, node2, ..., node] >> node_out
# one-to-many
model = node_in >> [node1, node2, ..., node]
# ! many-to-many requires to use the `link` method explicitly!
model = link([node1, node2, ..., node], [node1, node2, ..., node])
Parameters:
  • node1 (_Node or list of _Node) – Nodes or lists of nodes to link.

  • node2 (_Node or list of _Node) – Nodes or lists of nodes to link.

  • name (str, optional) – Name for the chaining Model.

Returns:

A Model instance chaining the nodes.

Return type:

Model

Raises:

TypeError – Dimension mismatch between connected nodes: node1 output dimension if different from node2 input dimension. Reinitialize the nodes or create new ones.

Notes

Be careful to how you link the different nodes: reservoirpy does not allow to have circular dependencies between them:

model = node1 >> node2  # fine
model = node1 >> node2 >> node1  # raises! data would flow in
                                 # circles forever...

previous

Node operations - link, merge (reservoirpy.ops)

next

reservoirpy.ops.link_feedback

On this page
  • link
Show Source

© Copyright 2025, Xavier Hinaut, Nathan Trouvain, Paul Bernard.

Created using Sphinx 7.2.6.

Built with the PyData Sphinx Theme 0.13.3.