Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Paul-Lez committed Nov 27, 2024
2 parents c0d3f16 + 48d5092 commit ee035e4
Show file tree
Hide file tree
Showing 23 changed files with 755 additions and 52 deletions.
14 changes: 0 additions & 14 deletions .github/workflows/lean_action_ci.yml

This file was deleted.

122 changes: 122 additions & 0 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
on:
push:
branches:
- master

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write

jobs:
style_lint:
name: Lint style
runs-on: ubuntu-latest
steps:
- name: Check for long lines
if: always()
run: |
! (find PersistentDecomp -name "*.lean" -type f -exec grep -E -H -n '^.{101,}$' {} \; | grep -v -E 'https?://')
- name: Don't 'import Mathlib', use precise imports
if: always()
run: |
! (find PersistentDecomp -name "*.lean" -type f -print0 | xargs -0 grep -E -n '^import Mathlib$')
build_project:
runs-on: ubuntu-latest
name: Build project
steps:
- name: Checkout project
uses: actions/checkout@v2
with:
fetch-depth: 0

- name: Print files to upstream
run: |
grep -r --files-without-match 'import PersistentDecomp' PersistentDecomp | sort > 1.txt
grep -r --files-with-match 'sorry' PersistentDecomp | sort > 2.txt
mkdir -p docs/_includes
comm -23 1.txt 2.txt | sed -e 's/^\(.*\)$/- [`\1`](https:\/\/github.com\/Paul-Lez\/PH_formalisation\/blob\/master\/\1)/' > docs/_includes/files_to_upstream.md
rm 1.txt 2.txt
- name: Count sorries
run: python scripts/count_sorry.py

- name: Install elan
run: curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh -s -- -y --default-toolchain leanprover/lean4:4.5.0

- name: Get cache
run: ~/.elan/bin/lake exe cache get || true

- name: Build project
run: ~/.elan/bin/lake build PersistentDecomp

- name: Cache mathlib docs
uses: actions/cache@v3
with:
path: |
.lake/build/doc/Init
.lake/build/doc/Lake
.lake/build/doc/Lean
.lake/build/doc/Std
.lake/build/doc/Mathlib
.lake/build/doc/declarations
key: MathlibDoc-${{ hashFiles('lake-manifest.json') }}
restore-keys: |
MathlibDoc-
- name: Build documentation
run: ~/.elan/bin/lake -R -Kenv=dev build PersistentDecomp:docs

- name: Build blueprint and copy to `docs/blueprint`
uses: xu-cheng/texlive-action@v2
with:
docker_image: ghcr.io/xu-cheng/texlive-full:20231201
run: |
apk update
apk add --update make py3-pip git pkgconfig graphviz graphviz-dev gcc musl-dev
git config --global --add safe.directory $GITHUB_WORKSPACE
git config --global --add safe.directory `pwd`
python3 -m venv env
source env/bin/activate
pip install --upgrade pip requests wheel
pip install pygraphviz --global-option=build_ext --global-option="-L/usr/lib/graphviz/" --global-option="-R/usr/lib/graphviz/"
pip install leanblueprint
leanblueprint pdf
cp blueprint/print/print.pdf docs/blueprint.pdf
leanblueprint web
cp -r blueprint/web docs/blueprint
- name: Move documentation to `docs/docs`
run: |
mv .lake/build/doc docs/docs
- name: Bundle dependencies
uses: ruby/setup-ruby@v1
with:
working-directory: docs
ruby-version: "3.0" # Specify Ruby version
bundler-cache: true # Enable caching for bundler

- name: Build website using Jekyll
working-directory: docs
run: JEKYLL_ENV=production bundle exec jekyll build # Note this will also copy the blueprint and API doc into docs/_site

- name: Upload docs & blueprint artifact
uses: actions/upload-pages-artifact@v1
with:
path: docs/_site

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1

# - name: Check declarations
# run: |
# ~/.elan/bin/lake exe checkdecls blueprint/lean_decls

