From 1ea3199a7806ecbefba986ea28cf976497da5ca4 Mon Sep 17 00:00:00 2001 From: Jacques Comeaux Date: Thu, 3 Jul 2025 11:55:43 -0500 Subject: Finish strict total order for hypergraph edges --- Data/Hypergraph/Base.agda | 178 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 173 insertions(+), 5 deletions(-) diff --git a/Data/Hypergraph/Base.agda b/Data/Hypergraph/Base.agda index f54468d..0771a78 100644 --- a/Data/Hypergraph/Base.agda +++ b/Data/Hypergraph/Base.agda @@ -17,20 +17,31 @@ open import Relation.Binary ; _Respects_ ) open import Relation.Binary.Bundles using (DecTotalOrder; StrictTotalOrder) +open import Relation.Binary.Structures using (IsEquivalence) open import Relation.Nullary using (¬_) open import Data.Nat.Base using (ℕ; _<_) open import Data.Product.Base using (_×_; _,_; proj₁; proj₂) open import Data.Nat.Properties using (<-irrefl; <-trans; <-resp₂-≡; <-cmp) -open import Level using (Level; suc; _⊔_) +open import Level using (Level; suc; _⊔_; 0ℓ) +open import Data.String using (String; _<+>_; unlines) +open import Data.Fin.Show using () renaming (show to showFin) +open import Data.List.Show using () renaming (show to showList) +open import Data.List.Base using (map) +open import Data.Vec.Show using () renaming (show to showVec) +import Data.Fin.Base as Fin +import Data.Fin.Properties as FinProp import Data.Vec.Base as VecBase import Data.Vec.Relation.Binary.Equality.Cast as VecCast +import Data.Vec.Relation.Binary.Lex.Strict as Lex import Relation.Binary.PropositionalEquality as ≡ import Relation.Binary.Properties.DecTotalOrder as DTOP +import Relation.Binary.Properties.StrictTotalOrder as STOP record HypergraphLabel {ℓ : Level} : Set (suc ℓ) where field Label : ℕ → Set ℓ + showLabel : (n : ℕ) → Label n → String isCastable : IsCastable Label -- _[_≈_] : (n : ℕ) → Rel (Label n) ℓ _[_≤_] : (n : ℕ) → Rel (Label n) ℓ @@ -105,6 +116,8 @@ module Edge (HL : HypergraphLabel) where module j≈k = ≈-Edge j≈k open HL using (_[_<_]) + _<<_ : {v a : ℕ} → Rel (Vec (Fin v) a) 0ℓ + _<<_ {v} = Lex.Lex-< _≡_ (Fin._<_ {v}) data <-Edge {v : ℕ} : Edge v → Edge v → Set where <-arity : {x y : Edge v} @@ -115,19 +128,46 @@ module Edge (HL : HypergraphLabel) where (≡a : Edge.arity x ≡ Edge.arity y) → Edge.arity y [ cast ≡a (Edge.label x) < Edge.label y ] → <-Edge x y + <-ports + : {x y : Edge v} + (≡a : Edge.arity x ≡ Edge.arity y) + (≡l : Edge.label x HL.≈[ ≡a ] Edge.label y) + → VecBase.cast ≡a (Edge.ports x) << Edge.ports y + → <-Edge x y <-Edge-irrefl : {v : ℕ} {x y : Edge v} → ≈-Edge x y → ¬ <-Edge x y <-Edge-irrefl record { ≡arity = ≡a } (<-arity n x≮y″ x≢y y + ¬x x≮y′ x≢y y ¬x x≮y x≢y y ¬x showVec showFin p + module HypergraphList (HL : HypergraphLabel) where open import Data.List.Base using (List) @@ -216,3 +375,12 @@ module HypergraphList (HL : HypergraphLabel) where record Hypergraph (v : ℕ) : Set where field edges : List (Edge v) + + sortHypergraph : {v : ℕ} → Hypergraph v → Hypergraph v + sortHypergraph {v} H = record { edges = sort edges } + where + open Hypergraph H + open import Data.List.Sort.MergeSort (Edge.decTotalOrder HL) using (sort) + + showHypergraph : {v : ℕ} → Hypergraph v → String + showHypergraph record { edges = e} = unlines (map (Edge.showEdge HL) e) -- cgit v1.2.3