Source code for curver.kernel.utilities
''' A module of useful, generic functions; including input and output formatting. '''
from itertools import product
from string import ascii_lowercase, ascii_uppercase, digits
import re
import curver
ALPHABET = digits + ascii_lowercase + ascii_uppercase + '+-'
[docs]def b64encode(n):
''' Return n in base 64. '''
out = []
while n:
n, r = divmod(n, 64)
out.append(ALPHABET[r])
return ''.join(out)
[docs]def b64decode(strn):
''' Return the integer with base 64 encoding strn. '''
return sum(ALPHABET.index(c) * 64**i for i, c in enumerate(strn))
[docs]def string_generator(n, skip=None):
''' Return a list of n usable names, none of which are in skip. '''
assert isinstance(n, curver.IntegerType)
assert skip is None or isinstance(skip, (list, tuple, dict, set))
skip = set() if skip is None else set(skip)
alphabet = ascii_lowercase
results = []
i = 0
while len(results) < n:
i += 1
for letters in product(alphabet, repeat=i):
word = ''.join(letters)
if word not in skip:
results.append(word)
if len(results) >= n: break
return results
[docs]def name_objects(objects, skip=None):
''' Return a list of pairs (name, object). '''
assert isinstance(objects, (list, tuple))
return zip(string_generator(len(objects), skip), objects)
[docs]def cyclic_slice(L, x, y):
''' Return the sublist of L from x (inclusive) to y (exclusive).
L may be cyclically permuted if needed. '''
i = L.index(x)
L = L[i:] + L[:i] # x is now L[0].
j = L.index(y)
return L[:j]
[docs]def maximum(iterable, key=lambda x: x, upper_bound=None):
''' Return the maximum of iterable but terminate early when given an upper_bound. '''
def helper():
''' A generator that yeilds elements from iterable up to and including one such that key(item) >= upper_bound. '''
for item in iterable:
yield item
if upper_bound is not None and key(item) >= upper_bound: return
return max(helper(), key=key)
[docs]def alphanum_key(strn):
''' Return a list of string and number chunks from a string. '''
blocks = []
for chunk in re.split('([0-9]+)', strn):
try:
blocks.append(int(chunk))
except ValueError:
blocks.append(chunk)
return blocks
[docs]def matrix_vector(M, v):
''' Return M*v where v is interpreted as a column vector. '''
return (v * M.T).tolist()[0]