- name: Make sure the cache works
run: |
mv docs/docs .lake/build/doc
4 changes: 2 additions & 2 deletions PersistentDecomp.lean
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import PersistentDecomp.BumpFunctor
import PersistentDecomp.DirectSumDecomposition
import PersistentDecomp.DirectSumDecompositionDual
import PersistentDecomp.Mathlib.Algebra.DirectSum.Basic
import PersistentDecomp.Mathlib.Algebra.Module.Submodule.Map
import PersistentDecomp.Mathlib.Data.DFinsupp.Basic
import PersistentDecomp.Mathlib.Data.DFinsupp.BigOperators
import PersistentDecomp.Mathlib.Order.Disjoint
import PersistentDecomp.Mathlib.Order.Interval.Basic
import PersistentDecomp.Mathlib.Order.SupIndep
Expand Down
22 changes: 11 additions & 11 deletions PersistentDecomp/DirectSumDecomposition.lean
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ variable (M) in
@[ext]
structure DirectSumDecomposition where
carrier : Set (PersistenceSubmodule M)
setIndependent' : SetIndependent carrier
sSupIndep' : sSupIndep carrier
sSup_eq_top' : sSup carrier = ⊤
--(h : ∀ (x : C), DirectSum.IsInternal (M := M.obj x) (S := Submodule K (M.obj x))
--(fun (p : PersistenceSubmodule M) (hp : p ∈ S) => p x))
Expand All @@ -24,12 +24,12 @@ namespace DirectSumDecomposition

instance : SetLike (DirectSumDecomposition M) (PersistenceSubmodule M) where
coe := carrier
coe_injective' D₁ D₂ := by cases D₁; cases D₂; sorry
coe_injective' D₁ := by cases D₁; congr!

attribute [-instance] SetLike.instPartialOrder

lemma setIndependent (D : DirectSumDecomposition M) : SetIndependent (SetLike.coe D) :=
D.setIndependent'
protected lemma sSupIndep (D : DirectSumDecomposition M) : sSupIndep (SetLike.coe D) :=
D.sSupIndep'

lemma sSup_eq_top (D : DirectSumDecomposition M) : sSup (SetLike.coe D) = ⊤ := D.sSup_eq_top'
lemma not_bot_mem (D : DirectSumDecomposition M) : ⊥ ∉ D := D.not_bot_mem'
Expand All @@ -40,7 +40,7 @@ lemma pointwise_sSup_eq_top (D : DirectSumDecomposition M) (x : C) : ⨆ p ∈ D

