Asi acset-superior-measurement

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

install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/acset-superior-measurement" ~/.claude/skills/plurigrid-asi-acset-superior-measurement && rm -rf "$T"
manifest: skills/acset-superior-measurement/SKILL.md
source content

ACSet Superior Measurement

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
Surjectivity
incident()
χ² 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.