# Copyright 2023 DeepMind Technologies Limited # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """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))