"""G08: bounded combinatorial checks, not a production storage protocol."""fromdataclassesimportdataclassfromitertoolsimportcombinationsdefdisjoint_quorums(n,read_size,write_size):ifany(type(x)isnotintforxin(n,read_size,write_size)):raiseValueError("strict integer sizes required")ifnot1<=n<=12ornot1<=read_size<=nornot1<=write_size<=n:raiseValueError("bounded valid quorum sizes required")forreadersincombinations(range(n),read_size):complement=[iforiinrange(n)ifinotinreaders]# Enumerate write quorums disjoint from this read set only.forwritersincombinations(complement,write_size):returnset(readers),set(writers)returnNone@dataclassclassLogicalClock:value:int=0def__post_init__(self):iftype(self.value)isnotintorself.value<0:raiseValueError("nonnegative integer clock required")deftick(self):self.value+=1returnself.valuedefreceive(self,timestamp):iftype(timestamp)isnotintortimestamp<0:raiseValueError("nonnegative integer message timestamp required")self.value=max(self.value,timestamp)+1returnself.valuedefunsafe_register_trace():"""Deliberately violates linearizable read behavior; never use as storage."""replicas={name:(0,"old")fornamein"ABC"}replicas["A"]=(1,"new")# incomplete write, no write quorumfirst=max(replicas[name]fornamein"AB")second=max(replicas[name]fornamein"BC")returnfirst,secondif__name__=="__main__":print(disjoint_quorums(5,2,3))print(unsafe_register_trace())