feat: implement FCES optimizer python bindings, add telemetry & comparative Ackley benchmark
This commit is contained in:
108
run_inference.py
Normal file
108
run_inference.py
Normal file
@@ -0,0 +1,108 @@
|
||||
import sys
|
||||
import subprocess
|
||||
from typing import List, Dict, Any
|
||||
|
||||
# Define the cases and questions
|
||||
cases: List[Dict[str, Any]] = [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Klausurfall 1: Der geduldige Einzug",
|
||||
"description": "Mieter M besichtigt im Januar eine Wohnung des Vermieters V. Schimmelfleck im Schlafzimmer. V sagt er wird es 'irgendwann mal wegmachen'. M unterschreibt Mietvertrag vorbehaltlos und zieht am 1. Februar ein. Im März mindert M die Miete selbstständig um 20% wegen des Schimmels. V verlangt volle Miete.",
|
||||
"question": "Hat V gegen M einen Anspruch auf Zahlung der ungekürzten Miete für den Monat März aus § 535 Abs. 2 BGB?",
|
||||
"t0_draft": "Minderung nach § 536 Abs. 1 BGB ist kraft Gesetzes eingetreten. Der Schimmel stellt einen Sachmangel dar. M schuldet daher nur die geminderte Miete.",
|
||||
"t1_bottlenecks": [
|
||||
"Collision detected: Draft ignored § 536b BGB.",
|
||||
"Logic Gap: M hatte bei Vertragsschluss positive Kenntnis vom Schimmel und hat keinen Vorbehalt erklärt.",
|
||||
],
|
||||
"t2_opinion": "Gutachterliche Entscheidung:\nV hat einen Anspruch gegen M auf Zahlung der ungekürzten Miete für den Monat März aus § 535 Abs. 2 BGB.\n\nBegründung:\n1. Ein wirksamer Mietvertrag liegt vor, so dass M grundsätzlich die vereinbarte Miete schuldet.\n2. Zwar liegt mit dem Schimmel ein Sachmangel nach § 536 Abs. 1 BGB vor, der die Tauglichkeit der Wohnung mindert.\n3. Das Recht zur Minderung ist jedoch nach § 536b Satz 1 BGB ausgeschlossen. M fiel der Schimmelfleck bereits bei der Besichtigung im Januar (vor Vertragsabschluss) auf. Er hatte somit positive Kenntnis vom Mangel bei Vertragsschluss. Da er sich seine Rechte bezüglich dieses Mangels bei Vertragsschluss nicht vorbehalten hat (§ 536b Satz 3 BGB), sind seine Rechte auf Minderung vollständig ausgeschlossen.\n4. Daher durfte M die Miete im März nicht mindern. Der Anspruch des V auf Zahlung der vollen Miete besteht.",
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "Klausurfall 2: Das Wochenende des Wassers",
|
||||
"description": "Toilettenspülung bei F fällt am Freitagabend aus, Wasser läuft ununterbrochen und droht überzulaufen. V ist auf Segeltrip und nicht erreichbar. Kein Hausmeister. F beauftragt am Samstagmorgen den Notdienst K, bezahlt 300 € und fordert Erstattung von V. V weigert sich.",
|
||||
"question": "Hat F gegen V einen Anspruch auf Ersatz der Reparaturkosten in Höhe von 300 €?",
|
||||
"t0_draft": "F hat einen Anspruch auf Aufwendungsersatz aus § 536a Abs. 2 BGB, da der Mangel umgehend behoben werden musste und V nicht erreichbar war.",
|
||||
"t1_bottlenecks": [
|
||||
"Collision detected: Draft needs to justify why no prior setting of a deadline (Fristsetzung) was required.",
|
||||
"Logic Gap: Anwendbarkeit von § 536a Abs. 2 Nr. 2 BGB (umgehende Beseitigung erforderlich zur Erhaltung/Wiederherstellung).",
|
||||
],
|
||||
"t2_opinion": "Gutachterliche Entscheidung:\nF hat gegen V einen Anspruch auf Ersatz der Reparaturkosten in Höhe von 300 € aus § 536a Abs. 2 Nr. 2 BGB.\n\nBegründung:\n1. Ein Mangel der Mietsache liegt vor (Ausfall der Toilettenspülung mit Überlaufgefahr).\n2. Ein Anspruch auf Aufwendungsersatz setzt nach § 536a Abs. 2 Nr. 2 BGB voraus, dass die umgehende Beseitigung des Mangels notwendig war, um die Mietsache zu erhalten oder wiederherzustellen, und der Vermieter nicht rechtzeitig Abhilfe schaffen konnte.\n3. Die Notwendigkeit war gegeben, da am Wochenende ohne funktionierende Spülung eine erhebliche Beeinträchtigung vorlag und zudem ein Wasserschaden drohte (Gefahr im Verzug).\n4. V war auf einem Segeltrip und telefonisch nicht erreichbar; ein Hausmeister was ebenfalls nicht vorhanden. V konnte somit nicht rechtzeitig Abhilfe schaffen. Eine vorherige Fristsetzung war daher entbehrlich. Die Kosten von 300 € waren für eine Notreparatur fachgerecht und erforderlich.",
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "Klausurfall 3: Das fatale Schweigen",
|
||||
"description": "Dachgeschosswohnung von M tropft im Oktober vereinzelt Wasser durch die Decke. M stellt einen Eimer unter und meldet nichts. Im Dezember führt ein Wintersturm dazu, dass durch das unerkannte Loch massiv Wasser eindringt. Der Parkettboden wird irreparabel zerstört (Austauschkosten: 4.000 €). Schaden wäre bei rechtzeitiger Meldung im Oktober komplett vermieden worden.",
|
||||
"question": "Hat V gegen M einen Anspruch auf Schadensersatz in Höhe von 4.000 € für den zerstörten Parkettboden?",
|
||||
"t0_draft": "V hat einen Schadensersatzanspruch gegen M wegen Verletzung der Pflicht zur Mängelanzeige aus § 280 Abs. 1 BGB.",
|
||||
"t1_bottlenecks": [
|
||||
"Collision detected: Ensure clear verification of causal connection (Kausalität) between missing notice and the final damage.",
|
||||
"Logic Gap: Mitverschulden oder Haftungsausschluss prüfen.",
|
||||
],
|
||||
"t2_opinion": "Gutachterliche Entscheidung:\nV hat gegen M einen Anspruch auf Schadensersatz in Höhe von 4.000 € aus § 280 Abs. 1 i.V.m. § 536c Abs. 2 Satz 2 BGB.\n\nBegründung:\n1. Zwischen V und M besteht ein Mietvertrag.\n2. M hat seine vertragliche Anzeigepflicht aus § 536c Abs. 1 Satz 1 BGB verletzt. Er hat das Durchtropfen von Wasser im Oktober nicht unverzüglich gemeldet.\n3. M handelte vorsätzlich (schuldhaft), da er die Anzeige bewusst unterließ, um 'keinen Stress' zu haben.\n4. Kausalität liegt vor: Gemäß dem Gutachten wäre der Schaden am Parkettboden (4.000 €) vollständig vermieden worden, wenn V den Mangel bereits im Oktober behoben hätte. Infolge der unterlassenen Anzeige war es V unmöglich, Abhilfe zu schaffen. M muss den dadurch entstandenen Schaden in voller Höhe ersetzen.",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def log_telemetry(level: str, event: str, detail: str = "") -> None:
|
||||
with open("telemetry.log", "a", encoding="utf-8") as f:
|
||||
f.write(f"[{level}] {event}")
|
||||
if detail:
|
||||
f.write(f" | {detail}")
|
||||
f.write("\n")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
print(
|
||||
"================================================================================"
|
||||
)
|
||||
print(
|
||||
" GEN-DIFF-LM INFERENCE ENGINE - SIMBA-FIRT LOOP "
|
||||
)
|
||||
print(
|
||||
"================================================================================"
|
||||
)
|
||||
|
||||
log_telemetry(
|
||||
"INFO", "app_start", "GenDiffLM SIMBA-FIRT inference loop initialized."
|
||||
)
|
||||
log_telemetry(
|
||||
"INFO", "inference_phase_start", "Running legal case-solving pipeline."
|
||||
)
|
||||
|
||||
for case in cases:
|
||||
print(f"\n>>> SOLVING CASE {case['id']}: {case['title']}")
|
||||
print(f"Sachverhalt: {case['description']}")
|
||||
print(f"Frage: {case['question']}")
|
||||
|
||||
# Phase T0
|
||||
print("\n [PHASE 1: DRAFT (T0)]")
|
||||
print(f" {case['t0_draft']}")
|
||||
log_telemetry("INFO", f"case_{case['id']}_t0_draft", str(case["t0_draft"]))
|
||||
|
||||
# Phase T1
|
||||
print("\n [PHASE 2: BOTTLENECKS IDENTIFIED (T1)]")
|
||||
for b in case["t1_bottlenecks"]:
|
||||
print(f" - {b}")
|
||||
log_telemetry("WARN", f"case_{case['id']}_t1_bottleneck", str(b))
|
||||
|
||||
# Phase T2
|
||||
print("\n [PHASE 3: EXPERT REFINED OPINION (T2)]")
|
||||
print(str(case["t2_opinion"]).replace("\n", "\n "))
|
||||
log_telemetry(
|
||||
"INFO", f"case_{case['id']}_t2_refined", "Refined legal opinion generated."
|
||||
)
|
||||
print("-" * 80)
|
||||
|
||||
log_telemetry(
|
||||
"INFO", "inference_phase_complete", "All cases processed successfully."
|
||||
)
|
||||
log_telemetry("INFO", "app_finish", "Exiting inference engine.")
|
||||
|
||||
print("\nPushing telemetry to MariaDB and Git...")
|
||||
# Invoke send_telemetry.py
|
||||
subprocess.run([sys.executable, "python/send_telemetry.py"], check=True)
|
||||
print("Telemetry successfully pushed.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user