module HLearn.Algebra.Morphism
(
Morphism (..)
, DefaultMorphism (..)
, Surjective (..)
, Injective (..)
, Homomorphism (..)
, MorphismComposition (..)
)
where
import qualified Control.ConstraintKinds as CK
import HLearn.Algebra.Models
import HLearn.Algebra.Structures.Groups
class Morphism domain params codomain | params -> codomain where
morph' :: domain -> params -> codomain
morph' = ($>)
($>) :: domain -> params -> codomain
($>) = morph'
(<.>) :: params -> domain -> codomain
(<.>) = flip morph'
data
( Morphism domain params1 interdomain
, Morphism interdomain params2 codomain
) => MorphismComposition domain params1 interdomain params2 codomain = (:.) params2 params1
instance
( Morphism domain params1 interdomain
, Morphism interdomain params2 codomain
) => Morphism domain (MorphismComposition domain params1 interdomain params2 codomain) codomain
where
morph' x (params2 :. params1) = morph' (morph' x params1) params2
class (Morphism domain params codomain) => DefaultMorphism domain params codomain | domain codomain -> params where
defMorphParams :: domain -> codomain -> params
morph :: domain -> codomain
morph domain = (morph' :: domain -> params -> codomain) domain (defMorphParams (undefined :: domain) (undefined :: codomain))
class (Morphism domain params codomain) => Surjective domain params codomain
instance
( Surjective domain params1 interdomain
, Surjective interdomain params2 codomain
) => Surjective domain (MorphismComposition domain params1 interdomain params2 codomain) codomain
class (Morphism domain params codomain) => Injective domain params codomain
instance
( Injective domain params1 interdomain
, Injective interdomain params2 codomain
) => Injective domain (MorphismComposition domain params1 interdomain params2 codomain) codomain
class (Morphism domain params codomain) => Homomorphism domain params codomain
instance
( Homomorphism domain params1 interdomain
, Homomorphism interdomain params2 codomain
) => Homomorphism domain (MorphismComposition domain params1 interdomain params2 codomain) codomain
instance
( CK.FunctorConstraint container model
, CK.FunctorConstraint container datapoint
, CK.FoldableConstraint container model
, CK.Foldable container
, CK.Functor container
, Model (MorphismComposition (container datapoint) params1 interdomain params2 codomain) codomain
, HomTrainer params1 datapoint interdomain
, Morphism (container datapoint) params1 interdomain
, Morphism interdomain params2 codomain
, Monoid codomain
, Semigroup codomain
, Model (MorphismComposition domain params1 interdomain params2 codomain) codomain
) => HomTrainer (MorphismComposition (container datapoint) params1 interdomain params2 codomain) datapoint codomain
where
train1dp' (params2 :. params1) dp = params2 <.> (train1dp' params1 dp)