um / code / naive.py
naive.py
Raw
import random
import copy
import datetime
import time
from collections import OrderedDict

def exeQueries(rs, dvcols, predls, predhs, types):
    Q_d = []
    starttime = time.time()
    for i in range(len(dvcols)):
        dvcol = dvcols[i]
        predl = predls[i]
        predh = predhs[i]
        q_d = []
        for row in rs:
            r = row.split('\n')[0].split('|')
            flag = True
            for j in range(len(dvcol)):
                num = dvcol[j]
                if types[num] == 'R':
                    low = float(predl[j])
                    high = float(predh[j])
                    value = float(r[num])
                    if value < low or value > high:
                        flag = False
                        #break
                else:
                    low = predl[j]
                    high = predh[j]
                    value = r[num]
                    if value != low or value != high:
                        flag = False
                        #break
            if flag:
                q_d += [row]
        Q_d = Q_d + q_d
        Q_d = list(OrderedDict.fromkeys(Q_d))
    endtime = time.time()
    cardtime = float(endtime - starttime)
    return Q_d, cardtime

def mergeRows(R_max, R):
    starttime = time.time()
    newR = R_max + R
    newR = list(OrderedDict.fromkeys(newR))
    endtime = time.time()
    mergetime = float(endtime - starttime)
    return newR, mergetime


def baseline(Fnms, B, price, rows, dvcols, predls, predhs, types):
    ff = open('baseline.txt', 'w')

    U = 0
    d = ''
    p = 0
    total_cardtime = 0
    total_mergetime = 0
    starttime = time.time()
    for fnm in Fnms:
        p_d = price[fnm]
        rs = rows[fnm]
        Q_d, cardtime = exeQueries(rs, dvcols, predls, predhs, types)
        total_cardtime = total_cardtime + cardtime
        if len(Q_d) > U and p_d <= B:
            U = len(Q_d)
            d = fnm
            p = p_d
    print(d)
    print(U)

    S = []
    R_max = []
    R = {}
    for fnm in Fnms:
        R[fnm] = []
    P = 0
    u_max = 0
    while len(Fnms) > 0 and P < B:
        d_max = ''
        g_max = 0
        p_max = 0
        newR = []
        for fnm in Fnms:
            #print(fnm)
            p_d = price[fnm]
            rs = rows[fnm]
            if len(R[fnm]) == 0:
                Q_d, cardtime = exeQueries(rs, dvcols, predls, predhs, types)
                total_cardtime = total_cardtime + cardtime
                R[fnm] = Q_d
            #print(len(R[fnm]))
            RS, mergetime = mergeRows(R_max, R[fnm])
            total_mergetime = total_mergetime + mergetime
            u = len(RS)
            #print(u)
            g = float(u-u_max) / float(p_d)
            if g > g_max and P + p_d <= B:
                g_max = g
                d_max = fnm
                p_max = p_d
                newR = RS
        if d_max != '':
            S += [d_max]
            Fnms.remove(d_max)
            P += p_max
            R_max = newR
            u_max = len(R_max)
            print(d_max)
            print(u_max)
            print(P)
        else:
            break
    endtime = time.time()
    totaltime = float(endtime - starttime)

    if u_max < U:
        print('found dataset:')
        print(fnm)
        print('utility: ' + str(U))
        print('total time: ' + str(totaltime))
        print('merge time: ' + str(total_mergetime))
        print('card time: ' + str(total_cardtime))
        sf = fnm.split('_')
        d = sf[len(sf) - 1].split('.')[0]
        ff.write('found dataset: ' + str(d) + '\n')
        ff.write('utility: ' + str(U) + '\n')
        ff.write('total time: ' + str(totaltime) + '\n')
        ff.write('merge time: ' + str(total_mergetime) + '\n')
        ff.write('card time: ' + str(total_cardtime) + '\n')
        ff.write('budget: ' + str(B) + '\n')
        ff.write('used budget: ' + str(p) + '\n')
    else:
        print('found dataset:')
        ff.write('found dataset: ')
        for d in S:
            print(d + ', ', end='')
            sf = d.split('_')
            ds = sf[len(sf) - 1].split('.')[0]
            ff.write(str(ds) + ', ')
        print()
        ff.write('\n')
        print('utility: ' + str(u_max))
        print('total time: ' + str(totaltime))
        print('merge time: ' + str(total_mergetime))
        print('card time: ' + str(total_cardtime))
        ff.write('utility: ' + str(u_max) + '\n')
        ff.write('total time: ' + str(totaltime) + '\n')
        ff.write('merge time: ' + str(total_mergetime) + '\n')
        ff.write('card time: ' + str(total_cardtime) + '\n')
        ff.write('budget: ' + str(B) + '\n')
        ff.write('used budget: ' + str(P) + '\n')
    ff.close()


if __name__ == '__main__':
    Fnms = []
    for i in range(20):
        Fnms += ['data/airline/airline_' + str(i) + '.txt']

    with open('data/airline/airline_0.meta', 'r') as fmeta:
        line = fmeta.readline()
    types = line.split(',')[2].split('\n')[0]

    price = {}
    rows = {}
    B = 0
    with open('weight.txt', 'r', errors='ignore') as f:
        weight = f.readlines()
    i = 0
    for fnm in Fnms:
        with open(fnm, 'r', errors='ignore') as f:
            rs = f.readlines()
        rows[fnm] = rs
        w = float(weight[i].split('\n')[0])
        price[fnm] = int(len(rs) * w)
        B += price[fnm]
        i += 1
    B = B * 0.5
    print('Budget: ' + str(B))

    path = 'full_airline.txt'
    dvcols = []
    predls = []
    predhs = []
    with open(path, 'r', errors='ignore') as f:
        lines = f.readlines()
        l = lines[1]
        d = l.split(';')
        for n in range(20):
            dvcols += [list(map(int, filter(None, d[3 + 2 * n].split(','))))]  # col id (attribute) of each query
            pred = list(filter(None, d[4 + 2 * n].split(',')))  # range of attribute
            lp = int(len(pred) / 2)
            predls += [pred[:lp]]  # the first half is lower bound
            predhs += [pred[lp:]]  # the second half is upper bound

    baseline(Fnms, B, price, rows, dvcols, predls, predhs, types)