def aprioriWorker(data_fname, sup, out_fname, conn):
    try:
        conn.send(Apriori.Apriori_main(data_fname, sup, out_fname)[1])
        conn.close()
        return
    except MemoryError:
        conn.send(-1)
        conn.close()
        return
    except Exception as e:
        conn.send((-1,e.message,))
        conn.close()
        return
def aprioriWorker(data_fname, sup, conn, flag=True):
    try:
        if flag:
            Apriori.Apriori_main(data_fname, sup)
            conn.send(0)
            conn.close()
            return
        else:
            conn.send(Apriori.Apriori_main(data_fname, sup)[1])
            conn.close()
            return
    except MemoryError:
        conn.send(-1)
        conn.close()
        return
    except Exception as e:
        conn.send((
            -1,
            e.message,
        ))
        conn.close()
        return
def metricWorker(fname, sanitized, sens, sup, conn):
    Apriori_results_init = readLargeData(fname)
    S = minSet(readSensitiveSet(sens))
    SS = supersets(S, Apriori_results_init.keys())
    
    r_fd = list(set(Apriori_results_init) - SS)
    Apriori_results = Apriori.Apriori_main(sanitized, sup)[0]

    side_effects = len(r_fd)-len(Apriori_results)
    
    if side_effects<0:
        conn.send((side_effects,0,))
        conn.close()
        return
    else:
##        a1 = 0.
##        a2 = 0.
##        for itemset in convert2frozen_m(apriori(r_fd, target='m', supp = float(0.0))):
##            a1 += 1.0
##            for itemset2 in convert2frozen_m(apriori(Apriori_results.keys(), target='m', supp = float(0.0))):
##                if itemset == itemset2:
##                    a2 += 1.0
##                    
##        Bd_rate = abs(round(float((a1-a2)/a1),2))
        
        SumAll = 0
        AbsDif = 0.0
        for itemset in r_fd:
            SumAll +=  Apriori_results_init[itemset]
            if itemset in Apriori_results:
                AbsDif +=  float(abs(Apriori_results_init[itemset] - Apriori_results[itemset]))
            else:
                AbsDif +=  float(Apriori_results_init[itemset])
                
        if SumAll == 0:
            inls =  round(float(AbsDif), 3)
        else:
            inls =  round(float(AbsDif/SumAll), 3)

        conn.send((side_effects, inls,))
        conn.close()
        return
def metricWorker(fname, sanitized, sens, sup, conn):
    Apriori_results_init = readLargeData(fname)
    S = minSet(readSensitiveSet(sens))
    SS = supersets(S, Apriori_results_init.keys())

    r_fd = list(set(Apriori_results_init) - SS)
    Apriori_results = Apriori.Apriori_main(sanitized, sup)[0]
    side_effects = len(r_fd) - len(Apriori_results)

    if side_effects < 0:
        conn.send((
            side_effects,
            0,
        ))
        conn.close()
        return
    else:

        SumAll = 0
        AbsDif = 0.0
        for itemset in r_fd:
            SumAll += Apriori_results_init[itemset]
            if itemset in Apriori_results:
                AbsDif += float(
                    abs(Apriori_results_init[itemset] -
                        Apriori_results[itemset]))
            else:
                AbsDif += float(Apriori_results_init[itemset])

        if SumAll == 0:
            inls = round(float(AbsDif), 3)
        else:
            inls = round(float(AbsDif / SumAll), 3)

        conn.send((
            side_effects,
            inls,
        ))
        conn.close()
        return