def check_lambda_by_profit(cam_data, cam_data_length, cam_r, cam_base_ctr, dsp_budget, volume, dsp_l, cam_v, para, algo):
    # init
    cost = 0
    profit = 0
    budget_run_out = False
    cam_data_index = arbitrage_rtb_test.init_cam_data_index(cam_data)
    cam_vc = cam_v.copy()  # we will change cam_vc when one campaign runs out of data
    data_run_out = arbitrage_rtb_test.check_data_ran_out(cam_data_index, cam_data_length, cam_vc, volume)

    # start simulation
    while (not data_run_out) and (not budget_run_out):
        cam = arbitrage_rtb_test.sample_cam(cam_vc)
        yzp = arbitrage_rtb_test.next_cam_data(cam_data, cam_data_index, cam_data_length, cam)
        if yzp == -1:
            print cam_data_length
            print cam_data_index
        clk = yzp[0]
        mp = yzp[1]
        pctr = yzp[2]
        r = cam_r[cam]
        bid = arbitrage_rtb_test.bidding(r / config.cpc_payoff_ratio, cam_base_ctr[cam], r, dsp_l, pctr, algo, para)
        if bid > mp:  # win auction
            cost += mp
            if algo == "lin" or algo == "ortb":
                profit += clk  # these two algorithms care about clicks
            else:
                profit += clk * r - mp * 1.0E-3  # not cpm counting

        budget_run_out = (cost >= dsp_budget)
        data_run_out = arbitrage_rtb_test.check_data_ran_out(cam_data_index, cam_data_length, cam_vc, volume)
    return -profit
def estimate_mu_sigma(cam_data, cam_data_length, cam_r, cam_base_ctr, dsp_budget, volume, dsp_l, cam_v,
                      algo_one_para, algo):
    cam_mu = {}
    cam_sigma = {}  # standard deviation
    para = algo_one_para[algo]
    for cam in cam_data:
        data = cam_data[cam]
        length = cam_data_length[cam]
        profit_margins = []
        index = 0
        for process in range(config.e_step_mu_process_num):
            cost = 0
            profit = 0
            for i in range(min(volume, len(data))):
                yzp = data[index]
                index = (index + 1) % length  # rotation
                clk = yzp[0]
                mp = yzp[1]
                pctr = yzp[2]
                r = cam_r[cam]

                # bid = 0
                # if algo == "sam":
                #     bid = arbitrage_rtb_test.bidding_sam(pctr, r, dsp_l, para)
                # elif algo == "lin":
                #     bid = arbitrage_rtb_test.bidding_lin(pctr, cam_base_ctr[cam], para)
                # elif algo == "ortb":
                #     bid = arbitrage_rtb_test.bidding_ortb(pctr, cam_base_ctr[cam], r, dsp_l, para)
                # else:
                #     print "e-step portfolio algorithm name error"

                bid = arbitrage_rtb_test.bidding(r / config.cpc_payoff_ratio, cam_base_ctr[cam], r, dsp_l, pctr, algo, para)

                if bid > mp:  # win auction
                    cost += mp * 1.0E-3 # should have the same unit
                    profit += clk * r - mp * 1.0E-3  # not cpm counting
                if cost >= dsp_budget:
                    break
            profit_margin = profit / max(cost, 0.1) # avoid zero division
            profit_margins.append(profit_margin)
        cam_mu[cam] = numpy.mean(profit_margins)
        cam_sigma[cam] = numpy.std(profit_margins)
    return cam_mu, cam_sigma
def get_market_price_up_value(cam_data, cam_r, cam_original_ecpc, cam_original_ctr,
                              dsp_l, algo, para):
    up_value = 0.
    num = 0
    for cam in cam_data:
        data = cam_data[cam]
        original_ecpc = cam_original_ecpc[cam]
        original_ctr = cam_original_ctr[cam]
        r = cam_r[cam]
        for yzp in data:
            clk = yzp[0]
            mp = yzp[1]
            pctr = yzp[2]
            bid = arbitrage_rtb_test.bidding(original_ecpc, original_ctr, r, dsp_l, pctr, algo, para)
            if bid > mp:
                up_value += (bid - mp) * 0.5
            num += 1
    up_value /= num
    return up_value
def get_market_price_up_value(cam_data, cam_r, cam_original_ecpc,
                              cam_original_ctr, dsp_l, algo, para):
    up_value = 0.
    num = 0
    for cam in cam_data:
        data = cam_data[cam]
        original_ecpc = cam_original_ecpc[cam]
        original_ctr = cam_original_ctr[cam]
        r = cam_r[cam]
        for yzp in data:
            clk = yzp[0]
            mp = yzp[1]
            pctr = yzp[2]
            bid = arbitrage_rtb_test.bidding(original_ecpc, original_ctr, r,
                                             dsp_l, pctr, algo, para)
            if bid > mp:
                up_value += (bid - mp) * 0.5
            num += 1
    up_value /= num
    return up_value
def check_lambda_by_profit(cam_data, cam_data_length, cam_r, cam_base_ctr,
                           dsp_budget, volume, dsp_l, cam_v, para, algo):
    # init
    cost = 0
    profit = 0
    budget_run_out = False
    cam_data_index = arbitrage_rtb_test.init_cam_data_index(cam_data)
    cam_vc = cam_v.copy(
    )  # we will change cam_vc when one campaign runs out of data
    data_run_out = arbitrage_rtb_test.check_data_ran_out(
        cam_data_index, cam_data_length, cam_vc, volume)

    # start simulation
    while (not data_run_out) and (not budget_run_out):
        cam = arbitrage_rtb_test.sample_cam(cam_vc)
        yzp = arbitrage_rtb_test.next_cam_data(cam_data, cam_data_index,
                                               cam_data_length, cam)
        if yzp == -1:
            print cam_data_length
            print cam_data_index
        clk = yzp[0]
        mp = yzp[1]
        pctr = yzp[2]
        r = cam_r[cam]
        bid = arbitrage_rtb_test.bidding(r / config.cpc_payoff_ratio,
                                         cam_base_ctr[cam], r, dsp_l, pctr,
                                         algo, para)
        if bid > mp:  # win auction
            cost += mp
            if algo == "lin" or algo == "ortb":
                profit += clk  # these two algorithms care about clicks
            else:
                profit += clk * r - mp * 1.0E-3  # not cpm counting

        budget_run_out = (cost >= dsp_budget)
        data_run_out = arbitrage_rtb_test.check_data_ran_out(
            cam_data_index, cam_data_length, cam_vc, volume)
    return -profit