plurigrid

acset-superior-measurement

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

plurigrid 24 6 Updated 3mo ago

Resources

1
GitHub

Install

npx skillscat add plurigrid/asi/acset-superior-measurement

Install via the SkillsCat registry.

SKILL.md

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

Measurement Authors Us
Surjectivity incident() χ² coverage gadget
Uniformity None Statistical test
Topology None β₁ Betti number
Paths Enumerate Möbius classification
Growth None O(n)/O(n²)/O(n³)
Distance None P-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
Tree 0 No cycles
Graph 1 src↔tgt cycle
INTERACTION 4 Highly 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.