Spaces:
Sleeping
title: SolverForge Lessons
emoji: 📚
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860
pinned: false
license: apache-2.0
short_description: SolverForge lesson scheduling example
SolverForge Lessons
solverforge-lessons is a SolverForge lesson-timetabling app with retained
jobs, cohort timetable views, and a browser schedule workspace.
It answers one concrete question:
"Given lessons, teachers, student groups, rooms, and weekly timeslots, which timeslot and room should each lesson receive?"
Acknowledgement
Thanks to @benabel (Prof. Benjamin Abel), whose referral is also credited in
the core SolverForge README.
Quick Start
make run-release
Then open http://localhost:7860.
To inspect the supported command surface:
make help
Documentation Map
README.mdQuick start, model concepts, validation, REST API, and solver policy.WIREFRAME.mdAs-built architecture and runtime/data flow across backend, runtime, and UI.AGENTS.mdCodex-facing maintenance, validation, and documentation rules.MakefileSupported local commands for development, validation, Docker, and Space work.DockerfileDocker Space image build using Rust 1.95 and the declared crates.io line.
Current Dependency Shape
- Package:
solverforge-lessons; version is declared inCargo.toml - Release binary:
solverforge-lessons - Rust:
1.95 - SolverForge runtime:
solverforge0.13.1 - Browser UI assets:
solverforge-ui0.6.5 - Scaffold metadata:
solverforge-cli2.0.4insolverforge.app.toml
The app serves registry-backed Rust dependencies, local static browser modules, and Axum API routes from one process.
Model Concepts
Timeslot,Teacher,Group, andRoomare problem facts: input data the solver reads but does not move.Lessonis the planning entity: each subject meeting needs a timeslot and a room.Lesson.timeslot_idxis a scalar planning variable: the timeslot index SolverForge changes.Lesson.room_idxis a scalar planning variable: the room index SolverForge changes.Planis the planning solution with the currentHardMediumSoftScore.
The app ships one deterministic LARGE dataset with 300 lessons, 12 student
groups, 40 weekly timeslots, and 10 typed rooms. It starts with every lesson
unassigned, so the initial score is 0hard/-600medium/0soft.
Constraints
Hard constraints:
- Teachers can teach only in available timeslots.
- Student groups can attend only in available timeslots.
- A room must be large enough for the assigned group.
- A teacher cannot teach overlapping lessons.
- A group cannot attend overlapping lessons.
- A room cannot host overlapping lessons.
Medium constraints:
- Every lesson should receive a timeslot.
- Every lesson should receive a room.
Soft constraints:
- Room kind should match the subject.
- Lessons should avoid late-day slots when possible.
- The same subject should not repeat twice in one day for a cohort.
REST API
GET /healthGET /infoGET /demo-dataGET /demo-data/{id}POST /jobsGET /jobs/{id}DELETE /jobs/{id}GET /jobs/{id}/statusGET /jobs/{id}/snapshotGET /jobs/{id}/analysisPOST /jobs/{id}/pausePOST /jobs/{id}/resumePOST /jobs/{id}/cancelGET /jobs/{id}/events
snapshot_revision={n} is optional for snapshots and analysis. SSE clients
receive a bootstrap event and then live retained-job events.
Solver Policy
solver.toml is embedded by Plan and is the runtime source of truth.
cheapest_insertionassigns timeslots and rooms during construction.construction_obligation = "assign_when_candidate_exists"makes construction fill variables when a legal candidate exists.value_candidate_limit = 40bounds construction candidate scanning.- Local search uses
late_acceptancewith an accepted-count forager. - Solving stops after 30 seconds.
The slow acceptance test expects solving to reach hard and medium feasibility from the fully unassigned public instance while soft penalties continue to represent timetable quality.
Validation
Standard validation:
make test
Full local validation:
make ci-local
Slow acceptance solve:
make test-slow
make test runs Rust tests, frontend syntax checks, and a Playwright browser
smoke. make ci-local adds formatting, clippy, release build, and Docker image
build. make pre-release runs ci-local plus the slow acceptance solve.
Hugging Face Space Deployment
This repo is Docker-Space ready. The Space reads the README front matter,
builds Dockerfile, and expects the app to bind PORT=7860.
Local Space-equivalent commands:
make space-build
make space-run
Read The Code In This Order
src/domain/mod.rsTheplanning_model!manifest and public domain exports.src/domain/plan.rsThePlansolution, fact collections, lesson entities, and normalized index fields.src/domain/lesson.rsThe planning entity and the two scalar planning variables.src/domain/{timeslot,teacher,group,room}.rsThe problem facts the constraints join against.src/constraints/mod.rsandsrc/constraints/*.rsThe score model, one timetable rule per file.src/data/data_seed/entrypoints.rsPublic demo-data IDs and generator dispatch.src/data/data_seed/large.rsThe published instance builder.src/solver/service.rsRetained-job orchestration overSolverManager<Plan>.src/api/routes.rs,src/api/dto.rs, andsrc/api/sse.rsHTTP routes, transport DTOs, and live-event streaming.static/app.jsandstatic/views.jsBrowser boot sequence, solver controls, and timetable rendering.
Project Shape
src/domain/Planning model, domain types, planning variables, and derived indexes.src/constraints/Incremental SolverForge scoring rules.src/data/Deterministic lesson timetable demo-data generator.src/solver/Retained-job facade and runtime event payload formatting.src/api/Axum routes, DTOs, and SSE endpoint.static/Browser workspace built on stocksolverforge-uiassets.tests/e2e/Playwright browser smoke for the served app.
