Getting Started

Installation

SPFlow requires Python 3.10+ and PyTorch 2.0+.

From PyPI

The easiest way to install SPFlow is via pip:

pip install spflow

Development / From Source

Most users should install from PyPI. If you want to contribute to SPFlow or develop locally, see the repository’s CONTRIBUTING.md for a source install with development dependencies.

Prerequisites

  • Python 3.10+ with pip or uv

  • PyTorch 2.0+ (will be installed automatically with SPFlow)

  • Graphviz (optional, for circuit visualization):

Quick Start

Basic Example: Node-Based Construction

Here’s a comprehensive example showing how to build a Probabilistic Circuit using explicit node-based composition:

import torch
from spflow.modules.sums import Sum
from spflow.modules.products import Product
from spflow.modules.leaves import Normal
from spflow.utils.visualization import visualize

# Create leaf nodes: Normal distributions for two variables (X1 and X2)
# Each variable has multiple instantiations for mixture components
x11 = Normal(scope=0, out_channels=1)  # X1 for component 1
x12 = Normal(scope=0, out_channels=1)  # X1 for component 2
x21 = Normal(scope=1, out_channels=1)  # X2 for component 1
x22 = Normal(scope=1, out_channels=1)  # X2 for component 2

# Create product nodes combining different leaf instances
prod1 = Product([x11, x21])
prod2 = Product([x12, x21])
prod3 = Product([x11, x22])
prod4 = Product([x12, x22])

# Create a sum node (mixture) combining the products
pc = Sum([prod1, prod2, prod3, prod4], weights=[0.3, 0.1, 0.2, 0.4])

# Generate some test data
data = torch.randn(100, 2)

# Compute log-likelihood
log_likelihood = pc.log_likelihood(data)

# Sample from the model
samples = pc.sample(num_samples=50)

# Visualize the probabilistic circuit
visualize(pc, output_path="/tmp/node-based-structure", format="svg")

Layered Module Composition

SPFlow also supports a more compact, layered approach to building circuits using module composition:

import torch
from spflow.modules.products import OuterProduct
from spflow.modules.sums import Sum
from spflow.modules.leaves import Normal
from spflow.modules.ops import SplitConsecutive
from spflow.utils.visualization import visualize

# Create a single Normal layer covering both variables
x_layered = Normal(scope=[0, 1], out_channels=2)

# Use SplitConsecutive to automatically partition outputs, then OuterProduct to combine
prod_layered = OuterProduct(SplitConsecutive(x_layered), num_splits=2)

# Create a sum node over the outer products
pc_layered = Sum(prod_layered, weights=[0.3, 0.1, 0.2, 0.4])

# Compute queries on sample data
x = torch.rand(3, 2)
print(pc_layered.log_likelihood(x))

# Visualize this circuit
visualize(pc_layered, output_path="/tmp/layered-structure", format="svg")

This layered approach is more concise and scales better for larger circuits, automatically handling module composition instead of explicit node construction.

Next Steps

  • Read the User Guide for comprehensive tutorials

  • Explore the API Documentation for detailed API documentation

  • Browse Concepts for core semantics (shapes, scopes, evidence, caching)

Key Concepts

Probabilistic Circuits

A flexible class of probabilistic models that support efficient inference.

Leaves (Distributions)

Terminal nodes representing probability distributions (e.g., Normal, Binomial, Categorical).

Internal Nodes

Sum and Product nodes that combine distributions in a computational graph.

Structure Learning

Automatically learning the circuit structure from data.

Parameter Learning

Training the distribution parameters using gradient descent or EM.

For more information, see the User Guide and Concepts.