úÎ! cùéÿ·      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶&(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone&'.179=>?@AHSUVX_k›fò  sparse-tensorType synonym for a +/ with three different index types ranging from 0 to 20, from 0 to 9 and from 0 to 37 each one appearing contravariantly and covariantly.! sparse-tensorType synonym for a +4 with contravariant and covariant spacetime indices.* sparse-tensor Represents a + with attached ,s being again of +T type and taking the same index type. This type can be used to represent a general +0 that takes contravariant and covariant indices., sparse-tensorConstructor of leaf values.- sparse-tensor Constructs a + from a / of index sub tensor pairs.. sparse-tensor Represents a + that is identical zero./ sparse-tensor.Additional type for the sorted tensor forest. / k v¬ represents an ordered list of key value pairs. Ordering is always defined w.r.t. the keys. All future functions maintain this order when acting on a valid, i.e. ordered /s.0 sparse-tensor(Type for representation of functions as + values.3 sparse-tensorThe 3 a÷ type represents a basic type for variables that must only occur linearly. As such they can for instance be used whenever tensorial expression involves a tensor with unknown components. This tensor can then be described as having values of type 3. The 3Q type can for instance be useful when the tensorial expression that involves the + with 3@ values describes a linear equation system. Using the functions og, ... this equation system can then be transformed into a matrix with columns labeling the individual 3s.5 sparse-tensorzType class for product of two (possibly different) types. The resulting type depends on the types that are given as input.6 sparse-tensor;Type level function that returns the type of the result of 7.7 sparse-tensorProduct function.8 sparse-tensorvNewtype wrapper for symbolic values. Note that this version does not yet support simplification of symbolic values.: sparse-tensor<Newtype wrapper that is used for representing scalar values.< sparse-tensorAType class that encodes the additive group structure of possible +Z values, i.e. addition, neutral element and existence of inverse elements. Each possible +_ value must allow for these basic group operations and hence be an instance of this type class.= sparse-tensorATest whether the given element is zero, i.e. the neutral element.> sparse-tensorAddition of two elements.? sparse-tensor(Maps an element to its additive inverse.@ sparse-tensorSubtraction of two elements.A sparse-tensorIndex tuple type for a + with indices of type C, ind9 and I= each one appearing contravariantly and covariantly, i.e. a ATens'.B sparse-tensorIndex tuple type for a +J that provides only contravariant and covariant spacetime indices, i.e. a !.C sparse-tensorPNewtype wrapper for an index type that is used to represent indices with a from 0 to 20.F sparse-tensorVNewtype wrapper for an index type that is used to represent indices with a range from 0 to 9.I sparse-tensorVNewtype wrapper for an index type that is used to represent indices with a range from 0 to 3.L sparse-tensorThe LT type class collects a number of class constraints that any index type must satisfy.P sparse-tensorInfix synonym for O.Q sparse-tensor Construct an M# that only contains a single value.R sparse-tensorConstruction of a length typed M from an untyped list.S sparse-tensorConstruction of a length typed M (partial function).T sparse-tensor Sorts an M of elements that satisfy the ·8 constraint by implementing a version of insertion sort.U sparse-tensor2An implementation of the usual head function from  Data.List for M1s. The function returns the first element of the M.V sparse-tensor2An implementation of the usual tail function from  Data.List for M1s. The function removes the first element of the M.¸ sparse-tensorAn implementation of the usual (!!) function from  Data.List for Mts. The function returns the list element that is specified by the provided integer value. Indices start from zero.W sparse-tensorŽThe function replaces the element at index/position specified by its first argument with the element that is specified by its second argument.X sparse-tensor=Shifts the labels of the variables that are contained in the 3: type towards larger index labels by the amount specified.Y sparse-tensor *shiftLabels1 s = mapTo1 (shiftVarLabels s)Z sparse-tensor *shiftLabels2 s = mapTo2 (shiftVarLabels s)[ sparse-tensor *shiftLabels3 s = mapTo3 (shiftVarLabels s)\ sparse-tensor *shiftLabels4 s = mapTo4 (shiftVarLabels s)] sparse-tensor *shiftLabels5 s = mapTo5 (shiftVarLabels s)^ sparse-tensor *shiftLabels6 s = mapTo6 (shiftVarLabels s)_ sparse-tensor *shiftLabels7 s = mapTo7 (shiftVarLabels s)` sparse-tensor *shiftLabels8 s = mapTo8 (shiftVarLabels s)a sparse-tensor"evaluate a tensor section, i.e. a 0-valued !, at given spacetime pointr sparse-tensorThis functions construction +~s with a single index type that only appears contravariantly from a list of key value pairs, where the keys are provided by a MP that contains the indices under which the corresponding value shall be stored.s sparse-tensorSame functionality as r  but the indices of the various values are specified by usual list. This is certainly more flexible however all at the cost of reduced type safety compared to r.„ sparse-tensoreAddition of two arbitrary tensors. The only requirement is that the corresponding values satisfy the <x constraint. In particular this function can also be used for adding tensors that themselves contain tensors as values.… sparse-tensor&Scalar multiplication of an arbitrary +U. Only requirement is that the corresponding values and the scalar type satisfy the 5 constraint.† sparse-tensorNegation of an arbitrary +. The function uses the required group property of the tensor values to map each value of the tensors to its additive inverse.‡ sparse-tensorSubtraction of two arbitrary +Es. The only requirement is that the corresponding values satisfy the <x constraint. In particular this function can also be used for adding tensors that themselves contain tensors as values.ˆ sparse-tensorTensor product of two +>s. In the result for each index type the indices of the first +* are arranged left of those in the second +" argument. The values of the two +s must satisfy the 5 constraint.‰ sparse-tensor-Utility function to serialize and compress a + into a  , making use of the ¹ instance.Š sparse-tensor2Utility function to decompress and de-serialize a   into a +, making use of the ¹ instance.‹ sparse-tensorGThe function computes partial derivatives of spacetime tensors of type ! with 0 values.Œ sparse-tensorGThe function computes partial derivatives of spacetime tensors of type ! with 8 values. 2g_ab_p = partialSymbolic ["t", "x", "y", "z"] g_ab sparse-tensor Synonym for fmap. . applies a function to the values of a tensor.  mapTo1 = fmapŽ sparse-tensor)Applies a function one level deeper than (. In other words the leaf values of the +% at hand must themselves be of type +, Ž5 then applies a function to the values of these leaf +s. mapTo2 = fmap . fmap sparse-tensor&Maps a function to the 3rd leaf level. mapTo3 = fmap . fmap . fmap sparse-tensor&Maps a function to the 4th leaf level. "mapTo4 = fmap . fmap . fmap . fmap‘ sparse-tensor&Maps a function to the 5th leaf level. )mapTo5 = fmap . fmap . fmap . fmap . fmap’ sparse-tensor&Maps a function to the 6th leaf level. 0mapTo6 = fmap . fmap . fmap . fmap . fmap . fmap“ sparse-tensor&Maps a function to the 7th leaf level. 7mapTo7 = fmap . fmap . fmap . fmap . fmap . fmap . fmap” sparse-tensor&Maps a function to the 8th leaf level. >mapTo8 = fmap . fmap . fmap . fmap . fmap . fmap . fmap . fmap• sparse-tensorúApplying these functions on a given tensor removes all zero values from it. Even if zero values are not included in a given tensor when it is constructed they might occur during computations. If so they are not automatically removed from the tensor.– sparse-tensor  removeZeros1 = removeZeros— sparse-tensor /removeZeros2 = removeZeros . mapTo1 removeZeros˜ sparse-tensor DremoveZeros3 = removeZeros . mapTo1 removeZeros . mapTo2 removeZeros™ sparse-tensor YremoveZeros4 = removeZeros . mapTo1 removeZeros . mapTo2 removeZeros . mapTo3 removeZerosš sparse-tensor nremoveZeros5 = removeZeros . mapTo1 removeZeros . mapTo2 removeZeros . mapTo3 removeZeros . mapTo4 removeZeros› sparse-tensor ƒremoveZeros6 = removeZeros . mapTo1 removeZeros . mapTo2 removeZeros . mapTo3 removeZeros . mapTo4 removeZeros . mapTo5 removeZerosœ sparse-tensor ˜removeZeros7 = removeZeros . mapTo1 removeZeros . mapTo2 removeZeros . mapTo3 removeZeros . mapTo4 removeZeros . mapTo5 removeZeros . mapTo6 removeZeros sparse-tensor ­removeZeros8 = removeZeros . mapTo1 removeZeros . mapTo2 removeZeros . mapTo3 removeZeros . mapTo4 removeZeros . mapTo5 removeZeros . mapTo6 removeZeros . mapTo7 removeZerosž sparse-tensor Transpose a +¢ in two specified contravariant indices of the first index type indices. The result is simply the tensor with the two indices with position specified by the two º values swapped.Ÿ sparse-tensor tensorTrans1 = tensorTrans  sparse-tensor !tensorTrans2 mapTo1 . tensorTrans¡ sparse-tensor #tensorTrans3 = mapTo2 . tensorTrans¢ sparse-tensor !tensorTrans4 = mapTo3 tensorTrans£ sparse-tensor #tensorTrans5 = mapTo4 . tensorTrans¤ sparse-tensor #tensorTrans6 = mapTo5 . tensorTrans¥ sparse-tensor #tensorTrans7 = mapTo6 . tensorTrans¦ sparse-tensor #tensorTrans8 = mapTo7 . tensorTrans§ sparse-tensor1Swap, i.e. transpose two index blocks in a given +(. The two index blocks must be disjoint.¨ sparse-tensor $tensorBlockTrans1 = tensorBlockTrans© sparse-tensor +tensorBlockTrans2 = mapTo1 tensorBlockTransª sparse-tensor -tensorBlockTrans3 = mapTo2 . tensorBlockTrans« sparse-tensor -tensorBlockTrans4 = mapTo3 . tensorBlockTrans¬ sparse-tensor -tensorBlockTrans5 = mapTo4 . tensorBlockTrans­ sparse-tensor -tensorBlockTrans6 = mapTo5 . tensorBlockTrans® sparse-tensor -tensorBlockTrans7 = mapTo6 . tensorBlockTrans¯ sparse-tensor +tensorBlockTrans8 = mapTo7 tensorBlockTrans° sparse-tensor]Completely permute the indices of a given tensor. The new index order is specified by a list '[Int]'½ that must be of length given by the number of indices the tensor contains. The list then specifies in its i-th element the position on which the i-th index of the tensor shall be sorted. „resortTens [1,2,0,3] (fromListT' [([0,1,2,3],1)] :: Tensor 4 Ind3 Rational) = (fromListT' [([2,0,1,3],1)] :: Tensor 4 Ind3 Rational)± sparse-tensor resortTens1 = resortTens² sparse-tensor !resortTens2 = mapTo1 . resortTens³ sparse-tensor !resortTens3 = mapTo2 . resortTens´ sparse-tensor !resortTens4 = mapTo3 . resortTensµ sparse-tensor !resortTens5 = mapTo4 . resortTens¶ sparse-tensor !resortTens6 = mapTo5 . resortTens· sparse-tensor !resortTens7 = mapTo6 . resortTens¸ sparse-tensor !resortTens8 = mapTo7 . resortTens¹ sparse-tensor Evaluate a +\ for a specific value of its first contravariant index type returning the corresponding sub +J. The additional functions specified below apply the evaluation function ¹ to the deeper + levels.º sparse-tensor evalTens1 = evalTens» sparse-tensor 3evalTens2 ind indVal = mapTo1 (evalTens ind indVal)¼ sparse-tensor 3evalTens3 ind indVal = mapTo2 (evalTens ind indVal)½ sparse-tensor 3evalTens4 ind indVal = mapTo3 (evalTens ind indVal)¾ sparse-tensor 3evalTens5 ind indVal = mapTo4 (evalTens ind indVal)¿ sparse-tensor 3evalTens6 ind indVal = mapTo5 (evalTens ind indVal)À sparse-tensor 3evalTens7 ind indVal = mapTo6 (evalTens ind indVal)Á sparse-tensor 3evalTens8 ind indVal = mapTo7 (evalTens ind indVal) sparse-tensor`Basic symmetrization in a pair of contravariant indices of the 1st index type. Usual factors of  \frac{1}{2} ‘ are not include in this function. The resulting function hence no longer satisfies the property of a projection. The following functions apply ÂŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc.à sparse-tensor symATens1 = symTensÄ sparse-tensor symATens2 = mapTo1 . symTensÅ sparse-tensor symATens3 = mapTo2 . symTensÆ sparse-tensor symATens4 = mapTo3 . symTensÇ sparse-tensor symATens5 = mapTo4 . symTensÈ sparse-tensor symATens6 = mapTo5 . symTensÉ sparse-tensor symATens7 = mapTo6 . symTensÊ sparse-tensor symATens8 = mapTo7 . symTensË sparse-tensorSame functionality as  but including the  \frac{1}{2} N in the result and thus defining a projection. The following functions apply ËŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc. >symTensFac inds t = SField (1/2 :: Rational) &. symTens inds tÌ sparse-tensor symATensFac1 = symTensFacÍ sparse-tensor "symATensFac2 = mapTo1 . symTensFacÎ sparse-tensor "symATensFac3 = mapTo2 . symTensFacÏ sparse-tensor "symATensFac4 = mapTo3 . symTensFacÐ sparse-tensor "symATensFac5 = mapTo4 . symTensFacÑ sparse-tensor "symATensFac6 = mapTo5 . symTensFacÒ sparse-tensor "symATensFac7 = mapTo6 . symTensFacÓ sparse-tensor "symATensFac8 = mapTo7 . symTensFacÔ sparse-tensoreBasic anti symmetrization in a pair of contravariant indices of the 1st index type. Usual factors of  \frac{1}{2} ‘ are not include in this function. The resulting function hence no longer satisfies the property of a projection. The following functions apply ÔŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc.Õ sparse-tensor aSymATens1 = aSymTensÖ sparse-tensor aSymATens2 = mapTo1 . aSymTens× sparse-tensor aSymATens3 = mapTo2 . aSymTensØ sparse-tensor aSymATens4 = mapTo3 . aSymTensÙ sparse-tensor aSymATens5 = mapTo4 . aSymTensÚ sparse-tensor aSymATens6 = mapTo5 . aSymTensÛ sparse-tensor aSymATens7 = mapTo6 . aSymTensÜ sparse-tensor aSymATens8 = mapTo7 . aSymTensÝ sparse-tensorSame functionality as Ô but including the  \frac{1}{2} V factors in the result and thus defining a projection. The following functions apply ÝŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc. @aSymTensFac inds t = SField (1/2 :: Rational) &. aSymTens inds tÞ sparse-tensor aSymATensFac1 = aSymTensFacß sparse-tensor $aSymATensFac2 = mapTo1 . aSymTensFacà sparse-tensor $aSymATensFac3 = mapTo2 . aSymTensFacá sparse-tensor $aSymATensFac4 = mapTo3 . aSymTensFacâ sparse-tensor $aSymATensFac5 = mapTo4 . aSymTensFacã sparse-tensor $aSymATensFac6 = mapTo5 . aSymTensFacä sparse-tensor $aSymATensFac7 = mapTo6 . aSymTensFacå sparse-tensor $aSymATensFac8 = mapTo7 . aSymTensFacæ sparse-tensor®Symmetrization w.r.t. the exchange of two blocks of contravariant indices of the 1st index type. The index blocks must be disjoint. These function does not include the usual  \frac{1}{2} O factors and thus does not define a projection. The following functions apply æŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc.ç sparse-tensor symBlockATens1 = symBlockTensè sparse-tensor &symBlockATens2 = mapTo1 . symBlockTensé sparse-tensor &symBlockATens3 = mapTo2 . symBlockTensê sparse-tensor &symBlockATens4 = mapTo3 . symBlockTensë sparse-tensor &symBlockATens5 = mapTo4 . symBlockTensì sparse-tensor &symBlockATens6 = mapTo5 . symBlockTensí sparse-tensor &symBlockATens7 = mapTo6 . symBlockTensî sparse-tensor &symBlockATens8 = mapTo7 . symBlockTensï sparse-tensorSame functionality as æ$ but including the usual factors of  \frac{1}{2} N in the result and thus defining a projection. The following functions apply ïŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc. HsymBlockTensFac inds t = SField (1/2 :: Rational) &. symBlockTens inds tð sparse-tensor #symBlockATensFac1 = symBlockTensFacñ sparse-tensor ,symBlockATensFac2 = mapTo1 . symBlockTensFacò sparse-tensor ,symBlockATensFac3 = mapTo2 . symBlockTensFacó sparse-tensor ,symBlockATensFac4 = mapTo3 . symBlockTensFacô sparse-tensor ,symBlockATensFac5 = mapTo4 . symBlockTensFacõ sparse-tensor ,symBlockATensFac6 = mapTo5 . symBlockTensFacö sparse-tensor ,symBlockATensFac7 = mapTo6 . symBlockTensFac÷ sparse-tensor ,symBlockATensFac8 = mapTo7 . symBlockTensFacø sparse-tensor³Anti symmetrization w.r.t. the exchange of two blocks of contravariant indices of the 1st index type. The index blocks must be disjoint. These function does not include the usual  \frac{1}{2} O factors and thus does not define a projection. The following functions apply øŽ to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc.ù sparse-tensor aSymBlockATens1 = aSymBlockTensú sparse-tensor (aSymBlockATens2 = mapTo1 . aSymBlockTensû sparse-tensor (aSymBlockATens3 = mapTo2 . aSymBlockTensü sparse-tensor (aSymBlockATens4 = mapTo3 . aSymBlockTensý sparse-tensor (aSymBlockATens5 = mapTo4 . aSymBlockTensþ sparse-tensor (aSymBlockATens6 = mapTo5 . aSymBlockTensÿ sparse-tensor (aSymBlockATens7 = mapTo6 . aSymBlockTens sparse-tensor (aSymBlockATens8 = mapTo7 . aSymBlockTens sparse-tensorSame functionality as ø$ but including the usual factors of  \frac{1}{2} N in the result and thus defining a projection. The following functions apply Ž to the index types of the deeper leaf levels, i.e. covariant indices of the 1st index type, contravariant indices of the 2nd index type, etc. JaSymBlockTensFac inds t = SField (1/2 :: Rational) &. aSymBlockTens inds t sparse-tensor %aSymBlockATensFac1 = aSymBlockTensFac sparse-tensor .aSymBlockATensFac2 = mapTo1 . aSymBlockTensFac sparse-tensor .aSymBlockATensFac3 = mapTo2 . aSymBlockTensFac sparse-tensor .aSymBlockATensFac4 = mapTo3 . aSymBlockTensFac sparse-tensor .aSymBlockATensFac5 = mapTo4 . aSymBlockTensFac sparse-tensor .aSymBlockATensFac6 = mapTo5 . aSymBlockTensFac sparse-tensor .aSymBlockATensFac7 = mapTo6 . aSymBlockTensFac  sparse-tensor .aSymBlockATensFac8 = mapTo7 . aSymBlockTensFac  sparse-tensor?Cyclic symmetrization of the specified subset of contravariant +R indices of the first index type. The function does not include usual factors of  \frac{1}{i!}  where  i z is the number of indices w.r.t. which the symmetrization is performed. Further functions that are displayed below apply   to the various deeper + levels.  sparse-tensor cyclicSymATens1 = cyclicSymTens  sparse-tensor (cyclicSymATens2 = mapTo1 . cyclicSymTens  sparse-tensor (cyclicSymATens3 = mapTo2 . cyclicSymTens sparse-tensor (cyclicSymATens4 = mapTo3 . cyclicSymTens sparse-tensor (cyclicSymATens5 = mapTo4 . cyclicSymTens sparse-tensor (cyclicSymATens6 = mapTo5 . cyclicSymTens sparse-tensor (cyclicSymATens7 = mapTo6 . cyclicSymTens sparse-tensor (cyclicSymATens8 = mapTo7 . cyclicSymTens sparse-tensor1This function provides the same functionality as  / with the only difference that it includes the  \frac{1}{i!}9 factors. The functions that are further provided apply  to deeper + levels. 5cyclicSymTensFac inds t = fac &. cyclicSymTens inds t sparse-tensor %cyclicSymATensFac1 = cyclicSymTensFac sparse-tensor .cyclicSymATensFac2 = mapTo1 . cyclicSymTensFac sparse-tensor .cyclicSymATensFac3 = mapTo2 . cyclicSymTensFac sparse-tensor .cyclicSymATensFac4 = mapTo3 . cyclicSymTensFac sparse-tensor .cyclicSymATensFac5 = mapTo4 . cyclicSymTensFac sparse-tensor .cyclicSymATensFac6 = mapTo5 . cyclicSymTensFac sparse-tensor .cyclicSymATensFac7 = mapTo6 . cyclicSymTensFac sparse-tensor .cyclicSymATensFac8 = mapTo7 . cyclicSymTensFac sparse-tensorDCyclic anti symmetrization of the specified subset of contravariant +R indices of the first index type. The function does not include usual factors of  \frac{1}{i!}  where  i z is the number of indices w.r.t. which the symmetrization is performed. Further functions that are displayed below apply  to the various deeper + levels. sparse-tensor !cyclicASymATens1 = cyclicASymTens sparse-tensor *cyclicASymATens2 = mapTo1 . cyclicASymTens sparse-tensor *cyclicASymATens3 = mapTo2 . cyclicASymTens  sparse-tensor *cyclicASymATens4 = mapTo3 . cyclicASymTens! sparse-tensor *cyclicASymATens5 = mapTo4 . cyclicASymTens" sparse-tensor *cyclicASymATens6 = mapTo5 . cyclicASymTens# sparse-tensor *cyclicASymATens7 = mapTo6 . cyclicASymTens$ sparse-tensor *cyclicASymATens8 = mapTo7 . cyclicASymTens% sparse-tensor1This function provides the same functionality as / with the only difference that it includes the  \frac{1}{i!}9 factors. The functions that are further provided apply % to deeper + levels. 7cyclicASymTensFac inds t = fac &. cyclicASymTens inds t& sparse-tensor 'cyclicASymATensFac1 = cyclicASymTensFac' sparse-tensor 0cyclicASymATensFac2 = mapTo1 . cyclicASymTensFac( sparse-tensor 0cyclicASymATensFac3 = mapTo2 . cyclicASymTensFac) sparse-tensor 0cyclicASymATensFac4 = mapTo3 . cyclicASymTensFac* sparse-tensor 0cyclicASymATensFac5 = mapTo4 . cyclicASymTensFac+ sparse-tensor 0cyclicASymATensFac6 = mapTo5 . cyclicASymTensFac, sparse-tensor 0cyclicASymATensFac7 = mapTo6 . cyclicASymTensFac- sparse-tensor 0cyclicASymATensFac8 = mapTo7 . cyclicASymTensFac. sparse-tensorªCyclic block symmetrization, i.e. symmetrization w.r.t. any permutation of the specified index blocks of contravariant indices of the first index type. Usual factors of  \frac{1}{i!}  where  i ” is the number of index blocks w.r.t. which the symmetrization is performed are not included. The functions that are displayed further below apply . to the various deeper + levels./ sparse-tensor )cyclicBlockSymATens1 = cyclicBlockSymTens0 sparse-tensor 2cyclicBlockSymATens2 = mapTo1 . cyclicBlockSymTens1 sparse-tensor 2cyclicBlockSymATens3 = mapTo2 . cyclicBlockSymTens2 sparse-tensor 2cyclicBlockSymATens4 = mapTo3 . cyclicBlockSymTens3 sparse-tensor 2cyclicBlockSymATens5 = mapTo4 . cyclicBlockSymTens4 sparse-tensor 2cyclicBlockSymATens6 = mapTo5 . cyclicBlockSymTens5 sparse-tensor 2cyclicBlockSymATens7 = mapTo6 . cyclicBlockSymTens6 sparse-tensor 2cyclicBlockSymATens8 = mapTo7 . cyclicBlockSymTens7 sparse-tensor1This function provides the same functionality as ./ with the only difference that it includes the  \frac{1}{i!}9 factors. The functions that are further provided apply % to deeper + levels. ?cyclicBlockSymTensFac inds t = fac &. cyclicBlockSymTens inds t8 sparse-tensor /cyclicBlockSymATensFac1 = cyclicBlockSymTensFac9 sparse-tensor 8cyclicBlockSymATensFac2 = mapTo1 . cyclicBlockSymTensFac: sparse-tensor 8cyclicBlockSymATensFac3 = mapTo2 . cyclicBlockSymTensFac; sparse-tensor 8cyclicBlockSymATensFac4 = mapTo3 . cyclicBlockSymTensFac< sparse-tensor 8cyclicBlockSymATensFac5 = mapTo4 . cyclicBlockSymTensFac= sparse-tensor 8cyclicBlockSymATensFac6 = mapTo5 . cyclicBlockSymTensFac> sparse-tensor 8cyclicBlockSymATensFac7 = mapTo6 . cyclicBlockSymTensFac? sparse-tensor 8cyclicBlockSymATensFac8 = mapTo7 . cyclicBlockSymTensFac@ sparse-tensor,This functions compute the contraction of a +‚ in two of its indices of the same index type, i.e. the function sets the two indices equal and sums over their whole index range.A sparse-tensorA is a synonym for @?. It applies the contraction to the 1st index type of a tensor. contrATens1 = tensorContrB sparse-tensorB; applies the contraction to the 2nd index type of a tensor. "contrATens2 = mapTo2 . tensorContrC sparse-tensorC; applies the contraction to the 3rd index type of a tensor. "contrATens3 = mapTo4 . tensorContrD sparse-tensorD; applies the contraction to the 4th index type of a tensor. "contrATens4 = mapTo6 . tensorContrE sparse-tensor"The following function converts a +O to a typed index tuple list, i.e. a list of key value pairs with keys of type M% and values being the corresponding + value.N sparse-tensorThis function converts a given +! to a non-typed index tuple list.» sparse-tensor2Usual map function for heterogeneous tensor lists.ÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽÿMNOQPRSUVTW/+,-.*)('&%$#"! LIJKFGHCDE<=>?@567:;342XYZ[\]^_`01a89BArtvxz|~€‚suwy{}ƒŽ‘’“”„†ˆ‡…@ABCDžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?  X[^adgjmWZ]`cfilY\_behknEFGHIJKLMNOPQRSTUVbcdefghijklmnopqopqrstuvwxyz{|}~•–—˜™š›œ¹º»¼½¾¿ÀÁƒ…‡‰‹€‚„†ˆŠŒމЋŒP5„6…8‡6ˆ7W5Y5Z5\5]5_5`5b5c5e5f5h5i5k5l5n5&(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone&'.îë'ç sparse-tensor#Standard spacetime Kronecker delta  \delta^a_b as ! 1 1 (: ¼). kdelta3 = fromListT2 $ zip [(singletonInd (Ind3 i),singletonInd (Ind3 i)) | i <- [0..3]] (repeat $ SField 1)è sparse-tensorSpacetime Kronecker delta as  .é sparse-tensor!Standard Kronecker delta for the F index type  \delta^I_J as   0 0 1 1 0 0 (: ¼). ‡delta9 = fromListT6 $ zip [(Empty, Empty, singletonInd (Ind9 i),singletonInd (Ind9 i), Empty, Empty) | i <- [0..9]] (repeat $ SField 1)ê sparse-tensor!Standard Kronecker delta for the C index type  \delta^A_B as   1 1 0 0 0 0 (: ¼). ‹delta20 = fromListT6 $ zip [(singletonInd (Ind20 i),singletonInd (Ind20 i), Empty, Empty, Empty, Empty) | i <- [0..20]] (repeat $ SField 1)ë sparse-tensorSpacetime Minkowski metric  \eta_{ab} as   0 0 0 0 0 2 (: ¼)1. The Minkowski metric could also be defined as ! 0 2 (: ¼) in similar fashion. eta = fromListT2 map (\(x,y,z) -> ((Empty,Append (Ind3 x) $ Append (Ind3 y) Empty),SField z)) [(0,0,-1),(1,1,1),(2,2,1),(3,3,1)]ì sparse-tensorMinkowski metric lifted to  .í sparse-tensor#Inverse spacetime Minkowski metric  \eta^{ab} as   0 0 0 0 2 0 (: ¼)9. The inverse Minkowski metric could also be defined as ! 2 0 (: ¼) in similar fashion. …invEta = fromListT2 $ map (\(x,y,z) -> ((Append (Ind3 x) $ Append (Ind3 y) Empty,Empty),SField z)) [(0,0,-1),(1,1,1),(2,2,1),(3,3,1)]î sparse-tensor#Inverse Minkowski metric lifted to  .ï sparse-tensor The tensor \eta_IS provides an equivalent version of the Minkowski metric that uses an index of type F to label the 108 different values of the symmetric spacetime index pair.ð sparse-tensor'Covariant spacetime Levi-Civita symbol \epsilon_{abcd} as type ATTens 0 4 (: ¼).ñ sparse-tensor'Covariant Levi-Civita symbol lifted to  .ò sparse-tensor+Contravariant spacetime Levi-Civita symbol \epsilon^{abcd} as type !4 0 (: ¼). Tó sparse-tensor+Contravariant Levi-Civita symbol lifted to  .ú sparse-tensor1Flat area metric tensor. Can be obtained via the þ intertwiner  J_A^{abcd} as: _ N_A = J_A^{abcd} \left ( \eta_{ac} \eta_{bd} - \eta_{ad} \eta_{bc} - \epsilon_{abcd} \right ) .û sparse-tensor The tensor  I^I_{ab}  maps between covariant F* indices and symmetric pairs of covariant I indices.ü sparse-tensor The tensor  J_I^{ab}  maps between covariant F indices and pairs of covariant I indices.ý sparse-tensor The tensor  I^A_{abcd} maps between covariant C indices and blocks of 4 of covariant I indices.þ sparse-tensor The tensor  J_A^{abcd} maps between contravariant C indices and blocks of 4 of contravariant I indices.ÿ sparse-tensorCan be obtained as: .C^{Am}_{Bn} = -4 \cdot I^A_{nbcd} J_B^{mbcd} zinterArea = SField (-4 :: Rational) &. contrATens3 (1,1) (contrATens3 (2,2) $ contrATens3 (3,3) $ interIArea &* interJArea sparse-tensorCan be obtained as : *K^{Im}_{Jn} = -2 \cdot I^I_{nb} J_J^{mb} OinterMetric = SField (-2 :: Rational) &. contrATens3 (0,0) (interI2 &* interJ2) sparse-tensor Is given by:  C^m_{Bn} = C^{Am}_{Bn} N_A 5flatInter = contrATens1 (0,1) $ interArea &* flatArea sparse-tensor Is given by:  K^m_{Jn} = K^{Im}_{Jn} \eta_I ;flatInterMetric = contrATens2 (0,1) $ interMetric &* etaAbs sparse-tensor Is given by: < C_{An}^{Bm} \delta_p^q - \delta_A^B \delta_p^m \delta_n^q  sparse-tensor Is given by: < K_{In}^{Jm} \delta_p^q - \delta_I^J \delta_p^m \delta_n^q  sparse-tensor Is given by: 1 C_{An}^{Bm} \delta_I^J + \delta_A^B K^{Im}_{Jn} sparse-tensor Is given by: 1 K_{In}^{Jm} \delta_K^L + \delta_I^J K^{Km}_{Ln} sparse-tensor Is given by: I C_{An}^{B(m\vert} 2 J_I^{\vert p) q} - \delta^B_A J_I ^{pm} \delta_n^q  sparse-tensor Is given by: I K_{In}^{J(m\vert} 2 J_L^{\vert p) q} - \delta^I_J J_L ^{pm} \delta_n^q   sparse-tensor Is given by: % C_{An}^{B(m\vert} J_I^{\vert p q )}   sparse-tensor Is given by: % K_{In}^{J(m\vert} J_L^{\vert p q )}   sparse-tensor tensorRank6' generic4Ansatz = 21  sparse-tensor"tensorRank6' generic5Ansatz = 21*4  sparse-tensor#tensorRank6' generic5Ansatz = 21*10 sparse-tensor%tensorRank6' generic8Ansatz = 21*22/2 sparse-tensor&tensorRank6' generic21Ansatz = 21*21*4 sparse-tensor%tensorRank6' generic5Ansatz = 84*85/2 sparse-tensor&tensorRank6' generic5Ansatz = 21*21*10 sparse-tensor(tensorRank6' generic5Ansatz = 21*21*10*4 sparse-tensor'tensorRank6' generic5Ansatz = 210*211/23çèéêëìíîïðñòóôõö÷øùúûüýþÿ     3çéêèëíìîïðòñóôõö÷øùúûüýþÿ     &(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone&'.$š) sparse-tensorThe equation is given by: (0 = a^A C_{An}^{Bm}N_B + a_0 \delta^m_n .* sparse-tensorThe equation is given by: > 0 = a^A C_{An}^{Bm} + 2 a^{AB}C_{An}^{Cm}N_C + a^B\delta^m_n .+ sparse-tensorThe equation is given by: ^ 0 = 2 a^{AC}C_{An}^{Bm} + 2a^{AB}C_{An}^{Cm} + 6 a^{ABC}C_{An}^{Dm} N_D + 2a^{BC} \delta^m_n , sparse-tensorThe equation is given by: 1 0 = a^{AI}C_{An}^{B(m\vert }N_B J^{\vert pq)}_I .- sparse-tensorThe equation is given by: } 0 = a^{AI}\left [C_{An}^{Bm}\delta^J _I- 2 \delta^B_A J_I^{pm}I^J_{pn} \right ] + a^{ABJ}C_{An}^{Cm}N_C + a^{BJ} \delta^m_n .. sparse-tensorThe equation is given by: ‰ 0 = 2a^{A(p\vert Bq}C_{An}^{C\vert m)}N_C + a^{AI} \left [C_{An}^{B(m\vert} 2 J_{I}^{\vert p)q} - \delta_A^BJ_I^{pm}\delta^q_n \right ] ./ sparse-tensorThe equation is given by: [ 0 = a^{BAI}C_{An}^{C(m\vert}N_CJ_I^{\vert pq)} + a^{AI}C_{An}^{B(m \vert} J_I^{\vert pq)} .0 sparse-tensorThe equation is given by: ‡ 0 = a^{CAI} \left [C_{An}^{Bm}\delta^J _I- 2 \delta^B_A J_I^{pm}I^J_{pn} \right ] + 2 a^{ACBJ} C_{An}^{Dm} N_D + a^{CBJ} \delta ^m _n .1 sparse-tensorThe equation is given by: ` 0 = 2 a^{BCAI}C_{An}^{D(m \vert}N_DJ_I^{\vert pq)} + a^{CAI}C_{An}^{B(m \vert} J_I^{\vert pq)} .2 sparse-tensorThe equation is given by: “ 0 = 2 a^{C A(p \vert B q} C_{An}^{D \vert m )} N_D + a^{CAI} \left [C_{An}^{B(m\vert} 2 J_{I}^{\vert p)q} - \delta_A^BJ_I^{pm}\delta^q_n \right ] .3 sparse-tensorThe equation is given by: “ 0 = 2 a^{ApCr} \left [ C_{An}^{Bm} \delta ^q_p - \delta^B_A \delta^m_p \delta^q_n \right ] +2 a^{A Bq Cr} C_{An}^{Dm} N_D + 2 a^{BqCr} \delta^m_n .4 sparse-tensorThe equation is given by: +0 = a^A K_{An}^{Bm}\eta_B + a_0 \delta^m_n .5 sparse-tensorThe equation is given by: A 0 = a^A K_{An}^{Bm} + 2 a^{AB}K_{An}^{Cm}\eta_C + a^B\delta^m_n .6 sparse-tensorThe equation is given by: a 0 = 2 a^{AC}K_{An}^{Bm} + 2a^{AB}K_{An}^{Cm} + 6 a^{ABC}K_{An}^{Dm} \eta_D + 2a^{BC} \delta^m_n 7 sparse-tensorThe equation is given by: 4 0 = a^{AI}K_{An}^{B(m\vert }\eta_B J^{\vert pq)}_I .8 sparse-tensorThe equation is given by: € 0 = a^{AI}\left [K_{An}^{Bm}\delta^J _I- 2 \delta^B_A J_I^{pm}I^J_{pn} \right ] + a^{ABJ}K_{An}^{Cm}\eta_C + a^{BJ} \delta^m_n .9 sparse-tensorThe equation is given by: Œ 0 = 2a^{A(p\vert Bq}K_{An}^{C\vert m)}\eta_C + a^{AI} \left [K_{An}^{B(m\vert} 2 J_{I}^{\vert p)q} - \delta_A^BJ_I^{pm}\delta^q_n \right ] .: sparse-tensorThe equation is given by: ^ 0 = a^{BAI}K_{An}^{C(m\vert}\eta_CJ_I^{\vert pq)} + a^{AI}K_{An}^{B(m \vert} J_I^{\vert pq)} .; sparse-tensorThe equation is given by: Š 0 = a^{CAI} \left [K_{An}^{Bm}\delta^J _I- 2 \delta^B_A J_I^{pm}I^J_{pn} \right ] + 2 a^{ACBJ} K_{An}^{Dm} \eta_D + a^{CBJ} \delta ^m _n .< sparse-tensorThe equation is given by: c 0 = 2 a^{BCAI}K_{An}^{D(m \vert}\eta_DJ_I^{\vert pq)} + a^{CAI}K_{An}^{B(m \vert} J_I^{\vert pq)} .= sparse-tensorThe equation is given by: – 0 = 2 a^{C A(p \vert B q} K_{An}^{D \vert m )} \eta_D + a^{CAI} \left [K_{An}^{B(m\vert} 2 J_{I}^{\vert p)q} - \delta_A^BJ_I^{pm}\delta^q_n \right ] .> sparse-tensorThe equation is given by: ‹ 0 = 2 a^{ApCr} \left [ K_{An}^{Bm} \delta ^q_p - \delta^B_A \delta^m_n \right ] +2 a^{A Bq Cr} K_{An}^{Dm} \eta_D + 2 a^{BqCr} \delta^m_n .% !"#$%&'()*+,-./0123456789:;<=>% "!#$%&'(),*-./+0321479:586;>=<&(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone.X4? sparse-tensorSchwarzschild metric à g = (1-\frac{r_\text{s}}{r})\,\mathrm dt\otimes\mathrm dt - \frac{1}{1-\frac{r_\text{s}}{r}}\,\mathrm dr\otimes \mathrm dr - r^2\,\mathrm d\theta\otimes \mathrm d\theta - r^2\sin^2\theta\,\mathrm d\phi\otimes \mathrm d\phi .@ sparse-tensorInverse Schwarzschild metric ù g = \frac{1}{1-\frac{r_\text{s}}{r}}\,\partial_t \otimes \partial_t - (1-\frac{r_\text{s}}{r})\,\partial_r \otimes \partial_r - \frac{1}{r^2}\,\partial_\theta \otimes \partial_\theta - \frac{1}{r^2\sin^2\theta}\,\partial_\phi \otimes \partial_\phi .A sparse-tensor/Christoffel symbol of the Schwarzschild metric.B sparse-tensor)Ricci tensor of the Schwarzschild metric.C sparse-tensorYEinstein tensor of the Schwarzschild metric. The component functions evaluate to zero:let g = einstein 2 g `evalSec` [1.1, 2.4, 1.7, 2.2] ZeroTensor?@ABC?@ABC&(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone.DpD sparse-tensorSchwarzschild metric à g = (1-\frac{r_\text{s}}{r})\,\mathrm dt\otimes\mathrm dt - \frac{1}{1-\frac{r_\text{s}}{r}}\,\mathrm dr\otimes \mathrm dr - r^2\,\mathrm d\theta\otimes \mathrm d\theta - r^2\sin^2\theta\,\mathrm d\phi\otimes \mathrm d\phi .E sparse-tensorInverse Schwarzschild metric ù g = \frac{1}{1-\frac{r_\text{s}}{r}}\,\partial_t \otimes \partial_t - (1-\frac{r_\text{s}}{r})\,\partial_r \otimes \partial_r - \frac{1}{r^2}\,\partial_\theta \otimes \partial_\theta - \frac{1}{r^2\sin^2\theta}\,\partial_\phi \otimes \partial_\phi .F sparse-tensor+Christoffel symbols of any symbolic metric.G sparse-tensor$Ricci tensor of any symbolic metric.H sparse-tensorKEinstein tensor of any symbolic metric. The components evaluate to zero:let g = schwarzschildSlet g' = schwarzschildS'let e = einsteinS g g'print eKZeroTensor -- modulo symbolic simplification, which is not implemented yet.DEFGHDEFGH&(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone\wI sparse-tensor8Returns the pivot columns of an upper triangular matrix. £» let mat = (3 >< 4) [1, 0, 2, -3, 0, 0, 1, 0, 0, 0, 0, 0] » mat (3><4) [ 1.0, 0.0, 2.0, -3.0 , 0.0, 0.0, 1.0, 0.0 , 0.0, 0.0, 0.0, 0.0 ] » pivotsU mat [0,2] J sparse-tensorVFind pivot element below position (i, j) with greatest absolute value in the ST monad.K sparse-tensor.Gaussian elimination perfomed in-place in the ½ monad.L sparse-tensorKGaussian elimination as pure function. Involves a copy of the input matrix. ÿ» let mat = (3 >< 4) [1, 1, -2, 0, 0, 2, -6, -4, 3, 0, 3, 1] » mat (3><4) [ 1.0, 1.0, -2.0, 0.0 , 0.0, 2.0, -6.0, -4.0 , 3.0, 0.0, 3.0, 1.0 ] » gaussian mat (3><4) [ 3.0, 0.0, 3.0, 1.0 , 0.0, 2.0, -6.0, -4.0 , 0.0, 0.0, 0.0, 1.6666666666666667 ] M sparse-tensor]Returns the indices of a maximal linearly independent subset of the columns in the matrix. µ» let mat = (3 >< 4) [1, 1, -2, 0, 0, 2, -6, -4, 3, 0, 3, 1] » mat (3><4) [ 1.0, 1.0, -2.0, 0.0 , 0.0, 2.0, -6.0, -4.0 , 3.0, 0.0, 3.0, 1.0 ] » independentColumns mat [0,1,3] N sparse-tensorfReturns a sub matrix containing a maximal linearly independent subset of the columns in the matrix. ï» let mat = (3 >< 4) [1, 1, -2, 0, 0, 2, -6, -4, 3, 0, 3, 1] » mat (3><4) [ 1.0, 1.0, -2.0, 0.0 , 0.0, 2.0, -6.0, -4.0 , 3.0, 0.0, 3.0, 1.0 ] » independentColumnsMat mat (3><3) [ 1.0, 1.0, 0.0 , 0.0, 2.0, -4.0 , 3.0, 0.0, 1.0 ] IJKLMNKLMNIJ&(c) 2019 Tobias Reinhart and Nils AlexMIT&tobi.reinhart@fau.de, nils.alex@fau.deNone &'.79HPSX÷uFO sparse-tensorSData type that represents a general linear combination of ansätze that involve one \epsilon^{abcd} in each individual product.P sparse-tensorRData type that represents a general linear combination of ansätze that involve no \epsilon^{abcd}.T sparse-tensorwData type that represents variables that multiply the individual ansätze to form a general linear combination. The 2nd º) argument labels the variables the first º* is a factor that multiplies the variable.V sparse-tensor)Data type that represents the individual \epsilon^{abcd}C tensor. The indices are labeled not by characters but by integers.X sparse-tensor)Data type that represents the individual  \eta^{ab}C tensor. The indices are labeled not by characters but by integers.Z sparse-tensor>Type alias to encode the symmetry information. The individual º4 values label the individual spacetime indices, the ZZ type is the compromised of (SymPairs, ASymPairs, BlockSyms, CyclicSyms, CyclicBlockSyms).[ sparse-tensor Encode an P employing the ¹ instance.\ sparse-tensor Encode an O employing the ¹ instance.] sparse-tensor Decode an P employing the ¹ instance.^ sparse-tensor Decode an O employing the ¹ instance._ sparse-tensorDMap a general function over all variables that are contained in the P.` sparse-tensorDMap a general function over all variables that are contained in the O.a sparse-tensorGReturn a list of the labels of all variables that are contained in the P.b sparse-tensorGReturn a list of the labels of all variables that are contained in the O.c sparse-tensorQReturn the rank, i.e. the number of different variables that is contained in the P.d sparse-tensorQReturn the rank, i.e. the number of different variables that is contained in the O.e sparse-tensorEShift the variable labels of all variables that are contained in the P by the amount specified.f sparse-tensorBRemove the branches with variable label contained in the argument º list from the P.g sparse-tensorEShift the variable labels of all variables that are contained in the O by the amount specified.h sparse-tensorBRemove the branches with variable label contained in the argument º list from the O.i sparse-tensor Flatten an P1 to a list that contains the individual branches.j sparse-tensor Flatten an O1 to a list that contains the individual branches.k sparse-tensor Returns an ASCII drawing of the P in the fashion explained in  Data.Tree. The ansatz ÿN x_1 \cdot 8 \{ \eta^{ac}\eta^{bd}\eta^{pq} - \eta^{ad}\eta^{bc}\eta^{pq} \} + x_2 \cdot 2 \{\eta^{ac}\eta^{bp}\eta^{dq} + \eta^{ac}\eta^{bq}\eta^{dp} - \eta^{bc}\eta^{ap}\eta^{dq} - \eta^{bc}\eta^{aq}\eta^{dp} - \eta^{ad}\eta^{bp}\eta^{cq} - \eta^{ad}\eta^{bq}\eta^{cp} + \eta^{bd}\eta^{ap}\eta^{cq} + \eta^{bd}\eta^{aq}\eta^{cp} \}  is drawn to ÿõ(1,3) | +---- (2,4) | | | `---- (5,6) * (8) * x[1] | +---- (2,5) | | | `---- (4,6) * (2) * x[2] | `---- (2,6) | `---- (4,5) * (2) * x[2] (1,4) | +---- (2,3) | | | `---- (5,6) * (-8) * x[1] | +---- (2,5) | | | `---- (3,6) * (-2) * x[2] | `---- (2,6) | `---- (3,5) * (-2) * x[2] (1,5) | +---- (2,3) | | | `---- (4,6) * (-2) * x[2] | `---- (2,4) | `---- (3,6) * (2) * x[2] (1,6) | +---- (2,3) | | | `---- (4,5) * (-2) * x[2] | `---- (2,4) | `---- (3,5) * (2) * x[2]l sparse-tensor Returns an ASCII drawing of the O in the fashion explained in  Data.Tree. The ansatz ' x_3 \cdot 16 \epsilon^{abcd}\eta^{pq}  is drawn as: %(1,2,3,4) | `---- (5,6) * (16) * x[3]m sparse-tensor[Return one representative, i.e. one individual product for each of the basis ansätze in an Pd. The function thus returns the contained individual ansätze without their explicit symmetrization.n sparse-tensor[Return one representative, i.e. one individual product for each of the basis ansätze in an Od. The function thus returns the contained individual ansätze without their explicit symmetrization.o sparse-tensor Outputs the m in  \LaTeX  format. The ¾2 argument is used to label the individual indices.p sparse-tensor Outputs the n in  \LaTeX  format. The ¾2 argument is used to label the individual indices.q sparse-tensorThe function is similar to tT yet it uses an algorithm that prioritizes memory usage over fast computation times.r sparse-tensorThe function is similar to uT yet it uses an algorithm that prioritizes memory usage over fast computation times.s sparse-tensorThe function is similar to vT yet it uses an algorithm that prioritizes memory usage over fast computation times.t sparse-tensoržThe function computes all linear independent ansätze that have rank specified by the first integer argument and further satisfy the symmetry specified by the Z) value. The additional argument of type [[º]]Ï is used to provide the information of all (by means of the symmetry at hand) independent components of the ansätze. Explicit examples how this information can be computed are provided by the functions for {, ... and also by „1, ... . The output is given as spacetime tensor ! and is explicitly symmetrized.u sparse-tensor1This function provides the same functionality as uÿš but without explicit symmetrization of the result. In other words from each symmetrization sum only the first summand is returned. This is advantageous as for large expressions explicit symmetrization might be expensive and further is sometime simply not needed as the result might for instance be contracted against a symmetric object, which thus enforces the symmetry, in further steps of the computation.v sparse-tensor1This function provides the same functionality as u* but returns the result as tensor of type   2ÿ—. This is achieved by explicitly providing not only the list of individual index combinations but also their representation using more abstract index types as input. The input list consists of triplets where the first element as before labels the independent index combinations, the second element labels the corresponding multiplicity under the present symmetry. The multiplicity simply encodes how many different combinations of spacetime indices correspond to the same abstract index tuple. The last element of the input triplets labels the individual abstract index combinations that then correspond to the provided spacetime indices. If some of the initial symmetries are still present when using abstract indices this last element might consists of more then one index combination. The appropriate value that is retrieved from the two ansatz forests is then written to each of the provided index combinations.w sparse-tensorThe function is similar to xT yet it uses an algorithm that prioritizes memory usage over fast computation times.x sparse-tensor#Provides the same functionality as t³ with the difference that the list of independent index combinations is automatically computed form the present symmetry. Note that this yields slightly higher computation costs.y sparse-tensorThe function is similar to zT yet it uses an algorithm that prioritizes memory usage over fast computation times.z sparse-tensor#Provides the same functionality as u³ with the difference that the list of independent index combinations is automatically computed form the present symmetry. Note that this yields slightly higher computation costs.{ sparse-tensorEvaluation list for a^A .| sparse-tensorEvaluation list for a^{AI} .} sparse-tensorEvaluation list for a^{A B}P. Note that also when using the abstract indices this ansatz still features the  A \leftrightarrow B  symmetry.~ sparse-tensorEvaluation list for  a^{Ap Bq}P. Note that also when using the abstract indices this ansatz still features the  (Ap) \leftrightarrow (Bq)  symmetry. sparse-tensorEvaluation list for a^{ABI} .€ sparse-tensorEvaluation list for a^{ABC} z. Note that also when using the abstract indices this ansatz still features the symmetry under arbitrary permutations of  ABC. sparse-tensorEvaluation list for  a^{ABp Cq}P. Note that also when using the abstract indices this ansatz still features the  (Bp) \leftrightarrow (Cq)  symmetry.‚ sparse-tensorEvaluation list for  a^{A B C I}P. Note that also when using the abstract indices this ansatz still features the  (A) \leftrightarrow (B)  symmetry.„ sparse-tensorEvaluation list for a^{A} .… sparse-tensorEvaluation list for a^{AI} .† sparse-tensorEvaluation list for a^{A B}P. Note that also when using the abstract indices this ansatz still features the  A \leftrightarrow B  symmetry.‡ sparse-tensorEvaluation list for  a^{Ap Bq}P. Note that also when using the abstract indices this ansatz still features the  (Ap) \leftrightarrow (Bq)  symmetry.ˆ sparse-tensorEvaluation list for a^{ABI} .‰ sparse-tensorEvaluation list for a^{ABC} z. Note that also when using the abstract indices this ansatz still features the symmetry under arbitrary permutations of  ABC.Š sparse-tensorEvaluation list for  a^{ABp Cq}P. Note that also when using the abstract indices this ansatz still features the  (Bp) \leftrightarrow (Cq)  symmetry.‹ sparse-tensorEvaluation list for  a^{A B C I}P. Note that also when using the abstract indices this ansatz still features the  (A) \leftrightarrow (B)  symmetry.Œ sparse-tensorSymmetry list for {. sparse-tensorSymmetry list for |.Ž sparse-tensorSymmetry list for }. sparse-tensorSymmetry list for ~. sparse-tensorSymmetry list for .‘ sparse-tensorSymmetry list for €.’ sparse-tensorSymmetry list for .“ sparse-tensorSymmetry list for ‚.• sparse-tensorSymmetry list for „.– sparse-tensorSymmetry list for ….— sparse-tensorSymmetry list for †.˜ sparse-tensorSymmetry list for ‡.™ sparse-tensorSymmetry list for ˆ.š sparse-tensorSymmetry list for ‰.› sparse-tensorSymmetry list for Š.œ sparse-tensorSymmetry list for ‹.NOPRQSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œNXYVWTUOPRQSijmnopklabfheg_`cd[\]^tuvxzqrswyZ{|}~€‚„…†‡ˆ‰Š‹ŒŽ‘’“•–—˜™š›œ”ƒ¿     !"#$%&'()*+,-./012345657899:;;<=>??@@ABCDEFGHHIJJKLLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVVWWXXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼¶½¾¿ÀÁÂÀÃÄÀÅÆÇ,sparse-tensor-0.2.1.3-1oSHyJl4LjiARKY6uzzD0c Math.TensorMath.Tensor.Examples.Gravity*Math.Tensor.Examples.Gravity.DiffeoSymEqns*Math.Tensor.Examples.Gravity.Schwarzschild2Math.Tensor.Examples.Gravity.SchwarzschildSymbolic"Math.Tensor.Internal.LinearAlgebraMath.Tensor.LorentzGeneratorData.ByteString.Lazy ByteString TensList8 EmptyTList8 AppendTList8 TensList7 EmptyTList7 AppendTList7 TensList6 EmptyTList6 AppendTList6 TensList5 EmptyTList5 AppendTList5 TensList4 EmptyTList4 AppendTList4 TensList3 EmptyTList3 AppendTList3 TensList2 EmptyTList2 AppendTList2 TensList1 EmptyTList1 AppendTList1 IndTuple8 IndTuple7 IndTuple6 IndTuple5 IndTuple4 IndTuple3 IndTuple2 IndTuple1ATensSTTens AbsTensor8 AbsTensor7 AbsTensor6 AbsTensor5 AbsTensor4 AbsTensor3 AbsTensor2 AbsTensor1Tensor2TensorScalar ZeroTensorTMapCFunAnsVarRAnsVarProdTProdprod SSymbolicSFieldTAdd scaleZeroaddSnegateSsubS IndTupleAbs IndTupleSTInd20indVal20Ind9indVal9Ind3indVal3TIndexIndListEmptyAppend+> singletonIndfromListfromListUnsafesortIndheadIndtailInd updateIndshiftVarLabels shiftLabels1 shiftLabels2 shiftLabels3 shiftLabels4 shiftLabels5 shiftLabels6 shiftLabels7 shiftLabels8evalSec toMatListT1' toMatListT2' toMatListT3' toMatListT4' toMatListT5' toMatListT6' toMatListT7' toMatListT8' toMatrixT1' toMatrixT2' toMatrixT3' toMatrixT4' toMatrixT5' toMatrixT6' toMatrixT7' toMatrixT8' fromListT fromListT' fromListT1 fromListT1' fromListT2 fromListT2' fromListT3 fromListT3' fromListT4 fromListT4' fromListT5 fromListT5' fromListT6 fromListT6' fromListT7 fromListT7' fromListT8 fromListT8'&+&. negateTens&-&* encodeTensor decodeTensorpartialpartialSymbolicmapTo1mapTo2mapTo3mapTo4mapTo5mapTo6mapTo7mapTo8 removeZeros removeZeros1 removeZeros2 removeZeros3 removeZeros4 removeZeros5 removeZeros6 removeZeros7 removeZeros8 tensorTrans tensorTrans1 tensorTrans2 tensorTrans3 tensorTrans4 tensorTrans5 tensorTrans6 tensorTrans7 tensorTrans8tensorBlockTranstensorBlockTrans1tensorBlockTrans2tensorBlockTrans3tensorBlockTrans4tensorBlockTrans5tensorBlockTrans6tensorBlockTrans7tensorBlockTrans8 resortTens resortTens1 resortTens2 resortTens3 resortTens4 resortTens5 resortTens6 resortTens7 resortTens8evalTens evalTens1 evalTens2 evalTens3 evalTens4 evalTens5 evalTens6 evalTens7 evalTens8symTens symATens1 symATens2 symATens3 symATens4 symATens5 symATens6 symATens7 symATens8 symTensFac symATensFac1 symATensFac2 symATensFac3 symATensFac4 symATensFac5 symATensFac6 symATensFac7 symATensFac8aSymTens aSymATens1 aSymATens2 aSymATens3 aSymATens4 aSymATens5 aSymATens6 aSymATens7 aSymATens8 aSymTensFac aSymATensFac1 aSymATensFac2 aSymATensFac3 aSymATensFac4 aSymATensFac5 aSymATensFac6 aSymATensFac7 aSymATensFac8 symBlockTenssymBlockATens1symBlockATens2symBlockATens3symBlockATens4symBlockATens5symBlockATens6symBlockATens7symBlockATens8symBlockTensFacsymBlockATensFac1symBlockATensFac2symBlockATensFac3symBlockATensFac4symBlockATensFac5symBlockATensFac6symBlockATensFac7symBlockATensFac8 aSymBlockTensaSymBlockATens1aSymBlockATens2aSymBlockATens3aSymBlockATens4aSymBlockATens5aSymBlockATens6aSymBlockATens7aSymBlockATens8aSymBlockTensFacaSymBlockATensFac1aSymBlockATensFac2aSymBlockATensFac3aSymBlockATensFac4aSymBlockATensFac5aSymBlockATensFac6aSymBlockATensFac7aSymBlockATensFac8 cyclicSymTenscyclicSymATens1cyclicSymATens2cyclicSymATens3cyclicSymATens4cyclicSymATens5cyclicSymATens6cyclicSymATens7cyclicSymATens8cyclicSymTensFaccyclicSymATensFac1cyclicSymATensFac2cyclicSymATensFac3cyclicSymATensFac4cyclicSymATensFac5cyclicSymATensFac6cyclicSymATensFac7cyclicSymATensFac8cyclicASymTenscyclicASymATens1cyclicASymATens2cyclicASymATens3cyclicASymATens4cyclicASymATens5cyclicASymATens6cyclicASymATens7cyclicASymATens8cyclicASymTensFaccyclicASymATensFac1cyclicASymATensFac2cyclicASymATensFac3cyclicASymATensFac4cyclicASymATensFac5cyclicASymATensFac6cyclicASymATensFac7cyclicASymATensFac8cyclicBlockSymTenscyclicBlockSymATens1cyclicBlockSymATens2cyclicBlockSymATens3cyclicBlockSymATens4cyclicBlockSymATens5cyclicBlockSymATens6cyclicBlockSymATens7cyclicBlockSymATens8cyclicBlockSymTensFaccyclicBlockSymATensFac1cyclicBlockSymATensFac2cyclicBlockSymATensFac3cyclicBlockSymATensFac4cyclicBlockSymATensFac5cyclicBlockSymATensFac6cyclicBlockSymATensFac7cyclicBlockSymATensFac8 tensorContr contrATens1 contrATens2 contrATens3 contrATens4toListTtoListT1toListT2toListT3toListT4toListT5toListT6toListT7toListT8toListT' toListT1' toListT2' toListT3' toListT4' toListT5' toListT6' toListT7' toListT8'...>singletonTList1...+..&>singletonTList2..&+.&.>singletonTList3.&.+.&&>singletonTList4.&&+&..>singletonTList5&..+&.&>singletonTList6&.&+&&.>singletonTList7&&.+&&&>singletonTList8&&&+ toMatListT1 toMatListT2 toMatListT3 toMatListT4 toMatListT5 toMatListT6 toMatListT7 toMatListT8 toMatrixT1 toMatrixT2 toMatrixT3 toMatrixT4 toMatrixT5 toMatrixT6 toMatrixT7 toMatrixT8 tensorRank1' tensorRank1 tensorRank2' tensorRank2 tensorRank3' tensorRank3 tensorRank4' tensorRank4 tensorRank5' tensorRank5 tensorRank6' tensorRank6 tensorRank7' tensorRank7 tensorRank8' tensorRank8$fFoldableIndList$fFunctorIndList$fNFDataIndList$fGenericIndList $fEnumInd3 $fTIndexInd3 $fEnumInd9 $fTIndexInd9 $fEnumInd20 $fTIndexInd20 $fTAddSField $fNumSField$fApplicativeSField$fFunctorSField$fTAddSSymbolic$fNumSSymbolic$fEpsilonInteger $fEpsilonInt$fEpsilonRatio$fEpsilonFloat$fEpsilonDouble$fProdSSymbolicSField$fProdSFieldSSymbolic$fProdSSymbolicSSymbolic$fProdSFieldSField$fProdAnsVarSField$fProdSFieldAnsVar $fTAddAnsVar$fProdSFieldCFun$fProdCFunCFun $fTAddCFun $fNumCFun$fApplicativeCFun $fFunctorCFun$fFunctorTensor$fNFDataTensor$fProdTensorTensor$fProdSSymbolicTensor$fProdAnsVarTensor$fProdSFieldTensor $fTAddTensor$fGenericTensor $fOrdInd3$fEqInd3 $fShowInd3 $fReadInd3 $fGenericInd3 $fNFDataInd3$fSerializeInd3 $fOrdInd9$fEqInd9 $fShowInd9 $fReadInd9 $fGenericInd9 $fNFDataInd9$fSerializeInd9 $fOrdInd20 $fEqInd20 $fShowInd20 $fReadInd20$fGenericInd20 $fNFDataInd20$fSerializeInd20 $fShowSField $fEqSField $fOrdSField$fGenericSField$fSerializeSField$fShowSSymbolic $fEqSSymbolic$fOrdSSymbolic$fGenericSSymbolic$fSerializeSSymbolic $fShowAnsVar $fEqAnsVar$fGenericAnsVar$fSerializeAnsVar$fShowTensorRep$fGenericTensorRep$fSerializeTensorRep $fEqTensor $fShowTensor$fSerializeTensor $fShowIndList $fOrdIndList $fEqIndList$fSerializeIndList $fShowIsZerodelta3delta3Adelta9delta20etaetaAinvEtainvEtaAetaAbsepsilonepsilonA epsilonInv epsilonInvA lorentzJ1 lorentzJ2 lorentzJ3 lorentzK1 lorentzK2 lorentzK3flatAreainterI2interJ2 interIArea interJArea interArea interMetric flatInterflatInterMetric interEqn2interEqn2Metric interEqn3interEqn3Metric interEqn4interEqn4Metric interEqn5interEqn5Metricgeneric4Ansatzgeneric5Ansatzgeneric6Ansatzgeneric8Ansatzgeneric9Ansatzgeneric10_1Ansatzgeneric10_2Ansatzgeneric11Ansatzgeneric12_1AnsatzrandArearandAxon randFlatArearandAreaDerivative1randAreaDerivative2 randMetricansatzAansatzAIansatzAB ansatzAaBb ansatzABI ansatzAIBJ ansatzABC ansatzABbCc ansatzABCI ansatzAaBbCI ansatzABICJ ansatzAIBJCK ansatzABCD ansatzABCDJ ansatzABCcDdeqn1eqn1Aeqn1ABeqn3eqn1AIeqn2Aaeqn3Aeqn1ABIeqn3ABeqn2ABbeqn1AaBbeqn1Meteqn1AMet eqn1ABMeteqn3Met eqn1AIMet eqn2AaMeteqn3AMet eqn1ABIMet eqn3ABMet eqn2ABbMet eqn1AaBbMet schwarzschildschwarzschild' christoffelriccieinsteinschwarzschildSschwarzschildS' christoffelSricciS einsteinSpivotsU findPivotMax gaussianSTgaussianindependentColumnsindependentColumnsMatAnsatzForestEpsilonAnsatzForestEta ForestEtaLeaf EmptyForestVarEpsilonEtaSymmetryencodeAnsatzForestEtaencodeAnsatzForestEpsilondecodeAnsatzForestEtadecodeAnsatzForestEpsilonmapVarsmapVarsEpsilongetForestLabelsgetForestLabelsEpsilon ansatzRankansatzRankEpsilonrelabelAnsatzForest removeVarsEtarelabelAnsatzForestEpsilon removeVarsEps flattenForestflattenForestEpsilon drawAnsatzEtadrawAnsatzEpsilon forestEtaList forestEpsListforestEtaListLatexforestEpsListLatexmkAnsatzTensorIncrementalSymmkAnsatzTensorIncrementalmkAnsatzTensorIncrementalAbsmkAnsatzTensorFastSymmkAnsatzTensorFastmkAnsatzTensorFastAbsmkAnsatzTensorIncrementalSym'mkAnsatzTensorFastSym'mkAnsatzTensorIncremental'mkAnsatzTensorFast' areaList4 areaList6 areaList8 areaList10_1 areaList10_2 areaList12 areaList14_1 areaList14_2 areaList16_1 metricList2 metricList4_1 metricList4_2 metricList6_1 metricList6_2 metricList6_3 metricList8_1 metricList8_2symList4symList6symList8 symList10_1 symList10_2 symList12 symList14_1 symList14_2 symList16_1metricsymList2metricsymList4_1metricsymList4_2metricsymList6_1metricsymList6_2metricsymList6_3metricsymList8_1metricsymList8_2 $fShowEta $fReadEta$fEqEta$fOrdEta $fGenericEta$fSerializeEta $fNFDataEta $fShowEpsilon $fReadEpsilon $fEqEpsilon $fOrdEpsilon$fGenericEpsilon$fSerializeEpsilon$fNFDataEpsilon $fShowVar $fReadVar$fEqVar$fOrdVar $fGenericVar$fSerializeVar $fNFDataVar$fShowAnsatzForestEta$fReadAnsatzForestEta$fEqAnsatzForestEta$fGenericAnsatzForestEta$fSerializeAnsatzForestEtaghc-prim GHC.ClassesOrdindexInd%cereal-0.5.8.1-KRPM4Pfa6l3HK7sjbDz33xData.Serialize Serialize GHC.TypesInt mapTensList1baseGHC.RealRationalGHC.STSTGHC.BaseString