exchangealgebra: Exchange Algebra for bookkeeping and economic simulation

[ accounting, finance, library, math ] [ Propose Tags ] [ Report a vulnerability ]
Versions [RSS] 0.4.0.0
Change log ChangeLog.md
Dependencies array (>=0.5.5 && <0.6), async (>=2.2 && <2.3), base (>=4.17 && <5), binary (>=0.8 && <0.9), bytestring (>=0.11 && <0.13), Chart (>=1.9 && <1.10), Chart-cairo (>=1.9 && <1.10), containers (>=0.6 && <0.8), deepseq (>=1.4 && <1.6), hashable (>=1.4 && <1.6), mtl (>=2.3 && <2.4), non-negative (>=0.1.2 && <0.2), numeric-prelude (>=0.4.4 && <0.5), parallel (>=3.2 && <3.3), random (>=1.2 && <1.3), scientific (>=0.3.7 && <0.4), text (>=2.0 && <2.2), time (>=1.12 && <1.15), unicode-show (>=0.1 && <0.2), unordered-containers (>=0.2.19 && <0.3), vector (>=0.13 && <0.14) [details]
License LicenseRef-OtherLicense
Copyright 2018-2026 Kaya Akagi
Author Kaya Akagi
Maintainer yakagika@icloud.com
Uploaded by yakagika at 2026-05-18T05:11:45Z
Category Accounting, Finance, Math
Home page https://github.com/yakagika/ExchangeAlgebra#readme
Bug tracker https://github.com/yakagika/ExchangeAlgebra/issues
Source repo head: git clone https://github.com/yakagika/ExchangeAlgebra
Distributions
Downloads 2 total (2 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for exchangealgebra-0.4.0.0

[back to package description]

exchangealgebra

exchangealgebra is a Haskell library for Exchange Algebra, an algebraic description of bookkeeping systems developed by Hiroshi Deguchi. It treats bookkeeping entries as elements of a scaled basis algebra, so journaling, closing, transfer, and simulation can be written as function composition and projection.

The library is used in the preprint Accounting State Space as the Minimal Unit for Economic Agent-Based Modeling (Akagi, 2026) as the minimal unit for economic agent-based simulation and ripple-effect analysis. See the Publications section for citation details.

Installation

The package is on Hackage. Pin a specific version in your Stack project:

# stack.yaml
extra-deps:
  - exchangealgebra-0.4.0.0
# package.yaml (your project)
dependencies:
  - exchangealgebra

If you need an unreleased revision, you can also point extra-deps at a specific Git commit instead:

extra-deps:
  - git: https://github.com/yakagika/ExchangeAlgebra.git
    commit: <commit-sha>

Requirements:

  • GHC 9.10 (tested with Stackage lts-24.4)
  • Cabal 3.0 or later
  • Chart / Chart-cairo transitively require the Cairo / Pango / Freetype system libraries (on macOS: brew install cairo pango)

How to consume this package

Three common use cases:

1. Use it as a library dependency

Add exchangealgebra to your project's build-depends via the Hackage extra-deps pin above (or the Git pin for unreleased revisions). The examples/ directory is not needed for this; it is only shipped in this Git repository.

2. Run the bundled examples

Clone the repository and build from the root:

git clone https://github.com/yakagika/ExchangeAlgebra.git
cd ExchangeAlgebra
stack build
stack exec -- sim1        # or ebex1, ripple, cge, ...

See the examples directory for the full catalogue and runtime prerequisites (uv for Python plots, output directories, etc.).

3. Copy or fork a single example

If you want to start from one example without pulling the whole repository, degit (or its maintained successor tiged) lets you grab just the subtree without git history:

npx degit yakagika/ExchangeAlgebra/examples my-examples
cd my-examples
# then edit freely as a starting point

A Git sparse-checkout with a standalone examples/stack.yaml is planned so that cd examples && stack build works after a sparse-clone; this will land together with the first Hackage release.

Module Overview

The public modules are organised into two parallel layers.

Foundation layer (Algebra)

Module Role
ExchangeAlgebra.Algebra Core algebra: the Alg type, HatVal / BaseClass, addition .+ / hat .^ / bar .- / projection proj
ExchangeAlgebra.Algebra.Base Basis classes (BaseClass, HatBaseClass, ExBaseClass) and basis display helpers
ExchangeAlgebra.Algebra.Base.Element The Element type class (wildcard-aware basis components)
ExchangeAlgebra.Algebra.Transfer Transfer rewriting (TransTable, (.->), transfer, finalStockTransfer)

Journal layer — metadata-aware basis algebra

Module Role
ExchangeAlgebra.Journal Journal n v b (journal entries carrying a Note), sigmaOn, filterByAxis, projWithNote, …
ExchangeAlgebra.Journal.Transfer Transfer API specialised for Journal (thin wrappers over Algebra.Transfer)

Simulation / IO layer

Module Role
ExchangeAlgebra.Simulate StateSpace, Updatable, runSimulation, spill-to-disk, ripple-effect utilities (rippleEffect, leontiefInverse)
ExchangeAlgebra.Simulate.Visualize Chart/Cairo based PNG rendering (see the caveats below)
ExchangeAlgebra.Write CSV output (writeBS, writePL, writeIOMatrix, writeCSV) and binary-spill restore helpers

Umbrella entry modules

Module Content
ExchangeAlgebra (top level) Umbrella for the Algebra layer: re-exports Algebra, Algebra.Transfer, Write, and Simulate
ExchangeAlgebra.Journal Umbrella for the Journal layer. Re-exports Algebra.Base, so user-defined Element instances are available through this import as well

Importing both ExchangeAlgebra and ExchangeAlgebra.Journal unqualified causes name collisions on sigma, fromList, map, filter, and friends. See the recommended import patterns below.

Simple single-period bookkeeping

import ExchangeAlgebra                          -- Algebra-layer umbrella

main = do
    let e = 100 :@ Hat :< Cash .+ 100 :@ Not :< Sales
    putStr (showBS e)

Journal-based work (multi-period, notes, simulation)

import           ExchangeAlgebra.Journal        -- pulls in the type classes and the Journal API
import qualified ExchangeAlgebra.Algebra           as EA
import qualified ExchangeAlgebra.Journal           as EJ
import qualified ExchangeAlgebra.Journal.Transfer  as EJT
import qualified ExchangeAlgebra.Simulate          as ES
import           ExchangeAlgebra.Simulate          -- unqualified, for StateSpace, Updatable, etc.
import           ExchangeAlgebra.Write             -- writeBS / writeIOMatrix and friends

Even in Journal-centric code you will frequently reach into the Algebra layer (for the Alg type or EA.proj, for example). Using Journal as the unqualified umbrella and pulling the Algebra layer in as EA qualified is the idiomatic style for this library.

A note on visualization

ExchangeAlgebra.Simulate.Visualize provides Chart-based PNG rendering, but we recommend writing CSV output and visualising it from a separate Python script for production-quality plotting.

Why

  • Chart / Chart-cairo transitively pull in cairo / pango / freetype system libraries, which makes the build environment heavier to set up.
  • For academic work, matplotlib / seaborn / pandas are more flexible than Chart.
  • Using CSV as an intermediate format cleanly separates "compute" from "plot".
  • The same CSVs can be reused with R / Julia / Excel if you need them.
-- Haskell side: write the simulation outputs to CSV
import           ExchangeAlgebra.Write           (writeIOMatrix)
import qualified ExchangeAlgebra.Simulate.Visualize as ESV
                                                  -- qualified access to writeFuncResults etc.

main = do
    -- ... run the simulation ...
    writeIOMatrix "result/io.csv" matrix
    ESV.writeFuncResults header range world "result/profit.csv"
# Plotting side: run a standalone script with uv + PEP 723 inline deps
uv run --script visualize.py
# visualize.py
# /// script
# requires-python = ">=3.10"
# dependencies = ["pandas>=2.0", "matplotlib>=3.7"]
# ///
import pandas as pd, matplotlib.pyplot as plt
df = pd.read_csv("result/profit.csv")
df.plot(); plt.savefig("result/profit.png")

Concrete runnable examples of this pattern live under the examples/ sub-package (see the examples directory on GitHub).

If you still want to plot from Haskell

If keeping everything in Haskell is important to your workflow, plotLineVector, plotMultiLines, and plotWldsDiffLine in ExchangeAlgebra.Simulate.Visualize write PNGs directly and work without any Python setup.

Examples

Runnable usage examples are collected in the examples/ sub-package on GitHub. See the examples directory and its README for details.

stack build
stack exec -- ebex1      # Introductory bookkeeping example
stack exec -- sim1       # 100-term simulation (+ Python visualization)
stack exec -- ripple     # 10-agent ripple-effect simulation
stack exec -- cge        # CGE model

Documentation

License

Dual licensed under MIT and the Open World License (OWL). See LICENSE for details.

Publications using this library

  • Kaya Akagi. Accounting State Space as the Minimal Unit for Economic Agent-Based Modeling: Advancing Ripple Effect Analysis in Real-Time Economy. Research Square, preprint (Version 1), posted 5 January 2026. DOI: 10.21203/rs.3.rs-8485050/v1

    The ripple-effect simulations reported in this preprint are driven by ExchangeAlgebra.Simulate and the ripple example family under examples/deterministic/ripple/.

If you use this library in academic work, please cite the preprint above. A CITATION.cff file at the repository root provides BibTeX and plain-text forms via GitHub's "Cite this repository" button.

References