-- | Tom Johnson. \"Networks\". In Conference on Mathematics and
-- Computation in Music, Berlin, May 2007.
module Music.Theory.Block_Design.Johnson_2007 where

import Control.Arrow {- base -}
import Data.List {- base -}

import qualified Music.Theory.List as T

-- * Designs

data Design i = Design [i] [[i]]

-- * Johnson (7,3,1), (13,4,1) and (12,4,3)

-- > c_7_3_1 == [1,3,4,2,7,6,5]
c_7_3_1 :: (Num i) => [i]
c_7_3_1 = [1,3,4,2,7,6,5]

-- > b_7_3_1 == ([[1,2,3],[3,4,7],[2,4,6],[2,5,7],[1,6,7],[3,5,6],[1,4,5]]
-- >            ,[[1,2,4],[2,3,7],[4,6,7],[2,5,6],[1,5,7],[1,3,6],[3,4,5]])
b_7_3_1 :: (Ord i,Num i) => ([[i]], [[i]])
b_7_3_1 =
    let c = c_7_3_1
        f i (j1,j2) = sort [i,j1,j2]
    in (zipWith f (T.rotate_left 3 c) (T.adj2_cyclic 1 c)
       ,zipWith f c (T.adj2_cyclic 1 (T.rotate_left 2 c)))

d_7_3_1 :: (Enum n,Ord n,Num n) => (Design n,Design n)
d_7_3_1 = let d = Design [1..7] in (d *** d) b_7_3_1

-- > length n_7_3_1 == 7 && sort n_7_3_1 == n_7_3_1
n_7_3_1 :: Num i => [(i,i)]
n_7_3_1 = [(3,4),(3,11),(4,1),(4,3),(4,5),(4,7),(5,2)]

-- > Music.Theory.List.histogram (concat p_9_3_1) == [(1,4),(2,4),(3,4),(4,4),(5,4),(6,4),(7,4),(8,4),(9,4)]
p_9_3_1 :: Num i => [[i]]
p_9_3_1 = [[1,8,9],[2,3,5],[4,6,7],[1,4,5],[2,6,8],[3,7,9],[1,2,7],[3,4,8],[5,6,9],[1,3,6],[2,4,9],[5,7,8]]

-- > b_13_4_1 == ([[1,2,4,10],[2,3,5,11],[3,4,6,12],[4,5,7,13],[1,5,6,8],[2,6,7,9],[3,7,8,10],[4,8,9,11],[5,9,10,12],[6,10,11,13],[1,7,11,12],[2,8,12,13]]
-- >             ,[[4,8,9,11],[5,9,10,12],[6,10,11,13],[1,7,11,12],[2,8,12,13],[1,3,9,13],[1,2,4,10],[2,3,5,11],[3,4,6,12],[4,5,7,13],[1,5,6,8],[2,6,7,9]])
b_13_4_1 :: (Enum i,Num i,Ord i) => ([[i]], [[i]])
b_13_4_1 =
    let c = [1..13]
        c' = T.rotate_left 7 c
        d = T.interleave_rotations 9 3 c
        e = T.interleave_rotations 3 10 c
        f (i1,i2) (j1,j2) = sort [i1,i2,j1,j2]
    in (zipWith f (T.adj2 1 c) (T.adj2 2 d)
       ,zipWith f (T.adj2 1 c') (T.adj2 2 e))

d_13_4_1 :: (Enum n,Ord n,Num n) => (Design n,Design n)
d_13_4_1 = let d = Design [1..13] in (d *** d) b_13_4_1

-- > length n_13_4_1 == 13 && sort n_13_4_1 == n_13_4_1
n_13_4_1 :: Num i => [(i,i)]
n_13_4_1 = [(3,0),(3,2),(3,5),(3,7),(3,10),(4,0),(4,3),(4,5),(4,8),(4,10),(5,1),(5,3),(5,6)]

-- > histogram (concat b_12_4_3) == [(1,11),(2,11),(3,11),(4,11),(5,11),(6,11),(7,11),(8,11),(9,11),(10,11),(11,11),(12,11)]
-- > histogram (map (sort.concat) (chunksOf 3 b_12_4_3)) == [([1,2,3,4,5,6,7,8,9,10,11,12],11)]
-- > map length (adj_intersect 1 b_12_4_3) == [0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0]
-- > map (map length . adj_intersect 1) (cycles 3 b_12_4_3) == [[1,1,1,1,1,1,1,1,1,1],[2,2,2,2,2,2,2,2,2,2],[1,1,1,1,1,1,1,1,1,1]]
-- > map adj_intersect 1 (cycles 3 b_12_4_3) == [[[12],[12],[12],[12],[12],[12],[12],[12],[12],[12]]
-- >                                            ,[[8,9],[7,8],[6,7],[5,6],[4,5],[3,4],[2,3],[1,2],[1,11],[10,11]]
-- >                                            ,[[3],[2],[1],[11],[10],[9],[8],[7],[6],[5]]]
b_12_4_3 :: Integral i => [[i]]
b_12_4_3 =
    [[1,5,7,12]
    ,[2,8,9,10]
    ,[3,4,6,11]
    ,[4,6,11,12]
    ,[1,7,8,9]
    ,[2,3,5,10]
    ,[3,5,10,12]
    ,[6,7,8,11]
    ,[1,2,4,9]
    ,[2,4,9,12]
    ,[5,6,7,10]
    ,[1,3,8,11]
    ,[1,3,8,12]
    ,[4,5,6,9]
    ,[2,7,10,11]
    ,[2,7,11,12]
    ,[3,4,5,8]
    ,[1,6,9,10]
    ,[1,6,10,12]
    ,[2,3,4,7]
    ,[5,8,9,11]
    ,[5,9,11,12]
    ,[1,2,3,6]
    ,[4,7,8,10]
    ,[4,8,10,12]
    ,[1,2,5,11]
    ,[3,6,7,9]
    ,[3,7,9,12]
    ,[1,4,10,11]
    ,[2,5,6,8]
    ,[2,6,8,12]
    ,[3,9,10,11]
    ,[1,4,5,7]]

-- > length n_12_4_3 == 12 && sort n_12_4_3 == n_12_4_3
n_12_4_3 :: Num i => [(i,i)]
n_12_4_3 = [(3,2),(3,5),(3,6),(3,9),(3,10),(4,1),(4,4),(4,7),(4,8),(4,11),(5,0),(5,3)]

-- Local Variables:
-- truncate-lines:t
-- End: