operations_research/pyproject.toml
dschlueter a4fc247116 Notebook-Tests: nbmake + Subprocess-Zellen + inkrementeller Test
Alle 25 Notebooks sind nun fehlerfrei testbar (25 passed). Dafür drei
Änderungen im Build und eine neue Test-Infrastruktur:

1. pyproject.toml: nbmake>=1.5 in der dev-Gruppe.

2. build_version_04.py: Notebooks bekommen zwei Setup-Zellen und
   Subprocess-Zellen für Programme, die nicht direkt im Kernel laufen:
   - NOTEBOOK_SETUP_2: __file__ definieren, sys.path für or_kern,
     multiprocessing auf fork (Spawn findet Kernel-Funktionen nicht).
   - _braucht_subprocess: erkennt highspy (Solver-Konflikt), pytest
     (SystemExit), get_context('spawn'), subprocess+__file__ (sucht
     .py-Dateien), sys.exit (SystemExit). Diese Programme erscheinen
     als Markdown-Codeblock (sichtbar, nicht ausführbar) plus einer
     Subprocess-Zelle mit NO_COLOR=1 (verhindert ANSI-Codes, die der
     Parser von Mutationstest.py nicht verarbeitet).
   - Solver-Konflikt-Erkennung: wenn ein Kapitel sowohl ortools als
     auch highspy importiert, laufen auch reine ortools-Programme als
     Subprocess (highspy schon im Kernel).

3. teste_code_04.py: inkrementeller Test — nur geänderte/neue Programme
   und Notebooks (via git status). Netzabhängige Dateien (yfinance)
   werden automatisch erkannt und nur getestet, wenn Internet verfügbar.

4. PLAN.md Abschnitt 10: neuer Verifikationsschritt 4 (pytest --nbmake).
   PROGRESS.md und CLAUDE.md aktualisiert.

Gefundene und behobene Probleme:
- or_kern-Import: sys.path im Notebook erweitert.
- __file__ nicht definiert: zweite Setup-Zelle setzt es.
- multiprocessing spawn: fork erzwungen (Ein_System_Vier_Ansaetze.py).
- ortools/highspy-Konflikt: Subprocess für beide Solver.
- pytest SystemExit: Subprocess für test_or_kern.py und Mutationstest.py.
- sys.exit(0): Subprocess für Installationstest.py.
- ANSI-Codes in pytest-Ausgabe: NO_COLOR=1 in Subprocess-Zelle.
2026-09-11 22:39:14 +02:00

117 lines
4.2 KiB
TOML

