# maxsat-tsp/maxsattrainscheduling architecture

> Architecture diagram of the GitHub repository maxsat-tsp/maxsattrainscheduling, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/maxsat-tsp/maxsattrainscheduling
- Repository: https://github.com/maxsat-tsp/maxsattrainscheduling

## Overview

This Rust project implements train-rescheduling optimization: a user selects solver configurations for fixed-route instances and delay-cost objectives, and the CLI parses the instance, dispatches a solver, and verifies the resulting schedule. Its main product capability is MaxSAT-based Dynamic Discretization Discovery (DDD), alongside SAT and MILP baselines; it also includes a separate conflict-based heuristic GUI. The README documents benchmark and analysis capabilities, but those scripts and data are not runtime components. Some internal wiring is omitted because the sampled source excerpts do not show it.

Main entry points: [`src/main.rs`](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/main.rs) (CLI runner), [`src/solvers/ddd/mod.rs`](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/mod.rs) (DDD solver family), [`src/solvers/milp/mod.rs`](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/mod.rs) (MILP baselines), [`crates/heuristic_gui/src/main.rs`](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic_gui/src/main.rs) (GUI entry point)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_input["Input and CLI"]
  node_cli["CLI runner<br/>[main.rs]"]
  node_parser["Instance parser<br/>[parser.rs]"]
  node_problem["Problem model<br/>[problem.rs]"]
  node_verify["Solution verification<br/>[problem.rs]"]
end

subgraph group_ddd["DDD Solvers"]
  node_ddd_dispatch["DDD solver family<br/>[mod.rs]"]
  node_maxsat_ladder["MaxSAT ladder<br/>[maxsat_ladder.rs]"]
  node_maxsat_sc["Sequential-counter MaxSAT<br/>[solve.rs]"]
  node_incremental_sat["Incremental SAT<br/>[incremental_sat.rs]"]
  node_pure_sat["Pure SAT<br/>[puresat.rs]"]
  node_ddd_shared["DDD shared logic<br/>[mod.rs]"]
  node_maxsat_solver["MaxSAT interface<br/>[maxsatsolver.rs]"]
end

subgraph group_baselines["Solver Baselines"]
  node_milp["MILP baselines<br/>[mod.rs]"]
  node_bigm["Big-M solver<br/>[bigm.rs]"]
  node_mipddd["MIP-DDD solver<br/>[mipdddpack.rs]"]
  node_legacy["Legacy solvers<br/>[mod.rs]"]
  node_lp_export["LP exporter<br/>[export_lp.rs]"]
end

subgraph group_heuristic["Heuristic GUI"]
  node_heuristic_solver["Conflict solver<br/>[solver.rs]"]
  node_heuristic_gui["Rescheduling GUI<br/>[app.rs]"]
  node_gui_entry["GUI entry point<br/>[main.rs]"]
end

node_user(("Solver user"))
node_gurobi["Gurobi"]

node_user -->|"selects solver"| node_cli
node_cli -->|"loads instance"| node_parser
node_parser -->|"builds model"| node_problem
node_cli -->|"dispatches DDD"| node_ddd_dispatch
node_cli -->|"dispatches MILP"| node_milp
node_cli -->|"dispatches legacy"| node_legacy
node_ddd_dispatch -->|"selects variant"| node_maxsat_ladder
node_ddd_dispatch -->|"selects variant"| node_maxsat_sc
node_ddd_dispatch -->|"selects variant"| node_incremental_sat
node_ddd_dispatch -->|"selects variant"| node_pure_sat
node_maxsat_ladder -->|"solves MaxSAT"| node_maxsat_solver
node_maxsat_sc -->|"solves MaxSAT"| node_maxsat_solver
node_incremental_sat -->|"uses shared logic"| node_ddd_shared
node_milp -->|"selects variant"| node_bigm
node_milp -->|"selects variant"| node_mipddd
node_bigm -->|"optimizes model"| node_gurobi
node_mipddd -->|"optimizes model"| node_gurobi
node_cli -->|"checks solution"| node_verify
node_user -->|"starts GUI"| node_gui_entry
node_gui_entry -->|"creates solver"| node_heuristic_solver
node_gui_entry -->|"launches app"| node_heuristic_gui
node_heuristic_gui -->|"steps and displays"| node_heuristic_solver
node_lp_export -->|"loads instance"| node_parser
node_lp_export -.->|"exports model for"| node_gurobi

