Crate fts_solver

Crate fts_solver 

Source
Expand description

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

Modules§

clarabel
Implementation using the Clarabel interior point solver
export
Utilities for converting the derived QP to standard file formats

Structs§

PortfolioOutcome
Solution data for an individual portfolio, containing the trade rate and effective price.
ProductOutcome
Solution data for an individual product, containing the market-clearing price and total volume traded.
Segment
A single line segment satisfying q0 ≤ 0 ≤ q1 and p1 ≤ p0

Functions§

disaggregate
If a demand curve is an aggregation of individual demand segments, then we can disaggregate a demand curve into these segments. This is useful for constructing the optimization program.