-rwxr-xr-x 4068 cryptattacktester-20230614/isdpredict-table.py raw
#!/usr/bin/env python3 import sys def problem_format(P): N = None W = None for x in P.split(','): x = x.split('=') if x[0] == 'N': N = int(x[1]) return '$%d$' % N constraint_titles = ( ( 'isd', r'\hbox{\verb|isd|}' ), ( 'RE', r'\hbox{\verb|RE|}' ), ( 'L', r'\ell' ), ( 'P', "p"), ( 'PI', "p'" ), ( 'PIJ', "p''" ), ( 'C', 'C' ), ) knownconstraints = 'attack','RE','L','P','PI','PIJ','CP','CS','FW' def attack_fci(A): result = '' category = '' CP,CS = None,None attack,PIJ,PI = None,None,None interesting = True constraints = {} for x in A.split(','): x = x.split('=') assert x[0] in knownconstraints constraints[x[0]] = x[1] category = ['attack='+constraints['attack']] assert constraints['attack'].startswith('isd') constraints['isd'] = constraints['attack'][3:] if 'PIJ' in constraints and 'PI' in constraints: PIJ = int(constraints['PIJ']) PI = int(constraints['PI']) category += ['mmt=%s'%(PIJ*2==PI)] if 'CP' in constraints and 'CS' in constraints: CP = int(constraints['CP']) CS = int(constraints['CS']) C = {(1,0):0,(0,1):1,(0,0):2}[CP,CS] constraints['C'] = C category += [f"C={C}"] result = '&'.join(str(constraints.get(c,'')) for c,t in constraint_titles) PL = {'0':'P','1':'PI','2':'PIJ'}[constraints['isd']] PL = int(constraints[PL]) if 'RE' in constraints and PL > 2: interesting = False if constraints['isd'] == '0' and PL > 3: interesting = False if constraints['isd'] == '1' and PL > 9: interesting = False if constraints['isd'] == '2' and C == 0 and PI == 2*PIJ and PL > 9: interesting = False category = ','.join(category) if A == 'attack=isd0,P=0,L=0,FW=1,RE=1': category = 'prange' return result,category,interesting def attack_format(A): return attack_fci(A)[0] def attack_category(A): return attack_fci(A)[1] def attack_interesting(A): return attack_fci(A)[2] def intervalparse(x): assert x.startswith('[') assert x.endswith(']') x = x[1:-1] x = x.split(',') assert len(x) == 2 x0,x1 = map(float,x) assert x0 > 0 assert x1 >= x0 assert x1 < x0*1.0001 # indistinguishable on graph return x0 problems = [] categories = [] attacks = [] data = {} for line in sys.stdin: line = line.split() P = line[0] A = line[1] assert line[2] == 'searchparams' assert line[3] == 'problem=uniformmatrix' Q = line[6] assert line[7] == 'lgratio' lgratio = intervalparse(line[8]) assert '|' not in P if P == 'N=6960,W=119': # save space in table # 6960 is almost identical to 6688, marginally higher continue if P == 'N=1347,W=25': continue if not attack_interesting(A): continue if P not in problems: problems += [P] if 'RE=1' in Q.split(','): ARE = A+',RE=1' if attack_interesting(ARE): C = attack_category(ARE) if C not in categories: categories += [C] if ARE not in attacks: attacks += [ARE] assert (P,ARE) not in data data[P,ARE] = lgratio if A not in attacks: attacks += [A] C = attack_category(A) if C not in categories: categories += [C] key = P,A if key not in data: data[key] = lgratio data[key] = min(data[key],lgratio) print(r'\begin{tabular}{%s|%s}' % ('r'*len(constraint_titles),'r'*len(problems))) print('&'.join('$%s$'%t for c,t in constraint_titles)+''.join('&'+problem_format(P) for P in problems)+r'\\') print(r'\hline') for C in categories: best = {} for A in attacks: if attack_category(A) != C: continue for P in problems: key = P,A if key not in data: continue if P not in best: best[P] = data[key] best[P] = min(best[P],data[key]) for A in attacks: row = '' row += attack_format(A) if attack_category(A) != C: continue for P in problems: key = P,A if key in data: entry = '%.2f'%data[key] if data[key] == best[P]: row += r'&\color{blue}%s'%entry else: row += '&%s'%entry else: row += '&' print(row+r'\\') print(r'\hline') print(r'\end{tabular}')