# Weir Corpus Seed Format
This document describes the binary formats used by the seed files in `tests/corpus/seeds/`.
All multi-byte values are stored in **little-endian** byte order. Arrays of `u32` are stored as contiguous 4-byte words.
---
## CSR Graph Seeds (`csr_*.bin`)
A raw CSR (Compressed Sparse Row) graph with edge-kind masks.
```
[u32 node_count]
[u32 edge_count]
[u32 offsets_len] // = node_count + 1
[u32[] edge_offsets] // length = offsets_len
[u32[] edge_targets] // length = edge_count
[u32[] edge_masks] // length = edge_count
```
**Validation:**
- `offsets_len == node_count + 1`
- `edge_offsets[0] == 0`
- `edge_offsets` is monotonically non-decreasing
- `edge_count == edge_offsets[offsets_len - 1]`
- All `edge_targets[i] < node_count`
- `edge_masks.len() == edge_count`
---
## IFDS Problem Seeds (`ifds_*.bin`)
A flattened exploded-supergraph representation for IFDS/IDE problems.
```
[u32 node_count] // total nodes in exploded graph
[u32 edge_count]
[u32 seed_count]
[u32 summary_count]
[u32[] edge_offsets] // CSR offsets, length = node_count + 1
[u32[] edge_targets] // CSR targets, length = edge_count
[u32[] seed_nodes] // length = seed_count
[u32[] summary_pairs] // length = 2 * summary_count, [src0, dst0, src1, dst1, ...]
```
---
## Dominator CFG Seeds (`dom_*.bin`)
A control-flow graph with a designated entry node.
```
[u32 node_count]
[u32 edge_count]
[u32 entry_node]
[u32[] edge_offsets] // length = node_count + 1
[u32[] edge_targets] // length = edge_count
```
**Validation:**
- `entry_node < node_count` (unless `node_count == 0`)
- Standard CSR invariants apply
---
## Cross-Analysis Composed Seeds (`cross_*.bin`)
A single input containing a CFG plus pre-computed expected outputs for three analyses.
```
[u32 node_count]
[u32 edge_count]
[u32 entry_node]
[u32 seed_count]
[u32[] edge_offsets] // length = node_count + 1
[u32[] edge_targets] // length = edge_count
[u32[] edge_masks] // length = edge_count
[u32[] seed_nodes] // length = seed_count
[u32[] dom_output] // length = node_count * bitset_words(node_count)
[u32[] reaching_output]// length = bitset_words(node_count)
[u32[] ifds_output] // length = bitset_words(node_count)
```
Where `bitset_words(n) = ceil(n / 32)`.
**Output semantics:**
- `dom_output`: Row-major dominator matrix. Row `i` is a bitset where bit `j` is set iff node `j` dominates node `i`.
- `reaching_output`: Bitset of nodes reachable from `entry_node` traversing only `CONTROL` edges.
- `ifds_output`: Bitset of nodes reachable from `seed_nodes` traversing edges whose mask intersects `IFDS_REACH_MASK`.
---
## Adversarial Seeds (`adversarial_*.bin`)
Adversarial seeds reuse the same formats as above but contain intentionally malformed or extreme values:
- **CSR adversarial:** mismatched lengths, non-monotonic offsets, out-of-range targets, zero-node count with non-empty arrays.
- **IFDS adversarial:** `u32::MAX` dimensions, seed counts exceeding node counts, out-of-range summary pairs.
- **DOM adversarial:** entry nodes out of range, non-monotonic offsets, disconnected targets.
- **Cross adversarial:** single-node self-loops, empty graphs, disconnected components with hand-computed outputs.
These seeds are useful for testing parser robustness and validation logic.