https://github.com/baharev/ManiSolve
Tip revision: 4df5c5f8c67154d8faf93dafcf5df85ce9899e1a authored by Ali Baharev on 18 November 2019, 10:48:51 UTC
Adding a CITATION file
Adding a CITATION file
Tip revision: 4df5c5f
utils.py
# Copyright (C) 2016, 2017 University of Vienna
# All rights reserved.
# BSD license.
# Author: Ali Baharev <ali.baharev@gmail.com>
from __future__ import print_function
from datetime import datetime
from functools import partial, wraps
from glob import glob
from gzip import open as gz_open
from itertools import islice, tee
from os import makedirs, remove
from os.path import isdir
from pickle import load, dump, HIGHEST_PROTOCOL
from shutil import rmtree
import sys
from py3compat import izip, StringIO
def get_lines(filename):
with open(filename, 'r') as f:
return f.read().splitlines()
def as_pairs(itr):
# [1, 2, 3, 4] -> (1, 2), (3, 4)
return izip(islice(itr, 0, None, 2), islice(itr, 1, None, 2))
def pairwise(iterable):
'''A generator object is returned.
[] pairwise: []
[1] pairwise: []
[1,2,3] pairwise: [(1, 2), (2, 3)].'''
a, b = tee(iterable)
next(b, None)
return izip(a, b)
def duplicates(iterable):
seen = set()
seen_add = seen.add
return sorted(set(e for e in iterable if e in seen or seen_add(e)))
warning = partial(print, file=sys.stderr)
def print_timing(f):
@wraps(f)
def wrapper(*args, **kwargs):
start = datetime.now()
print(start.strftime('%Y-%m-%d %H:%M:%S'))
result = f(*args, **kwargs)
end = datetime.now()
print('Took: %.1f s' % (end-start).total_seconds())
print(end.strftime('%Y-%m-%d %H:%M:%S'))
return result
return wrapper
#-------------------------------------------------------------------------------
class StdoutHijack:
# If we do StdoutHijack again under a StdoutHijack with block in tee mode
# then the output is repeated not once but twice, hence this hack:
__orig_stdout = sys.stdout
def __init__(self):
self.old = None
self.log = StringIO()
def __enter__(self):
self.old = sys.stdout
sys.stdout = self
return self
def __exit__(self, exc_type, exc_value, traceback):
sys.stdout = self.old
def write(self, message):
if self.old is StdoutHijack.__orig_stdout:
#self.old.write(message) # uncomment if a tee like behavior is needed
pass
self.log.write(message)
def captured_text(self):
return self.log.getvalue()
#-------------------------------------------------------------------------------
def serialize(obj, filename):
with gz_open(filename, 'wb') as f:
dump(obj, f, HIGHEST_PROTOCOL)
def deserialize(filename):
with gz_open(filename, 'rb') as f:
return load(f)
#-------------------------------------------------------------------------------
def clean(directory):
if isdir(directory):
print('Deleting folder "{}"'.format(directory))
rmtree(directory)
print('Creating folder "{}"'.format(directory))
makedirs(directory)
def delete_files(pattern):
for f in glob(pattern):
remove(f)