-rwxr-xr-x 3433 cryptattacktester-20230614/isdpredict1.py raw
#!/usr/bin/env python3
import sys
import subprocess
import multiprocessing
problems = (
  'N=1284,W=24',
  'N=1347,W=25',
  'N=3488,W=64',
  'N=4608,W=96',
  'N=6688,W=128',
  'N=6960,W=119',
  'N=8192,W=128',
)
attacks = (
  'attack=isd0,P=0,L=0,FW=1',
  'attack=isd0,P=1,L=0,FW=1',
  'attack=isd0,P=2,L=0,FW=1',
  'attack=isd0,P=3,L=0,FW=1',
  'attack=isd0,P=4,L=0,FW=1',
  'attack=isd0,P=1,FW=1',
  'attack=isd0,P=2,FW=1',
  'attack=isd0,P=3,FW=1',
  'attack=isd0,P=4,FW=1',
  'attack=isd1,PI=1,FW=1',
  'attack=isd1,PI=2,FW=1',
  'attack=isd1,PI=3,FW=1',
  'attack=isd1,PI=4,FW=1',
  'attack=isd1,PI=5,FW=1',
  'attack=isd1,PI=6,FW=1',
  'attack=isd1,PI=7,FW=1',
  'attack=isd1,PI=8,FW=1',
  'attack=isd1,PI=9,FW=1',
  'attack=isd1,PI=10,FW=1',
  'attack=isd1,PI=11,FW=1',
  'attack=isd1,PI=12,FW=1',
  'attack=isd2,PI=2,PIJ=1,CP=1,CS=0,FW=1',
  'attack=isd2,PI=4,PIJ=2,CP=1,CS=0,FW=1',
  'attack=isd2,PI=6,PIJ=3,CP=1,CS=0,FW=1',
  'attack=isd2,PI=8,PIJ=4,CP=1,CS=0,FW=1',
  'attack=isd2,PI=10,PIJ=5,CP=1,CS=0,FW=1',
  'attack=isd2,PI=12,PIJ=6,CP=1,CS=0,FW=1',
  'attack=isd2,PI=14,PIJ=7,CP=1,CS=0,FW=1',
  'attack=isd2,PI=16,PIJ=8,CP=1,CS=0,FW=1',
  'attack=isd2,PI=18,PIJ=9,CP=1,CS=0,FW=1',
  'attack=isd2,PI=20,PIJ=10,CP=1,CS=0,FW=1',
  'attack=isd2,PI=22,PIJ=11,CP=1,CS=0,FW=1',
  'attack=isd2,PI=24,PIJ=12,CP=1,CS=0,FW=1',
  'attack=isd2,PI=2,PIJ=2,CP=1,CS=0,FW=1',
  'attack=isd2,PI=4,PIJ=3,CP=1,CS=0,FW=1',
  'attack=isd2,PI=6,PIJ=4,CP=1,CS=0,FW=1',
  'attack=isd2,PI=8,PIJ=5,CP=1,CS=0,FW=1',
  'attack=isd2,PI=10,PIJ=6,CP=1,CS=0,FW=1',
  'attack=isd2,PI=12,PIJ=7,CP=1,CS=0,FW=1',
  'attack=isd2,PI=14,PIJ=8,CP=1,CS=0,FW=1',
  'attack=isd2,PI=16,PIJ=9,CP=1,CS=0,FW=1',
  'attack=isd2,PI=18,PIJ=10,CP=1,CS=0,FW=1',
  'attack=isd2,PI=20,PIJ=11,CP=1,CS=0,FW=1',
  'attack=isd2,PI=22,PIJ=12,CP=1,CS=0,FW=1',
  'attack=isd2,PI=2,PIJ=1,CP=0,CS=1,FW=1',
  'attack=isd2,PI=4,PIJ=2,CP=0,CS=1,FW=1',
  'attack=isd2,PI=6,PIJ=3,CP=0,CS=1,FW=1',
  'attack=isd2,PI=8,PIJ=4,CP=0,CS=1,FW=1',
  'attack=isd2,PI=10,PIJ=5,CP=0,CS=1,FW=1',
  'attack=isd2,PI=12,PIJ=6,CP=0,CS=1,FW=1',
  'attack=isd2,PI=14,PIJ=7,CP=0,CS=1,FW=1',
  'attack=isd2,PI=16,PIJ=8,CP=0,CS=1,FW=1',
  'attack=isd2,PI=18,PIJ=9,CP=0,CS=1,FW=1',
  'attack=isd2,PI=20,PIJ=10,CP=0,CS=1,FW=1',
  'attack=isd2,PI=22,PIJ=11,CP=0,CS=1,FW=1',
  'attack=isd2,PI=24,PIJ=12,CP=0,CS=1,FW=1',
  'attack=isd2,PI=26,PIJ=13,CP=0,CS=1,FW=1',
  'attack=isd2,PI=28,PIJ=14,CP=0,CS=1,FW=1',
  'attack=isd2,PI=30,PIJ=15,CP=0,CS=1,FW=1',
  'attack=isd2,PI=32,PIJ=16,CP=0,CS=1,FW=1',
  'attack=isd2,PI=34,PIJ=17,CP=0,CS=1,FW=1',
  'attack=isd2,PI=36,PIJ=18,CP=0,CS=1,FW=1',
)
todo = [(P,A) for A in attacks for P in problems]
def handle(task):
  P,A = task
  searchparams = subprocess.run(['./searchparams','problem=uniformmatrix',P,A,'I=1,RE=1,X=1,YX=1'],capture_output=True,universal_newlines=True,check=True)
  searchparams = searchparams.stdout
  if len(searchparams) == 0:
    return task,None
  return task,searchparams.splitlines()[-1]
results = {}
printpos = 0
def maybeprint():
  global printpos
  while printpos < len(todo):
    task = todo[printpos]
    if task not in results: break
    result = results[task]
    if result is not None:
      print('%s %s %s' % (task+(result,)))
      sys.stdout.flush()
    printpos += 1
with multiprocessing.Pool() as p:
  for task,result in p.imap_unordered(handle,reversed(todo),chunksize=1):
    results[task] = result
    maybeprint()