hpdg (High-Performance Data Generator) is a Rust-first data generator for competitive programming and OI workflows.
The project is inspired by Luogu's CYaRon, but it leans into Rust's strengths instead of cloning the Python API one-to-one: strong typing, trait-based extension points, feature flags, reproducible RNG streams, and better composition for larger generators.
hpdg is under active development, but it is no longer just a skeleton:
- The crate is now published on crates.io as
hpdg. - The crate compiles across library, examples, benches, and tests.
- Core generator modules are implemented and usable today.
- The public API is still evolving, so breaking changes are possible before
1.0. - Python/C binding scaffolding exists, but the Rust crate is the primary supported surface right now.
| Area | Current support |
|---|---|
| IO / testcase helpers | In-memory buffers, configurable file naming, separators/formatters, flush to disk, output generation via external programs, timeout helpers, parallel generation, streaming writers, batch builders |
| Graph | Edge, SwitchGraph, editable Graph, graph formatting, label/edge shuffling, chain/flower/tree/binary tree generators, simple graph/multigraph/connected graph/forest/DAG helpers, degree-sequence constructors, adjacency-list and matrix export, GraphMatrix, Merger, hack-SPFA generator |
| Math | Permutation/palindrome helpers, divisor and digit utilities, Fibonacci, primality + Miller-Rabin, factorization, permutation/binomial/Catalan helpers, sieve, exgcd, modular inverse, phi, miu, base conversion, number-to-words |
| Sequence | Formula-driven Sequence, initial-value bootstrapping, range/slice helpers, arithmetic and geometric helpers |
| Vector | Random integer vectors, unique/repeatable modes, random float vectors, matrix helpers, formatting helpers |
| String | Random strings/words/sentences/paragraphs, simplified regex-based generation, dictionary-based generation, ASCII/Unicode modes |
| Polygon | Random points, simple polygons, convex hulls, perimeter/area helpers |
| Query | Random range queries, mixed update/query streams, per-dimension constraints, weighted query generation |
| Compare | File/string/program comparison, custom graders, whitespace-insensitive grader, parallel compare helpers |
| Rust-specific extras | NodeId/EdgeId newtypes, Weight trait, seeded RNG streams, Generator / GraphGenerator traits, shared error types |
These parts exist, but they are still early and should be treated as unstable:
- Crate-level documentation and docs.rs polish are still in progress.
- Some modules have broad functionality but still need API cleanup and more examples.
- Python bindings and the C ABI are scaffolding-level rather than polished releases.
- Full CYaRon parity is not the goal; some APIs will stay intentionally more Rust-idiomatic.
use hpdg::graph::Graph;
use hpdg::io::IO;
use hpdg::string::{SentenceConfig, StringGen};
use hpdg::vector::{IntRange, Vector};
fn main() {
let mut io = IO::new("example".to_string());
let mut g = Graph::new(5, false);
g.add_edge(1, 2, None);
g.add_edge(2, 3, None);
let vecs = Vector::random_int(3, &[IntRange::Max(10), IntRange::MinMax(5, 8)]);
let mut cfg = SentenceConfig::default();
cfg.sentence_terminators = ".".to_string();
let sentence = StringGen::random_sentence(6, Some(&cfg));
io.input_writeln("5 2");
io.input_writeln(format!("{}", g));
io.input_writeln(vecs.len());
for v in vecs {
io.input_writeln(v.iter().map(|x| x.to_string()).collect::<Vec<_>>().join(" "));
}
io.input_writeln(sentence);
let _ = io.flush_to_disk();
}See also:
examples/full_generation.rsdocs/rust-quickstart.mddocs/cyaron-api.md
Install from crates.io:
[dependencies]
hpdg = "0.1.0"You can also browse the published package and API docs here:
If you need unreleased changes, you can still depend on the Git repository directly:
[dependencies]
hpdg = { git = "https://github.com/SuperKevinZhou/hpdg" }Most generator modules are enabled by default.
Optional integration flags currently include:
python-bindingsc-bindings
The remaining feature flags mostly mirror internal module boundaries such as io, graph, math, sequence, vector, string, polygon, query, compare, utils, core, rng, traits, and error.
The long-term goal is to make hpdg a practical Rust alternative to CYaRon for serious OI data generation:
- Keep common workflows concise.
- Prefer deterministic, reproducible generation.
- Provide stronger invariants through types and traits.
- Add Rust-specific building blocks instead of only mirroring Python behavior.
Issues and PRs are welcome.
MIT