packages feed

moonlight-planar-1.1.0.0: test/lifted-sign/Main.hs

module Main (main) where

import Control.DeepSeq (force)
import Control.Exception (evaluate)
import Control.Monad (unless)
import Moonlight.Planar.LiftedSignCases

main :: IO ()
main = do
  cases <- either (fail . show) (evaluate . force) liftedSignCases
  let failures =
        [ (family, index, candidateSign input, magnitudeSign input)
        | (family, inputs) <- cases
        , (index, input) <- zip ([0 ..] :: [Int]) (concatMap permutedInputs inputs)
        , candidateSign input /= magnitudeSign input
        ]
      conventionFailures =
        [ (expected, candidateSign input)
        | (expected, input) <- conventionInputs
        , candidateSign input /= expected || magnitudeSign input /= expected
        ]
      coplanarFailures =
        [ index
        | (ExactlyCoplanar, inputs) <- cases
        , (index, input) <- zip ([0 ..] :: [Int]) inputs
        , candidateSign input /= EQ
        ]
      nearCoplanarFailures =
        [ index
        | (NearlyCoplanar, inputs) <- cases
        , (index, input) <- zip ([1 ..] :: [Int]) inputs
        , candidateSign input /= if even index then GT else LT
        ]
  unless (null failures) (fail ("lifted-sign differential disagreement: " <> show (take 8 failures)))
  unless (null conventionFailures) (fail ("upper-affine sign convention disagreement: " <> show conventionFailures))
  unless (null coplanarFailures) (fail ("coplanar determinant is nonzero: " <> show coplanarFailures))
  unless (null nearCoplanarFailures) (fail ("near-coplanar perturbation sign disagreement: " <> show nearCoplanarFailures))
  putStrLn
    ( "lifted-sign: "
        <> show (sum (map (length . concatMap permutedInputs . snd) cases))
        <> " exact differential permutations; convention, coplanarity and perturbation laws passed"
    )