Spaces:
Runtime error
Runtime error
| # 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)) | |