Marguerite.jl

A minimal, differentiable Frank-Wolfe solver for constrained convex optimization in Julia.

Named in honor of Marguerite Frank (1927–2024), co-inventor of the Frank-Wolfe algorithm (1956).

Quick start

using Marguerite, LinearAlgebra

Q = [4.0 1.0; 1.0 2.0]; c = [-3.0, -1.0]
f(x) = 0.5 * dot(x, Q * x) + dot(c, x)
∇f!(g, x) = (g .= Q * x .+ c)

x, result = solve(f, ProbSimplex(), [0.5, 0.5]; grad=∇f!)

Omit grad= for automatic differentiation via ForwardDiff.

Documentation guide

  • Tutorial — basic usage, automatic gradients, parameterized solve, custom oracles
  • Oracles — built-in constraint sets and the oracle interface
  • Parametric Oracles — differentiable constraint sets parameterized by θ
  • Examples — sparse recovery benchmark (Frank-Wolfe vs. interior point)
  • Convergence$O(1/t)$ rate, Frank-Wolfe gap, sparsity plots
  • Implicit Differentiation — implicit differentiation, rrule, CG tuning
  • Bilevel Optimizationbilevel_solve, bilevel_gradient, manual rrule usage
  • API Reference — complete docstrings for all exports

Installation

Requires Julia 1.12+. Install directly from the repository:

using Pkg
Pkg.add(url="https://github.com/samtalki/Marguerite.jl")