417
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
1 |
// 2 x 2 x 2 Rubik's Cube
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
2 |
//========================
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
3 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
4 |
// more memory for the JVM
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
5 |
//
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
6 |
// JAVA_OPTS="-Xmx2g" scala
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
7 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
8 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
9 |
// for measuring memory usage
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
10 |
val mb = 1024*1024
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
11 |
val runtime = Runtime.getRuntime
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
12 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
13 |
def memory() = {
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
14 |
println(s" ** Used Memory: ${(runtime.totalMemory - runtime.freeMemory) / mb}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
15 |
println(s" ** Free Memory: ${runtime.freeMemory / mb}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
16 |
println(s" ** Total Memory: ${runtime.totalMemory / mb}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
17 |
println(s" ** Max Memory: ${runtime.maxMemory / mb}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
18 |
}
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
19 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
20 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
21 |
abstract class Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
22 |
case object White extends Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
23 |
case object Yellow extends Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
24 |
case object Orange extends Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
25 |
case object Red extends Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
26 |
case object Green extends Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
27 |
case object Blue extends Colour
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
28 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
29 |
// Faces
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
30 |
// -------
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
31 |
// |c11 c12|
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
32 |
// |c21 c22|
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
33 |
// -------
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
34 |
case class Face(c11: Colour, c12: Colour,
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
35 |
c21: Colour, c22: Colour)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
36 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
37 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
38 |
// Cubes
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
39 |
// +--+
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
40 |
// |f2|
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
41 |
// +--+ +--+
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
42 |
// |f5 f1 f6|
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
43 |
// +--+ +--+
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
44 |
// |f3|
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
45 |
// |f4|
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
46 |
// +--+
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
47 |
case class Cube(f1: Face, f2: Face, f3: Face,
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
48 |
f4: Face, f5: Face, f6: Face)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
49 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
50 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
51 |
// starting cube
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
52 |
val init =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
53 |
Cube(Face(White, Green, White, White),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
54 |
Face(Blue, Yellow, Orange, Red),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
55 |
Face(Red, Blue, Red, Blue),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
56 |
Face(White, Yellow, Red, Orange),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
57 |
Face(Yellow, Green, Blue, Green),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
58 |
Face(Yellow, Green, Orange, Orange))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
59 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
60 |
// solved cube
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
61 |
val solved =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
62 |
Cube(Face(Yellow, Yellow, Yellow, Yellow),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
63 |
Face(Orange, Orange, Orange, Orange),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
64 |
Face(Red, Red, Red, Red),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
65 |
Face(White, White, White, White),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
66 |
Face(Blue, Blue, Blue, Blue),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
67 |
Face(Green, Green, Green, Green))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
68 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
69 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
70 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
71 |
// actions
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
72 |
def up(c: Cube) : Cube =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
73 |
Cube(Face(c.f1.c11, c.f3.c12, c.f1.c21, c.f3.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
74 |
Face(c.f2.c11, c.f1.c12, c.f2.c21, c.f1.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
75 |
Face(c.f3.c11, c.f4.c12, c.f3.c21, c.f4.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
76 |
Face(c.f4.c11, c.f2.c12, c.f4.c21, c.f2.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
77 |
Face(c.f5.c11, c.f5.c12, c.f5.c21, c.f5.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
78 |
Face(c.f6.c21, c.f6.c11, c.f6.c22, c.f6.c12))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
79 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
80 |
def clock(c: Cube) : Cube =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
81 |
Cube(Face(c.f1.c21, c.f1.c11, c.f1.c22, c.f1.c12),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
82 |
Face(c.f2.c11, c.f2.c12, c.f5.c22, c.f5.c12),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
83 |
Face(c.f6.c21, c.f6.c11, c.f3.c21, c.f3.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
84 |
Face(c.f4.c11, c.f4.c12, c.f4.c21, c.f4.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
85 |
Face(c.f5.c11, c.f3.c11, c.f5.c21, c.f3.c12),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
86 |
Face(c.f2.c21, c.f6.c12, c.f2.c22, c.f6.c22))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
87 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
88 |
def right(c: Cube) : Cube =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
89 |
Cube(Face(c.f5.c11, c.f5.c12, c.f1.c21, c.f1.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
90 |
Face(c.f2.c12, c.f2.c22, c.f2.c11, c.f2.c21),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
91 |
Face(c.f3.c11, c.f3.c12, c.f3.c21, c.f3.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
92 |
Face(c.f4.c11, c.f4.c12, c.f6.c12, c.f6.c11),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
93 |
Face(c.f4.c22, c.f4.c21, c.f5.c21, c.f5.c22),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
94 |
Face(c.f1.c11, c.f1.c12, c.f6.c21, c.f6.c22))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
95 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
96 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
97 |
// simple bf-search without solution, just true
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
98 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
99 |
def actions(c: Cube) : List[Cube] =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
100 |
List(up(c), clock(c), right(c))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
101 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
102 |
def search(cs: List[Cube], d: Int) : Boolean = {
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
103 |
println(s"Depth: $d Cands: ${cs.length}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
104 |
//memory()
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
105 |
if (cs.exists(solved == _)) true
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
106 |
else search(cs.flatMap(actions), d + 1)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
107 |
}
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
108 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
109 |
search(List(init), 0)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
110 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
111 |
// Set version
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
112 |
def actions_set(c: Cube) : Set[Cube] =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
113 |
Set(up(c), clock(c), right(c))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
114 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
115 |
def search_set(cs: Set[Cube], d: Int) : Boolean = {
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
116 |
println(s"Depth: $d candidates: ${cs.size}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
117 |
//memory()
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
118 |
if (cs.contains(solved)) true
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
119 |
else search_set(cs.flatMap(actions_set), d + 1)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
120 |
}
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
121 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
122 |
search_set(Set(init), 0)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
123 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
124 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
125 |
// For generating list of actions
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
126 |
abstract class Action
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
127 |
case object Up extends Action
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
128 |
case object Right extends Action
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
129 |
case object Clock extends Action
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
130 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
131 |
type Actions = List[Action]
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
132 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
133 |
// List version generating a list of actions
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
134 |
def actions_list(c: Cube, act: Actions) : List[(Cube, Actions)] =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
135 |
List((up(c), Up::act),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
136 |
(clock(c), Clock::act),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
137 |
(right(c), Right::act))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
138 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
139 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
140 |
def search_list(cs: List[(Cube, Actions)], d: Int) : (Cube, Actions) = {
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
141 |
println(s"Depth: $d Cands: ${cs.length}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
142 |
val res = cs.find(_._1 == solved)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
143 |
if (res.isDefined) res.get
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
144 |
else search_list(cs.flatMap{case (c, as) => actions_list(c, as) }, d + 1)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
145 |
}
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
146 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
147 |
search_list(List((init, Nil)), 0)._2.reverse.mkString("\n")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
148 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
149 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
150 |
// Map version generating a list of actions
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
151 |
def actions_map(c: Cube, as: Actions) : Map[Cube, Actions] =
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
152 |
Map(up(c) -> (Up::as),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
153 |
clock(c) -> (Clock::as),
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
154 |
right(c) -> (Right::as))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
155 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
156 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
157 |
def search_map(cs: Map[Cube, Actions], d: Int) : Actions = {
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
158 |
println(s"Depth: $d Cands: ${cs.keySet.size}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
159 |
val res = cs.keySet.find(_ == solved)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
160 |
if (res.isDefined) cs(res.get)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
161 |
else search_map(cs.flatMap{case (c, as) => actions_list(c, as) }, d + 1)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
162 |
}
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
163 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
164 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
165 |
search_map(Map(init -> Nil), 0).reverse.mkString("\n")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
166 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
167 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
168 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
169 |
// Bidirectional breadth-first search
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
170 |
def bsearch(cs: Map[Cube, Actions],
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
171 |
bs: Map[Cube, Actions], d: Int) : Actions = {
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
172 |
println(s"Depth: $d Cands: ${cs.keySet.size}/${bs.keySet.size}")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
173 |
val res = cs.keySet intersect bs.keySet
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
174 |
if (!res.isEmpty) (cs(res.head).reverse ::: bs(res.head))
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
175 |
else bsearch(cs.flatMap{case (c, as) => actions_map(c, as) },
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
176 |
bs.flatMap{case (c, as) => actions_map(c, as) }, d + 1)
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
177 |
}
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
178 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
179 |
bsearch(Map(init -> Nil), Map(solved -> Nil), 0).mkString("\n")
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
180 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
181 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
182 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
183 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
184 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
185 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
186 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
187 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
188 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
189 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
190 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
191 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
192 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
193 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
194 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
195 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
196 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
197 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
198 |
|
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
|
199 |
|