progs/cube.sc
author Christian Urban <christian.urban@kcl.ac.uk>
Sun, 15 Jan 2023 10:57:28 +0000
changeset 458 5a86b9983d32
parent 415 368556c8df56
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     1
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     2
// for measuring time
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     3
def time_needed[T](i: Int, code: => T) = {
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     4
  val start = System.nanoTime()
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     5
  for (j <- 1 to i) code
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     6
  val end = System.nanoTime()
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
  (end - start) / (i * 1.0e9)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
}
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    10
// for measuring memory usage
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
val mb = 1024*1024
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    12
val runtime = Runtime.getRuntime
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    14
def memory() = {
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    15
    println(s"  ** Used Memory:  ${(runtime.totalMemory - runtime.freeMemory) / mb}")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    16
    println(s"  ** Free Memory:  ${runtime.freeMemory / mb}")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    17
    println(s"  ** Total Memory: ${runtime.totalMemory / mb}")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    18
    println(s"  ** Max Memory:   ${runtime.maxMemory / mb}")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    19
}
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    20
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    21
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    22
abstract class Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    23
case object White extends Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    24
case object Yellow extends Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    25
case object Orange extends Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    26
case object Red extends Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    27
case object Green extends Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    28
case object Blue extends Colour
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    29
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    30
//    -------
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    31
//   |c11 c12|
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    32
//   |c21 c22|
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    33
//    -------  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
case class Face(c11: Colour, c12: Colour,
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    35
                c21: Colour, c22: Colour)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    36
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
//     +--+
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
//     |f2|
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    39
//  +--+  +--+
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    40
//  |f5 f1 f6|
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
//  +--+  +--+
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    42
//     |f3|
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
//     |f4|
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
//     +--+ 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    45
case class Cube(f1: Face, f2: Face, f3: Face,
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    46
                f4: Face, f5: Face, f6: Face)                
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    47
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
// pretty printing
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    49
def pp_col(c: Colour) : String = c match {
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    50
    case White => "W"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
    case Yellow => "Y"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    52
    case Orange => "O"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    53
    case Red => "R"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    54
    case Green => "G"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    55
    case Blue => "B"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    56
}
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    57
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    58
def pp_face(f: Face) : String = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    59
  s"${pp_col(f.c11)} ${pp_col(f.c12)}\n${pp_col(f.c21)} ${pp_col(f.c22)}"
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    60
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    61
def pp_cube(c: Cube) : String = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    62
  s"${pp_face(c.f1)}\n${pp_face(c.f2)}\n${pp_face(c.f3)}\n${pp_face(c.f4)}\n${pp_face(c.f5)}\n${pp_face(c.f6)}"  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    63
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
    64
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    65
val init = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    66
    Cube(Face(White, Green, White, White), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    67
         Face(Blue, Yellow, Orange, Red), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    68
         Face(Red, Blue, Red, Blue),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    69
         Face(White, Yellow, Red, Orange),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    70
         Face(Yellow, Green, Blue, Green),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    71
         Face(Yellow, Green, Orange, Orange))  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    72
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    73
val solved = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    74
    Cube(Face(Yellow, Yellow, Yellow, Yellow), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    75
         Face(Orange, Orange, Orange, Orange), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    76
         Face(Red, Red, Red, Red),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    77
         Face(White, White, White, White),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    78
         Face(Blue, Blue, Blue, Blue),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    79
         Face(Green, Green, Green, Green))  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    80
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    81
//println(pp_cube(init))                
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    82
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    83
// actions
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    84
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    85
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    86
def up(c: Cube) : Cube =
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    87
    Cube(Face(c.f1.c11, c.f3.c12, c.f1.c21, c.f3.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    88
         Face(c.f2.c11, c.f1.c12, c.f2.c21, c.f1.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    89
         Face(c.f3.c11, c.f4.c12, c.f3.c21, c.f4.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    90
         Face(c.f4.c11, c.f2.c12, c.f4.c21, c.f2.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    91
         Face(c.f5.c11, c.f5.c12, c.f5.c21, c.f5.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    92
         Face(c.f6.c21, c.f6.c11, c.f6.c22, c.f6.c12))
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    93
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    94
def clock(c: Cube) : Cube =
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    95
    Cube(Face(c.f1.c21, c.f1.c11, c.f1.c22, c.f1.c12),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    96
         Face(c.f2.c11, c.f2.c12, c.f5.c22, c.f5.c12),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    97
         Face(c.f6.c21, c.f6.c11, c.f3.c21, c.f3.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    98
         Face(c.f4.c11, c.f4.c12, c.f4.c21, c.f4.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    99
         Face(c.f5.c11, c.f3.c11, c.f5.c21, c.f3.c12),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   100
         Face(c.f2.c21, c.f6.c12, c.f2.c22, c.f6.c22))
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   101
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   102
def right(c: Cube) : Cube =
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   103
    Cube(Face(c.f5.c11, c.f5.c12, c.f1.c21, c.f1.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   104
         Face(c.f2.c12, c.f2.c22, c.f2.c11, c.f2.c21),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   105
         Face(c.f3.c11, c.f3.c12, c.f3.c21, c.f3.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   106
         Face(c.f4.c11, c.f4.c12, c.f6.c12, c.f6.c11),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   107
         Face(c.f4.c22, c.f4.c21, c.f5.c21, c.f5.c22),
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   108
         Face(c.f1.c11, c.f1.c12, c.f6.c21, c.f6.c22))         
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   109
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   110
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   111
//println("\n" ++ pp_cube(up(init)))           
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   112
//println("\n" ++ pp_cube(clock(init)))   
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   113
//println("\n" ++ pp_cube(right(init))) 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   114
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   115
//println(List(init, up(init), clock(init), right(init)).map(solved))
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   116
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   117
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   118
// simple bf-search without solution
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   119
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   120
def actions(c: Cube) : List[Cube] = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   121
  List(up(c), clock(c), right(c)) 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   122
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   123
def search(cs: List[Cube], d: Int) : Boolean = { 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   124
  println(s"Depth: $d    Cands: ${cs.length}")  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   125
  //memory()
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   126
  if (cs.exists(solved == _)) true
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   127
  else search(cs.flatMap(actions), d + 1)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   128
}  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   129
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   130
//println("List Version")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   131
//println(search(List(init), 0))
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   132
//println(s"${time_needed(1, search(List(init), 0))} secs")  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   133
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   134
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   135
def actionsS(c: Cube) : Set[Cube] = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   136
  Set(up(c), clock(c), right(c)) 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   137
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   138
def searchS(cs: Set[Cube], d: Int) : Boolean = { 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   139
  println(s"Depth: $d    Cands: ${cs.size}")  
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   140
  memory()
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   141
  if (cs.exists(solved == _)) true
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   142
  else searchS(cs.flatMap(actionsS), d + 1)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   143
}  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   144
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   145
//println("Set Version")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   146
//println(searchS(Set(init), 0))
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   147
//println(s"${time_needed(1, searchS(Set(init), 0))} secs")  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   148
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   149
// bf-search generating a list of "actions""
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   150
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   151
abstract class Action
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   152
case object Up extends Action
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   153
case object Right extends Action
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   154
case object Clock extends Action
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   155
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   156
type Actions = List[Action]
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   157
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   158
def actions2(c: Cube, act: Actions) : List[(Cube, Actions)] = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   159
  List((up(c), Up::act), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   160
       (clock(c), Clock::act), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   161
       (right(c), Right::act)) 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   162
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   163
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   164
def search2(cs: List[(Cube, Actions)], d: Int) : (Cube, Actions) = { 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   165
  println(s"Depth: $d    Cands: ${cs.length}")  
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   166
  val res = cs.find(init == _._1)
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   167
  if (res.isDefined) res.get
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   168
  else search2(cs.flatMap((actions2 _).tupled), d + 1)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   169
}  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   170
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   171
//println("List Version with Actions")
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   172
//println(search2(List((solved, Nil)), 0)._2.mkString("\n"))  
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   173
//println(s"${time_needed(1, search2(List((init, Nil)), 0))} secs") 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   174
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   175
// using Maps for recording the moves
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   176
def actionsM(c: Cube, act: Actions) : Map[Cube, Actions] = 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   177
  Map(up(c) -> (Up::act), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   178
      clock(c) -> (Clock::act), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   179
      right(c) -> (Right::act)) 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   180
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   181
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   182
def searchM(cs: Map[Cube, Actions], d: Int) : Actions = { 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   183
  println(s"Depth: $d    Cands: ${cs.keySet.size}")  
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   184
  val res = cs.keySet.find(init == _)
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   185
  if (res.isDefined) cs(res.get)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   186
  else searchM(cs.flatMap((actionsM _).tupled), d + 1)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   187
}  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   188
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   189
println("Map Version with actions")
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   190
println(searchM(Map(solved -> Nil), 0).mkString("\n"))  
394
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   191
println(s"${time_needed(1, searchM(Map(init -> Nil), 0))} secs")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   192
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   193
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   194
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   195
// bi-directional search
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   196
def bsearch(cs: Map[Cube, Actions], 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   197
            bs: Map[Cube, Actions], d: Int) : (Actions, Actions) = { 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   198
  println(s"Depth: $d    Cands: ${cs.keySet.size}/${bs.keySet.size}") 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   199
  val res = cs.keySet intersect bs.keySet
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   200
  if (!res.isEmpty) (cs(res.head), bs(res.head))
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   201
  else bsearch(cs.flatMap((actions2 _).tupled), 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   202
               bs.flatMap((actions2 _).tupled), d + 1)
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   203
} 
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   204
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   205
println("Bidirectional Version with actions")
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   206
println(bsearch(Map(init -> Nil), Map(solved -> Nil), 0))  
9c0b7d676c7d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   207
println(s"${time_needed(1, bsearch(Map(init -> Nil), Map(solved -> Nil), 0))}")
415
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   208
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   209
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   210
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   211
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   212
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   213
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   214
// more memory 
368556c8df56 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 394
diff changeset
   215
// JAVA_OPTS="-Xmx2g"