\ignore{
\begin{code}
module RuleValues where
import Data.Ratio

deltaStar :: Int
deltaStar = 16
\end{code}
}

\begin{code}
weak :: Int -> Rational
weak 12 = 4 % 3
weak 13 = 14023 % 10080
weak len | len > 13 = 2 % 1 - 8 % toInteger len

-- small len nt, where nt = True if the next edge
-- on the face is in a <= 4-face.
small :: Int -> Bool -> Rational
small 12 True = 1 % 3
small 12 False = 2 % 3
small 13 True = 6137 % 20160
small 13 False = 14023 % 20160
small len True | len > 13 = 1 % 2 - 2 % toInteger len
small len False | len > 13 = 1 % 1 - 4 % toInteger len

iso :: Int -> Rational
iso 12 = 23827 % 36960
iso 13 = 1097 % 1680
iso len | len > 13 = 1 % 1 - 4 % toInteger len

ruleA :: Int -> Rational
ruleA 6 = 1 % 1
ruleA 7 = 1 % 1
ruleA 8 = 1 % 1
ruleA 9 = 17383 % 15120
ruleA 10 = 8983 % 7560
ruleA 11 = 4 % 3
ruleA len | len > 11 = weak len

ruleB :: Int -> Rational
ruleB 6 = 3 % 4
ruleB 7 = 14 % 15
ruleB 8 = 14 % 15
ruleB 9 = 17383 % 15120
ruleB 10 = 8983 % 7560
ruleB 11 = 4 % 3
ruleB len | len > 11 = weak len

ruleG :: Int -> Rational
ruleG 6 = 3 % 4
ruleG 7 = 9 % 10
ruleG 8 = 82 % 105
ruleG 9 = 2743 % 2520
ruleG 10 = 16217 % 15120
ruleG 11 = 4 % 3
ruleG len | len > 11 = weak len

-- type of the edge following after a triangle or 4-face
-- Deg3: adjacent through a 3-vertex (and thus the face has
--       length >= 5 if len < deltaStar, since cyclic degree of
--       the vertex is at least deltaStar + 2)
-- DG4_Short: adjacent through a >=4-vertex and length <= 4
-- DG4_Long: adjacent through a >=4-vertex and length >= 5
data AdjEdgeType = Deg3 | DG4_Short | DG4_Long deriving (Eq, Ord, Show)

ruleC :: AdjEdgeType -> Int -> AdjEdgeType -> Rational
ruleC DG4_Long 5 DG4_Long = -11507 % 36960
ruleC DG4_Long 5 DG4_Short = -7 % 40
ruleC DG4_Long 5 Deg3 = 349 % 840
ruleC DG4_Short 5 DG4_Short = -1 % 7
ruleC DG4_Short 5 Deg3 = 13 % 30
ruleC Deg3 5 Deg3 = 53 % 120

ruleC DG4_Long 6 DG4_Long = -10 % 33
ruleC DG4_Long 6 DG4_Short = 1 % 336
ruleC DG4_Long 6 Deg3 = 1 % 2
ruleC DG4_Short 6 DG4_Short = 0 % 1
ruleC DG4_Short 6 Deg3 = 1 % 2
ruleC Deg3 6 Deg3 = 97 % 160

ruleC DG4_Long 7 DG4_Long = 2 % 55
ruleC DG4_Long 7 DG4_Short = 1 % 336
ruleC DG4_Long 7 Deg3 = 211 % 336
ruleC DG4_Short 7 DG4_Short = 0 % 1
ruleC DG4_Short 7 Deg3 = 1 % 2
ruleC Deg3 7 Deg3 = 13 % 15

ruleC x len y | 5 <= len && len <= 7 = ruleC y len x
ruleC p len n | len > 7 = ruleC_single len p + ruleC_single len n

ruleC_single :: Int -> AdjEdgeType -> Rational
ruleC_single 8 DG4_Long = 583 % 1680
ruleC_single 8 DG4_Short = 193 % 840
ruleC_single 8 Deg3 = 7 % 15

ruleC_single 9 DG4_Long = 7223 % 30240
ruleC_single 9 DG4_Short = 1517 % 7560
ruleC_single 9 Deg3 = 17383 % 30240

ruleC_single 10 DG4_Long = 83 % 378
ruleC_single 10 DG4_Short = 47851 % 166320
ruleC_single 10 Deg3 = 8983 % 15120

ruleC_single 11 DG4_Long = 17 % 33
ruleC_single 11 DG4_Short = 7 % 22
ruleC_single 11 Deg3 = 3 % 5

ruleC_single len adj | len > 11 = small len (adj == DG4_Short)

ruleD :: AdjEdgeType -> Int -> AdjEdgeType -> Rational
ruleD DG4_Long 5 DG4_Long = 1 % 4
ruleD DG4_Long 5 DG4_Short = 0 % 1
ruleD DG4_Long 5 Deg3 = 349 % 840
ruleD DG4_Short 5 DG4_Short = 1 % 15
ruleD DG4_Short 5 Deg3 = 1 % 8
ruleD Deg3 5 Deg3 = 4 % 7

ruleD DG4_Long 6 DG4_Long = 1 % 4
ruleD DG4_Long 6 DG4_Short = 0 % 1
ruleD DG4_Long 6 Deg3 = 3 % 8
ruleD DG4_Short 6 DG4_Short = -13 % 60
ruleD DG4_Short 6 Deg3 = 1 % 8
ruleD Deg3 6 Deg3 = 67 % 120

