deletion_sql="DROP TABLE IF EXISTS {};".format(equigraph_table)
cursor.execute(deletion_sql)
cursor.execute("CREATE TABLE {} AS SELECT m.block, s.tuple, 0 AS max_occurence FROM {} as m, {} as s where m.superblock = s.superblock".format(equigraph_table,missing_data_table,superblock_table))
cursor.execute("INSERT INTO {}(block, tuple, max_occurence) SELECT m.block, s.tuple, 0 AS max_occurence FROM {} as m, {} as s where m.superblock = s.superblock".format(equigraph_table,missing_data_table,superblock_table))
cursor.execute("UPDATE {} SET max_occurence = 1 WHERE (tuple, block) IN (SELECT tl.tuple, bl.block FROM {} AS tl, {} AS bl WHERE tl.weight = bl.label);".format(equigraph_table,tuple_label_table,block_label_table))
definitialize_matching():
deletion_sql="DROP TABLE IF EXISTS {};".format(matching_table)
WHERE e.block IN %s AND e.max_occurence = 0 AND tl.tuple = e.tuple
AND tl.occurence = 1 AND tb.block = e.block""".format(equigraph_table,tuple_label_table,block_label_table,equigraph_table,tuple_label_table,block_label_table),[tuple(S),db_size,tuple(S)])
alpha=sys.float_info.max
edges_to_add=[]
forrowincursor.fetchall():
a=row[4]+row[5]-row[3]
ifa<alpha:
alpha=a
edges_to_add=[]
ifa==alpha:
edges_to_add.append(row)
# print(alpha, edges_to_add)
cursor.execute("UPDATE {} SET label = label - %s WHERE block in %s".format(block_label_table),[alpha,tuple(S)])
cursor.execute("UPDATE {} SET label = label + %s WHERE (tuple, occurence) in %s".format(tuple_label_table),[alpha,tuple(T)])
foredgeinedges_to_add:
cursor.execute("INSERT INTO {} (block, label) VALUES (%s, %s)".format(block_label_table),[row[0],row[4]])
cursor.execute("INSERT INTO {} (tuple, occurence, label, weight) VALUES (%s, %s, %s, %s) ON CONFLICT DO NOTHING".format(tuple_label_table),[row[1],row[2],row[5],row[3]])
cursor.execute("UPDATE {} SET max_occurence = %s WHERE block = %s AND tuple = %s".format(equigraph_table),[row[2],row[0],row[1]])
defhungarian_step(u,S,T,S_neigh,prec):
update_count=0
prec_z=u
whileTrue:
remaining_neigh=S_neigh-T
iflen(remaining_neigh)>0:
y=next(iter(remaining_neigh))
prec[y]=prec_z
z=get_matching_block(y[0],y[1])
ifzisNone:
augmenting_path_insertion(u,y,prec)
print(update_count)
return
else:
S.add(z)
T.add(y)
prec[z]=y
S_neigh.update(get_neighbors({z}))
else:
update_count+=1
# print("update labels")
# print(v, S, T, S_neigh, prec)
update_labels(S,T)
S_neigh=get_neighbors(S)
defhungarian_algorithm():
foriinrange(1,db_size):
v=pick_free_block()
S={v}
T=set()
S_neigh=get_neighbors(S)
prec=dict()
# print(v, S, T, S_neigh, prec)
hungarian_step(v,S,T,S_neigh,prec)
cursor.execute("SELECT * FROM {}".format(matching_table))