Skip to content

Lists Module

The lists module handles Stage 4 of the pipeline: partitioning items into experimental lists with constraint satisfaction.

List Constraints

List constraints apply to individual lists. Eight constraint types address common experimental design requirements.

Uniqueness Constraint

Ensure property values appear at most once per list:

uv run bead lists create-uniqueness \
    --property-expression "item.metadata.verb" \
    --priority 5 \
    --output constraints/unique_verbs.jsonl

Each list contains each verb at most once.

Balance Constraint

Balance distribution of property values:

uv run bead lists create-balance \
    --property-expression "item.metadata.condition" \
    --target-counts "control=10,experimental=10" \
    --tolerance 0.1 \
    --priority 4 \
    --output constraints/balance_condition.jsonl

Tolerance allows ±10% deviation from target counts.

Quantile Constraint

Ensure property values span quantile ranges:

uv run bead lists create-quantile \
    --property-expression "item.metadata.word_length" \
    --n-quantiles 4 \
    --priority 3 \
    --output constraints/quantile_length.jsonl

Each list includes items from all four word length quartiles.

Grouped Quantile Constraint

Apply quantile constraints within groups:

uv run bead lists create-grouped-quantile \
    --property-expression "item.metadata.frequency" \
    --group-by-expression "item.metadata.condition" \
    --n-quantiles 3 \
    --priority 3 \
    --output constraints/grouped_quantile_freq.jsonl

Each condition has balanced frequency distribution across tertiles.

Diversity Constraint

Require minimum unique values:

uv run bead lists create-diversity \
    --property-expression "item.metadata.verb_class" \
    --min-unique 10 \
    --priority 3 \
    --output constraints/diversity_class.jsonl

Each list must include at least 10 different verb classes.

Size Constraint

Constrain list size:

uv run bead lists create-size \
    --min-size 40 \
    --max-size 60 \
    --priority 5 \
    --output constraints/size.jsonl

Lists contain between 40 and 60 items.

Batch Constraints

Batch constraints apply across all lists collectively. Four constraint types ensure balanced coverage.

Batch Coverage Constraint

Ensure all target values appear somewhere:

uv run bead lists create-batch-coverage \
    --property-expression "item.metadata.template_id" \
    --target-values "0,1,2,3,4,5,6,7,8,9" \
    --min-coverage 1.0 \
    --priority 5 \
    --output constraints/batch_coverage_templates.jsonl

All 10 templates appear in at least one list.

Batch Balance Constraint

Balance property values across batch:

uv run bead lists create-batch-balance \
    --property-expression "item.metadata.condition" \
    --target-distribution "control=0.5,experimental=0.5" \
    --tolerance 0.05 \
    --priority 4 \
    --output constraints/batch_balance_condition.jsonl

Across all lists, conditions appear in 50/50 ratio (±5%).

Batch Diversity Constraint

Limit values per list:

uv run bead lists create-batch-diversity \
    --property-expression "item.metadata.target_word" \
    --max-lists-per-value 3 \
    --priority 3 \
    --output constraints/batch_diversity_word.jsonl

Each target word appears in at most 3 lists.

Batch Min Occurrence Constraint

Ensure minimum occurrences:

uv run bead lists create-batch-min-occurrence \
    --property-expression "item.metadata.construction" \
    --min-occurrences 5 \
    --priority 4 \
    --output constraints/batch_min_occurrence.jsonl

Each construction appears at least 5 times across all lists.

Partitioning

Divide items into experimental lists. Output is a single JSONL file with one list per line.

Basic Partitioning

uv run bead lists partition items/2afc_pairs.jsonl lists/experiment_lists.jsonl \
    --n-lists 5 \
    --strategy balanced

The balanced strategy distributes items evenly across lists.

The partition command supports list and batch constraints via --list-constraints and --batch-constraints options (see workflow example below).

Partitioning Strategies

Three strategies balance different goals:

  • balanced: even distribution across lists
  • random: random assignment (respects constraints)
  • stratified: balance strata defined by metadata

Example with stratified:

uv run bead lists partition items/2afc_pairs.jsonl lists/experiment_lists.jsonl \
    --n-lists 5 \
    --strategy stratified

Validation and Statistics

After partitioning, validate and view statistics:

# Partition items first
uv run bead lists partition items/2afc_pairs.jsonl lists/experiment_lists.jsonl \
    --n-lists 3 \
    --strategy balanced

# List all lists in the file
uv run bead lists list lists/experiment_lists.jsonl

# Show statistics
uv run bead lists show-stats lists/experiment_lists.jsonl

Output includes:

Experiment List Statistics
┌─────────────────────┬───────┐
│ Metric              │ Value │
├─────────────────────┼───────┤
│ Total Lists         │    10 │
│ Total Items         │   450 │
│                     │       │
│ Avg Items per List  │  45.0 │
│ Min Items per List  │    42 │
│ Max Items per List  │    48 │
└─────────────────────┴───────┘

Per-List Breakdown:
  list_0: 45 items
  list_1: 42 items
  list_2: 48 items
  ...

Workflow Example

Complete workflow from items to lists:

# 1. Create list constraints
uv run bead lists create-uniqueness \
    --property-expression "item.metadata.verb" \
    --priority 5 \
    --output constraints/unique_verbs.jsonl

uv run bead lists create-balance \
    --property-expression "item.metadata.condition" \
    --target-counts "control=20,experimental=20" \
    --tolerance 0.1 \
    --priority 4 \
    --output constraints/balance_condition.jsonl

# 2. Create batch constraint
uv run bead lists create-batch-coverage \
    --property-expression "item.metadata.template_id" \
    --target-values "0,1,2,3,4,5" \
    --min-coverage 1.0 \
    --priority 5 \
    --output constraints/batch_coverage.jsonl

# 3. Partition with constraints
uv run bead lists partition items/2afc_pairs.jsonl lists/experiment_lists.jsonl \
    --n-lists 5 \
    --list-constraints constraints/unique_verbs.jsonl constraints/balance_condition.jsonl \
    --batch-constraints constraints/batch_coverage.jsonl \
    --strategy balanced

# 4. List all lists
uv run bead lists list lists/experiment_lists.jsonl

# 5. View statistics
uv run bead lists show-stats lists/experiment_lists.jsonl

Next Steps

Once lists are partitioned:

  1. Deploy to jsPsych/JATOS with distribution strategies
  2. Train models on collected responses
  3. Analyze results with convergence detection

For complete API documentation, see bead.lists API reference.