Erste öffentliche Fassung: Math Model Generator & Solver

Übersetzt natürlichsprachige Optimierungsaufgaben (Deutsch) per LLM in
eine geprüfte Modellspezifikation, erzeugt Solver-Code und führt ihn in
einer bubblewrap-Sandbox aus. Deterministische Prüfungen ohne LLM,
Report als Markdown/HTML, Benchmark mit 19 verifizierten Fällen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-17 11:42:58 +02:00
commit b74445b8d6

49
test_data_profile.py Normal file
View file

@ -0,0 +1,49 @@
"""Profil beigelegter Datendateien – deterministisch, ohne LLM."""
import pytest
from data_profile import profile_file, profile_files, to_prompt
@pytest.fixture
def kurse(tmp_path):
datei = tmp_path / "kurse.csv"
datei.write_text("Aktie;Rendite;Risiko;Gebuehr\nA01;6,9;2,04;0,68\nA02;14,4;1,63;0,74\nA03;11,5;;0,39\n",
encoding="utf-8")
return datei
def test_german_numbers_are_recognised(kurse):
# deutsche Daten sind der Normalfall: "6,9" ist eine Zahl, keine Zeichenkette
profil = profile_file(kurse)
assert profil.rows == 3 and len(profil.columns) == 4
rendite = next(s for s in profil.columns if s.name == "Rendite")
assert rendite.dtype == "Zahl"
assert rendite.minimum == pytest.approx(6.9) and rendite.maximum == pytest.approx(14.4)
def test_text_columns_and_gaps(kurse):
profil = profile_file(kurse)
assert next(s for s in profil.columns if s.name == "Aktie").dtype == "Text"
assert next(s for s in profil.columns if s.name == "Risiko").missing == 1
def test_separator_is_detected(tmp_path):
komma = tmp_path / "en.csv"
komma.write_text("name,value\nfoo,1.5\nbar,2.5\n")
profil = profile_file(komma)
assert [s.name for s in profil.columns] == ["name", "value"]
assert next(s for s in profil.columns if s.name == "value").mean == pytest.approx(2.0)
def test_unreadable_file_is_reported_not_raised(tmp_path):
profil = profile_file(tmp_path / "gibtsnicht.csv")
assert profil.error and "FileNotFoundError" in profil.error
assert profil.rows == 0
def test_prompt_names_columns_and_ranges(kurse):
text = to_prompt(profile_files([kurse]))
assert "kurse.csv: 3 Zeilen, 4 Spalten" in text
assert "Rendite (Zahl, von 6.9 bis 14.4" in text
assert "1 fehlend" in text
assert to_prompt([]) == ""