2021-10-24 12:28:10 +02:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
# IMPORTS
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
import functools;
|
|
|
|
|
2021-10-30 10:18:53 +02:00
|
|
|
from src.core.log import *;
|
2021-11-01 19:58:03 +01:00
|
|
|
from src.core.metrics import *;
|
2021-10-30 10:18:53 +02:00
|
|
|
from src.setup.display import *;
|
2021-10-24 12:28:10 +02:00
|
|
|
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
# CLASSES
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
class OneShot(object):
|
|
|
|
state: bool;
|
|
|
|
def __init__(self):
|
|
|
|
self.state = True;
|
|
|
|
|
2021-10-24 19:33:08 +02:00
|
|
|
def setState(self, state: bool):
|
|
|
|
self.state = state;
|
|
|
|
|
2021-10-24 12:28:10 +02:00
|
|
|
def reload(self):
|
|
|
|
self.state = True;
|
|
|
|
|
|
|
|
def trigger(self):
|
|
|
|
self.state = False;
|
|
|
|
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
# DECORATORS
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
## Trigger, der das fancy Zeug bei verschachtelten Algorithmen verhindert
|
|
|
|
nonnestedAlgorithms = OneShot();
|
|
|
|
|
|
|
|
def algorithmInfos(
|
|
|
|
name: str,
|
|
|
|
checks: bool = True,
|
|
|
|
metrics: bool = None,
|
2021-11-01 19:58:03 +01:00
|
|
|
outputnames: List[str] = ['result'],
|
2021-10-24 12:28:10 +02:00
|
|
|
preChecks: Any = None,
|
|
|
|
postChecks: Any = None
|
|
|
|
):
|
|
|
|
'''
|
2021-11-01 19:58:03 +01:00
|
|
|
Decorator für Algorithmen, der Folgendes macht:
|
2021-10-24 12:28:10 +02:00
|
|
|
|
|
|
|
- Zeigt vorm Start Console-Messages mit Namen des Algorithmus + Inputs.
|
|
|
|
- Zeit am Ende optional Metriken (bspw. Zeitkosten).
|
|
|
|
- Zeigt am Ende Console-Messages von Output/s.
|
|
|
|
- Prüft optional vor und nach Ausführung des Algorithmus, dass die Inputs/Outputs stimmen.
|
|
|
|
|
|
|
|
Bei rekursiven Definitionen werden die o. s. Punkte nur bei dem äußersten Aufruf gemacht.
|
|
|
|
'''
|
|
|
|
def func_decorator(func):
|
|
|
|
## Trigger, der das fancy Zeug bei verschachtelten Aufrufen verhindert
|
|
|
|
nonnestedRecursion = OneShot();
|
|
|
|
@functools.wraps(func)
|
|
|
|
def func_wrapper(**inputs):
|
|
|
|
try:
|
2021-10-24 19:33:08 +02:00
|
|
|
state1 = nonnestedAlgorithms.state;
|
|
|
|
state2 = nonnestedRecursion.state;
|
|
|
|
state = state1 and state2;
|
2021-10-24 12:28:10 +02:00
|
|
|
if state:
|
|
|
|
# Initialisierung
|
2021-10-26 14:14:35 +02:00
|
|
|
DisplayStartOfAlgorithm(name, **inputs);
|
2021-10-24 12:28:10 +02:00
|
|
|
# Prechecks
|
|
|
|
if checks and callable(preChecks):
|
|
|
|
preChecks(**inputs);
|
2021-11-02 13:05:34 +01:00
|
|
|
# Metriken initialisieren + starten
|
|
|
|
ResetMetrics();
|
|
|
|
StartMetrics();
|
|
|
|
# Ausführung des Algorithmus:
|
2021-10-24 12:28:10 +02:00
|
|
|
nonnestedRecursion.trigger();
|
|
|
|
nonnestedAlgorithms.trigger();
|
|
|
|
outputs = func(*[], **inputs);
|
2021-10-24 19:33:08 +02:00
|
|
|
nonnestedAlgorithms.state = state1;
|
|
|
|
nonnestedRecursion.state = state2;
|
2021-10-24 12:28:10 +02:00
|
|
|
if state:
|
2021-11-02 13:05:34 +01:00
|
|
|
# Metriken anhalten
|
|
|
|
StopMetrics();
|
2021-10-24 12:28:10 +02:00
|
|
|
# benenne Outputs:
|
|
|
|
outputs_ = outputs if isinstance(outputs, tuple) else tuple([outputs]);
|
2021-11-01 19:58:03 +01:00
|
|
|
outputsNamed = { outputnames[k]: value for k, value in enumerate(outputs_) };
|
2021-10-24 12:28:10 +02:00
|
|
|
# Letzte Messages
|
|
|
|
if metrics:
|
|
|
|
DisplayMetrics();
|
|
|
|
DisplayEndOfAlgorithm(**outputsNamed);
|
2021-10-25 11:27:07 +02:00
|
|
|
# Postchecks
|
|
|
|
if checks and callable(postChecks):
|
|
|
|
postChecks(**inputs, **outputsNamed);
|
2021-10-24 12:28:10 +02:00
|
|
|
except Exception as e:
|
2021-10-24 19:33:08 +02:00
|
|
|
nonnestedAlgorithms.state = state1;
|
|
|
|
nonnestedRecursion.state = state2;
|
2021-10-24 12:28:10 +02:00
|
|
|
raise e;
|
|
|
|
return outputs;
|
|
|
|
return func_wrapper;
|
|
|
|
return func_decorator;
|