Skip to content

Changelog

All notable changes to this project will be documented in this file.

This project follows semantic versioning.

[0.3.0] - in preparation

API redesign. Same job as 0.2.0: edgelist → sparse PyTorch module → optional Captum attribution. Call sites and return types change.

Upgrade from 0.2.0

0.2.0 0.3.0
backend="recurrent" or "graphnn" backend="state_update"
model.recurrent / model.message_passing model.state_linear
interpret_model(..., target=) interpret_model(..., on=)
Captum output index also named target= attribute_kwargs={"target": ...}
interpret_model returned a DataFrame or a dict of tables always InterpretationResult
level= / nodes= / site_aggregation= on interpret_model result.summary(nodes=..., aggregation=...)
site_aggregation="max_abs" aggregation="peak" (no alias; keeps the signed score from the step with largest |score|)
feature table / node tables result.table / result.sites
graph_topology() artifact.backend, input_nodes, output_nodes, hidden_nodes, interpretation_sites (feature_names is an alias of input_nodes)
model.*.weight edge_weights(model) (parameters are *.raw_weight; checkpoints from 0.2.0 will not load as-is)
quiet= removed (compile_graph notes go to the edge2torch logger)
compile_graph(..., backend="feedforward", steps=...) ignored steps now raises; omit steps on feedforward (default remains 3 on state_update)

Catch public failures with from edge2torch import Edge2TorchError.

Changed

  • Breaking: the state-update summary aggregation "max_abs" is renamed "peak". The default still keeps the signed score from the step with largest magnitude. There is no "max_abs" alias. "last" is also signed; only "mean_abs" drops the sign.

Also

  • Extra DataFrame columns and AnnData variables are dropped, not errors.
  • Omitting method uses IntegratedGradients for on="features" and LayerConductance for on="nodes".
  • Attribution tables store signed Captum scores. Rankings or plots that want magnitude should call .abs() themselves.

[0.2.0] - 2026-06-26

Added

  • Node interpretation on all backends. You can now attribute predictions to named hidden nodes on recurrent and graphnn models, not only on feedforward.
  • Finer control over node attribution output via new interpret_model() options:
  • level="summary" — one table per sample (default)
  • level="sites" — separate tables per interpretation site (layer_* on feedforward, step_* on recurrent and graphnn)
  • nodes — include hidden nodes only, or also outputs ("non_input"), or all visible nodes ("all")
  • site_aggregation — on recurrent and graphnn, choose how step-wise scores are combined in the summary ("max_abs", "mean_abs", or "last")
  • New example notebooks: recurrent and graphnn end-to-end workflows (compile, train, interpret on cyclic graphs).
  • New docs page: Scope and limitations — what each backend supports cleanly, with extra PyTorch work, or not at all.

Changed

  • Breaking: interpret_model(..., target="nodes") now returns a summary pandas.DataFrame by default. For the previous per-site dictionary of tables, pass level="sites".

Fixed

  • GraphNN example notebook: corrected graph topology so the signal path reaches the readout node as intended.

[0.1.0] - 2026-05-26

Added

  • Initial release of edge2torch.
  • Added compile_graph() for compiling named edge lists into PyTorch models.
  • Added support for the feedforward, recurrent, and graphnn backends.
  • Added feature alignment with align_features_to_input_nodes().
  • Added model customization with customize_model().
  • Added Captum-based interpretation with interpret_model(), including feature-level attribution and feedforward node-level attribution.
  • Added documentation, examples, and tests.