propago 0.2.0

Graph neural network primitives: GCN and hyperbolic GCN on Burn tensors
Documentation

propago

crates.io Documentation CI

Graph neural network layers.

Quickstart

[dependencies]
propago = "0.2"
burn = { version = "0.20", default-features = false, features = ["std"] }
burn-ndarray = "0.20"

Hyperbolic distance on the Poincare ball:

use burn::tensor::{backend::Backend, TensorData};
use burn_ndarray::NdArray;
use propago::PoincareBall;

type B = NdArray<f32>;
let dev = <B as Backend>::Device::default();
let ball = PoincareBall::new(1.0);

let x = burn::tensor::Tensor::<B, 2>::from_data(
    TensorData::new(vec![0.10f32, 0.00, 0.00], [1, 3]), &dev,
);
let y = burn::tensor::Tensor::<B, 2>::from_data(
    TensorData::new(vec![0.00f32, 0.10, 0.00], [1, 3]), &dev,
);
let d = ball.distance(x, y).to_data().to_vec::<f32>().unwrap()[0];
assert!(d >= 0.0);

Geometry

The Poincare ball $\mathbb{B}^d_c = {x \in \mathbb{R}d : c\lVert x \rVert2 < 1}$ with curvature $-c$:

Operation Formula
Distance $d_c(x, y) = \frac{2}{\sqrt{c}} \text{arctanh}\bigl(\sqrt{c}\lVert -x \oplus_c y \rVert\bigr)$
Mobius addition $x \oplus_c y = \frac{(1 + 2c\langle x,y\rangle + c\lVert y\rVert2)x + (1 - c\lVert x\rVert2)y}{1 + 2c\langle x,y\rangle + c2\lVert x\rVert2\lVert y\rVert^2}$
Exp map $\exp_xc(v) = x \oplus_c \bigl(\tanh\bigl(\frac{\sqrt{c}\lambda_xc\lVert v\rVert}{2}\bigr)\frac{v}{\sqrt{c}\lVert v\rVert}\bigr)$
Log map $\log_xc(y) = \frac{2}{\sqrt{c}\lambda_xc}\text{arctanh}(\sqrt{c}\lVert -x \oplus_c y\rVert)\frac{-x \oplus_c y}{\lVert -x \oplus_c y\rVert}$

where $\lambda_xc = \frac{2}{1 - c\lVert x\rVert2}$ is the conformal factor.

API surface

  • propago::PoincareBall: Poincare ball geometry (project, mobius_add, exp/log maps, distance, parallel transport).
  • propago::GCNConv: graph convolution (linear projection + adjacency matmul).
  • propago::HGCNConv: hyperbolic graph convolution on the Poincare ball.

Inputs are shaped [batch, d] (row-major feature vectors).

License

MIT OR Apache-2.0