lemma isInternal (I : DirectSumDecomposition M) (c : C) :
IsInternal (M := M.obj c) (S := Submodule K (M.obj c)) fun p : I ↦ p.val c := by
rw [DirectSum.isInternal_submodule_iff_independent_and_iSup_eq_top]
rw [DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top]
constructor
sorry
sorry
Expand Down Expand Up @@ -108,7 +108,7 @@ lemma RefinementMapSurj' (I : DirectSumDecomposition M) (J : DirectSumDecomposit
rcases h_contra with ⟨A, h₁, h₂⟩
exact (h_not_le (⟨A, h₁⟩) h₂)
have h_disj : Disjoint N₀.val (sSup B) := by
exact (SetIndependent.disjoint_sSup J.setIndependent' N₀.prop h_sub h_aux')
exact (sSupIndep.disjoint_sSup J.sSupIndep' N₀.prop h_sub h_aux')
have h_not_bot : N₀.val ≠ ⊥ := by
intro h_contra
exact J.not_bot_mem (h_contra ▸ N₀.prop)
Expand Down Expand Up @@ -184,7 +184,7 @@ instance DirectSumDecompLE : PartialOrder (DirectSumDecomposition M) where
have h_mem : A.val ∈ B := by
by_contra h_A_not_mem
have h_aux : Disjoint A.val (sSup B) := by
exact (I.setIndependent.disjoint_sSup A.prop h_B₂ h_A_not_mem)
exact (I.sSupIndep.disjoint_sSup A.prop h_B₂ h_A_not_mem)
have h_aux' : sSup B ≤ A.val := h_B₁ ▸ h_N_le_A
have h_last : sSup B = (⊥ : PersistenceSubmodule M) := by
rw [disjoint_comm] at h_aux
Expand Down Expand Up @@ -212,24 +212,24 @@ If `D` is a direct sum decomposition of `M` and for each `N` appearing in `S` we
sum decomposition of `N`, we can construct a refinement of `D`.
-/
def refinement (B : ∀ N ∈ D, Set (PersistenceSubmodule M))
(hB : ∀ N hN, N = sSup (B N hN)) (hB' : ∀ N hN, SetIndependent (B N hN))
(hB : ∀ N hN, N = sSup (B N hN)) (hB' : ∀ N hN, sSupIndep (B N hN))
(hB'' : ∀ N hN, ⊥ ∉ B N hN) : DirectSumDecomposition M where
carrier := ⋃ N, ⋃ hN, B N hN
setIndependent' x hx a ha ha' := by
sSupIndep' x hx a ha ha' := by
sorry
sSup_eq_top' := by
sorry
not_bot_mem' := by simp [Set.mem_iUnion, hB'']

lemma refinement_le (B : ∀ N ∈ D, Set (PersistenceSubmodule M))
(hB : ∀ N hN, N = sSup (B N hN))
(hB' : ∀ N hN, SetIndependent (B N hN))
(hB' : ∀ N hN, sSupIndep (B N hN))
(hB'' : ∀ N hN, ⊥ ∉ B N hN) :
refinement B hB hB' hB'' ≤ D := sorry

lemma refinement_lt_of_exists_ne_singleton (B : ∀ N ∈ D, Set (PersistenceSubmodule M))
(hB : ∀ N hN, N = sSup (B N hN))
(hB' : ∀ N hN, SetIndependent (B N hN))
(hB' : ∀ N hN, sSupIndep (B N hN))
(hB'' : ∀ N hN, ⊥ ∉ B N hN)
(H : ∃ (N : PersistenceSubmodule M) (hN : N ∈ D), B N hN ≠ {N}) :
refinement B hB hB' hB'' < D := sorry
Expand Down
23 changes: 11 additions & 12 deletions PersistentDecomp/DirectSumDecompositionDual.lean
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ variable (M) in
@[ext]
structure DirectSumDecomposition where
carrier : Set (PersistenceSubmodule M)
setIndependent' : SetIndependent carrier
sSupIndep' : sSupIndep carrier
sSup_eq_top' : sSup carrier = ⊤
--(h : ∀ (x : C), DirectSum.IsInternal (M := M.obj x) (S := Submodule K (M.obj x))
--(fun (p : PersistenceSubmodule M) (hp : p ∈ S) => p x))
Expand All @@ -24,12 +24,11 @@ namespace DirectSumDecomposition

instance : SetLike (DirectSumDecomposition M) (PersistenceSubmodule M) where
coe := carrier
coe_injective' D₁ D₂ := by cases D₁; cases D₂; sorry
coe_injective' D₁ D₂ := by cases D₁; congr!

attribute [-instance] SetLike.instPartialOrder

lemma setIndependent (D : DirectSumDecomposition M) : SetIndependent (SetLike.coe D) :=
D.setIndependent'
protected lemma sSupIndep (D : DirectSumDecomposition M) : sSupIndep (SetLike.coe D) := D.sSupIndep'

lemma sSup_eq_top (D : DirectSumDecomposition M) : sSup (SetLike.coe D) = ⊤ := D.sSup_eq_top'
lemma not_bot_mem (D : DirectSumDecomposition M) : ⊥ ∉ D := D.not_bot_mem'
Expand All @@ -40,7 +39,7 @@ lemma pointwise_sSup_eq_top (D : DirectSumDecomposition M) (x : C) : ⨆ p ∈ D

lemma isInternal (I : DirectSumDecomposition M) (c : C) :
IsInternal (M := M.obj c) (S := Submodule K (M.obj c)) fun p : I ↦ p.val c := by
rw [DirectSum.isInternal_submodule_iff_independent_and_iSup_eq_top]
rw [DirectSum.isInternal_submodule_iff_iSupIndep_and_iSup_eq_top]
constructor
sorry
sorry
Expand Down Expand Up @@ -108,7 +107,7 @@ lemma RefinementMapSurj' (I : DirectSumDecomposition M) (J : DirectSumDecomposit
rcases h_contra with ⟨A, h₁, h₂⟩
exact (h_not_le (⟨A, h₁⟩) h₂)
have h_disj : Disjoint N₀.val (sSup B) := by
exact (SetIndependent.disjoint_sSup J.setIndependent' N₀.prop h_sub h_aux')
exact (sSupIndep.disjoint_sSup J.sSupIndep' N₀.prop h_sub h_aux')
have h_not_bot : N₀.val ≠ ⊥ := by
intro h_contra
exact J.not_bot_mem (h_contra ▸ N₀.prop)
Expand Down Expand Up @@ -156,7 +155,7 @@ lemma UniqueGE (I : DirectSumDecomposition M) (J : DirectSumDecomposition M)
exact (h_mem ▸ A.prop)
subst X
exact B.prop
exact (CompleteLattice.setIndependent_pair h_neq').mp (CompleteLattice.SetIndependent.mono I.setIndependent' h_sub)
exact (sSupIndep_pair h_neq').mp (sSupIndep.mono I.sSupIndep' h_sub)
have h_le' : N.val ≤ A.val ⊓ B.val := by
apply le_inf
exact h_le.1
Expand Down Expand Up @@ -270,7 +269,7 @@ instance DirectSumDecompLE : PartialOrder (DirectSumDecomposition M) where
have h_mem : A.val ∈ B := by
by_contra h_A_not_mem
have h_aux : Disjoint A.val (sSup B) := by
exact (I.setIndependent.disjoint_sSup A.prop h_B₂ h_A_not_mem)
exact (I.sSupIndep.disjoint_sSup A.prop h_B₂ h_A_not_mem)
have h_aux' : sSup B ≤ A.val := h_B₁ ▸ h_N_le_A
have h_last : sSup B = (⊥ : PersistenceSubmodule M) := by
rw [disjoint_comm] at h_aux
Expand Down Expand Up @@ -298,24 +297,24 @@ If `D` is a direct sum decomposition of `M` and for each `N` appearing in `S` we
sum decomposition of `N`, we can construct a refinement of `D`.
-/
def refinement (B : ∀ N ∈ D, Set (PersistenceSubmodule M))
(hB : ∀ N hN, N = sSup (B N hN)) (hB' : ∀ N hN, SetIndependent (B N hN))
(hB : ∀ N hN, N = sSup (B N hN)) (hB' : ∀ N hN, sSupIndep (B N hN))
(hB'' : ∀ N hN, ⊥ ∉ B N hN) : DirectSumDecomposition M where
carrier := ⋃ N, ⋃ hN, B N hN
setIndependent' x hx a ha ha' := by
sSupIndep' x hx a ha ha' := by
sorry
sSup_eq_top' := by
sorry
not_bot_mem' := by simp [Set.mem_iUnion, hB'']

lemma refinement_le (B : ∀ N ∈ D, Set (PersistenceSubmodule M))
(hB : ∀ N hN, N = sSup (B N hN))
(hB' : ∀ N hN, SetIndependent (B N hN))
(hB' : ∀ N hN, sSupIndep (B N hN))
(hB'' : ∀ N hN, ⊥ ∉ B N hN) :
refinement B hB hB' hB'' ≤ D := sorry

lemma refinement_lt_of_exists_ne_singleton (B : ∀ N ∈ D, Set (PersistenceSubmodule M))
(hB : ∀ N hN, N = sSup (B N hN))
(hB' : ∀ N hN, SetIndependent (B N hN))
(hB' : ∀ N hN, sSupIndep (B N hN))
(hB'' : ∀ N hN, ⊥ ∉ B N hN)
(H : ∃ (N : PersistenceSubmodule M) (hN : N ∈ D), B N hN ≠ {N}) :
refinement B hB hB' hB'' < D := sorry
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import Mathlib.Data.DFinsupp.Basic
import Mathlib.Data.DFinsupp.BigOperators

@[to_additive (attr := simp)]
lemma SubmonoidClass.coe_dfinsuppProd {B ι N : Type*} {M : ι → Type*} [DecidableEq ι]
Expand Down
4 changes: 2 additions & 2 deletions PersistentDecomp/Mathlib/Order/SupIndep.lean
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ open CompleteLattice

variable {ι κ α : Type*} [CompleteLattice α] {f : ι → κ → α}

lemma Pi.iSupIndepIndep_iff : Independent f ↔ ∀ k, Independent (f · k) := by
simpa [Independent, Pi.disjoint_iff] using forall_swap
lemma Pi.iSupIndep_iff : iSupIndep f ↔ ∀ k, iSupIndep (f · k) := by
simpa [iSupIndep, Pi.disjoint_iff] using forall_swap
4 changes: 2 additions & 2 deletions PersistentDecomp/step_2.lean
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ lemma isInternal_chainBound (hT : IsChain LE.le T) (c : C) : IsInternal fun l :

/-- The `M[λ]` are linearly independent -/
lemma lambdas_indep (hT : IsChain LE.le T) :
CompleteLattice.SetIndependent {M[l] | (l : L T) (_ : ¬ IsBot M[l])} := by
sSupIndep {M[l] | (l : L T) (_ : ¬ IsBot M[l])} := by
intro a b ha hb hab
sorry

Expand All @@ -108,7 +108,7 @@ lemma sSup_lambdas_eq_top (hT : IsChain LE.le T) :
def DirectSumDecomposition_of_chain (hT : IsChain LE.le T) : DirectSumDecomposition M where
carrier := {M[l] | (l : L T) (_ : ¬ IsBot M[l])}
sSup_eq_top' := sSup_lambdas_eq_top hT
setIndependent' := lambdas_indep hT
sSupIndep' := lambdas_indep hT
not_bot_mem' := sorry

/-- The set `𝓤` is an upper bound for the chain `T` -/
Expand Down
31 changes: 29 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,30 @@
# Structure theory of persistence modules
# Decomposition of Persistence Modules

Temporary repo so we can use Lean project infratructure (setting it up seems to require creating a new repository)
The objective of this repository is to formalise the statement of the barcode decomposition theorem of persistence modules into the Lean proof assistant.

## Source

The main source for our work is the paper "Decomposition of Persistence Modules" authored by Magnus Bakke Botnan and William Crawley-Boevey. This paper is available [here](https://arxiv.org/pdf/1811.08946).

The main result we currently aim to prove is Theorem 1.1: *Any pointwise finite-dimensional persistence module is a direct sum of indecomposable modules with local endomorphism ring*.

## Contents

The code is contained in the directory `PH_formalisation`. It contains the following subdirectories:
* `Mathlib`: contains material missing from current files in Mathlib.
* `Prereqs`: contains basic definitions and properties of persistence modules.

In addition, we also have the following files:
* `DirectSumDecomposition`: defines direct sum decompositions of persistence modules and proves basic facts about them.
* `thm1_1`: proves that indecomposable modules have local endomorphism rings.
* `step_2`: proves that pointwise finite-dimensional persistence modules decompose as a direct sum of indecomposable modules.

## Future Considerations

Once Theorem 1.1 is proven, we hope to be able to prove Theorem 1.2: *Pointwise finite-dimensional persistence modules over a totally ordered set decompose into interval modules*. This result is frequently used in topological data analysis, and hence it should be upstreamed to mathlib.

The current implementation views persistence modules and persistence submodules as purely separate objects. It should be a future goal to unify them.

## Acknowledgements

Our project relies on mathlib and we thank all who have contributed on it in some manner for their help.
2 changes: 2 additions & 0 deletions docs/.bundle/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
BUNDLE_PATH: "vendor/bundle"
8 changes: 8 additions & 0 deletions docs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
_site
.sass-cache
.jekyll-cache
.jekyll-metadata
vendor
blueprint/
blueprint.pdf
docs/
Loading

0 comments on commit ee035e4

Please sign in to comment.