import re
import os
from itertools import chain
from functools import wraps
from time import perf_counter
from logging import Logger
from functools import lru_cache
from pathlib import Path
[docs]@lru_cache()
def get_root_dir() -> str:
path = Path().cwd()
while not Path(path, "LICENCE.MD").exists():
path = path.parent
return str(path)
[docs]def global_path(f):
"""
f: abspath linux-type
"""
return os.getcwd() + os.path.splitdrive(os.path.abspath(f))[1]
[docs]def timeit(func):
@wraps(func)
def wrapper(*args, **kwargs):
st = perf_counter()
func(*args, **kwargs)
et = perf_counter()
# logger.info(msg=f'Elapsed time: {et - st}')
print(f'Elapsed time: {et - st}')
return wrapper
[docs]def unpack(yaml_dict):
ret = {}
for k, v in yaml_dict.items():
if isinstance(v, dict):
header = ' -- ' + k
ret.update({var: desc + header for var, desc in v.items()})
if isinstance(v, str):
ret.update({k: v})
return ret
[docs]def trim(s: str, i=1, j=-1):
"""
:param s: input string
:param i: start
:param j: end
:return: substring s[i:j]. by default trimming from start and end 1 symbol
"""
return s[i:j]
[docs]def set_equality(set1, set2):
if len(set1 - set2) + len(set2 - set1) == 0:
return True
else:
return False
[docs]def embrace(s: str, brackets='()'):
return brackets[0] + s + brackets[1]
[docs]def find_objective_markers(s: str):
ARROW_MARKERS = ["to", "Rightarrow", "rightarrow", "->", "-->"]
OBJECTIVE_MARKERS = ["max", "min", "extr"]
MARKER_REGEXP = "{a}[ ]*{o}".format(
a="*".join([embrace(a) for a in ARROW_MARKERS]) + "*",
o="*".join([embrace(o) for o in OBJECTIVE_MARKERS]) + "*"
)
matches = re.findall(MARKER_REGEXP, s)
matches = set(chain(*[i for i in matches]))
matches.remove('')
if matches:
return True, re.sub(MARKER_REGEXP, '', s)
else:
return False, s
[docs]def dict_substract(a, b):
# a - b
return {k: v for k, v in a.items() if (k, v) not in b.items()}
[docs]def iterable_substract(a, b):
"""
:param a:
:param b:
:return: a - b
"""
return a.__class__([i for i in a if i not in b])
if __name__ == "__main__":
s = "$J = \int_0^T (\exp^{-\delta*t} \ln(c(x(t))))dt -> max$"
a = find_objective_markers(s)
print(a)