ACSet Superior Measurement

SkillDev tools

Measure ACSets better than authors via surjectivity gadgets, Betti numbers,

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the ACSet Superior Measurement skill

What this skill tells your AI

The instructions your AI receives, as published by plurigrid/asi in skills/acset-superior-measurement/SKILL.md and read by ahel’s review.

Quantitative analysis of ACSets beyond what AlgebraicJulia authors provide.

GF(3) Triad

acset-superior-measurement (+1) ⊗ acsets-relational-thinking (0) ⊗ compositional-acset-comparison (-1) = 0 ✓

The Gap We Fill

MeasurementAuthorsUs
Surjectivityincident()χ² coverage gadget
UniformityNoneStatistical test
TopologyNoneβ₁ Betti number
PathsEnumerateMöbius classification
GrowthNoneO(n)/O(n²)/O(n³)
DistanceNoneP-adic ultrametric

Core Module

include("ACSetMeasurement.jl")
using .ACSetMeasurement

# Measure an ACSet
db = create_my_acset()
metrics = measure_acset(db)

# Check coverage
gadget = incident_coverage(db, :E, :V, :src)
println(gadget)  # Surjectivity(100→50, coverage=0.92, ✓ UNIFORM)

# P-adic distance between instances
d = padic_acset_distance(metrics_a, metrics_b, 3)
@assert verify_ultrametric(d_xy, d_yz, d_xz)  # Strong triangle

Measurement Suite

1. Surjectivity Gadget

struct SurjectivityGadget
    n_source::Int           # |domain|
    n_target::Int           # |codomain|
    hit_counts::Vector{Int} # hits per target
    coverage::Float64       # fraction covered
    uniform::Bool           # χ² < threshold
    chi_squared::Float64    # statistic
end

2. Betti Numbers

β₁ = schema_betti_1(n_objects, n_morphisms, n_components)
# Independent cycles in schema graph
Schemaβ₁Meaning
Tree0No cycles
Graph1src↔tgt cycle
INTERACTION4Highly connected

3. Möbius Path Classification

classification = classify_paths(adjacency_matrix, max_length=4)
# classification.prime_paths   - μ > 0, clean
# classification.tangled_paths - μ ≤ 0, cyclic
# classification.ratio         - prime / total

4. Growth Rate Analysis

sizes = [measure_acset(build(n)).total_parts for n in [3, 9, 27]]
exponent, class = growth_rate_analysis(sizes, [3, 9, 27])
# class ∈ {"O(n)", "O(n²)", "O(n³)"}

5. P-Adic Ultrametric Distance

d = padic_acset_distance(metrics_a, metrics_b, p=3)
# Satisfies: d(x,z) ≤ max(d(x,y), d(y,z))
# Enables hierarchical clustering

File Locations


End-of-Skill Interface

Integration with Existing Skills

From acsets-relational-thinking (0)

@present SchGraph(FreeSchema) begin
  V::Ob; E::Ob
  src::Hom(E, V); tgt::Hom(E, V)
end
@acset_type Graph(SchGraph)

From compositional-acset-comparison (-1)

# DuckDB vs LanceDB schema comparison
geometric_morphism(duckdb_acset, lancedb_acset)

This skill (+1)

# Measure quality of instances
metrics = measure_acset(db)
println(metrics.avg_coverage)      # How well morphisms cover
println(metrics.betti_1)           # Schema complexity
println(metrics.mobius_class.ratio) # Path quality

References

  • Bumpus et al. - Spasm counting for homomorphism enumeration
  • AlgebraicJulia - Base ACSet implementation
  • P-adic analysis - Ultrametric hierarchical clustering

Autopoietic Marginalia

The interaction IS the skill improving itself.

Every use of this skill is an opportunity for worlding:

  • MEMORY (-1): Record what was learned
  • REMEMBERING (0): Connect patterns to other skills
  • WORLDING (+1): Evolve the skill based on use

Add Interaction Exemplars here as the skill is used.

Signals

GitHub stars
63
Forks
12
Last commit
Jul 2026
Advanced
Catalog kind
skill
Gateway key
acset-superior-measurement
Source
github.com/plurigrid/asi