ruleD DG4_Long 7 DG4_Long = 1 % 4
ruleD DG4_Long 7 DG4_Short = 0 % 1
ruleD DG4_Long 7 Deg3 = 3 % 8
ruleD DG4_Short 7 DG4_Short = 3 % 7
ruleD DG4_Short 7 Deg3 = 3281 % 20160
ruleD Deg3 7 Deg3 = 13 % 15

ruleD x len y | 5 <= len && len <= 7 = ruleD y len x
ruleD p len n | len > 7 = ruleD_single len p + ruleD_single len n

ruleD_single :: Int -> AdjEdgeType -> Rational
ruleD_single 8 DG4_Long = 41 % 105
ruleD_single 8 DG4_Short = 1 % 4
ruleD_single 8 Deg3 = 1 % 3

ruleD_single 9 DG4_Long = 1009 % 2160
ruleD_single 9 DG4_Short = 5 % 18
ruleD_single 9 Deg3 = 5017 % 10080

ruleD_single 10 DG4_Long = 20743 % 40320
ruleD_single 10 DG4_Short = 0 % 1
ruleD_single 10 Deg3 = 4615 % 8064

ruleD_single 11 DG4_Long = 13 % 22
ruleD_single 11 DG4_Short = 26 % 165
ruleD_single 11 Deg3 = 13 % 22

ruleD_single len adj | len > 11 = small len (adj == DG4_Short)

-- mLen is the minimum of lengths of the other two faces
-- that the current face meets at the vertex
ruleE :: Int -> Int -> Rational
ruleE len@5 mLen = if mLen < 15 then 1 % 7 else -61 % 240
ruleE len@6 mLen = if mLen < 14 then 49 % 240 else -1 % 15
ruleE len@7 mLen = if mLen < 13 then 79 % 240 else -1 % 15
ruleE len@8 mLen = if mLen < 13 then 41 % 105 else 9 % 28
ruleE len@9 mLen = if mLen < 12 then 7 % 15 else 1 % 3
ruleE len@10 mLen = if mLen < 12 then 7 % 15 else 1 % 3
ruleE len@11 mLen = if mLen < 11 then 7 % 15 else 1 % 3
ruleE len _ | len > 11 = iso len

big_to_four :: Rational
big_to_four = 1 % 4

-- depends on the number of incident 4-faces
five_to_single_triangle :: Int -> Rational
five_to_single_triangle 0 = 767 % 1680
five_to_single_triangle 1 = 737 % 1680
five_to_single_triangle 2 = 37 % 120

-- True if both faces incident with the triangle have length at most 7
five_to_two_triangles :: Bool -> Rational
five_to_two_triangles True = 83 % 140
five_to_two_triangles False = 57 % 140

six_to_le2_adj_triangles :: Rational
six_to_le2_adj_triangles = 63 % 80

six_to_two_opp_triangles :: Rational
six_to_two_opp_triangles = 767 % 1680

six_to_three_triangles :: Int -> Int -> Rational
six_to_three_triangles 6 6 = 8 % 15
six_to_three_triangles x y | x + y <= 12 = 113 % 120
six_to_three_triangles _ _ = 881 % 1680

short_to_lightA :: Int -> Int -> Int -> Rational
short_to_lightA len x y | x > y = short_to_lightA len y x
short_to_lightA len x y =
  case (len, deltaStar - x, deltaStar - y) of
      (7, 1, 1) -> 1 % 15
      (7, 1, 0) -> 1 % 30
      (7, 0, 0) -> 0 % 1
      (8, 2, 2) -> 1 % 7
      (8, 2, 1) -> 1 % 7
      (8, 2, 0) -> 3 % 28
      (8, 1, 1) -> 1 % 15
      (8, 1, 0) -> 1 % 30
      (8, 0, 0) -> 0 % 1

-- True if both adjacent faces have length deltaStar + 6 - len
face_to_lightA :: Int -> Bool -> Rational
face_to_lightA 9 False = 185 % 6048
face_to_lightA 9 True = 3257 % 30240
face_to_lightA 10 False = 583 % 10080
face_to_lightA 10 True = 583 % 5040
face_to_lightA 11 False = 0 % 1
face_to_lightA 11 True = 0 % 1

light_C_extra :: Int -> Int -> Rational
light_C_extra len x =
  case (len, deltaStar - x) of
    (6, 1) -> 0 % 1
    (6, 0) -> 0 % 1
    (7, 2) -> 1 % 30
    (7, 1) -> 1 % 30
    (7, 0) -> 0 % 1

light_D_extra :: Int -> Int -> Rational
light_D_extra len x =
  case (len, deltaStar - x) of
     (6, 2) -> 1 % 30
     (6, 1) -> 1 % 30
     (6, 0) -> 0 % 1

through_heavy :: Int -> Rational
through_heavy len = if len >= 12 then 17 % 80 else 0 % 1

four_to_five :: Rational
four_to_five = 109 % 840

four1 :: Rational
four1 = 1 % 2

four2 :: Rational
four2 = 1 % 2

star_CC_extra :: Int -> Rational
star_CC_extra 5 = 37 % 240
star_CC_extra 11 = 14 % 165

eleven_to_opp_66tri_extra :: Rational
eleven_to_opp_66tri_extra = 28 % 165

ten_to_13_A_extra :: Rational
ten_to_13_A_extra = 89 % 6048

\end{code}
