Skip to content

Commit d4aae80

Browse files
committed
DynamicSolver still does not work fully, but at least somehow
1 parent b72fd67 commit d4aae80

File tree

4 files changed

+40
-13
lines changed

4 files changed

+40
-13
lines changed

python/graphs.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@ def guess(self, rooms, starting_room, connections):
7676
for vert_idx, label in enumerate(rooms):
7777
if self.labels[vert_idx] != label:
7878
errors.append(f"Label of room #{vert_idx} label != actual label {self.labels[vert_idx]}")
79-
if errors:
80-
return errors
8179
if starting_room != 0:
8280
errors.append(f"Starting room index {starting_room} is not equal to actual 0")
8381
return errors

src/main/scala/ru/org/codingteam/icfpc_2025/Domain.scala

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,20 @@ case class SolutionDefinition(
4141
case class ConnectionDefinition(from: Door, to: Door) derives ReadWriter
4242
case class Door(room: Int, door: Int) derives ReadWriter
4343

44-
case class KnowledgeHolder(visitedRoutes: Vector[Vector[Int]], visitedRooms: Vector[Vector[Int]]) derives ReadWriter {
44+
case class KnowledgeHolder(
45+
problemSize: Int,
46+
visitedRoutes: Vector[Vector[Int]],
47+
visitedRooms: Vector[Vector[Int]],
48+
lastExploreRequest: Vector[Vector[Int]],
49+
lastExploreResult : Vector[Vector[Int]]
50+
) derives ReadWriter {
4551
def incorporateKnowledge(plans: Seq[Seq[Int]], results: Seq[Seq[Int]]): KnowledgeHolder =
4652
KnowledgeHolder(
53+
this.problemSize,
4754
this.visitedRoutes ++ plans.map(_.toVector),
48-
this.visitedRooms ++ visitedRooms.map(_.toVector)
55+
this.visitedRooms ++ results.map(_.toVector),
56+
plans.map(_.toVector).toVector,
57+
results.map(_.toVector).toVector
4958
)
5059
}
5160

src/main/scala/ru/org/codingteam/icfpc_2025/DynamicSolver.scala

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ object DynamicSolver {
3535
val existingCandidateDoors = g.findFreeDoors(existingCandidateRooms(targetRoomOffset).uid)
3636
if (existingCandidateDoors.length > targetDoorOffset) {
3737
val nextDoor = existingCandidateDoors(targetDoorOffset)
38+
println(s"Connect room #${input.roomFromUid} door ${input.doorIdx} to room ${nextDoor.roomUid}, door ${nextDoor.idx}")
3839
StepApplied(
3940
g.connectRooms(input.roomFromUid, input.doorIdx, nextDoor.roomUid, nextDoor.idx),
4041
nextDoor
@@ -48,6 +49,7 @@ object DynamicSolver {
4849
if (freeRooms.length > freeRoomOffset) {
4950
val freeRoom = freeRooms(freeRoomOffset)
5051
val labeledGraph = g.setRoomLabel(freeRoom.uid, Some(input.roomToLabel))
52+
println(s"Connect room #${input.roomFromUid} door ${input.doorIdx} to room ${freeRoom.uid}, door ${0}")
5153
StepApplied(
5254
labeledGraph.connectRooms(input.roomFromUid, input.doorIdx, freeRoom.uid, 0),
5355
DoorVertex(freeRoom.uid, 0)
@@ -58,6 +60,7 @@ object DynamicSolver {
5860
}
5961
}
6062
case Some(linkedRoom) => {
63+
println(s"Room #${input.roomFromUid} door ${input.doorIdx} was already connected to room #${linkedRoom.uid} (label ${linkedRoom.label})")
6164
if (linkedRoom.label == Some(input.roomToLabel)) {
6265
val nextDoor = g.adjacentDoor(g.doors(input.roomFromUid)(input.doorIdx)).get
6366
StepApplied(g, nextDoor)
@@ -70,24 +73,32 @@ object DynamicSolver {
7073

7174
def processStepEnumerating(graph : MyGraph, inputs : Seq[LabelInput], currentRoomUid : Int = 0, roomOffset : Int = 0, doorOffset : Int = 0) : SolverStepResult =
7275
if (inputs.length == 0) {
76+
println("no inputs left")
7377
StepApplied(graph, DoorVertex(currentRoomUid, 0))
7478
} else {
7579
val stepInput = StepInput(currentRoomUid, inputs.head.doorIdx, inputs.head.roomToLabel)
7680
val stepResult = processStep(graph, stepInput, roomOffset, doorOffset)
7781
stepResult match {
7882
case StepApplied(newGraph, door) =>
7983
println(f"Step into; remaining length is ${inputs.tail.length}")
80-
return processStepEnumerating(newGraph, inputs.tail, currentRoomUid = door.roomUid)
84+
val subResult = processStepEnumerating(newGraph, inputs.tail, currentRoomUid = door.roomUid)
85+
println(s"Returning from recursive call: $subResult")
86+
subResult match {
87+
case StepApplied(_,_) => return subResult
88+
case _ =>
89+
println(s"Do rollback; remaining length is ${inputs.length}")
90+
return processStepEnumerating(graph, inputs, currentRoomUid, roomOffset = roomOffset, doorOffset = doorOffset+1)
91+
}
8192
case TargetDoorsExhausted() =>
8293
println("Doors exhausted")
83-
return processStepEnumerating(graph, inputs, roomOffset+1, 0)
94+
return processStepEnumerating(graph, inputs, 0, roomOffset+1, 0)
8495
case TargetRoomsExhausted() =>
8596
println("Rooms exhausted")
8697
return TargetRoomsExhausted()
8798
case Contradiction() =>
8899
println("Contradiction")
89-
return processStepEnumerating(graph, inputs, currentRoomUid, roomOffset = roomOffset, doorOffset = doorOffset+1)
90-
// return Rollback()
100+
//return processStepEnumerating(graph, inputs, currentRoomUid, roomOffset = roomOffset, doorOffset = doorOffset+1)
101+
return Rollback()
91102
case Rollback() =>
92103
println("Rollback")
93104
return processStepEnumerating(graph, inputs, currentRoomUid, roomOffset = roomOffset, doorOffset = doorOffset+1)

src/main/scala/ru/org/codingteam/icfpc_2025/Solver.scala

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ object Solver {
1111
Ædificium.select(problem.name)
1212
println(s"${problem.name} has been selected.")
1313

14-
var knowledge = KnowledgeHolder(Vector.empty, Vector.empty)
14+
var knowledge = KnowledgeHolder(problem.size, Vector.empty, Vector.empty, Vector.empty, Vector.empty)
1515
while (true) {
1616
println("Determining next step...")
1717
val step = nextStep(problem, knowledge)
@@ -84,10 +84,19 @@ object Solver {
8484
// 6) generate paths to them + finish these routes with random
8585
// 7) go to 1
8686

87-
if (knowledge.visitedRoutes.nonEmpty) return Step.StopGuessing()
88-
89-
val plan = Seq(Lanternarius.shuffle12(problem.maxRouteLength))
90-
Step.ExploreStep(plan)
87+
//if (knowledge.visitedRoutes.nonEmpty) return Step.StopGuessing()
88+
if (knowledge.visitedRoutes.nonEmpty)
89+
val res = DynamicSolver.processPlanAndRooms(
90+
MyGraph(knowledge.problemSize).setRoomLabel(0, Some(knowledge.lastExploreResult(0)(0))),
91+
0,
92+
knowledge.lastExploreRequest(0),
93+
knowledge.lastExploreResult(0)
94+
)
95+
val solution = res.get.toSolution
96+
Step.GuessStep(solution)
97+
else
98+
val plan = Seq(Lanternarius.shuffle12(problem.maxRouteLength))
99+
Step.ExploreStep(plan)
91100

92101
private def dump(problem: ProblemDefinition, knowledge: KnowledgeHolder, solution: SolutionDefinition): Path =
93102
val folder = Files.createTempDirectory(s"icfpc.${problem.name}")

0 commit comments

Comments
 (0)