open import Relation.Binary module MatrixFuncNormalization.MatrixProps {c ℓ₁ ℓ₂} (totalOrder : StrictTotalOrder c ℓ₁ ℓ₂) where open import Level using (Level; _⊔_; Lift; lower; lift) open import Function open import Data.Bool using (true; false) open import Data.Product open import Data.Nat using (ℕ; z≤n; s≤s; suc) open import Data.Nat.Properties as ℕ hiding (<⇒≢; _≤?_; _≟_; ≤∧≢⇒<; <-asym; <-trans; <-cmp) open import Data.Fin.Base as F using (Fin; zero; suc; inject₁; fromℕ) open import Data.Fin.Properties as F hiding (≤-refl; <-trans) open import Data.Sum as Π open import Data.Vec.Functional open import Relation.Nullary.Construct.Add.Supremum open import Relation.Binary.PropositionalEquality as ≡ using (_≡_; _≢_; refl; sym) import Relation.Binary.Construct.Add.Supremum.Strict as AddSupMod import Relation.Binary.Construct.Add.Point.Equality as Equality import Relation.Binary.Construct.StrictToNonStrict as StrictToNonStrict open import Relation.Unary.Consequences open import Relation.Nullary open import Relation.Nullary.Decidable open import Algebra open import MatrixNormalization.FinProps open import lbry module A′ = StrictTotalOrder totalOrder open AddSupMod A′._<_ <⁺-totalOrder : StrictTotalOrder _ _ _ <⁺-totalOrder = record { isStrictTotalOrder = <⁺-isStrictTotalOrder A′.isStrictTotalOrder } open module STO = StrictTotalOrder <⁺-totalOrder renaming (Carrier to A) hiding (_≟_; _>_) open module ≈ = IsEquivalence STO.isEquivalence hiding (sym) open StrictToNonStrict _≈_ _<_ hiding (<-≤-trans) open Equality _≈_ renaming (≈∙-refl to ≈∙-refl′) open FinProps _>_ = flip _<_ _<′_ : Rel A _ x <′ y = x < y ⊎ (x ≈ ⊤⁺ × y ≈ ⊤⁺) _>′_ = flip _<′_ _≤⊤⁺ : (k : A) → k <′ ⊤⁺ k ≤⊤⁺ with compare k ⊤⁺ ... | tri< k<⊤ _ _ = inj₁ k<⊤ ... | tri≈ _ k≈⊤ _ = inj₂ (k≈⊤ , ≈.refl) compare⊤⁺ = compare private variable n : ℕ x y x′ y′ : A <′-respʳ-≈ : _<′_ Respectsʳ _≈_ <′-respʳ-≈ y≈z (inj₁ x<y) = inj₁ (<-respʳ-≈ y≈z x<y) <′-respʳ-≈ y≈z (inj₂ (x≈⊤ , y≈⊤)) = inj₂ (x≈⊤ , ≈.trans (≈.sym y≈z) y≈⊤) <′-respˡ-≈ : _<′_ Respectsˡ _≈_ <′-respˡ-≈ y≈z (inj₁ x<y) = inj₁ (<-respˡ-≈ y≈z x<y) <′-respˡ-≈ y≈z (inj₂ (x≈⊤ , y≈⊤)) = inj₂ (≈.trans (≈.sym y≈z) x≈⊤ , y≈⊤) <′-resp-≈ : _<′_ Respects₂ _≈_ <′-resp-≈ = <′-respʳ-≈ , <′-respˡ-≈ <′-trans : Transitive _<′_ <′-trans (inj₁ i<j) (inj₁ j<k) = inj₁ (STO.trans i<j j<k) <′-trans (inj₁ i<j) (inj₂ (∙≈∙ , ∙≈∙)) = inj₁ i<j <′-trans (inj₂ (∙≈∙ , ∙≈∙)) (inj₂ (∙≈∙ , ∙≈∙)) = inj₂ (Equality.∙≈∙ , Equality.∙≈∙) LessThanRel : ∀ x′ y′ → Tri (x < y) (x ≈ y) (x > y) → Set _ LessThanRel {x} {y} x′ y′ (tri< _ _ _) = Lift (c ⊔ ℓ₂) (x′ ≈ x × y′ ≈ y) LessThanRel {x} {y} x′ y′ (tri≈ _ _ _) = x′ ≈ x × y′ >′ y LessThanRel {x} {y} x′ y′ (tri> _ _ _) = Lift (c ⊔ ℓ₂) (x′ ≈ y × y′ ≈ x) NormedTwoBeforeAfter : (x y x′ y′ : A) → Set _ NormedTwoBeforeAfter x y x′ y′ = LessThanRel x′ y′ (compare x y) NormedTwoBeforeAfter′ : ∀ {x y} x′ y′ → Tri (x < y) (x ≈ y) (x > y) → Set _ NormedTwoBeforeAfter′ {x} {y} x′ y′ tri = LessThanRel x′ y′ tri NormedTwoBeforeAfter‵ : (i j : Fin n) → .(i ≢ j) → Rel (Vector A n) _ NormedTwoBeforeAfter‵ i j i≢j xs ys = NormedTwoBeforeAfter′ (ys i) (ys j) (compare (xs i) (xs j)) DifferentIndicesAreEqual : (i j : Fin n) → Rel (Vector A n) _ DifferentIndicesAreEqual i j xs ys = ∀ k → k ≢ i → k ≢ j → xs k ≈ ys k BothRowsAreNormalize : (i j : Fin n) → .(i ≢ j) → Rel (Vector A n) _ BothRowsAreNormalize i j i≢j xs ys = DifferentIndicesAreEqual i j xs ys × NormedTwoBeforeAfter‵ i j i≢j xs ys BothRowsAreNormalize′ : (i j : Fin n) → .(i ≢ j) → Rel (Vector A n) _ BothRowsAreNormalize′ i j i≢j xs ys = let x = xs i ; y = xs j ; x′ = ys i ; y′ = ys j in Σ[ tri ∈ Tri (x < y) (x ≈ y) (x > y) ] (DifferentIndicesAreEqual i j xs ys × NormedTwoBeforeAfter′ x′ y′ tri) RowsBeforeINormalized : (i : Fin n) → Vector A n → Set _ RowsBeforeINormalized i xs = ∀ j → j F.≤ i → ∀ k → k F.> j → xs j <′ xs k AllRowsNormalized : Vector A n → Set _ AllRowsNormalized xs = ∀ i j → i F.< j → xs i <′ xs j rowsBeforeMaximum→allRowsNorm : ∀ xs → RowsBeforeINormalized {suc n} (fromℕ n) xs → AllRowsNormalized xs rowsBeforeMaximum→allRowsNorm xs p i j i<j = p i (≤fromℕ _) j i<j RowsNormalizedBeforeIJ : (i j : Fin n) .(i≤j : i F.≤ j) → Vector A n → Set _ RowsNormalizedBeforeIJ i j i<j xs = (∀ h → h F.< i → ∀ k → h F.< k → xs h <′ xs k) × (∀ k → i F.< k → k F.≤ j → xs i <′ xs k) private ≈∙-refl : Reflexive _≈∙_ ≈∙-refl = ≈∙-refl′ ≈.refl allR→Monot : ∀ {xs : Vector A n} → AllRowsNormalized xs → Monotonic₁ F._≤_ _≤_ xs allR→Monot {xs = xs} norm {i} {j} i≤j with m≤n⇒m<n∨m≡n i≤j ... | inj₂ i≡j with ≡.refl ← toℕ-injective i≡j = inj₂ ≈.refl ... | inj₁ i<j with norm _ _ i<j ... | inj₁ p = inj₁ p ... | inj₂ (xsI≈⊤ , xsJ≈⊤) = inj₂ $ ≈.trans xsI≈⊤ $ ≈.sym xsJ≈⊤ rowsNormalizedBeforeIJ++′ : ∀ i j .(i≤j : i F.≤ j) (xs : Vector A (suc n)) ys → RowsNormalizedBeforeIJ i (inject₁ j) (cong≤ʳ (sym (toℕ-inject₁ _)) i≤j) xs → BothRowsAreNormalize′ i (suc j) (<⇒≢ (s≤s i≤j)) xs ys → RowsNormalizedBeforeIJ i (suc j) (m≤n⇒m≤1+n i≤j) ys proj₁ (rowsNormalizedBeforeIJ++′ i j i≤j xs ys (bef , after) (tri< _ _ _ , sameDiff , lift (ysI≈xsI , ysJ+1≈xsJ+1))) h h<i k h<k with k ≟ i | k ≟ suc j ... | yes refl | _ = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (≈.sym ysI≈xsI) (bef _ h<i _ h<k)) ... | no k≢i | yes refl = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (≈.sym ysJ+1≈xsJ+1) (bef _ h<i _ h<k)) ... | no k≢i | no k≢j+1 = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (sameDiff _ k≢i k≢j+1) (bef _ h<i _ h<k)) proj₁ (rowsNormalizedBeforeIJ++′ i j i≤j xs ys (bef , after) (tri≈ _ _ _ , sameDiff , ysI≈xsI , ysJ+1>xsJ+1)) h h<i k h<k with k ≟ i | k ≟ suc j ... | yes refl | _ = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (≈.sym ysI≈xsI) (bef _ h<i _ h<k)) ... | no k≢i | yes refl = <′-trans (<′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (bef _ h<i _ h<k)) ysJ+1>xsJ+1 ... | no k≢i | no k≢j+1 = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (sameDiff _ k≢i k≢j+1) (bef _ h<i _ h<k)) proj₁ (rowsNormalizedBeforeIJ++′ i j i≤j xs ys (bef , after) (tri> _ _ _ , sameDiff , lift (ysI≈xsJ+1 , ysJ+1≈xsI))) h h<i k h<k with k ≟ i | k ≟ suc j ... | _ | yes refl = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (≈.sym ysJ+1≈xsI) (bef _ h<i _ h<i)) ... | yes refl | no k≢j+1 = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (≈.sym ysI≈xsJ+1) (bef _ h<i _ (s≤s (ℕ.<⇒≤ (<-≤-trans h<k (dec⇒recomputable (_≤?_ _) i≤j))))) ) ... | no k≢i | no k≢j+1 = <′-respˡ-≈ (sameDiff _ (<⇒≢ h<i) (<⇒≢ (<-≤-trans h<i (m≤n⇒m≤1+n (dec⇒recomputable (_≤?_ _) i≤j))))) (<′-respʳ-≈ (sameDiff _ k≢i k≢j+1) (bef _ h<i _ h<k)) proj₂ (rowsNormalizedBeforeIJ++′ i j i≤j xs ys (bef , after) (tri< xsI<xsJ _ _ , sameDiff , lift (ysI≈xsI , ysJ+1≈xsJ+1))) k i<k k<sj with k ≟ suc j ... | yes refl = <′-respˡ-≈ (≈.sym ysI≈xsI) (<′-respʳ-≈ (≈.sym ysJ+1≈xsJ+1) (inj₁ xsI<xsJ)) ... | no k≢j+1 = <′-respˡ-≈ (≈.sym ysI≈xsI) (<′-respʳ-≈ (sameDiff _ (<⇒≢ i<k ∘ sym) k≢j+1) (after _ i<k (cong≤ʳ (sym (toℕ-inject₁ _)) (≤∧s≢⇒≤ k<sj λ p → k≢j+1 (toℕ-injective p))))) proj₂ (rowsNormalizedBeforeIJ++′ i j i≤j xs ys (bef , after) (tri≈ _ xsI≈xsJ _ , sameDiff , ysI≈xsI , ysJ+1>xsJ+1)) k i<k k<sj with k ≟ suc j ... | yes refl = <′-respˡ-≈ (≈.sym ysI≈xsI) (<′-respˡ-≈ (≈.sym xsI≈xsJ) ysJ+1>xsJ+1) ... | no k≢j+1 = <′-respˡ-≈ (≈.sym ysI≈xsI) (<′-respʳ-≈ (sameDiff _ (<⇒≢ i<k ∘ sym) k≢j+1) (after _ i<k (cong≤ʳ (sym (toℕ-inject₁ _)) (≤∧s≢⇒≤ k<sj λ p → k≢j+1 (toℕ-injective p))))) proj₂ (rowsNormalizedBeforeIJ++′ i j i≤j xs ys (bef , after) (tri> _ _ xsI>xsJ+1 , sameDiff , lift (ysI≈xsJ+1 , ysJ+1≈xsI))) k i<k k<sj with k ≟ suc j ... | yes refl = <′-respˡ-≈ (≈.sym ysI≈xsJ+1) (<′-respʳ-≈ (≈.sym ysJ+1≈xsI) (inj₁ xsI>xsJ+1)) ... | no k≢j+1 = <′-respˡ-≈ (≈.sym ysI≈xsJ+1) (<′-respʳ-≈ (sameDiff _ (<⇒≢ i<k ∘ sym) k≢j+1) (<′-trans (inj₁ xsI>xsJ+1) (after _ i<k (cong≤ʳ (sym (toℕ-inject₁ _)) (≤∧s≢⇒≤ k<sj λ p → k≢j+1 (toℕ-injective p)))))) rowsNormalizedBeforeIJ++ : ∀ i j .(i≤j : i F.≤ j) (xs : Vector A (suc n)) ys → RowsNormalizedBeforeIJ i (inject₁ j) (cong≤ʳ (sym (toℕ-inject₁ _)) i≤j) xs → BothRowsAreNormalize i (suc j) (<⇒≢ (s≤s i≤j)) xs ys → RowsNormalizedBeforeIJ i (suc j) (m≤n⇒m≤1+n i≤j) ys rowsNormalizedBeforeIJ++ i j i≤j xs ys p (diff , normBef) = rowsNormalizedBeforeIJ++′ i j i≤j xs ys p (compare _ _ , diff , normBef) rowsIJ→I : ∀ i (xs : Vector A (suc n)) → RowsNormalizedBeforeIJ i (fromℕ _) (≤fromℕ i) xs → RowsBeforeINormalized i xs rowsIJ→I i xs (normBef , normAfter) j j≤i k k>j with j ≟ i ... | yes refl = normAfter _ k>j (≤fromℕ _) ... | no j≢i = normBef j (≤∧≢⇒< j≤i j≢i) k k>j norm00 : (xs : Vector A (suc n)) → RowsNormalizedBeforeIJ zero zero z≤n xs proj₁ (norm00 xs) _ () _ _ proj₂ (norm00 xs) zero () z≤n proj₂ (norm00 xs) (suc k) (s≤s _) () normII : ∀ i (xs : Vector A (suc n)) → RowsBeforeINormalized (inject₁ i) xs → RowsNormalizedBeforeIJ (suc i) (suc i) ≤-refl xs proj₁ (normII i xs p) h (s≤s h<si) k h<k = p _ (cong≤ʳ (sym (toℕ-inject₁ _)) h<si) _ h<k proj₂ (normII i xs p) k i<k k≤i = contradiction (≤∧≢⇒< k≤i (<⇒≢ i<k ∘ sym)) (<-asym i<k) finProps : FinProps (Vector A (suc n)) n Pij finProps = RowsNormalizedBeforeIJ Pi finProps = RowsBeforeINormalized P finProps = AllRowsNormalized Pab finProps = BothRowsAreNormalize Pij→Pi finProps = rowsIJ→I Pi→P finProps = rowsBeforeMaximum→allRowsNorm Pi→Pii finProps = normII Ps finProps = rowsNormalizedBeforeIJ++ P00 finProps = norm00