"""Sinh bộ ca pairwise cho một mô hình cấu hình nhỏ.""" from itertools import combinations, product DOMAINS = [ ("web", "desktop"), ("password", "oauth"), ("online", "offline"), ("light", "dark"), ] def valid(row): return not (row[1] == "oauth" and row[2] == "offline") def pairs(row): return {(i, row[i], j, row[j]) for i, j in combinations(range(len(row)), 2)} def greedy(rows): remaining = set().union(*(pairs(row) for row in rows)) selected = [] while remaining: row = max(rows, key=lambda r: len(pairs(r) & remaining)) selected.append(row) remaining -= pairs(row) return selected if __name__ == "__main__": full = [row for row in product(*DOMAINS) if valid(row)] selected = greedy(full) assert set().union(*(pairs(r) for r in full)) == set().union(*(pairs(r) for r in selected)) assert all(valid(row) for row in selected) first_three = {row[:3] for row in full} missed = sorted(first_three - {row[:3] for row in selected}) assert missed print("Tổ hợp khả thi:", len(full), "| Bộ ca pairwise:", len(selected)) print("Bộ ba hợp lệ chưa xuất hiện:", missed[0]) for row in selected: print(row)