packages feed

manifolds 0.2.3.0 → 0.3.0.0

raw patch · 24 files changed

+1053/−2703 lines, 24 filesdep +free-vector-spacesdep +lineardep +linearmap-categorydep −hmatrixdep ~constrained-categoriesbinary-addedPVP ok

version bump matches the API change (PVP)

Dependencies added: free-vector-spaces, linear, linearmap-category

Dependencies removed: hmatrix

Dependency ranges changed: constrained-categories

API changes (from Hackage documentation)

- Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.RealDimension n, Data.Manifold.PseudoAffine.LocallyScalable n a) => GHC.Float.Floating (Data.Function.Differentiable.RWDfblFuncValue n a n)
- Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.RealDimension n, Data.Manifold.PseudoAffine.LocallyScalable n a) => GHC.Num.Num (Data.Function.Differentiable.RWDfblFuncValue n a n)
- Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.RealDimension n, Data.Manifold.PseudoAffine.LocallyScalable n a) => GHC.Real.Fractional (Data.Function.Differentiable.RWDfblFuncValue n a n)
- Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.WithField s Data.Manifold.PseudoAffine.EuclidSpace v, Data.AdditiveGroup.AdditiveGroup v, v ~ Data.Manifold.PseudoAffine.Needle (Data.Manifold.PseudoAffine.Interior (Data.Manifold.PseudoAffine.Needle v)), Data.Manifold.PseudoAffine.LocallyScalable s a, Data.Manifold.PseudoAffine.RealDimension s) => Data.AdditiveGroup.AdditiveGroup (Data.Function.Differentiable.RWDfblFuncValue s a v)
- Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.WithField s Data.Manifold.PseudoAffine.LinearManifold v, Data.Manifold.PseudoAffine.LocallyScalable s a, GHC.Float.Floating s) => Data.AdditiveGroup.AdditiveGroup (Data.Function.Differentiable.DfblFuncValue s a v)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Arrow.Constrained.CartesianAgent (Data.Function.Differentiable.Data.Differentiable s)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Arrow.Constrained.Morphism (Data.Function.Differentiable.Data.Differentiable s)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Arrow.Constrained.PointAgent (Data.Function.Differentiable.DfblFuncValue s) (Data.Function.Differentiable.Data.Differentiable s) a x
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Arrow.Constrained.PreArrow (Data.Function.Differentiable.Data.Differentiable s)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Arrow.Constrained.WellPointed (Data.Function.Differentiable.Data.Differentiable s)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Category.Constrained.Cartesian (Data.Function.Differentiable.Data.Differentiable s)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Category.Constrained.Category (Data.Function.Differentiable.Data.Differentiable s)
- Data.Function.Differentiable: instance Data.LinearMap.HerMetric.MetricScalar s => Control.Category.Constrained.HasAgent (Data.Function.Differentiable.Data.Differentiable s)
- Data.LinearMap.HerMetric: (<.>^) :: HasMetric' v => DualSpace v -> v -> Scalar v
- Data.LinearMap.HerMetric: (^<.>) :: HasMetric v => v -> DualSpace v -> Scalar v
- Data.LinearMap.HerMetric: HerMetric :: Maybe (Linear (Scalar v) v (DualSpace v)) -> HerMetric v
- Data.LinearMap.HerMetric: HerMetric' :: Maybe (Linear (Scalar v) (DualSpace v) v) -> HerMetric' v
- Data.LinearMap.HerMetric: Stiefel1 :: DualSpace v -> Stiefel1 v
- Data.LinearMap.HerMetric: [getStiefel1N] :: Stiefel1 v -> DualSpace v
- Data.LinearMap.HerMetric: [metricMatrix'] :: HerMetric' v -> Maybe (Linear (Scalar v) (DualSpace v) v)
- Data.LinearMap.HerMetric: [metricMatrix] :: HerMetric v -> Maybe (Linear (Scalar v) v (DualSpace v))
- Data.LinearMap.HerMetric: adjoint :: (HasMetric v, HasMetric w, s ~ Scalar v, s ~ Scalar w) => (Linear s v w) -> Linear s (DualSpace w) (DualSpace v)
- Data.LinearMap.HerMetric: applyLinMapMetric :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric (Linear ℝ v w) -> DualSpace v -> HerMetric w
- Data.LinearMap.HerMetric: applyLinMapMetric' :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric' (Linear ℝ v w) -> v -> HerMetric' w
- Data.LinearMap.HerMetric: asPackedMatrix :: (FiniteDimensional v, FiniteDimensional w, Scalar w ~ Scalar v) => (v :-* w) -> Matrix (Scalar v)
- Data.LinearMap.HerMetric: asPackedVector :: FiniteDimensional v => v -> Vector (Scalar v)
- Data.LinearMap.HerMetric: basisInDual :: HasMetric' v => Tagged v (Basis v -> Basis (DualSpace v))
- Data.LinearMap.HerMetric: basisIndex :: FiniteDimensional v => Tagged v (Basis v -> Int)
- Data.LinearMap.HerMetric: class HasEigenSystem m where type family EigenVector m :: *
- Data.LinearMap.HerMetric: class (FiniteDimensional v, KnownNat (FreeDimension v)) => IsFreeSpace v where identityMatrix = fromInversePair emb proj where emb@(DenseLinear i) = canonicalIdentityMatrix proj = DenseLinear i
- Data.LinearMap.HerMetric: class (HasBasis v, HasTrie (Basis v), SmoothScalar (Scalar v)) => FiniteDimensional v where completeBasis = liftA2 (\ dim f -> f <$> [0 .. dim - 1]) dimension indexBasis completeBasisValues = defCBVs where defCBVs :: forall v. FiniteDimensional v => [v] defCBVs = basisValue <$> cb where Tagged cb = completeBasis :: Tagged v [Basis v] asPackedVector v = fromList $ snd <$> decompose v asPackedMatrix = defaultAsPackedMatrix where defaultAsPackedMatrix :: forall v w s. (FiniteDimensional v, FiniteDimensional w, s ~ Scalar v, s ~ Scalar w) => (v :-* w) -> Matrix s defaultAsPackedMatrix m = fromColumns $ asPackedVector . atBasis m <$> cb where (Tagged cb) = completeBasis :: Tagged v [Basis v] fromPackedVector v = result where result = recompose $ zip cb (toList v) cb = witness completeBasis result fromPackedMatrix = defaultFromPackedMatrix where defaultFromPackedMatrix :: forall v w s. (FiniteDimensional v, FiniteDimensional w, s ~ Scalar v, s ~ Scalar w) => Matrix s -> (v :-* w) defaultFromPackedMatrix m = linear $ fromPackedVector . app m . asPackedVector
- Data.LinearMap.HerMetric: class (FiniteDimensional v, FiniteDimensional (DualSpace v), VectorSpace (DualSpace v), HasBasis (DualSpace v), MetricScalar (Scalar v), Scalar v ~ Scalar (DualSpace v)) => HasMetric' v where type family DualSpace v :: * DualSpace v = v basisInDual = bid where bid :: forall v. HasMetric' v => Tagged v (Basis v -> Basis (DualSpace v)) bid = Tagged $ bi >>> ib' where Tagged bi = basisIndex :: Tagged v (Basis v -> Int) Tagged ib' = indexBasis :: Tagged (DualSpace v) (Int -> Basis (DualSpace v))
- Data.LinearMap.HerMetric: completeBasis :: FiniteDimensional v => Tagged v [Basis v]
- Data.LinearMap.HerMetric: completeBasisValues :: FiniteDimensional v => [v]
- Data.LinearMap.HerMetric: covariance :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric' (v, w) -> Option (Linear ℝ v w)
- Data.LinearMap.HerMetric: dimension :: FiniteDimensional v => Tagged v Int
- Data.LinearMap.HerMetric: doubleDual :: (HasMetric' v, HasMetric' (DualSpace v)) => v -> DualSpace (DualSpace v)
- Data.LinearMap.HerMetric: doubleDual' :: (HasMetric' v, HasMetric' (DualSpace v)) => DualSpace (DualSpace v) -> v
- Data.LinearMap.HerMetric: dualCoCoProduct :: (HasMetric v, HasMetric w, Scalar v ~ s, Scalar w ~ s) => Linear s w v -> Linear s w v -> HerMetric w
- Data.LinearMap.HerMetric: dualiseMetric :: HasMetric v => HerMetric (DualSpace v) -> HerMetric' v
- Data.LinearMap.HerMetric: dualiseMetric' :: HasMetric v => HerMetric' v -> HerMetric (DualSpace v)
- Data.LinearMap.HerMetric: eigenCoSpan :: (HasMetric v, Scalar v ~ ℝ) => HerMetric' v -> [DualSpace v]
- Data.LinearMap.HerMetric: eigenCoSpan' :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> [v]
- Data.LinearMap.HerMetric: eigenSpan :: (HasMetric v, Scalar v ~ ℝ) => HerMetric' v -> [v]
- Data.LinearMap.HerMetric: eigenSpan' :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> [DualSpace v]
- Data.LinearMap.HerMetric: eigenSystem :: HasEigenSystem m => m -> ([Stiefel1 (EigenVector m)], [(EigenVector m, DualSpace (EigenVector m))])
- Data.LinearMap.HerMetric: euclideanMetric' :: (HasMetric v, InnerSpace v) => HerMetric v
- Data.LinearMap.HerMetric: euclideanRelativeMetricVolume :: (HasMetric v, InnerSpace v) => HerMetric v -> Scalar v
- Data.LinearMap.HerMetric: extendMetric :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> v -> HerMetric v
- Data.LinearMap.HerMetric: factoriseMetric :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric (v, w) -> (HerMetric v, HerMetric w)
- Data.LinearMap.HerMetric: factoriseMetric' :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric' (v, w) -> (HerMetric' v, HerMetric' w)
- Data.LinearMap.HerMetric: fromDualWith :: HasMetric v => HerMetric' v -> DualSpace v -> v
- Data.LinearMap.HerMetric: fromPackedMatrix :: (FiniteDimensional v, FiniteDimensional w, Scalar w ~ Scalar v) => Matrix (Scalar v) -> (v :-* w)
- Data.LinearMap.HerMetric: fromPackedVector :: FiniteDimensional v => Vector (Scalar v) -> v
- Data.LinearMap.HerMetric: functional :: HasMetric' v => (v -> Scalar v) -> DualSpace v
- Data.LinearMap.HerMetric: imitateMetricSpanChange :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> HerMetric' v -> Linear ℝ v v
- Data.LinearMap.HerMetric: indexBasis :: FiniteDimensional v => Tagged v (Int -> Basis v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.LinearMap.HerMetric.HasMetric w, Data.VectorSpace.Scalar v ~ Data.VectorSpace.Scalar w) => Data.LinearMap.HerMetric.HasMetric' (v, w)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.LinearMap.HerMetric.HasMetric w, s ~ Data.VectorSpace.Scalar v, s ~ Data.VectorSpace.Scalar w) => Data.LinearMap.HerMetric.HasMetric' (Data.LinearMap.Category.Linear s v w)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.FiniteDimensional.FiniteDimensional w, GHC.Show.Show (Data.LinearMap.HerMetric.DualSpace v), GHC.Show.Show w, Data.VectorSpace.Scalar v ~ s, Data.VectorSpace.Scalar w ~ s) => GHC.Show.Show (Data.LinearMap.Category.Linear s v w)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.Scalar v ~ Data.Manifold.Types.Primitive.ℝ) => Data.LinearMap.HerMetric.HasEigenSystem (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.Scalar v ~ Data.Manifold.Types.Primitive.ℝ) => Data.LinearMap.HerMetric.HasEigenSystem (Data.LinearMap.HerMetric.HerMetric v, Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.Scalar v ~ Data.Manifold.Types.Primitive.ℝ) => Data.LinearMap.HerMetric.HasEigenSystem (Data.LinearMap.HerMetric.HerMetric' v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.Scalar v ~ Data.Manifold.Types.Primitive.ℝ) => Data.LinearMap.HerMetric.HasEigenSystem (Data.LinearMap.HerMetric.HerMetric' v, Data.LinearMap.HerMetric.HerMetric' v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.Scalar v ~ GHC.Types.Double, GHC.Show.Show (Data.LinearMap.HerMetric.DualSpace v)) => GHC.Show.Show (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, Data.VectorSpace.Scalar v ~ GHC.Types.Double, GHC.Show.Show v) => GHC.Show.Show (Data.LinearMap.HerMetric.HerMetric' v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, s ~ Data.VectorSpace.Scalar v) => Data.LinearMap.HerMetric.HasMetric' (Data.VectorSpace.FiniteDimensional.FinVecArrRep t v s)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, v ~ Data.LinearMap.HerMetric.DualSpace v, GHC.Num.Num (Data.VectorSpace.Scalar v)) => GHC.Num.Num (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, v ~ Data.VectorSpace.Scalar v, v ~ Data.LinearMap.HerMetric.DualSpace v, GHC.Float.Floating v) => GHC.Float.Floating (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance (Data.LinearMap.HerMetric.HasMetric v, v ~ Data.VectorSpace.Scalar v, v ~ Data.LinearMap.HerMetric.DualSpace v, GHC.Real.Fractional v) => GHC.Real.Fractional (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar s, GHC.Classes.Ord s, Data.CoNat.KnownNat n) => Data.LinearMap.HerMetric.HasMetric' (s Data.CoNat.^ n)
- Data.LinearMap.HerMetric: instance Data.LinearMap.HerMetric.HasMetric v => Data.AdditiveGroup.AdditiveGroup (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance Data.LinearMap.HerMetric.HasMetric v => Data.AdditiveGroup.AdditiveGroup (Data.LinearMap.HerMetric.HerMetric' v)
- Data.LinearMap.HerMetric: instance Data.LinearMap.HerMetric.HasMetric v => Data.VectorSpace.VectorSpace (Data.LinearMap.HerMetric.HerMetric v)
- Data.LinearMap.HerMetric: instance Data.LinearMap.HerMetric.HasMetric v => Data.VectorSpace.VectorSpace (Data.LinearMap.HerMetric.HerMetric' v)
- Data.LinearMap.HerMetric: instance Data.LinearMap.HerMetric.HasMetric' GHC.Types.Double
- Data.LinearMap.HerMetric: instance Data.LinearMap.HerMetric.MetricScalar k => Data.LinearMap.HerMetric.HasMetric' (Data.Manifold.Types.Primitive.ZeroDim k)
- Data.LinearMap.HerMetric: linMapAsTensProd :: (FiniteDimensional v, FiniteDimensional w, Scalar v ~ Scalar w) => v :-* w -> DualSpace v ⊗ w
- Data.LinearMap.HerMetric: linMapFromTensProd :: (FiniteDimensional v, FiniteDimensional w, Scalar v ~ Scalar w) => DualSpace v ⊗ w -> v :-* w
- Data.LinearMap.HerMetric: metriNormalise :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> v -> v
- Data.LinearMap.HerMetric: metriNormalise' :: (HasMetric v, Floating (Scalar v)) => HerMetric' v -> DualSpace v -> DualSpace v
- Data.LinearMap.HerMetric: metriScale :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> v -> v
- Data.LinearMap.HerMetric: metriScale' :: (HasMetric v, Floating (Scalar v)) => HerMetric' v -> DualSpace v -> DualSpace v
- Data.LinearMap.HerMetric: metric :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> v -> Scalar v
- Data.LinearMap.HerMetric: metric' :: (HasMetric v, Floating (Scalar v)) => HerMetric' v -> DualSpace v -> Scalar v
- Data.LinearMap.HerMetric: metric'AsLength :: HerMetric' ℝ -> ℝ
- Data.LinearMap.HerMetric: metricAsLength :: HerMetric ℝ -> ℝ
- Data.LinearMap.HerMetric: metricFromLength :: ℝ -> HerMetric ℝ
- Data.LinearMap.HerMetric: metricSq :: HasMetric v => HerMetric v -> v -> Scalar v
- Data.LinearMap.HerMetric: metricSq' :: HasMetric v => HerMetric' v -> DualSpace v -> Scalar v
- Data.LinearMap.HerMetric: metrics :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> [v] -> Scalar v
- Data.LinearMap.HerMetric: metrics' :: (HasMetric v, Floating (Scalar v)) => HerMetric' v -> [DualSpace v] -> Scalar v
- Data.LinearMap.HerMetric: newtype HerMetric v
- Data.LinearMap.HerMetric: newtype HerMetric' v
- Data.LinearMap.HerMetric: newtype Stiefel1 v
- Data.LinearMap.HerMetric: orthogonalComplementSpan :: (HasMetric v, Scalar v ~ ℝ) => [Stiefel1 (DualSpace v)] -> [Stiefel1 v]
- Data.LinearMap.HerMetric: outerProducts :: (HasMetric v, FiniteDimensional w, Scalar v ~ s, Scalar w ~ s) => [(w, DualSpace v)] -> Linear s v w
- Data.LinearMap.HerMetric: productMetric :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric v -> HerMetric w -> HerMetric (v, w)
- Data.LinearMap.HerMetric: productMetric' :: (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ) => HerMetric' v -> HerMetric' w -> HerMetric' (v, w)
- Data.LinearMap.HerMetric: projector :: HasMetric v => DualSpace v -> HerMetric v
- Data.LinearMap.HerMetric: projector' :: HasMetric v => v -> HerMetric' v
- Data.LinearMap.HerMetric: projector's :: HasMetric v => [v] -> HerMetric' v
- Data.LinearMap.HerMetric: projectors :: HasMetric v => [DualSpace v] -> HerMetric v
- Data.LinearMap.HerMetric: recipMetric :: HasMetric v => HerMetric' v -> HerMetric v
- Data.LinearMap.HerMetric: recipMetric' :: HasMetric v => HerMetric v -> HerMetric' v
- Data.LinearMap.HerMetric: safeRecipMetric :: HasMetric v => HerMetric' v -> Option (HerMetric v)
- Data.LinearMap.HerMetric: safeRecipMetric' :: HasMetric v => HerMetric v -> Option (HerMetric' v)
- Data.LinearMap.HerMetric: spanHilbertSubspace :: (HasMetric v, Scalar v ~ s, IsFreeSpace w, Scalar w ~ s) => HerMetric v -> [v] -> Option (Embedding (Linear s) w v)
- Data.LinearMap.HerMetric: spanSubHilbertSpace :: (HasMetric v, InnerSpace v, Scalar v ~ s, IsFreeSpace w, Scalar w ~ s) => [v] -> Option (Embedding (Linear s) w v)
- Data.LinearMap.HerMetric: toDualWith :: HasMetric v => HerMetric v -> v -> DualSpace v
- Data.LinearMap.HerMetric: transformMetric :: (HasMetric v, HasMetric w, Scalar v ~ s, Scalar w ~ s) => Linear s w v -> HerMetric v -> HerMetric w
- Data.LinearMap.HerMetric: transformMetric' :: (HasMetric v, HasMetric w, Scalar v ~ s, Scalar w ~ s) => Linear s v w -> HerMetric' v -> HerMetric' w
- Data.LinearMap.HerMetric: tryMetricAsLength :: HerMetric ℝ -> Option ℝ
- Data.LinearMap.HerMetric: type HasMetric v = (HasMetric' v, HasMetric' (DualSpace v), DualSpace (DualSpace v) ~ v)
- Data.LinearMap.HerMetric: type MetricScalar s = (SmoothScalar s, Ord s)
- Data.LinearMap.HerMetric: volumeRatio :: HasMetric v => HerMetric v -> HerMetric v -> Scalar v
- Data.Manifold.Griddable: instance (Data.Manifold.Griddable.Griddable m a, Data.Manifold.Griddable.Griddable n a) => Data.Manifold.Griddable.Griddable (m, n) a
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.HasMetric a, Data.VectorSpace.FiniteDimensional.FiniteDimensional b, Data.VectorSpace.Scalar a ~ Data.VectorSpace.Scalar b) => Data.Manifold.PseudoAffine.PseudoAffine (a Data.LinearMap.:-* b)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.HasMetric a, Data.VectorSpace.FiniteDimensional.FiniteDimensional b, Data.VectorSpace.Scalar a ~ Data.VectorSpace.Scalar b) => Data.Manifold.PseudoAffine.PseudoAffine (a Data.Manifold.Types.Primitive.⊗ b)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.HasMetric a, Data.VectorSpace.FiniteDimensional.FiniteDimensional b, Data.VectorSpace.Scalar a ~ Data.VectorSpace.Scalar b) => Data.Manifold.PseudoAffine.Semimanifold (a Data.LinearMap.:-* b)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.HasMetric a, Data.VectorSpace.FiniteDimensional.FiniteDimensional b, Data.VectorSpace.Scalar a ~ Data.VectorSpace.Scalar b) => Data.Manifold.PseudoAffine.Semimanifold (a Data.Manifold.Types.Primitive.⊗ b)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.HasMetric a, Data.VectorSpace.FiniteDimensional.FiniteDimensional b, Data.VectorSpace.Scalar a ~ s, Data.VectorSpace.Scalar b ~ s) => Data.Manifold.PseudoAffine.PseudoAffine (Data.LinearMap.Category.Linear s a b)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.HasMetric a, Data.VectorSpace.FiniteDimensional.FiniteDimensional b, Data.VectorSpace.Scalar a ~ s, Data.VectorSpace.Scalar b ~ s) => Data.Manifold.PseudoAffine.Semimanifold (Data.LinearMap.Category.Linear s a b)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.MetricScalar a, Data.CoNat.KnownNat n) => Data.Manifold.PseudoAffine.PseudoAffine (Data.CoNat.FreeVect n a)
- Data.Manifold.PseudoAffine: instance (Data.LinearMap.HerMetric.MetricScalar a, Data.CoNat.KnownNat n) => Data.Manifold.PseudoAffine.Semimanifold (Data.CoNat.FreeVect n a)
- Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.PseudoAffine a, Data.Manifold.PseudoAffine.PseudoAffine b, Data.Manifold.PseudoAffine.PseudoAffine c) => Data.Manifold.PseudoAffine.LocallyCoercible ((a, b), c) (a, (b, c))
- Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.PseudoAffine a, Data.Manifold.PseudoAffine.PseudoAffine b, Data.Manifold.PseudoAffine.PseudoAffine c) => Data.Manifold.PseudoAffine.LocallyCoercible ((a, b), c) (a, b, c)
- Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.PseudoAffine a, Data.Manifold.PseudoAffine.PseudoAffine b, Data.Manifold.PseudoAffine.PseudoAffine c) => Data.Manifold.PseudoAffine.LocallyCoercible (a, (b, c)) ((a, b), c)
- Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.PseudoAffine a, Data.Manifold.PseudoAffine.PseudoAffine b, Data.Manifold.PseudoAffine.PseudoAffine c) => Data.Manifold.PseudoAffine.LocallyCoercible (a, (b, c)) (a, b, c)
- Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.PseudoAffine a, Data.Manifold.PseudoAffine.PseudoAffine b, Data.Manifold.PseudoAffine.PseudoAffine c) => Data.Manifold.PseudoAffine.LocallyCoercible (a, b, c) ((a, b), c)
- Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.PseudoAffine a, Data.Manifold.PseudoAffine.PseudoAffine b, Data.Manifold.PseudoAffine.PseudoAffine c) => Data.Manifold.PseudoAffine.LocallyCoercible (a, b, c) (a, (b, c))
- Data.Manifold.PseudoAffine: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar s, Data.Manifold.PseudoAffine.LinearManifold b, Data.VectorSpace.Scalar b ~ s) => Data.Manifold.PseudoAffine.LocallyCoercible (Data.VectorSpace.FiniteDimensional.FinVecArrRep t b s) b
- Data.Manifold.PseudoAffine: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar s, Data.Manifold.PseudoAffine.LinearManifold b, Data.VectorSpace.Scalar b ~ s) => Data.Manifold.PseudoAffine.LocallyCoercible b (Data.VectorSpace.FiniteDimensional.FinVecArrRep t b s)
- Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.ImpliesMetric Data.LinearMap.HerMetric.HerMetric
- Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.ImpliesMetric Data.LinearMap.HerMetric.HerMetric'
- Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Data.Manifold.Types.Primitive.ℝ Data.CoNat.^ 'Data.CoNat.S 'Data.CoNat.Z) Data.Manifold.Types.Primitive.ℝ
- Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible Data.Manifold.Types.Primitive.ℝ (Data.Manifold.Types.Primitive.ℝ Data.CoNat.^ 'Data.CoNat.S 'Data.CoNat.Z)
- Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.PseudoAffine (Data.Manifold.Types.Primitive.ZeroDim k)
- Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.Semimanifold (Data.Manifold.Types.Primitive.ZeroDim k)
- Data.Manifold.PseudoAffine: instance Data.VectorSpace.FiniteDimensional.SmoothScalar s => Data.Manifold.PseudoAffine.LocallyCoercible (Data.VectorSpace.FiniteDimensional.FinVecArrRep t b s) (Data.VectorSpace.FiniteDimensional.FinVecArrRep t b s)
- Data.Manifold.PseudoAffine: instance Data.VectorSpace.FiniteDimensional.SmoothScalar s => Data.Manifold.PseudoAffine.PseudoAffine (Data.VectorSpace.FiniteDimensional.FinVecArrRep t b s)
- Data.Manifold.PseudoAffine: instance Data.VectorSpace.FiniteDimensional.SmoothScalar s => Data.Manifold.PseudoAffine.Semimanifold (Data.VectorSpace.FiniteDimensional.FinVecArrRep t b s)
- Data.Manifold.PseudoAffine: type HilbertSpace x = (LinearManifold x, InnerSpace x, Interior x ~ x, Needle x ~ x, DualSpace x ~ x, Floating (Scalar x))
- Data.Manifold.Riemannian: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace a, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace b, Data.Manifold.Riemannian.Geodesic (a, b)) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ (a, b))
- Data.Manifold.Riemannian: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace a, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace b, Data.Manifold.Riemannian.Geodesic (a, b)) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay (a, b))
- Data.Manifold.Riemannian: instance (Data.Manifold.Riemannian.Geodesic v, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace v) => Data.Manifold.Riemannian.Geodesic (Data.LinearMap.HerMetric.Stiefel1 v)
- Data.Manifold.Riemannian: instance (Data.Manifold.Riemannian.Geodesic v, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace v) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ (Data.VectorSpace.FiniteDimensional.FinVecArrRep t v Data.Manifold.Types.Primitive.ℝ))
- Data.Manifold.Riemannian: instance (Data.Manifold.Riemannian.Geodesic v, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace v) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay (Data.VectorSpace.FiniteDimensional.FinVecArrRep t v Data.Manifold.Types.Primitive.ℝ))
- Data.Manifold.Riemannian: instance Data.CoNat.KnownNat n => Data.Manifold.Riemannian.Geodesic (Data.CoNat.FreeVect n Data.Manifold.Types.Primitive.ℝ)
- Data.Manifold.Riemannian: instance Data.CoNat.KnownNat n => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ (Data.CoNat.FreeVect n Data.Manifold.Types.Primitive.ℝ))
- Data.Manifold.Riemannian: instance Data.CoNat.KnownNat n => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay (Data.CoNat.FreeVect n Data.Manifold.Types.Primitive.ℝ))
- Data.Manifold.Riemannian: instance Data.Manifold.PseudoAffine.PseudoAffine v => Data.Manifold.Riemannian.Geodesic (Data.VectorSpace.FiniteDimensional.FinVecArrRep t v Data.Manifold.Types.Primitive.ℝ)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.S²)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.S¹)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.S⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.ℝ)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.ℝ⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.S²)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.S¹)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.S⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.ℝ)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.ℝ⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Primitive.ZeroDim Data.Manifold.Types.Primitive.ℝ)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.IntervalLike (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.S⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.IntervalLike (Data.Manifold.Types.Primitive.CD¹ Data.Manifold.Types.Primitive.ℝ⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.IntervalLike (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.S⁰)
- Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.IntervalLike (Data.Manifold.Types.Primitive.Cℝay Data.Manifold.Types.Primitive.ℝ⁰)
- Data.Manifold.TreeCover: autoglueTriangulation :: (KnownNat n'', WithField ℝ Manifold x, n ~ S n', n' ~ S n'') => (forall t'. TriangBuild t' n' x ()) -> TriangBuild t n' x ()
- Data.Manifold.TreeCover: elementaryTriang :: (KnownNat n', n ~ S n', WithField ℝ EuclidSpace x) => Simplex n x -> AutoTriang n x
- Data.Manifold.TreeCover: instance (Data.CoNat.KnownNat n, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x) => Data.Semigroup.Semigroup (Data.Manifold.TreeCover.AutoTriang ('Data.CoNat.S ('Data.CoNat.S n)) x)
- Data.Manifold.TreeCover: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.AffineManifold x, Data.Manifold.Riemannian.Geodesic x) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.TreeCover.Shade x)
- Data.Manifold.TreeCover: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.AffineManifold x, Data.Manifold.Riemannian.Geodesic x) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.TreeCover.Shade' x)
- Data.Manifold.TreeCover: instance (GHC.Show.Show x, GHC.Show.Show (Data.LinearMap.HerMetric.DualSpace (Data.Manifold.PseudoAffine.Needle x)), Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x) => GHC.Show.Show (Data.Manifold.TreeCover.Shade' x)
- Data.Manifold.TreeCover: instance (GHC.Show.Show x, GHC.Show.Show (Data.Manifold.PseudoAffine.Needle x), Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x) => GHC.Show.Show (Data.Manifold.TreeCover.Shade x)
- Data.Manifold.TreeCover: instance Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x => Data.Semigroup.Semigroup (Data.Manifold.TreeCover.ShadeTree x)
- Data.Manifold.TreeCover: instance Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x => GHC.Base.Monoid (Data.Manifold.TreeCover.ShadeTree x)
- Data.Manifold.TreeCover: singleFullSimplex :: (KnownNat n, WithField ℝ Manifold x) => ISimplex n x -> FullTriang t n x (SimplexIT t n x)
- Data.Manifold.Types: data Linear s a b
- Data.Manifold.Types: data Stiefel1 v
- Data.Manifold.Types: denseLinear :: (FiniteDimensional v, FiniteDimensional w, Scalar w ~ s) => (v -> w) -> Linear s v w
- Data.Manifold.Types: instance (Data.LinearMap.HerMetric.MetricScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.LinearMap.HerMetric.HasMetric' (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.Manifold.PseudoAffine.WithField k Data.Manifold.PseudoAffine.LinearManifold v, GHC.Real.Real k) => Data.Manifold.PseudoAffine.PseudoAffine (Data.LinearMap.HerMetric.Stiefel1 v)
- Data.Manifold.Types: instance (Data.Manifold.PseudoAffine.WithField k Data.Manifold.PseudoAffine.LinearManifold v, GHC.Real.Real k) => Data.Manifold.PseudoAffine.Semimanifold (Data.LinearMap.HerMetric.Stiefel1 v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.AdditiveGroup.AdditiveGroup (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.AffineSpace.AffineSpace (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.Basis.HasBasis (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.Manifold.PseudoAffine.PseudoAffine (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.Manifold.PseudoAffine.Semimanifold (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.VectorSpace.FiniteDimensional.FiniteDimensional (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance (Data.VectorSpace.FiniteDimensional.SmoothScalar (Data.VectorSpace.Scalar v), Data.VectorSpace.FiniteDimensional.FiniteDimensional v) => Data.VectorSpace.VectorSpace (Data.Manifold.Types.Stiefel1Needle v)
- Data.Manifold.Types: instance Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertSpace x => Data.Manifold.Cone.ConeSemimfd (Data.LinearMap.HerMetric.Stiefel1 x)
- Data.Manifold.Types: instance Data.VectorSpace.FiniteDimensional.FiniteDimensional v => Data.MemoTrie.HasTrie (Data.Manifold.Types.Stiefel1Basis v)
- Data.Manifold.Web: instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData (Data.LinearMap.HerMetric.HerMetric (Data.Manifold.PseudoAffine.Needle x))) => Control.DeepSeq.NFData (Data.Manifold.Web.Neighbourhood x)
- Data.Manifold.Web: instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData (Data.LinearMap.HerMetric.HerMetric (Data.Manifold.PseudoAffine.Needle x)), Control.DeepSeq.NFData (Data.Manifold.PseudoAffine.Needle' x), Control.DeepSeq.NFData y) => Control.DeepSeq.NFData (Data.Manifold.Web.PointsWeb x y)
- Data.SimplicialComplex: disjointSimplex :: (KnownNat n, HaskMonad m) => Simplex n x -> TriangT t n x m (SimplexIT t n x)
- Data.SimplicialComplex: introVertToTriang :: (HaskMonad m, KnownNat n) => x -> [SimplexIT t n x] -> TriangT t (S n) x m (SimplexIT t Z x)
- Data.SimplicialComplex: singleSimplex :: KnownNat n => Simplex n x -> Triangulation n x
- Data.SimplicialComplex: webinateTriang :: (HaskMonad m, KnownNat n) => SimplexIT t Z x -> SimplexIT t n x -> TriangT t (S n) x m (SimplexIT t (S n) x)
+ Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.RealDimension n, Data.Manifold.PseudoAffine.LocallyScalable n a, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle a)) => GHC.Float.Floating (Data.Function.Differentiable.RWDfblFuncValue n a n)
+ Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.RealDimension n, Data.Manifold.PseudoAffine.LocallyScalable n a, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle a)) => GHC.Num.Num (Data.Function.Differentiable.RWDfblFuncValue n a n)
+ Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.RealDimension n, Data.Manifold.PseudoAffine.LocallyScalable n a, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle a)) => GHC.Real.Fractional (Data.Function.Differentiable.RWDfblFuncValue n a n)
+ Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.WithField s Data.Manifold.PseudoAffine.EuclidSpace v, Math.VectorSpace.Docile.SimpleSpace v, v ~ Data.Manifold.PseudoAffine.Needle (Data.Manifold.PseudoAffine.Interior (Data.Manifold.PseudoAffine.Needle v)), Data.Manifold.PseudoAffine.LocallyScalable s a, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle a), Data.Manifold.PseudoAffine.RealDimension s) => Data.AdditiveGroup.AdditiveGroup (Data.Function.Differentiable.RWDfblFuncValue s a v)
+ Data.Function.Differentiable: instance (Data.Manifold.PseudoAffine.WithField s Data.Manifold.PseudoAffine.LinearManifold v, Data.Manifold.PseudoAffine.LocallyScalable s a, Math.VectorSpace.Docile.RealFloat' s) => Data.AdditiveGroup.AdditiveGroup (Data.Function.Differentiable.DfblFuncValue s a v)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Arrow.Constrained.CartesianAgent (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Arrow.Constrained.Morphism (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Arrow.Constrained.PointAgent (Data.Function.Differentiable.DfblFuncValue s) (Data.Function.Differentiable.Data.Differentiable s) a x
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Arrow.Constrained.PreArrow (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Arrow.Constrained.WellPointed (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Category.Constrained.Cartesian (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Category.Constrained.Category (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Function.Differentiable: instance Math.VectorSpace.Docile.RealFrac' s => Control.Category.Constrained.HasAgent (Data.Function.Differentiable.Data.Differentiable s)
+ Data.Manifold.Griddable: instance (Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle m), Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle n), Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle a), Data.Manifold.Griddable.Griddable m a, Data.Manifold.Griddable.Griddable n a) => Data.Manifold.Griddable.Griddable (m, n) a
+ Data.Manifold.PseudoAffine: CanonicalDiffeomorphism :: CanonicalDiffeomorphism a b
+ Data.Manifold.PseudoAffine: SemimanifoldWitness :: SemimanifoldWitness x
+ Data.Manifold.PseudoAffine: coerceMetric :: (LocallyCoercible x ξ, LSpace (Needle ξ)) => RieMetric ξ -> RieMetric x
+ Data.Manifold.PseudoAffine: coerceMetric' :: (LocallyCoercible x ξ, LSpace (Needle ξ)) => RieMetric' ξ -> RieMetric' x
+ Data.Manifold.PseudoAffine: coerceNeedle :: (LocallyCoercible x ξ, Functor p (->) (->)) => p (x, ξ) -> (Needle x -+> Needle ξ)
+ Data.Manifold.PseudoAffine: coerceNeedle' :: (LocallyCoercible x ξ, Functor p (->) (->)) => p (x, ξ) -> (Needle' x -+> Needle' ξ)
+ Data.Manifold.PseudoAffine: data CanonicalDiffeomorphism a b
+ Data.Manifold.PseudoAffine: data SemimanifoldWitness x
+ Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.Semimanifold a, Data.Manifold.PseudoAffine.Semimanifold b, Data.Manifold.PseudoAffine.Semimanifold c, Math.LinearMap.Category.Class.LSpace (Data.Manifold.PseudoAffine.Needle a), Math.LinearMap.Category.Class.LSpace (Data.Manifold.PseudoAffine.Needle b), Math.LinearMap.Category.Class.LSpace (Data.Manifold.PseudoAffine.Needle c), Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle a) ~ Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle b), Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle b) ~ Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle c)) => Data.Manifold.PseudoAffine.LocallyCoercible ((a, b), c) (a, (b, c))
+ Data.Manifold.PseudoAffine: instance (Data.Manifold.PseudoAffine.Semimanifold a, Data.Manifold.PseudoAffine.Semimanifold b, Data.Manifold.PseudoAffine.Semimanifold c, Math.LinearMap.Category.Class.LSpace (Data.Manifold.PseudoAffine.Needle a), Math.LinearMap.Category.Class.LSpace (Data.Manifold.PseudoAffine.Needle b), Math.LinearMap.Category.Class.LSpace (Data.Manifold.PseudoAffine.Needle c), Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle a) ~ Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle b), Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle b) ~ Data.VectorSpace.Scalar (Data.Manifold.PseudoAffine.Needle c)) => Data.Manifold.PseudoAffine.LocallyCoercible (a, (b, c)) ((a, b), c)
+ Data.Manifold.PseudoAffine: instance (Math.LinearMap.Category.Class.LSpace a, Math.LinearMap.Category.Class.LSpace b, Data.VectorSpace.Scalar a ~ s, Data.VectorSpace.Scalar b ~ s) => Data.Manifold.PseudoAffine.PseudoAffine (Math.LinearMap.Category.Class.LinearMap s a b)
+ Data.Manifold.PseudoAffine: instance (Math.LinearMap.Category.Class.LSpace a, Math.LinearMap.Category.Class.LSpace b, Data.VectorSpace.Scalar a ~ s, Data.VectorSpace.Scalar b ~ s) => Data.Manifold.PseudoAffine.Semimanifold (Math.LinearMap.Category.Class.LinearMap s a b)
+ Data.Manifold.PseudoAffine: instance (Math.LinearMap.Category.Class.LSpace a, Math.LinearMap.Category.Class.LSpace b, s ~ Data.VectorSpace.Scalar a, s ~ Data.VectorSpace.Scalar b) => Data.Manifold.PseudoAffine.PseudoAffine (Math.LinearMap.Category.Class.Tensor s a b)
+ Data.Manifold.PseudoAffine: instance (Math.LinearMap.Category.Class.LSpace a, Math.LinearMap.Category.Class.LSpace b, s ~ Data.VectorSpace.Scalar a, s ~ Data.VectorSpace.Scalar b) => Data.Manifold.PseudoAffine.Semimanifold (Math.LinearMap.Category.Class.Tensor s a b)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.ImpliesMetric Math.LinearMap.Category.Norm
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LinearManifold (a n) => Data.Manifold.PseudoAffine.PseudoAffine (Linear.Affine.Point a n)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LinearManifold (a n) => Data.Manifold.PseudoAffine.Semimanifold (Linear.Affine.Point a n)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible ((Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ), (Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ)) (Linear.V4.V4 Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible ((Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ), Data.Manifold.Types.Primitive.ℝ) (Linear.V3.V3 Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Data.Manifold.Types.Primitive.ℝ, (Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ)) (Linear.V3.V3 Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ) (Linear.V2.V2 Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V1.V1 Data.Manifold.Types.Primitive.ℝ) Data.Manifold.Types.Primitive.ℝ
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V2.V2 Data.Manifold.Types.Primitive.ℝ) (Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V3.V3 Data.Manifold.Types.Primitive.ℝ) ((Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ), Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V3.V3 Data.Manifold.Types.Primitive.ℝ) (Data.Manifold.Types.Primitive.ℝ, (Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ))
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V4.V4 Data.Manifold.Types.Primitive.ℝ) ((Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ), (Data.Manifold.Types.Primitive.ℝ, Data.Manifold.Types.Primitive.ℝ))
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.LocallyCoercible Data.Manifold.Types.Primitive.ℝ (Linear.V1.V1 Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V0.V0 s) (Linear.V0.V0 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V0.V0 s) (Math.VectorSpace.ZeroDimensional.ZeroDim s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V1.V1 s) (Linear.V1.V1 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V2.V2 s) (Linear.V2.V2 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V3.V3 s) (Linear.V3.V3 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Linear.V4.V4 s) (Linear.V4.V4 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Math.VectorSpace.ZeroDimensional.ZeroDim s) (Linear.V0.V0 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.LocallyCoercible (Math.VectorSpace.ZeroDimensional.ZeroDim s) (Math.VectorSpace.ZeroDimensional.ZeroDim s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.PseudoAffine (Linear.V1.V1 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.PseudoAffine (Linear.V2.V2 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.PseudoAffine (Linear.V3.V3 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.PseudoAffine (Linear.V4.V4 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.Semimanifold (Linear.V1.V1 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.Semimanifold (Linear.V2.V2 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.Semimanifold (Linear.V3.V3 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.NumberManifold s => Data.Manifold.PseudoAffine.Semimanifold (Linear.V4.V4 s)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.PseudoAffine (Math.VectorSpace.ZeroDimensional.ZeroDim k)
+ Data.Manifold.PseudoAffine: instance Data.Manifold.PseudoAffine.Semimanifold (Math.VectorSpace.ZeroDimensional.ZeroDim k)
+ Data.Manifold.PseudoAffine: instance GHC.Num.Num k => Data.Manifold.PseudoAffine.PseudoAffine (Linear.V0.V0 k)
+ Data.Manifold.PseudoAffine: instance GHC.Num.Num k => Data.Manifold.PseudoAffine.Semimanifold (Linear.V0.V0 k)
+ Data.Manifold.PseudoAffine: interiorLocalCoercion :: (LocallyCoercible x ξ, Functor p (->) (->)) => p (x, ξ) -> CanonicalDiffeomorphism (Interior x) (Interior ξ)
+ Data.Manifold.PseudoAffine: oppositeLocalCoercion :: LocallyCoercible x ξ => CanonicalDiffeomorphism ξ x
+ Data.Manifold.PseudoAffine: semimanifoldWitness :: Semimanifold x => SemimanifoldWitness x
+ Data.Manifold.PseudoAffine: type HilbertManifold x = (LinearManifold x, InnerSpace x, Interior x ~ x, Needle x ~ x, DualVector x ~ x, Floating (Scalar x))
+ Data.Manifold.Riemannian: instance (Data.Manifold.Riemannian.Geodesic v, Data.VectorSpace.Free.FiniteFreeSpace v, Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.HilbertManifold v) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.Types.Stiefel.Stiefel1 v)
+ Data.Manifold.Riemannian: instance Data.Manifold.Riemannian.Geodesic (Math.VectorSpace.ZeroDimensional.ZeroDim Data.Manifold.Types.Primitive.ℝ)
+ Data.Manifold.TreeCover: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.AffineManifold x, Data.Manifold.Riemannian.Geodesic x, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle x)) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.TreeCover.Shade x)
+ Data.Manifold.TreeCover: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.AffineManifold x, Data.Manifold.Riemannian.Geodesic x, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle x)) => Data.Manifold.Riemannian.Geodesic (Data.Manifold.TreeCover.Shade' x)
+ Data.Manifold.TreeCover: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle x)) => Data.Semigroup.Semigroup (Data.Manifold.TreeCover.ShadeTree x)
+ Data.Manifold.TreeCover: instance (Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x, Math.VectorSpace.Docile.SimpleSpace (Data.Manifold.PseudoAffine.Needle x)) => GHC.Base.Monoid (Data.Manifold.TreeCover.ShadeTree x)
+ Data.Manifold.TreeCover: instance (GHC.Show.Show x, GHC.Show.Show (Data.Manifold.PseudoAffine.Metric x), Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x) => GHC.Show.Show (Data.Manifold.TreeCover.Shade' x)
+ Data.Manifold.TreeCover: instance (GHC.Show.Show x, GHC.Show.Show (Data.Manifold.PseudoAffine.Metric' x), Data.Manifold.PseudoAffine.WithField Data.Manifold.Types.Primitive.ℝ Data.Manifold.PseudoAffine.Manifold x) => GHC.Show.Show (Data.Manifold.TreeCover.Shade x)
+ Data.Manifold.TreeCover: instance Data.Manifold.TreeCover.Refinable Data.Manifold.Types.Primitive.ℝ²
+ Data.Manifold.TreeCover: instance Data.Manifold.TreeCover.Refinable Data.Manifold.Types.Primitive.ℝ³
+ Data.Manifold.TreeCover: instance Data.Manifold.TreeCover.Refinable Data.Manifold.Types.Primitive.ℝ¹
+ Data.Manifold.TreeCover: instance Data.Manifold.TreeCover.Refinable Data.Manifold.Types.Primitive.ℝ⁰
+ Data.Manifold.TreeCover: instance Data.Manifold.TreeCover.Refinable Data.Manifold.Types.Primitive.ℝ⁴
+ Data.Manifold.TreeCover: pointsCover's :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> [Shade' x]
+ Data.Manifold.TreeCover: pointsShade's :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> [Shade' x]
+ Data.Manifold.TreeCover: type Twig x = (Int, ShadeTree x)
+ Data.Manifold.TreeCover: type TwigEnviron x = [Twig x]
+ Data.Manifold.Types: Stiefel1 :: DualVector v -> Stiefel1 v
+ Data.Manifold.Types: [getStiefel1N] :: Stiefel1 v -> DualVector v
+ Data.Manifold.Types: data LinearMap s v w :: * -> * -> * -> *
+ Data.Manifold.Types: instance (Data.Manifold.PseudoAffine.WithField k Data.Manifold.PseudoAffine.LinearManifold v, Data.VectorSpace.Free.FiniteFreeSpace v, Data.VectorSpace.Free.FiniteFreeSpace (Math.LinearMap.Category.Class.DualVector v), GHC.Float.RealFloat k, Data.Vector.Unboxed.Base.Unbox k) => Data.Manifold.PseudoAffine.PseudoAffine (Data.Manifold.Types.Stiefel.Stiefel1 v)
+ Data.Manifold.Types: instance (Data.Manifold.PseudoAffine.WithField k Data.Manifold.PseudoAffine.LinearManifold v, Data.VectorSpace.Free.FiniteFreeSpace v, Data.VectorSpace.Free.FiniteFreeSpace (Math.LinearMap.Category.Class.DualVector v), GHC.Float.RealFloat k, Data.Vector.Unboxed.Base.Unbox k) => Data.Manifold.PseudoAffine.Semimanifold (Data.Manifold.Types.Stiefel.Stiefel1 v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.AdditiveGroup.AdditiveGroup (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.AffineSpace.AffineSpace (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.Basis.HasBasis (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.Manifold.PseudoAffine.PseudoAffine (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.Manifold.PseudoAffine.Semimanifold (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.VectorSpace.Free.FiniteFreeSpace (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Data.VectorSpace.VectorSpace (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v)) => Math.LinearMap.Category.Class.TensorSpace (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance (Data.VectorSpace.Free.FiniteFreeSpace v, Data.Vector.Unboxed.Base.Unbox (Data.VectorSpace.Scalar v), Math.LinearMap.Category.Class.Num''' (Data.VectorSpace.Scalar v)) => Math.LinearMap.Category.Class.LinearSpace (Data.Manifold.Types.Stiefel1Needle v)
+ Data.Manifold.Types: instance Data.VectorSpace.Free.FiniteFreeSpace v => Data.MemoTrie.HasTrie (Data.Manifold.Types.Stiefel1Basis v)
+ Data.Manifold.Types: newtype Stiefel1 v
+ Data.Manifold.Types: type ℝ¹ = V1 ℝ
+ Data.Manifold.Types: type ℝ⁴ = V4 ℝ
+ Data.Manifold.Types.Stiefel: Stiefel1 :: DualVector v -> Stiefel1 v
+ Data.Manifold.Types.Stiefel: [getStiefel1N] :: Stiefel1 v -> DualVector v
+ Data.Manifold.Types.Stiefel: newtype Stiefel1 v
+ Data.Manifold.Web: instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData (Data.Manifold.PseudoAffine.Metric x)) => Control.DeepSeq.NFData (Data.Manifold.Web.Neighbourhood x)
+ Data.Manifold.Web: instance (Control.DeepSeq.NFData x, Control.DeepSeq.NFData (Data.Manifold.PseudoAffine.Metric x), Control.DeepSeq.NFData (Data.Manifold.PseudoAffine.Needle' x), Control.DeepSeq.NFData y) => Control.DeepSeq.NFData (Data.Manifold.Web.PointsWeb x y)
- Data.Function.Differentiable: (?->) :: (RealDimension n, LocallyScalable n a, LocallyScalable n b, LocallyScalable n c) => RWDfblFuncValue n c a -> RWDfblFuncValue n c b -> RWDfblFuncValue n c b
+ Data.Function.Differentiable: (?->) :: (RealDimension n, LocallyScalable n a, LocallyScalable n b, LocallyScalable n c, SimpleSpace (Needle b), SimpleSpace (Needle c)) => RWDfblFuncValue n c a -> RWDfblFuncValue n c b -> RWDfblFuncValue n c b
- Data.Function.Differentiable: (?<) :: (RealDimension n, LocallyScalable n a) => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n
+ Data.Function.Differentiable: (?<) :: (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a)) => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n
- Data.Function.Differentiable: (?>) :: (RealDimension n, LocallyScalable n a) => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n
+ Data.Function.Differentiable: (?>) :: (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a)) => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n
- Data.Function.Differentiable: (?|:) :: (RealDimension n, LocallyScalable n a, LocallyScalable n b) => RWDfblFuncValue n a b -> RWDfblFuncValue n a b -> RWDfblFuncValue n a b
+ Data.Function.Differentiable: (?|:) :: (RealDimension n, LocallyScalable n a, LocallyScalable n b, SimpleSpace (Needle a), SimpleSpace (Needle b)) => RWDfblFuncValue n a b -> RWDfblFuncValue n a b -> RWDfblFuncValue n a b
- Data.Function.Differentiable: discretisePathIn :: WithField ℝ Manifold y => Int -> ℝInterval -> (RieMetric ℝ, RieMetric y) -> (Differentiable ℝ ℝ y) -> [(ℝ, y)]
+ Data.Function.Differentiable: discretisePathIn :: (WithField ℝ Manifold y, SimpleSpace (Needle y)) => Int -> ℝInterval -> (RieMetric ℝ, RieMetric y) -> (Differentiable ℝ ℝ y) -> [(ℝ, y)]
- Data.Function.Differentiable: discretisePathSegs :: WithField ℝ Manifold y => Int -> (RieMetric ℝ, RieMetric y) -> RWDiffable ℝ ℝ y -> ([[(ℝ, y)]], [[(ℝ, y)]])
+ Data.Function.Differentiable: discretisePathSegs :: (WithField ℝ Manifold y, SimpleSpace (Needle y)) => Int -> (RieMetric ℝ, RieMetric y) -> RWDiffable ℝ ℝ y -> ([[(ℝ, y)]], [[(ℝ, y)]])
- Data.Manifold.DifferentialEquation: constLinearDEqn :: (WithField ℝ LinearManifold x, WithField ℝ LinearManifold y) => Linear ℝ (DualSpace y) (Linear ℝ y x) -> DifferentialEqn x y
+ Data.Manifold.DifferentialEquation: constLinearDEqn :: (WithField ℝ LinearManifold x, SimpleSpace x, WithField ℝ LinearManifold y, SimpleSpace y) => (DualVector y +> (y +> x)) -> DifferentialEqn x y
- Data.Manifold.DifferentialEquation: euclideanVolGoal :: WithField ℝ EuclidSpace y => ℝ -> x -> Shade' y -> ℝ
+ Data.Manifold.DifferentialEquation: euclideanVolGoal :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y)) => ℝ -> x -> Shade' y -> ℝ
- Data.Manifold.DifferentialEquation: filterDEqnSolution_static :: (WithField ℝ Manifold x, Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> Option (PointsWeb x (Shade' y))
+ Data.Manifold.DifferentialEquation: filterDEqnSolution_static :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> Option (PointsWeb x (Shade' y))
- Data.Manifold.DifferentialEquation: iterateFilterDEqn_static :: (WithField ℝ Manifold x, Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)]
+ Data.Manifold.DifferentialEquation: iterateFilterDEqn_static :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)]
- Data.Manifold.DifferentialEquation: maxDeviationsGoal :: WithField ℝ EuclidSpace y => [Needle y] -> x -> Shade' y -> ℝ
+ Data.Manifold.DifferentialEquation: maxDeviationsGoal :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y)) => [Needle y] -> x -> Shade' y -> ℝ
- Data.Manifold.DifferentialEquation: uncertaintyGoal :: WithField ℝ EuclidSpace y => Metric' y -> x -> Shade' y -> ℝ
+ Data.Manifold.DifferentialEquation: uncertaintyGoal :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y)) => Metric' y -> x -> Shade' y -> ℝ
- Data.Manifold.DifferentialEquation: uncertaintyGoal' :: WithField ℝ EuclidSpace y => (x -> Metric' y) -> x -> Shade' y -> ℝ
+ Data.Manifold.DifferentialEquation: uncertaintyGoal' :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y)) => (x -> Metric' y) -> x -> Shade' y -> ℝ
- Data.Manifold.PseudoAffine: class ImpliesMetric s where type family MetricRequirement s x :: Constraint MetricRequirement s x = Semimanifold x inferMetric = safeRecipMetric <=< inferMetric' inferMetric' = safeRecipMetric' <=< inferMetric
+ Data.Manifold.PseudoAffine: class ImpliesMetric s where type family MetricRequirement s x :: Constraint MetricRequirement s x = Semimanifold x
- Data.Manifold.PseudoAffine: class (AdditiveGroup (Needle x), Interior (Interior x) ~ Interior x) => Semimanifold x where type family Needle x :: * type family Interior x :: * Interior x = x (.+~^) = addvp where addvp :: forall x. Semimanifold x => Interior x -> Needle x -> x addvp p = fromInterior . tp p where (Tagged tp) = translateP :: Tagged x (Interior x -> Needle x -> Interior x) fromInterior p = p .+~^ zeroV p .-~^ v = p .+~^ negateV v
+ Data.Manifold.PseudoAffine: class AdditiveGroup (Needle x) => Semimanifold x where type family Needle x :: * type family Interior x :: * Interior x = x (.+~^) = addvp where addvp :: forall x. Semimanifold x => Interior x -> Needle x -> x addvp p = fromInterior . tp p where (Tagged tp) = translateP :: Tagged x (Interior x -> Needle x -> Interior x) fromInterior p = p .+~^ zeroV p .-~^ v = p .+~^ negateV v semimanifoldWitness = SemimanifoldWitness
- Data.Manifold.PseudoAffine: class (PseudoAffine x, PseudoAffine ξ, Scalar (Needle x) ~ Scalar (Needle ξ)) => LocallyCoercible x ξ
+ Data.Manifold.PseudoAffine: class (Semimanifold x, Semimanifold ξ, LSpace (Needle x), LSpace (Needle ξ), Scalar (Needle x) ~ Scalar (Needle ξ)) => LocallyCoercible x ξ where oppositeLocalCoercion = CanonicalDiffeomorphism interiorLocalCoercion _ = CanonicalDiffeomorphism
- Data.Manifold.PseudoAffine: inferMetric :: (ImpliesMetric s, MetricRequirement s x, HasMetric (Needle x)) => s x -> Option (Metric x)
+ Data.Manifold.PseudoAffine: inferMetric :: (ImpliesMetric s, MetricRequirement s x, LSpace (Needle x)) => s x -> Metric x
- Data.Manifold.PseudoAffine: inferMetric' :: (ImpliesMetric s, MetricRequirement s x, HasMetric (Needle x)) => s x -> Option (Metric' x)
+ Data.Manifold.PseudoAffine: inferMetric' :: (ImpliesMetric s, MetricRequirement s x, LSpace (Needle x)) => s x -> Metric' x
- Data.Manifold.PseudoAffine: type EuclidSpace x = (AffineManifold x, InnerSpace (Diff x), DualSpace (Diff x) ~ Diff x, Floating (Scalar (Diff x)))
+ Data.Manifold.PseudoAffine: type EuclidSpace x = (AffineManifold x, InnerSpace (Diff x), DualVector (Diff x) ~ Diff x, Floating (Scalar (Diff x)))
- Data.Manifold.PseudoAffine: type LinearManifold x = (AffineManifold x, Needle x ~ x, HasMetric x)
+ Data.Manifold.PseudoAffine: type LinearManifold x = (AffineManifold x, Needle x ~ x, LSpace x)
- Data.Manifold.PseudoAffine: type LocalLinear x y = Linear (Scalar (Needle x)) (Needle x) (Needle y)
+ Data.Manifold.PseudoAffine: type LocalLinear x y = LinearMap (Scalar (Needle x)) (Needle x) (Needle y)
- Data.Manifold.PseudoAffine: type LocallyScalable s x = (PseudoAffine x, HasMetric (Needle x), s ~ Scalar (Needle x))
+ Data.Manifold.PseudoAffine: type LocallyScalable s x = (PseudoAffine x, LSpace (Needle x), s ~ Scalar (Needle x), Num''' s)
- Data.Manifold.PseudoAffine: type Metric x = HerMetric (Needle x)
+ Data.Manifold.PseudoAffine: type Metric x = Norm (Needle x)
- Data.Manifold.PseudoAffine: type Metric' x = HerMetric' (Needle x)
+ Data.Manifold.PseudoAffine: type Metric' x = Variance (Needle x)
- Data.Manifold.PseudoAffine: type Needle' x = DualSpace (Needle x)
+ Data.Manifold.PseudoAffine: type Needle' x = DualVector (Needle x)
- Data.Manifold.PseudoAffine: type RealDimension r = (PseudoAffine r, Interior r ~ r, Needle r ~ r, HasMetric r, DualSpace r ~ r, Scalar r ~ r, RealFloat r, r ~ ℝ)
+ Data.Manifold.PseudoAffine: type RealDimension r = (PseudoAffine r, Interior r ~ r, Needle r ~ r, r ~ ℝ)
- Data.Manifold.TreeCover: chainsaw :: WithField ℝ Manifold x => Cutplane x -> ShadeTree x -> Sawbones x
+ Data.Manifold.TreeCover: chainsaw :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => Cutplane x -> ShadeTree x -> Sawbones x
- Data.Manifold.TreeCover: class (WithField ℝ Manifold y) => Refinable y where subShade' (Shade' ac ae) tsh = all ((< 1) . minusLogOcclusion' tsh) [ac .+~^ σ *^ v | σ <- [- 1, 1], v <- eigenCoSpan' ae] refineShade' (Shade' c₀ (HerMetric (Just e₁))) (Shade' c₀₂ (HerMetric (Just e₂))) | Option (Just c₂) <- c₀₂ .-~. c₀, e₁c₂ <- e₁ $ c₂, e₂c₂ <- e₂ $ c₂, cc <- σe <\$ e₂c₂, cc₂ <- cc ^-^ c₂, e₁cc <- e₁ $ cc, e₂cc <- e₂ $ cc, α <- 2 + cc₂ <.>^ e₂c₂, α > 0, ee <- σe ^/ α, c₂e₁c₂ <- c₂ ^<.> e₁c₂, c₂e₂c₂ <- c₂ ^<.> e₂c₂, c₂eec₂ <- (c₂e₁c₂ + c₂e₂c₂) / α, [γ₁, γ₂] <- middle . sort $ quadraticEqnSol c₂e₁c₂ (2 * (c₂ ^<.> e₁cc)) (cc ^<.> e₁cc - 1) ++ quadraticEqnSol c₂e₂c₂ (2 * (c₂ ^<.> e₂cc - c₂e₂c₂)) (cc ^<.> e₂cc - 2 * (cc ^<.> e₂c₂) + c₂e₂c₂ - 1), cc' <- cc ^+^ ((γ₁ + γ₂) / 2) *^ c₂, rγ <- abs (γ₁ - γ₂) / 2, η <- if rγ * c₂eec₂ /= 0 && 1 - rγ ^ 2 * c₂eec₂ > 0 then sqrt (1 - rγ ^ 2 * c₂eec₂) / (rγ * c₂eec₂) else 0 = return $ Shade' (c₀ .+~^ cc') (HerMetric (Just ee) ^+^ projector (ee $ c₂ ^* η)) | otherwise = empty where σe = e₁ ^+^ e₂ quadraticEqnSol a b c | a /= 0 && disc > 0 = [(σ * sqrt disc - b) / (2 * a) | σ <- [- 1, 1]] | otherwise = [0] where disc = b ^ 2 - 4 * a * c middle (_ : x : y : _) = [x, y] middle l = l refineShade' (Shade' _ (HerMetric Nothing)) s₂ = pure s₂ refineShade' s₁ (Shade' _ (HerMetric Nothing)) = pure s₁ convolveShade' (Shade' y₀ ey) (Shade' δ₀ eδ) = Shade' (y₀ .+~^ δ₀) (projectors [f ^* ζ crl | (f, _) <- eδsp | crl <- corelap]) where (_, eδsp) = eigenSystem (ey, eδ) corelap = map (metric ey . snd) eδsp ζ = case filter (> 0) corelap of { [] -> const 0 nzrelap -> let cre₁ = 1 / minimum nzrelap cre₂ = maximum nzrelap edgeFactor = sqrt ((1 + cre₁) ^ 2 + (1 + cre₂) ^ 2) / (sqrt (1 + cre₁ ^ 2) + sqrt (1 + cre₂ ^ 2)) in \case { 0 -> 0 sq -> edgeFactor / (recip sq + 1) } }
+ Data.Manifold.TreeCover: class (WithField ℝ Manifold y, SimpleSpace (Needle y)) => Refinable y where subShade' (Shade' ac ae) tsh = all ((< 1) . minusLogOcclusion' tsh) [ac .+~^ σ *^ v | σ <- [- 1, 1], v <- normSpanningSystem' ae] refineShade' (Shade' c₀ (Norm e₁)) (Shade' c₀₂ (Norm e₂)) | Option (Just c₂) <- c₀₂ .-~. c₀, e₁c₂ <- e₁ $ c₂, e₂c₂ <- e₂ $ c₂, cc <- σe \$ e₂c₂, cc₂ <- cc ^-^ c₂, e₁cc <- e₁ $ cc, e₂cc <- e₂ $ cc, α <- 2 + cc₂ <.>^ e₂c₂, α > 0, ee <- σe ^/ α, c₂e₁c₂ <- c₂ <.>^ e₁c₂, c₂e₂c₂ <- c₂ <.>^ e₂c₂, c₂eec₂ <- (c₂e₁c₂ + c₂e₂c₂) / α, [γ₁, γ₂] <- middle . sort $ quadraticEqnSol c₂e₁c₂ (2 * (c₂ <.>^ e₁cc)) (cc <.>^ e₁cc - 1) ++ quadraticEqnSol c₂e₂c₂ (2 * (c₂ <.>^ e₂cc - c₂e₂c₂)) (cc <.>^ e₂cc - 2 * (cc <.>^ e₂c₂) + c₂e₂c₂ - 1), cc' <- cc ^+^ ((γ₁ + γ₂) / 2) *^ c₂, rγ <- abs (γ₁ - γ₂) / 2, η <- if rγ * c₂eec₂ /= 0 && 1 - rγ ^ 2 * c₂eec₂ > 0 then sqrt (1 - rγ ^ 2 * c₂eec₂) / (rγ * c₂eec₂) else 0 = return $ Shade' (c₀ .+~^ cc') (Norm (arr ee) <> spanNorm [ee $ c₂ ^* η]) | otherwise = empty where σe = arr $ e₁ ^+^ e₂ quadraticEqnSol a b c | a /= 0 && disc > 0 = [(σ * sqrt disc - b) / (2 * a) | σ <- [- 1, 1]] | otherwise = [0] where disc = b ^ 2 - 4 * a * c middle (_ : x : y : _) = [x, y] middle l = l convolveShade' (Shade' y₀ ey) (Shade' δ₀ eδ) = Shade' (y₀ .+~^ δ₀) (spanNorm [f ^* ζ crl | (f, _) <- eδsp | crl <- corelap]) where eδsp = sharedNormSpanningSystem ey eδ corelap = map snd eδsp ζ = case filter (> 0) corelap of { [] -> const 0 nzrelap -> let cre₁ = 1 / minimum nzrelap cre₂ = maximum nzrelap edgeFactor = sqrt ((1 + cre₁) ^ 2 + (1 + cre₂) ^ 2) / (sqrt (1 + cre₁ ^ 2) + sqrt (1 + cre₂ ^ 2)) in \case { 0 -> 0 sq -> edgeFactor / (recip sq + 1) } }
- Data.Manifold.TreeCover: completeTopShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y) => x `Shaded` y -> [Shade' (x, y)]
+ Data.Manifold.TreeCover: completeTopShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y, SimpleSpace (Needle x), SimpleSpace (Needle y)) => x `Shaded` y -> [Shade' (x, y)]
- Data.Manifold.TreeCover: factoriseShade :: (IsShade shade, Manifold x, RealDimension (Scalar (Needle x)), Manifold y, RealDimension (Scalar (Needle y))) => shade (x, y) -> (shade x, shade y)
+ Data.Manifold.TreeCover: factoriseShade :: (IsShade shade, Manifold x, SimpleSpace (Needle x), Manifold y, SimpleSpace (Needle y), Scalar (Needle x) ~ Scalar (Needle y)) => shade (x, y) -> (shade x, shade y)
- Data.Manifold.TreeCover: flexTwigsShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y, Applicative f) => (Shade' (x, y) -> f (x, (Shade' y, LocalLinear x y))) -> x `Shaded` y -> f (x `Shaded` y)
+ Data.Manifold.TreeCover: flexTwigsShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y, SimpleSpace (Needle x), SimpleSpace (Needle y), Applicative f) => (Shade' (x, y) -> f (x, (Shade' y, LocalLinear x y))) -> x `Shaded` y -> f (x `Shaded` y)
- Data.Manifold.TreeCover: fromLeafPoints :: WithField ℝ Manifold x => [x] -> ShadeTree x
+ Data.Manifold.TreeCover: fromLeafPoints :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> ShadeTree x
- Data.Manifold.TreeCover: occlusion :: (IsShade shade, Manifold x, s ~ (Scalar (Needle x)), RealDimension s) => shade x -> x -> s
+ Data.Manifold.TreeCover: occlusion :: (IsShade shade, Manifold x, SimpleSpace (Needle x), s ~ (Scalar (Needle x)), RealDimension s) => shade x -> x -> s
- Data.Manifold.TreeCover: onlyNodes :: WithField ℝ Manifold x => ShadeTree x -> Trees x
+ Data.Manifold.TreeCover: onlyNodes :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ShadeTree x -> Trees x
- Data.Manifold.TreeCover: pointsCovers :: WithField ℝ Manifold x => [x] -> [Shade x]
+ Data.Manifold.TreeCover: pointsCovers :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> [Shade x]
- Data.Manifold.TreeCover: pointsShades :: WithField ℝ Manifold x => [x] -> [Shade x]
+ Data.Manifold.TreeCover: pointsShades :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> [Shade x]
- Data.Manifold.TreeCover: positionIndex :: WithField ℝ Manifold x => Option (Metric x) -> ShadeTree x -> x -> Option (Int, ([ShadeTree x], x))
+ Data.Manifold.TreeCover: positionIndex :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => Option (Metric x) -> ShadeTree x -> x -> Option (Int, ([ShadeTree x], x))
- Data.Manifold.TreeCover: propagateDEqnSolution_loc :: (WithField ℝ Manifold x, Refinable y) => DifferentialEqn x y -> ((x, Shade' y), NonEmpty (Needle x, Shade' y)) -> NonEmpty (Shade' y)
+ Data.Manifold.TreeCover: propagateDEqnSolution_loc :: (WithField ℝ Manifold x, Refinable y, SimpleSpace (Needle x)) => DifferentialEqn x y -> ((x, Shade' y), NonEmpty (Needle x, Shade' y)) -> NonEmpty (Shade' y)
- Data.Manifold.TreeCover: sShSaw :: WithField ℝ Manifold x => ShadeTree x -> ShadeTree x -> Sawboneses x
+ Data.Manifold.TreeCover: sShSaw :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ShadeTree x -> ShadeTree x -> Sawboneses x
- Data.Manifold.TreeCover: shadesMerge :: WithField ℝ Manifold x => ℝ -> [Shade x] -> [Shade x]
+ Data.Manifold.TreeCover: shadesMerge :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ℝ -> [Shade x] -> [Shade x]
- Data.Manifold.TreeCover: smoothInterpolate :: (WithField ℝ Manifold x, WithField ℝ LinearManifold y) => NonEmpty (x, y) -> x -> y
+ Data.Manifold.TreeCover: smoothInterpolate :: (WithField ℝ Manifold x, WithField ℝ LinearManifold y, SimpleSpace (Needle x)) => NonEmpty (x, y) -> x -> y
- Data.Manifold.TreeCover: spanShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y) => (Shade x -> Shade y) -> ShadeTree x -> x `Shaded` y
+ Data.Manifold.TreeCover: spanShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y, SimpleSpace (Needle x), SimpleSpace (Needle y)) => (Shade x -> Shade y) -> ShadeTree x -> x `Shaded` y
- Data.Manifold.TreeCover: stiAsIntervalMapping :: (x ~ ℝ, y ~ ℝ) => x `Shaded` y -> [(x, ((y, Diff y), Linear ℝ x y))]
+ Data.Manifold.TreeCover: stiAsIntervalMapping :: (x ~ ℝ, y ~ ℝ) => x `Shaded` y -> [(x, ((y, Diff y), LinearMap ℝ x y))]
- Data.Manifold.TreeCover: twigsWithEnvirons :: WithField ℝ Manifold x => ShadeTree x -> [((Int, ShadeTree x), [(Int, ShadeTree x)])]
+ Data.Manifold.TreeCover: twigsWithEnvirons :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ShadeTree x -> [(Twig x, TwigEnviron x)]
- Data.Manifold.Types: Origin :: ZeroDim k
+ Data.Manifold.Types: Origin :: ZeroDim s
- Data.Manifold.Types: class (PseudoAffine v, InnerSpace v, NaturallyEmbedded (UnitSphere v) (DualSpace v)) => HasUnitSphere v where type family UnitSphere v :: * stiefel = Stiefel1 . embed unstiefel = coEmbed . getStiefel1N
+ Data.Manifold.Types: class (PseudoAffine v, InnerSpace v, NaturallyEmbedded (UnitSphere v) (DualVector v)) => HasUnitSphere v where type family UnitSphere v :: * stiefel = Stiefel1 . embed unstiefel = coEmbed . getStiefel1N
- Data.Manifold.Types: data ZeroDim k
+ Data.Manifold.Types: data ZeroDim s :: * -> *
- Data.Manifold.Types: fathomCutDistance :: WithField ℝ Manifold x => Cutplane x -> HerMetric' (Needle x) -> x -> Option ℝ
+ Data.Manifold.Types: fathomCutDistance :: WithField ℝ Manifold x => Cutplane x -> Metric' x -> x -> Option ℝ
- Data.Manifold.Types: lineAsPlaneIntersection :: WithField ℝ Manifold x => Line x -> [Cutplane x]
+ Data.Manifold.Types: lineAsPlaneIntersection :: (WithField ℝ Manifold x, FiniteDimensional (Needle' x)) => Line x -> [Cutplane x]
- Data.Manifold.Types: stiefel1Embed :: HilbertSpace v => Stiefel1 v -> v
+ Data.Manifold.Types: stiefel1Embed :: (HilbertSpace v, RealFloat (Scalar v)) => Stiefel1 v -> v
- Data.Manifold.Types: stiefel1Project :: LinearManifold v => DualSpace v -> Stiefel1 v
+ Data.Manifold.Types: stiefel1Project :: LinearManifold v => DualVector v -> Stiefel1 v
- Data.Manifold.Types: type LocalLinear x y = Linear (Scalar (Needle x)) (Needle x) (Needle y)
+ Data.Manifold.Types: type LocalLinear x y = LinearMap (Scalar (Needle x)) (Needle x) (Needle y)
- Data.Manifold.Types: type ℝ² = (ℝ, ℝ)
+ Data.Manifold.Types: type ℝ² = V2 ℝ
- Data.Manifold.Types: type ℝ³ = (ℝ², ℝ)
+ Data.Manifold.Types: type ℝ³ = V3 ℝ
- Data.Manifold.Web: filterDEqnSolution_static :: (WithField ℝ Manifold x, Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> Option (PointsWeb x (Shade' y))
+ Data.Manifold.Web: filterDEqnSolution_static :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> Option (PointsWeb x (Shade' y))
- Data.Manifold.Web: filterDEqnSolutions_adaptive :: (WithField ℝ Manifold x, Refinable y, badness ~ ℝ) => MetricChoice x -> DifferentialEqn x y -> (x -> Shade' y -> badness) -> PointsWeb x (SolverNodeState y) -> Option (PointsWeb x (SolverNodeState y))
+ Data.Manifold.Web: filterDEqnSolutions_adaptive :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y, badness ~ ℝ) => MetricChoice x -> DifferentialEqn x y -> (x -> Shade' y -> badness) -> PointsWeb x (SolverNodeState y) -> Option (PointsWeb x (SolverNodeState y))
- Data.Manifold.Web: fromShadeTree :: WithField ℝ Manifold x => (Shade x -> Metric x) -> ShadeTree x -> PointsWeb x ()
+ Data.Manifold.Web: fromShadeTree :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => (Shade x -> Metric x) -> ShadeTree x -> PointsWeb x ()
- Data.Manifold.Web: fromShadeTree_auto :: WithField ℝ Manifold x => ShadeTree x -> PointsWeb x ()
+ Data.Manifold.Web: fromShadeTree_auto :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ShadeTree x -> PointsWeb x ()
- Data.Manifold.Web: fromShaded :: WithField ℝ Manifold x => (MetricChoice x) -> (x `Shaded` y) -> PointsWeb x y
+ Data.Manifold.Web: fromShaded :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => (MetricChoice x) -> (x `Shaded` y) -> PointsWeb x y
- Data.Manifold.Web: fromWebNodes :: WithField ℝ Manifold x => (MetricChoice x) -> [(x, y)] -> PointsWeb x y
+ Data.Manifold.Web: fromWebNodes :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => (MetricChoice x) -> [(x, y)] -> PointsWeb x y
- Data.Manifold.Web: indexWeb :: WithField ℝ Manifold x => PointsWeb x y -> WebNodeId -> Option (x, y)
+ Data.Manifold.Web: indexWeb :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => PointsWeb x y -> WebNodeId -> Option (x, y)
- Data.Manifold.Web: iterateFilterDEqn_adaptive :: (WithField ℝ Manifold x, Refinable y) => MetricChoice x -> DifferentialEqn x y -> (x -> Shade' y -> ℝ) -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)]
+ Data.Manifold.Web: iterateFilterDEqn_adaptive :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y) => MetricChoice x -> DifferentialEqn x y -> (x -> Shade' y -> ℝ) -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)]
- Data.Manifold.Web: iterateFilterDEqn_static :: (WithField ℝ Manifold x, Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)]
+ Data.Manifold.Web: iterateFilterDEqn_static :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y) => DifferentialEqn x y -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)]
- Data.Manifold.Web: nearestNeighbour :: WithField ℝ Manifold x => PointsWeb x y -> x -> Option (x, y)
+ Data.Manifold.Web: nearestNeighbour :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => PointsWeb x y -> x -> Option (x, y)
- Data.Manifold.Web: sliceWeb_lin :: (WithField ℝ Manifold x, Geodesic x, Geodesic y) => PointsWeb x y -> Cutplane x -> [(x, y)]
+ Data.Manifold.Web: sliceWeb_lin :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Geodesic x, Geodesic y) => PointsWeb x y -> Cutplane x -> [(x, y)]
- Data.Manifold.Web: toGraph :: WithField ℝ Manifold x => PointsWeb x y -> (Graph, Vertex -> (x, y))
+ Data.Manifold.Web: toGraph :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => PointsWeb x y -> (Graph, Vertex -> (x, y))
- Data.Manifold.Web: webEdges :: WithField ℝ Manifold x => PointsWeb x y -> [((x, y), (x, y))]
+ Data.Manifold.Web: webEdges :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => PointsWeb x y -> [((x, y), (x, y))]

Files

Data/Function/Affine.hs view
@@ -40,8 +40,6 @@ import Data.Semigroup  import Data.VectorSpace-import Data.LinearMap-import Data.LinearMap.HerMetric import Data.AffineSpace import Data.Tagged import Data.Manifold.Types.Primitive@@ -56,13 +54,14 @@ import Control.Monad.Constrained import Data.Foldable.Constrained +import Math.LinearMap.Category    data Affine s d c where    Subtract :: AffineManifold α => Affine s (α,α) (Needle α)    AddTo :: Affine s (α, Needle α) α-   ScaleWith :: (LinearManifold α, LinearManifold β) => (α:-*β) -> Affine s α β+   ScaleWith :: (LinearManifold α, LinearManifold β) => (α+>β) -> Affine s α β    ReAffine :: ReWellPointed (Affine s) α β -> Affine s α β  reAffine :: ReWellPointed (Affine s) α β -> Affine s α β@@ -90,23 +89,29 @@  toOffsetSlope :: (MetricScalar s, WithField s LinearManifold d                                  , WithField s AffineManifold c )-                      => Affine s d c -> (c, Needle d :-* Needle c)+                      => Affine s d c -> (c, Needle d +> Needle c) toOffsetSlope f = toOffset'Slope f zeroV +type MetricScalar s = (Num''' s, LSpace (ZeroDim s))++linear :: (LSpace a, LSpace b, Scalar a ~ Scalar b)+             => (a -> b) -> (a+>b)+linear = arr . LinearFunction+ -- | Basically evaluates an affine function as a generic differentiable one, --   yielding at a given reference point the result and Jacobian. Unlike with --   'Data.Function.Differentiable.Differentiable', the induced 1st-order Taylor --   series is equal to the function! toOffset'Slope :: ( MetricScalar s, WithField s AffineManifold d                                    , WithField s AffineManifold c )-                      => Affine s d c -> d -> (c, Needle d :-* Needle c)+                      => Affine s d c -> d -> (c, Needle d +> Needle c) toOffset'Slope Subtract (a,b) = (a.-.b, linear $ uncurry(^-^)) toOffset'Slope AddTo (p,v) = (p.+^v, linear $ uncurry(^+^))-toOffset'Slope (ScaleWith q) ref = (lapply q ref, q)+toOffset'Slope (ScaleWith q) ref = (q $ ref, q) toOffset'Slope Id ref = (ref, linear id) toOffset'Slope (f :>>> g) ref = case toOffset'Slope f ref of                   (cf,sf) -> case toOffset'Slope g cf of-                     (cg,sg)     -> (cg, sg*.*sf)+                     (cg,sg)     -> (cg, sg . sf) toOffset'Slope Swap ref = (swap ref, linear swap) toOffset'Slope AttachUnit ref = ((ref,Origin), linear (,Origin)) toOffset'Slope DetachUnit ref = (fst ref, linear fst)@@ -114,13 +119,13 @@ toOffset'Slope Regroup' ref = (regroup' ref, linear regroup') toOffset'Slope (f:***g) ref = case ( toOffset'Slope f (fst ref)                                  , toOffset'Slope g (snd ref) ) of-                  ((cf, sf), (cg, sg)) -> ((cf,cg), linear $ lapply sf *** lapply sg)+                  ((cf, sf), (cg, sg)) -> ((cf,cg), sf *** sg) toOffset'Slope Terminal ref = (Origin, zeroV) toOffset'Slope Fst ref = (fst ref, linear fst) toOffset'Slope Snd ref = (snd ref, linear snd) toOffset'Slope (f:&&&g) ref = case ( toOffset'Slope (arr f) ref                                   , toOffset'Slope (arr g) ref ) of-                  ((cf, sf), (cg, sg)) -> ((cf,cg), linear $ lapply sf &&& lapply sg)+                  ((cf, sf), (cg, sg)) -> ((cf,cg), sf &&& sg) toOffset'Slope (Const c) ref = (c, zeroV)              coOffsetForm :: ( MetricScalar s, WithField s AffineManifold d@@ -263,7 +268,7 @@   Swap .+^ Swap = Swap >>> ScaleWith (linear (^*2))      f .+^ Id = let (c,q) = toOffset'Slope f zeroV-             in const c&&&ScaleWith (q^+^idL) >>>! AddTo+             in const c&&&ScaleWith (q^+^id) >>>! AddTo   f .+^ AttachUnit = let (c,q) = toOffset'Slope f zeroV                      in postAdd' c $ ScaleWith (q^+^linear(,Origin))   f .+^ DetachUnit = let (c,q) = toOffset'Slope f zeroV@@ -343,9 +348,9 @@      id = ReAffine id   -  ScaleWith ϕ . ScaleWith ψ = ScaleWith $ ϕ*.*ψ+  ScaleWith ϕ . ScaleWith ψ = ScaleWith $ ϕ . ψ   g . ScaleWith ψ = let (d, ϕ) = toOffsetSlope g-                    in postAdd' d $ ScaleWith (ϕ*.*ψ)+                    in postAdd' d $ ScaleWith (ϕ . ψ)   (f:***g) . (h:***i) = f.h *** g.i   (f:***g) . (h:&&&i) = f.h &&& g.i   g . (PostAdd' c f) = let (d, ϕ) = toOffset'Slope g c@@ -392,7 +397,7 @@   linearAffine :: (MetricScalar s, WithField s LinearManifold α, WithField s LinearManifold β)-            => (α:-*β) -> Affine s α β+            => (α+>β) -> Affine s α β linearAffine = ScaleWith  @@ -411,7 +416,7 @@   -instance (WithField s LinearManifold v, WithField s LinearManifold a)+instance (MetricScalar s, WithField s LinearManifold v, WithField s LinearManifold a)     => AdditiveGroup (AffinFuncValue s a v) where   zeroV = GenericAgent zeroV   GenericAgent f ^+^ GenericAgent g = GenericAgent $ f ^+^ g
Data/Function/Differentiable.hs view
@@ -55,9 +55,7 @@ import Data.Embedding  import Data.VectorSpace-import Data.LinearMap-import Data.LinearMap.Category-import Data.LinearMap.HerMetric+import Math.LinearMap.Category import Data.AffineSpace import Data.Function.Differentiable.Data import Data.Function.Affine@@ -78,7 +76,7 @@   -discretisePathIn :: WithField ℝ Manifold y+discretisePathIn :: (WithField ℝ Manifold y, SimpleSpace (Needle y))       => Int                        -- ^ Limit the number of steps taken in either direction. Note this will not cap the resolution but /length/ of the discretised path.       -> ℝInterval                  -- ^ Parameter interval of interest.       -> (RieMetric ℝ, RieMetric y) -- ^ Inaccuracy allowance /ε/.@@ -91,8 +89,8 @@          | signum (x₀-xlim) == signum dir = [(xlim, fxlim)]          | otherwise                      = (x₀, fx₀) : traceFwd xlim (x₀+xstep) dir         where (fx₀, jf, δx²) = f x₀-              εx = my fx₀ `extendMetric` lapply jf (metricAsLength $ mx x₀)-              χ = metric (δx² εx) 1+              εx = my fx₀ `relaxNorm` [jf $ normalLength $ mx x₀]+              χ = δx² εx |$| 1               xstep = dir * min (abs x₀+1) (recip χ)               (fxlim, _, _) = f xlim        xm = (xr + xl) / 2@@ -109,10 +107,10 @@                  = ([], [(-huge,huge)])   | otherwise    = glueMid (go xc (-1)) (go xc 1)  where go x₀ dir-         | yq₀ <= abs (lapply jq₀ 1 * step₀)+         | yq₀ <= abs ((jq₀$1) * step₀)                       = go (x₀ + step₀/2) dir          | RealSubray PositiveHalfSphere xl' <- rangeHere-                      = let stepl' = dir/metric (δbf xl') 2+                      = let stepl' = dir/(δbf xl'|$| 2)                         in if dir>0                             then if definedHere then [(max (xl'+stepl') x₀, huge)]                                                 else []@@ -120,7 +118,7 @@                                   then (xl'+stepl',x₀) : go (xl'-stepl') dir                                   else go (xl'-stepl') dir          | RealSubray NegativeHalfSphere xr' <- rangeHere-                      = let stepr' = dir/metric (δbf xr') 2+                      = let stepr' = dir/(δbf xr'|$| 2)                         in if dir<0                             then if definedHere then [(-huge, min (xr'-stepr') x₀)]                                                 else []@@ -131,7 +129,7 @@         where (rangeHere, fq₀) = f x₀               (PreRegion (Differentiable r₀)) = genericisePreRegion rangeHere               (yq₀, jq₀, δyq₀) = r₀ x₀-              step₀ = dir/metric (δbf x₀) 1+              step₀ = dir/(δbf x₀|$| 1)               exit 0 _ xq                 | not definedHere  = []                 | xq < xc          = [(xq,x₀)]@@ -150,10 +148,10 @@                      xq₂ = xq₁ + stepp                      yq₁ = yq + f'x*stepp                      yq₂ = yq₁ + f'x*stepp-                     f'x = lapply jq 1+                     f'x = jq $ 1                      stepp | f'x*dir < 0  = -0.9 * abs dir' * yq/f'x                            | otherwise    = dir' * as_devεδ δyq yq -- TODO: memoise in `exit` recursion-                     resoHere = metricSq $ δbf xq+                     resoHere = normSq $ δbf xq                      resoStep = dir/sqrt(resoHere 1)               definedHere = case fq₀ of                               Option (Just _) -> True@@ -163,7 +161,7 @@        huge = exp $ fromIntegral nLim        xc = 0 -discretisePathSegs :: WithField ℝ Manifold y+discretisePathSegs :: (WithField ℝ Manifold y, SimpleSpace (Needle y))       => Int              -- ^ Maximum number of path segments and/or points per segment.       -> ( RieMetric ℝ          , RieMetric y )  -- ^ Inaccuracy allowance /δ/ for arguments@@ -195,11 +193,11 @@            | inRegion r x₀ -> return $               let (fx, j, δf) = fd x₀                   epsprop ε-                    | ε>0  = case metric (δf $ metricFromLength ε) 1 of+                    | ε>0  = case (δf $ spanNorm [recip ε])|$| 1 of                                0  -> empty                                δ' -> return $ recip δ'                     | otherwise  = pure 0-              in ((fx, lapply j 1), epsprop)+              in ((fx, j $ 1), epsprop)        _ -> empty  where                                    -- This check shouldn't really be necessary,                                           -- because the initial value lies by definition@@ -242,10 +240,10 @@                  | y > b-resoHere  = go (x + dir/χ) dir (a,y)                  | otherwise       = go (x + safeStep stepOut₀) dir (a,b)                where (y, j, δε) = fddd x-                     y' = lapply j 1+                     y' = j $ 1                      εx = my y-                     resoHere = metricAsLength εx-                     χ = metric (δε εx) 1+                     resoHere = normalLength εx+                     χ = δε εx|$| 1                      safeStep s₀                          | as_devεδ δε (safetyMarg s₀) > abs s₀  = s₀                          | otherwise                             = safeStep (s₀*0.5)@@ -267,29 +265,29 @@ unsafe_dev_ε_δ :: RealDimension a                 => String -> (a -> a) -> LinDevPropag a a unsafe_dev_ε_δ errHint f d-            = let ε'² = metricSq d 1+            = let ε'² = normSq d 1               in if ε'²>0                   then let δ = f . sqrt $ recip ε'²                        in if δ > 0-                           then projector $ recip δ+                           then spanNorm [recip δ]                            else error $ "ε-δ propagator function for "                                     ++errHint++", with ε="                                     ++show(sqrt $ recip ε'²)                                     ++ " gives non-positive δ="++show δ++"."-                  else zeroV+                  else mempty dev_ε_δ :: RealDimension a          => (a -> a) -> Metric a -> Option (Metric a)-dev_ε_δ f d = let ε'² = metricSq d 1+dev_ε_δ f d = let ε'² = normSq d 1               in if ε'²>0                   then let δ = f . sqrt $ recip ε'²                        in if δ > 0-                           then pure . projector $ recip δ+                           then pure (spanNorm [recip δ])                            else empty-                  else pure zeroV+                  else pure mempty  as_devεδ :: RealDimension a => LinDevPropag a a -> a -> a as_devεδ ldp ε | ε>0-               , δ'² <- metricSq (ldp . projector $ recip ε) 1+               , δ'² <- normSq (ldp $ spanNorm [recip ε]) 1                , δ'² > 0                     = sqrt $ recip δ'²                | otherwise  = 0@@ -299,22 +297,20 @@                     => Differentiable s d c -> Differentiable s d c genericiseDifferentiable (AffinDiffable _ af)      = Differentiable $ \x -> let (y₀, ϕ) = toOffset'Slope af x-                              in (y₀, ϕ, const zeroV)+                              in (y₀, ϕ, const mempty) genericiseDifferentiable f = f  -instance (MetricScalar s) => Category (Differentiable s) where+instance RealFrac' s => Category (Differentiable s) where   type Object (Differentiable s) o = LocallyScalable s o-  id = Differentiable $ \x -> (x, idL, const zeroV)+  id = Differentiable $ \x -> (x, id, const mempty)   Differentiable f . Differentiable g = Differentiable $      \x -> let (y, g', devg) = g x-               jg = convertLinear $->$ g'                (z, f', devf) = f y-               jf = convertLinear $->$ f'-               devfg δz = let δy = transformMetric jf δz+               devfg δz = let δy = transformNorm f' δz                               εy = devf δz-                          in transformMetric jg εy ^+^ devg δy ^+^ devg εy-           in (z, f'*.*g', devfg)+                          in transformNorm g' εy <> devg δy <> devg εy+           in (z, f' . g', devfg)   AffinDiffable ef f . AffinDiffable eg g = AffinDiffable (ef . eg) (f . g)   f . g = genericiseDifferentiable f . genericiseDifferentiable g @@ -326,89 +322,80 @@   arr (Differentiable f) x = let (y,_,_) = f x in y   arr (AffinDiffable _ f) x = f $ x -instance (MetricScalar s) => Cartesian (Differentiable s) where+instance (RealFrac' s) => Cartesian (Differentiable s) where   type UnitObject (Differentiable s) = ZeroDim s-  swap = Differentiable $ \(x,y) -> ((y,x), lSwap, const zeroV)-   where lSwap = linear swap-  attachUnit = Differentiable $ \x -> ((x, Origin), lAttachUnit, const zeroV)-   where lAttachUnit = linear $ \x ->  (x, Origin)-  detachUnit = Differentiable $ \(x, Origin) -> (x, lDetachUnit, const zeroV)-   where lDetachUnit = linear $ \(x, Origin) ->  x-  regroup = Differentiable $ \(x,(y,z)) -> (((x,y),z), lRegroup, const zeroV)-   where lRegroup = linear regroup-  regroup' = Differentiable $ \((x,y),z) -> ((x,(y,z)), lRegroup, const zeroV)-   where lRegroup = linear regroup'+  swap = Differentiable $ \(x,y) -> ((y,x), swap, const mempty)+  attachUnit = Differentiable $ \x -> ((x, Origin), attachUnit, const mempty)+  detachUnit = Differentiable $ \(x, Origin) -> (x, detachUnit, const mempty)+  regroup = Differentiable $ \(x,(y,z)) -> (((x,y),z), regroup, const mempty)+  regroup' = Differentiable $ \((x,y),z) -> ((x,(y,z)), regroup', const mempty)  -instance (MetricScalar s) => Morphism (Differentiable s) where+instance (RealFrac' s) => Morphism (Differentiable s) where   Differentiable f *** Differentiable g = Differentiable h-   where h (x,y) = ((fx, gy), lPar, devfg)+   where h (x,y) = ((fx, gy), f'***g', devfg)           where (fx, f', devf) = f x                 (gy, g', devg) = g y-                devfg δs = transformMetric fst δx -                           ^+^ transformMetric snd δy-                  where δx = devf $ transformMetric (id&&&zeroV) δs-                        δy = devg $ transformMetric (zeroV&&&id) δs-                lPar = linear $ lapply f'***lapply g'+                devfg δs = transformNorm fst δx +                           <> transformNorm snd δy+                  where δx = devf $ transformNorm (id&&&zeroV) δs+                        δy = devg $ transformNorm (zeroV&&&id) δs   AffinDiffable IsDiffableEndo f *** AffinDiffable IsDiffableEndo g          = AffinDiffable IsDiffableEndo $ f *** g   AffinDiffable _ f *** AffinDiffable _ g = AffinDiffable NotDiffableEndo $ f *** g   f *** g = genericiseDifferentiable f *** genericiseDifferentiable g  -instance (MetricScalar s) => PreArrow (Differentiable s) where-  terminal = Differentiable $ \_ -> (Origin, zeroV, const zeroV)-  fst = Differentiable $ \(x,_) -> (x, lfst, const zeroV)-   where lfst = linear fst-  snd = Differentiable $ \(_,y) -> (y, lsnd, const zeroV)-   where lsnd = linear snd+instance (RealFrac' s) => PreArrow (Differentiable s) where+  terminal = Differentiable $ \_ -> (Origin, zeroV, const mempty)+  fst = Differentiable $ \(x,_) -> (x, fst, const mempty)+  snd = Differentiable $ \(_,y) -> (y, snd, const mempty)   Differentiable f &&& Differentiable g = Differentiable h-   where h x = ((fx, gx), lFanout, devfg)+   where h x = ((fx, gx), f'&&&g', devfg)           where (fx, f', devf) = f x                 (gx, g', devg) = g x-                devfg δs = (devf $ transformMetric (id&&&zeroV) δs)-                           ^+^ (devg $ transformMetric (zeroV&&&id) δs)-                lFanout = linear $ lapply f'&&&lapply g'+                devfg δs = (devf $ transformNorm (id&&&zeroV) δs)+                           <> (devg $ transformNorm (zeroV&&&id) δs)   f &&& g = genericiseDifferentiable f &&& genericiseDifferentiable g  -instance (MetricScalar s) => WellPointed (Differentiable s) where+instance (RealFrac' s) => WellPointed (Differentiable s) where   unit = Tagged Origin-  globalElement x = Differentiable $ \Origin -> (x, zeroV, const zeroV)-  const x = Differentiable $ \_ -> (x, zeroV, const zeroV)+  globalElement x = Differentiable $ \Origin -> (x, zeroV, const mempty)+  const x = Differentiable $ \_ -> (x, zeroV, const mempty)    type DfblFuncValue s = GenericAgent (Differentiable s) -instance (MetricScalar s) => HasAgent (Differentiable s) where+instance (RealFrac' s) => HasAgent (Differentiable s) where   alg = genericAlg   ($~) = genericAgentMap-instance (MetricScalar s) => CartesianAgent (Differentiable s) where+instance (RealFrac' s) => CartesianAgent (Differentiable s) where   alg1to2 = genericAlg1to2   alg2to1 = genericAlg2to1   alg2to2 = genericAlg2to2-instance (MetricScalar s)+instance (RealFrac' s)       => PointAgent (DfblFuncValue s) (Differentiable s) a x where   point = genericPoint    actuallyLinearEndo :: WithField s LinearManifold x-            => (x:-*x) -> Differentiable s x x+            => (x+>x) -> Differentiable s x x actuallyLinearEndo = AffinDiffable IsDiffableEndo . linearAffine  actuallyAffineEndo :: WithField s LinearManifold x-            => x -> (x:-*x) -> Differentiable s x x+            => x -> (x+>x) -> Differentiable s x x actuallyAffineEndo y₀ f = AffinDiffable IsDiffableEndo $ const y₀ .+^ linearAffine f  actuallyLinear :: ( WithField s LinearManifold x, WithField s LinearManifold y )-            => (x:-*y) -> Differentiable s x y+            => (x+>y) -> Differentiable s x y actuallyLinear = AffinDiffable NotDiffableEndo . linearAffine  actuallyAffine :: ( WithField s LinearManifold x                   , WithField s AffineManifold y )-            => y -> (x:-*Diff y) -> Differentiable s x y+            => y -> (x+>Diff y) -> Differentiable s x y actuallyAffine y₀ f = AffinDiffable NotDiffableEndo $ const y₀ .+^ linearAffine f  @@ -419,35 +406,34 @@  dfblFnValsFunc :: ( LocallyScalable s c, LocallyScalable s c', LocallyScalable s d                   , v ~ Needle c, v' ~ Needle c'-                  , ε ~ HerMetric v, ε ~ HerMetric v' )-             => (c' -> (c, v':-*v, ε->ε)) -> DfblFuncValue s d c' -> DfblFuncValue s d c+                  , ε ~ Norm v, ε ~ Norm v'+                  , RealFrac' s )+             => (c' -> (c, v'+>v, ε->ε)) -> DfblFuncValue s d c' -> DfblFuncValue s d c dfblFnValsFunc f = (Differentiable f $~)  dfblFnValsCombine :: forall d c c' c'' v v' v'' ε ε' ε'' s.           ( LocallyScalable s c,  LocallyScalable s c',  LocallyScalable s c''          ,  LocallyScalable s d          , v ~ Needle c, v' ~ Needle c', v'' ~ Needle c''-         , ε ~ HerMetric v  , ε' ~ HerMetric v'  , ε'' ~ HerMetric v'', ε~ε', ε~ε''  )-       => (  c' -> c'' -> (c, (v',v''):-*v, ε -> (ε',ε''))  )+         , ε ~ Norm v  , ε' ~ Norm v'  , ε'' ~ Norm v'', ε~ε', ε~ε'' +         , RealFrac' s )+       => (  c' -> c'' -> (c, (v',v'')+>v, ε -> (ε',ε''))  )          -> DfblFuncValue s d c' -> DfblFuncValue s d c'' -> DfblFuncValue s d c dfblFnValsCombine cmb (GenericAgent (Differentiable f))                       (GenericAgent (Differentiable g))      = GenericAgent . Differentiable $-        \d -> let (c', f', devf) = f d-                  jf = convertLinear$->$f'-                  (c'', g', devg) = g d-                  jg = convertLinear$->$g'-                  (c, h', devh) = cmb c' c''-                  jh = convertLinear$->$h'+        \d -> let (c', jf, devf) = f d+                  (c'', jg, devg) = g d+                  (c, jh, devh) = cmb c' c''                   jhl = jh . (id&&&zeroV); jhr = jh . (zeroV&&&id)               in ( c-                 , h' *.* linear (lapply f' &&& lapply g')-                 , \εc -> let εc' = transformMetric jhl εc-                              εc'' = transformMetric jhr εc+                 , jh <<< jf&&&jg+                 , \εc -> let εc' = transformNorm jhl εc+                              εc'' = transformNorm jhr εc                               (δc',δc'') = devh εc -                          in devf εc' ^+^ devg εc''-                               ^+^ transformMetric jf δc'-                               ^+^ transformMetric jg δc''+                          in devf εc' <> devg εc''+                               <> transformNorm jf δc'+                               <> transformNorm jg δc''                  ) dfblFnValsCombine cmb (GenericAgent fa) (GenericAgent ga)           = dfblFnValsCombine cmb (GenericAgent $ genericiseDifferentiable fa)@@ -457,17 +443,15 @@   -instance (WithField s LinearManifold v, LocallyScalable s a, Floating s)+instance (WithField s LinearManifold v, LocallyScalable s a, RealFloat' s)     => AdditiveGroup (DfblFuncValue s a v) where   zeroV = point zeroV   GenericAgent (AffinDiffable ef f) ^+^ GenericAgent (AffinDiffable eg g)          = GenericAgent $ AffinDiffable (ef<>eg) (f^+^g)-  α^+^β = dfblFnValsCombine (\a b -> (a^+^b, lPlus, const zeroV)) α β-      where lPlus = linear $ uncurry (^+^)+  α^+^β = dfblFnValsCombine (\a b -> (a^+^b, arr addV, const mempty)) α β   negateV (GenericAgent (AffinDiffable ef f))          = GenericAgent $ AffinDiffable ef (negateV f)-  negateV α = dfblFnValsFunc (\a -> (negateV a, lNegate, const zeroV)) α-      where lNegate = linear negateV+  negateV α = dfblFnValsFunc (\a -> (negateV a, negateV id, const mempty)) α    instance (RealDimension n, LocallyScalable n a)             => Num (DfblFuncValue n a n) where@@ -475,8 +459,9 @@   (+) = (^+^)   (*) = dfblFnValsCombine $           \a b -> ( a*b-                  , linear $ \(da,db) -> a*db + b*da-                  , \d -> let d¹₂ = sqrt d in (d¹₂,d¹₂)+                  , arr $ addV <<< (scale $ a)***(scale $ b)+                  , unsafe_dev_ε_δ(show a++"*"++show b) sqrt+                       >>> \d¹₂ -> (d¹₂,d¹₂)                            -- ε δa δb = (a+δa)·(b+δb) - (a·b + (a·δa + b·δb))                             --         = δa·δb                            --   so choose δa = δb = √ε@@ -484,14 +469,14 @@   negate = negateV   abs = dfblFnValsFunc dfblAbs    where dfblAbs a-          | a>0        = (a, idL, unsafe_dev_ε_δ("abs "++show a) $ \ε -> a + ε/2) -          | a<0        = (-a, negateV idL, unsafe_dev_ε_δ("abs "++show a) $ \ε -> ε/2 - a)-          | otherwise  = (0, zeroV, (^/ sqrt 2))+          | a>0        = (a, id, unsafe_dev_ε_δ("abs "++show a) $ \ε -> a + ε/2) +          | a<0        = (-a, negateV id, unsafe_dev_ε_δ("abs "++show a) $ \ε -> ε/2 - a)+          | otherwise  = (0, zeroV, scaleNorm (sqrt 0.5))   signum = dfblFnValsFunc dfblSgn    where dfblSgn a           | a>0        = (1, zeroV, unsafe_dev_ε_δ("signum "++show a) $ const a)           | a<0        = (-1, zeroV, unsafe_dev_ε_δ("signum "++show a) $ \_ -> -a)-          | otherwise  = (0, zeroV, const $ projector 1)+          | otherwise  = (0, zeroV, const $ spanNorm [1])   @@ -513,19 +498,19 @@ minDblfuncs (Differentiable f) (Differentiable g) = Differentiable h  where h x          | fx < gx   = ( fx, jf-                       , \d -> devf d ^+^ devg d-                               ^+^ transformMetric δj-                                      (projector . recip $ recip(metric d 1) + gx - fx) )+                       , \d -> devf d <> devg d+                               <> transformNorm δj+                                      (spanNorm [recip $ recip(d|$|1) + gx - fx]) )          | fx > gx   = ( gx, jg-                       , \d -> devf d ^+^ devg d-                               ^+^ transformMetric δj-                                      (projector . recip $ recip(metric d 1) + fx - gx) )+                       , \d -> devf d <> devg d+                               <> transformNorm δj+                                      (spanNorm [recip $ recip(d|$|1) + fx - gx]) )          | otherwise = ( fx, (jf^+^jg)^/2-                      , \d -> devf d ^+^ devg d-                               ^+^ transformMetric δj d )+                       , \d -> devf d <> devg d+                               <> transformNorm δj d )         where (fx, jf, devf) = f x               (gx, jg, devg) = g x-              δj = convertLinear $->$ jf ^-^ jg+              δj = jf ^-^ jg   postEndo :: ∀ c a b . (HasAgent c, Object c a, Object c b)@@ -580,7 +565,7 @@ positivePreRegion', negativePreRegion' :: (RealDimension s) => PreRegion s s positivePreRegion' = PreRegion $ Differentiable prr  where prr x = ( 1 - 1/xp1-               , (1/xp1²) *^ idL+               , (1/xp1²) *^ id                , unsafe_dev_ε_δ("positivePreRegion@"++show x) δ )                  -- ε = (1 − 1/(1+x)) + (-δ · 1/(x+1)²) − (1 − 1/(1+x−δ))                  --   = 1/(1+x−δ) − 1/(1+x) − δ · 1/(x+1)²@@ -618,7 +603,7 @@               xp1² = xp1 ^ 2 negativePreRegion' = PreRegion $ ppr . ngt  where PreRegion ppr = positivePreRegion'-       ngt = actuallyLinearEndo $ linear negate+       ngt = actuallyLinearEndo $ negateV id  preRegionToInfFrom, preRegionFromMinInfTo :: RealDimension s => s -> PreRegion s s preRegionToInfFrom = RealSubray PositiveHalfSphere@@ -627,16 +612,16 @@ preRegionToInfFrom', preRegionFromMinInfTo' :: RealDimension s => s -> PreRegion s s preRegionToInfFrom' xs = PreRegion $ ppr . trl  where PreRegion ppr = positivePreRegion'-       trl = actuallyAffineEndo (-xs) idL+       trl = actuallyAffineEndo (-xs) id preRegionFromMinInfTo' xe = PreRegion $ ppr . flp  where PreRegion ppr = positivePreRegion'-       flp = actuallyAffineEndo xe (linear negate)+       flp = actuallyAffineEndo xe (negateV id)  intervalPreRegion :: RealDimension s => (s,s) -> PreRegion s s intervalPreRegion (lb,rb) = PreRegion $ Differentiable prr  where m = lb + radius; radius = (rb - lb)/2        prr x = ( 1 - ((x-m)/radius)^2-               , (2*(m-x)/radius^2) *^ idL+               , (2*(m-x)/radius^2) *^ id                , unsafe_dev_ε_δ("intervalPreRegion@"++show x) $ (*radius) . sqrt )  @@ -650,7 +635,7 @@   instance (RealDimension s) => Category (RWDiffable s) where-  type Object (RWDiffable s) o = LocallyScalable s o+  type Object (RWDiffable s) o = (LocallyScalable s o, SimpleSpace (Needle o))   id = RWDiffable $ \x -> (GlobalRegion, pure id)   RWDiffable f . RWDiffable g = RWDiffable h where    h x₀ = case g x₀ of@@ -663,7 +648,7 @@                          -> (rg, fmap (. gr') fhr)                    (RealSubray diry yl, fhr)                       -> let hhr = fmap (. gr') fhr-                         in case lapply ϕg 1 of+                         in case ϕg $ 1 of                               y' | y'>0 -> ( unsafePreRegionIntersect rg                                                   $ RealSubray diry (x₀ + (yl-y₀)/y')                                    -- y'⋅(xl−x₀) + y₀ ≝ yl@@ -767,7 +752,9 @@   RWDFV_IdVar :: RWDfblFuncValue s c c   GenericRWDFV :: RWDiffable s d c -> RWDfblFuncValue s d c -genericiseRWDFV :: (RealDimension s, LocallyScalable s c, LocallyScalable s d)+genericiseRWDFV :: ( RealDimension s+                   , LocallyScalable s c, SimpleSpace (Needle c)+                   , LocallyScalable s d, SimpleSpace (Needle d) )                     => RWDfblFuncValue s d c -> RWDfblFuncValue s d c genericiseRWDFV (ConstRWDFV c) = GenericRWDFV $ const c genericiseRWDFV RWDFV_IdVar = GenericRWDFV id@@ -795,16 +782,18 @@      :: ( RealDimension s         , LocallyScalable s c, LocallyScalable s c', LocallyScalable s d         , v ~ Needle c, v' ~ Needle c'-        , ε ~ HerMetric v, ε ~ HerMetric v' )-             => (c' -> (c, v':-*v, ε->ε)) -> RWDfblFuncValue s d c' -> RWDfblFuncValue s d c+        , SimpleSpace v, SimpleSpace (Needle d)+        , ε ~ Norm v, ε ~ Norm v' )+             => (c' -> (c, v'+>v, ε->ε)) -> RWDfblFuncValue s d c' -> RWDfblFuncValue s d c grwDfblFnValsFunc f = (RWDiffable (\_ -> (GlobalRegion, pure (Differentiable f))) $~)  grwDfblFnValsCombine :: forall d c c' c'' v v' v'' ε ε' ε'' s.           ( LocallyScalable s c,  LocallyScalable s c',  LocallyScalable s c''          , LocallyScalable s d, RealDimension s          , v ~ Needle c, v' ~ Needle c', v'' ~ Needle c''-         , ε ~ HerMetric v  , ε' ~ HerMetric v'  , ε'' ~ HerMetric v'', ε~ε', ε~ε''  )-       => (  c' -> c'' -> (c, (v',v''):-*v, ε -> (ε',ε''))  )+         , SimpleSpace v, SimpleSpace (Needle d)+         , ε ~ Norm v  , ε' ~ Norm v'  , ε'' ~ Norm v'', ε~ε', ε~ε''  )+       => (  c' -> c'' -> (c, (v',v'')+>v, ε -> (ε',ε''))  )          -> RWDfblFuncValue s d c' -> RWDfblFuncValue s d c'' -> RWDfblFuncValue s d c grwDfblFnValsCombine cmb (GenericRWDFV (RWDiffable fpcs))                          (GenericRWDFV (RWDiffable gpcs)) @@ -815,21 +804,18 @@                     case (genericiseDifferentiable<$>fmay, genericiseDifferentiable<$>gmay) of                       (Option(Just(Differentiable f)), Option(Just(Differentiable g))) ->                         pure . Differentiable $ \d-                         -> let (c', f', devf) = f d-                                jf = convertLinear $->$ f'-                                (c'',g', devg) = g d-                                jg = convertLinear $->$ g'-                                (c, h', devh) = cmb c' c''-                                jh = convertLinear $->$ h'+                         -> let (c', jf, devf) = f d+                                (c'',jg, devg) = g d+                                (c, jh, devh) = cmb c' c''                                 jhl = jh . (id&&&zeroV); jhr = jh . (zeroV&&&id)                             in ( c-                               , h' *.* linear (lapply f' &&& lapply g')-                               , \εc -> let εc' = transformMetric jhl εc-                                            εc'' = transformMetric jhr εc+                               , jh <<< jf&&&jg+                               , \εc -> let εc' = transformNorm jhl εc+                                            εc'' = transformNorm jhr εc                                             (δc',δc'') = devh εc -                                        in devf εc' ^+^ devg εc''-                                             ^+^ transformMetric jf δc'-                                             ^+^ transformMetric jg δc''+                                        in devf εc' <> devg εc''+                                             <> transformNorm jf δc'+                                             <> transformNorm jg δc''                                )                       _ -> notDefinedHere grwDfblFnValsCombine cmb fv gv@@ -847,7 +833,8 @@                 rh = unsafePreRegionIntersect rf rg                 fgplus :: Differentiable s a v -> Differentiable s a v -> Differentiable s a v                 fgplus (Differentiable fd) (Differentiable gd) = Differentiable hd-                 where hd x = (fx^+^gx, jf^+^jg, \ε -> δf(ε^*4) ^+^ δg(ε^*4))+                 where hd x = (fx^+^gx, jf^+^jg, \ε -> δf(scaleNorm 2 ε)+                                                     <> δg(scaleNorm 2 ε))                         where (fx, jf, δf) = fd x                               (gx, jg, δg) = gd x                 fgplus (Differentiable fd) (AffinDiffable _ ga)@@ -877,7 +864,8 @@                 fneg (AffinDiffable ef af) = AffinDiffable ef $ negateV af  postCompRW :: ( RealDimension s-              , LocallyScalable s a, LocallyScalable s b, LocallyScalable s c )+              , LocallyScalable s a, LocallyScalable s b, LocallyScalable s c+              , SimpleSpace (Needle a), SimpleSpace (Needle b), SimpleSpace (Needle c) )               => RWDiffable s b c -> RWDfblFuncValue s a b -> RWDfblFuncValue s a c postCompRW (RWDiffable f) (ConstRWDFV x) = case f x of      (_, Option (Just fd)) -> ConstRWDFV $ fd $ x@@ -885,40 +873,53 @@ postCompRW f (GenericRWDFV g) = GenericRWDFV $ f . g  -instance ( WithField s EuclidSpace v, AdditiveGroup v, v ~ Needle (Interior (Needle v))-         , LocallyScalable s a, RealDimension s)+instance ( WithField s EuclidSpace v, SimpleSpace v, v ~ Needle (Interior (Needle v))+         , LocallyScalable s a, SimpleSpace (Needle a), RealDimension s)     => AdditiveGroup (RWDfblFuncValue s a v) where   zeroV = point zeroV   ConstRWDFV c₁ ^+^ ConstRWDFV c₂ = ConstRWDFV (c₁^+^c₂)   ConstRWDFV c₁ ^+^ RWDFV_IdVar = GenericRWDFV $-                               globalDiffable' (actuallyAffineEndo c₁ idL)+                               globalDiffable' (actuallyAffineEndo c₁ id)   RWDFV_IdVar ^+^ ConstRWDFV c₂ = GenericRWDFV $-                               globalDiffable' (actuallyAffineEndo c₂ idL)+                               globalDiffable' (actuallyAffineEndo c₂ id)   ConstRWDFV c₁ ^+^ GenericRWDFV g = GenericRWDFV $-                               globalDiffable' (actuallyAffineEndo c₁ idL) . g+                               globalDiffable' (actuallyAffineEndo c₁ id) . g   GenericRWDFV f ^+^ ConstRWDFV c₂ = GenericRWDFV $-                                  globalDiffable' (actuallyAffineEndo c₂ idL) . f+                                  globalDiffable' (actuallyAffineEndo c₂ id) . f   fa^+^ga | GenericRWDFV f <- genericiseRWDFV fa           , GenericRWDFV g <- genericiseRWDFV ga = GenericRWDFV $ rwDfbl_plus f g   negateV (ConstRWDFV c) = ConstRWDFV (negateV c)-  negateV RWDFV_IdVar = GenericRWDFV $ globalDiffable' (actuallyLinearEndo $ linear negateV)+  negateV RWDFV_IdVar = GenericRWDFV $ globalDiffable' (actuallyLinearEndo $ negateV id)   negateV (GenericRWDFV f) = GenericRWDFV $ rwDfbl_negateV f -instance (RealDimension n, LocallyScalable n a)+dualCoCoProduct :: ∀ v w s .+                   ( SimpleSpace v, HilbertSpace v+                   , SimpleSpace w, Scalar v ~ s, Scalar w ~ s )+           => LinearMap s w v -> LinearMap s w v -> Norm w+dualCoCoProduct s t = Norm $ (tSpread*sSpread) *^ t²Ps²M+ where t' = adjoint $ t :: LinearMap s v (DualVector w)+       s' = adjoint $ s :: LinearMap s v (DualVector w)+       tSpread = sum . map recip_t²PLUSs² $ snd (decomposeLinMap t') []+       sSpread = sum . map recip_t²PLUSs² $ snd (decomposeLinMap s') []+       t²PLUSs²@(Norm t²Ps²M)+            = transformNorm t euclideanNorm <> transformNorm s euclideanNorm :: Norm w+       recip_t²PLUSs² = normSq (dualNorm t²PLUSs²) :: DualVector w -> s++instance (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a))             => Num (RWDfblFuncValue n a n) where   fromInteger i = point $ fromInteger i   (+) = (^+^)   ConstRWDFV c₁ * ConstRWDFV c₂ = ConstRWDFV (c₁*c₂)   ConstRWDFV c₁ * RWDFV_IdVar = GenericRWDFV $-                               globalDiffable' (actuallyLinearEndo $ linear (c₁*))+                               globalDiffable' (actuallyLinearEndo . arr $ scale $ c₁)   RWDFV_IdVar * ConstRWDFV c₂ = GenericRWDFV $-                               globalDiffable' (actuallyLinearEndo $ linear (*c₂))+                               globalDiffable' (actuallyLinearEndo . arr $ scale $ c₂)   ConstRWDFV c₁ * GenericRWDFV g = GenericRWDFV $-                               globalDiffable' (actuallyLinearEndo $ linear (c₁*)) . g+                               globalDiffable' (actuallyLinearEndo . arr $ scale $ c₁) . g   GenericRWDFV f * ConstRWDFV c₂ = GenericRWDFV $-                                  globalDiffable' (actuallyLinearEndo $ linear (*c₂)) . f+                               globalDiffable' (actuallyLinearEndo . arr $ scale $ c₂) . f   f*g = genericiseRWDFV f ⋅ genericiseRWDFV g-   where (⋅) :: ∀ n a . (RealDimension n, LocallyScalable n a)+   where (⋅) :: ∀ n a . (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a))            => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n           GenericRWDFV (RWDiffable fpcs) ⋅ GenericRWDFV (RWDiffable gpcs)            = GenericRWDFV . RWDiffable $@@ -934,28 +935,26 @@                           f'g' -> -} Differentiable $                            \d -> let (fd,ϕf) = toOffset'Slope af d                                      (gd,ϕg) = toOffset'Slope ag d-                                     f' = lapply ϕf 1; g' = lapply ϕg 1-                                     invf'g' = recip $ f'*g'+                                     jf = ϕf $ 1; jg = ϕg $ 1+                                     invf'g' = recip $ jf*jg                                  in ( fd*gd-                                    , linear.(*)$ fd*g' + gd*f'+                                    , arr $ scale $ fd*jg + gd*jf                                     , unsafe_dev_ε_δ "*" $ sqrt . (*invf'g') )                    _ -> mulDi (genericiseDifferentiable f) (genericiseDifferentiable g)                 mulDi (Differentiable f) (Differentiable g)                    = Differentiable $-                       \d -> let (c₁, slf, devf) = f d-                                 jf = convertLinear$->$slf-                                 (c₂, slg, devg) = g d-                                 jg = convertLinear$->$slg+                       \d -> let (c₁, jf, devf) = f d+                                 (c₂, jg, devg) = g d                                  c = c₁*c₂; c₁² = c₁^2; c₂² = c₂^2-                                 h' = c₁*^slg ^+^ c₂*^slf+                                 h' = c₁*^jg ^+^ c₂*^jf                                  in ( c                                     , h'-                                    , \εc -> let rε² = metric εc 1-                                                 c₁worst² = c₁² + recip(1 + c₂²*rε²)-                                                 c₂worst² = c₂² + recip(1 + c₁²*rε²)-                                             in (4*rε²) *^ dualCoCoProduct jf jg-                                                ^+^ devf (εc^*(4*c₂worst²))-                                                ^+^ devg (εc^*(4*c₁worst²))+                                    , \εc -> let rε = εc|$|1+                                                 c₁worst = sqrt $ c₁² + recip(1 + c₂²*rε^2)+                                                 c₂worst = sqrt $ c₂² + recip(1 + c₁²*rε^2)+                                             in scaleNorm (2*rε) (dualCoCoProduct jf jg)+                                                <> devf (scaleNorm (2*c₂worst) εc)+                                                <> devg (scaleNorm (2*c₁worst) εc)                     -- TODO: add formal proof for this (or, if necessary, the correct form)                                         )                 mulDi f g = mulDi (genericiseDifferentiable f) (genericiseDifferentiable g)@@ -965,20 +964,20 @@    where absPW a₀           | a₀<0       = (negativePreRegion, pure desc)           | otherwise  = (positivePreRegion, pure asc)-         desc = actuallyLinearEndo $ linear negate-         asc = actuallyLinearEndo idL+         desc = actuallyLinearEndo $ negateV id+         asc = actuallyLinearEndo id   signum = (RWDiffable sgnPW $~)    where sgnPW a₀           | a₀<0       = (negativePreRegion, pure (const $ -1))           | otherwise  = (positivePreRegion, pure (const 1)) -instance (RealDimension n, LocallyScalable n a)+instance (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a))             => Fractional (RWDfblFuncValue n a n) where   fromRational i = point $ fromRational i   recip = postCompRW . RWDiffable $ \a₀ -> if a₀<0                                     then (negativePreRegion, pure (Differentiable negp))                                     else (positivePreRegion, pure (Differentiable posp))-   where negp x = (x'¹, (- x'¹^2) *^ idL, unsafe_dev_ε_δ("1/"++show x) δ)+   where negp x = (x'¹, (- x'¹^2) *^ id, unsafe_dev_ε_δ("1/"++show x) δ)                  -- ε = 1/x − δ/x² − 1/(x+δ)                  -- ε·x + ε·δ = 1 + δ/x − δ/x − δ²/x² − 1                  --           = -δ²/x²@@ -991,7 +990,7 @@                            else - x -- numerical underflow of εx³ vs mph                                     --  ≡ ε*x^3 / (2*mph) (Taylor-expansion of the root)                 x'¹ = recip x-         posp x = (x'¹, (- x'¹^2) *^ idL, unsafe_dev_ε_δ("1/"++show x) δ)+         posp x = (x'¹, (- x'¹^2) *^ id, unsafe_dev_ε_δ("1/"++show x) δ)           where δ ε = let mph = ε*x^2/2                           δ₀ = sqrt (mph^2 + ε*x^3) - mph                       in if δ₀>0 then δ₀ else x@@ -1000,7 +999,7 @@   -instance (RealDimension n, LocallyScalable n a)+instance (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a))             => Floating (RWDfblFuncValue n a n) where   pi = point pi   @@ -1008,8 +1007,8 @@     $ \x -> let ex = exp x             in if ex*2 == ex  -- numerical trouble...                 then if x<0 then ( 0, zeroV, unsafe_dev_ε_δ("exp "++show x) $ \ε -> log ε - x )-                            else ( ex, ex*^idL, unsafe_dev_ε_δ("exp "++show x) $ \_ -> 1e-300 )-                else ( ex, ex *^ idL, unsafe_dev_ε_δ("exp "++show x)+                            else ( ex, ex*^id, unsafe_dev_ε_δ("exp "++show x) $ \_ -> 1e-300 )+                else ( ex, ex *^ id, unsafe_dev_ε_δ("exp "++show x)                           $ \ε -> case acosh(ε/(2*ex) + 1) of                                     δ | δ==δ      -> δ                                       | otherwise -> log ε - x )@@ -1022,7 +1021,7 @@   log = postCompRW . RWDiffable $ \x -> if x>0                                   then (positivePreRegion, pure (Differentiable lnPosR))                                   else (negativePreRegion, notDefinedHere)-   where lnPosR x = ( log x, recip x *^ idL, unsafe_dev_ε_δ("log "++show x) $ \ε -> x * sqrt(1 - exp(-ε)) )+   where lnPosR x = ( log x, recip x *^ id, unsafe_dev_ε_δ("log "++show x) $ \ε -> x * sqrt(1 - exp(-ε)) )                  -- ε = ln x + (-δ)/x − ln(x−δ)                  --   = ln (x / ((x−δ) · exp(δ/x)))                  -- x/e^ε = (x−δ) · exp(δ/x)@@ -1036,13 +1035,13 @@   sqrt = postCompRW . RWDiffable $ \x -> if x>0                                    then (positivePreRegion, pure (Differentiable sqrtPosR))                                    else (negativePreRegion, notDefinedHere)-   where sqrtPosR x = ( sx, idL ^/ (2*sx), unsafe_dev_ε_δ("sqrt "++show x) $+   where sqrtPosR x = ( sx, id ^/ (2*sx), unsafe_dev_ε_δ("sqrt "++show x) $                           \ε -> 2 * (s2 * sqrt sx^3 * sqrt ε + signum (ε*2-sx) * sx * ε) )           where sx = sqrt x; s2 = sqrt 2                  -- Exact inverse of O(δ²) remainder.      sin = grwDfblFnValsFunc sinDfb-   where sinDfb x = ( sx, cx *^ idL, unsafe_dev_ε_δ("sin "++show x) δ )+   where sinDfb x = ( sx, cx *^ id, unsafe_dev_ε_δ("sin "++show x) δ )           where sx = sin x; cx = cos x                 sx² = sx^2; cx² = cx^2                 sx' = abs sx; cx' = abs cx@@ -1057,7 +1056,7 @@                     -- Safety margins for overlap between quadratic and cubic model                     -- (these aren't naturally compatible to be used both together)                       -  cos = sin . (globalDiffable' (actuallyAffineEndo (pi/2) idL) $~)+  cos = sin . (globalDiffable' (actuallyAffineEndo (pi/2) id) $~)      sinh x = (exp x - exp (-x))/2     {- = grwDfblFnValsFunc sinhDfb@@ -1071,7 +1070,7 @@   cosh x = (exp x + exp (-x))/2      tanh = grwDfblFnValsFunc tanhDfb-   where tanhDfb x = ( tnhx, idL ^/ (cosh x^2), unsafe_dev_ε_δ("tan "++show x) δ )+   where tanhDfb x = ( tnhx, id ^/ (cosh x^2), unsafe_dev_ε_δ("tan "++show x) δ )           where tnhx = tanh x                 c = (tnhx*2/pi)^2                 p = 1 + abs x/(2*pi)@@ -1080,7 +1079,7 @@                   -- with quite a big margin. TODO: find a tighter definition.    atan = grwDfblFnValsFunc atanDfb-   where atanDfb x = ( atnx, idL ^/ (1+x^2), unsafe_dev_ε_δ("atan "++show x) δ )+   where atanDfb x = ( atnx, id ^/ (1+x^2), unsafe_dev_ε_δ("atan "++show x) δ )           where atnx = atan x                 c = (atnx*2/pi)^2                 p = 1 + abs x/(2*pi)@@ -1096,7 +1095,7 @@                   | x < (-1)   -> (preRegionFromMinInfTo (-1), notDefinedHere)                     | x > 1      -> (preRegionToInfFrom 1, notDefinedHere)                   | otherwise  -> (intervalPreRegion (-1,1), pure (Differentiable asinDefdR))-   where asinDefdR x = ( asinx, asin'x *^ idL, unsafe_dev_ε_δ("asin "++show x) δ )+   where asinDefdR x = ( asinx, asin'x *^ id, unsafe_dev_ε_δ("asin "++show x) δ )           where asinx = asin x; asin'x = recip (sqrt $ 1 - x^2)                 c = 1 - x^2                  δ ε = sqrt ε * c@@ -1106,13 +1105,13 @@                   | x < (-1)   -> (preRegionFromMinInfTo (-1), notDefinedHere)                     | x > 1      -> (preRegionToInfFrom 1, notDefinedHere)                   | otherwise  -> (intervalPreRegion (-1,1), pure (Differentiable acosDefdR))-   where acosDefdR x = ( acosx, acos'x *^ idL, unsafe_dev_ε_δ("acos "++show x) δ )+   where acosDefdR x = ( acosx, acos'x *^ id, unsafe_dev_ε_δ("acos "++show x) δ )           where acosx = acos x; acos'x = - recip (sqrt $ 1 - x^2)                 c = 1 - x^2                 δ ε = sqrt ε * c -- Like for asin – it's just a translation/reflection.    asinh = grwDfblFnValsFunc asinhDfb-   where asinhDfb x = ( asinhx, idL ^/ sqrt(1+x^2), unsafe_dev_ε_δ("asinh "++show x) δ )+   where asinhDfb x = ( asinhx, id ^/ sqrt(1+x^2), unsafe_dev_ε_δ("asinh "++show x) δ )           where asinhx = asinh x                 δ ε = abs x * sqrt((1 - exp(-ε))*0.8 + ε^2/(3*abs x + 1)) + sqrt(ε/(abs x+0.5))                  -- Empirical, modified from log function (the area hyperbolic sine@@ -1121,7 +1120,7 @@   acosh = postCompRW . RWDiffable $ \x -> if x>1                                    then (preRegionToInfFrom 1, pure (Differentiable acoshDfb))                                    else (preRegionFromMinInfTo 1, notDefinedHere)-   where acoshDfb x = ( acosh x, idL ^/ sqrt(x^2 - 1), unsafe_dev_ε_δ("acosh "++show x) δ )+   where acoshDfb x = ( acosh x, id ^/ sqrt(x^2 - 1), unsafe_dev_ε_δ("acosh "++show x) δ )           where δ ε = (2 - 1/sqrt x) * (s2 * sqrt sx^3 * sqrt(ε/s2) + signum (ε*s2-sx) * sx * ε/s2)                  sx = sqrt(x-1)                 s2 = sqrt 2@@ -1132,7 +1131,7 @@                   | x < (-1)   -> (preRegionFromMinInfTo (-1), notDefinedHere)                     | x > 1      -> (preRegionToInfFrom 1, notDefinedHere)                   | otherwise  -> (intervalPreRegion (-1,1), pure (Differentiable atnhDefdR))-   where atnhDefdR x = ( atanh x, recip(1-x^2) *^ idL, unsafe_dev_ε_δ("atanh "++show x) $ \ε -> sqrt(tanh ε)*(1-abs x) )+   where atnhDefdR x = ( atanh x, recip(1-x^2) *^ id, unsafe_dev_ε_δ("atanh "++show x) $ \ε -> sqrt(tanh ε)*(1-abs x) )                  -- Empirical, with epsEst upper bound.    @@ -1145,21 +1144,27 @@ --  -- However, because this category allows functions to be undefined in some region, -- such decisions can be faked quite well: '?->' restricts a function to--- some region, by simply marking it undefined outside¹, and '?|:' replaces these+-- some region, by simply marking it undefined outside, and '?|:' replaces these -- regions with values from another function. --  -- Example: define a function that is compactly supported on the interval ]-1,1[, -- i.e. exactly zero everywhere outside. -- -- @--- Graphics.Dynamic.Plot.R2> plotWindow [diffableFnPlot (\\x -> -1 '?<' x '?<' 1 '?->' exp(1/(x^2 - 1)) '?|:' 0)]+-- Graphics.Dynamic.Plot.R2> plotWindow [fnPlot (\\x -> -1 '?<' x '?<' 1 '?->' cos (x*pi/2)^2 '?|:' 0)] -- @ -- --- <<images/examples/Friedrichs-mollifier.png>>+-- <<images/examples/DiffableFunction-plots/Hann-window.png>> -- --- ¹ Note that it may not be necessary to restrict explicitly: for instance if a+-- Note that it may not be necessary to restrict explicitly: for instance if a -- square root appears somewhere in an expression, then the expression is automatically -- restricted so that the root has a positive argument!+-- +-- @+-- Graphics.Dynamic.Plot.R2> plotWindow [fnPlot (\\x -> sqrt x '?|:' -sqrt (-x))]+-- @+-- +-- <<images/examples/DiffableFunction-plots/safe-sqrt.png>>    infixr 4 ?-> -- | Require the LHS to be defined before considering the RHS as result.@@ -1170,7 +1175,8 @@ --   Just _ 'Control.Applicative.*>' a = a --   _      'Control.Applicative.*>' a = Nothing --   @-(?->) :: (RealDimension n, LocallyScalable n a, LocallyScalable n b, LocallyScalable n c)+(?->) :: ( RealDimension n, LocallyScalable n a, LocallyScalable n b, LocallyScalable n c+         , SimpleSpace (Needle b), SimpleSpace (Needle c) )       => RWDfblFuncValue n c a -> RWDfblFuncValue n c b -> RWDfblFuncValue n c b ConstRWDFV _ ?-> f = f RWDFV_IdVar ?-> f = f@@ -1196,12 +1202,12 @@ --   allows chaining of comparison operators like in Python.) --   Note that less-than comparison is <http://www.paultaylor.eu/ASD/ equivalent> --   to less-or-equal comparison, because there is no such thing as equality.-(?>) :: (RealDimension n, LocallyScalable n a)+(?>) :: (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a))            => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n a ?> b = (positiveRegionalId $~ a-b) ?-> b  -- | Return the RHS, if it is greater than the LHS.-(?<) :: (RealDimension n, LocallyScalable n a)+(?<) :: (RealDimension n, LocallyScalable n a, SimpleSpace (Needle a))            => RWDfblFuncValue n a n -> RWDfblFuncValue n a n -> RWDfblFuncValue n a n ConstRWDFV a ?< RWDFV_IdVar = GenericRWDFV . RWDiffable $        \x₀ -> if a < x₀ then ( preRegionToInfFrom a@@ -1224,7 +1230,8 @@ --   @ --  --  Basically a weaker and agent-ised version of 'backupRegions'.-(?|:) :: (RealDimension n, LocallyScalable n a, LocallyScalable n b)+(?|:) :: ( RealDimension n, LocallyScalable n a, LocallyScalable n b+         , SimpleSpace (Needle a), SimpleSpace (Needle b) )       => RWDfblFuncValue n a b -> RWDfblFuncValue n a b -> RWDfblFuncValue n a b ConstRWDFV c ?|: _ = ConstRWDFV c RWDFV_IdVar ?|: _ = RWDFV_IdVar@@ -1257,16 +1264,12 @@ --   instead of a Hask one. lerp_diffable :: (WithField s LinearManifold m, RealDimension s)       => m -> m -> Differentiable s s m-lerp_diffable a b = actuallyAffine a $ linear (*^(b.-.a))-+lerp_diffable a b = actuallyAffine a . arr $ flipBilin scale $ b.-.a     -isZeroMap :: ∀ v a . (FiniteDimensional v, AdditiveGroup a, Eq a) => (v:-*a) -> Bool-isZeroMap m = all ((==zeroV) . atBasis m) b- where (Tagged b) = completeBasis :: Tagged v [Basis v]   
Data/Function/Differentiable/Data.hs view
@@ -6,8 +6,7 @@ import Data.Semigroup import Data.Function.Affine import Data.VectorSpace-import Data.LinearMap-import Data.LinearMap.HerMetric+import Math.LinearMap.Category  import Data.Manifold.Types.Primitive import Data.Manifold.PseudoAffine@@ -55,7 +54,7 @@ --   This makes the category actually work on general manifolds.) data Differentiable s d c where    Differentiable :: ( d -> ( c   -- function value-                            , Needle d :-* Needle c -- Jacobian+                            , Needle d +> Needle c -- Jacobian                             , LinDevPropag d c -- Metric showing how far you can go                                                -- from x₀ without deviating from the                                                -- Taylor-1 approximation by more than
− Data/LinearMap/Category.hs
@@ -1,313 +0,0 @@--- |--- Module      : Data.LinearMap.Category--- Copyright   : (c) Justus Sagemüller 2015--- License     : GPL v3--- --- Maintainer  : (@) sagemueller $ geo.uni-koeln.de--- Stability   : experimental--- Portability : portable--- -{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE UndecidableInstances       #-}-{-# LANGUAGE StandaloneDeriving         #-}-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE DeriveFunctor              #-}-{-# LANGUAGE DeriveFoldable             #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE TypeFamilies               #-}-{-# LANGUAGE MultiParamTypeClasses      #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE GADTs                      #-}-{-# LANGUAGE RankNTypes                 #-}-{-# LANGUAGE TupleSections              #-}-{-# LANGUAGE UnicodeSyntax              #-}-{-# LANGUAGE CPP                        #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE PatternGuards              #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE ScopedTypeVariables        #-}-{-# LANGUAGE DataKinds                  #-}--module Data.LinearMap.Category where--import Data.Tagged--import Data.VectorSpace-import Data.LinearMap-import Data.VectorSpace.FiniteDimensional-import Data.AffineSpace-import Data.Basis-    -import qualified Prelude as Hask hiding(foldl)-import qualified Control.Applicative as Hask-import qualified Control.Monad       as Hask-import qualified Data.Foldable       as Hask---import Control.Category.Constrained.Prelude hiding ((^))-import Control.Arrow.Constrained--import Data.Manifold.Types.Primitive-import Data.CoNat-import Data.Embedding--import qualified Data.Vector as Arr-import qualified Numeric.LinearAlgebra.HMatrix as HMat---    --- | A linear mapping between finite-dimensional spaces, implemeted as a dense matrix.---  ---   Note that this is equivalent to the tensor product @'DualSpace' a ⊗ b@. One---   of the types should be deprecated in the future, or either implemented in---   terms of the other.-newtype Linear s a b = DenseLinear { getDenseMatrix :: HMat.Matrix s }--identMat :: forall v w . FiniteDimensional v => Linear (Scalar v) w v-identMat = DenseLinear $ HMat.ident n- where (Tagged n) = dimension :: Tagged v Int---- | Coerce the matrix representations of two linear mappings; the result makes---   sense iff the spaces are canonically isomorphic (certainly if they---   are good instances of 'Data.Manifold.PseudoAffine.LocallyCoercible').-unsafeCoerceLinear :: Linear s a b -> Linear s c d-unsafeCoerceLinear (DenseLinear m) = DenseLinear m--convertLinear :: ∀ v w s . ( FiniteDimensional v, FiniteDimensional w-                           , Scalar v ~ s, Scalar w ~ s )-                   => Isomorphism (->) (v:-*w) (Linear s v w)-convertLinear = Isomorphism (asPackedMatrix >>> DenseLinear)-                            (fromPackedMatrix<<<getDenseMatrix)--denseLinear :: ∀ v w s . (FiniteDimensional v, FiniteDimensional w, Scalar w ~ s)-                   => (v->w) -> Linear s v w-denseLinear f = DenseLinear . HMat.fromColumns $ (asPackedVector . f . basisValue) <$> cbv- where Tagged cbv = completeBasis :: Tagged v [Basis v]--instance (SmoothScalar s) => Category (Linear s) where-  type Object (Linear s) v = (FiniteDimensional v, Scalar v~s)-  id = identMat-  DenseLinear f . DenseLinear g = DenseLinear $ HMat.mul f g--instance (SmoothScalar s) => Cartesian (Linear s) where-  type UnitObject (Linear s) = ZeroDim s-  swap = lSwap-   where lSwap :: forall v w s-              . (FiniteDimensional v, FiniteDimensional w, Scalar v~s, Scalar w~s)-                   => Linear s (v,w) (w,v)-         lSwap = DenseLinear $ HMat.assoc (n,n) 0 l-          where l = [ ((i,i+nv), 1) | i<-[0.. nw-1] ] ++ [ ((i+nw,i), 1) | i<-[0.. nv-1] ] -                (Tagged nv) = dimension :: Tagged v Int-                (Tagged nw) = dimension :: Tagged w Int-                n = nv + nw-  attachUnit = identMat-  detachUnit = identMat-  regroup = identMat-  regroup' = identMat--instance (SmoothScalar s) => Morphism (Linear s) where-  DenseLinear f *** DenseLinear g = DenseLinear $ HMat.diagBlock [f,g]--instance (SmoothScalar s) => PreArrow (Linear s) where-  DenseLinear f &&& DenseLinear g = DenseLinear $ HMat.fromBlocks [[f], [g]]-  fst = lFst-   where lFst :: forall v w s-              . (FiniteDimensional v, FiniteDimensional w, Scalar v~s, Scalar w~s)-                   => Linear s (v,w) v-         lFst = DenseLinear $ HMat.assoc (nv,n) 0 l-          where l = [ ((i,i), 1) | i<-[0.. nv-1] ]-                (Tagged nv) = dimension :: Tagged v Int-                (Tagged nw) = dimension :: Tagged w Int-                n = nv + nw-  snd = lSnd-   where lSnd :: forall v w s-              . (FiniteDimensional v, FiniteDimensional w, Scalar v~s, Scalar w~s)-                   => Linear s (v,w) w-         lSnd = DenseLinear $ HMat.assoc (nw,n) 0 l-          where l = [ ((i,i+nv), 1) | i<-[0.. nw-1] ]-                (Tagged nv) = dimension :: Tagged v Int-                (Tagged nw) = dimension :: Tagged w Int-                n = nv + nw-  terminal = lTerminal-   where lTerminal :: forall v s . (FiniteDimensional v, Scalar v~s)-                         => Linear s v (ZeroDim s)-         lTerminal = DenseLinear $ (0 HMat.>< n) []-          where (Tagged n) = dimension :: Tagged v Int--instance (SmoothScalar s) => EnhancedCat (->) (Linear s) where-  arr (DenseLinear mat) = fromPackedVector . HMat.app mat . asPackedVector---- | Inverse function application (for isomorphisms), or---   least-square solution of a linear equation.---   Note that least-square is not really well-defined,---   without reference to a norm / scalar product; the operator uses---   the implicit norm induced from the 'FiniteDimensional' representation.-(<\$) :: ( SmoothScalar s, FiniteDimensional v, FiniteDimensional w-         , Scalar v ~ s, Scalar w ~ s-         ) => Linear s v w -> w -> v-DenseLinear mat <\$ v = fromPackedVector . (mat HMat.<\>) $ asPackedVector v--type DenseLinearFuncValue s = GenericAgent (Linear s)--instance (SmoothScalar s) => HasAgent (Linear s) where-  alg = genericAlg-  ($~) = genericAgentMap-instance (SmoothScalar s) => CartesianAgent (Linear s) where-  alg1to2 = genericAlg1to2-  alg2to1 = genericAlg2to1-  alg2to2 = genericAlg2to2---instance (FiniteDimensional v, Scalar v~s, FiniteDimensional w, Scalar w~s, SmoothScalar s)-                     => AffineSpace (Linear s v w) where-  type Diff (Linear s v w) = Linear s v w-  DenseLinear m.-.DenseLinear n = DenseLinear (m-n)-  DenseLinear m.+^DenseLinear n = DenseLinear (m+n)--instance (FiniteDimensional v, Scalar v~s, FiniteDimensional w, Scalar w~s, SmoothScalar s)-                       => AdditiveGroup (Linear s v w) where-  zeroV = zx-   where zx :: ∀ v w . (FiniteDimensional v, FiniteDimensional w) => Linear s v w-         zx = DenseLinear $ HMat.konst 0 (dw,dv)-          where Tagged dv = dimension :: Tagged v Int-                Tagged dw = dimension :: Tagged w Int-  negateV (DenseLinear m) = DenseLinear $ negate m-  DenseLinear m^+^DenseLinear n = DenseLinear (m+n)-  DenseLinear m^-^DenseLinear n = DenseLinear (m-n)--instance (FiniteDimensional v, Scalar v~s, FiniteDimensional w, Scalar w~s, SmoothScalar s)-             => VectorSpace (Linear s v w) where-  type Scalar (Linear s v w) = s-  μ *^ DenseLinear m = DenseLinear $ HMat.scale μ m--instance (FiniteDimensional v, Scalar v~s, FiniteDimensional w, Scalar w~s, SmoothScalar s)-             => HasBasis (Linear s v w) where-  type Basis (Linear s v w) = (Basis v, Basis w)-  basisValue = bx-   where bx :: ∀ v w . (FiniteDimensional v, FiniteDimensional w)-                          => (Basis v, Basis w)->Linear s v w-         bx = \(bv,bw) -> DenseLinear $ HMat.assoc (dw,dv) 0 [((biw bw, biv bv),1)]-          where Tagged dv = dimension :: Tagged v Int-                Tagged dw = dimension :: Tagged w Int-                Tagged biv = basisIndex :: Tagged v (Basis v->Int)-                Tagged biw = basisIndex :: Tagged w (Basis w->Int)-  decompose = dc-   where dc :: ∀ s v w . ( FiniteDimensional v, Scalar v ~ s-                         , FiniteDimensional w, Scalar w ~ s )-                 => Linear s v w -> [((Basis v, Basis w), s)]-         dc lm = map (id &&& decompose' lm) cb-          where Tagged cb = completeBasis :: Tagged (Linear s v w) [(Basis v, Basis w)]-  decompose' = dc-   where dc :: ∀ s v w . (FiniteDimensional v, FiniteDimensional w, Scalar w ~ s)-               => Linear s v w -> (Basis v, Basis w) -> s-         dc (DenseLinear m) = \(bv,bw) -> m HMat.! biw bw HMat.! biv bv-          where Tagged biv = basisIndex :: Tagged v (Basis v->Int)-                Tagged biw = basisIndex :: Tagged w (Basis w->Int)--instance (FiniteDimensional v, Scalar v ~ s, FiniteDimensional w, Scalar w ~ s)-                => FiniteDimensional (Linear s v w) where-  dimension = d-   where d :: ∀ s v w . (FiniteDimensional v, FiniteDimensional w)-               => Tagged (Linear s v w) Int-         d = Tagged (dv*dw)-          where Tagged dv = dimension::Tagged v Int; Tagged dw = dimension::Tagged w Int-  basisIndex = bi-   where bi :: ∀ s v w . (FiniteDimensional v, FiniteDimensional w)-               => Tagged (Linear s v w) ((Basis v, Basis w) -> Int)-         bi = Tagged $ \(bv,bw) -> dv * biv bv + biw bw where -          Tagged dv=dimension::Tagged v Int; Tagged biv=basisIndex::Tagged v (Basis v->Int)-          Tagged biw = basisIndex :: Tagged w (Basis w -> Int)-  indexBasis = ib-   where ib :: ∀ s v w . (FiniteDimensional v, FiniteDimensional w)-               => Tagged (Linear s v w) (Int -> (Basis v, Basis w))-         ib = Tagged $ (`divMod`dv) >>> \(iv,iw) -> (ibv iv, ibw iw) where-          Tagged dv=dimension::Tagged v Int; Tagged ibv=indexBasis::Tagged v (Int->Basis v)-          Tagged ibw = indexBasis :: Tagged w (Int->Basis w)-  completeBasis = cb-   where cb :: ∀ s v w . (FiniteDimensional v, FiniteDimensional w)-               => Tagged (Linear s v w) [(Basis v, Basis w)]-         cb = Tagged $ liftA2 (,) cbv cbw where-          Tagged cbv = completeBasis :: Tagged v [Basis v]-          Tagged cbw = completeBasis :: Tagged w [Basis w]-  asPackedVector = getDenseMatrix >>> HMat.flatten-  fromPackedVector = fpv-   where fpv :: ∀ s v w . (FiniteDimensional v, Scalar v ~ s, FiniteDimensional w, Scalar w ~ s)-               => HMat.Vector s -> Linear s v w-         fpv = HMat.reshape dv >>> DenseLinear-          where Tagged dv = dimension :: Tagged v Int--instance (FiniteDimensional v, Scalar v ~ s, FiniteDimensional a, Scalar a ~ s)-    => AdditiveGroup (DenseLinearFuncValue s a v) where-  zeroV = GenericAgent zeroV-  GenericAgent f ^+^ GenericAgent g = GenericAgent $ f ^+^ g-  negateV (GenericAgent f) = GenericAgent $ negateV f----canonicalIdentityMatrix :: forall n v s-                 . (KnownNat n, IsFreeSpace v, FreeDimension v ~ n, Scalar v ~ s)-           => Linear s v (FreeVect n s)-canonicalIdentityMatrix = DenseLinear $ HMat.ident n- where (Tagged n) = theNatN :: Tagged n Int---- | Class of spaces that directly represent a free vector space, i.e. that are simply---   @n@-fold products of the base field.---   This class basically contains 'ℝ', 'ℝ²', 'ℝ³' etc., in future also the complex and---   probably integral versions.-class (FiniteDimensional v, KnownNat (FreeDimension v)) => IsFreeSpace v where-  type FreeDimension v :: Nat-  identityMatrix :: Isomorphism (Linear (Scalar v))-                      v-                      (FreeVect (FreeDimension v) (Scalar v))-  identityMatrix = fromInversePair emb proj-   where emb@(DenseLinear i) = canonicalIdentityMatrix-         proj = DenseLinear i--instance (KnownNat n, Num s, SmoothScalar s) => IsFreeSpace (FreeVect n s) where -  type FreeDimension (FreeVect n s) = n-  identityMatrix = fromInversePair id id--instance IsFreeSpace ℝ where-  type FreeDimension ℝ = S Z-  -instance ( SmoothScalar s, IsFreeSpace v, Scalar v ~ s, FiniteDimensional s, s ~ Scalar s )-             => IsFreeSpace (v,s) where-  type FreeDimension (v,s) = S (FreeDimension v)----class VectorSpace v => FreeTuple v where-  type Tuplity v :: Nat-  freeTuple :: Isomorphism (->) v (FreeVect (Tuplity v) (Scalar v))--#define FreeScalar(s)                                                             \-instance FreeTuple (s) where {                                                     \-  type Tuplity (s) = S Z;                                                           \-  freeTuple = fromInversePair (FreeVect . pure) (\(FreeVect v) -> v Arr.! 0); }--#define FreePair(s)                                                         \-FreeScalar(s);                                                               \-instance FreeTuple (s,s) where {                                              \-  type Tuplity (s,s) = S(S Z);                                                 \-  freeTuple = fromInversePair (\(a,b) -> FreeVect $ Arr.fromList[a,b])          \-                              (\(FreeVect v) -> (v Arr.! 0, v Arr.! 1)); }--#define FreeTriple(s)                                                            \-FreePair(s);                                                                      \-instance FreeTuple (s,s,s) where {                                                 \-  type Tuplity (s,s,s) = S(S(S Z));                                                 \-  freeTuple = fromInversePair (\(a,b,c) -> FreeVect $ Arr.fromList[a,b,c])           \-                              (\(FreeVect v) -> (v Arr.! 0, v Arr.! 1, v Arr.! 2)); };\-instance FreeTuple (s,(s,s)) where {                                                 \-  type Tuplity (s,(s,s)) = S(S(S Z));                                                 \-  freeTuple = fromInversePair (\(a,(b,c)) -> FreeVect $ Arr.fromList[a,b,c])           \-                              (\(FreeVect v) -> (v Arr.! 0, (v Arr.! 1, v Arr.! 2))); };\-instance FreeTuple ((s,s),s) where {                                                 \-  type Tuplity ((s,s),s) = S(S(S Z));                                                 \-  freeTuple = fromInversePair (\((a,b),c) -> FreeVect $ Arr.fromList[a,b,c])           \-                              (\(FreeVect v) -> ((v Arr.! 0, v Arr.! 1), v Arr.! 2)); }--FreeTriple(ℝ)-FreeTriple(Int)--
− Data/LinearMap/HerMetric.hs
@@ -1,894 +0,0 @@-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE TupleSections              #-}-{-# LANGUAGE TypeFamilies               #-}-{-# LANGUAGE UndecidableInstances       #-}-{-# LANGUAGE StandaloneDeriving         #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE ScopedTypeVariables        #-}-{-# LANGUAGE UnicodeSyntax              #-}-{-# LANGUAGE LambdaCase                 #-}-----module Data.LinearMap.HerMetric (-  -- * Metric operator types-    HerMetric(..), HerMetric'(..)-  -- * Evaluating metrics-  , toDualWith, fromDualWith-  , metricSq, metricSq', metric, metric', metrics, metrics'-  -- * Defining metrics-  , projector, projector', projectors, projector's-  , euclideanMetric'-  -- * Metrics induce inner products-  , spanHilbertSubspace-  , spanSubHilbertSpace-  , IsFreeSpace-  -- * One-dimensional axes and product spaces-  , factoriseMetric, factoriseMetric'-  , productMetric, productMetric'-  , tryMetricAsLength, metricAsLength, metricFromLength, metric'AsLength-  -- * Utility for metrics-  , transformMetric, transformMetric', dualCoCoProduct-  , dualiseMetric, dualiseMetric'-  , recipMetric, recipMetric', safeRecipMetric, safeRecipMetric'-  -- ** Eigenvectors-  , eigenSpan, eigenSpan'-  , eigenCoSpan, eigenCoSpan'-  , eigenSystem, HasEigenSystem, EigenVector-  -- ** Scaling operations-  , metriNormalise, metriNormalise'-  , metriScale', metriScale-  , volumeRatio, euclideanRelativeMetricVolume-  , adjoint-  , extendMetric-  , applyLinMapMetric, applyLinMapMetric'-  , imitateMetricSpanChange-  -- * The dual-space class-  , HasMetric-  , HasMetric'(..)-  , (^<.>)---   , riesz, riesz'-  -- * Fundamental requirements-  , MetricScalar-  , FiniteDimensional(..)-  -- * Misc-  , Stiefel1(..)-  , linMapAsTensProd, linMapFromTensProd-  , covariance-  , outerProducts-  , orthogonalComplementSpan-  ) where-    --    --import Data.VectorSpace-import Data.LinearMap-import Data.Basis-import Data.Semigroup-import Data.Tagged-import qualified Data.List as List--import qualified Prelude as Hask-import qualified Control.Applicative as Hask-import qualified Control.Monad as Hask--import Control.Category.Constrained.Prelude hiding ((^))-import Control.Arrow.Constrained-    -import Data.Manifold.Types.Primitive-import Data.CoNat--import qualified Data.Vector as Arr-import qualified Numeric.LinearAlgebra.HMatrix as HMat--import Data.VectorSpace.FiniteDimensional-import Data.LinearMap.Category-import Data.Embedding----infixr 7 <.>^, ^<.>----- | 'HerMetric' is a portmanteau of /Hermitian/ and /metric/ (in the sense as---   used in e.g. general relativity &#x2013; though those particular ones aren't positive---   definite and thus not really metrics).--- ---   Mathematically, there are two directly equivalent ways to describe such a metric:---   as a bilinear mapping of two vectors to a scalar, or as a linear mapping from---   a vector space to its dual space. We choose the latter, though you can always---   as well think of metrics as &#x201c;quadratic dual vectors&#x201d;.---   ---   Yet other possible interpretations of this type include /density matrix/ (as in---   quantum mechanics), /standard range of statistical fluctuations/, and /volume element/.-newtype HerMetric v = HerMetric {-          metricMatrix :: Maybe (Linear (Scalar v) v (DualSpace v)) -- @Nothing@ for zero metric.-                      }--matrixMetric :: HasMetric v => HMat.Matrix (Scalar v) -> HerMetric v-matrixMetric = HerMetric . Just . DenseLinear---- | Deprecated (this doesn't preserve positive-definiteness)-instance (HasMetric v) => AdditiveGroup (HerMetric v) where-  zeroV = HerMetric Nothing-  negateV (HerMetric m) = HerMetric $ negateV <$> m-  HerMetric Nothing ^+^ HerMetric n = HerMetric n-  HerMetric m ^+^ HerMetric Nothing = HerMetric m-  HerMetric (Just m) ^+^ HerMetric (Just n) = HerMetric . Just $ m ^+^ n-instance HasMetric v => VectorSpace (HerMetric v) where-  type Scalar (HerMetric v) = Scalar v-  s *^ (HerMetric m) = HerMetric $ (s*^) <$> m ---- | A metric on the dual space; equivalent to a linear mapping from the dual space---   to the original vector space.--- ---   Prime-versions of the functions in this module target those dual-space metrics, so---   we can avoid some explicit handling of double-dual spaces.-newtype HerMetric' v = HerMetric' {-          metricMatrix' :: Maybe (Linear (Scalar v) (DualSpace v) v)-                      }--extendMetric :: (HasMetric v, Scalar v~ℝ) => HerMetric v -> v -> HerMetric v-extendMetric (HerMetric Nothing) _ = HerMetric Nothing-extendMetric (HerMetric (Just (DenseLinear m))) v-      | isInfinite' detm  = HerMetric . Just $ DenseLinear m-      | isInfinite' detmninv  = singularMetric-      | otherwise         = HerMetric . Just $ DenseLinear mn- where -- this could probably be done much more efficiently, with only-       -- multiplications, no inverses.-       (minv, (detm, _)) = HMat.invlndet m-       (mn, (detmninv, _)) = HMat.invlndet (minv + HMat.outer vv vv)-       vv = asPackedVector v-                              --matrixMetric' :: HasMetric v => HMat.Matrix (Scalar v) -> HerMetric' v-matrixMetric' = HerMetric' . Just . DenseLinear---- | Deprecated-instance (HasMetric v) => AdditiveGroup (HerMetric' v) where-  zeroV = HerMetric' Nothing-  negateV (HerMetric' m) = HerMetric' $ negateV <$> m-  HerMetric' Nothing ^+^ HerMetric' n = HerMetric' n-  HerMetric' m ^+^ HerMetric' Nothing = HerMetric' m-  HerMetric' (Just m) ^+^ HerMetric' (Just n) = HerMetric' . Just $ m ^+^ n-instance HasMetric v => VectorSpace (HerMetric' v) where-  type Scalar (HerMetric' v) = Scalar v-  s *^ (HerMetric' m) = HerMetric' $ (s*^) <$> m -    ---- | A metric on @v@ that simply yields the squared overlap of a vector with the---   given dual-space reference.---   ---   It will perhaps be the most common way of defining 'HerMetric' values to start---   with such dual-space vectors and superimpose the projectors using the 'VectorSpace'---   instance; e.g. @'projector' (1,0) '^+^' 'projector' (0,2)@ yields a hermitian operator---   describing the ellipsoid span of the vectors /e/&#x2080; and 2&#x22c5;/e/&#x2081;.---   Metrics generated this way are positive definite if no negative coefficients have---   been introduced with the '*^' scaling operator or with '^-^'.---   ---   Note: @projector a ^+^ projector b ^+^ ...@ is more efficiently written as---   @projectors [a, b, ...]@-projector :: HasMetric v => DualSpace v -> HerMetric v-projector u = HerMetric . pure $ u ⊗ u--projector' :: HasMetric v => v -> HerMetric' v-projector' v = HerMetric' . pure $ v ⊗ v---- | Efficient shortcut for the 'sumV' of multiple 'projector's.-projectors :: HasMetric v => [DualSpace v] -> HerMetric v-projectors [] = zeroV-projectors us = HerMetric . pure . outerProducts $ zip us us--projector's :: HasMetric v => [v] -> HerMetric' v-projector's [] = zeroV-projector's vs = HerMetric' . pure . outerProducts $ zip vs vs---singularMetric :: forall v . HasMetric v => HerMetric v-singularMetric = matrixMetric $ HMat.scale (1/0) (HMat.ident dim)- where (Tagged dim) = dimension :: Tagged v Int-singularMetric' :: forall v . HasMetric v => HerMetric' v-singularMetric' = matrixMetric' $ HMat.scale (1/0) (HMat.ident dim)- where (Tagged dim) = dimension :: Tagged v Int------ | Evaluate a vector through a metric. For the canonical metric on a Hilbert space,---   this will be simply 'magnitudeSq'.-metricSq :: HasMetric v => HerMetric v -> v -> Scalar v-metricSq (HerMetric Nothing) _ = 0-metricSq (HerMetric (Just (DenseLinear m))) v = vDecomp `HMat.dot` HMat.app m vDecomp- where vDecomp = asPackedVector v---metricSq' :: HasMetric v => HerMetric' v -> DualSpace v -> Scalar v-metricSq' (HerMetric' Nothing) _ = 0-metricSq' (HerMetric' (Just (DenseLinear m))) u = uDecomp `HMat.dot` HMat.app m uDecomp- where uDecomp = asPackedVector u---- | Evaluate a vector's &#x201c;magnitude&#x201d; through a metric. This assumes an actual---   mathematical metric, i.e. positive definite &#x2013; otherwise the internally used---   square root may get negative arguments (though it can still produce results if the---   scalars are complex; however, complex spaces aren't supported yet).-metric :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> v -> Scalar v-metric m = sqrt . metricSq m--metric' :: (HasMetric v, Floating (Scalar v)) => HerMetric' v -> DualSpace v -> Scalar v-metric' m = sqrt . metricSq' m---toDualWith :: HasMetric v => HerMetric v -> v -> DualSpace v-toDualWith (HerMetric Nothing) = const zeroV-toDualWith (HerMetric (Just m)) = (m$)--fromDualWith :: HasMetric v => HerMetric' v -> DualSpace v -> v-fromDualWith (HerMetric' Nothing) = const zeroV-fromDualWith (HerMetric' (Just m)) = (m$)---- | Divide a vector by its own norm, according to metric, i.e. normalise it---   or &#x201c;project to the metric's boundary&#x201d;.-metriNormalise :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> v -> v-metriNormalise m v = v ^/ metric m v--metriNormalise' :: (HasMetric v, Floating (Scalar v))-                 => HerMetric' v -> DualSpace v -> DualSpace v-metriNormalise' m v = v ^/ metric' m v---- | &#x201c;Anti-normalise&#x201d; a vector: /multiply/ with its own norm, according to metric.-metriScale :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> v -> v-metriScale m v = metric m v *^ v--metriScale' :: (HasMetric v, Floating (Scalar v))-                 => HerMetric' v -> DualSpace v -> DualSpace v-metriScale' m v = metric' m v *^ v----- | Square-sum over the metrics for each dual-space vector.--- --- @--- metrics m vs &#x2261; sqrt . sum $ metricSq m '<$>' vs--- @-metrics :: (HasMetric v, Floating (Scalar v)) => HerMetric v -> [v] -> Scalar v-metrics m vs = sqrt . sum $ metricSq m <$> vs--metrics' :: (HasMetric v, Floating (Scalar v)) => HerMetric' v -> [DualSpace v] -> Scalar v-metrics' m vs = sqrt . sum $ metricSq' m <$> vs---transformMetric :: ∀ s v w . (HasMetric v, HasMetric w, Scalar v~s, Scalar w~s)-           => Linear s w v -> HerMetric v -> HerMetric w-transformMetric _ (HerMetric Nothing) = HerMetric Nothing-transformMetric t (HerMetric (Just m)) = HerMetric . Just $ adjoint t . m . t--transformMetric' :: ∀ s v w . (HasMetric v, HasMetric w, Scalar v~s, Scalar w~s)-           => Linear s v w -> HerMetric' v -> HerMetric' w-transformMetric' _ (HerMetric' Nothing) = HerMetric' Nothing-transformMetric' t (HerMetric' (Just m)) = HerMetric' . Just $ t . m . adjoint t---- | This does something vaguely like  @\\s t -> (s⋅t)²@,---   but without actually requiring an inner product on the covectors.---   Used for calculating the superaffine term of multiplications in---   'Differentiable' categories.-dualCoCoProduct :: (HasMetric v, HasMetric w, Scalar v ~ s, Scalar w ~ s)-           => Linear s w v -> Linear s w v -> HerMetric w-dualCoCoProduct (DenseLinear smat) (DenseLinear tmat)-                  = ( (sArr `HMat.dot` (t²PLUSs² HMat.<\> sArr))-                       * (tArr `HMat.dot` (t²PLUSs² HMat.<\> tArr)) )-                    *^ matrixMetric t²PLUSs²- where tArr = HMat.flatten tmat-       sArr = HMat.flatten smat-       t²PLUSs² = tmat HMat.<> HMat.tr tmat + smat HMat.<> HMat.tr smat----- | This doesn't really do anything at all, since @'HerMetric' v@ is essentially a---   synonym for @'HerMetric' ('DualSpace' v)@.-dualiseMetric :: HasMetric v => HerMetric (DualSpace v) -> HerMetric' v-dualiseMetric (HerMetric m) = HerMetric' m--dualiseMetric' :: HasMetric v => HerMetric' v -> HerMetric (DualSpace v)-dualiseMetric' (HerMetric' m) = HerMetric m----- | The inverse mapping of a metric tensor. Since a metric maps from---   a space to its dual, the inverse maps from the dual into the---   (double-dual) space &#x2013; i.e., it is a metric on the dual space.---   Deprecated: the singular case isn't properly handled.-recipMetric :: HasMetric v => HerMetric' v -> HerMetric v-recipMetric m' | Option (Just m) <- safeRecipMetric m'  = m-recipMetric _ = singularMetric--recipMetric' :: HasMetric v => HerMetric v -> HerMetric' v-recipMetric' m | Option (Just m') <- safeRecipMetric' m  = m'-recipMetric' _ = singularMetric'--safeRecipMetric :: HasMetric v => HerMetric' v -> Option (HerMetric v)-safeRecipMetric (HerMetric' Nothing) = empty-safeRecipMetric (HerMetric' (Just (DenseLinear m)))-          | isInfinite' detm  = empty-          | otherwise         = return $ matrixMetric minv- where (minv, (detm, _)) = HMat.invlndet m--safeRecipMetric' :: HasMetric v => HerMetric v -> Option (HerMetric' v)-safeRecipMetric' (HerMetric Nothing) = empty-safeRecipMetric' (HerMetric (Just (DenseLinear m)))-          | isInfinite' detm  = empty-          | otherwise         = return $ matrixMetric' minv- where (minv, (detm, _)) = HMat.invlndet m--isInfinite' :: (Eq a, Num a) => a -> Bool-isInfinite' 0 = False-isInfinite' x = x==x*2------ | The eigenbasis of a metric, with each eigenvector scaled to the---   square root of the eigenvalue. If the metric is not positive---   definite (i.e. if it has zero eigenvalues), then the 'eigenSpan'---   will contain zero vectors.---   ---   This constitutes, in a sense,---   a decomposition of a metric into a set of 'projector'' vectors. If those---   are 'sumV'ed again (use 'projectors's' for this), then the original metric---   is obtained. (This holds even for non-Hilbert/Banach spaces,---   although the concept of eigenbasis and---   &#x201c;scaled length&#x201d; doesn't really make sense there.)-eigenSpan :: (HasMetric v, Scalar v ~ ℝ) => HerMetric' v -> [v]-eigenSpan (HerMetric' Nothing) = []-eigenSpan (HerMetric' (Just (DenseLinear m))) = map fromPackedVector eigSpan- where (μs,vsm) = HMat.eigSH' m-       eigSpan = zipWith (HMat.scale . sqrt) (HMat.toList μs) (HMat.toColumns vsm)--eigenSpan' :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> [DualSpace v]-eigenSpan' (HerMetric Nothing) = []-eigenSpan' (HerMetric (Just (DenseLinear m))) = map fromPackedVector eigSpan- where (μs,vsm) = HMat.eigSH' m-       eigSpan = zipWith (HMat.scale . sqrt) (HMat.toList μs) (HMat.toColumns vsm)---- | The reciprocal-space counterparts of the nonzero-EV eigenvectors, as can---   be obtained from 'eigenSpan'. The systems of vectors/dual vectors---   behave as orthonormal groups WRT each other, i.e. for each @f@---   in @'eigenCoSpan' m@ there will be exactly one @v@ in @'eigenSpan' m@---   such that @f<.>^v ≡ 1@; the other @f<.>^v@ pairings are zero.--- ---   Furthermore, @'metric' m f ≡ 1@ for each @f@ in the co-span, which might---   be seen as the actual defining characteristic of these span/co-span systems.-eigenCoSpan :: (HasMetric v, Scalar v ~ ℝ) => HerMetric' v -> [DualSpace v]-eigenCoSpan (HerMetric' Nothing) = []-eigenCoSpan (HerMetric' (Just (DenseLinear m))) = map fromPackedVector eigSpan- where (μs,vsm) = HMat.eigSH' m-       eigSpan = map (uncurry $ HMat.scale . recip . sqrt)-                 . filter ((>0) . fst)-                 $ zip (HMat.toList μs) (HMat.toColumns vsm)-eigenCoSpan' :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> [v]-eigenCoSpan' (HerMetric Nothing) = []-eigenCoSpan' (HerMetric (Just (DenseLinear m))) = map fromPackedVector eigSpan- where (μs,vsm) = HMat.eigSH' m-       eigSpan = map (uncurry $ HMat.scale . recip . sqrt)-                 . filter ((>0) . fst)-                 $ zip (HMat.toList μs) (HMat.toColumns vsm)---class HasEigenSystem m where-  type EigenVector m :: *-  -- | Generalised combination of 'eigenSpan' and 'eigenCoSpan'; this will give a-  --   maximum spanning set of vector-covector pairs @(f,v)@ such that @f<.>^v ≡ 1@-  --   and @metric m f ≡ 1@, whereas all @f@ and @v'@ from different tuples-  --   are orthogonal.-  --   It also yields the /kernel/ of singular metric, spanned by a set of stiefel-manifold-  --   points, i.e. vectors of unspecified length that correspond to the eigenvalue 0.-  -- -  --   You may also consider this as a /factorisation/ of a linear operator-  --   @𝐴 : 𝑉 → 𝑉'@ into mappings @𝑅 : 𝑉 → ℝⁿ@ and @𝐿 : ℝⁿ → 𝑉'@ (or, equivalently-  --   because ℝⁿ is a Hilbert space, @𝑅' : ℝⁿ → V'@ and @𝐿' : V → ℝⁿ@, which-  --   gives you an SVD-style inverse).-  eigenSystem :: m -> ( [Stiefel1 (EigenVector m)]-                      , [(EigenVector m, DualSpace (EigenVector m))] )--instance (HasMetric v, Scalar v ~ ℝ) => HasEigenSystem (HerMetric' v) where-  type EigenVector (HerMetric' v) = v-  eigenSystem (HerMetric' Nothing) = (fmap Stiefel1 completeBasisValues, [])-  eigenSystem (HerMetric' (Just (DenseLinear m))) = concat***concat $ unzip eigSpan-   where (μs,vsm) = HMat.eigSH' m-         eigSpan = zipWith (\μ v-                    -> if μ>0-                        then let sμ = sqrt μ-                             in ([], [( fromPackedVector $ HMat.scale sμ v-                                      , fromPackedVector $ HMat.scale (recip sμ) v )])-                        else ([Stiefel1 $ fromPackedVector v], [])-                   ) (HMat.toList μs) (HMat.toColumns vsm)--instance (HasMetric v, Scalar v ~ ℝ) => HasEigenSystem (HerMetric v) where-  type EigenVector (HerMetric v) = DualSpace v-  eigenSystem (HerMetric Nothing) = (fmap Stiefel1 completeBasisValues, [])-  eigenSystem (HerMetric (Just (DenseLinear m))) = concat***concat $ unzip eigSpan-   where (μs,vsm) = HMat.eigSH' m-         eigSpan = zipWith (\μ v-                    -> if μ>0-                        then let sμ = sqrt μ-                             in ([], [( fromPackedVector $ HMat.scale sμ v-                                      , fromPackedVector $ HMat.scale (recip sμ) v )])-                        else ([Stiefel1 $ fromPackedVector v], [])-                   ) (HMat.toList μs) (HMat.toColumns vsm)--instance (HasMetric v, Scalar v ~ ℝ) => HasEigenSystem (HerMetric' v, HerMetric' v) where-  type EigenVector (HerMetric' v, HerMetric' v) = v-  eigenSystem (n, HerMetric' (Just (DenseLinear m))) | not $ null nSpan-                                      = (++nKernel).concat***concat $ unzip eigSpan-   where (μs,vsm) = HMat.eigSH' $ fromv2ℝn HMat.<> m HMat.<> fromℝn2v'-                    -- m :: v' -> v-         eigSpan = zipWith (\μ v-                    -> if μ>0-                        then let sμ = sqrt μ-                             in ([], [( fromPackedVector $-                                        fromℝn2v HMat.#> HMat.scale sμ v-                                      , fromPackedVector $-                                        fromℝn2v' HMat.#> HMat.scale (recip sμ) v )-                                      ])-                        else ([Stiefel1 $ fromPackedVector v], [])-                   ) (HMat.toList μs) (HMat.toColumns vsm)-         fromv2ℝn = HMat.fromRows $ map (asPackedVector . snd) nSpan-         fromℝn2v' = HMat.tr fromv2ℝn-         fromℝn2v = HMat.fromColumns $ map (asPackedVector . fst) nSpan-         (nKernel, nSpan) = eigenSystem n-  eigenSystem (_, HerMetric' Nothing) = (fmap Stiefel1 completeBasisValues, [])--instance (HasMetric v, Scalar v ~ ℝ) => HasEigenSystem (HerMetric v, HerMetric v) where-  type EigenVector (HerMetric v, HerMetric v) = DualSpace v-  eigenSystem (n, HerMetric (Just (DenseLinear m))) | not $ null nSpan-                                      = (++nKernel).concat***concat $ unzip eigSpan-   where (μs,vsm) = HMat.eigSH' $ fromv'2ℝn HMat.<> m HMat.<> fromℝn2v-                    -- m :: v -> v'-         eigSpan = zipWith (\μ v-                    -> if μ>0-                        then let sμ = sqrt μ-                             in ([], [( fromPackedVector $-                                        fromℝn2v' HMat.#> HMat.scale sμ v-                                      , fromPackedVector $-                                        fromℝn2v HMat.#> HMat.scale (recip sμ) v )-                                      ])-                        else ([Stiefel1 $ fromPackedVector v], [])-                   ) (HMat.toList μs) (HMat.toColumns vsm)-         fromv'2ℝn = HMat.fromRows $ map (asPackedVector . snd) nSpan-         fromℝn2v = HMat.tr fromv'2ℝn-         fromℝn2v' = HMat.fromColumns $ map (asPackedVector . fst) nSpan-         (nKernel, nSpan) = eigenSystem n-  eigenSystem (_, _) = (fmap Stiefel1 completeBasisValues, [])----- | Constraint that a space's scalars need to fulfill so it can be used for 'HerMetric'.-type MetricScalar s = ( SmoothScalar s-                      , Ord s  -- We really rather wouldn't require this...-                      )---type HasMetric v = (HasMetric' v, HasMetric' (DualSpace v), DualSpace (DualSpace v) ~ v)----- | While the main purpose of this class is to express 'HerMetric', it's actually---   all about dual spaces.-class ( FiniteDimensional v, FiniteDimensional (DualSpace v)-      , VectorSpace (DualSpace v), HasBasis (DualSpace v)-      , MetricScalar (Scalar v), Scalar v ~ Scalar (DualSpace v) )-    => HasMetric' v where-        -  -- | @'DualSpace' v@ is isomorphic to the space of linear functionals on @v@, i.e.-  --   @v ':-*' 'Scalar' v@.-  --   Typically (for all Hilbert- / 'InnerSpace's) this is in turn isomorphic to @v@-  --   itself, which will be rather more efficient (hence the distinction between a-  --   vector space and its dual is often neglected or reduced to &#x201c;column vs row-  --   vectors&#x201d;).-  --   Mathematically though, it makes sense to keep the concepts apart, even if ultimately-  --   @'DualSpace' v ~ v@ (which needs not /always/ be the case, though!).-  type DualSpace v :: *-  type DualSpace v = v-      -  -- | Apply a dual space vector (aka linear functional) to a vector.-  (<.>^) :: DualSpace v -> v -> Scalar v-            -  -- | Interpret a functional as a dual-space vector. Like 'linear', this /assumes/-  --   (completely unchecked) that the supplied function is linear.-  functional :: (v -> Scalar v) -> DualSpace v-  -  -- | While isomorphism between a space and its dual isn't generally canonical,-  --   the /double-dual/ space should be canonically isomorphic in pretty much-  --   all relevant cases. Indeed, it is recommended that they are the very same type;-  --   this condition is enforced by the 'HasMetric' constraint (which is recommended-  --   over using 'HasMetric'' itself in signatures).-  doubleDual :: HasMetric' (DualSpace v) => v -> DualSpace (DualSpace v)-  doubleDual' :: HasMetric' (DualSpace v) => DualSpace (DualSpace v) -> v-  -  basisInDual :: Tagged v (Basis v -> Basis (DualSpace v))-  basisInDual = bid-   where bid :: ∀ v . HasMetric' v => Tagged v (Basis v -> Basis (DualSpace v))-         bid = Tagged $ bi >>> ib'-          where Tagged bi = basisIndex :: Tagged v (Basis v -> Int)-                Tagged ib' = indexBasis :: Tagged (DualSpace v) (Int -> Basis (DualSpace v))--  -  ---- | Simple flipped version of '<.>^'.-(^<.>) :: HasMetric v => v -> DualSpace v -> Scalar v-ket ^<.> bra = bra <.>^ ket---euclideanMetric' :: forall v . (HasMetric v, InnerSpace v) => HerMetric v-euclideanMetric' = HerMetric . pure . DenseLinear $ HMat.ident n- where (Tagged n) = dimension :: Tagged v Int---- -- | Associate a Hilbert space vector canonically with its dual-space counterpart,--- --   as by the Riesz representation theorem.--- --   --- --   Note that usually, Hilbert spaces should just implement @DualSpace v ~ v@,--- --   according to that same correspondence, so 'riesz' is essentially just a more explicit--- --   (and less efficient) way of writing @'id' :: v -> DualSpace v'.--- riesz :: (HasMetric v, InnerSpace v) => v -> DualSpace v--- riesz v = functional (v<.>)--- --- riesz' :: (HasMetric v, InnerSpace v) => DualSpace v -> v--- riesz' f = doubleDual' . functional (f<.>^)---instance (MetricScalar k) => HasMetric' (ZeroDim k) where-  Origin<.>^Origin = zeroV-  functional _ = Origin-  doubleDual = id; doubleDual'= id; basisInDual = pure id-instance HasMetric' Double where-  (<.>^) = (<.>)-  functional f = f 1-  doubleDual = id; doubleDual'= id; basisInDual = pure id-instance ( HasMetric v, HasMetric w, Scalar v ~ Scalar w-         ) => HasMetric' (v,w) where-  type DualSpace (v,w) = (DualSpace v, DualSpace w)-  (v,w)<.>^(v',w') = v<.>^v' + w<.>^w'-  functional f = (functional $ f . (,zeroV), functional $ f . (zeroV,))-  doubleDual = id; doubleDual'= id-  basisInDual = bid-   where bid :: ∀ v w . (HasMetric v, HasMetric w) => Tagged (v,w)-                       (Basis v + Basis w -> Basis (DualSpace v) + Basis (DualSpace w))-         bid = Tagged $ \case Left q -> Left $ bidv q-                              Right q -> Right $ bidw q-          where Tagged bidv = basisInDual :: Tagged v (Basis v -> Basis (DualSpace v))-                Tagged bidw = basisInDual :: Tagged w (Basis w -> Basis (DualSpace w))-instance (SmoothScalar s, Ord s, KnownNat n) => HasMetric' (s^n) where-  type DualSpace (s^n) = s^n-  (<.>^) = (<.>)-  functional = fnal-   where fnal :: ∀ s n . (SmoothScalar s, KnownNat n) => (s^n -> s) -> s^n-         fnal f =     FreeVect . Arr.generate n $-            \i -> f . FreeVect . Arr.generate n $ \j -> if i==j then 1 else 0-          where Tagged n = theNatN :: Tagged n Int-  doubleDual = id; doubleDual'= id; basisInDual = pure id-instance (HasMetric v, s~Scalar v) => HasMetric' (FinVecArrRep t v s) where-  type DualSpace (FinVecArrRep t v s) = FinVecArrRep t (DualSpace v) s-  FinVecArrRep v <.>^ FinVecArrRep w = HMat.dot v w-  functional = fnal-   where fnal :: ∀ v . HasMetric v =>-                 (FinVecArrRep t v (Scalar v) -> Scalar v)-                       -> FinVecArrRep t (DualSpace v) (Scalar v)-         fnal f = FinVecArrRep . (n HMat.|>)-                     $ (f . FinVecArrRep) <$> HMat.toRows (HMat.ident n)-         Tagged n = dimension :: Tagged v Int-  doubleDual = id; doubleDual'= id-  basisInDual = bid-   where bid :: ∀ s v t . (HasMetric v, s~Scalar v)-                     => Tagged (FinVecArrRep t v s) (Basis v -> Basis (DualSpace v))-         bid = Tagged bid₀-          where Tagged bid₀ = basisInDual :: Tagged v (Basis v -> Basis (DualSpace v))--instance (HasMetric v, HasMetric w, s ~ Scalar v, s ~ Scalar w)-               => HasMetric' (Linear s v w) where-  type DualSpace (Linear s v w) = Linear s w v-  DenseLinear bw <.>^ DenseLinear fw-                  = HMat.sumElements (HMat.tr bw * fw) -- trace of product-  functional = completeBasisFunctional-  doubleDual = id; doubleDual' = id--completeBasisFunctional :: ∀ v . HasMetric' v => (v -> Scalar v) -> DualSpace v-completeBasisFunctional f = recompose [ (bid b, f $ basisValue b) | b <- cb ]-          where Tagged cb = completeBasis :: Tagged v [Basis v]-                Tagged bid = basisInDual :: Tagged v (Basis v -> Basis (DualSpace v))------- | Transpose a linear operator. Contrary to popular belief, this does not---   just inverse the direction of mapping between the spaces, but also switch to---   their duals.-adjoint :: (HasMetric v, HasMetric w, s~Scalar v, s~Scalar w)-     => (Linear s v w) -> Linear s (DualSpace w) (DualSpace v)-adjoint (DenseLinear m) = DenseLinear $ HMat.tr m--adjoint_fln :: (HasMetric v, HasMetric w, Scalar w ~ Scalar v)-     => (v :-* w) -> DualSpace w :-* DualSpace v-adjoint_fln m = linear $ \w -> functional $ \v-                     -> w <.>^lapply m v----metrConst :: forall v. (HasMetric v, v ~ DualSpace v, Num (Scalar v))-                 => Scalar v -> HerMetric v-metrConst μ = matrixMetric $ HMat.scale μ (HMat.ident dim)- where (Tagged dim) = dimension :: Tagged v Int--instance (HasMetric v, v ~ DualSpace v, Num (Scalar v)) => Num (HerMetric v) where-  fromInteger = metrConst . fromInteger-  (+) = (^+^)-  negate = negateV-           -  -- | This does /not/ work correctly if the metrics don't share an eigenbasis!-  HerMetric m * HerMetric n = HerMetric . fmap DenseLinear-                              $ liftA2 (HMat.<>) (getDenseMatrix<$>m) (getDenseMatrix<$>n)-                              -  -- | Undefined, though it could actually be done.-  abs = error "abs undefined for HerMetric"-  signum = error "signum undefined for HerMetric"---metrNumFun :: (HasMetric v, v ~ Scalar v, v ~ DualSpace v, Num v)-      => (v -> v) -> HerMetric v -> HerMetric v-metrNumFun f (HerMetric Nothing) = matrixMetric . HMat.scalar $ f 0-metrNumFun f (HerMetric (Just (DenseLinear m)))-              = matrixMetric . HMat.scalar . f $ m HMat.! 0 HMat.! 0--instance (HasMetric v, v ~ Scalar v, v ~ DualSpace v, Fractional v) -            => Fractional (HerMetric v) where-  fromRational = metrConst . fromRational-  recip = metrNumFun recip--instance (HasMetric v, v ~ Scalar v, v ~ DualSpace v, Floating v)-            => Floating (HerMetric v) where-  pi = metrConst pi-  sqrt = metrNumFun sqrt-  exp = metrNumFun exp-  log = metrNumFun log-  sin = metrNumFun sin-  cos = metrNumFun cos-  tan = metrNumFun tan-  asin = metrNumFun asin-  acos = metrNumFun acos-  atan = metrNumFun atan-  sinh = metrNumFun sinh-  cosh = metrNumFun cosh-  asinh = metrNumFun asinh-  atanh = metrNumFun atanh-  acosh = metrNumFun acosh-----normaliseWith :: HasMetric v => HerMetric v -> v -> Option v-normaliseWith m v = case metric m v of-                      0 -> empty-                      μ -> pure (v ^/ μ)--orthonormalPairsWith :: forall v . HasMetric v => HerMetric v -> [v] -> [(v, DualSpace v)]-orthonormalPairsWith met = mkON- where mkON :: [v] -> [(v, DualSpace v)]    -- Generalised Gram-Schmidt process-       mkON [] = []-       mkON (v:vs) = let onvs = mkON vs-                         v' = List.foldl' (\va (vb,pb) -> va ^-^ vb ^* (pb <.>^ va)) v onvs-                         p' = toDualWith met v'-                     in case sqrt (p' <.>^ v') of-                         0 -> onvs-                         μ -> (v'^/μ, p'^/μ) : onvs-                     ----- | Project a metric on each of the factors of a product space. This works by---   projecting the eigenvectors into both subspaces.-factoriseMetric :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-               => HerMetric (v,w) -> (HerMetric v, HerMetric w)-factoriseMetric (HerMetric Nothing) = (HerMetric Nothing, HerMetric Nothing)-factoriseMetric met = (projectors *** projectors) . unzip $ eigenSpan' met--factoriseMetric' :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-               => HerMetric' (v,w) -> (HerMetric' v, HerMetric' w)-factoriseMetric' met = (projector's *** projector's) . unzip $ eigenSpan met--productMetric :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-               => HerMetric v -> HerMetric w -> HerMetric (v,w)-productMetric (HerMetric Nothing) (HerMetric Nothing) = HerMetric Nothing-productMetric (HerMetric (Just mv)) (HerMetric (Just mw)) = HerMetric . Just $ mv *** mw-productMetric (HerMetric Nothing) (HerMetric (Just mw)) = HerMetric . Just $ zeroV *** mw-productMetric (HerMetric (Just mv)) (HerMetric Nothing) = HerMetric . Just $ mv *** zeroV--productMetric' :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-               => HerMetric' v -> HerMetric' w -> HerMetric' (v,w)-productMetric' (HerMetric' Nothing) (HerMetric' Nothing) = HerMetric' Nothing-productMetric' (HerMetric' (Just mv)) (HerMetric' (Just mw)) = HerMetric' . Just $ mv***mw-productMetric' (HerMetric' Nothing) (HerMetric' (Just mw)) = HerMetric' . Just $ zeroV***mw-productMetric' (HerMetric' (Just mv)) (HerMetric' Nothing) = HerMetric' . Just $ mv***zeroV---applyLinMapMetric :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-               => HerMetric (Linear ℝ v w) -> DualSpace v -> HerMetric w-applyLinMapMetric met v' = transformMetric ap2v met- where ap2v :: Linear ℝ w (Linear ℝ v w)-       ap2v = denseLinear $ \w -> denseLinear $ \v -> w ^* (v'<.>^v)--applyLinMapMetric' :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-               => HerMetric' (Linear ℝ v w) -> v -> HerMetric' w-applyLinMapMetric' met v = transformMetric' ap2v met- where ap2v :: Linear ℝ (Linear ℝ v w) w-       ap2v = denseLinear ($v)----imitateMetricSpanChange :: ∀ v . (HasMetric v, Scalar v ~ ℝ)-                           => HerMetric v -> HerMetric' v -> Linear ℝ v v-imitateMetricSpanChange (HerMetric (Just m)) (HerMetric' (Just n)) = n . m-imitateMetricSpanChange _ _ = zeroV---covariance :: ∀ v w . (HasMetric v, HasMetric w, Scalar v ~ ℝ, Scalar w ~ ℝ)-          => HerMetric' (v,w) -> Option (Linear ℝ v w)-covariance (HerMetric' Nothing) = pure zeroV-covariance (HerMetric' (Just m))-    | isInfinite' detvnm  = empty-    | otherwise           = return $ snd . m . (id&&&zeroV) . DenseLinear vnorml- where (vnorml, (detvnm, _))-           = HMat.invlndet . getDenseMatrix $ fst . m . (id&&&zeroV)---volumeRatio :: HasMetric v => HerMetric v -> HerMetric v -> Scalar v-volumeRatio (HerMetric Nothing) (HerMetric Nothing) = 1-volumeRatio (HerMetric _) (HerMetric Nothing) = 0-volumeRatio (HerMetric (Just (DenseLinear m₁)))-            (HerMetric (Just (DenseLinear m₂)))-    = HMat.det m₂ / HMat.det m₁-volumeRatio (HerMetric Nothing) (HerMetric _) = 1/0--euclideanRelativeMetricVolume :: (HasMetric v, InnerSpace v) => HerMetric v -> Scalar v-euclideanRelativeMetricVolume (HerMetric Nothing) = 1/0-euclideanRelativeMetricVolume (HerMetric (Just (DenseLinear m))) = recip $ HMat.det m--tryMetricAsLength :: HerMetric ℝ -> Option ℝ-tryMetricAsLength m = case metricSq m 1 of-   o | o > 0      -> pure . sqrt $ recip o-     | otherwise  -> empty---- | Unsafe version of 'tryMetricAsLength', only works reliable if the metric---   is strictly positive definite.-metricAsLength :: HerMetric ℝ -> ℝ-metricAsLength m = case metricSq m 1 of-   o | o >= 0     -> sqrt $ recip o-     | o < 0      -> error "Metric fails to be positive definite!"-     | otherwise  -> error "Metric yields NaN."--metricFromLength :: ℝ -> HerMetric ℝ-metricFromLength = projector . recip--metric'AsLength :: HerMetric' ℝ -> ℝ-metric'AsLength = sqrt . (`metric'`1)---spanHilbertSubspace :: ∀ s v w-   . (HasMetric v, Scalar v ~ s, IsFreeSpace w, Scalar w ~ s)-      => HerMetric v   -- ^ Metric to induce the inner product on the Hilbert space.-          -> [v]       -- ^ @n@ linearly independent vectors, to span the subspace @w@.-          -> Option (Embedding (Linear s) w v)-                  -- ^ An embedding of the @n@-dimensional free subspace @w@ (if the given-                  --   vectors actually span such a space) into the main space @v@.-                  --   Regardless of the structure of @v@ (which doesn't need to have an-                  --   inner product at all!), @w@ will be an 'InnerSpace' with the scalar-                  --   product defined by the given metric.-spanHilbertSubspace met = emb . orthonormalPairsWith met- where emb onb'-         | n'==n      = return $ Embedding emb prj . arr identityMatrix-         | otherwise  = empty-        where emb = DenseLinear . HMat.fromColumns $ (asPackedVector . fst) <$> onb-              prj = DenseLinear . HMat.fromRows    $ (asPackedVector . snd) <$> onb-              n' = length onb'-              onb = take n onb'-              (Tagged n) = theNatN :: Tagged (FreeDimension w) Int----- | Same as 'spanHilbertSubspace', but with the standard 'euclideanMetric' (i.e., the---   basis vectors will be orthonormal in the usual sense, in both @w@ and @v@).-spanSubHilbertSpace :: ∀ s v w-        . (HasMetric v, InnerSpace v, Scalar v ~ s, IsFreeSpace w, Scalar w ~ s)-      => [v]-          -> Option (Embedding (Linear s) w v)-spanSubHilbertSpace = spanHilbertSubspace euclideanMetric'---orthogonalComplementSpan :: ∀ v . (HasMetric v, Scalar v ~ ℝ)-                            => [Stiefel1 (DualSpace v)] -> [Stiefel1 v]-orthogonalComplementSpan avoidSpace-           = fst ( iterate nextOVect ( [], ( cycle completeBasisValues-                                           , pseudoRieszPair <$> avoidSpace ) )-                    !! (d - lav) )- where Tagged d = dimension :: Tagged v Int-       lav = length avoidSpace-       nextOVect (result, (v:src, avoid))-           | Option (Just newAvoid@(vfin', _)) <- mkPseudoRieszPair vPurged-                          = (Stiefel1 vfin':result, (src, newAvoid : avoid))-        where vPurged = foldl (\vp (av', av) -> vp ^-^ av ^* (vp^<.>av')) v avoid----- | The /n/-th Stiefel manifold is the space of all possible configurations of---   /n/ orthonormal vectors. In the case /n/ = 1, simply the subspace of normalised---   vectors, i.e. equivalent to the 'UnitSphere'. Even so, it strictly speaking---   requires the containing space to be at least metric (if not Hilbert); we would---   however like to be able to use this concept also in spaces with no inner product,---   therefore we define this space not as normalised vectors, but rather as all---   vectors modulo scaling by positive factors.-newtype Stiefel1 v = Stiefel1 { getStiefel1N :: DualSpace v }--pseudoRieszPair :: (HasMetric v, Scalar v ~ ℝ) => Stiefel1 v -> (v, DualSpace v)-pseudoRieszPair (Stiefel1 v')-              = (fromPackedVector $ HMat.scale (1/HMat.norm_2 vp) vp, v')- where vp = asPackedVector v'--mkPseudoRieszPair :: (HasMetric v, Scalar v ~ ℝ) => DualSpace v -> Option (v, DualSpace v)-mkPseudoRieszPair v'-   | nv' > 0    = pure (fromPackedVector $ HMat.scale (1/nv') vp, v')-   | otherwise  = empty- where vp = asPackedVector v'-       nv' = HMat.norm_2 vp-----instance (HasMetric v, Scalar v ~ Double, Show (DualSpace v)) => Show (HerMetric v) where-  showsPrec p m-    | null eigSp  = showString "zeroV"-    | otherwise   = showParen (p>5)-                      . foldr1 ((.) . (.(" ^+^ "++)))-                      $ ((("projector "++).).showsPrec 10)<$>eigSp-   where eigSp = eigenSpan' m--instance (HasMetric v, Scalar v ~ Double, Show v) => Show (HerMetric' v) where-  showsPrec p m-    | null eigSp  = showString "zeroV"-    | otherwise   = showParen (p>5)-                      . foldr1 ((.) . (.(" ^+^ "++)))-                      $ ((("projector' "++).).showsPrec 10)<$>eigSp-   where eigSp = eigenSpan m----------linMapAsTensProd :: (FiniteDimensional v, FiniteDimensional w, Scalar v~Scalar w)-                    => v:-*w -> DualSpace v ⊗ w-linMapAsTensProd f = DensTensProd $ asPackedMatrix f--linMapFromTensProd :: (FiniteDimensional v, FiniteDimensional w, Scalar v~Scalar w)-                    => DualSpace v ⊗ w -> v:-*w-linMapFromTensProd (DensTensProd m) = linear $-                         asPackedVector >>> HMat.app m >>> fromPackedVector----(⊗) :: (HasMetric v, FiniteDimensional w, Scalar v ~ s, Scalar w ~ s)-                    => w -> DualSpace v -> Linear s v w-w ⊗ v' = DenseLinear $ HMat.outer wDecomp v'Decomp- where wDecomp = asPackedVector w-       v'Decomp = asPackedVector v'--outerProducts :: (HasMetric v, FiniteDimensional w, Scalar v ~ s, Scalar w ~ s)-                    => [(w, DualSpace v)] -> Linear s v w-outerProducts [] = zeroV-outerProducts pds = DenseLinear $ HMat.fromColumns (asPackedVector.fst<$>pds)-                          HMat.<> HMat.fromRows    (asPackedVector.snd<$>pds)--instance ∀ v w s . ( HasMetric v, FiniteDimensional w-                   , Show (DualSpace v), Show w, Scalar v ~ s, Scalar w ~ s )-    => Show (Linear s v w) where-  showsPrec p f = showParen (p>9) $ ("outerProducts "++)-        . shows [ (w, v' :: DualSpace v)-                | (v,v') <- zip completeBasisValues completeBasisValues-                , let w = f $ v ]-  -
Data/Manifold/Cone.hs view
@@ -36,15 +36,13 @@ import Data.Semigroup  import Data.VectorSpace-import Data.LinearMap.HerMetric import Data.Tagged import Data.Manifold.Types.Primitive+import Data.Manifold.Types.Stiefel+import Math.LinearMap.Category  import Data.CoNat-import Data.VectorSpace.FiniteDimensional -import qualified Numeric.LinearAlgebra.HMatrix as HMat- import qualified Prelude import qualified Control.Applicative as Hask @@ -57,9 +55,9 @@   -type ConeVecArr m = FinVecArrRep Cℝay (CℝayInterior m) (Scalar (Needle m))+newtype ConeVecArr m = ConeVecArr {getConeVecArr :: CℝayInterior m} type ConeNeedle m = Needle (ConeVecArr m)-type SConn'dConeVecArr m = FinVecArrRep Cℝay (ℝ, Interior m) ℝ+data SConn'dConeVecArr m = SConn'dConeVecArr ℝ (Interior m)   class ( Semimanifold m, Semimanifold (Interior (Interior m))@@ -84,7 +82,7 @@   -instance (ConeSemimfd m) => Semimanifold (Cℝay m) where+instance ∀ m . (ConeSemimfd m) => Semimanifold (Cℝay m) where   type Needle (Cℝay m) = ConeNeedle m   type Interior (Cℝay m) = ConeVecArr m   fromInterior = fromCℝayInterior@@ -94,6 +92,8 @@          ctp = Tagged ctp'           where Tagged ctp' = translateP                   :: Tagged (ConeVecArr m) (ConeVecArr m -> ConeNeedle m -> ConeVecArr m)+  semimanifoldWitness = case semimanifoldWitness :: SemimanifoldWitness (ConeVecArr m) of+                          SemimanifoldWitness -> SemimanifoldWitness    instance (ConeSemimfd m) => Semimanifold (CD¹ m) where   type Needle (CD¹ m) = ConeNeedle m@@ -105,137 +105,17 @@          ctp = Tagged ctp'           where Tagged ctp' = translateP                   :: Tagged (ConeVecArr m) (ConeVecArr m -> ConeNeedle m -> ConeVecArr m)+  semimanifoldWitness = case semimanifoldWitness :: SemimanifoldWitness (ConeVecArr m) of+                          SemimanifoldWitness -> SemimanifoldWitness -instance (ConeSemimfd m, SmoothScalar (Scalar (Needle m))) => PseudoAffine (Cℝay m) where-  p.-~.i = (.-~.i) =<< toInterior p-instance (ConeSemimfd m, SmoothScalar (Scalar (Needle m))) => PseudoAffine (CD¹ m) where-  p.-~.i = (.-~.i) =<< toInterior p  -instance ConeSemimfd (ZeroDim ℝ) where-  type CℝayInterior (ZeroDim ℝ) = ℝ-  fromCℝayInterior (FinVecArrRep qb) | HMat.size qb == 0  = Cℝay 1 Origin-                                     | x <- qb HMat.! 0   = Cℝay (bijectℝtoℝplus x) Origin -  toCℝayInterior (Cℝay 0 Origin) = empty-  toCℝayInterior (Cℝay y Origin) = pure . FinVecArrRep $ 1 HMat.|>[bijectℝplustoℝ y]-instance ConeSemimfd ℝ where-  type CℝayInterior ℝ = ℝ²-  fromCℝayInterior (FinVecArrRep qb) = Cℝay (q'+b') (q'-b')-   where [q', b'] = HMat.toList $ HMat.cmap ((/2) . bijectℝtoℝplus) qb-  toCℝayInterior (Cℝay 0 _) = empty-  toCℝayInterior (Cℝay h x) = pure . FinVecArrRep -                              . HMat.cmap bijectℝplustoℝ $ HMat.fromList [h+x, h-x]-  fromCD¹Interior (FinVecArrRep qb) = CD¹ (bijectℝplustoIntv $ q'+b') (q'-b')-   where [q', b'] = HMat.toList $ HMat.cmap ((/2) . bijectℝtoℝplus) qb-  toCD¹Interior (CD¹ h x) = pure . FinVecArrRep-                              . HMat.cmap bijectℝplustoℝ $ HMat.fromList [h'+x, h'-x]-   where h' = bijectIntvtoℝplus h -instance ConeSemimfd S⁰ where-  type CℝayInterior S⁰ = ℝ-  fromCℝayInterior xa | x>0        = Cℝay x PositiveHalfSphere-                      | otherwise  = Cℝay (-x) NegativeHalfSphere-   where x = getFinVecArrRep xa HMat.! 0-  toCℝayInterior (Cℝay x PositiveHalfSphere) = return . FinVecArrRep $ HMat.scalar x-  toCℝayInterior (Cℝay x NegativeHalfSphere) = return . FinVecArrRep . HMat.scalar $ -x-  fromCD¹Interior xa | x>0        = CD¹ (bijectℝtoIntv x) PositiveHalfSphere-                     | otherwise  = CD¹ (-bijectℝtoIntv x) NegativeHalfSphere-   where x = getFinVecArrRep xa HMat.! 0-  toCD¹Interior (CD¹ 1 _) = empty-  toCD¹Interior (CD¹ x PositiveHalfSphere)-        = return . FinVecArrRep . HMat.scalar $ bijectIntvtoℝ x-  toCD¹Interior (CD¹ x NegativeHalfSphere)-        = return . FinVecArrRep . HMat.scalar $ -bijectℝtoIntv x---instance ConeSemimfd S¹ where-  type CℝayInterior S¹ = ℝ²-  fromCℝayInterior (FinVecArrRep xy) = Cℝay r (S¹ $ atan2 y x)-   where r = HMat.norm_2 xy-         [x,y] = HMat.toList xy-  toCℝayInterior (Cℝay r (S¹ φ)) = return . FinVecArrRep-                    . HMat.scale r $ HMat.fromList [cos φ, sin φ]-  fromCD¹Interior (FinVecArrRep xy) = CD¹ (bijectℝtoIntv r) (S¹ $ atan2 y x)-   where r = HMat.norm_2 xy-         [x,y] = HMat.toList xy-  toCD¹Interior (CD¹ 1 _) = empty-  toCD¹Interior (CD¹ r (S¹ φ)) = return . FinVecArrRep-                    . HMat.scale r' $ HMat.fromList [cos φ, sin φ]-   where r' = bijectIntvtoℝ r---instance ConeSemimfd S² where-  type CℝayInterior S² = ℝ³-  fromCℝayInterior (FinVecArrRep xyz) = Cℝay r (S² (acos $ z/r) (atan2 y x))-   where r = HMat.norm_2 xyz-         [x,y,z] = HMat.toList xyz-  toCℝayInterior (Cℝay r (S² ϑ φ)) = return . FinVecArrRep-                    . HMat.scale r $ HMat.fromList [w*x₀, w*y₀, z₀]-   where x₀ = cos φ; y₀ = sin φ; z₀ = cos ϑ; w = sin ϑ-                                         --- | Products of simply connected spaces.-instance ( PseudoAffine x, PseudoAffine y-         , WithField ℝ HilbertSpace (Interior x), WithField ℝ HilbertSpace (Interior y)-         , LinearManifold (FinVecArrRep Cℝay (ℝ, (Interior x, Interior y)) ℝ)-         ) => ConeSemimfd (x,y) where-  type CℝayInterior (x,y) = (ℝ, (Interior x, Interior y))-  fromCℝayInterior = simplyCncted_fromCℝayInterior-  toCℝayInterior = simplyCncted_toCℝayInterior -instance ( KnownNat n ) => ConeSemimfd (ℝ^n) where-  type CℝayInterior (ℝ^n) = (ℝ, ℝ^n)-  fromCℝayInterior = simplyCncted_fromCℝayInterior-  toCℝayInterior = simplyCncted_toCℝayInterior -instance ( HilbertSpace (FinVecArrRep t v ℝ) ) => ConeSemimfd (FinVecArrRep t v ℝ) where-  type CℝayInterior (FinVecArrRep t v ℝ) = (ℝ, FinVecArrRep t v ℝ)-  fromCℝayInterior = simplyCncted_fromCℝayInterior-  toCℝayInterior = simplyCncted_toCℝayInterior---  -instance ( WithField ℝ ConeSemimfd x, PseudoAffine (Cℝay x)-         , HilbertSpace (CℝayInterior x)-         , HilbertSpace (FinVecArrRep Cℝay (CℝayInterior x) ℝ)-         ) => ConeSemimfd (CD¹ x) where-  type CℝayInterior (CD¹ x) = (ℝ, ConeVecArr x)-  fromCℝayInterior i = Cℝay h (embCℝayToCD¹ o)-   where (Cℝay h o) = simplyCncted_fromCℝayInterior i-  toCℝayInterior (Cℝay _ (CD¹ 1 _)) = empty-  toCℝayInterior (Cℝay h p) = simplyCncted_toCℝayInterior $ Cℝay h (projCD¹ToCℝay p)-  -  -instance ( WithField ℝ ConeSemimfd x, PseudoAffine (Cℝay x)-         , HilbertSpace (CℝayInterior x)-         , HilbertSpace (FinVecArrRep Cℝay (CℝayInterior x) ℝ)-         ) => ConeSemimfd (Cℝay x) where-  type CℝayInterior (Cℝay x) = (ℝ, ConeVecArr x)-  fromCℝayInterior = simplyCncted_fromCℝayInterior-  toCℝayInterior = simplyCncted_toCℝayInterior-  -  -simplyCncted_fromCℝayInterior :: (PseudoAffine x, WithField ℝ HilbertSpace (Interior x))-        => SConn'dConeVecArr x -> Cℝay x-simplyCncted_fromCℝayInterior (FinVecArrRep ri) = Cℝay h . fromInterior . fromPackedVector-                         $ subtract (h/n) `Arr.map` Arr.tail cmps-   where h = Arr.sum cmps-         cmps = bijectℝtoℝplus `HMat.cmap` ri-         n = fromIntegral $ Arr.length cmps-  -simplyCncted_toCℝayInterior :: (PseudoAffine x, WithField ℝ HilbertSpace (Interior x))-        => Cℝay x -> Option (SConn'dConeVecArr x)-simplyCncted_toCℝayInterior (Cℝay h v) | h/=0, Option (Just vi) <- toInterior v -   = let cmps'' = asPackedVector vi-         cmps' = (+ h/n) `HMat.cmap` cmps''-         cmps = (h - Arr.sum cmps') `Arr.cons` cmps-         n = fromIntegral $ Arr.length cmps-     in return $ FinVecArrRep (bijectℝplustoℝ `Arr.map` cmps)-simplyCncted_toCℝayInterior (Cℝay _ _) = empty-- -- Some essential homeomorphisms bijectℝtoℝplus      , bijectℝplustoℝ  , bijectIntvtoℝplus, bijectℝplustoIntv@@ -265,15 +145,15 @@   stiefel1Project :: LinearManifold v =>-             DualSpace v       -- ^ Must be nonzero.+             DualVector v       -- ^ Must be nonzero.                  -> Stiefel1 v stiefel1Project = Stiefel1 -stiefel1Embed :: HilbertSpace v => Stiefel1 v -> v+stiefel1Embed :: (HilbertSpace v, RealFloat (Scalar v)) => Stiefel1 v -> v stiefel1Embed (Stiefel1 n) = normalized n    -class (PseudoAffine v, InnerSpace v, NaturallyEmbedded (UnitSphere v) (DualSpace v))+class (PseudoAffine v, InnerSpace v, NaturallyEmbedded (UnitSphere v) (DualVector v))           => HasUnitSphere v where   type UnitSphere v :: *   stiefel :: UnitSphere v -> Stiefel1 v@@ -282,13 +162,10 @@   unstiefel = coEmbed . getStiefel1N  instance HasUnitSphere ℝ  where type UnitSphere ℝ  = S⁰-instance HasUnitSphere (FinVecArrRep t ℝ ℝ) where type UnitSphere (FinVecArrRep t ℝ ℝ)   = S⁰  instance HasUnitSphere ℝ² where type UnitSphere ℝ² = S¹-instance HasUnitSphere (FinVecArrRep t ℝ² ℝ) where type UnitSphere (FinVecArrRep t ℝ² ℝ) = S¹  instance HasUnitSphere ℝ³ where type UnitSphere ℝ³ = S²-instance HasUnitSphere (FinVecArrRep t ℝ³ ℝ) where type UnitSphere (FinVecArrRep t ℝ³ ℝ) = S²   
Data/Manifold/DifferentialEquation.hs view
@@ -49,8 +49,7 @@ import Data.Semigroup  import Data.VectorSpace-import Data.LinearMap.HerMetric-import Data.LinearMap.Category+import Math.LinearMap.Category import Data.AffineSpace import Data.Basis @@ -61,7 +60,6 @@ import Data.Manifold.TreeCover import Data.Manifold.Web -import qualified Numeric.LinearAlgebra.HMatrix as HMat import qualified Data.List as List  import qualified Prelude as Hask hiding(foldl, sum, sequence)@@ -78,13 +76,15 @@ import Data.Traversable.Constrained (Traversable, traverse)  -constLinearDEqn :: (WithField ℝ LinearManifold x, WithField ℝ LinearManifold y)-              => Linear ℝ (DualSpace y) (Linear ℝ y x) -> DifferentialEqn x y+constLinearDEqn :: ( WithField ℝ LinearManifold x, SimpleSpace x+                   , WithField ℝ LinearManifold y, SimpleSpace y )+              => (DualVector y +> (y +> x)) -> DifferentialEqn x y constLinearDEqn bwt = factoriseShade-    >>> \(_x, Shade y δy) -> let j = bwt'm HMat.<\> (asPackedVector y)-                                 δj = bwt' `transformMetric` recipMetric δy-                             in Shade' (fromPackedVector j) δj- where bwt'@(DenseLinear bwt'm) = adjoint bwt+    >>> \(_x, Shade y δy) -> let j = bwt'inv y+                                 δj = bwt' `transformNorm` dualNorm δy+                             in Shade' j δj+ where bwt' = adjoint $ bwt+       bwt'inv = (bwt'\$)   -- | A function that variates, relatively speaking, most strongly@@ -93,25 +93,33 @@ --   approaches 0. --    --   The idea is that if you consider the ratio of two function values,---   it will be close to 1 if both arguments on the same side of 1,---   even if their ratio is large.+--   it will be close to 1 if either both arguments are much smaller or both+--   much larger than 1, even if the ratio of these arguments is large. --   Only if both arguments are close to 1, or lie on opposite sides --   of it, will the ratio of the function values will be significant. goalSensitive :: ℝ -> ℝ goalSensitive η =  0.3 + sqrt (η * (1 + η/(1+η)) / (3 + η)) -euclideanVolGoal :: WithField ℝ EuclidSpace y => ℝ -> x -> Shade' y -> ℝ+euclideanVolGoal :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y))+                          => ℝ -> x -> Shade' y -> ℝ euclideanVolGoal vTgt _ (Shade' _ shy) = goalSensitive η  where η = euclideanRelativeMetricVolume shy / vTgt -maxDeviationsGoal :: WithField ℝ EuclidSpace y => [Needle y] -> x -> Shade' y -> ℝ-maxDeviationsGoal = uncertaintyGoal . projector's+euclideanRelativeMetricVolume :: (SimpleSpace y, HilbertSpace y) => Norm y -> Scalar y+euclideanRelativeMetricVolume (Norm m) = recip . roughDet . arr $ ue . m+ where Norm ue = euclideanNorm -uncertaintyGoal :: WithField ℝ EuclidSpace y => Metric' y -> x -> Shade' y -> ℝ+maxDeviationsGoal :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y))+                        => [Needle y] -> x -> Shade' y -> ℝ+maxDeviationsGoal = uncertaintyGoal . spanNorm++uncertaintyGoal :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y))+                      => Metric' y -> x -> Shade' y -> ℝ uncertaintyGoal = uncertaintyGoal' . const -uncertaintyGoal' :: WithField ℝ EuclidSpace y => (x -> Metric' y) -> x -> Shade' y -> ℝ+uncertaintyGoal' :: (WithField ℝ EuclidSpace y, SimpleSpace (Needle y))+                         => (x -> Metric' y) -> x -> Shade' y -> ℝ uncertaintyGoal' f x (Shade' _ shy)-         = List.sum [goalSensitive $ 1 / metricSq' m q | q <- shySpan]- where shySpan = eigenSpan' shy+         = List.sum [goalSensitive $ 1 / normSq m q | q <- shySpan]+ where shySpan = normSpanningSystem shy        m = f x
Data/Manifold/Griddable.hs view
@@ -38,7 +38,7 @@ import Data.List hiding (filter, all, elem, sum) import Data.Maybe -import Data.LinearMap.HerMetric+import Math.LinearMap.Category  import Data.Manifold.Types import Data.Manifold.Types.Primitive ((^), (^.))@@ -97,7 +97,7 @@    where l = c - expa          r = c + expa          -         expa = metric'AsLength expa'+         expa = normalLength expa'                    (Just ax) = find ((>=n) . axisGrLength)                 $ [ let qe = 10^^lqe' * nb@@ -110,20 +110,21 @@                 | n < 0      = floor $ lg (-n)  -instance (Griddable m a, Griddable n a) => Griddable (m,n) a where+instance ( SimpleSpace (Needle m), SimpleSpace (Needle n), SimpleSpace (Needle a)+         , Griddable m a, Griddable n a ) => Griddable (m,n) a where   data GriddingParameters (m,n) a = PairGriddingParameters {                fstGriddingParams :: GriddingParameters m a              , sndGriddingParams :: GriddingParameters n a }   mkGridding (PairGriddingParameters p₁ p₂) n (Shade (c₁,c₂) e₁e₂)           = ( gshmap ( uncurry fullShade . (                  (,c₂).(^.shadeCtr)-                                         &&& (`productMetric'`e₂).(^.shadeExpanse)) )+                                         &&& (`sumSubspaceNorms`e₂).(^.shadeExpanse)) )               <$> g₁s )          ++ ( gshmap ( uncurry fullShade . (                  (c₁,).(^.shadeCtr)-                                         &&& ( productMetric' e₁).(^.shadeExpanse)) )+                                         &&& ( sumSubspaceNorms e₁).(^.shadeExpanse)) )               <$> g₂s )    where g₁s = mkGridding p₁ n $ fullShade c₁ e₁          g₂s = mkGridding p₂ n $ fullShade c₂ e₂-         (e₁,e₂) = factoriseMetric' e₁e₂ +         (e₁,e₂) = summandSpaceNorms e₁e₂   prettyFloatShow :: Int -> Double -> String prettyFloatShow _ 0 = "0"@@ -144,11 +145,11 @@ shade2Intvl :: Shade ℝ -> Interval shade2Intvl sh = Interval l r  where c = sh ^. shadeCtr-       expa = metric'AsLength $ sh ^. shadeExpanse+       expa = normalLength $ sh ^. shadeExpanse        l = c - expa; r = c + expa  intvl2Shade :: Interval -> Shade ℝ-intvl2Shade (Interval l r) = fullShade c (projector' expa)+intvl2Shade (Interval l r) = fullShade c (spanNorm [expa])  where c = (l+r) / 2        expa = (r-l) / 2        
Data/Manifold/PseudoAffine.hs view
@@ -37,6 +37,7 @@ {-# LANGUAGE RankNTypes               #-} {-# LANGUAGE TupleSections            #-} {-# LANGUAGE ConstraintKinds          #-}+{-# LANGUAGE DefaultSignatures        #-} {-# LANGUAGE PatternGuards            #-} {-# LANGUAGE TypeOperators            #-} {-# LANGUAGE UnicodeSyntax            #-}@@ -56,17 +57,18 @@             , Metric, Metric', euclideanMetric             , RieMetric, RieMetric'             -- ** Constraints+            , SemimanifoldWitness(..)             , RealDimension, AffineManifold             , LinearManifold             , WithField-            , HilbertSpace+            , HilbertManifold             , EuclidSpace             , LocallyScalable             -- ** Local functions             , LocalLinear, LocalAffine             -- * Misc-            , alerpB, palerp, palerpB, LocallyCoercible(..)-            , ImpliesMetric(..)+            , alerpB, palerp, palerpB, LocallyCoercible(..), CanonicalDiffeomorphism(..)+            , ImpliesMetric(..), coerceMetric, coerceMetric'             ) where      @@ -76,16 +78,20 @@ import Data.Fixed  import Data.VectorSpace+import Linear.V0+import Linear.V1+import Linear.V2+import Linear.V3+import Linear.V4+import qualified Linear.Affine as LinAff import Data.Embedding import Data.LinearMap-import Data.LinearMap.HerMetric-import Data.LinearMap.Category+import Math.LinearMap.Category import Data.AffineSpace import Data.Tagged import Data.Manifold.Types.Primitive  import Data.CoNat-import Data.VectorSpace.FiniteDimensional  import qualified Prelude import qualified Control.Applicative as Hask@@ -99,11 +105,20 @@   +-- | This is the reified form of the property that the interior of a semimanifold+--   is a manifold.+data SemimanifoldWitness x where+  SemimanifoldWitness ::+      ( Semimanifold (Interior x), Semimanifold (Needle x)+      , Interior (Interior x) ~ Interior x, Needle (Interior x) ~ Needle x+      , Interior (Needle x) ~ Needle x )+     => SemimanifoldWitness x++ infix 6 .-~. infixl 6 .+~^, .-~^ -class ( AdditiveGroup (Needle x), Interior (Interior x) ~ Interior x )-          => Semimanifold x where+class AdditiveGroup (Needle x) => Semimanifold x where   {-# MINIMAL ((.+~^) | fromInterior), toInterior, translateP #-}   -- | The space of &#x201c;natural&#x201d; ways starting from some reference point   --   and going to some particular target point. Hence,@@ -160,6 +175,14 @@   --   instance).   (.-~^) :: Interior x -> Needle x -> x   p .-~^ v = p .+~^ negateV v+  +  semimanifoldWitness :: SemimanifoldWitness x+  default semimanifoldWitness ::+      ( Semimanifold (Interior x), Semimanifold (Needle x)+      , Interior (Interior x) ~ Interior x, Needle (Interior x) ~ Needle x+      , Interior (Needle x) ~ Needle x )+     => SemimanifoldWitness x+  semimanifoldWitness = SemimanifoldWitness     -- | This is the class underlying manifolds. ('Manifold' only precludes boundaries@@ -228,42 +251,66 @@ --   /canonically isomorphic/ tangent spaces, so that --   @'fromPackedVector' . 'asPackedVector' :: 'Needle' x -> 'Needle' ξ@ --   defines a meaningful “representational identity“ between these spaces.-class (PseudoAffine x, PseudoAffine ξ, Scalar (Needle x) ~ Scalar (Needle ξ))+class ( Semimanifold x, Semimanifold ξ, LSpace (Needle x), LSpace (Needle ξ)+      , Scalar (Needle x) ~ Scalar (Needle ξ) )          => LocallyCoercible x ξ where-  -- | Must be compatible with the canonical isomorphism on the tangent spaces,-  --   i.e.+  -- | Must be compatible with the isomorphism on the tangent spaces, i.e.   -- @-  -- locallyTrivialDiffeomorphism (p .+~^ 'fromPackedVector' v)-  --   ≡ locallyTrivialDiffeomorphism p .+~^ 'fromPackedVector' v+  -- locallyTrivialDiffeomorphism (p .+~^ v)+  --   ≡ locallyTrivialDiffeomorphism p .+~^ 'coerceNeedle' v   -- @   locallyTrivialDiffeomorphism :: x -> ξ-  -instance LocallyCoercible ℝ ℝ where locallyTrivialDiffeomorphism = id-instance LocallyCoercible (ℝ,ℝ) (ℝ,ℝ) where locallyTrivialDiffeomorphism = id-instance LocallyCoercible (ℝ,(ℝ,ℝ)) (ℝ,(ℝ,ℝ)) where locallyTrivialDiffeomorphism = id-instance LocallyCoercible ((ℝ,ℝ),ℝ) ((ℝ,ℝ),ℝ) where locallyTrivialDiffeomorphism = id+  coerceNeedle :: Functor p (->) (->) => p (x,ξ) -> (Needle x -+> Needle ξ)+  coerceNeedle' :: Functor p (->) (->) => p (x,ξ) -> (Needle' x -+> Needle' ξ)+  oppositeLocalCoercion :: CanonicalDiffeomorphism ξ x+  default oppositeLocalCoercion :: LocallyCoercible ξ x => CanonicalDiffeomorphism ξ x+  oppositeLocalCoercion = CanonicalDiffeomorphism+  interiorLocalCoercion :: Functor p (->) (->) +                  => p (x,ξ) -> CanonicalDiffeomorphism (Interior x) (Interior ξ)+  default interiorLocalCoercion :: LocallyCoercible (Interior x) (Interior ξ)+                  => p (x,ξ) -> CanonicalDiffeomorphism (Interior x) (Interior ξ)+  interiorLocalCoercion _ = CanonicalDiffeomorphism +#define identityCoercion(c,t)                   \+instance (c) => LocallyCoercible (t) (t) where { \+  locallyTrivialDiffeomorphism = id;              \+  coerceNeedle _ = id;                             \+  coerceNeedle' _ = id;                             \+  oppositeLocalCoercion = CanonicalDiffeomorphism;   \+  interiorLocalCoercion _ = CanonicalDiffeomorphism }+identityCoercion(NumberManifold s, ZeroDim s)+identityCoercion(NumberManifold s, V0 s)+identityCoercion((), ℝ)+identityCoercion(NumberManifold s, V1 s)+identityCoercion((), (ℝ,ℝ))+identityCoercion(NumberManifold s, V2 s)+identityCoercion((), (ℝ,(ℝ,ℝ)))+identityCoercion((), ((ℝ,ℝ),ℝ))+identityCoercion(NumberManifold s, V3 s)+identityCoercion(NumberManifold s, V4 s)  +data CanonicalDiffeomorphism a b where+  CanonicalDiffeomorphism :: LocallyCoercible a b => CanonicalDiffeomorphism a b++ type LocallyScalable s x = ( PseudoAffine x-                           , HasMetric (Needle x)-                           , s ~ Scalar (Needle x) )+                           , LSpace (Needle x)+                           , s ~ Scalar (Needle x)+                           , Num''' s ) -type LocalLinear x y = Linear (Scalar (Needle x)) (Needle x) (Needle y)+type LocalLinear x y = LinearMap (Scalar (Needle x)) (Needle x) (Needle y) type LocalAffine x y = (Needle y, LocalLinear x y)  -- | Basically just an &#x201c;updated&#x201d; version of the 'VectorSpace' class. --   Every vector space is a manifold, this constraint makes it explicit.---   ---   (Actually, 'LinearManifold' is stronger than 'VectorSpace' at the moment, since---   'HasMetric' requires 'FiniteDimensional'. This might be lifted in the future.)-type LinearManifold x = ( AffineManifold x, Needle x ~ x, HasMetric x )+type LinearManifold x = ( AffineManifold x, Needle x ~ x, LSpace x )  type LinearManifold' x = ( PseudoAffine x, AffineSpace x, Diff x ~ x-                         , Interior x ~ x, Needle x ~ x, HasMetric x )+                         , Interior x ~ x, Needle x ~ x, LSpace x )  -- | Require some constraint on a manifold, and also fix the type of the manifold's---   underlying field. For example, @WithField &#x211d; 'HilbertSpace' v@ constrains+--   underlying field. For example, @WithField &#x211d; 'HilbertManifold' v@ constrains --   @v@ to be a real (i.e., 'Double'-) Hilbert space. --   Note that for this to compile, you will in --   general need the @-XLiberalTypeSynonyms@ extension (except if the constraint@@ -272,9 +319,7 @@ type WithField s c x = ( c x, s ~ Scalar (Needle x) )  -- | The 'RealFloat' class plus manifold constraints.-type RealDimension r = ( PseudoAffine r, Interior r ~ r, Needle r ~ r-                       , HasMetric r, DualSpace r ~ r, Scalar r ~ r-                       , RealFloat r, r ~ ℝ)+type RealDimension r = ( PseudoAffine r, Interior r ~ r, Needle r ~ r, r ~ ℝ)  -- | The 'AffineSpace' class plus manifold constraints. type AffineManifold m = ( PseudoAffine m, Interior m ~ m, AffineSpace m@@ -286,27 +331,36 @@ --   (Stricly speaking, that doesn't have much to do with the completeness criterion; --   but since 'Manifold's are at the moment confined to finite dimension, they are in --   fact (trivially) complete.)-type HilbertSpace x = ( LinearManifold x, InnerSpace x-                      , Interior x ~ x, Needle x ~ x, DualSpace x ~ x-                      , Floating (Scalar x) )+type HilbertManifold x = ( LinearManifold x, InnerSpace x+                         , Interior x ~ x, Needle x ~ x, DualVector x ~ x+                         , Floating (Scalar x) )  -- | An euclidean space is a real affine space whose tangent space is a Hilbert space. type EuclidSpace x = ( AffineManifold x, InnerSpace (Diff x)-                     , DualSpace (Diff x) ~ Diff x, Floating (Scalar (Diff x)) )+                     , DualVector (Diff x) ~ Diff x, Floating (Scalar (Diff x)) ) +type NumberManifold n = ( Num''' n, Manifold n, Interior n ~ n, Needle n ~ n+                        , LSpace n, DualVector n ~ n, Scalar n ~ n )+ euclideanMetric :: EuclidSpace x => proxy x -> Metric x-euclideanMetric _ = euclideanMetric'+euclideanMetric _ = euclideanNorm   -- | A co-needle can be understood as a “paper stack”, with which you can measure --   the length that a needle reaches in a given direction by counting the number --   of holes punched through them.-type Needle' x = DualSpace (Needle x)+type Needle' x = DualVector (Needle x)  --- | The word &#x201c;metric&#x201d; is used in the sense as in general relativity. Cf. 'HerMetric'.-type Metric x = HerMetric (Needle x)-type Metric' x = HerMetric' (Needle x)+-- | The word &#x201c;metric&#x201d; is used in the sense as in general relativity.+--   Actually this is just the type of scalar products on the tangent space.+--   The actual metric is the function @x -> x -> Scalar (Needle x)@ defined by+--+-- @+-- \\p q -> m '|$|' (p.-~!q)+-- @+type Metric x = Norm (Needle x)+type Metric' x = Variance (Needle x)  -- | A Riemannian metric assigns each point on a manifold a scalar product on the tangent space. --   Note that this association is /not/ continuous, because the charts/tangent spaces in the bundle@@ -315,6 +369,23 @@ type RieMetric x = x -> Metric x type RieMetric' x = x -> Metric' x ++coerceMetric :: ∀ x ξ . (LocallyCoercible x ξ, LSpace (Needle ξ))+                             => RieMetric ξ -> RieMetric x+coerceMetric m x = case m $ locallyTrivialDiffeomorphism x of+              Norm sc -> Norm $ bw . sc . fw+ where fw = coerceNeedle ([]::[(x,ξ)])+       bw = case oppositeLocalCoercion :: CanonicalDiffeomorphism ξ x of+              CanonicalDiffeomorphism -> coerceNeedle' ([]::[(ξ,x)])+coerceMetric' :: ∀ x ξ . (LocallyCoercible x ξ, LSpace (Needle ξ))+                             => RieMetric' ξ -> RieMetric' x+coerceMetric' m x = case m $ locallyTrivialDiffeomorphism x of+              Norm sc -> Norm $ bw . sc . fw+ where fw = coerceNeedle' ([]::[(x,ξ)])+       bw = case oppositeLocalCoercion :: CanonicalDiffeomorphism ξ x of+              CanonicalDiffeomorphism -> coerceNeedle ([]::[(ξ,x)])++ -- | Interpolate between points, approximately linearly. For --   points that aren't close neighbours (i.e. lie in an almost --   flat region), the pathway is basically undefined – save for@@ -347,37 +418,71 @@ hugeℝVal :: ℝ hugeℝVal = 1e+100 -#define deriveAffine(t)          \-instance Semimanifold (t) where { \-  type Needle (t) = Diff (t);      \-  fromInterior = id;                \-  toInterior = pure;                 \-  translateP = Tagged (.+^);          \-  (.+~^) = (.+^) };                    \-instance PseudoAffine (t) where {       \+#define deriveAffine(c,t)               \+instance (c) => Semimanifold (t) where { \+  type Needle (t) = Diff (t);             \+  fromInterior = id;                       \+  toInterior = pure;                        \+  translateP = Tagged (.+^);                 \+  (.+~^) = (.+^) };                           \+instance (c) => PseudoAffine (t) where {       \   a.-~.b = pure (a.-.b);      } -deriveAffine(Double)-deriveAffine(Rational)+deriveAffine((),Double)+deriveAffine((),Rational)+deriveAffine(NumberManifold s, V1 s)+deriveAffine(NumberManifold s, V2 s)+deriveAffine(NumberManifold s, V3 s)+deriveAffine(NumberManifold s, V4 s) -instance SmoothScalar s => Semimanifold (FinVecArrRep t b s) where-  type Needle (FinVecArrRep t b s) = FinVecArrRep t b s-  type Interior (FinVecArrRep t b s) = FinVecArrRep t b s-  fromInterior = id-  toInterior = pure-  translateP = Tagged (.+^)-  (.+~^) = (.+^)-instance SmoothScalar s => PseudoAffine (FinVecArrRep t b s) where-  a.-~.b = pure (a.-.b)-instance SmoothScalar s => LocallyCoercible (FinVecArrRep t b s) (FinVecArrRep t b s) where-  locallyTrivialDiffeomorphism = id-instance (SmoothScalar s, LinearManifold b, Scalar b ~ s)-           => LocallyCoercible (FinVecArrRep t b s) b where-  locallyTrivialDiffeomorphism = (concreteArrRep$<-$)-instance (SmoothScalar s, LinearManifold b, Scalar b ~ s)-           => LocallyCoercible b (FinVecArrRep t b s) where-  locallyTrivialDiffeomorphism = (concreteArrRep$->$)-  +instance (NumberManifold s) => LocallyCoercible (ZeroDim s) (V0 s) where+  locallyTrivialDiffeomorphism Origin = V0+  coerceNeedle _ = LinearFunction $ \Origin -> V0+  coerceNeedle' _ = LinearFunction $ \Origin -> V0+instance (NumberManifold s) => LocallyCoercible (V0 s) (ZeroDim s) where+  locallyTrivialDiffeomorphism V0 = Origin+  coerceNeedle _ = LinearFunction $ \V0 -> Origin+  coerceNeedle' _ = LinearFunction $ \V0 -> Origin+instance LocallyCoercible ℝ (V1 ℝ) where+  locallyTrivialDiffeomorphism = V1+  coerceNeedle _ = LinearFunction V1+  coerceNeedle' _ = LinearFunction V1+instance LocallyCoercible (V1 ℝ) ℝ where+  locallyTrivialDiffeomorphism (V1 n) = n+  coerceNeedle _ = LinearFunction $ \(V1 n) -> n+  coerceNeedle' _ = LinearFunction $ \(V1 n) -> n+instance LocallyCoercible (ℝ,ℝ) (V2 ℝ) where+  locallyTrivialDiffeomorphism = uncurry V2+  coerceNeedle _ = LinearFunction $ uncurry V2+  coerceNeedle' _ = LinearFunction $ uncurry V2+instance LocallyCoercible (V2 ℝ) (ℝ,ℝ) where+  locallyTrivialDiffeomorphism (V2 x y) = (x,y)+  coerceNeedle _ = LinearFunction $ \(V2 x y) -> (x,y)+  coerceNeedle' _ = LinearFunction $ \(V2 x y) -> (x,y)+instance LocallyCoercible ((ℝ,ℝ),ℝ) (V3 ℝ) where+  locallyTrivialDiffeomorphism ((x,y),z) = V3 x y z+  coerceNeedle _ = LinearFunction $ \((x,y),z) -> V3 x y z+  coerceNeedle' _ = LinearFunction $ \((x,y),z) -> V3 x y z+instance LocallyCoercible (ℝ,(ℝ,ℝ)) (V3 ℝ) where+  locallyTrivialDiffeomorphism (x,(y,z)) = V3 x y z+  coerceNeedle _ = LinearFunction $ \(x,(y,z)) -> V3 x y z+  coerceNeedle' _ = LinearFunction $ \(x,(y,z)) -> V3 x y z+instance LocallyCoercible (V3 ℝ) ((ℝ,ℝ),ℝ) where+  locallyTrivialDiffeomorphism (V3 x y z) = ((x,y),z)+  coerceNeedle _ = LinearFunction $ \(V3 x y z) -> ((x,y),z)+  coerceNeedle' _ = LinearFunction $ \(V3 x y z) -> ((x,y),z)+instance LocallyCoercible (V3 ℝ) (ℝ,(ℝ,ℝ)) where+  locallyTrivialDiffeomorphism (V3 x y z) = (x,(y,z))+  coerceNeedle _ = LinearFunction $ \(V3 x y z) -> (x,(y,z))+  coerceNeedle' _ = LinearFunction $ \(V3 x y z) -> (x,(y,z))+instance LocallyCoercible ((ℝ,ℝ),(ℝ,ℝ)) (V4 ℝ) where+  locallyTrivialDiffeomorphism ((x,y),(z,w)) = V4 x y z w+  coerceNeedle _ = LinearFunction $ \((x,y),(z,w)) -> V4 x y z w+  coerceNeedle' _ = LinearFunction $ \((x,y),(z,w)) -> V4 x y z w+instance LocallyCoercible (V4 ℝ) ((ℝ,ℝ),(ℝ,ℝ)) where+  locallyTrivialDiffeomorphism (V4 x y z w) = ((x,y),(z,w))+  coerceNeedle _ = LinearFunction $ \(V4 x y z w) -> ((x,y),(z,w))+  coerceNeedle' _ = LinearFunction $ \(V4 x y z w) -> ((x,y),(z,w))  instance Semimanifold (ZeroDim k) where   type Needle (ZeroDim k) = ZeroDim k@@ -388,105 +493,114 @@   translateP = Tagged (.+~^) instance PseudoAffine (ZeroDim k) where   Origin .-~. Origin = pure Origin+instance Num k => Semimanifold (V0 k) where+  type Needle (V0 k) = V0 k+  fromInterior = id+  toInterior = pure+  V0 .+~^ V0 = V0+  V0 .-~^ V0 = V0+  translateP = Tagged (.+~^)+instance Num k => PseudoAffine (V0 k) where+  V0 .-~. V0 = pure V0 -instance (Semimanifold a, Semimanifold b) => Semimanifold (a,b) where+instance ∀ a b . (Semimanifold a, Semimanifold b) => Semimanifold (a,b) where   type Needle (a,b) = (Needle a, Needle b)   type Interior (a,b) = (Interior a, Interior b)   (a,b).+~^(v,w) = (a.+~^v, b.+~^w)   (a,b).-~^(v,w) = (a.-~^v, b.-~^w)   fromInterior (i,j) = (fromInterior i, fromInterior j)   toInterior (a,b) = fzip (toInterior a, toInterior b)-  translateP = tp-   where tp :: ∀ a b . (Semimanifold a, Semimanifold b)-                     => Tagged (a,b) ( (Interior a, Interior b) -                                    -> (Needle a, Needle b)-                                    -> (Interior a, Interior b) )-         tp = Tagged $ \(a,b) (v,w) -> (ta a v, tb b w)-          where Tagged ta = translateP :: Tagged a (Interior a -> Needle a -> Interior a)-                Tagged tb = translateP :: Tagged b (Interior b -> Needle b -> Interior b)+  translateP = Tagged $ \(a,b) (v,w) -> (ta a v, tb b w)+   where Tagged ta = translateP :: Tagged a (Interior a -> Needle a -> Interior a)+         Tagged tb = translateP :: Tagged b (Interior b -> Needle b -> Interior b)+  semimanifoldWitness = case ( semimanifoldWitness :: SemimanifoldWitness a+                             , semimanifoldWitness :: SemimanifoldWitness b ) of+             (SemimanifoldWitness, SemimanifoldWitness) -> SemimanifoldWitness instance (PseudoAffine a, PseudoAffine b) => PseudoAffine (a,b) where   (a,b).-~.(c,d) = liftA2 (,) (a.-~.c) (b.-~.d)-instance (PseudoAffine a, PseudoAffine b, PseudoAffine c)-     => LocallyCoercible (a,(b,c)) ((a,b),c) where locallyTrivialDiffeomorphism = regroup-instance (PseudoAffine a, PseudoAffine b, PseudoAffine c)-     => LocallyCoercible ((a,b),c) (a,(b,c)) where locallyTrivialDiffeomorphism = regroup'+instance ( Semimanifold a, Semimanifold b, Semimanifold c+         , LSpace (Needle a), LSpace (Needle b), LSpace (Needle c)+         , Scalar (Needle a) ~ Scalar (Needle b), Scalar (Needle b) ~ Scalar (Needle c) )+     => LocallyCoercible (a,(b,c)) ((a,b),c) where+  locallyTrivialDiffeomorphism = regroup+  coerceNeedle _ = regroup+  coerceNeedle' _ = regroup+  oppositeLocalCoercion = CanonicalDiffeomorphism+  interiorLocalCoercion _ = case ( semimanifoldWitness :: SemimanifoldWitness a+                                 , semimanifoldWitness :: SemimanifoldWitness b+                                 , semimanifoldWitness :: SemimanifoldWitness c ) of+       (SemimanifoldWitness, SemimanifoldWitness, SemimanifoldWitness)+              -> CanonicalDiffeomorphism+instance ∀ a b c .+         ( Semimanifold a, Semimanifold b, Semimanifold c+         , LSpace (Needle a), LSpace (Needle b), LSpace (Needle c)+         , Scalar (Needle a) ~ Scalar (Needle b), Scalar (Needle b) ~ Scalar (Needle c) )+     => LocallyCoercible ((a,b),c) (a,(b,c)) where+  locallyTrivialDiffeomorphism = regroup'+  coerceNeedle _ = regroup'+  coerceNeedle' _ = regroup'+  oppositeLocalCoercion = CanonicalDiffeomorphism+  interiorLocalCoercion _ = case ( semimanifoldWitness :: SemimanifoldWitness a+                                 , semimanifoldWitness :: SemimanifoldWitness b+                                 , semimanifoldWitness :: SemimanifoldWitness c ) of+       (SemimanifoldWitness, SemimanifoldWitness, SemimanifoldWitness)+            -> CanonicalDiffeomorphism -instance (Semimanifold a, Semimanifold b, Semimanifold c) => Semimanifold (a,b,c) where+instance ∀ a b c . (Semimanifold a, Semimanifold b, Semimanifold c)+                          => Semimanifold (a,b,c) where   type Needle (a,b,c) = (Needle a, Needle b, Needle c)   type Interior (a,b,c) = (Interior a, Interior b, Interior c)   (a,b,c).+~^(v,w,x) = (a.+~^v, b.+~^w, c.+~^x)   (a,b,c).-~^(v,w,x) = (a.-~^v, b.-~^w, c.-~^x)   fromInterior (i,j,k) = (fromInterior i, fromInterior j, fromInterior k)   toInterior (a,b,c) = liftA3 (,,) (toInterior a) (toInterior b) (toInterior c)-  translateP = tp-   where tp :: ∀ a b v . (Semimanifold a, Semimanifold b, Semimanifold c)-                     => Tagged (a,b,c) ( (Interior a, Interior b, Interior c) -                                      -> (Needle a, Needle b, Needle c)-                                      -> (Interior a, Interior b, Interior c) )-         tp = Tagged $ \(a,b,c) (v,w,x) -> (ta a v, tb b w, tc c x)-          where Tagged ta = translateP :: Tagged a (Interior a -> Needle a -> Interior a)-                Tagged tb = translateP :: Tagged b (Interior b -> Needle b -> Interior b)-                Tagged tc = translateP :: Tagged c (Interior c -> Needle c -> Interior c)+  translateP = Tagged $ \(a,b,c) (v,w,x) -> (ta a v, tb b w, tc c x)+   where Tagged ta = translateP :: Tagged a (Interior a -> Needle a -> Interior a)+         Tagged tb = translateP :: Tagged b (Interior b -> Needle b -> Interior b)+         Tagged tc = translateP :: Tagged c (Interior c -> Needle c -> Interior c)+  semimanifoldWitness = case ( semimanifoldWitness :: SemimanifoldWitness a+                             , semimanifoldWitness :: SemimanifoldWitness b+                             , semimanifoldWitness :: SemimanifoldWitness c ) of+             (SemimanifoldWitness, SemimanifoldWitness, SemimanifoldWitness)+                   -> SemimanifoldWitness instance (PseudoAffine a, PseudoAffine b, PseudoAffine c) => PseudoAffine (a,b,c) where   (a,b,c).-~.(d,e,f) = liftA3 (,,) (a.-~.d) (b.-~.e) (c.-~.f)-instance (PseudoAffine a, PseudoAffine b, PseudoAffine c)-     => LocallyCoercible (a,b,c) ((a,b),c) where-  locallyTrivialDiffeomorphism (a,b,c) = ((a,b),c)-instance (PseudoAffine a, PseudoAffine b, PseudoAffine c)-     => LocallyCoercible (a,b,c) (a,(b,c)) where-  locallyTrivialDiffeomorphism (a,b,c) = (a,(b,c))-instance (PseudoAffine a, PseudoAffine b, PseudoAffine c)-     => LocallyCoercible ((a,b),c) (a,b,c) where-  locallyTrivialDiffeomorphism ((a,b),c) = (a,b,c)-instance (PseudoAffine a, PseudoAffine b, PseudoAffine c)-     => LocallyCoercible (a,(b,c)) (a,b,c) where-  locallyTrivialDiffeomorphism (a,(b,c)) = (a,b,c) -instance (MetricScalar a, KnownNat n) => Semimanifold (FreeVect n a) where-  type Needle (FreeVect n a) = FreeVect n a++instance LinearManifold (a n) => Semimanifold (LinAff.Point a n) where+  type Needle (LinAff.Point a n) = a n   fromInterior = id   toInterior = pure-  translateP = Tagged (.+~^)-  (.+~^) = (.+^)-instance (MetricScalar a, KnownNat n) => PseudoAffine (FreeVect n a) where-  a.-~.b = pure (a.-.b)-instance LocallyCoercible ℝ (ℝ ^ S Z) where-  locallyTrivialDiffeomorphism = replicVector-instance LocallyCoercible (ℝ ^ S Z) ℝ where-  locallyTrivialDiffeomorphism = (<.>^replicVector 1)+  LinAff.P v .+~^ w = LinAff.P $ v ^+^ w+  translateP = Tagged $ \(LinAff.P v) w -> LinAff.P $ v ^+^ w+instance LinearManifold (a n) => PseudoAffine (LinAff.Point a n) where+  LinAff.P v .-~. LinAff.P w = return $ v ^-^ w  -instance (HasMetric a, FiniteDimensional b, Scalar a~Scalar b) => Semimanifold (a⊗b) where-  type Needle (a⊗b) = a ⊗ b+instance (LSpace a, LSpace b, s~Scalar a, s~Scalar b)+              => Semimanifold (Tensor s a b) where+  type Needle (Tensor s a b) = Tensor s a b   fromInterior = id   toInterior = pure   translateP = Tagged (.+~^)   (.+~^) = (^+^)-instance (HasMetric a, FiniteDimensional b, Scalar a~Scalar b) => PseudoAffine (a⊗b) where+instance (LSpace a, LSpace b, s~Scalar a, s~Scalar b)+              => PseudoAffine (Tensor s a b) where   a.-~.b = pure (a^-^b) -instance (HasMetric a, FiniteDimensional b, Scalar a~Scalar b) => Semimanifold (a:-*b) where-  type Needle (a:-*b) = DualSpace a ⊗ b-  fromInterior = id-  toInterior = pure-  translateP = Tagged (.+~^)-  p.+~^n = p ^+^ linMapFromTensProd n-instance (HasMetric a, FiniteDimensional b, Scalar a~Scalar b) => PseudoAffine (a:-*b) where-  a.-~.b = pure . linMapAsTensProd $ a^-^b--instance (HasMetric a, FiniteDimensional b, Scalar a~s, Scalar b~s)-                          => Semimanifold (Linear s a b) where-  type Needle (Linear s a b) = Linear s a b+instance (LSpace a, LSpace b, Scalar a~s, Scalar b~s)+                          => Semimanifold (LinearMap s a b) where+  type Needle (LinearMap s a b) = LinearMap s a b   fromInterior = id   toInterior = pure   translateP = Tagged (.+^)   (.+~^) = (^+^)-instance (HasMetric a, FiniteDimensional b, Scalar a~s, Scalar b~s)-                          => PseudoAffine (Linear s a b) where+instance (LSpace a, LSpace b, Scalar a~s, Scalar b~s)+                          => PseudoAffine (LinearMap s a b) where   a.-~.b = pure (a^-^b)  instance Semimanifold S⁰ where-  type Needle S⁰ = ℝ⁰+  type Needle S⁰ = ZeroDim ℝ   fromInterior = id   toInterior = pure   translateP = Tagged (.+~^)@@ -555,7 +669,7 @@   fromInterior = id   toInterior = pure   translateP = Tagged (.+~^)-  ℝP² r₀ φ₀ .+~^ (δr, δφ)+  ℝP² r₀ φ₀ .+~^ V2 δr δφ    | r₀ > 1/2   = case r₀ + δr of                    r₁ | r₁ > 1     -> ℝP² (2-r₁) (toS¹range $ φ₀+δφ+pi)                       | otherwise  -> ℝP²    r₁  (toS¹range $ φ₀+δφ)@@ -566,11 +680,11 @@ instance PseudoAffine ℝP² where   ℝP² r₁ φ₁ .-~. ℝP² r₀ φ₀    | r₀ > 1/2   = pure `id` case φ₁-φ₀ of-                          δφ | δφ > 3*pi/2  -> (  r₁ - r₀, δφ - 2*pi)-                             | δφ < -3*pi/2 -> (  r₁ - r₀, δφ + 2*pi)-                             | δφ > pi/2    -> (2-r₁ - r₀, δφ - pi  )-                             | δφ < -pi/2   -> (2-r₁ - r₀, δφ + pi  )-                             | otherwise    -> (  r₁ - r₀, δφ       )+                          δφ | δφ > 3*pi/2  -> V2 (  r₁ - r₀) (δφ - 2*pi)+                             | δφ < -3*pi/2 -> V2 (  r₁ - r₀) (δφ + 2*pi)+                             | δφ > pi/2    -> V2 (2-r₁ - r₀) (δφ - pi  )+                             | δφ < -pi/2   -> V2 (2-r₁ - r₀) (δφ + pi  )+                             | otherwise    -> V2 (  r₁ - r₀) (δφ       )    | otherwise  = pure ( r₁*^embed(S¹ φ₁) ^-^ r₀*^embed(S¹ φ₀) )  @@ -597,22 +711,16 @@   class ImpliesMetric s where-  {-# MINIMAL inferMetric | inferMetric' #-}   type MetricRequirement s x :: Constraint   type MetricRequirement s x = Semimanifold x-  inferMetric :: (MetricRequirement s x, HasMetric (Needle x))-                     => s x -> Option (Metric x)-  inferMetric = safeRecipMetric <=< inferMetric'-  inferMetric' :: (MetricRequirement s x, HasMetric (Needle x))-                     => s x -> Option (Metric' x)-  inferMetric' = safeRecipMetric' <=< inferMetric--instance ImpliesMetric HerMetric where-  type MetricRequirement HerMetric x = x ~ Needle x-  inferMetric = pure+  inferMetric :: (MetricRequirement s x, LSpace (Needle x))+                     => s x -> Metric x+  inferMetric' :: (MetricRequirement s x, LSpace (Needle x))+                     => s x -> Metric' x -instance ImpliesMetric HerMetric' where-  type MetricRequirement HerMetric' x = x ~ Needle x-  inferMetric' = pure+instance ImpliesMetric Norm where+  type MetricRequirement Norm x = (SimpleSpace x, x ~ Needle x)+  inferMetric = id+  inferMetric' = dualNorm  
Data/Manifold/Riemannian.hs view
@@ -51,13 +51,14 @@ import Data.Semigroup  import Data.VectorSpace-import Data.LinearMap.HerMetric+import Data.VectorSpace.Free import Data.AffineSpace+import Math.LinearMap.Category  import Data.Manifold.Types import Data.Manifold.Types.Primitive ((^), empty, embed, coEmbed)+import Data.Manifold.Types.Stiefel import Data.Manifold.PseudoAffine-import Data.VectorSpace.FiniteDimensional      import Data.CoNat @@ -68,8 +69,6 @@ import qualified Data.Foldable       as Hask import qualified Data.Traversable as Hask -import qualified Numeric.LinearAlgebra.HMatrix as HMat- import Control.Category.Constrained.Prelude hiding      ((^), all, elem, sum, forM, Foldable(..), Traversable) import Control.Arrow.Constrained@@ -111,18 +110,12 @@       = liftA3 (\ia ib ic t -> (ia t, ib t, ic t))            (geodesicBetween a α) (geodesicBetween b β) (geodesicBetween c γ) -instance (KnownNat n) => Geodesic (FreeVect n ℝ) where-  geodesicBetween (FreeVect v) (FreeVect w)-      = return $ \(D¹ t) -> let μv = (1-t)/2; μw = (t+1)/2-                            in FreeVect $ Arr.zipWith (\vi wi -> μv*vi + μw*wi) v w--instance (PseudoAffine v) => Geodesic (FinVecArrRep t v ℝ) where-  geodesicBetween (FinVecArrRep v) (FinVecArrRep w)-   | HMat.size v>0 && HMat.size w>0-      = return $ \(D¹ t) -> let μv = (1-t)/2; μw = (t+1)/2-                            in FinVecArrRep $ HMat.scale μv v + HMat.scale μw w+-- instance (KnownNat n) => Geodesic (FreeVect n ℝ) where+--   geodesicBetween (FreeVect v) (FreeVect w)+--       = return $ \(D¹ t) -> let μv = (1-t)/2; μw = (t+1)/2+--                             in FreeVect $ Arr.zipWith (\vi wi -> μv*vi + μw*wi) v w -instance (Geodesic v, WithField ℝ HilbertSpace v)+instance (Geodesic v, FiniteFreeSpace v, WithField ℝ HilbertManifold v)              => Geodesic (Stiefel1 v) where   geodesicBetween (Stiefel1 p') (Stiefel1 q')       = (\f -> \(D¹ t) -> Stiefel1 . f . D¹ $ g * tan (ϑ*t))@@ -147,39 +140,39 @@                         <$> geodesicBetween (-pi-φ) (pi-ϕ)  -instance Geodesic (Cℝay S⁰) where-  geodesicBetween p q = (>>> fromℝ) <$> geodesicBetween (toℝ p) (toℝ q)-   where toℝ (Cℝay h PositiveHalfSphere) = h-         toℝ (Cℝay h NegativeHalfSphere) = -h-         fromℝ x | x>0        = Cℝay x PositiveHalfSphere-                 | otherwise  = Cℝay (-x) NegativeHalfSphere--instance Geodesic (CD¹ S⁰) where-  geodesicBetween p q = (>>> fromI) <$> geodesicBetween (toI p) (toI q)-   where toI (CD¹ h PositiveHalfSphere) = h-         toI (CD¹ h NegativeHalfSphere) = -h-         fromI x | x>0        = CD¹ x PositiveHalfSphere-                 | otherwise  = CD¹ (-x) NegativeHalfSphere--instance Geodesic (Cℝay S¹) where-  geodesicBetween p q = (>>> fromP) <$> geodesicBetween (toP p) (toP q)-   where fromP = fromInterior-         toP w = case toInterior w of {Option (Just i) -> i}--instance Geodesic (CD¹ S¹) where-  geodesicBetween p q = (>>> fromI) <$> geodesicBetween (toI p) (toI q)-   where toI (CD¹ h (S¹ φ)) = (h*cos φ, h*sin φ)-         fromI (x,y) = CD¹ (sqrt $ x^2+y^2) (S¹ $ atan2 y x)--instance Geodesic (Cℝay S²) where-  geodesicBetween p q = (>>> fromP) <$> geodesicBetween (toP p) (toP q)-   where fromP = fromInterior-         toP w = case toInterior w of {Option (Just i) -> i}--instance Geodesic (CD¹ S²) where-  geodesicBetween p q = (>>> fromI) <$> geodesicBetween (toI p) (toI q :: ℝ³)-   where toI (CD¹ h sph) = h *^ embed sph-         fromI v = CD¹ (magnitude v) (coEmbed v)+-- instance Geodesic (Cℝay S⁰) where+--   geodesicBetween p q = (>>> fromℝ) <$> geodesicBetween (toℝ p) (toℝ q)+--    where toℝ (Cℝay h PositiveHalfSphere) = h+--          toℝ (Cℝay h NegativeHalfSphere) = -h+--          fromℝ x | x>0        = Cℝay x PositiveHalfSphere+--                  | otherwise  = Cℝay (-x) NegativeHalfSphere+-- +-- instance Geodesic (CD¹ S⁰) where+--   geodesicBetween p q = (>>> fromI) <$> geodesicBetween (toI p) (toI q)+--    where toI (CD¹ h PositiveHalfSphere) = h+--          toI (CD¹ h NegativeHalfSphere) = -h+--          fromI x | x>0        = CD¹ x PositiveHalfSphere+--                  | otherwise  = CD¹ (-x) NegativeHalfSphere+-- +-- instance Geodesic (Cℝay S¹) where+--   geodesicBetween p q = (>>> fromP) <$> geodesicBetween (toP p) (toP q)+--    where fromP = fromInterior+--          toP w = case toInterior w of {Option (Just i) -> i}+-- +-- instance Geodesic (CD¹ S¹) where+--   geodesicBetween p q = (>>> fromI) <$> geodesicBetween (toI p) (toI q)+--    where toI (CD¹ h (S¹ φ)) = (h*cos φ, h*sin φ)+--          fromI (x,y) = CD¹ (sqrt $ x^2+y^2) (S¹ $ atan2 y x)+-- +-- instance Geodesic (Cℝay S²) where+--   geodesicBetween p q = (>>> fromP) <$> geodesicBetween (toP p) (toP q)+--    where fromP = fromInterior+--          toP w = case toInterior w of {Option (Just i) -> i}+-- +-- instance Geodesic (CD¹ S²) where+--   geodesicBetween p q = (>>> fromI) <$> geodesicBetween (toI p) (toI q :: ℝ³)+--    where toI (CD¹ h sph) = h *^ embed sph+--          fromI v = CD¹ (magnitude v) (coEmbed v)  #define geoVSpCone(c,t)                                               \ instance (c) => Geodesic (Cℝay (t)) where {                            \@@ -193,11 +186,11 @@          ; fromP (x,h) = CD¹ h (x^/h)                                          \          ; toP (CD¹ h w) = ( h*^w, h ) } } -geoVSpCone ((), ℝ)-geoVSpCone ((), ℝ⁰)-geoVSpCone ((WithField ℝ HilbertSpace a, WithField ℝ HilbertSpace b, Geodesic (a,b)), (a,b))-geoVSpCone (KnownNat n, FreeVect n ℝ)-geoVSpCone ((Geodesic v, WithField ℝ HilbertSpace v), FinVecArrRep t v ℝ)+-- geoVSpCone ((), ℝ)+-- geoVSpCone ((), ℝ⁰)+-- geoVSpCone ((WithField ℝ HilbertManifold a, WithField ℝ HilbertManifold b+--             , Geodesic (a,b)), (a,b))+-- geoVSpCone (KnownNat n, FreeVect n ℝ)   @@ -208,16 +201,16 @@  instance IntervalLike D¹ where   toClosedInterval = id-instance IntervalLike (CD¹ S⁰) where-  toClosedInterval (CD¹ h PositiveHalfSphere) = D¹ h-  toClosedInterval (CD¹ h NegativeHalfSphere) = D¹ (-h)-instance IntervalLike (Cℝay S⁰) where-  toClosedInterval (Cℝay h PositiveHalfSphere) = D¹ $ tanh h-  toClosedInterval (Cℝay h NegativeHalfSphere) = D¹ $ -tanh h-instance IntervalLike (CD¹ ℝ⁰) where-  toClosedInterval (CD¹ h Origin) = D¹ $ h*2 - 1-instance IntervalLike (Cℝay ℝ⁰) where-  toClosedInterval (Cℝay h Origin) = D¹ $ 1 - 2/(h+1)+-- instance IntervalLike (CD¹ S⁰) where+--   toClosedInterval (CD¹ h PositiveHalfSphere) = D¹ h+--   toClosedInterval (CD¹ h NegativeHalfSphere) = D¹ (-h)+-- instance IntervalLike (Cℝay S⁰) where+--   toClosedInterval (Cℝay h PositiveHalfSphere) = D¹ $ tanh h+--   toClosedInterval (Cℝay h NegativeHalfSphere) = D¹ $ -tanh h+-- instance IntervalLike (CD¹ ℝ⁰) where+--   toClosedInterval (CD¹ h Origin) = D¹ $ h*2 - 1+-- instance IntervalLike (Cℝay ℝ⁰) where+--   toClosedInterval (Cℝay h Origin) = D¹ $ 1 - 2/(h+1) instance IntervalLike ℝ where   toClosedInterval x = D¹ $ tanh x @@ -229,4 +222,4 @@   rieMetric :: RieMetric m  instance Riemannian ℝ where-  rieMetric = const m where m = projector 1+  rieMetric = const euclideanNorm
Data/Manifold/TreeCover.hs view
@@ -42,7 +42,7 @@        -- ** Lenses        , shadeCtr, shadeExpanse, shadeNarrowness        -- ** Construction-       , fullShade, fullShade', pointsShades, pointsCovers+       , fullShade, fullShade', pointsShades, pointsShade's, pointsCovers, pointsCover's        -- ** Evaluation        , occlusion        -- ** Misc@@ -56,13 +56,14 @@        , SimpleTree, Trees, NonEmptyTree, GenericTree(..)        -- * Misc        , sShSaw, chainsaw, HasFlatView(..), shadesMerge, smoothInterpolate-       , twigsWithEnvirons, completeTopShading, flexTwigsShading+       , twigsWithEnvirons, Twig, TwigEnviron+       , completeTopShading, flexTwigsShading        , WithAny(..), Shaded, fmapShaded, stiAsIntervalMapping, spanShading        , constShaded, stripShadedUntopological        , DifferentialEqn, propagateDEqnSolution_loc        -- ** Triangulation-builders-       , TriangBuild, doTriangBuild, singleFullSimplex, autoglueTriangulation-       , AutoTriang, elementaryTriang, breakdownAutoTriang+       , TriangBuild, doTriangBuild+       , AutoTriang, breakdownAutoTriang     ) where  @@ -79,8 +80,7 @@  import Data.VectorSpace import Data.AffineSpace-import Data.LinearMap.HerMetric-import Data.LinearMap.Category+import Math.LinearMap.Category import Data.Tagged  import Data.SimplicialComplex@@ -107,8 +107,6 @@ import qualified Data.Traversable as Hask import Data.Traversable (forM) -import qualified Numeric.LinearAlgebra.HMatrix as HMat- import Control.Category.Constrained.Prelude hiding      ((^), all, elem, sum, forM, Foldable(..), foldr1, Traversable, traverse) import Control.Arrow.Constrained@@ -117,6 +115,7 @@ import Data.Traversable.Constrained (traverse)  import GHC.Generics (Generic)+import Data.Type.Coercion   -- | Possibly / Partially / asymPtotically singular metric.@@ -135,15 +134,14 @@ --   there is 'Region', whose implementation is vastly more complex. data Shade x = Shade { _shadeCtr :: !(Interior x)                      , _shadeExpanse :: !(Metric' x) }-deriving instance (Show x, Show (Needle x), WithField ℝ Manifold x) => Show (Shade x)+deriving instance (Show x, Show (Metric' x), WithField ℝ Manifold x) => Show (Shade x)  -- | A &#x201c;co-shade&#x201d; can describe ellipsoid regions as well, but unlike --   'Shade' it can be unlimited / infinitely wide in some directions. --   It does OTOH need to have nonzero thickness, which 'Shade' needs not. data Shade' x = Shade' { _shade'Ctr :: !(Interior x)                        , _shade'Narrowness :: !(Metric x) }-deriving instance (Show x, Show (DualSpace (Needle x)), WithField ℝ Manifold x)-             => Show (Shade' x)+deriving instance (Show x, Show (Metric x), WithField ℝ Manifold x) => Show (Shade' x)  class IsShade shade where --  type (*) shade :: *->*@@ -153,10 +151,12 @@ --  unsafeDualShade :: WithField ℝ Manifold x => shade x -> shade* x   -- | Check the statistical likelihood-density of a point being within a shade.   --   This is taken as a normal distribution.-  occlusion :: ( Manifold x, s ~ (Scalar (Needle x)), RealDimension s )+  occlusion :: ( Manifold x, SimpleSpace (Needle x)+               , s ~ (Scalar (Needle x)), RealDimension s )                 => shade x -> x -> s-  factoriseShade :: ( Manifold x, RealDimension (Scalar (Needle x))-                    , Manifold y, RealDimension (Scalar (Needle y)) )+  factoriseShade :: ( Manifold x, SimpleSpace (Needle x)+                    , Manifold y, SimpleSpace (Needle y)+                    , Scalar (Needle x) ~ Scalar (Needle y) )                 => shade (x,y) -> (shade x, shade y)   coerceShade :: (Manifold x, Manifold y, LocallyCoercible x y) => shade x -> shade y @@ -164,23 +164,31 @@   shadeCtr f (Shade c e) = fmap (`Shade`e) $ f c   occlusion (Shade p₀ δ) = occ    where occ p = case p .-~. p₀ of-           Option(Just vd) | mSq <- metricSq δinv vd+           Option(Just vd) | mSq <- normSq δinv vd                            , mSq == mSq  -- avoid NaN                            -> exp (negate mSq)            _               -> zeroV-         δinv = recipMetric δ+         δinv = dualNorm δ   factoriseShade (Shade (x₀,y₀) δxy) = (Shade x₀ δx, Shade y₀ δy)-   where (δx,δy) = factoriseMetric' δxy-  coerceShade (Shade x (HerMetric' δxym))-          = Shade (locallyTrivialDiffeomorphism x) (HerMetric' $ unsafeCoerceLinear<$>δxym)+   where (δx,δy) = summandSpaceNorms δxy+  coerceShade = cS+   where cS :: ∀ x y . (LocallyCoercible x y) => Shade x -> Shade y+         cS = \(Shade x δxym) -> Shade (internCoerce x) (tN δxym)+          where tN = case oppositeLocalCoercion :: CanonicalDiffeomorphism y x of+                      CanonicalDiffeomorphism ->+                       transformNorm . arr $ coerceNeedle' ([]::[(y,x)])+                internCoerce = case interiorLocalCoercion ([]::[(x,y)]) of+                      CanonicalDiffeomorphism -> locallyTrivialDiffeomorphism  instance ImpliesMetric Shade where-  type MetricRequirement Shade x = Manifold x-  inferMetric' (Shade _ e) = pure e+  type MetricRequirement Shade x = (Manifold x, SimpleSpace (Needle x))+  inferMetric' (Shade _ e) = e+  inferMetric (Shade _ e) = dualNorm e  instance ImpliesMetric Shade' where-  type MetricRequirement Shade' x = Manifold x-  inferMetric (Shade' _ e) = pure e+  type MetricRequirement Shade' x = (Manifold x, SimpleSpace (Needle x))+  inferMetric (Shade' _ e) = e+  inferMetric' (Shade' _ e) = dualNorm e  shadeExpanse :: Lens' (Shade x) (Metric' x) shadeExpanse f (Shade c e) = fmap (Shade c) $ f e@@ -189,14 +197,20 @@   shadeCtr f (Shade' c e) = fmap (`Shade'`e) $ f c   occlusion (Shade' p₀ δinv) = occ    where occ p = case p .-~. p₀ of-           Option(Just vd) | mSq <- metricSq δinv vd+           Option(Just vd) | mSq <- normSq δinv vd                            , mSq == mSq  -- avoid NaN                            -> exp (negate mSq)            _               -> zeroV   factoriseShade (Shade' (x₀,y₀) δxy) = (Shade' x₀ δx, Shade' y₀ δy)-   where (δx,δy) = factoriseMetric δxy-  coerceShade (Shade' x (HerMetric δxym))-          = Shade' (locallyTrivialDiffeomorphism x) (HerMetric $ unsafeCoerceLinear<$>δxym)+   where (δx,δy) = summandSpaceNorms δxy+  coerceShade = cS+   where cS :: ∀ x y . (LocallyCoercible x y) => Shade' x -> Shade' y+         cS = \(Shade' x δxym) -> Shade' (internCoerce x) (tN δxym)+          where tN = case oppositeLocalCoercion :: CanonicalDiffeomorphism y x of+                      CanonicalDiffeomorphism ->+                       transformNorm . arr $ coerceNeedle ([]::[(y,x)])+                internCoerce = case interiorLocalCoercion ([]::[(x,y)]) of+                      CanonicalDiffeomorphism -> locallyTrivialDiffeomorphism  shadeNarrowness :: Lens' (Shade' x) (Metric x) shadeNarrowness f (Shade' c e) = fmap (Shade' c) $ f e@@ -209,13 +223,13 @@   Shade c e .+~^ v = Shade (c.+^v) e   Shade c e .-~^ v = Shade (c.-^v) e -instance (WithField ℝ AffineManifold x, Geodesic x) => Geodesic (Shade x) where+instance (WithField ℝ AffineManifold x, Geodesic x, SimpleSpace (Needle x))+             => Geodesic (Shade x) where   geodesicBetween (Shade c e) (Shade ζ η) = pure interp-   where ([], sharedSpan) = eigenSystem (e,η)+   where sharedSpan = sharedNormSpanningSystem e η          interp t = Shade (pinterp t)-                          (projector's [ v ^* (alerpB qe qη t)-                                       | ([qe,qη], (v,_)) <- zip coeffs sharedSpan ])-         coeffs = [ [metric' m v' | m <- [e,η]] | (_,v') <- sharedSpan ]+                          (spanNorm [ v ^* (alerpB 1 qη t)+                                    | (v,qη) <- sharedSpan ])          Option (Just pinterp) = geodesicBetween c ζ  instance (AffineManifold x) => Semimanifold (Shade' x) where@@ -226,13 +240,13 @@   Shade' c e .+~^ v = Shade' (c.+^v) e   Shade' c e .-~^ v = Shade' (c.-^v) e -instance (WithField ℝ AffineManifold x, Geodesic x) => Geodesic (Shade' x) where+instance (WithField ℝ AffineManifold x, Geodesic x, SimpleSpace (Needle x))+            => Geodesic (Shade' x) where   geodesicBetween (Shade' c e) (Shade' ζ η) = pure interp-   where ([], sharedSpan) = eigenSystem (e,η)+   where sharedSpan = sharedNormSpanningSystem e η          interp t = Shade' (pinterp t)-                           (projectors [ v' ^/ (alerpB qe qη t)-                                       | ([qe,qη], (v',_)) <- zip coeffs sharedSpan ])-         coeffs = [ [recip $ metric m v | m <- [e,η]] | (_,v) <- sharedSpan ]+                           (spanNorm [ v ^/ (alerpB 1 (recip qη) t)+                                     | (v,qη) <- sharedSpan ])          Option (Just pinterp) = geodesicBetween c ζ  fullShade :: WithField ℝ Manifold x => x -> Metric' x -> Shade x@@ -243,9 +257,10 @@   -- | Span a 'Shade' from a center point and multiple deviation-vectors.-pattern (:±) :: () => WithField ℝ Manifold x => x -> [Needle x] -> Shade x-pattern x :± shs <- Shade x (eigenSpan -> shs)- where x :± shs = fullShade x $ projector's shs+pattern (:±) :: () => (WithField ℝ Manifold x, SimpleSpace (Needle x))+                         => x -> [Needle x] -> Shade x+pattern x :± shs <- Shade x (normSpanningSystem -> shs)+ where x :± shs = fullShade x $ spanVariance shs   -- | Similar to ':±', but instead of expanding the shade, each vector /restricts/ it.@@ -255,7 +270,7 @@ --   Note that '|±|' is only possible, as such, in an inner-product space; in --   general you need reciprocal vectors ('Needle'') to define a 'Shade''. (|±|) :: WithField ℝ EuclidSpace x => x -> [Needle x] -> Shade' x-x |±| shs = Shade' x $ projectors [v^/(v<.>v) | v<-shs]+x |±| shs = Shade' x $ spanNorm [v^/(v<.>v) | v<-shs]   @@ -267,8 +282,9 @@                        in (iu, if vl>0 then UpperBulb else LowerBulb)     _ -> (-1, error "Trying to obtain the subshadeId of a point not actually included in the shade.") -subshadeId :: WithField ℝ Manifold x => Shade x -> x -> (Int, HourglassBulb)-subshadeId (Shade c expa) = subshadeId' c . NE.fromList $ eigenCoSpan expa+subshadeId :: (WithField ℝ Manifold x, FiniteDimensional (Needle' x))+                    => Shade x -> x -> (Int, HourglassBulb)+subshadeId (Shade c expa) = subshadeId' c . NE.fromList $ normSpanningSystem' expa                    @@ -282,31 +298,37 @@ --   For /nonconnected/ manifolds it will be necessary to yield separate shades --   for each connected component. And for an empty input list, there is no shade! --   Hence the result type is a list.-pointsShades :: WithField ℝ Manifold x => [x] -> [Shade x]-pointsShades = map snd . pointsShades' zeroV+pointsShades :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+                                 => [x] -> [Shade x]+pointsShades = map snd . pointsShades' mempty  -- | Like 'pointsShades', but ensure that all points are actually in --   the shade, i.e. if @['Shade' x₀ ex]@ is the result then --   @'metric' (recipMetric ex) (p-x₀) ≤ 1@ for all @p@ in the list.-pointsCovers :: ∀ x . WithField ℝ Manifold x => [x] -> [Shade x]-pointsCovers = map guaranteeIn . pointsShades' zeroV+pointsCovers :: ∀ x . (WithField ℝ Manifold x, SimpleSpace (Needle x))+                          => [x] -> [Shade x]+pointsCovers = map guaranteeIn . pointsShades' mempty  where guaranteeIn (ps, Shade x₀ ex)            = case ps >>= \p -> let Option (Just v) = p.-~.x₀-                              in guard (metric ex' v > 1) >> [(p,projector' v)]+                              in guard ((ex'|$|v) > 1) >> [(p, spanVariance [v])]              of []   -> Shade x₀ ex                 outs -> guaranteeIn ( fst<$>outs                                     , Shade x₀-                                         $ ex ^+^ sumV (snd<$>outs)-                                                    ^/ fromIntegral (2 * length outs) )-        where ex' = recipMetric ex+                                         $ ex <> scaleNorm+                                                   (sqrt . recip . fromIntegral+                                                               $ 2 * length outs)+                                                   (mconcat $ snd<$>outs)+                                    )+        where ex' = dualNorm ex -pointsShade's :: WithField ℝ Manifold x => [x] -> [Shade' x]-pointsShade's = map (\(Shade c e) -> Shade' c $ recipMetric e) . pointsShades+pointsShade's :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> [Shade' x]+pointsShade's = map (\(Shade c e) -> Shade' c $ dualNorm e) . pointsShades -pointsCover's :: WithField ℝ Manifold x => [x] -> [Shade' x]-pointsCover's = map (\(Shade c e) -> Shade' c $ recipMetric e) . pointsCovers+pointsCover's :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => [x] -> [Shade' x]+pointsCover's = map (\(Shade c e) -> Shade' c $ dualNorm e) . pointsCovers -pseudoECM :: WithField ℝ Manifold x => NonEmpty x -> (x, ([x],[x]))+pseudoECM :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+                   => NonEmpty x -> (x, ([x],[x])) pseudoECM (p₀ NE.:| psr) = foldl' ( \(acc, (rb,nr)) (i,p)                                   -> case p.-~.acc of                                        Option (Just δ) -> (acc .+~^ δ^/i, (p:rb, nr))@@ -314,7 +336,8 @@                              (p₀, mempty)                              ( zip [1..] $ p₀:psr ) -pointsShades' :: WithField ℝ Manifold x => Metric' x -> [x] -> [([x], Shade x)]+pointsShades' :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+                                => Metric' x -> [x] -> [([x], Shade x)] pointsShades' _ [] = [] pointsShades' minExt ps = case expa of                             Option (Just e) -> (ps, fullShade ctr e)@@ -322,14 +345,14 @@                            _ -> pointsShades' minExt inc'd                                   ++ pointsShades' minExt unreachable  where (ctr,(inc'd,unreachable)) = pseudoECM $ NE.fromList ps-       expa = ( (^+^minExt) . (^/ fromIntegral(length ps)) . projector's )+       expa = ( (<>minExt) . spanVariance . map (^/ fromIntegral (length ps)) )               <$> mapM (.-~.ctr) ps          -- | Attempt to reduce the number of shades to fewer (ideally, a single one). --   In the simplest cases these should guaranteed cover the same area; --   for non-flat manifolds it only works in a heuristic sense.-shadesMerge :: WithField ℝ Manifold x+shadesMerge :: (WithField ℝ Manifold x, SimpleSpace (Needle x))                  => ℝ -- ^ How near (inverse normalised distance, relative to shade expanse)                       --   two shades must be to be merged. If this is zero, any shades                       --   in the same connected region of a manifold are merged.@@ -343,14 +366,14 @@  where tryMerge (Shade c₂ e₂)            | Option (Just v) <- c₁.-~.c₂            , Option (Just v') <- c₂.-~.c₁-           , [e₁',e₂'] <- recipMetric<$>[e₁, e₂] -           , b₁ <- metric e₂' v-           , b₂ <- metric e₁' v+           , [e₁',e₂'] <- dualNorm<$>[e₁, e₂] +           , b₁ <- e₂'|$|v+           , b₂ <- e₁'|$|v            , fuzz*b₁*b₂ <= b₁ + b₂                   = Just $ let cc = c₂ .+~^ v ^/ 2                                Option (Just cv₁) = c₁.-~.cc                                Option (Just cv₂) = c₂.-~.cc-                           in Shade cc $ e₁ ^+^ e₂ ^+^ projector's [cv₁, cv₂]+                           in Shade cc $ e₁ <> e₂ <> spanVariance [cv₁, cv₂]            | otherwise  = Nothing shadesMerge _ shs = shs @@ -364,19 +387,20 @@               => Shade' x -> x -> s minusLogOcclusion' (Shade' p₀ δinv) = occ  where occ p = case p .-~. p₀ of-         Option(Just vd) | mSq <- metricSq δinv vd+         Option(Just vd) | mSq <- normSq δinv vd                          , mSq == mSq  -- avoid NaN                          -> mSq          _               -> 1/0-minusLogOcclusion :: ( Manifold x, s ~ (Scalar (Needle x)), RealDimension s )+minusLogOcclusion :: ( Manifold x, SimpleSpace (Needle x)+                     , s ~ (Scalar (Needle x)), RealDimension s )               => Shade x -> x -> s minusLogOcclusion (Shade p₀ δ) = occ  where occ p = case p .-~. p₀ of-         Option(Just vd) | mSq <- metricSq δinv vd+         Option(Just vd) | mSq <- normSq δinv vd                          , mSq == mSq  -- avoid NaN                          -> mSq          _               -> 1/0-       δinv = recipMetric δ+       δinv = dualNorm δ     @@ -490,13 +514,13 @@   DisjointBranches n br .+~^ v = DisjointBranches n $ (.+~^v)<$>br  -- | WRT union.-instance WithField ℝ Manifold x => Semigroup (ShadeTree x) where+instance (WithField ℝ Manifold x, SimpleSpace (Needle x)) => Semigroup (ShadeTree x) where   PlainLeaves [] <> t = t   t <> PlainLeaves [] = t   t <> s = fromLeafPoints $ onlyLeaves t ++ onlyLeaves s            -- Could probably be done more efficiently   sconcat = mconcat . NE.toList-instance WithField ℝ Manifold x => Monoid (ShadeTree x) where+instance (WithField ℝ Manifold x, SimpleSpace (Needle x)) => Monoid (ShadeTree x) where   mempty = PlainLeaves []   mappend = (<>)   mconcat l = case filter ne l of@@ -511,7 +535,8 @@ --   Example: https://nbviewer.jupyter.org/github/leftaroundabout/manifolds/blob/master/test/Trees-and-Webs.ipynb#pseudorandomCloudTree --  -- <<images/examples/simple-2d-ShadeTree.png>>-fromLeafPoints :: ∀ x. WithField ℝ Manifold x => [x] -> ShadeTree x+fromLeafPoints :: ∀ x. (WithField ℝ Manifold x, SimpleSpace (Needle x))+                         => [x] -> ShadeTree x fromLeafPoints = fromLeafPoints' sShIdPartition  @@ -541,7 +566,7 @@ -- | “Inverse indexing” of a tree. This is roughly a nearest-neighbour search, --   but not guaranteed to give the correct result unless evaluated at the --   precise position of a tree leaf.-positionIndex :: ∀ x . WithField ℝ Manifold x+positionIndex :: ∀ x . (WithField ℝ Manifold x, SimpleSpace (Needle x))        => Option (Metric x)  -- ^ For deciding (at the lowest level) what “close” means;                              --   this is optional for any tree of depth >1.         -> ShadeTree x       -- ^ The tree to index into@@ -551,7 +576,7 @@                    --   environment trees leading down to its position (in decreasing                    --   order of size), and actual position of the found node. positionIndex (Option (Just m)) sh@(PlainLeaves lvs) x-        = case catMaybes [ ((i,p),) . metricSq m <$> getOption (p.-~.x)+        = case catMaybes [ ((i,p),) . normSq m <$> getOption (p.-~.x)                             | (i,p) <- zip [0..] lvs] of            [] -> empty            l | ((i,p),_) <- minimumBy (comparing snd) l@@ -571,26 +596,27 @@                        , let ω = d<.>^vx                        , (t',σ) <- [(t'u, 1), (t'd, -1)] ]           in ((+i₀) *** first (sh:))-                 <$> positionIndex (return $ recipMetric ce) t' x+                 <$> positionIndex (return $ dualNorm ce) t' x positionIndex _ _ _ = empty   -fromFnGraphPoints :: ∀ x y . (WithField ℝ Manifold x, WithField ℝ Manifold y)+fromFnGraphPoints :: ∀ x y . ( WithField ℝ Manifold x, WithField ℝ Manifold y+                             , SimpleSpace (Needle x), SimpleSpace (Needle y) )                      => [(x,y)] -> ShadeTree (x,y) fromFnGraphPoints = fromLeafPoints' fg_sShIdPart  where fg_sShIdPart :: Shade (x,y) -> [(x,y)] -> NonEmpty (DBranch' (x,y) [(x,y)])        fg_sShIdPart (Shade c expa) xs         | b:bs <- [DBranch (v, zeroV) mempty-                    | v <- eigenCoSpan-                           (transformMetric' fst expa :: Metric' x) ]+                    | v <- normSpanningSystem'+                           (transformNorm (id&&&zeroV) expa :: Metric' x) ]                       = sShIdPartition' c xs $ b:|bs -fromLeafPoints' :: ∀ x. WithField ℝ Manifold x =>+fromLeafPoints' :: ∀ x. (WithField ℝ Manifold x, SimpleSpace (Needle x)) =>     (Shade x -> [x] -> NonEmpty (DBranch' x [x])) -> [x] -> ShadeTree x-fromLeafPoints' sShIdPart = go zeroV+fromLeafPoints' sShIdPart = go mempty  where go :: Metric' x -> [x] -> ShadeTree x-       go preShExpa = \xs -> case pointsShades' (preShExpa^/10) xs of+       go preShExpa = \xs -> case pointsShades' (scaleNorm (1/3) preShExpa) xs of                      [] -> mempty                      [(_,rShade)] -> let trials = sShIdPart rShade xs                                      in case reduce rShade trials of@@ -601,7 +627,7 @@                                          _ -> PlainLeaves xs                      partitions -> DisjointBranches (length xs)                                    . NE.fromList-                                    $ map (\(xs',pShade) -> go zeroV xs') partitions+                                    $ map (\(xs',pShade) -> go mempty xs') partitions         where                branchProc redSh = fmap (fmap $ go redSh)                                  @@ -630,9 +656,10 @@                                       i )                    st xs  where ssi = subshadeId' c (boughDirection<$>st)-sShIdPartition :: WithField ℝ Manifold x => Shade x -> [x] -> NonEmpty (DBranch' x [x])+sShIdPartition :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+                    => Shade x -> [x] -> NonEmpty (DBranch' x [x]) sShIdPartition (Shade c expa) xs- | b:bs <- [DBranch v mempty | v <- eigenCoSpan expa]+ | b:bs <- [DBranch v mempty | v <- normSpanningSystem' expa]     = sShIdPartition' c xs $ b:|bs                                             @@ -669,7 +696,8 @@ sortByKey = map snd . sortBy (comparing fst)  -trunks :: ∀ x. WithField ℝ Manifold x => ShadeTree x -> [Shade x]+trunks :: ∀ x. (WithField ℝ Manifold x, SimpleSpace (Needle x))+                  => ShadeTree x -> [Shade x] trunks (PlainLeaves lvs) = pointsCovers lvs trunks (DisjointBranches _ brs) = Hask.foldMap trunks brs trunks (OverlappingBranches _ sh _) = [sh]@@ -682,11 +710,16 @@   instance ImpliesMetric ShadeTree where-  type MetricRequirement ShadeTree x = WithField ℝ Manifold x-  inferMetric' (OverlappingBranches _ (Shade _ e) _) = pure e+  type MetricRequirement ShadeTree x = (WithField ℝ Manifold x, SimpleSpace (Needle x))+  inferMetric (OverlappingBranches _ (Shade _ e) _) = dualNorm e+  inferMetric (PlainLeaves lvs) = case pointsShades lvs of+        (Shade _ sh:_) -> dualNorm sh+        _ -> mempty+  inferMetric (DisjointBranches _ (br:|_)) = inferMetric br+  inferMetric' (OverlappingBranches _ (Shade _ e) _) = e   inferMetric' (PlainLeaves lvs) = case pointsShades lvs of-        (Shade _ sh:_) -> pure sh-        _ -> empty+        (Shade _ sh:_) -> sh+        _ -> mempty   inferMetric' (DisjointBranches _ (br:|_)) = inferMetric' br  @@ -720,36 +753,36 @@  -- | Class of manifolds which can use 'Shade'' as a basic set type. --   This is easily possible for vector spaces with the default implementations.-class (WithField ℝ Manifold y) => Refinable y where+class (WithField ℝ Manifold y, SimpleSpace (Needle y)) => Refinable y where   -- | @a `subShade'` b ≡ True@ means @a@ is fully contained in @b@, i.e. from   --   @'minusLogOcclusion'' a p < 1@ follows also @minusLogOcclusion' b p < 1@.   subShade' :: Shade' y -> Shade' y -> Bool   subShade' (Shade' ac ae) tsh = all ((<1) . minusLogOcclusion' tsh)-                                  [ ac.+~^σ*^v | σ<-[-1,1], v<-eigenCoSpan' ae ]+                                  [ ac.+~^σ*^v | σ<-[-1,1], v<-normSpanningSystem' ae ]      refineShade' :: Shade' y -> Shade' y -> Option (Shade' y)-  refineShade' (Shade' c₀ (HerMetric (Just e₁))) -               (Shade' c₀₂ (HerMetric (Just e₂)))+  refineShade' (Shade' c₀ (Norm e₁)) +               (Shade' c₀₂ (Norm e₂))            | Option (Just c₂) <- c₀₂.-~.c₀            , e₁c₂ <- e₁ $ c₂            , e₂c₂ <- e₂ $ c₂-           , cc <- σe <\$ e₂c₂+           , cc <- σe \$ e₂c₂            , cc₂ <- cc ^-^ c₂            , e₁cc <- e₁ $ cc            , e₂cc <- e₂ $ cc            , α <- 2 + cc₂<.>^e₂c₂            , α > 0            , ee <- σe ^/ α-           , c₂e₁c₂ <- c₂^<.>e₁c₂-           , c₂e₂c₂ <- c₂^<.>e₂c₂+           , c₂e₁c₂ <- c₂<.>^e₁c₂+           , c₂e₂c₂ <- c₂<.>^e₂c₂            , c₂eec₂ <- (c₂e₁c₂ + c₂e₂c₂) / α            , [γ₁,γ₂] <- middle . sort                 $ quadraticEqnSol c₂e₁c₂-                                  (2 * (c₂^<.>e₁cc))-                                  (cc^<.>e₁cc - 1)+                                  (2 * (c₂<.>^e₁cc))+                                  (cc<.>^e₁cc - 1)                ++ quadraticEqnSol c₂e₂c₂-                                  (2 * (c₂^<.>e₂cc - c₂e₂c₂))-                                  (cc^<.>e₂cc - 2 * (cc^<.>e₂c₂) + c₂e₂c₂ - 1)+                                  (2 * (c₂<.>^e₂cc - c₂e₂c₂))+                                  (cc<.>^e₂cc - 2 * (cc<.>^e₂c₂) + c₂e₂c₂ - 1)            , cc' <- cc ^+^ ((γ₁+γ₂)/2)*^c₂            , rγ <- abs (γ₁ - γ₂) / 2            , η <- if rγ * c₂eec₂ /= 0 && 1 - rγ^2 * c₂eec₂ > 0@@ -757,10 +790,9 @@                    else 0                   = return $                  Shade' (c₀.+~^cc')-                        (HerMetric (Just ee) ^+^ projector (ee $ c₂^*η))-           +                        (Norm (arr ee) <> spanNorm [ee $ c₂^*η])            | otherwise          = empty-   where σe = e₁^+^e₂+   where σe = arr $ e₁^+^e₂          quadraticEqnSol a b c              | a /= 0 && disc > 0  = [ (σ * sqrt disc - b) / (2*a)                                      | σ <- [-1, 1] ]@@ -768,8 +800,6 @@           where disc = b^2 - 4*a*c          middle (_:x:y:_) = [x,y]          middle l = l-  refineShade' (Shade' _ (HerMetric Nothing)) s₂ = pure s₂-  refineShade' s₁ (Shade' _ (HerMetric Nothing)) = pure s₁   -- ⟨x−c₁|e₁|x−c₁⟩ < 1  ∧  ⟨x−c₂|e₂|x−c₂⟩ < 1   -- We search (cc,ee) such that this implies   -- ⟨x−cc|ee|x−cc⟩ < 1.@@ -854,11 +884,11 @@   convolveShade' :: Shade' y -> Shade' (Needle y) -> Shade' y   convolveShade' (Shade' y₀ ey) (Shade' δ₀ eδ)           = Shade' (y₀.+~^δ₀)-                   ( projectors [ f ^* ζ crl-                                | (f,_) <- eδsp-                                | crl <- corelap ] )-   where (_,eδsp) = eigenSystem (ey,eδ)-         corelap = map (metric ey . snd) eδsp+                   ( spanNorm [ f ^* ζ crl+                              | (f,_) <- eδsp+                              | crl <- corelap ] )+   where eδsp = sharedNormSpanningSystem ey eδ+         corelap = map snd eδsp          ζ = case filter (>0) corelap of             [] -> const 0             nzrelap@@ -873,7 +903,7 @@  instance Refinable ℝ where   refineShade' (Shade' cl el) (Shade' cr er)-         = case (metricSq el 1, metricSq er 1) of+         = case (normSq el 1, normSq er 1) of              (0, _) -> return $ Shade' cr er              (_, 0) -> return $ Shade' cl el              (ql,qr) | ql>0, qr>0@@ -883,7 +913,7 @@                        in guard (b<t) >>                            let cm = (b+t)/2                                rm = (t-b)/2-                           in return $ Shade' cm (projector $ recip rm)+                           in return $ Shade' cm (spanNorm [recip rm]) --   convolveShade' (Shade' y₀ ey) (Shade' δ₀ eδ) --          = case (metricSq ey 1, metricSq eδ 1) of --              (wy,wδ) | wy>0, wδ>0@@ -894,6 +924,11 @@  instance (Refinable a, Refinable b) => Refinable (a,b)   +instance Refinable ℝ⁰+instance Refinable ℝ¹+instance Refinable ℝ²+instance Refinable ℝ³+instance Refinable ℝ⁴                               intersectShade's :: ∀ y . Refinable y => NonEmpty (Shade' y) -> Option (Shade' y)@@ -905,7 +940,8 @@ type DifferentialEqn x y = Shade (x,y) -> Shade' (LocalLinear x y)  -propagateDEqnSolution_loc :: ∀ x y . (WithField ℝ Manifold x, Refinable y)+propagateDEqnSolution_loc :: ∀ x y . ( WithField ℝ Manifold x, Refinable y+                                     , SimpleSpace (Needle x) )            => DifferentialEqn x y -> ((x, Shade' y), NonEmpty (Needle x, Shade' y))                    -> NonEmpty (Shade' y) propagateDEqnSolution_loc f ((x, shy@(Shade' y _)), neighbours) = ycs@@ -913,7 +949,7 @@        [shxy] = pointsCovers [ (xs, ys')                              | (xs, Shade' ys yse)                                  <- (x,shy):(first (x.+~^)<$>NE.toList neighbours)-                             , δy <- eigenCoSpan' yse+                             , δy <- normSpanningSystem' yse                              , ys' <- [ys.+~^δy, ys.-~^δy] ]        [Shade' _ expax] = pointsCover's $ x : ((x.+~^).fst<$>NE.toList neighbours)        marginδs :: NonEmpty (Needle x, (Needle y, Metric y))@@ -925,28 +961,38 @@        back2Centre (δx, (δym, expany))             = convolveShade'                 (Shade' y expany)-                (Shade' δyb $ applyLinMapMetric jExpa (δx'^/(δx'<.>^δx)))+                (Shade' δyb $ applyLinMapNorm jExpa (δx'^/(δx'<.>^δx)))         where δyb = δym ^-^ (j₀ $ δx)-              δx' = toDualWith expax δx+              δx' = expax<$|δx        ycs :: NonEmpty (Shade' y)        ycs = back2Centre <$> marginδs-       xSpan = eigenCoSpan' expax+       xSpan = normSpanningSystem expax +applyLinMapNorm :: (LSpace x, LSpace y, Scalar x ~ Scalar y)+           => Norm (x+>y) -> DualVector x -> Norm y+applyLinMapNorm n dx+   = transformNorm (fmap (arr Coercion . transposeTensor) . blockVectSpan' $ dx) n --- Formerly, this was the signature of what has now become 'traverseTwigsWithEnvirons'.--- The simple list-yielding version (see rev. b4a427d59ec82889bab2fde39225b14a57b694df--- may well be more efficient than this version via a traversal.-twigsWithEnvirons :: ∀ x. WithField ℝ Manifold x-    => ShadeTree x -> [((Int, ShadeTree x), [(Int, ShadeTree x)])]++type Twig x = (Int, ShadeTree x)+type TwigEnviron x = [Twig x]++-- Formerly, 'twigsWithEnvirons' what has now become 'traverseTwigsWithEnvirons'.+-- The simple list-yielding version (see rev. b4a427d59ec82889bab2fde39225b14a57b694df)+-- may well be more efficient than the current traversal-derived version.++-- | Example: https://nbviewer.jupyter.org/github/leftaroundabout/manifolds/blob/master/test/Trees-and-Webs.ipynb#pseudorandomCloudTree+-- +--   <<images/examples/TreesAndWebs/2D-scatter_twig-environs.png>>+twigsWithEnvirons :: ∀ x. (WithField ℝ Manifold x, SimpleSpace (Needle x))+    => ShadeTree x -> [(Twig x, TwigEnviron x)] twigsWithEnvirons = execWriter . traverseTwigsWithEnvirons (writer . (snd.fst&&&pure))  traverseTwigsWithEnvirons :: ∀ x f .-            (WithField ℝ Manifold x, Hask.Applicative f)-    => ( ((Int, ShadeTree x), [(Int, ShadeTree x)]) -> f (ShadeTree x))-         -> ShadeTree x -> f (ShadeTree x)+            (WithField ℝ Manifold x, SimpleSpace (Needle x), Hask.Applicative f)+    => ( (Twig x, TwigEnviron x) -> f (ShadeTree x) ) -> ShadeTree x -> f (ShadeTree x) traverseTwigsWithEnvirons f = fst . go [] . (0,)- where go :: [(Int, ShadeTree x)] -> (Int, ShadeTree x)-                          -> (f (ShadeTree x), Bool)+ where go :: TwigEnviron x -> Twig x -> (f (ShadeTree x), Bool)        go _ (i₀, DisjointBranches nlvs djbs) = ( fmap (DisjointBranches nlvs)                                                    . Hask.traverse (fst . go [])                                                    $ NE.zip ioffs djbs@@ -967,7 +1013,7 @@                where envi'' = filter (snd >>> trunks >>> \(Shade ce _:_)                                          -> let Option (Just δyenv) = ce.-~.robc                                                 qq = vy<.>^δyenv-                                            in qq > -1 && qq < 5+                                            in qq > -1                                        ) envi'                               ++ map ((+i₀)***snd) alts               envi' = approach =<< envi@@ -975,13 +1021,14 @@                   = first (+i₀e) <$> twigsaveTrim hither apt                where Option (Just δxenv) = robc .-~. envc                      hither (DBranch bdir (Hourglass bdc₁ bdc₂))-                       | bdir<.>^δxenv > 0  = [(0           , bdc₁)]-                       | otherwise          = [(nLeaves bdc₁, bdc₂)]+                       =  [(0           , bdc₁) | overlap > -1]+                       ++ [(nLeaves bdc₁, bdc₂) | overlap < 1]+                      where overlap = bdir<.>^δxenv               approach q = [q]        go envi plvs@(i₀, (PlainLeaves _))                          = (f $ purgeRemotes (plvs, envi), True)        -       twigProximæ :: x -> ShadeTree x -> [(Int, ShadeTree x)]+       twigProximæ :: x -> ShadeTree x -> TwigEnviron x        twigProximæ x₀ (DisjointBranches _ djbs)                = Hask.foldMap (\(i₀,st) -> first (+i₀) <$> twigProximæ x₀ st)                     $ NE.zip ioffs djbs@@ -990,13 +1037,12 @@                    = twigsaveTrim hither ct         where Option (Just δxb) = x₀ .-~. xb               hither (DBranch bdir (Hourglass bdc₁ bdc₂))-                 | bdir<.>^δxb > 0  = twigProximæ x₀ bdc₁-                 | otherwise        = first (+nLeaves bdc₁)-                                     <$> twigProximæ x₀ bdc₂+                =  ((guard (overlap > -1)) >> twigProximæ x₀ bdc₁)+                ++ ((guard (overlap < 1)) >> first (+nLeaves bdc₁)<$>twigProximæ x₀ bdc₂)+               where overlap = bdir<.>^δxb        twigProximæ _ plainLeaves = [(0, plainLeaves)]        -       twigsaveTrim :: (DBranch x -> [(Int,ShadeTree x)])-                       -> ShadeTree x -> [(Int,ShadeTree x)]+       twigsaveTrim :: (DBranch x -> TwigEnviron x) -> ShadeTree x -> TwigEnviron x        twigsaveTrim f ct@(OverlappingBranches _ _ dbs)                  = case Hask.mapM (\(i₀,dbr) -> noLeaf $ first(+i₀)<$>f dbr)                                  $ NE.zip ioffs dbs of@@ -1006,11 +1052,11 @@               noLeaf bqs = pure bqs               ioffs = NE.scanl (\i -> (+i) . sum . fmap nLeaves . toList) 0 dbs        -       purgeRemotes :: ((Int,ShadeTree x), [(Int,ShadeTree x)])-                    -> ((Int,ShadeTree x), [(Int,ShadeTree x)])+       purgeRemotes :: (Twig x, TwigEnviron x) -> (Twig x, TwigEnviron x)        purgeRemotes = id -- See 7d1f3a4 for the implementation; this didn't work reliable.      -completeTopShading :: (WithField ℝ Manifold x, WithField ℝ Manifold y)+completeTopShading :: ( WithField ℝ Manifold x, WithField ℝ Manifold y+                      , SimpleSpace (Needle x), SimpleSpace (Needle y) )                    => x`Shaded`y -> [Shade' (x,y)] completeTopShading (PlainLeaves plvs)                      = pointsShade's $ (_topological &&& _untopological) <$> plvs@@ -1018,7 +1064,12 @@                      = take 1 . completeTopShading =<< NE.toList bqs completeTopShading t = pointsCover's . map (_topological &&& _untopological) $ onlyLeaves t ++transferAsNormsDo :: LSpace v => Norm v -> Variance v -> v-+>v+transferAsNormsDo (Norm m) (Norm n) = n . m+ flexTopShading :: ∀ x y f . ( WithField ℝ Manifold x, WithField ℝ Manifold y+                            , SimpleSpace (Needle x), SimpleSpace (Needle y)                             , Applicative f (->) (->) )                   => (Shade' (x,y) -> f (x, (Shade' y, LocalLinear x y)))                       -> x`Shaded`y -> f (x`Shaded`y)@@ -1027,13 +1078,13 @@  where recst qsh@(_:_) (DisjointBranches n bqs)           = undefined -- DisjointBranches n $ NE.zipWith (recst . (:[])) (NE.fromList qsh) bqs        recst [sha@(Shade' (_,yc₀) expa₀)] t = fmap fts $ f sha-        where expa'₀ = recipMetric' expa₀+        where expa'₀ = dualNorm expa₀               j₀ :: LocalLinear x y-              Option (Just j₀) = covariance expa'₀-              (_,expay₀) = factoriseMetric expa₀+              j₀ = dependence expa'₀+              (_,expay₀) = summandSpaceNorms expa₀               fts (xc, (Shade' yc expay, jtg)) = unsafeFmapLeaves applδj t                where Option (Just δyc) = yc.-~.yc₀-                     tfm = imitateMetricSpanChange expay₀ (recipMetric' expay)+                     tfm = transferAsNormsDo expay₀ (dualNorm expay)                      applδj (WithAny y x)                            = WithAny (yc₀ .+~^ ((tfm$δy) ^+^ (jtg$δx) ^+^ δyc)) x                       where Option (Just δx) = x.-~.xc@@ -1047,6 +1098,7 @@        assert_connected (PlainLeaves _) = ()  flexTwigsShading :: ∀ x y f . ( WithField ℝ Manifold x, WithField ℝ Manifold y+                              , SimpleSpace (Needle x), SimpleSpace (Needle y)                               , Hask.Applicative f )                   => (Shade' (x,y) -> f (x, (Shade' y, LocalLinear x y)))                       -> x`Shaded`y -> f (x`Shaded`y)@@ -1083,6 +1135,7 @@   toInterior = pure   translateP = Tagged (.+~^)   (.+~^) = (.+^)+  semimanifoldWitness = undefined instance (KnownNat n) => PseudoAffine (BaryCoords n) where   (.-~.) = pure .: (.-.) @@ -1118,30 +1171,6 @@   --- startTriangulation :: forall n x . (KnownNat n, WithField ℝ Manifold x)---         => ISimplex n x -> TriangBuilder n x--- startTriangulation ispl@(ISimplex emb) = startWith $ fromISimplex ispl---  where startWith (ZeroSimplex p) = TriangVerticesSt [p]---        startWith s@(Simplex _ _)---                      = TriangBuilder (Triangulation [s])---                                      (splxVertices s)---                                      [ (s', expandInDir j)---                                        | j<-[0..n]---                                        | s' <- getTriangulation $ simplexFaces s ]---         where expandInDir j xs = case sortBy (comparing snd) $ filter ((> -1) . snd) xs_bc of---                             ((x, q) : _) | q<0   -> pure x---                             _                    -> empty---                where xs_bc = map (\x -> (x, getBaryCoord (emb >-$ x) j)) xs---        (Tagged n) = theNatN :: Tagged n Int---- extendTriangulation :: forall n x . (KnownNat n, WithField ℝ Manifold x)---                            => [x] -> TriangBuilder n x -> TriangBuilder n x--- extendTriangulation xs (TriangBuilder tr tb te) = foldr tryex (TriangBuilder tr tb []) te---  where tryex (bspl, expd) (TriangBuilder (Triangulation tr') tb' te')---          | Option (Just fav) <- expd xs---                     = let snew = Simplex fav bspl---                       in TriangBuilder (Triangulation $ snew:tr') (fav:tb') undefined-                bottomExtendSuitability :: (KnownNat n, WithField ℝ Manifold x)                 => ISimplex (S n) x -> x -> ℝ@@ -1158,17 +1187,7 @@              qs -> pure . fst . maximumBy (comparing snd) $ qs  -simplexPlane :: forall n x . (KnownNat n, WithField ℝ Manifold x)-        => Metric x -> Simplex n x -> Embedding (Linear ℝ) (FreeVect n ℝ) (Needle x)-simplexPlane m s = embedding- where bc = simplexBarycenter s-       spread = init . map ((.-~.bc) >>> \(Option (Just v)) -> v) $ splxVertices s-       embedding = case spanHilbertSubspace m spread of-                     (Option (Just e)) -> e-                     _ -> error "Trying to obtain simplexPlane from zero-volume\-                                \ simplex (which cannot span sufficient basis vectors)." - leavesBarycenter :: WithField ℝ Manifold x => NonEmpty x -> x leavesBarycenter (x :| xs) = x .+~^ sumV [x'–x | x'<-xs] ^/ (n+1)  where n = fromIntegral $ length xs@@ -1183,23 +1202,6 @@        Tagged n = theNatN :: Tagged n ℝ        x' – x = case x'.-~.x of {Option(Just v)->v} -toISimplex :: forall x n . (KnownNat n, WithField ℝ Manifold x)-                 => Metric x -> Simplex n x -> ISimplex n x-toISimplex m s = ISimplex $ fromEmbedProject fromBrc toBrc- where bc = simplexBarycenter s-       (Embedding emb (DenseLinear prj))-                         = simplexPlane m s-       (r₀:rs) = [ prj HMat.#> asPackedVector v-                   | x <- splxVertices s, let (Option (Just v)) = x.-~.bc ]-       tmat = HMat.inv $ HMat.fromColumns [ r - r₀ | r<-rs ] -       toBrc x = case x.-~.bc of-         Option (Just v) -> let rx = prj HMat.#> asPackedVector v - r₀-                            in finalise $ tmat HMat.#> rx-       finalise v = case freeVector $ HMat.toList v of-         Option (Just bv) -> BaryCoords bv-       fromBrc bccs = bc .+~^ (emb $ v)-        where v = linearCombo $ (fromPackedVector r₀, b₀) : zip (fromPackedVector<$>rs) bs-              (b₀:bs) = getBaryCoords' bccs  fromISimplex :: forall x n . (KnownNat n, WithField ℝ Manifold x)                    => ISimplex n x -> Simplex n x@@ -1231,22 +1233,6 @@ doTriangBuild t = runIdentity (fst <$>   doTriangT (unliftInTriangT (`evalStateT`mempty) t >> simplexITList >>= mapM lookSimplex)) -singleFullSimplex :: ∀ t n x . (KnownNat n, WithField ℝ Manifold x)-          => ISimplex n x -> FullTriang t n x (SimplexIT t n x)-singleFullSimplex is = do-   frame <- disjointSimplex (fromISimplex is)-   lift . modify' $ Map.insert frame is-   return frame-       -fullOpenSimplex :: ∀ t n x . (KnownNat n, WithField ℝ Manifold x)-          => Metric x -> Simplex (S n) x -> TriangBuild t n x [SimplexIT t n x]-fullOpenSimplex m s = do-   let is = toISimplex m s-   frame <- disjointSimplex (fromISimplex is)-   fsides <- toList <$> lookSplxFacesIT frame-   lift . forM (zip fsides $ iSimplexSideViews is)-      $ \(fside,is') -> modify' $ Map.insert fside (m,is')-   return fsides   hypotheticalSimplexScore :: ∀ t n n' x . (KnownNat n', WithField ℝ Manifold x, n~S n')@@ -1268,90 +1254,15 @@          _       -> empty    return . fmap sum $ Hask.sequence scores -spanSemiOpenSimplex :: ∀ t n n' x . (KnownNat n', WithField ℝ Manifold x, n~S n')-          => SimplexIT t Z x       -- ^ Tip of the desired simplex.-          -> SimplexIT t n x       -- ^ Base of the desired simplex.-          -> TriangBuild t n x [SimplexIT t n x]-                                   -- ^ Return the exposed faces of the new simplices.-spanSemiOpenSimplex p b = do-   m <- lift $ fst <$> (Map.!b) <$> get-   neighbours <- filterM isAdjacent =<< lookSupersimplicesIT p-   let bs = b:|neighbours-   frame <- webinateTriang p b-   backSplx <- lookSimplex frame-   let iSplx = toISimplex m backSplx-   fsides <- toList <$> lookSplxFacesIT frame-   let sviews = filter (not . (`elem`bs) . fst) $ zip fsides (iSimplexSideViews iSplx)-   lift . forM sviews $ \(fside,is') -> modify' $ Map.insert fside (m,is')-   lift . Hask.forM_ bs $ \fside -> modify' $ Map.delete fside-   return $ fst <$> sviews- where isAdjacent = fmap (isJust . getOption) . sharedBoundary b -multiextendTriang :: ∀ t n n' x . (KnownNat n', WithField ℝ Manifold x, n~S n')-          => [SimplexIT t Z x] -> TriangBuild t n x ()-multiextendTriang vs = do-   ps <- mapM lookVertexIT vs-   sides <- lift $ Map.toList <$> get-   forM_ sides $ \(f,(m,s)) ->-      case optimalBottomExtension s ps of-        Option (Just c) -> spanSemiOpenSimplex (vs !! c) f-        _               -> return [] --- | BUGGY: this does connect the supplied triangulations, but it doesn't choose---   the right boundary simplices yet. Probable cause: inconsistent internal---   numbering of the subsimplices.-autoglueTriangulation :: ∀ t n n' n'' x-            . (KnownNat n'', WithField ℝ Manifold x, n~S n', n'~S n'')-           => (∀ t' . TriangBuild t' n' x ()) -> TriangBuild t n' x ()-autoglueTriangulation tb = do-    mbBounds <- Map.toList <$> lift get-    mps <- pointsOfSurf mbBounds-    -    WriterT gbBounds <- liftInTriangT $ mixinTriangulation tb'-    lift . forM_ gbBounds $ \(i,ms) -> do-        modify' $ Map.insert i ms-    gps <- pointsOfSurf gbBounds-    -    autoglue mps gbBounds-    autoglue gps mbBounds-    - where tb' :: ∀ s . TriangT s n x Identity-                     (WriterT (Metric x, ISimplex n x) [] (SimplexIT s n' x))-       tb' = unliftInTriangT (`evalStateT`mempty) $-                  tb >> (WriterT . Map.toList) <$> lift get-       -       pointsOfSurf s = fnubConcatMap Hask.toList <$> forM s (lookSplxVerticesIT . fst)-       -       autoglue :: [SimplexIT t Z x] -> [(SimplexIT t n' x, (Metric x, ISimplex n x))]-                       -> TriangBuild t n' x ()-       autoglue vs sides = do-          forM_ sides $ \(f,_) -> do-             possibs <- forM vs $ \p -> fmap(p,) <$> hypotheticalSimplexScore p f-             case catOptions possibs of-               [] -> return ()-               qs -> do-                 spanSemiOpenSimplex (fst `id` maximumBy (comparing $ snd) qs) f-                 return ()   data AutoTriang n x where   AutoTriang :: { getAutoTriang :: ∀ t . TriangBuild t n x () } -> AutoTriang (S n) x -instance (KnownNat n, WithField ℝ Manifold x) => Semigroup (AutoTriang (S (S n)) x) where-  (<>) = autoTriangMappend -autoTriangMappend :: ∀ n n' n'' x . ( KnownNat n'', n ~ S n', n' ~ S n''-                                    , WithField ℝ Manifold x             )-          => AutoTriang n x -> AutoTriang n x -> AutoTriang n x-AutoTriang a `autoTriangMappend` AutoTriang b = AutoTriang c- where c :: ∀ t . TriangBuild t n' x ()-       c = a >> autoglueTriangulation b -elementaryTriang :: ∀ n n' x . (KnownNat n', n~S n', WithField ℝ EuclidSpace x)-                      => Simplex n x -> AutoTriang n x-elementaryTriang t = AutoTriang (fullOpenSimplex m t >> return ())- where m = euclideanMetric t- breakdownAutoTriang :: ∀ n n' x . (KnownNat n', n ~ S n') => AutoTriang n x -> [Simplex n x] breakdownAutoTriang (AutoTriang t) = doTriangBuild t          @@ -1391,28 +1302,10 @@   --- triangulate :: forall x n . (KnownNat n, WithField ℝ Manifold x)---                  => ShadeTree x -> Triangulation n x--- triangulate (DisjointBranches _ brs)---     = Triangulation $ Hask.foldMap (getTriangulation . triangulate) brs--- triangulate (PlainLeaves xs) = primitiveTriangulation xs --- triangBranches :: WithField ℝ Manifold x---                  => ShadeTree x -> Branchwise x (Triangulation x) n--- triangBranches _ = undefined--- --- tringComplete :: WithField ℝ Manifold x---                  => Triangulation x (n-1) -> Triangulation x n -> Triangulation x n--- tringComplete (Triangulation trr) (Triangulation tr) = undefined---  where ---        bbSimplices = Map.fromList [(i, Left s) | s <- tr | i <- [0::Int ..] ]---        bbVertices =       [(i, splxVertices s) | s <- tr | i <- [0::Int ..] ]--- -    - -- | -- @ -- 'SimpleTree' x &#x2245; Maybe (x, 'Trees' x)@@ -1441,7 +1334,7 @@ deriving instance Show (c (x, GenericTree b b x)) => Show (GenericTree c b x)  -- | Imitate the specialised 'ShadeTree' structure with a simpler, generic tree.-onlyNodes :: WithField ℝ Manifold x => ShadeTree x -> Trees x+onlyNodes :: (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ShadeTree x -> Trees x onlyNodes (PlainLeaves []) = GenericTree [] onlyNodes (PlainLeaves ps) = let (ctr,_) = pseudoECM $ NE.fromList ps                              in GenericTree [ (ctr, GenericTree $ (,mempty) <$> ps) ]@@ -1475,7 +1368,8 @@   mappend = (<>)  -chainsaw :: WithField ℝ Manifold x => Cutplane x -> ShadeTree x -> Sawbones x+chainsaw :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+               => Cutplane x -> ShadeTree x -> Sawbones x chainsaw cpln (PlainLeaves xs) = Sawbones (sd1++) (sd2++) sd2 sd1  where (sd1,sd2) = partition (\x -> sideOfCut cpln x == Option(Just PositiveHalfSphere)) xs chainsaw cpln (DisjointBranches _ brs) = Hask.foldMap (chainsaw cpln) brs@@ -1490,7 +1384,7 @@                where shelter dpCutDist dq = case ptsDist dp dq of                         Option (Just d) -> d < abs dpCutDist                         _               -> False-                     ptsDist = fmap (metric $ recipMetric bexpa) .: (.-~.)+                     ptsDist = fmap (dualNorm bexpa|$|) .: (.-~.)        fathomCD = fathomCutDistance cpln bexpa         @@ -1510,7 +1404,7 @@   -- | Saw a tree into the domains covered by the respective branches of another tree.-sShSaw :: WithField ℝ Manifold x+sShSaw :: (WithField ℝ Manifold x, SimpleSpace (Needle x))           => ShadeTree x   -- ^ &#x201c;Reference tree&#x201d;, defines the cut regions.                            --   Must be at least one level of 'OverlappingBranches' deep.           -> ShadeTree x   -- ^ Tree to take the actual contents from.@@ -1551,7 +1445,7 @@                       where shelter dpCutDist dq = case ptsDist dp dq of                              Option (Just d) -> d < abs dpCutDist                              _               -> False-                            ptsDist = fmap (metric $ recipMetric bexpa) .: (.-~.)+                            ptsDist = fmap (dualNorm bexpa|$|) .: (.-~.)                      fathomCD = fathomCutDistance cpl bexpa sShSaw _ _ = error "`sShSaw` is not supposed to cut anything else but `OverlappingBranches`" @@ -1566,7 +1460,7 @@  instance (NFData x, NFData y) => NFData (WithAny x y) -instance (Semimanifold x) => Semimanifold (x`WithAny`y) where+instance ∀ x y . (Semimanifold x) => Semimanifold (x`WithAny`y) where   type Needle (WithAny x y) = Needle x   type Interior (WithAny x y) = Interior x `WithAny` y   WithAny y x .+~^ δx = WithAny y $ x.+~^δx@@ -1577,6 +1471,8 @@                             (Interior x`WithAny`y -> Needle x -> Interior x`WithAny`y)          tpWD = Tagged `id` \(WithAny y x) δx -> WithAny y $ tpx x δx           where Tagged tpx = translateP :: Tagged x (Interior x -> Needle x -> Interior x)+  semimanifoldWitness = case semimanifoldWitness :: SemimanifoldWitness x of+                          SemimanifoldWitness -> SemimanifoldWitness              instance (PseudoAffine x) => PseudoAffine (x`WithAny`y) where   WithAny _ x .-~. WithAny _ ξ = x.-~.ξ@@ -1624,7 +1520,8 @@ -- | This is to 'ShadeTree' as 'Data.Map.Map' is to 'Data.Set.Set'. type x`Shaded`y = ShadeTree (x`WithAny`y) -stiWithDensity :: (WithField ℝ Manifold x, WithField ℝ LinearManifold y)+stiWithDensity :: ( WithField ℝ Manifold x, WithField ℝ LinearManifold y+                  , SimpleSpace (Needle x) )          => x`Shaded`y -> x -> Cℝay y stiWithDensity (PlainLeaves lvs)   | [locShape@(Shade baryc expa)] <- pointsShades $ _topological <$> lvs@@ -1641,12 +1538,12 @@ stiWithDensity (OverlappingBranches n (Shade (WithAny _ bc) extend) brs) = ovbSWD  where ovbSWD x = case x .-~. bc of            Option (Just v)-             | dist² <- metricSq ε v+             | dist² <- normSq ε v              , dist² < 9              , att <- exp(1/(dist²-9)+1/9)                -> qGather att $ fmap ($x) downPrepared            _ -> coneTip-       ε = recipMetric extend+       ε = dualNorm extend        downPrepared = dp =<< brs         where dp (DBranch _ (Hourglass up dn))                  = fmap stiWithDensity $ up:|[dn]@@ -1655,14 +1552,14 @@         where dens = sum (hParamCℝay <$> contribs)  stiAsIntervalMapping :: (x ~ ℝ, y ~ ℝ)-            => x`Shaded`y -> [(x, ((y, Diff y), Linear ℝ x y))]+            => x`Shaded`y -> [(x, ((y, Diff y), LinearMap ℝ x y))] stiAsIntervalMapping = twigsWithEnvirons >=> pure.snd.fst >=> completeTopShading >=> pure.              \(Shade' (xloc, yloc) shd)-                 -> ( xloc, ( (yloc, recip $ metric shd (0,1))-                            , case covariance (recipMetric' shd) of-                                {Option(Just j)->j} ) )+                 -> ( xloc, ( (yloc, recip $ shd|$|(0,1))+                            , dependence (dualNorm shd) ) ) -smoothInterpolate :: (WithField ℝ Manifold x, WithField ℝ LinearManifold y)+smoothInterpolate :: ( WithField ℝ Manifold x, WithField ℝ LinearManifold y+                     , SimpleSpace (Needle x) )              => NonEmpty (x,y) -> x -> y smoothInterpolate l = \x ->              case ltr x of@@ -1674,7 +1571,8 @@        ltr = stiWithDensity $ fromLeafPoints l'  -spanShading :: ∀ x y . (WithField ℝ Manifold x, WithField ℝ Manifold y)+spanShading :: ∀ x y . ( WithField ℝ Manifold x, WithField ℝ Manifold y+                       , SimpleSpace (Needle x), SimpleSpace (Needle y) )           => (Shade x -> Shade y) -> ShadeTree x -> x`Shaded`y spanShading f = unsafeFmapTree addYs id addYSh  where addYs :: NonEmpty x -> NonEmpty (x`WithAny`y)@@ -1683,7 +1581,7 @@           where [xsh@(Shade xmid _)] = pointsCovers $ toList l                 Shade ymid yexpa = f xsh                 yexamp = [ ymid .+~^ σ*^δy-                         | δy <- eigenSpan yexpa, σ <- [-1,1] ]+                         | δy <- normSpanningSystem yexpa, σ <- [-1,1] ]        addYSh :: Shade x -> Shade (x`WithAny`y)        addYSh xsh = shadeWithAny (_shadeCtr $ f xsh) xsh                       
Data/Manifold/Types.hs view
@@ -26,7 +26,7 @@ {-# LANGUAGE PatternGuards            #-} {-# LANGUAGE TypeOperators            #-} {-# LANGUAGE ScopedTypeVariables      #-}-{-# LANGUAGE RecordWildCards          #-}+{-# LANGUAGE UnicodeSyntax            #-}   module Data.Manifold.Types (@@ -37,10 +37,10 @@         , Disk1, Disk2, Cone, OpenCone         -- * Linear manifolds         , ZeroDim(..)-        , ℝ⁰, ℝ, ℝ², ℝ³+        , ℝ, ℝ⁰, ℝ¹, ℝ², ℝ³, ℝ⁴         -- * Hyperspheres         -- ** General form: Stiefel manifolds-        , Stiefel1, stiefel1Project, stiefel1Embed+        , Stiefel1(..), stiefel1Project, stiefel1Embed         -- ** Specific examples         , HasUnitSphere(..)         , S⁰(..), S¹(..), S²(..)@@ -57,27 +57,29 @@         , Cutplane(..)         , fathomCutDistance, sideOfCut, cutPosBetween         -- * Linear mappings-        , Linear, LocalLinear, denseLinear+        , LinearMap, LocalLinear    ) where   import Data.VectorSpace+import Data.VectorSpace.Free import Data.AffineSpace import Data.MemoTrie (HasTrie(..)) import Data.Basis import Data.Fixed import Data.Tagged import Data.Semigroup-import qualified Numeric.LinearAlgebra.HMatrix as HMat import qualified Data.Vector.Generic as Arr import qualified Data.Vector+import qualified Data.Vector.Unboxed as UArr+import Data.List (maximumBy)+import Data.Ord (comparing)  import Data.Manifold.Types.Primitive+import Data.Manifold.Types.Stiefel import Data.Manifold.PseudoAffine import Data.Manifold.Cone-import Data.LinearMap.HerMetric-import Data.VectorSpace.FiniteDimensional-import Data.LinearMap.Category (Linear, denseLinear)+import Math.LinearMap.Category  import qualified Prelude @@ -86,6 +88,8 @@ import Control.Monad.Constrained import Data.Foldable.Constrained +import Data.Type.Coercion+ #define deriveAffine(c,t)                \ instance (c) => Semimanifold (t) where {  \   type Needle (t) = Diff (t);              \@@ -97,127 +101,173 @@   a.-~.b = pure (a.-.b);      }  -newtype Stiefel1Needle v = Stiefel1Needle { getStiefel1Tangent :: HMat.Vector (Scalar v) }+newtype Stiefel1Needle v = Stiefel1Needle { getStiefel1Tangent :: UArr.Vector (Scalar v) } newtype Stiefel1Basis v = Stiefel1Basis { getStiefel1Basis :: Int }-s1bTrie :: forall v b. FiniteDimensional v => (Stiefel1Basis v->b) -> Stiefel1Basis v:->:b+s1bTrie :: ∀ v b. FiniteFreeSpace v => (Stiefel1Basis v->b) -> Stiefel1Basis v:->:b s1bTrie = \f -> St1BTrie $ fmap (f . Stiefel1Basis) allIs- where (Tagged d) = dimension :: Tagged v Int+ where d = freeDimension ([]::[v])        allIs = Arr.fromList [0 .. d-2] -instance FiniteDimensional v => HasTrie (Stiefel1Basis v) where+instance FiniteFreeSpace v => HasTrie (Stiefel1Basis v) where   data (Stiefel1Basis v :->: a) = St1BTrie ( Array a )   trie = s1bTrie; untrie (St1BTrie a) (Stiefel1Basis i) = a Arr.! i   enumerate (St1BTrie a) = Arr.ifoldr (\i x l -> (Stiefel1Basis i,x):l) [] a  type Array = Data.Vector.Vector -instance(SmoothScalar(Scalar v),FiniteDimensional v)=>AdditiveGroup(Stiefel1Needle v) where-  Stiefel1Needle v ^+^ Stiefel1Needle w = Stiefel1Needle $ v + w-  zeroV = s1nZ; negateV (Stiefel1Needle v) = Stiefel1Needle $ negate v-s1nZ :: forall v. FiniteDimensional v => Stiefel1Needle v-s1nZ=Stiefel1Needle .HMat.fromList$replicate(d-1)0 where(Tagged d)=dimension::Tagged v Int+instance (FiniteFreeSpace v, UArr.Unbox (Scalar v))+                        => AdditiveGroup(Stiefel1Needle v) where+  Stiefel1Needle v ^+^ Stiefel1Needle w = Stiefel1Needle $ uarrAdd v w+  Stiefel1Needle v ^-^ Stiefel1Needle w = Stiefel1Needle $ uarrSubtract v w+  zeroV = s1nZ; negateV (Stiefel1Needle v) = Stiefel1Needle $ UArr.map negate v -instance (SmoothScalar(Scalar v),FiniteDimensional v)=>VectorSpace(Stiefel1Needle v) where+uarrAdd :: (Num n, UArr.Unbox n) => UArr.Vector n -> UArr.Vector n -> UArr.Vector n+uarrAdd = UArr.zipWith (+)+uarrSubtract :: (Num n, UArr.Unbox n) => UArr.Vector n -> UArr.Vector n -> UArr.Vector n+uarrSubtract = UArr.zipWith (-)++s1nZ :: ∀ v. (FiniteFreeSpace v, UArr.Unbox (Scalar v)) => Stiefel1Needle v+s1nZ = Stiefel1Needle . UArr.fromList $ replicate (d-1) 0+ where d = freeDimension ([]::[v])++instance (FiniteFreeSpace v, UArr.Unbox (Scalar v)) => VectorSpace (Stiefel1Needle v) where   type Scalar (Stiefel1Needle v) = Scalar v-  μ *^ Stiefel1Needle v = Stiefel1Needle $ HMat.scale μ v+  μ *^ Stiefel1Needle v = Stiefel1Needle $ uarrScale μ v -instance (SmoothScalar (Scalar v), FiniteDimensional v)=>HasBasis (Stiefel1Needle v) where+uarrScale :: (Num n, UArr.Unbox n) => n -> UArr.Vector n -> UArr.Vector n+uarrScale μ = UArr.map (*μ)++instance (FiniteFreeSpace v, UArr.Unbox (Scalar v)) => HasBasis (Stiefel1Needle v) where   type Basis (Stiefel1Needle v) = Stiefel1Basis v   basisValue = s1bV-  decompose (Stiefel1Needle v) = zipWith ((,).Stiefel1Basis) [0..] $ HMat.toList v-  decompose' (Stiefel1Needle v) (Stiefel1Basis i) = v HMat.! i-s1bV :: forall v b. FiniteDimensional v => Stiefel1Basis v -> Stiefel1Needle v+  decompose (Stiefel1Needle v) = zipWith ((,).Stiefel1Basis) [0..] $ UArr.toList v+  decompose' (Stiefel1Needle v) (Stiefel1Basis i) = v UArr.! i++s1bV :: ∀ v b. (FiniteFreeSpace v, UArr.Unbox (Scalar v))+                  => Stiefel1Basis v -> Stiefel1Needle v s1bV = \(Stiefel1Basis i) -> Stiefel1Needle-            $ HMat.fromList [ if k==i then 1 else 0 | k<-[0..d-2] ]- where (Tagged d) = dimension :: Tagged v Int+            $ UArr.fromList [ if k==i then 1 else 0 | k<-[0..d-2] ]+ where d = freeDimension ([]::[v]) -instance (SmoothScalar (Scalar v), FiniteDimensional v)-             => FiniteDimensional (Stiefel1Needle v) where-  dimension = s1nD-  basisIndex = Tagged $ \(Stiefel1Basis i) -> i-  indexBasis = Tagged Stiefel1Basis-  fromPackedVector = Stiefel1Needle-  asPackedVector = getStiefel1Tangent-s1nD :: forall v. FiniteDimensional v => Tagged (Stiefel1Needle v) Int-s1nD = Tagged (d - 1) where (Tagged d) = dimension :: Tagged v Int+instance (FiniteFreeSpace v, UArr.Unbox (Scalar v))+                      => FiniteFreeSpace (Stiefel1Needle v) where+  freeDimension = s1nD+  toFullUnboxVect = getStiefel1Tangent+  unsafeFromFullUnboxVect = Stiefel1Needle+s1nD :: ∀ v p . FiniteFreeSpace v => p (Stiefel1Needle v) -> Int+s1nD _ = freeDimension ([]::[v]) - 1 -instance (SmoothScalar (Scalar v), FiniteDimensional v)-             => AffineSpace (Stiefel1Needle v) where+instance (FiniteFreeSpace v, UArr.Unbox (Scalar v)) => AffineSpace (Stiefel1Needle v) where   type Diff (Stiefel1Needle v) = Stiefel1Needle v   (.+^) = (^+^)   (.-.) = (^-^) -deriveAffine((SmoothScalar (Scalar v), FiniteDimensional v), Stiefel1Needle v)+deriveAffine((FiniteFreeSpace v, UArr.Unbox (Scalar v)), Stiefel1Needle v) -instance (MetricScalar (Scalar v), FiniteDimensional v)-              => HasMetric' (Stiefel1Needle v) where-  type DualSpace (Stiefel1Needle v) = Stiefel1Needle v-  Stiefel1Needle v <.>^ Stiefel1Needle w = HMat.dot v w -  functional = s1nF-  doubleDual = id; doubleDual' = id-s1nF :: forall v. FiniteDimensional v => (Stiefel1Needle v->Scalar v)->Stiefel1Needle v-s1nF = \f -> Stiefel1Needle $ HMat.fromList [f $ basisValue b | b <- cb]- where (Tagged cb) = completeBasis :: Tagged (Stiefel1Needle v) [Stiefel1Basis v]+instance ∀ v . (FiniteFreeSpace v, UArr.Unbox (Scalar v))+              => TensorSpace (Stiefel1Needle v) where+  type TensorProduct (Stiefel1Needle v) w = Array w+  zeroTensor = Tensor $ Arr.replicate (freeDimension ([]::[v]) - 1) zeroV+  toFlatTensor = LinearFunction $ Tensor . Arr.convert . getStiefel1Tangent+  fromFlatTensor = LinearFunction $ Stiefel1Needle . Arr.convert . getTensorProduct+  addTensors (Tensor a) (Tensor b) = Tensor $ Arr.zipWith (^+^) a b+  scaleTensor = bilinearFunction $ \μ (Tensor a) -> Tensor $ Arr.map (μ*^) a+  negateTensor = LinearFunction $ \(Tensor a) -> Tensor $ Arr.map negateV a+  tensorProduct = bilinearFunction $ \(Stiefel1Needle n) w+                        -> Tensor $ Arr.map (*^w) $ Arr.convert n+  transposeTensor = LinearFunction $ \(Tensor a) -> Arr.foldl' (^+^) zeroV+       $ Arr.imap ( \i w -> (tensorProduct $ w) $ Stiefel1Needle+                             $ UArr.generate d (\j -> if i==j then 1 else 0) ) a+   where d = freeDimension ([]::[v]) - 1+  fmapTensor = bilinearFunction $ \f (Tensor a) -> Tensor $ Arr.map (f$) a+  fzipTensorWith = bilinearFunction $ \f (Tensor a, Tensor b)+                     -> Tensor $ Arr.zipWith (curry $ arr f) a b+  coerceFmapTensorProduct _ Coercion = Coercion+  +instance ∀ v . (FiniteFreeSpace v, UArr.Unbox (Scalar v), Num''' (Scalar v))+              => LinearSpace (Stiefel1Needle v) where+  type DualVector (Stiefel1Needle v) = Stiefel1Needle v+  linearId = LinearMap . Arr.generate d $ \i -> Stiefel1Needle . Arr.generate d $+                                           \j -> if i==j then 1 else 0+   where d = freeDimension ([]::[v]) - 1+  coerceDoubleDual = Coercion+  blockVectSpan = LinearFunction $ \w -> Tensor . Arr.generate d +                                  $ \i -> LinearMap . Arr.generate d+                                   $ \j -> if i==j then w else zeroV+   where d = freeDimension ([]::[v]) - 1+  blockVectSpan'= LinearFunction $ \w -> LinearMap . Arr.generate d +                                  $ \i -> Tensor . Arr.generate d+                                   $ \j -> if i==j then w else zeroV+   where d = freeDimension ([]::[v]) - 1+  contractTensorMap = LinearFunction $ \(LinearMap m)+                        -> Arr.ifoldl' (\acc i (Tensor t) -> acc ^+^ t Arr.! i) zeroV m+  contractMapTensor = LinearFunction $ \(Tensor m)+                        -> Arr.ifoldl' (\acc i (LinearMap t) -> acc ^+^ t Arr.! i) zeroV m+  contractLinearMapAgainst = bilinearFunction $ \(LinearMap m) f+                        -> Arr.ifoldl' (\acc i w -> case f $ w of+                                          Stiefel1Needle n -> n UArr.! i ) 0 m+  applyDualVector = bilinearFunction $ \(Stiefel1Needle v) (Stiefel1Needle w)+                        -> UArr.sum $ UArr.zipWith (*) v w+  applyLinear = bilinearFunction $ \(LinearMap m) (Stiefel1Needle v)+                        -> Arr.ifoldl' (\acc i w -> acc ^+^ v UArr.! i *^ w) zeroV m+  composeLinear = bilinearFunction $ \f (LinearMap g) -> LinearMap $ Arr.map (f$) g -instance (WithField k LinearManifold v, Real k) => Semimanifold (Stiefel1 v) where +instance ( WithField k LinearManifold v, FiniteFreeSpace v, FiniteFreeSpace (DualVector v)+         , RealFloat k, UArr.Unbox k+         ) => Semimanifold (Stiefel1 v) where    type Needle (Stiefel1 v) = Stiefel1Needle v   fromInterior = id   toInterior = pure   translateP = Tagged (.+~^)-  Stiefel1 s .+~^ Stiefel1Needle n = Stiefel1 . fromPackedVector . HMat.scale (signum s'i)+  Stiefel1 s .+~^ Stiefel1Needle n = Stiefel1 . unsafeFromFullUnboxVect . uarrScale (signum s'i)    $ if| ν==0      -> s' -- ν'≡0 is a special case of this, so we can otherwise assume ν'>0.-       | ν<=2      -> let m = HMat.scale ιmν spro + HMat.scale ((1-abs ιmν)/ν') n+       | ν<=2      -> let m = uarrScale ιmν spro `uarrAdd` uarrScale ((1-abs ιmν)/ν') n                           ιmν = 1-ν                        in insi ιmν m-       | otherwise -> let m = HMat.scale ιmν spro + HMat.scale ((abs ιmν-1)/ν') n+       | otherwise -> let m = uarrScale ιmν spro `uarrAdd` uarrScale ((abs ιmν-1)/ν') n                           ιmν = ν-3                       in insi ιmν m-   where d = HMat.size s'-         s'= asPackedVector s+   where d = UArr.length s'+         s'= toFullUnboxVect s          ν' = l2norm n          quop = signum s'i / ν'          ν = ν' `mod'` 4-         im = HMat.maxIndex $ HMat.cmap abs s'-         s'i = s' HMat.! im-         spro = let v = deli s' in HMat.scale (recip s'i) v+         im = UArr.maxIndex $ UArr.map abs s'+         s'i = s' UArr.! im+         spro = let v = deli s' in uarrScale (recip s'i) v          deli v = Arr.take im v Arr.++ Arr.drop (im+1) v          insi ti v = Arr.generate d $ \i -> if | i<im      -> v Arr.! i                                                | i>im      -> v Arr.! (i-1)                                                 | otherwise -> ti-instance (WithField k LinearManifold v, Real k) => PseudoAffine (Stiefel1 v) where -  Stiefel1 s .-~. Stiefel1 t = pure . Stiefel1Needle $ case s' HMat.! im of-            0 -> HMat.scale (recip $ l2norm delis) delis-            s'i | v <- HMat.scale (recip s'i) delis - tpro+instance ( WithField k LinearManifold v, FiniteFreeSpace v, FiniteFreeSpace (DualVector v)+         , RealFloat k, UArr.Unbox k+         ) => PseudoAffine (Stiefel1 v) where +  Stiefel1 s .-~. Stiefel1 t = pure . Stiefel1Needle $ case s' UArr.! im of+            0 -> uarrScale (recip $ l2norm delis) delis+            s'i | v <- uarrScale (recip s'i) delis `uarrSubtract` tpro                 , absv <- l2norm v                 , absv > 0                        -> let μ = (signum (t'i/s'i) - recip(absv + 1)) / absv-                          in HMat.scale μ v+                          in uarrScale μ v                 | t'i/s'i > 0  -> samePoint                 | otherwise    -> antipode-   where d = HMat.size t'-         s'= asPackedVector s; t' = asPackedVector t-         im = HMat.maxIndex $ HMat.cmap abs t'-         t'i = t' HMat.! im-         tpro = let v = deli t' in HMat.scale (recip t'i) v+   where d = UArr.length t'+         s'= toFullUnboxVect s; t' = toFullUnboxVect t+         im = UArr.maxIndex $ UArr.map abs t'+         t'i = t' UArr.! im+         tpro = let v = deli t' in uarrScale (recip t'i) v          delis = deli s'          deli v = Arr.take im v Arr.++ Arr.drop (im+1) v-         samePoint = (d-1) HMat.|> repeat 0-         antipode = (d-1) HMat.|> (2 : repeat 0)+         samePoint = UArr.replicate (d-1) 0+         antipode = (d-1) `UArr.fromListN` (2 : repeat 0)  -instance ( WithField ℝ HilbertSpace x ) => ConeSemimfd (Stiefel1 x) where-  type CℝayInterior (Stiefel1 x) = x-  fromCℝayInterior (FinVecArrRep v) = case HMat.size v of-      0 -> Cℝay 0 $ Stiefel1 zeroV-      _ -> Cℝay (HMat.norm_2 v) $ Stiefel1 (fromPackedVector v)-  toCℝayInterior (Cℝay 0 _) = pure zeroV-  toCℝayInterior (Cℝay l (Stiefel1 v))-        = pure.FinVecArrRep $ HMat.scale (l/HMat.norm_2 v') v'-   where v' = asPackedVector v+-- instance ( WithField ℝ HilbertManifold x ) => ConeSemimfd (Stiefel1 x) where+--   type CℝayInterior (Stiefel1 x) = x  -l2norm :: MetricScalar s => HMat.Vector s -> s-l2norm = realToFrac . HMat.norm_2+l2norm :: (Floating s, UArr.Unbox s) => UArr.Vector s -> s+l2norm = sqrt . UArr.sum . UArr.map (^2)   @@ -247,7 +297,7 @@  fathomCutDistance :: WithField ℝ Manifold x         => Cutplane x            -- ^ Hyperplane to measure the distance from.-         -> HerMetric'(Needle x) -- ^ Metric to use for measuring that distance.+         -> Metric' x            -- ^ Metric to use for measuring that distance.                                  --   This can only be accurate if the metric                                  --   is valid both around the cut-plane's 'sawHandle', and                                  --   around the points you measure.@@ -259,7 +309,7 @@                                  --   'Nothing' if the point isn't reachable from the plane. fathomCutDistance (Cutplane sh (Stiefel1 cn)) met = \x -> fmap fathom $ x .-~. sh  where fathom v = (cn <.>^ v) / scaleDist-       scaleDist = metric' met cn+       scaleDist = met|$|cn             cutPosBetween :: WithField ℝ Manifold x => Cutplane x -> (x,x) -> Option D¹@@ -270,7 +320,16 @@     | otherwise   = empty  -lineAsPlaneIntersection :: WithField ℝ Manifold x => Line x -> [Cutplane x]-lineAsPlaneIntersection (Line h dir)-      = [Cutplane h nrml | nrml <- orthogonalComplementSpan [dir]]+lineAsPlaneIntersection ::+       (WithField ℝ Manifold x, FiniteDimensional (Needle' x))+           => Line x -> [Cutplane x]+lineAsPlaneIntersection (Line h (Stiefel1 dir))+      = [ Cutplane h . Stiefel1+              $ candidate ^-^ worstCandidate ^* (overlap/worstOvlp)+        | (i, (candidate, overlap)) <- zip [0..] $ zip candidates overlaps+        , i /= worstId ]+ where candidates = enumerateSubBasis entireBasis+       overlaps = (<.>^dir) <$> candidates+       (worstId, worstOvlp) = maximumBy (comparing $ abs . snd) $ zip [0..] overlaps+       worstCandidate = candidates !! worstId 
Data/Manifold/Types/Primitive.hs view
@@ -37,8 +37,8 @@         , Projective1, Projective2         , Disk1, Disk2, Cone, OpenCone         -- * Linear manifolds-        , ZeroDim(..), isoAttachZeroDim-        , ℝ⁰, ℝ, ℝ², ℝ³+        , ZeroDim(..)+        , ℝ, ℝ⁰, ℝ¹, ℝ², ℝ³, ℝ⁴         -- * Hyperspheres         , S⁰(..), otherHalfSphere, S¹(..), S²(..)         -- * Projective spaces@@ -57,12 +57,15 @@   import Data.VectorSpace+import Data.VectorSpace.Free+import Linear.V2+import Linear.V3+import Math.VectorSpace.ZeroDimensional import Data.AffineSpace import Data.Basis import Data.Void import Data.Monoid--import qualified Numeric.LinearAlgebra.HMatrix as HMat+import Math.LinearMap.Category ((⊗)())  import Control.Applicative (Const(..), Alternative(..)) @@ -91,35 +94,7 @@   --- | A single point. Can be considered a zero-dimensional vector space, WRT any scalar.-data ZeroDim k = Origin deriving(Eq, Show)-instance Monoid (ZeroDim k) where-  mempty = Origin-  mappend Origin Origin = Origin-instance AffineSpace (ZeroDim k) where-  type Diff (ZeroDim k) = ZeroDim k-  Origin .+^ Origin = Origin-  Origin .-. Origin = Origin-instance AdditiveGroup (ZeroDim k) where-  zeroV = Origin-  Origin ^+^ Origin = Origin-  negateV Origin = Origin-instance VectorSpace (ZeroDim k) where-  type Scalar (ZeroDim k) = k-  _ *^ Origin = Origin-instance HasBasis (ZeroDim k) where-  type Basis (ZeroDim k) = Void-  basisValue = absurd-  decompose Origin = []-  decompose' Origin = absurd -{-# INLINE isoAttachZeroDim #-}-isoAttachZeroDim :: ( WellPointed c, UnitObject c ~ (), ObjectPair c a ()-                    , Object c (ZeroDim k), ObjectPair c a (ZeroDim k)-                    , PointObject c (ZeroDim k) )-                       => Isomorphism c a (a, ZeroDim k)-isoAttachZeroDim = second (Isomorphism (const Origin) terminal) . attachUnit- -- | The zero-dimensional sphere is actually just two points. Implementation might --   therefore change to @ℝ⁰ 'Control.Category.Constrained.+' ℝ⁰@: the disjoint sum of two --   single-point spaces.@@ -188,11 +163,8 @@   --- | Dense tensor product of two vector spaces.-newtype x⊗y = DensTensProd { getDensTensProd :: HMat.Matrix (Scalar y) }  - class NaturallyEmbedded m v where   embed :: m -> v   coEmbed :: v -> m@@ -211,16 +183,16 @@   coEmbed x | x>=0       = PositiveHalfSphere             | otherwise  = NegativeHalfSphere instance NaturallyEmbedded S¹ ℝ² where-  embed (S¹ φ) = (cos φ, sin φ)-  coEmbed (x,y) = S¹ $ atan2 y x+  embed (S¹ φ) = V2 (cos φ) (sin φ)+  coEmbed (V2 x y) = S¹ $ atan2 y x instance NaturallyEmbedded S² ℝ³ where-  embed (S² ϑ φ) = ((cos φ * sin ϑ, sin φ * sin ϑ), cos ϑ)-  coEmbed ((x,y),z) = S² (acos $ z/r) (atan2 y x)+  embed (S² ϑ φ) = V3 (cos φ * sin ϑ) (sin φ * sin ϑ) (cos ϑ)+  coEmbed (V3 x y z) = S² (acos $ z/r) (atan2 y x)    where r = sqrt $ x^2 + y^2 + z^2   instance NaturallyEmbedded ℝP² ℝ³ where-  embed (ℝP² r φ) = ((r * cos φ, r * sin φ), sqrt $ 1-r^2)-  coEmbed ((x,y),z) = ℝP² (sqrt $ 1-(z/r)^2) (atan2 (y/r) (x/r))+  embed (ℝP² r φ) = V3 (r * cos φ) (r * sin φ) (sqrt $ 1-r^2)+  coEmbed (V3 x y z) = ℝP² (sqrt $ 1-(z/r)^2) (atan2 (y/r) (x/r))    where r = sqrt $ x^2 + y^2 + z^2  instance NaturallyEmbedded D¹ ℝ where@@ -236,10 +208,12 @@ type Endomorphism a = a->a  -type ℝ⁰ = ZeroDim ℝ type ℝ = Double-type ℝ² = (ℝ,ℝ)-type ℝ³ = (ℝ²,ℝ)+type ℝ⁰ = ZeroDim ℝ+type ℝ¹ = V1 ℝ+type ℝ² = V2 ℝ+type ℝ³ = V3 ℝ+type ℝ⁴ = V4 ℝ   -- | Better known as &#x211d;&#x207a; (which is not a legal Haskell name), the ray
+ Data/Manifold/Types/Stiefel.hs view
@@ -0,0 +1,48 @@+-- |+-- Module      : Data.Manifold.Types.Stiefel+-- Copyright   : (c) Justus Sagemüller 2015+-- License     : GPL v3+-- +-- Maintainer  : (@) sagemueller $ geo.uni-koeln.de+-- Stability   : experimental+-- Portability : portable+-- +-- Stiefel manifolds are a generalisation of the concept of the 'UnitSphere'+-- in real vector spaces.+-- The /n/-th Stiefel manifold is the space of all possible configurations of+-- /n/ orthonormal vectors. In the case /n/ = 1, simply a single normalised vector,+-- i.e. a vector on the unit sphere.+-- +-- Alternatively, the stiefel manifolds can be defined as quotient spaces under+-- scalings, and we prefer that definition since it doesn't require a notion of+-- unit length (which is only defined in inner-product spaces).+++++module Data.Manifold.Types.Stiefel where+++import Data.Maybe+import qualified Data.Vector as Arr+import Data.Semigroup++import Data.VectorSpace+import Data.AffineSpace+import Math.LinearMap.Category++import Data.Manifold.Types.Primitive ((^), empty, embed, coEmbed)+import Data.Manifold.PseudoAffine+    +import qualified Prelude as Hask hiding(foldl, sum, sequence)+import qualified Control.Applicative as Hask+import qualified Control.Monad       as Hask hiding(forM_, sequence)++import Control.Category.Constrained.Prelude hiding+     ((^), all, elem, sum, forM, Foldable(..), Traversable)+import Control.Arrow.Constrained+import Control.Monad.Constrained hiding (forM)+import Data.Foldable.Constrained+++newtype Stiefel1 v = Stiefel1 { getStiefel1N :: DualVector v }
Data/Manifold/Web.hs view
@@ -66,7 +66,8 @@ import Control.DeepSeq  import Data.VectorSpace-import Data.LinearMap.HerMetric+import Math.LinearMap.Category+ import Data.Tagged import Data.Function (on) import Data.Fixed (mod')@@ -111,7 +112,7 @@    }   deriving (Generic) -instance (NFData x, NFData (HerMetric (Needle x))) => NFData (Neighbourhood x)+instance (NFData x, NFData (Metric x)) => NFData (Neighbourhood x)  -- | A 'PointsWeb' is almost, but not quite a mesh. It is a stongly connected† --   directed graph, backed by a tree for fast nearest-neighbour lookup of points.@@ -125,7 +126,7 @@      } -> PointsWeb x y   deriving (Generic, Hask.Functor, Hask.Foldable, Hask.Traversable) -instance (NFData x, NFData (HerMetric (Needle x)), NFData (Needle' x), NFData y) => NFData (PointsWeb x y)+instance (NFData x, NFData (Metric x), NFData (Needle' x), NFData y) => NFData (PointsWeb x y)  instance Foldable (PointsWeb x) (->) (->) where   ffoldl = uncurry . Hask.foldl' . curry@@ -141,23 +142,23 @@ type MetricChoice x = Shade x -> Metric x  -fromWebNodes :: ∀ x y . WithField ℝ Manifold x+fromWebNodes :: ∀ x y . (WithField ℝ Manifold x, SimpleSpace (Needle x))                     => (MetricChoice x) -> [(x,y)] -> PointsWeb x y fromWebNodes mf = fromShaded mf . fromLeafPoints . map (uncurry WithAny . swap) -fromTopWebNodes :: ∀ x y . WithField ℝ Manifold x+fromTopWebNodes :: ∀ x y . (WithField ℝ Manifold x, SimpleSpace (Needle x))                     => (MetricChoice x) -> [((x,[Needle x]),y)] -> PointsWeb x y fromTopWebNodes mf = fromTopShaded mf . fromLeafPoints                    . map (uncurry WithAny . swap . regroup') -fromShadeTree_auto :: ∀ x . WithField ℝ Manifold x => ShadeTree x -> PointsWeb x ()-fromShadeTree_auto = fromShaded (recipMetric . _shadeExpanse) . constShaded ()+fromShadeTree_auto :: ∀ x . (WithField ℝ Manifold x, SimpleSpace (Needle x)) => ShadeTree x -> PointsWeb x ()+fromShadeTree_auto = fromShaded (dualNorm . _shadeExpanse) . constShaded () -fromShadeTree :: ∀ x . WithField ℝ Manifold x+fromShadeTree :: ∀ x . (WithField ℝ Manifold x, SimpleSpace (Needle x))      => (Shade x -> Metric x) -> ShadeTree x -> PointsWeb x () fromShadeTree mf = fromShaded mf . constShaded () -fromShaded :: ∀ x y . WithField ℝ Manifold x+fromShaded :: ∀ x y . (WithField ℝ Manifold x, SimpleSpace (Needle x))      => (MetricChoice x) -- ^ Local scalar-product generator. You can always                               --   use @'recipMetric' . '_shadeExpanse'@ (but this                               --   may give distortions compared to an actual@@ -166,7 +167,7 @@      -> PointsWeb x y fromShaded metricf = fromTopShaded metricf . fmapShaded ([],) -fromTopShaded :: ∀ x y . WithField ℝ Manifold x+fromTopShaded :: ∀ x y . (WithField ℝ Manifold x, SimpleSpace (Needle x))      => (MetricChoice x)      -> (x`Shaded`([Needle x], y))  -- ^ Source tree, with a priori topology information                                     --   (needles pointing to already-known neighbour candidates)@@ -203,7 +204,7 @@                               oldNgbs <- get                               when (all (\(_,(_,nw)) -> visibleOverlap nw v) oldNgbs) `id`do                                  let w = w₀ ^/ (w₀<.>^v)-                                      where w₀ = toDualWith locRieM v+                                      where w₀ = locRieM<$|v                                  put $ (iNgb, (v,w))                                        : [ neighbour                                          | neighbour@(_,(nv,_))<-oldNgbs@@ -226,7 +227,8 @@                                    ++ Hask.foldMap (onlyLeaves . snd) neighRegions of                           [sh₀] -> metricf sh₀ -indexWeb :: WithField ℝ Manifold x => PointsWeb x y -> WebNodeId -> Option (x,y)+indexWeb :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+                => PointsWeb x y -> WebNodeId -> Option (x,y) indexWeb (PointsWeb rsc assocD) i   | i>=0, i<Arr.length assocD   , Right (_,x) <- indexShadeTree rsc i  = pure (x, fst (assocD Arr.! i))@@ -235,7 +237,7 @@ unsafeIndexWebData :: PointsWeb x y -> WebNodeId -> y unsafeIndexWebData (PointsWeb _ asd) i = fst (asd Arr.! i) -webEdges :: ∀ x y . WithField ℝ Manifold x+webEdges :: ∀ x y . (WithField ℝ Manifold x, SimpleSpace (Needle x))             => PointsWeb x y -> [((x,y), (x,y))] webEdges web@(PointsWeb rsc assoc) = (lookId***lookId) <$> toList allEdges  where allEdges :: Set.Set (WebNodeId,WebNodeId)@@ -269,7 +271,8 @@ -- | Fetch a point between any two neighbouring web nodes on opposite --   sides of the plane, and linearly interpolate the values onto the --   cut plane.-sliceWeb_lin :: ∀ x y . (WithField ℝ Manifold x, Geodesic x, Geodesic y)+sliceWeb_lin :: ∀ x y . ( WithField ℝ Manifold x, SimpleSpace (Needle x)+                        , Geodesic x, Geodesic y )                => PointsWeb x y -> Cutplane x -> [(x,y)] sliceWeb_lin web = sliceEdgs  where edgs = webEdges web@@ -300,14 +303,16 @@     = GridSetup (x₀,y₀) [ GridPlanes (0,1) (0, (y₁-y₀)/fromIntegral ny) ny                         , GridPlanes (1,0) ((x₁-x₀)/fromIntegral nx, 0) ny ] -splitToGridLines :: (WithField ℝ Manifold x, Geodesic x, Geodesic y)+splitToGridLines :: ( WithField ℝ Manifold x, SimpleSpace (Needle x)+                    , Geodesic x, Geodesic y )           => PointsWeb x y -> GridSetup x -> [((x, GridPlanes x), [(x,y)])] splitToGridLines web (GridSetup x₀ [GridPlanes dirΩ spcΩ nΩ, linePln])     = [ ((x₀', linePln), sliceWeb_lin web $ Cutplane x₀' (Stiefel1 dirΩ))       | k <- [0 .. nΩ-1]       , let x₀' = x₀.+~^(fromIntegral k *^ spcΩ) ] -sampleWebAlongGrid_lin :: ∀ x y . (WithField ℝ Manifold x, Geodesic x, Geodesic y)+sampleWebAlongGrid_lin :: ∀ x y . ( WithField ℝ Manifold x, SimpleSpace (Needle x)+                                  , Geodesic x, Geodesic y )                => PointsWeb x y -> GridSetup x -> [(x,Option y)] sampleWebAlongGrid_lin web grid = finalLine =<< splitToGridLines web grid  where finalLine :: ((x, GridPlanes x), [(x,y)]) -> [(x,Option y)]@@ -315,13 +320,13 @@           | length verts < 2  = take nSpl $ (,empty)<$>iterate (.+~^dir) x₀        finalLine ((x₀, GridPlanes _ dir nSpl), verts)  = take nSpl $ go (x₀,0) intpseq          where intpseq = mkInterpolationSeq_lin-                         [ (metric metr $ x.-~!x₀, y) | (x,y) <- verts ]+                         [ (metr |$| x.-~!x₀, y) | (x,y) <- verts ]               go (x,_) [] = (,empty)<$>iterate (.+~^dir) x               go xt (InterpolationIv (_,te) f:fs)                         = case break ((<te) . snd) $ iterate ((.+~^dir)***(+1)) xt of                              (thisRange, xtn:_)                                  -> ((id***pure.f)<$>thisRange) ++ go xtn fs-       Option (Just metr) = inferMetric $ webNodeRsc web+       metr = inferMetric $ webNodeRsc web         sampleWeb_2Dcartesian_lin :: (x~ℝ, y~ℝ, Geodesic z)              => PointsWeb (x,y) z -> ((x,x),Int) -> ((y,y),Int) -> [(y,[(x,Option z)])]@@ -359,7 +364,7 @@                 }, ngbH )        anyUnopposed rieM ngbCo = (`any`ngbCo) $ \(v,_)                          -> not $ (`any`ngbCo) $ \(v',_)-                              -> toDualWith rieM v <.>^ v' < 0+                              -> (rieM<$|v) <.>^ v' < 0  localFocusWeb :: WithField ℝ Manifold x                    => PointsWeb x y -> PointsWeb x ((x,y), [(Needle x, y)])@@ -376,16 +381,16 @@                  ) asd'  -nearestNeighbour :: WithField ℝ Manifold x+nearestNeighbour :: (WithField ℝ Manifold x, SimpleSpace (Needle x))                       => PointsWeb x y -> x -> Option (x,y) nearestNeighbour (PointsWeb rsc asd) x = fmap lkBest $ positionIndex empty rsc x  where lkBest (iEst, (_, xEst)) = (xProx, yProx)         where (iProx, (xProx, _)) = minimumBy (comparing $ snd . snd)-                                     $ (iEst, (xEst, metricSq locMetr vEst))+                                     $ (iEst, (xEst, normSq locMetr vEst))                                          : neighbours               (yProx, _) = asd Arr.! iProx               (_, Neighbourhood neighbourIds locMetr) = asd Arr.! iEst-              neighbours = [ (i, (xNgb, metricSq locMetr v))+              neighbours = [ (i, (xNgb, normSq locMetr v))                            | i <- UArr.toList neighbourIds                            , let Right (_, xNgb) = indexShadeTree rsc i                                  Option (Just v) = xNgb.-~.x@@ -417,7 +422,8 @@   -toGraph :: WithField ℝ Manifold x => PointsWeb x y -> (Graph, Vertex -> (x, y))+toGraph :: (WithField ℝ Manifold x, SimpleSpace (Needle x))+              => PointsWeb x y -> (Graph, Vertex -> (x, y)) toGraph wb = second (>>> \(i,_,_) -> case indexWeb wb i of {Option (Just xy) -> xy})                 (graphFromEdges' edgs)  where edgs :: [(Int, Int, [Int])]@@ -468,13 +474,15 @@ dupHead (x:|xs) = x:|x:xs  -iterateFilterDEqn_static :: (WithField ℝ Manifold x, Refinable y)+iterateFilterDEqn_static :: ( WithField ℝ Manifold x, SimpleSpace (Needle x)+                            , Refinable y )        => DifferentialEqn x y -> PointsWeb x (Shade' y) -> [PointsWeb x (Shade' y)] iterateFilterDEqn_static f = map (fmap convexSetHull)                            . itWhileJust (filterDEqnSolutions_static f)                            . fmap (`ConvexSet`[]) -filterDEqnSolution_static :: (WithField ℝ Manifold x, Refinable y)+filterDEqnSolution_static :: ( WithField ℝ Manifold x, SimpleSpace (Needle x)+                             , Refinable y )        => DifferentialEqn x y -> PointsWeb x (Shade' y) -> Option (PointsWeb x (Shade' y)) filterDEqnSolution_static f = localFocusWeb >>> Hask.traverse `id`                    \((x,shy), ngbs) -> if null ngbs@@ -483,7 +491,8 @@                             =<< intersectShade's                                   ( propagateDEqnSolution_loc f ((x,shy), NE.fromList ngbs) ) -filterDEqnSolutions_static :: (WithField ℝ Manifold x, Refinable y)+filterDEqnSolutions_static :: ( WithField ℝ Manifold x, SimpleSpace (Needle x)+                              , Refinable y )        => DifferentialEqn x y -> PointsWeb x (ConvexSet y) -> Option (PointsWeb x (ConvexSet y)) filterDEqnSolutions_static f = localFocusWeb >>> Hask.traverse `id`             \((x, shy@(ConvexSet hull _)), ngbs) -> if null ngbs@@ -516,7 +525,7 @@   filterDEqnSolutions_adaptive :: ∀ x y badness-        . (WithField ℝ Manifold x, Refinable y, badness ~ ℝ)+        . (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y, badness ~ ℝ)        => MetricChoice x      -- ^ Scalar product on the domain, for regularising the web.        -> DifferentialEqn x y         -> (x -> Shade' y -> badness)@@ -540,7 +549,9 @@        smallBadnessGradient, largeBadnessGradient :: ℝ        (smallBadnessGradient, largeBadnessGradient)            = ( badnessGradRated!!(n`div`4), badnessGradRated!!(n*3`div`4) )-        where n = length badnessGradRated+        where n = case length badnessGradRated of+                    0 -> error "No neighbours available for badness-grading."+                    l -> l               badnessGradRated = sort [ ngBad / bad                                       | ( LocalWebInfo {                                             _thisNodeData@@ -606,7 +617,7 @@                totalAge = maximum $ _solverNodeAge . _thisNodeData . fst <$> preproc'd        errTgtModulation = (1-) . (`mod'`1) . negate . sqrt $ fromIntegral totalAge-       badness x = badness' x . (shadeNarrowness %~ (^* errTgtModulation))+       badness x = badness' x . (shadeNarrowness %~ (scaleNorm errTgtModulation))                retraceBonds :: WebLocally x (WebLocally x (OldAndNew (x, SolverNodeState y)))                        -> [((x, [Needle x]), SolverNodeState y)]@@ -626,7 +637,7 @@                                          , (xN,_) <- oldAndNew nnWeb ]                                    l -> [(xN.-~.x, ngb^.thisNodeId) | (xN,_) <- l]                        ]-                    possibleConflicts = [ metricSq locMetr v+                    possibleConflicts = [ normSq locMetr v                                         | (v,nnId)<-neighbourCandidates                                         , nnId > myId ]               , isOld || null possibleConflicts@@ -634,14 +645,14 @@               ]         where focused = oldAndNew' $ locWeb^.thisNodeData^.thisNodeData               knownNgbs = snd <$> locWeb^.nodeNeighbours-              oldMinDistSq = minimum [ metricSq locMetr vOld+              oldMinDistSq = minimum [ normSq locMetr vOld                                      | (_,ngb) <- knownNgbs                                      , let Option (Just vOld) = ngb^.thisNodeCoord .-~. xOld                                      ]                                 -iterateFilterDEqn_adaptive :: (WithField ℝ Manifold x, Refinable y)+iterateFilterDEqn_adaptive :: (WithField ℝ Manifold x, SimpleSpace (Needle x), Refinable y)        => MetricChoice x      -- ^ Scalar product on the domain, for regularising the web.        -> DifferentialEqn x y        -> (x -> Shade' y -> ℝ) -- ^ Badness function for local results.
Data/SimplicialComplex.hs view
@@ -39,7 +39,6 @@         , simplexVertices, simplexVertices'         -- * Simplicial complexes         , Triangulation-        , singleSimplex         -- * Triangulation-builder monad         , TriangT         , evalTriangT, runTriangT, doTriangT, getTriang@@ -51,10 +50,7 @@         , distinctSimplices, NeighbouringSimplices         -- ** Building triangulations         , disjointTriangulation-        , disjointSimplex         , mixinTriangulation-        , introVertToTriang-        , webinateTriang         -- * Misc util         , HaskMonad, liftInTriangT, unliftInTriangT         , Nat, Zero, One, Two, Three, Succ@@ -70,7 +66,7 @@ import Data.Semigroup import Data.Ord (comparing) -import Data.LinearMap.Category+import Math.LinearMap.Category import Data.Tagged  import Data.Manifold.Types.Primitive ((^), empty)@@ -150,15 +146,6 @@   fmap f (TriangSkeleton sk vs) = TriangSkeleton (f<$>sk) vs deriving instance (Show x) => Show (Triangulation n x) --- | Consider a single simplex as a simplicial complex, consisting only of---   this simplex and its faces.-singleSimplex :: ∀ n x . KnownNat n => Simplex n x -> Triangulation n x-singleSimplex (ZS x) = TriangVertices $ pure (x, [])-singleSimplex (x :<| s)-         = runIdentity . execTriangT insX $ TriangSkeleton (singleSimplex s) mempty- where insX :: ∀ t . TriangT t n x Identity ()-       insX = introVertToTriang x [SimplexIT 0] >> return()- nTopSplxs :: Triangulation n' x -> Int nTopSplxs (TriangVertices vs) = Arr.length vs nTopSplxs (TriangSkeleton _ vs) = Arr.length vs@@ -404,12 +391,7 @@                                        | k <- take (nTopSplxs t) [nTopSplxs tr ..] ]                                      , tr <> t ) -disjointSimplex :: ∀ t m n x . (KnownNat n, HaskMonad m)-       => Simplex n x -> TriangT t n x m (SimplexIT t n x)-disjointSimplex s = TriangT $ \tr -> return ( SimplexIT $ nTopSplxs tr-                                            , tr <> singleSimplex s    ) - -- | Import a triangulation like with 'disjointTriangulation', --   together with references to some of its subsimplices. mixinTriangulation :: ∀ t m f k n x . ( KnownNat n, KnownNat k@@ -425,59 +407,8 @@        t' = fmap (fmap tgetSimplexIT) t  -webinateTriang :: ∀ t m n x . (HaskMonad m, KnownNat n)-         => SimplexIT t Z x -> SimplexIT t n x -> TriangT t (S n) x m (SimplexIT t (S n) x)-webinateTriang ptt@(SimplexIT pt) bst@(SimplexIT bs) = do-  existsReady <- lookupSimplexCone ptt bst-  case existsReady of-   Option (Just ext) -> return ext-   _ -> TriangT $ \(TriangSkeleton sk cnn)-         -> let resi = Arr.length cnn-                res = SimplexIT $ Arr.length cnn      :: SimplexIT t (S n) x-            in case sk of-             TriangVertices vs -> return-                   $ ( res-                     , TriangSkeleton (TriangVertices-                           $ vs Arr.// [ (pt, second (resi:) $ vs Arr.! pt)-                                       , (bs, second (resi:) $ vs Arr.! bs) ]-                               ) $ Arr.snoc cnn (freeTuple$->$(pt, bs), []) )-             TriangSkeleton _ cnn'-                   -> let (cnbs,_) = cnn' Arr.! bs-                      in do (cnws,sk') <- unsafeRunTriangT ( do-                              cnws <- forM cnbs $ \j -> do-                                 kt@(SimplexIT k) <- webinateTriang ptt (SimplexIT j)-                                 addUplink' res kt-                                 return k-                              addUplink' res bst-                              return cnws-                             ) sk-                            let snocer = (freeSnoc cnws bs, [])-                            return $ (res, TriangSkeleton sk' $ Arr.snoc cnn snocer)- where addUplink' :: SimplexIT t (S n) x -> SimplexIT t n x -> TriangT t n x m ()-       addUplink' (SimplexIT i) (SimplexIT j) = TriangT-        $ \sk -> pure ((), case sk of-                       TriangVertices vs-                           -> let (v,ul) = vs Arr.! j-                              in TriangVertices $ vs Arr.// [(j, (v, i:ul))]-                       TriangSkeleton skd us-                           -> let (b,tl) = us Arr.! j-                              in TriangSkeleton skd $ us Arr.// [(j, (b, i:tl))]-                   )                                                      ---introVertToTriang :: ∀ t m n x . (HaskMonad m, KnownNat n)-                  => x -> [SimplexIT t n x] -> TriangT t (S n) x m (SimplexIT t Z x)-introVertToTriang v glues = do-      j <- fmap (\(Option(Just k)) -> SimplexIT k) . onSkeleton . TriangT-             $ return . tVertSnoc-      mapM_ (webinateTriang j) glues-      return j- where tVertSnoc :: Triangulation Z x -> (Int, Triangulation Z x)-       tVertSnoc (TriangVertices vs)-           = (Arr.length vs, TriangVertices $ vs `Arr.snoc` (v,[]))-         
− Data/VectorSpace/FiniteDimensional.hs
@@ -1,360 +0,0 @@--- |--- Module      : Data.VectorSpace.FiniteDimensional--- Copyright   : (c) Justus Sagemüller 2015--- License     : GPL v3--- --- Maintainer  : (@) sagemueller $ geo.uni-koeln.de--- Stability   : experimental--- Portability : portable--- -{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE MultiParamTypeClasses      #-}-{-# LANGUAGE TypeOperators              #-}-{-# LANGUAGE TupleSections              #-}-{-# LANGUAGE TypeFamilies               #-}-{-# LANGUAGE PolyKinds                  #-}-{-# LANGUAGE UndecidableInstances       #-}-{-# LANGUAGE StandaloneDeriving         #-}-{-# LANGUAGE ConstraintKinds            #-}-{-# LANGUAGE ScopedTypeVariables        #-}-{-# LANGUAGE UnicodeSyntax              #-}-----module Data.VectorSpace.FiniteDimensional (-    FiniteDimensional(..)-  , SmoothScalar -  , FinVecArrRep(..), concreteArrRep, (⊕), splitArrRep-  ) where-    --    --import Prelude hiding ((^))--import Data.AffineSpace-import Data.VectorSpace-import Data.LinearMap-import Data.Basis-import Data.MemoTrie-import Data.Tagged-import Data.Void--import Control.Applicative-    -import Data.Manifold.Types.Primitive-import Data.CoNat-import Data.Embedding--import Control.Arrow--import qualified Data.Vector as Arr-import qualified Numeric.LinearAlgebra.HMatrix as HMat------- | Constraint that a space's scalars need to fulfill so it can be used for efficient linear algebra.---   Fulfilled pretty much only by the basic real and complex floating-point types.-type SmoothScalar s = ( VectorSpace s, HMat.Numeric s, HMat.Field s-                      , Num(HMat.Vector s), HMat.Indexable(HMat.Vector s)s-                      , HMat.Normed(HMat.Vector s) )---- | Many linear algebra operations are best implemented via packed, dense 'HMat.Matrix'es.---   For one thing, that makes common general vector operations quite efficient,---   in particular on high-dimensional spaces.---   More importantly, @hmatrix@ offers linear facilities---   such as inverse and eigenbasis transformations, which aren't available in the---   @vector-space@ library yet. But the classes from that library are strongly preferrable---   to plain matrices and arrays, conceptually.--- ---   The 'FiniteDimensional' class is used to convert between both representations.---   It would be nice not to have the requirement of finite dimension on 'HerMetric',---   but it's probably not feasible to get rid of it in forseeable time.---   ---   Instead of the run-time 'dimension' information, we would rather have a compile-time---   @type Dimension v :: Nat@, but type-level naturals are not mature enough yet. This---   will almost certainly change in the future.-class (HasBasis v, HasTrie (Basis v), SmoothScalar (Scalar v)) => FiniteDimensional v where-  dimension :: Tagged v Int-  basisIndex :: Tagged v (Basis v -> Int)-  -- | Index must be in @[0 .. dimension-1]@, otherwise this is undefined.-  indexBasis :: Tagged v (Int -> Basis v)-  completeBasis :: Tagged v [Basis v]-  completeBasis = liftA2 (\dim f -> f <$> [0 .. dim - 1]) dimension indexBasis-  -  completeBasisValues :: [v]-  completeBasisValues = defCBVs-   where defCBVs :: ∀ v . FiniteDimensional v => [v]-         defCBVs = basisValue <$> cb-          where Tagged cb = completeBasis :: Tagged v [Basis v]-  -  asPackedVector :: v -> HMat.Vector (Scalar v)-  asPackedVector v = HMat.fromList $ snd <$> decompose v-  -  asPackedMatrix :: (FiniteDimensional w, Scalar w ~ Scalar v)-                       => (v :-* w) -> HMat.Matrix (Scalar v)-  asPackedMatrix = defaultAsPackedMatrix-   where defaultAsPackedMatrix :: forall v w s .-               (FiniteDimensional v, FiniteDimensional w, s~Scalar v, s~Scalar w)-                         => (v :-* w) -> HMat.Matrix s-         defaultAsPackedMatrix m = HMat.fromColumns $ asPackedVector . atBasis m <$> cb-          where (Tagged cb) = completeBasis :: Tagged v [Basis v]-  -  fromPackedVector :: HMat.Vector (Scalar v) -> v-  fromPackedVector v = result-   where result = recompose $ zip cb (HMat.toList v)-         cb = witness completeBasis result--  fromPackedMatrix :: (FiniteDimensional w, Scalar w ~ Scalar v)-                       => HMat.Matrix (Scalar v) -> (v :-* w)-  fromPackedMatrix = defaultFromPackedMatrix-   where defaultFromPackedMatrix :: forall v w s .-               (FiniteDimensional v, FiniteDimensional w, s~Scalar v, s~Scalar w)-                         => HMat.Matrix s -> (v :-* w)-         defaultFromPackedMatrix m = linear $ fromPackedVector . HMat.app m . asPackedVector-  -instance (SmoothScalar k) => FiniteDimensional (ZeroDim k) where-  dimension = Tagged 0-  basisIndex = Tagged absurd-  indexBasis = Tagged $ const undefined-  completeBasis = Tagged []-  asPackedVector Origin = HMat.fromList []-  fromPackedVector _ = Origin-instance FiniteDimensional ℝ where-  dimension = Tagged 1-  basisIndex = Tagged $ \() -> 0-  indexBasis = Tagged $ \0 -> ()-  completeBasis = Tagged [()]-  asPackedVector x = HMat.fromList [x]-  asPackedMatrix f = HMat.asColumn . asPackedVector $ atBasis f ()-  fromPackedVector v = v HMat.! 0-instance (FiniteDimensional a, FiniteDimensional b, Scalar a~Scalar b)-            => FiniteDimensional (a,b) where-  dimension = tupDim-   where tupDim :: ∀ a b.(FiniteDimensional a,FiniteDimensional b)=>Tagged(a,b)Int-         tupDim = Tagged $ da+db-          where (Tagged da)=dimension::Tagged a Int; (Tagged db)=dimension::Tagged b Int-  basisIndex = basId-   where basId :: ∀ a b . (FiniteDimensional a, FiniteDimensional b)-                     => Tagged (a,b) (Either (Basis a) (Basis b) -> Int)-         basId = Tagged basId'-          where basId' (Left ba) = basIda ba-                basId' (Right bb) = da + basIdb bb-                (Tagged da) = dimension :: Tagged a Int-                (Tagged basIda) = basisIndex :: Tagged a (Basis a->Int)-                (Tagged basIdb) = basisIndex :: Tagged b (Basis b->Int)-  indexBasis = basId-   where basId :: ∀ a b . (FiniteDimensional a, FiniteDimensional b)-                     => Tagged (a,b) (Int -> Either (Basis a) (Basis b))-         basId = Tagged basId'-          where basId' i | i < da     = Left $ basIda i-                         | otherwise  = Right . basIdb $ i - da-                (Tagged da) = dimension :: Tagged a Int-                (Tagged basIda) = indexBasis :: Tagged a (Int->Basis a)-                (Tagged basIdb) = indexBasis :: Tagged b (Int->Basis b)-  completeBasis = cb-   where cb :: ∀ a b . (FiniteDimensional a, FiniteDimensional b)-                     => Tagged (a,b) [Either (Basis a) (Basis b)]-         cb = Tagged $ map Left cba ++ map Right cbb-          where (Tagged cba) = completeBasis :: Tagged a [Basis a]-                (Tagged cbb) = completeBasis :: Tagged b [Basis b]-  asPackedVector (a,b) = HMat.vjoin [asPackedVector a, asPackedVector b]-  fromPackedVector = fPV-   where fPV :: ∀ a b . (FiniteDimensional a, FiniteDimensional b, Scalar a~Scalar b)-                     => HMat.Vector (Scalar a) -> (a,b)-         fPV v = (fromPackedVector l, fromPackedVector r)-          where (Tagged da) = dimension :: Tagged a Int-                (Tagged db) = dimension :: Tagged b Int-                l = HMat.subVector 0 da v-                r = HMat.subVector da db v-              -instance (FiniteDimensional y, FiniteDimensional x) => AdditiveGroup (x⊗y) where-  zeroV = DensTensProd $ (0 HMat.>< 0) []-  negateV (DensTensProd v) = DensTensProd $ negate v-  DensTensProd v ^+^ DensTensProd w-   | HMat.size v == (0,0)  = DensTensProd w-   | HMat.size w == (0,0)  = DensTensProd v-   | otherwise             = DensTensProd $ v + w--instance (FiniteDimensional y, FiniteDimensional x) => VectorSpace (x⊗y) where-  type Scalar (x⊗y) = Scalar y-  μ *^ DensTensProd v = DensTensProd $ HMat.scale μ v--instance (FiniteDimensional y, FiniteDimensional x) => InnerSpace (x⊗y) where-  DensTensProd v <.> DensTensProd w-   | HMat.size v == (0,0)  = 0-   | HMat.size w == (0,0)  = 0-   | otherwise             = HMat.flatten v `HMat.dot` HMat.flatten w--instance (FiniteDimensional y, FiniteDimensional x) => HasBasis (x⊗y) where-  type Basis (x⊗y) = (Basis x, Basis y)-  basisValue = bvt-   where bvt :: ∀ x y . (FiniteDimensional x, FiniteDimensional y)-                       => (Basis x, Basis y) -> x ⊗ y-         bvt (bx,by) = DensTensProd $ HMat.assoc (nx,ny) 0 [((i,j),1)]-          where Tagged nx = dimension :: Tagged x Int-                Tagged ny = dimension :: Tagged y Int-                Tagged i = ($bx) <$> basisIndex :: Tagged x Int-                Tagged j = ($by) <$> basisIndex :: Tagged y Int-  decompose = dct-   where dct :: ∀ x y . (FiniteDimensional x, FiniteDimensional y)-                       => x ⊗ y -> [((Basis x, Basis y), Scalar y)]-         dct (DensTensProd m) = zip [(i,j) | i <- cbx, j <- cby]-                                (HMat.toList $ HMat.flatten m)-          where Tagged cbx = completeBasis :: Tagged x [Basis x]-                Tagged cby = completeBasis :: Tagged y [Basis y]-  decompose' = dct-   where dct :: ∀ x y . (FiniteDimensional x, FiniteDimensional y)-                       => x ⊗ y -> (Basis x, Basis y) -> Scalar y-         dct (DensTensProd m) (bi, bj) = m `HMat.atIndex` (bxi bi, byj bj)-          where Tagged bxi = basisIndex :: Tagged x (Basis x -> Int)-                Tagged byj = basisIndex :: Tagged y (Basis y -> Int)-               -instance (FiniteDimensional a, FiniteDimensional b, Scalar a ~ Scalar b)-                                     => FiniteDimensional (a⊗b) where-  dimension = tensDim-   where tensDim :: ∀ a b.(FiniteDimensional a,FiniteDimensional b)=>Tagged(a⊗b)Int-         tensDim = Tagged $ da*db-          where (Tagged da)=dimension::Tagged a Int; (Tagged db)=dimension::Tagged b Int-  basisIndex = basId-   where basId :: ∀ a b . (FiniteDimensional a, FiniteDimensional b)-                     => Tagged (a⊗b) ((Basis a, Basis b) -> Int)-         basId = Tagged basId'-          where basId' (ba,bb) = db*basIda ba + basIdb bb-                (Tagged db) = dimension :: Tagged b Int-                (Tagged basIda) = basisIndex :: Tagged a (Basis a->Int)-                (Tagged basIdb) = basisIndex :: Tagged b (Basis b->Int)-  indexBasis = basId-   where basId :: ∀ a b . (FiniteDimensional a, FiniteDimensional b)-                     => Tagged (a⊗b) (Int -> (Basis a, Basis b))-         basId = Tagged basId'-          where basId' i = let (ia,ib) = i`divMod`db-                           in (basIda ia, basIdb ib)-                (Tagged db) = dimension :: Tagged b Int-                (Tagged basIda) = indexBasis :: Tagged a (Int->Basis a)-                (Tagged basIdb) = indexBasis :: Tagged b (Int->Basis b)-  completeBasis = cb-   where cb :: ∀ a b . (FiniteDimensional a, FiniteDimensional b)-                     => Tagged (a⊗b) [(Basis a, Basis b)]-         cb = Tagged $ [(ba,bb) | ba<-cba, bb<-cbb]-          where (Tagged cba) = completeBasis :: Tagged a [Basis a]-                (Tagged cbb) = completeBasis :: Tagged b [Basis b]-  asPackedVector (DensTensProd m) = HMat.flatten m-  fromPackedVector = fPV-   where fPV :: ∀ a b . (FiniteDimensional a, FiniteDimensional b, Scalar a~Scalar b)-                     => HMat.Vector (Scalar a) -> (a⊗b)-         fPV v = DensTensProd $ HMat.reshape db v-          where (Tagged db) = dimension :: Tagged b Int-  ---  -instance (SmoothScalar x, KnownNat n) => FiniteDimensional (FreeVect n x) where-  dimension = natTagPænultimate-  basisIndex = Tagged getInRange-  indexBasis = Tagged InRange-  asPackedVector (FreeVect arr) = Arr.convert arr-  fromPackedVector arr = FreeVect (Arr.convert arr)-  -- asPackedMatrix = _ -- could be done quite efficiently here!-                                                          ----- | Semantically the same as @'Tagged' tag refvs@, but directly uses the---   packed-vector array representation.--- ---   The tag should really be kind-polymorphic, but at least GHC-7.8 doesn't quite---   handle the associated types of the manifold classes then.-newtype FinVecArrRep (tag :: * -> *) refvs scalar-      = FinVecArrRep { getFinVecArrRep :: HMat.Vector scalar }--instance (SmoothScalar s) => AffineSpace (FinVecArrRep t b s) where-  type Diff (FinVecArrRep t b s) = FinVecArrRep t b s-  (.-.) = (^-^)-  (.+^) = (^+^)-  -instance (SmoothScalar s) => AdditiveGroup (FinVecArrRep t b s) where-  zeroV = FinVecArrRep $ 0 HMat.|> []-  negateV (FinVecArrRep v) = FinVecArrRep $ negate v-  FinVecArrRep v ^+^ FinVecArrRep w-   | HMat.size v == 0  = FinVecArrRep w-   | HMat.size w == 0  = FinVecArrRep v-   | otherwise         = FinVecArrRep $ v + w--instance (SmoothScalar s) => VectorSpace (FinVecArrRep t b s) where-  type Scalar (FinVecArrRep t b s) = s-  μ *^ FinVecArrRep v = FinVecArrRep $ HMat.scale μ v--instance (SmoothScalar s) => InnerSpace (FinVecArrRep t b s) where-  FinVecArrRep v <.> FinVecArrRep w-   | HMat.size v == 0  = 0-   | HMat.size w == 0  = 0-   | otherwise         = v`HMat.dot`w--concreteArrRep :: (SmoothScalar s, FiniteDimensional r, Scalar r ~ s)-           => Isomorphism (->) r (FinVecArrRep t r s)-concreteArrRep = Isomorphism (FinVecArrRep     . asPackedVector)-                             (fromPackedVector . getFinVecArrRep)--(⊕) :: ∀ t s v w . ( SmoothScalar s, FiniteDimensional v, FiniteDimensional w-                   , Scalar v ~ s, Scalar w ~ s )-          => FinVecArrRep t v s -> FinVecArrRep t w s -> FinVecArrRep t (v,w) s-FinVecArrRep v ⊕ FinVecArrRep w-  | HMat.size v + HMat.size w == 0  = FinVecArrRep v-  | HMat.size v == 0                = FinVecArrRep $ HMat.vjoin [HMat.konst 0 nv, w]-  | HMat.size w == 0                = FinVecArrRep $ HMat.vjoin [v, HMat.konst 0 nw]-  | otherwise                       = FinVecArrRep $ HMat.vjoin [v,w]- where Tagged nv = dimension :: Tagged v Int-       Tagged nw = dimension :: Tagged w Int--splitArrRep :: ∀ t s v w . ( SmoothScalar s, FiniteDimensional v, FiniteDimensional w-                   , Scalar v ~ s, Scalar w ~ s )-          => FinVecArrRep t (v,w) s -> (FinVecArrRep t v s, FinVecArrRep t w s)-splitArrRep (FinVecArrRep vw)-  | HMat.size vw == 0   = (FinVecArrRep vw, FinVecArrRep vw)-  | otherwise           = ( FinVecArrRep $ HMat.subVector 0 nv vw-                          , FinVecArrRep $ HMat.subVector nv nw vw )- where Tagged nv = dimension :: Tagged v Int-       Tagged nw = dimension :: Tagged w Int-                  --instance (SmoothScalar s, FiniteDimensional r, Scalar r ~ s)-                 => HasBasis (FinVecArrRep t r s) where-  type Basis (FinVecArrRep t r s) = Basis r-  basisValue = (concreteArrRep$->$) . basisValue-  decompose = decompose . (concreteArrRep$<-$)-  decompose' = decompose' . (concreteArrRep$<-$)--instance (SmoothScalar s, FiniteDimensional r, Scalar r ~ s)-                 => FiniteDimensional (FinVecArrRep t r s) where-  dimension = d-   where d :: ∀ t r s . FiniteDimensional r => Tagged (FinVecArrRep t r s) Int-         d = Tagged n-          where Tagged n = dimension :: Tagged r Int-  indexBasis = d-   where d :: ∀ t r s . FiniteDimensional r => Tagged (FinVecArrRep t r s) (Int -> Basis r)-         d = Tagged n-          where Tagged n = indexBasis :: Tagged r (Int -> Basis r)-  basisIndex = d-   where d :: ∀ t r s . FiniteDimensional r => Tagged (FinVecArrRep t r s) (Basis r -> Int)-         d = Tagged n-          where Tagged n = basisIndex :: Tagged r (Basis r -> Int)-  asPackedVector = apv-   where apv :: ∀ t r s . (FiniteDimensional r, SmoothScalar s)-                     => FinVecArrRep t r s -> HMat.Vector s-         apv (FinVecArrRep v)-             | HMat.size v == 0  = HMat.konst 0 n-             | otherwise         = v-          where Tagged n = dimension :: Tagged r Int-  fromPackedVector = FinVecArrRep---instance (NaturallyEmbedded m r, FiniteDimensional r, s ~ Scalar r)-                 => NaturallyEmbedded m (FinVecArrRep t r s) where-  embed = (concreteArrRep$<-$) . embed-  coEmbed = coEmbed . (concreteArrRep$->$)-                     -
+ images/examples/DiffableFunction-plots/Hann-window.png view

binary file changed (absent → 17156 bytes)

+ images/examples/DiffableFunction-plots/safe-sqrt.png view

binary file changed (absent → 13362 bytes)

+ images/examples/TreesAndWebs/2D-cartesiandisk.png view

binary file changed (absent → 161269 bytes)

+ images/examples/TreesAndWebs/2D-normaldistrib.png view

binary file changed (absent → 276911 bytes)

+ images/examples/TreesAndWebs/2D-scatter.png view

binary file changed (absent → 176908 bytes)

+ images/examples/TreesAndWebs/2D-scatter_twig-environs.png view

binary file changed (absent → 156724 bytes)

manifolds.cabal view
@@ -1,5 +1,5 @@ Name:                manifolds-Version:             0.2.3.0+Version:             0.3.0.0 Category:            Math Synopsis:            Coordinate-free hypersurfaces Description:         Manifolds, a generalisation of the notion of &#x201c;smooth curves&#x201d; or surfaces,@@ -31,6 +31,8 @@ Cabal-Version:       >=1.10 Extra-Doc-Files:     images/examples/*.png,                      images/examples/ShadeCombinations/2Dconvolution-skewed.png+                     images/examples/TreesAndWebs/*.png+                     images/examples/DiffableFunction-plots/*.png  Source-Repository head     type: git@@ -40,9 +42,11 @@   Build-Depends:     base>=4.5 && < 6                      , transformers                      , vector-space>=0.8+                     , free-vector-spaces>=0.1.1+                     , linear                      , MemoTrie                      , vector-                     , hmatrix >= 0.16 && < 0.18+                     , linearmap-category > 0.1 && < 0.2                      , containers                      , comonad                      , semigroups@@ -51,7 +55,7 @@                      , deepseq                      , microlens >= 0.4 && <= 0.5, microlens-th                      , trivial-constraint >= 0.4-                     , constrained-categories >= 0.2.3 && < 0.3+                     , constrained-categories >= 0.2.3 && < 0.3.1   other-extensions:  FlexibleInstances                      , TypeFamilies                      , FlexibleContexts@@ -69,9 +73,9 @@                      Data.Manifold.Web                      Data.Manifold.DifferentialEquation                      Data.SimplicialComplex-                     Data.LinearMap.HerMetric                      Data.Function.Differentiable                      Data.Manifold.Types+                     Data.Manifold.Types.Stiefel                      Data.Manifold.Griddable                      Data.Manifold.Riemannian   Other-modules:   Data.List.FastNub@@ -80,10 +84,8 @@                    Data.Manifold.Cone                    Data.CoNat                    Data.Embedding-                   Data.LinearMap.Category                    Data.Function.Differentiable.Data                    Data.Function.Affine-                   Data.VectorSpace.FiniteDimensional                    Control.Monad.Trans.OuterMaybe                    Util.Associate                    Util.LtdShow