Skip to content

Commit ffa59a8

Browse files
committed
docs: consolidate tags to 5-tag system and remove duplicate titles
- Replace 14 scattered tags with 5 meaningful tags: quickstart, concepts, reference, python, rust - Remove duplicate H1 titles that matched frontmatter title (22 files) - Mark quickstarts as draft except employee-scheduling - Add consistent tags across all documentation sections
1 parent 682a39e commit ffa59a8

File tree

79 files changed

+184
-88
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+184
-88
lines changed

assets/scss/_styles_project.scss

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,16 @@ pre {
123123
background-color: #022c22 !important; // Very dark emerald
124124
border-radius: 6px;
125125
padding: 1rem;
126-
margin: 1rem auto;
127-
max-width: fit-content;
126+
margin: 1rem 0;
127+
white-space: pre-wrap;
128+
word-wrap: break-word;
128129

129130
code {
130131
font-size: 0.8rem;
131132
color: #6ee7b7; // Mint green text
132133
background-color: transparent !important;
134+
white-space: pre-wrap;
135+
word-wrap: break-word;
133136
}
134137
}
135138

@@ -301,3 +304,4 @@ code {
301304
}
302305
}
303306

307+

content/en/blog/technical/python-constraint-solver-architecture.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
title: "Dataclasses vs Pydantic in Constraint Solvers"
33
date: 2025-12-06
4+
tags: [concepts, python]
45
description: >
56
Architectural guidance for Python constraint solvers: when to use dataclasses vs Pydantic for optimal performance.
67
---

content/en/docs/getting-started/_index.md

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
title: Getting Started
33
linkTitle: "Getting Started"
44
description: Quickstart Guides — repository layout, prerequisites, and how to run examples locally.
5-
categories: [Examples, Quickstarts]
6-
tags: [solverforge, quickstarts, python, docs]
5+
categories: [Quickstarts]
6+
tags: [quickstart, python]
77
weight: 2
88
---
99

@@ -19,6 +19,42 @@ We're working hard to deliver proper bindings. Stay tuned!
1919

2020
The quickstart guides below demonstrate constraint-solver patterns using the legacy Python implementation. They serve as reference material for understanding SolverForge concepts while the new bindings are being developed.
2121

22+
## Choose a Quickstart
23+
24+
{{< cardpane >}}
25+
{{< card header="**Employee Scheduling**" >}}
26+
Assign staff to shifts based on skills and availability.
27+
Perfect for learning core optimization concepts.
28+
29+
[Start Tutorial →](employee-scheduling/)
30+
{{< /card >}}
31+
{{< card header="**Meeting Scheduling**" >}}
32+
Find optimal times and rooms for meetings while avoiding conflicts.
33+
34+
[Start Tutorial →](meeting-scheduling/)
35+
{{< /card >}}
36+
{{< card header="**Vehicle Routing**" >}}
37+
Plan delivery routes that minimize travel time with capacity constraints.
38+
39+
[Start Tutorial →](vehicle-routing/)
40+
{{< /card >}}
41+
{{< /cardpane >}}
42+
43+
{{< cardpane >}}
44+
{{< card header="**School Timetabling**" >}}
45+
Schedule lessons to rooms and timeslots without teacher or room conflicts.
46+
47+
[Start Tutorial →](school-timetabling/)
48+
{{< /card >}}
49+
{{< card header="**Rust Quickstart**" footer="Experimental" >}}
50+
Build a solver using the core Rust library directly. For advanced users interested in the internals.
51+
52+
[Start Tutorial →](rust-quickstart/)
53+
{{< /card >}}
54+
{{< /cardpane >}}
55+
56+
---
57+
2258
This page covers:
2359
- Repository layout and quickstart variants
2460
- Prerequisites and installation notes

content/en/docs/getting-started/employee-scheduling.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ title: "Employee Scheduling"
33
linkTitle: "Employee Scheduling"
44
icon: fa-brands fa-python
55
date: 2025-11-21
6+
weight: 10
67
description: "A comprehensive quickstart guide to understanding and building intelligent employee scheduling with SolverForge"
7-
categories: [Examples]
8-
tags: [scheduling, optimization, tutorial]
8+
categories: [Quickstarts]
9+
tags: [quickstart, python]
910
---
1011

