TransportMaps.jl

This is an implementation of triangular transport maps in Julia based on the description in [1]. For a comprehensive introduction to transport maps, see [2]. The theoretical foundations for monotone triangular transport maps are detailed in [1], [3]. For practical applications in structural health monitoring and Bayesian inference, see [4].

What are Transport Maps?

Transport maps are smooth, invertible functions that can transform one probability distribution into another [1]. The mathematical foundation builds on the Rosenblatt transformation [5] and the Knothe-Rosenblatt rearrangement [6]. They are particularly useful for:

  • Sampling: Generate samples from complex distributions by transforming samples from simple distributions
  • Variational inference: Approximate complex posterior distributions in Bayesian updating problems [4]
  • Density estimation: Learn the structure of complex probability distributions

Key Features

  • Polynomial Maps: Triangular polynomial transport maps
  • Adaptive Construction: Automatic selection of polynomial terms for efficient approximation
  • Multiple Rectifiers: Support for different activation functions (Softplus, ShiftedELU, Identity)
  • Quadrature Integration: Multiple quadrature schemes for map optimization
  • Optimization: Built-in optimization routines for fitting maps to target densities

Installation

using Pkg
Pkg.add("TransportMaps")

Quick Start Example

Here's a simple example showing how to construct a transport map for a "banana" distribution:

using TransportMaps
using Distributions

# Create a 2D polynomial map with degree 2 and Softplus rectifier
M = PolynomialMap(2, 2, Softplus())

# Set up quadrature for optimization
quadrature = GaussHermiteWeights(3, 2)

# Define target density (banana distribution)
target_density(x) = pdf(Normal(), x[1]) * pdf(Normal(), x[2] - x[1]^2)

# Optimize the map coefficients
result = optimize!(M, target_density, quadrature)

# Generate samples by mapping standard Gaussian samples
samples_z = randn(1000, 2)
mapped_samples = reduce(vcat, [evaluate(M, x)' for x in eachrow(samples_z)])

# Evaluate map quality
variance_diag = variance_diagnostic(M, target_density, samples_z)

Package Architecture

The package is organized around several key components:

Map Components

  • PolynomialMapComponent: Individual polynomial components of triangular maps
  • HermiteBasis: Hermite polynomial basis functions
  • MultivariateBasis: Multivariate polynomial basis construction

Transport Maps

  • PolynomialMap: Main triangular polynomial transport map implementation

Rectifier Functions

  • IdentityRectifier: No transformation (linear)
  • Softplus: Smooth positive transformation
  • ShiftedELU: Exponential linear unit variant

Quadrature and Optimization

  • GaussHermiteWeights: Gauss-Hermite quadrature points and weights
  • MonteCarloWeights: Monte Carlo integration
  • LatinHypercubeWeights: Latin hypercube sampling

API Reference

Authors

  • Lukas Fritsch, Institute for Risk and Reliability, Leibniz University Hannover
  • Jan Grashorn, Chair for Engineering Materials and Building Preservation, Helmut-Schmidt-University Hamburg