click node_cli "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/main.rs"
click node_parser "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/parser.rs"
click node_problem "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/problem.rs"
click node_verify "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/problem.rs"
click node_ddd_dispatch "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/mod.rs"
click node_maxsat_ladder "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/maxsat_ladder.rs"
click node_maxsat_sc "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/maxsat_ladder_sc/solve.rs"
click node_incremental_sat "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/incremental_sat.rs"
click node_pure_sat "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/puresat.rs"
click node_ddd_shared "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/shared/mod.rs"
click node_maxsat_solver "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/maxsatsolver.rs"
click node_milp "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/mod.rs"
click node_bigm "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/bigm.rs"
click node_mipddd "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/mipdddpack.rs"
click node_legacy "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/legacy/mod.rs"
click node_lp_export "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/bin/export_lp.rs"
click node_heuristic_solver "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic/src/solver.rs"
click node_heuristic_gui "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic_gui/src/app.rs"
click node_gui_entry "https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic_gui/src/main.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_parser,node_problem,node_verify,node_user toneBlue
class node_ddd_dispatch,node_maxsat_ladder,node_maxsat_sc,node_incremental_sat,node_pure_sat,node_ddd_shared,node_maxsat_solver toneAmber
class node_milp,node_bigm,node_mipddd,node_legacy,node_lp_export toneMint
class node_heuristic_solver,node_heuristic_gui,node_gui_entry toneRose
class node_gurobi toneIndigo
```

## Components

### Input and CLI

- [CLI runner](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/main.rs): `src/main.rs`
- [Instance parser](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/parser.rs): `src/parser.rs`
- [Problem model](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/problem.rs): `src/problem.rs`
- [Solution verification](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/problem.rs): `src/problem.rs`

### DDD Solvers

- [DDD solver family](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/mod.rs): `src/solvers/ddd/mod.rs`
- [MaxSAT ladder](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/maxsat_ladder.rs): `src/solvers/ddd/maxsat_ladder.rs`
- [Sequential-counter MaxSAT](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/maxsat_ladder_sc/solve.rs): `src/solvers/ddd/maxsat_ladder_sc/solve.rs`
- [Incremental SAT](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/incremental_sat.rs): `src/solvers/ddd/incremental_sat.rs`
- [Pure SAT](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/puresat.rs): `src/solvers/ddd/puresat.rs`
- [DDD shared logic](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/ddd/shared/mod.rs): `src/solvers/ddd/shared/mod.rs`
- [MaxSAT interface](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/maxsatsolver.rs): `src/maxsatsolver.rs`

### Solver Baselines

- [MILP baselines](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/mod.rs): `src/solvers/milp/mod.rs`
- [Big-M solver](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/bigm.rs): `src/solvers/milp/bigm.rs`
- [MIP-DDD solver](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/milp/mipdddpack.rs): `src/solvers/milp/mipdddpack.rs`
- [Legacy solvers](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/solvers/legacy/mod.rs): `src/solvers/legacy/mod.rs`
- [LP exporter](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/src/bin/export_lp.rs): `src/bin/export_lp.rs`

### Heuristic GUI

- [Conflict solver](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic/src/solver.rs): `crates/heuristic/src/solver.rs`
- [Rescheduling GUI](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic_gui/src/app.rs): `crates/heuristic_gui/src/app.rs`
- [GUI entry point](https://github.com/maxsat-tsp/maxsattrainscheduling/blob/main/crates/heuristic_gui/src/main.rs): `crates/heuristic_gui/src/main.rs`

### Other components

- **Solver user**
- **Gurobi**

## Connections

- Solver user → CLI runner: selects solver
- CLI runner → Instance parser: loads instance
- Instance parser → Problem model: builds model
- CLI runner → DDD solver family: dispatches DDD
- CLI runner → MILP baselines: dispatches MILP
- CLI runner → Legacy solvers: dispatches legacy
- DDD solver family → MaxSAT ladder: selects variant
- DDD solver family → Sequential-counter MaxSAT: selects variant
- DDD solver family → Incremental SAT: selects variant
- DDD solver family → Pure SAT: selects variant
- MaxSAT ladder → MaxSAT interface: solves MaxSAT
- Sequential-counter MaxSAT → MaxSAT interface: solves MaxSAT
- Incremental SAT → DDD shared logic: uses shared logic
- MILP baselines → Big-M solver: selects variant
- MILP baselines → MIP-DDD solver: selects variant
- Big-M solver → Gurobi: optimizes model
- MIP-DDD solver → Gurobi: optimizes model
- CLI runner → Solution verification: checks solution
- Solver user → GUI entry point: starts GUI
- GUI entry point → Conflict solver: creates solver
- GUI entry point → Rescheduling GUI: launches app
- Rescheduling GUI → Conflict solver: steps and displays
- LP exporter → Instance parser: loads instance
- LP exporter → Gurobi: exports model for
