fts-solver

Crates.iofts-solver
lib.rsfts-solver
version0.5.1
created_at2025-03-21 17:42:13.630268+00
updated_at2025-07-03 14:58:56.63135+00
descriptionA reference solver for flow trading optimization
homepage
repository
max_upload_size
id1600908
size578,649
Jason Dark (asymptoticgroup)

documentation

README

crates.io version docs.rs documentation crates.io downloads crates.io license getting started

Flow Trading Service (FTS)

This crate is part of a collection of crates that together implement flow trading as proposed by Budish, Cramton, et al, in which trade occurs continuously over time via regularly-scheduled batch auctions.

The different crates in this workspace are as follows:

  • fts_core: Defines a set of data primitives and operations but defers the implementations of these operations, consistent with a so-called "hexagonal architecture" approach to separating responsibilities.
  • fts_solver: Provides a reference solver for the flow trading quadratic program.
  • fts_axum: A REST API HTTP server for interacting with the solver and persisting state across auctions.
  • fts_sqlite: An implementation of the core data operations using SQLite, suitable for exploration of flow trading-based marketplaces such as a forward market.

FTS Solver

This package defines a few basic types and a solver interface to operate over these types. Presently, the following solvers are provided:

  • feature = ["clarabel"] -- Uses the Clarabel interior point solver for the quadratic program
  • feature = ["osqp"] -- Uses the OSQP ADMM solver for the quadratic program

Additional solvers will be developed as needed. The present implementations are intended as "reference" for future work.

There are a few additional features exposed by this crate. If an application intends to (de)serialize the primitive data types directly, enabling feature = ["serde"] will provide Serde bindings.

Primitive Types

There are three externally-defined types DemandId, PortfolioId, and ProductId, which allow the application host to provide their own implementations. These are black-boxes as far as the solver is concerned -- they just need to implement Clone + Eq + Hash + Ord.

Note that the solver has no notion of a bidder: all portfolios and demand are treated together. A user of this library is responsible for reassociating the outcomes to the individual bidders.

A portfolio is characterized by two quantities:

  1. A vector in product space (typically sparse) that defines a trading direction -- trade of products can only occur along portfolio directions.
  2. A vector in demand space (typically sparse). Each portfolio is associated to one or more demand curves; each demand curve sums the associated, weighted portfolio trades in determining the marginal cost.

TODO

  • Warm-start interface
  • Large-scale tests
  • Enhanced dual reporting
  • Automatic determination of error tolerances based on input
  • Bespoke ADMM implementation
Commit count: 0

cargo fmt