|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Utilizations for graph representation.
|
|
|
|
|
|
Mainly for listing combinations and permutations of elements.
|
|
|
"""
|
|
|
|
|
|
from geometry import Point
|
|
|
|
|
|
|
|
|
def _cross(elems1, elems2):
|
|
|
for e1 in elems1:
|
|
|
for e2 in elems2:
|
|
|
yield e1, e2
|
|
|
|
|
|
|
|
|
def cross(elems1, elems2):
|
|
|
return list(_cross(elems1, elems2))
|
|
|
|
|
|
|
|
|
def _comb2(elems):
|
|
|
if len(elems) < 2:
|
|
|
return
|
|
|
for i, e1 in enumerate(elems[:-1]):
|
|
|
for e2 in elems[i + 1 :]:
|
|
|
yield e1, e2
|
|
|
|
|
|
|
|
|
def comb2(elems):
|
|
|
return list(_comb2(elems))
|
|
|
|
|
|
|
|
|
def _comb3(elems):
|
|
|
if len(elems) < 3:
|
|
|
return
|
|
|
for i, e1 in enumerate(elems[:-2]):
|
|
|
for j, e2 in enumerate(elems[i + 1 : -1]):
|
|
|
for e3 in elems[i + j + 2 :]:
|
|
|
yield e1, e2, e3
|
|
|
|
|
|
|
|
|
def comb3(elems):
|
|
|
return list(_comb3(elems))
|
|
|
|
|
|
|
|
|
def _comb4(elems):
|
|
|
if len(elems) < 4:
|
|
|
return
|
|
|
for i, e1 in enumerate(elems[:-3]):
|
|
|
for j, e2 in enumerate(elems[i + 1 : -2]):
|
|
|
for e3, e4 in _comb2(elems[i + j + 2 :]):
|
|
|
yield e1, e2, e3, e4
|
|
|
|
|
|
|
|
|
def comb4(elems):
|
|
|
return list(_comb4(elems))
|
|
|
|
|
|
|
|
|
def _perm2(elems):
|
|
|
for e1, e2 in comb2(elems):
|
|
|
yield e1, e2
|
|
|
yield e2, e1
|
|
|
|
|
|
|
|
|
def perm2(elems):
|
|
|
return list(_perm2(elems))
|
|
|
|
|
|
|
|
|
def _all_4points(l1, l2):
|
|
|
p1s = l1.neighbors(Point)
|
|
|
p2s = l2.neighbors(Point)
|
|
|
for a, b in perm2(p1s):
|
|
|
for c, d in perm2(p2s):
|
|
|
yield a, b, c, d
|
|
|
|
|
|
|
|
|
def all_4points(l1, l2):
|
|
|
return list(_all_4points(l1, l2))
|
|
|
|
|
|
|
|
|
def _all_8points(l1, l2, l3, l4):
|
|
|
for a, b, c, d in all_4points(l1, l2):
|
|
|
for e, f, g, h in all_4points(l3, l4):
|
|
|
yield (a, b, c, d, e, f, g, h)
|
|
|
|
|
|
|
|
|
def all_8points(l1, l2, l3, l4):
|
|
|
return list(_all_8points(l1, l2, l3, l4))
|
|
|
|
|
|
|
|
|
def _perm3(elems):
|
|
|
for x in elems:
|
|
|
for y in elems:
|
|
|
if y == x:
|
|
|
continue
|
|
|
for z in elems:
|
|
|
if z not in (x, y):
|
|
|
yield x, y, z
|
|
|
|
|
|
|
|
|
def perm3(elems):
|
|
|
return list(_perm3(elems))
|
|
|
|
|
|
|
|
|
def _perm4(elems):
|
|
|
for x in elems:
|
|
|
for y in elems:
|
|
|
if y == x:
|
|
|
continue
|
|
|
for z in elems:
|
|
|
if z in (x, y):
|
|
|
continue
|
|
|
for t in elems:
|
|
|
if t not in (x, y, z):
|
|
|
yield x, y, z, t
|
|
|
|
|
|
|
|
|
def perm4(elems):
|
|
|
return list(_perm4(elems))
|
|
|
|