# Paketbeschreibung fuer die Beispielprogramme des Buchs
# "Optimierte Entscheidungsfindung mit Python".
#
# Zweck: schlanke, gezielt zusammengestellte Umgebungen. Wer nur die ersten
# Kapitel durcharbeitet, braucht weder yfinance noch FastAPI.
#
# pip install -e . # Grundausstattung, traegt den Grossteil des Buchs
# pip install -e ".[finance]" # Teil "Anwendungen": Markowitz, CVaR, Handelsmaschine
# pip install -e ".[large-scale]" # HiGHS, Pyomo, linopy, polars
# pip install -e ".[api]" # Kapitel "Testen, Messen, Ausliefern"
# pip install -e ".[figures]" # nur zum Neuerzeugen der Diagramme
# pip install -e ".[dev]" # Tests
# pip install -e ".[alles]" # alles zusammen - siehe Warnung unten
#
# ACHTUNG, Solverkonflikt: ortools und highspy bringen jeweils eine eigene
# HiGHS-Kopie mit und lassen sich nicht im selben Prozess importieren. ortools
# steht deshalb in der Grundausstattung, highspy erst in [large-scale] - wer nur
# "pip install -e ." nutzt, kann in den Konflikt gar nicht geraten. cvxpy zieht
# ein installiertes highspy bei der Solver-Erkennung selbst mit hinein, [finance]
# loest ihn also indirekt ebenfalls aus. Die Programme des Buchs umgehen das
# durch getrennte Prozesse (Muster: Ein_System_Vier_Ansaetze.py); ausfuehrlich
# steht es im Kapitel "Das Python-Oekosystem fuer OR".
#
# Die Datei ergaenzt
# Operations_Research_mit_Python_Version_04_Programme/requirements.txt und
# ersetzt sie nicht: Jene ist im Buch abgedruckt und installiert bewusst alles
# auf einen Schlag.
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "or-mit-python"
version = "4.0.0"
description = "Beispielprogramme zum Buch 'Optimierte Entscheidungsfindung mit Python'"
readme = "README.md"
requires-python = ">=3.10"
authors = [{ name = "Dieter Schlüter", email = "dieter.schlueter@linix.de" }]
keywords = ["operations-research", "optimierung", "linear-programming",
"constraint-programming", "milp", "lehrbuch"]
# Grundausstattung: traegt die Kapitel bis einschliesslich Graphen und Touren.
# scipy liefert linprog/milp, ortools den CP-SAT-Solver und pywraplp.
dependencies = [
"numpy>=2.5.2",
"scipy>=1.17.1",
"pandas>=3.0.1",
"matplotlib>=3.10.8",
"openpyxl>=3.1.5", # kein direkter Import: Excel-Motor hinter pandas
"pydantic>=2.12",
"ortools>=9.15.6755",
# cvxpy gehoert in die Grundausstattung, nicht in [finance]: Es wird von
# 13 Programmen gebraucht, darunter dreien im Kapitel Unsicherheit, lange
# vor dem Finanzteil. Es zieht KEIN highspy nach - der Solverkonflikt
# entsteht erst mit [large-scale].
"cvxpy>=1.9.2",
]
[project.optional-dependencies]
# Teil "Anwendungen - Energiewirtschaft und Finanzmaerkte"
finance = [
"scikit-learn>=1.8.0",
"yfinance>=1.2.0",
]
# Groessere Modelle, alternative Solver und Modellierungsschichten
large-scale = [
"highspy>=1.15.1",
"Pyomo>=6.7",
"linopy>=0.3",
"polars>=1.0",
]
# Kapitel "Testen, Messen, Ausliefern": der Optimierungsdienst
api = [
"fastapi>=0.115",
"uvicorn>=0.30",
"httpx>=0.27", # Selbsttest des Dienstes ueber den TestClient
]
# Nur zum Neuerzeugen der Diagramme in bilder_04/ - fuer das Lesen und
# Ausfuehren des Buchs nicht noetig. graphviz braucht zusaetzlich das
# Kommandozeilenwerkzeug 'dot' aus dem Betriebssystempaket.
figures = [
"plotly>=6.0",
"graphviz>=0.20",
"folium>=0.19", # die Leaflet-Karte der VRP-Touren
]
dev = [
"pytest>=8.0",
"nbmake>=1.5",
]
# Die 25 Kapitel-Notebooks im Browser ausfuehren - ohne dass jemand etwas
# installieren muss. Das Kurs-Image (Dockerfile) bringt diese Gruppe mit.
notebook = [
"jupyterlab>=4.0",
]
# pymoo wird im Buch als Bibliothek fuer genetische Algorithmen empfohlen
# (Kapitel Metaheuristiken), aber von keinem Beispielprogramm importiert.
# Deshalb steht es hier eigenstaendig und nicht in der Grundausstattung.
empfehlungen = [
"pymoo>=0.6",
]
alles = [
"or-mit-python[finance,large-scale,api,figures,dev,notebook,empfehlungen]",
]
[tool.setuptools]
# Die Beispielprogramme sind ein erzeugtes Artefakt (extract_programme_04.py)
# und kein installierbares Paket - hier wird nur der Abhaengigkeitsbaum
# beschrieben.
packages = []