packages feed

moonlight-homology-0.1.0.0: src-topology/Moonlight/Homology/Pure/TopologyObserver.hs

module Moonlight.Homology.Pure.TopologyObserver
  ( TopologyObserver,
    runTopologyObserver,
    WitnessInterpreter,
    mkWitnessInterpreter,
    runWitnessInterpreter,
    observeEulerCharacteristic,
    observeBettiVector,
    observeIntegralHomology,
    observeIntegralHomologyAt,
    observeTorsionFamily,
    observeExactRepresentativeClasses,
    observeExactRepresentativeClassCount,
    observePersistencePairs,
    observePersistenceCount,
    observeCoefficientRepresentativeCycles,
    observeCoefficientRepresentativeCycleCount,
    observeCoefficientRepresentativeCocycles,
    observeCoefficientRepresentativeCocycleCount,
    observeHarmonicBasis,
    observeHarmonicCount,
    observeMacroScaffold,
    observeScaffoldSummary,
    observeLowSpectralModes,
  )
where

import Data.Kind (Type)
import Moonlight.Homology.Pure.Chain
  ( EulerCharacteristic,
    ExactRepresentativeClass,
    HarmonicBasisElement,
    HomologicalDegree,
    PersistencePair,
    RepresentativeChain,
    TopologyWitness,
  )
import Moonlight.Homology.Pure.Graded.Query (DegreeSelection)
import Moonlight.Homology.Pure.GradedTorsion (GradedTorsionFamily)
import Moonlight.Homology.Pure.Group (HomologyGroup)
import Moonlight.Homology.Pure.TopologyView
  ( ScaffoldSummaryAlgebra,
    TopologyView,
    WitnessSlice,
    mkTopologyView,
    runWitnessSlice,
    topologyViewTorsionFamily,
    sliceBettiVector,
    sliceCoefficientRepresentativeCocycles,
    sliceCoefficientRepresentativeCycles,
    sliceEulerCharacteristic,
    sliceExactRepresentativeClasses,
    sliceHarmonicBasis,
    sliceIntegralHomology,
    sliceIntegralHomologyAt,
    sliceLowSpectralModes,
    sliceMacroScaffold,
    slicePersistencePairs,
    sliceScaffoldSummary,
  )

type TopologyObserver :: Type -> Type -> Type -> Type -> Type -> Type -> Type -> Type
newtype TopologyObserver summary scaffold spectral persistence coefficient basis observed = TopologyObserver
  { runTopologyObserver :: TopologyView summary scaffold spectral persistence coefficient basis -> observed
  }

instance Functor (TopologyObserver summary scaffold spectral persistence coefficient basis) where
  fmap mapper (TopologyObserver observeValue) =
    TopologyObserver (mapper . observeValue)

instance Applicative (TopologyObserver summary scaffold spectral persistence coefficient basis) where
  pure value =
    TopologyObserver (const value)
  TopologyObserver observeFunction <*> TopologyObserver observeValue =
    TopologyObserver (\topologyViewValue -> observeFunction topologyViewValue (observeValue topologyViewValue))

type WitnessInterpreter :: Type -> Type -> Type -> Type -> Type -> Type -> Type -> Type
newtype WitnessInterpreter summary scaffold spectral persistence coefficient basis observed = WitnessInterpreter
  { runWitnessInterpreter :: TopologyWitness scaffold spectral persistence coefficient basis -> observed
  }

mkWitnessInterpreter ::
  ScaffoldSummaryAlgebra scaffold summary ->
  TopologyObserver summary scaffold spectral persistence coefficient basis observed ->
  WitnessInterpreter summary scaffold spectral persistence coefficient basis observed
mkWitnessInterpreter summaryAlgebra (TopologyObserver observeValue) =
  WitnessInterpreter (observeValue . mkTopologyView summaryAlgebra)

observeWithSlice ::
  WitnessSlice summary scaffold spectral persistence coefficient basis observed ->
  TopologyObserver summary scaffold spectral persistence coefficient basis observed
observeWithSlice sliceValue =
  TopologyObserver (runWitnessSlice sliceValue)

observeEulerCharacteristic ::
  TopologyObserver summary scaffold spectral persistence coefficient basis (Maybe EulerCharacteristic)
observeEulerCharacteristic =
  observeWithSlice sliceEulerCharacteristic

observeBettiVector ::
  TopologyObserver summary scaffold spectral persistence coefficient basis [Int]
observeBettiVector =
  observeWithSlice sliceBettiVector

observeIntegralHomology ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis [HomologyGroup Integer]
observeIntegralHomology selectionValue =
  observeWithSlice (sliceIntegralHomology selectionValue)

observeIntegralHomologyAt ::
  HomologicalDegree ->
  TopologyObserver summary scaffold spectral persistence coefficient basis (Maybe (HomologyGroup Integer))
observeIntegralHomologyAt degreeValue =
  observeWithSlice (sliceIntegralHomologyAt degreeValue)

observeTorsionFamily ::
  TopologyObserver summary scaffold spectral persistence coefficient basis GradedTorsionFamily
observeTorsionFamily =
  TopologyObserver topologyViewTorsionFamily

observeExactRepresentativeClasses ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis [ExactRepresentativeClass basis]
observeExactRepresentativeClasses selectionValue =
  observeWithSlice (sliceExactRepresentativeClasses selectionValue)

observeExactRepresentativeClassCount ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis Int
observeExactRepresentativeClassCount selectionValue =
  length <$> observeExactRepresentativeClasses selectionValue

observePersistencePairs ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis [PersistencePair persistence]
observePersistencePairs selectionValue =
  observeWithSlice (slicePersistencePairs selectionValue)

observePersistenceCount ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis Int
observePersistenceCount selectionValue =
  length <$> observePersistencePairs selectionValue

observeCoefficientRepresentativeCycles ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis [RepresentativeChain coefficient basis]
observeCoefficientRepresentativeCycles selectionValue =
  observeWithSlice (sliceCoefficientRepresentativeCycles selectionValue)

observeCoefficientRepresentativeCycleCount ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis Int
observeCoefficientRepresentativeCycleCount selectionValue =
  length <$> observeCoefficientRepresentativeCycles selectionValue

observeCoefficientRepresentativeCocycles ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis [RepresentativeChain coefficient basis]
observeCoefficientRepresentativeCocycles selectionValue =
  observeWithSlice (sliceCoefficientRepresentativeCocycles selectionValue)

observeCoefficientRepresentativeCocycleCount ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis Int
observeCoefficientRepresentativeCocycleCount selectionValue =
  length <$> observeCoefficientRepresentativeCocycles selectionValue

observeHarmonicBasis ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis [HarmonicBasisElement coefficient basis]
observeHarmonicBasis selectionValue =
  observeWithSlice (sliceHarmonicBasis selectionValue)

observeHarmonicCount ::
  DegreeSelection ->
  TopologyObserver summary scaffold spectral persistence coefficient basis Int
observeHarmonicCount selectionValue =
  length <$> observeHarmonicBasis selectionValue

observeMacroScaffold ::
  TopologyObserver summary scaffold spectral persistence coefficient basis (Maybe scaffold)
observeMacroScaffold =
  observeWithSlice sliceMacroScaffold

observeScaffoldSummary ::
  TopologyObserver summary scaffold spectral persistence coefficient basis (Maybe summary)
observeScaffoldSummary =
  observeWithSlice sliceScaffoldSummary

observeLowSpectralModes ::
  TopologyObserver summary scaffold spectral persistence coefficient basis [spectral]
observeLowSpectralModes =
  observeWithSlice sliceLowSpectralModes