1112
{{% pageinfo %}}

content/en/docs/getting-started/meeting-scheduling.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ title: "Meeting Scheduling"
33
linkTitle: "Meeting Scheduling"
44
icon: fa-brands fa-python
55
date: 2025-11-26
6+
weight: 20
7+
draft: true
68
description: "A comprehensive quickstart guide to understanding and building intelligent meeting scheduling with SolverForge"
7-
categories: [Examples]
8-
tags: [scheduling, optimization, meetings, calendar, tutorial]
9+
categories: [Quickstarts]
10+
tags: [quickstart, python]
911
---
1012

1113
{{% pageinfo %}}
@@ -45,7 +47,9 @@ This guide walks you through a complete meeting scheduling application built wit
4547

4648
**No optimization background required** — we'll explain concepts as we encounter them in the code.
4749

48-
> **Architecture Note:** This implementation uses dataclass domain models for optimal solver performance. See [benchmark results](/blog/news/python-constraint-solver-architecture/#results-meeting-scheduling) showing this approach completes 60/60 optimization iterations while Pydantic-based alternatives complete only 46-58. Note: benchmarks were run on small test problems; JPype bridge overhead may increase at larger scales.
50+
{{% alert title="Architecture Note" %}}
51+
This implementation uses dataclass domain models for optimal solver performance. See [benchmark results](/blog/technical/python-constraint-solver-architecture/#results-meeting-scheduling) showing this approach completes 60/60 optimization iterations while Pydantic-based alternatives complete only 46-58. Note: benchmarks were run on small test problems; JPype bridge overhead may increase at larger scales.
52+
{{% /alert %}}
4953

5054
### Prerequisites
5155

@@ -317,7 +321,7 @@ class MeetingAssignment:
317321

318322
**Optimization concept:** Unlike employee scheduling (one variable: which employee) or vehicle routing (one list variable: which visits), this problem has **two independent planning variables** per entity. The solver must simultaneously decide both time and room.
319323

320-
**Why multiple planning variables matter:** Having two planning variables (time and room) per entity creates a larger search space but more flexibility. The dataclass-based domain model enables efficient evaluation of variable combinations. For architectural details on why dataclasses outperform Pydantic in constraint evaluation, see [Dataclasses vs Pydantic in Constraint Solvers](/blog/news/python-constraint-solver-architecture/).
324+
**Why multiple planning variables matter:** Having two planning variables (time and room) per entity creates a larger search space but more flexibility. The dataclass-based domain model enables efficient evaluation of variable combinations. For architectural details on why dataclasses outperform Pydantic in constraint evaluation, see [Dataclasses vs Pydantic in Constraint Solvers](/blog/technical/python-constraint-solver-architecture/).
321325

322326
**Important methods:**
323327

content/en/docs/getting-started/rust-quickstart.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ title: "Rust Quickstart"
33
linkTitle: "Rust Quickstart"
44
icon: fa-brands fa-rust
55
date: 2025-12-08
6-
weight: 1
6+
weight: 100
7+
draft: true
78
description: "Build your first constraint solver with the SolverForge Rust core library"
8-
categories: [Examples]
9-
tags: [rust, optimization, tutorial, experimental]
9+
categories: [Quickstarts]
10+
tags: [quickstart, rust]
1011
---
1112

1213
{{% pageinfo color="warning" %}}

content/en/docs/getting-started/school-timetabling.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ title: "School Timetabling"
33
linkTitle: "School Timetabling"
44
icon: fa-brands fa-python
55
date: 2025-11-26
6+
weight: 40
7+
draft: true
68
description: "A comprehensive quickstart guide to understanding and building intelligent school timetabling with SolverForge"
7-
categories: [Examples]
8-
tags: [scheduling, optimization, timetabling, tutorial]
9+
categories: [Quickstarts]
10+
tags: [quickstart, python]
911
---
1012

1113
{{% pageinfo %}}

content/en/docs/getting-started/vehicle-routing.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ title: "Vehicle Routing"
33
linkTitle: "Vehicle Routing"
44
icon: fa-brands fa-python
55
date: 2025-11-26
6+
weight: 30
7+
draft: true
68
description: "A comprehensive quickstart guide to understanding and building intelligent vehicle routing with SolverForge"
7-
categories: [Examples]
8-
tags: [routing, optimization, logistics, tutorial]
9+
categories: [Quickstarts]
10+
tags: [quickstart, python]
911
---
1012

1113
{{% pageinfo %}}
@@ -45,7 +47,9 @@ This guide walks you through a complete vehicle routing application built with *
4547

4648
**No optimization background required** — we'll explain concepts as we encounter them in the code.
4749

48-
> **Performance Note:** Vehicle routing is particularly sensitive to constraint evaluation performance, as the solver must recalculate distances and arrival times millions of times during optimization. This implementation uses the "fast" dataclass architecture—see [benchmark results](/blog/news/python-constraint-solver-architecture/#results-vehicle-routing). Note: benchmarks were run on small test problems (25-77 customers); JPype bridge overhead may compound at larger scales.
50+
{{% alert title="Performance Note" %}}
51+
Vehicle routing is particularly sensitive to constraint evaluation performance, as the solver must recalculate distances and arrival times millions of times during optimization. This implementation uses the "fast" dataclass architecture—see [benchmark results](/blog/technical/python-constraint-solver-architecture/#results-vehicle-routing). Note: benchmarks were run on small test problems (25-77 customers); JPype bridge overhead may compound at larger scales.
52+
{{% /alert %}}
4953

5054
### Prerequisites
5155

@@ -373,7 +377,7 @@ Routes are built using **shadow variable chaining**:
373377

374378
**Optimization concept:** This is **incremental score calculation**. When the solver moves one visit, only affected arrival times recalculate — not the entire solution. This enables evaluating millions of route modifications per second.
375379

376-
**Why this matters for performance:** Shadow variables enable efficient incremental updates. With Pydantic models, validation overhead would occur on every update—compounding across millions of moves per second. The dataclass approach avoids this overhead entirely. See [benchmark analysis](/blog/news/python-constraint-solver-architecture/#object-equality-in-hot-paths) for details on this architectural choice.
380+
**Why this matters for performance:** Shadow variables enable efficient incremental updates. With Pydantic models, validation overhead would occur on every update—compounding across millions of moves per second. The dataclass approach avoids this overhead entirely. See [benchmark analysis](/blog/technical/python-constraint-solver-architecture/#object-equality-in-hot-paths) for details on this architectural choice.
377381

378382
### The Search Process
379383

content/en/docs/overview.md

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
title: Overview
33
description: What SolverForge is, how it differs from mathematical solvers, and the project roadmap.
44
weight: 1
5+
tags: [concepts]
56
---
67

78
# What is SolverForge?
@@ -10,16 +11,31 @@ SolverForge is a **constraint satisfaction solver** for real-world planning and
1011

1112
## What Problems Does It Solve?
1213

13-
SolverForge excels at **combinatorial planning problems** where you need to:
14-
15-
- **Employee Scheduling** — Assign staff to shifts based on skills, availability, and labor regulations
16-
- **Vehicle Routing** — Plan delivery routes that minimize travel time while meeting time windows
17-
- **School Timetabling** — Schedule lessons to rooms and timeslots without conflicts
18-
- **Task Assignment** — Allocate jobs to workers or machines optimally
19-
- **Meeting Scheduling** — Find times and rooms that work for all attendees
20-
- **Bin Packing** — Fit items into containers efficiently
21-
22-
These are problems where a brute-force search is impossible (millions to billions of possibilities), but a good solution dramatically improves efficiency.
14+
SolverForge excels at **combinatorial planning problems** — problems where a brute-force search is impossible (millions to billions of possibilities), but a good solution dramatically improves efficiency.
15+
16+
{{< cardpane >}}
17+
{{< card header="**Employee Scheduling**" >}}
18+
Assign staff to shifts based on skills, availability, and labor regulations.
19+
{{< /card >}}
20+
{{< card header="**Vehicle Routing**" >}}
21+
Plan delivery routes that minimize travel time while meeting time windows.
22+
{{< /card >}}
23+
{{< card header="**School Timetabling**" >}}
24+
Schedule lessons to rooms and timeslots without conflicts.
25+
{{< /card >}}
26+
{{< /cardpane >}}
27+
28+
{{< cardpane >}}
29+
{{< card header="**Task Assignment**" >}}
30+
Allocate jobs to workers or machines optimally.
31+
{{< /card >}}
32+
{{< card header="**Meeting Scheduling**" >}}
33+
Find times and rooms that work for all attendees.
34+
{{< /card >}}
35+
{{< card header="**Bin Packing**" >}}
36+
Fit items into containers efficiently.
37+
{{< /card >}}
38+
{{< /cardpane >}}
2339

2440
## How Is This Different from Gurobi or CVXPY?
2541

@@ -35,15 +51,8 @@ This is a common question. **SolverForge and mathematical programming solvers (G
3551

3652
### A Concrete Example
3753

38-
**Mathematical programming (Gurobi/CVXPY):**
39-
```python
40-
# You must translate your problem into mathematical form
41-
x = model.addVars(employees, shifts, vtype=GRB.BINARY)
42-
model.addConstrs(sum(x[e,s] for e in employees) == 1 for s in shifts)
43-
model.addConstrs(sum(x[e,s] for s in shifts) <= max_shifts for e in employees)
44-
```
45-
46-
**Constraint satisfaction (SolverForge):**
54+
{{< tabpane text=true >}}
55+
{{% tab header="SolverForge" %}}
4756
```python
4857
# You describe rules about your business objects directly
4958
@constraint_provider
@@ -57,6 +66,16 @@ def define_constraints(factory):
5766
.penalize("Missing skill", HardSoftScore.ONE_HARD),
5867
]
5968
```
69+
{{% /tab %}}
70+
{{% tab header="Gurobi/CVXPY" %}}
71+
```python
72+
# You must translate your problem into mathematical form
73+
x = model.addVars(employees, shifts, vtype=GRB.BINARY)
74+
model.addConstrs(sum(x[e,s] for e in employees) == 1 for s in shifts)
75+
model.addConstrs(sum(x[e,s] for s in shifts) <= max_shifts for e in employees)
76+
```
77+
{{% /tab %}}
78+
{{< /tabpane >}}
6079

6180
**The key difference:** With SolverForge, you work with domain objects (`Shift`, `Employee`) and express constraints as natural business rules. You don't need to reformulate your problem as a system of linear equations.
6281

@@ -115,7 +134,7 @@ SolverForge is under active development. The Python API shown above works today
115134
| **solverforge-core** | ✅ Complete | High-performance Rust backend — foundation complete, not yet user-facing |
116135
| **Python bindings** | 🚧 In progress | PyO3-based bindings to the fast Rust core — coming Q1-Q2 2026 |
117136

118-
**Want to try it today?** Start with the [Python quickstarts](/docs/getting-started/hello-world/) using `solverforge-legacy`.
137+
**Want to try it today?** Start with the [Python quickstarts](/docs/getting-started/) using `solverforge-legacy`.
119138

120139
## Roadmap
121140

@@ -143,7 +162,7 @@ Making the fast Rust core available to Python developers:
143162

144163
## How You Can Help
145164

146-
- **Try the quickstarts**[Build your first solver](/docs/getting-started/hello-world/) and share feedback
165+
- **Try the quickstarts**[Try a quickstart](/docs/getting-started/) and share feedback
147166
- **Report issues** — Found a bug or have a suggestion? [Open an issue](https://github.com/solverforge/solverforge/issues)
148167
- **Contribute** — We're actively developing Python bindings. PRs welcome!
149168
- **Spread the word** — Star the [GitHub repo](https://github.com/solverforge/solverforge) and share with colleagues

content/en/docs/solverforge-legacy/_index.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ title: "SolverForge (Legacy)"
33
linkTitle: "Python Solver"
44
icon: fa-brands fa-python
55
weight: 100
6+
tags: [python]
67
description: >
78
Technical documentation for SolverForge Legacy — the pure Python constraint solver using the Timefold backend.
89
---
@@ -64,5 +65,5 @@ class Timetable:
6465

6566
## Next Steps
6667

67-
- Follow the [Hello World Quickstarts](/docs/getting-started/hello-world/) to solve your first planning problem
68+
- Follow the [Getting Started guides](/docs/getting-started/) to solve your first planning problem
6869
- Learn about [Planning AI concepts](concepts/what-is-planning.md)

0 commit comments

Comments
 (0)