#!/usr/bin/python2
import sys
import subprocess
import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
import numpy.polynomial.polynomial as poly
from scipy.optimize import curve_fit
from operator import add
import operator

def quadratic_function(x, a, b, c):
    return a*x*x + b*x + c

def linear_function(x, a, b):
    return a*x + b

PLOT_PATHORAM = False
PLOT_CIRCUITORAM = True
PLOT_LSIPRM = False

#List of plot files
LF_PATHORAM='log_ZTPATHORAM'
LF_CIRCUITORAM='log_ZTCIRCUITORAM'
LF_LSIPRM='log_ZTLSORAM_IPRM'
LF_LSOPRM='log_ZTLSORAM'
FOLDER_XPIR='./XPIR/'
LF_SEALPIR='log_SEALPIR'
LF_SEALPIR_D1='log_SEALPIR_D1'
DESC_SIZE=16384


plt.rc('font', size=18)          # controls default text sizes
plt.rc('axes', titlesize=18)     # fontsize of the axes title
plt.rc('axes', labelsize=18)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=16)    # fontsize of the tick labels
plt.rc('ytick', labelsize=16)    # fontsize of the tick labels
plt.rc('legend', fontsize=14)    # legend fontsize
plt.rc('figure', titlesize=18)  # fontsize of the figure title

########################
N = []

LSIPRM_gtime=[]
LSIPRM_ptime=[]
LSIPRM_etime=[]
LSIPRM_gtime_err=[]
LSIPRM_ptime_err=[]
LSIPRM_etime_err=[]
LSIPRM_query_size=[]
LSIPRM_response_size=[]
LSIPRM_time = []
LSIPRM_time_err = []

LSOPRM_gtime=[]
LSOPRM_ptime=[]
LSOPRM_etime=[]
LSOPRM_gtime_err=[]
LSOPRM_ptime_err=[]
LSOPRM_etime_err=[]
LSOPRM_query_size=[]
LSOPRM_response_size=[]
LSOPRM_time = []
LSOPRM_time_err = []

CircuitORAM_gtime=[]
CircuitORAM_ptime=[]
CircuitORAM_etime=[]
CircuitORAM_gtime_err=[]
CircuitORAM_ptime_err=[]
CircuitORAM_etime_err=[]
CircuitORAM_query_size=[]
CircuitORAM_response_size=[]
CircuitORAM_time = []
CircuitORAM_time_err = []

PathORAM_gtime=[]
PathORAM_ptime=[]
PathORAM_etime=[]
PathORAM_gtime_err=[]
PathORAM_ptime_err=[]
PathORAM_etime_err=[]
PathORAM_query_size=[]
PathORAM_response_size=[]
PathORAM_time = []
PathORAM_time_err = []

XPIR_gtime=[]
XPIR_ptime=[]
XPIR_etime=[]
XPIR_gtime_err=[]
XPIR_ptime_err=[]
XPIR_etime_err=[]
XPIR_query_size=[]
XPIR_response_size=[]
XPIR_time = []
XPIR_time_err =[]

SealPIR_gtime=[]
SealPIR_ptime=[]
SealPIR_etime=[]
SealPIR_gtime_err=[]
SealPIR_ptime_err=[]
SealPIR_etime_err=[]
SealPIR_query_size=[]
SealPIR_response_size=[]
SealPIR_time = []
SealPIR_time_err = []

POINT_STYLES = [".","v","s","+","x","d",">","^","*","o","D"]

########################

# NOTE N just needs to be picked once, 
# All plot files should have the same N range

if(PLOT_PATHORAM):
  with open(LF_PATHORAM, 'r') as lfile:
    for line in lfile:
      values=line.split(',')
      PathORAM_gtime.append(float(values[1]))
      PathORAM_gtime_err.append(float(values[2]))
      PathORAM_ptime.append(float(values[3]))
      PathORAM_ptime_err.append(float(values[4]))
      PathORAM_etime.append(float(values[5]))
      PathORAM_etime_err.append(float(values[6]))
      PathORAM_query_size.append(int(values[7]))
      PathORAM_response_size.append(int(values[8]))

if(PLOT_CIRCUITORAM):
  with open(LF_CIRCUITORAM, 'r') as lfile:
    for line in lfile:
      values=line.split(',')
      N.append(int(values[0]))
      CircuitORAM_gtime.append(float(values[1]))
      CircuitORAM_gtime_err.append(float(values[2]))
      CircuitORAM_ptime.append(float(values[3]))
      CircuitORAM_ptime_err.append(float(values[4]))
      CircuitORAM_etime.append(float(values[5]))
      CircuitORAM_etime_err.append(float(values[6]))
      #CircuitORAM_query_size = int(values[7])
      #CircuitORAM_response_size = int(values[8])

if(PLOT_LSIPRM):
  with open(LF_LSIPRM, 'r') as lfile:
    for line in lfile:
      values=line.split(',')
      LSIPRM_gtime.append(float(values[1]))
      LSIPRM_gtime_err.append(float(values[2]))
      LSIPRM_ptime.append(float(values[3]))
      LSIPRM_ptime_err.append(float(values[4]))
      LSIPRM_etime.append(float(values[5]))
      LSIPRM_etime_err.append(float(values[6]))
      #LSIPRM_query_size = int(values[7])
      #LSIPRM_response_size = int(values[8])

with open(LF_LSOPRM, 'r') as lfile:
  for line in lfile:
    values=line.split(',')
    LSOPRM_gtime.append(float(values[1]))
    LSOPRM_gtime_err.append(float(values[2]))
    LSOPRM_ptime.append(float(values[3]))
    LSOPRM_ptime_err.append(float(values[4]))
    LSOPRM_etime.append(float(values[5]))
    LSOPRM_etime_err.append(float(values[6]))
    LSOPRM_query_size.append(int(values[7]))
    LSOPRM_response_size.append(int(values[8]))

#SealPIR logs don't contain N
with open(LF_SEALPIR, 'r') as lfile:
  for line in lfile:
    values = line.split(',') 
    SealPIR_gtime.append(float(values[0]))
    SealPIR_gtime_err.append(float(values[1]))
    SealPIR_ptime.append(float(values[2]))
    SealPIR_ptime_err.append(float(values[3]))
    SealPIR_etime.append(float(values[4]))
    SealPIR_etime_err.append(float(values[5]))
    SealPIR_query_size.append(int(values[6]))
    SealPIR_response_size.append(int(values[7]))
    SealPIR_PPT=float(values[8])

########################


XPIR_QE_TIME=[]
XPIR_RE_TIME=[]
XPIR_PQ_TIME=[]
XPIR_REQUEST_SIZE=[]
XPIR_RESPONSE_SIZE=[]
XPIR_QE_STD=[]
XPIR_RE_STD=[]
XPIR_PQ_STD=[]
XPIR_CLIENT_TIME=[]
XPIR_CLIENT_STD=[]
XPIR_d=[]
XPIR_alpha=[]


for n in N:
  FILE_NAME=FOLDER_XPIR+"XPIR_"+str(n)+"_"+str(DESC_SIZE)+"_0"
  qe_time=[]
  re_time=[]
  pq_time=[]
  client_time=[]
  request_size=0
  response_size=0
  d=0
  alpha=0
  with open(FILE_NAME,'r') as file_handle:
    ctr=0

    for line in file_handle:      
      if(ctr!=0):
        words=(line.strip()).split(',')
        qe_time.append(float(words[0]))
        d=int(words[4])
        alpha=int(words[5]) 	
        pq_time.append(float(words[6]))
        re_time.append(float(words[1]))
        client_time.append(float(words[0])+float(words[1]))
        request_size=(float(words[2]))
        response_size=(float(words[3]))
      ctr=ctr+1

    XPIR_REQUEST_SIZE.append(request_size)
    XPIR_RESPONSE_SIZE.append(response_size)
    XPIR_QE_TIME.append(np.mean(qe_time))
    XPIR_PQ_TIME.append(np.mean(pq_time))
    XPIR_RE_TIME.append(np.mean(re_time))
    XPIR_CLIENT_TIME.append(np.mean(client_time))
    XPIR_QE_STD.append(np.std(qe_time))
    XPIR_PQ_STD.append(np.std(pq_time))
    XPIR_RE_STD.append(np.std(re_time))
    XPIR_CLIENT_STD.append(np.std(client_time))
    XPIR_d.append(d)
    XPIR_alpha.append(alpha)

########################


LSIPRM_ctime = np.add(LSIPRM_gtime, LSIPRM_etime)
LSIPRM_ctime_err = np.add(LSIPRM_gtime_err, LSIPRM_etime_err)
LSOPRM_ctime = np.add(LSOPRM_gtime, LSOPRM_etime)
LSOPRM_ctime_err = np.add(LSOPRM_gtime_err, LSOPRM_etime_err)
PathORAM_ctime = np.add(PathORAM_gtime, PathORAM_etime)
PathORAM_ctime_err = np.add(PathORAM_gtime_err, PathORAM_etime_err)
CircuitORAM_ctime = np.add(CircuitORAM_gtime, CircuitORAM_etime)
CircuitORAM_ctime_err = np.add(CircuitORAM_gtime_err, CircuitORAM_etime_err)
XPIR_ctime = np.add(XPIR_QE_TIME, XPIR_RE_TIME)
XPIR_ctime_err = np.add(XPIR_QE_STD, XPIR_RE_STD)
SealPIR_ctime = np.add(SealPIR_gtime, SealPIR_etime)
SealPIR_ctime_err = np.add(SealPIR_gtime_err, SealPIR_etime_err)

LSIPRM_time = np.add(LSIPRM_ctime, LSIPRM_ptime)
LSIPRM_time_err = np.add(LSIPRM_ctime_err, LSIPRM_ptime_err)
LSOPRM_time = np.add(LSOPRM_ctime, LSOPRM_ptime)
LSOPRM_time_err = np.add(LSOPRM_ctime_err, LSOPRM_ptime_err)
PathORAM_time = np.add(PathORAM_ctime, PathORAM_ptime)
PathORAM_time_err = np.add(PathORAM_ctime_err, PathORAM_ptime_err)
CircuitORAM_time = np.add(CircuitORAM_ctime, CircuitORAM_ptime)
CircuitORAM_time_err = np.add(CircuitORAM_ctime_err, CircuitORAM_ptime_err)
XPIR_time = np.add(XPIR_ctime, XPIR_PQ_TIME)
XPIR_time_err = np.add(XPIR_ctime_err, XPIR_PQ_STD)
SealPIR_time = np.add(SealPIR_ctime, SealPIR_ptime)
SealPIR_time_err = np.add(SealPIR_ctime_err, SealPIR_ptime_err)

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Server computation time per query (in ms)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

if(PLOT_PATHORAM):
  points1 = plt.plot(N, PathORAM_ptime, POINT_STYLES[c_ctr], label='PathORAM',  color = str("C")+str(c_ctr))
if(PLOT_CIRCUITORAM):
  points2 = plt.plot(N, CircuitORAM_ptime, POINT_STYLES[c_ctr+1], label='CircuitORAM', color = str("C")+str(c_ctr+1))
if(PLOT_LSIPRM):
  points3 = plt.plot(N, LSIPRM_ptime, POINT_STYLES[c_ctr+2], label='Linear Scan (inside PRM)', color = str("C")+str(c_ctr+2))
points4 = plt.plot(N, LSOPRM_ptime, POINT_STYLES[c_ctr+3], label='Linear Scan (outside PRM)', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_PQ_TIME, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_ptime, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))
points7 = plt.plot(N, SealPIR_ptime, POINT_STYLES[c_ctr+6], label='Trivial PIR', color = str("C")+str(c_ctr+6))


if(PLOT_PATHORAM):
  errbar1 = plt.errorbar(N, PathORAM_ptime, PathORAM_ptime_err, None, 'r', ls='none', mew=3)
if(PLOT_CIRCUITORAM):
  errbar2 = plt.errorbar(N, CircuitORAM_ptime, CircuitORAM_ptime_err, None, 'r', ls='none', mew=3)
if(PLOT_LSIPRM):
  errbar3 = plt.errorbar(N, LSIPRM_ptime, LSIPRM_ptime_err, None, 'r', ls='none', mew=3)
errbar4 = plt.errorbar(N, LSOPRM_ptime, LSOPRM_ptime_err, None, 'r', ls='none', mew=3)
errbar5 = plt.errorbar(N, XPIR_PQ_TIME, XPIR_PQ_STD, None, 'r', ls='none', mew=3)
errbar6 = plt.errorbar(N, SealPIR_ptime, SealPIR_ptime_err , None, 'r', ls='none', mew=3)


if(PLOT_PATHORAM):
  plt.setp(points1, 'mew', '3.0')
if(PLOT_CIRCUITORAM):
  plt.setp(points2, 'mew', '3.0')
if(PLOT_LSIPRM):
  plt.setp(points3, 'mew', '3.0')
plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
plt.setp(points7, 'mew', '0.0')
#plt.setp(line1, 'linewidth', '2.0')
#plt.setp(line2, 'linewidth', '2.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
labels_sort = [3,4,5,6,2,1,7]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Server computation time (in ms) vs \nnumber of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=7, shadow=True, handletextpad=0.1, columnspacing=0.5)
plt.savefig('server_time_microbenchmark.png', bbox_inches='tight')
plt.close()

############################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Client query generation time per query (in ms)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

if(PLOT_PATHORAM):
  points1 = plt.plot(N, PathORAM_ctime, POINT_STYLES[c_ctr], label='PathORAM',  color = str("C")+str(c_ctr))
if(PLOT_CIRCUITORAM):
  points2 = plt.plot(N, CircuitORAM_ctime, POINT_STYLES[c_ctr+1], label='CircuitORAM', color = str("C")+str(c_ctr+1))
if(PLOT_LSIPRM):
  points3 = plt.plot(N, LSIPRM_ctime, POINT_STYLES[c_ctr+2], label='Linear Scan (inside PRM)', color = str("C")+str(c_ctr+2))
points4 = plt.plot(N, LSOPRM_gtime, POINT_STYLES[c_ctr+3], label='ZeroTrace', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_QE_TIME, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_gtime, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))

if(PLOT_PATHORAM):
  errbar1 = plt.errorbar(N, PathORAM_ctime, PathORAM_ctime_err, None, 'r', ls='none', mew=3)
if(PLOT_CIRCUITORAM):
 errbar2 = plt.errorbar(N, CircuitORAM_ctime, CircuitORAM_ctime_err, None, 'r', ls='none', mew=3)
if(PLOT_LSIPRM):
  errbar3 = plt.errorbar(N, LSIPRM_ctime, LSIPRM_ctime_err, None, 'r', ls='none', mew=3)
errbar4 = plt.errorbar(N, LSOPRM_gtime, LSOPRM_gtime_err, None, 'r', ls='none', mew=3)
errbar5 = plt.errorbar(N, XPIR_QE_TIME, XPIR_QE_STD, None, 'r', ls='none', mew=3)
errbar6 = plt.errorbar(N, SealPIR_gtime, SealPIR_gtime_err , None, 'r', ls='none', mew=3)

if(PLOT_PATHORAM):
  plt.setp(points1, 'mew', '3.0')
if(PLOT_CIRCUITORAM):
  plt.setp(points2, 'mew', '3.0')
if(PLOT_LSIPRM):
  plt.setp(points3, 'mew', '3.0')
plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
#plt.setp(line1, 'linewidth', '2.0')
#plt.setp(line2, 'linewidth', '2.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
labels_sort = [3,2,1]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Client query generation time (in ms) \nvs number of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=2, shadow=True)
plt.savefig('client_query_time_microbenchmark.png', bbox_inches='tight')
plt.close()

print("Done with client query time graph..")
############################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Client reply extraction time per query (in ms)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

if(PLOT_PATHORAM):
  points1 = plt.plot(N, PathORAM_ctime, POINT_STYLES[c_ctr], label='PathORAM',  color = str("C")+str(c_ctr))
if(PLOT_CIRCUITORAM):
  points2 = plt.plot(N, CircuitORAM_ctime, POINT_STYLES[c_ctr+1], label='CircuitORAM', color = str("C")+str(c_ctr+1))
if(PLOT_LSIPRM):
  points3 = plt.plot(N, LSIPRM_ctime, POINT_STYLES[c_ctr+2], label='Linear Scan (inside PRM)', color = str("C")+str(c_ctr+2))
points4 = plt.plot(N, LSOPRM_etime, POINT_STYLES[c_ctr+3], label='ZeroTrace', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_RE_TIME, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_etime, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))

if(PLOT_PATHORAM):
  errbar1 = plt.errorbar(N, PathORAM_ctime, PathORAM_ctime_err, None, 'r', ls='none', mew=3)
if(PLOT_CIRCUITORAM):
  errbar2 = plt.errorbar(N, CircuitORAM_ctime, CircuitORAM_ctime_err, None, 'r', ls='none', mew=3)
if(PLOT_LSIPRM):
  errbar3 = plt.errorbar(N, LSIPRM_ctime, LSIPRM_ctime_err, None, 'r', ls='none', mew=3)
errbar4 = plt.errorbar(N, LSOPRM_etime, LSOPRM_etime_err, None, 'r', ls='none', mew=3)
errbar5 = plt.errorbar(N, XPIR_RE_TIME, XPIR_RE_STD, None, 'r', ls='none', mew=3)
errbar6 = plt.errorbar(N, SealPIR_etime, SealPIR_etime_err , None, 'r', ls='none', mew=3)

if(PLOT_PATHORAM):
  plt.setp(points1, 'mew', '3.0')
if(PLOT_CIRCUITORAM):
  plt.setp(points2, 'mew', '3.0')
if(PLOT_LSIPRM):
  plt.setp(points3, 'mew', '3.0')
plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
#plt.setp(line1, 'linewidth', '2.0')
#plt.setp(line2, 'linewidth', '2.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
labels_sort = [3,2,1]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Client reply extraction time (in ms) \nvs number of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=2, shadow=True)
plt.savefig('client_reply_time_microbenchmark.png', bbox_inches='tight')
plt.close()

print("Done with client reply extraction time graph..")

############################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Client computation time per query (in ms)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

if(PLOT_PATHORAM):
  points1 = plt.plot(N, PathORAM_ctime, POINT_STYLES[c_ctr], label='PathORAM',  color = str("C")+str(c_ctr))
if(PLOT_CIRCUITORAM):
  points2 = plt.plot(N, CircuitORAM_ctime, POINT_STYLES[c_ctr+1], label='CircuitORAM', color = str("C")+str(c_ctr+1))
if(PLOT_LSIPRM):
  points3 = plt.plot(N, LSIPRM_ctime, POINT_STYLES[c_ctr+2], label='Linear Scan (inside PRM)', color = str("C")+str(c_ctr+2))
points4 = plt.plot(N, LSOPRM_ctime, POINT_STYLES[c_ctr+3], label='ZeroTrace', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_ctime, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_ctime, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))

if(PLOT_PATHORAM):
  errbar1 = plt.errorbar(N, PathORAM_ctime, PathORAM_ctime_err, None, 'r', ls='none', mew=3)
if(PLOT_CIRCUITORAM):
  errbar2 = plt.errorbar(N, CircuitORAM_ctime, CircuitORAM_ctime_err, None, 'r', ls='none', mew=3)
if(PLOT_LSIPRM):
  errbar3 = plt.errorbar(N, LSIPRM_ctime, LSIPRM_ctime_err, None, 'r', ls='none', mew=3)
errbar4 = plt.errorbar(N, LSOPRM_ctime, LSOPRM_ctime_err, None, 'r', ls='none', mew=3)
errbar5 = plt.errorbar(N, XPIR_ctime, XPIR_ctime_err, None, 'r', ls='none', mew=3)
errbar6 = plt.errorbar(N, SealPIR_ctime, SealPIR_ctime_err , None, 'r', ls='none', mew=3)

if(PLOT_PATHORAM):
  plt.setp(points1, 'mew', '3.0')
if(PLOT_CIRCUITORAM):
  plt.setp(points2, 'mew', '3.0')
if(PLOT_LSIPRM):
  plt.setp(points3, 'mew', '3.0')
plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
#plt.setp(line1, 'linewidth', '2.0')
#plt.setp(line2, 'linewidth', '2.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
labels_sort = [3,2,1]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Client computation time (in ms) vs \nnumber of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=2, shadow=True)
plt.savefig('client_time_microbenchmark.png', bbox_inches='tight')
plt.close()

print("Done with client computation time graph..")
###################################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Total time per query (in ms)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

if(PLOT_PATHORAM):
  points1 = plt.plot(N, PathORAM_time, POINT_STYLES[c_ctr], label='PathORAM',  color = str("C")+str(c_ctr))
if(PLOT_CIRCUITORAM):
  points2 = plt.plot(N, CircuitORAM_time, POINT_STYLES[c_ctr+1], label='CircuitORAM', color = str("C")+str(c_ctr+1))
if(PLOT_LSIPRM):
  points3 = plt.plot(N, LSIPRM_time, POINT_STYLES[c_ctr+2], label='Linear Scan (inside PRM)', color = str("C")+str(c_ctr+2))
points4 = plt.plot(N, LSOPRM_time, POINT_STYLES[c_ctr+3], label='Linear Scan (outside PRM)', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_time, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_time, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))
#points7 = plt.plot(N, SealPIR_D1_time, POINT_STYLES[c_ctr+6], label='SealPIR D=1', color = str("C")+str(c_ctr+5))

if(PLOT_PATHORAM):
  errbar1 = plt.errorbar(N, PathORAM_time, PathORAM_time_err, None, 'r', ls='none', mew=3)
if(PLOT_CIRCUITORAM):
  errbar2 = plt.errorbar(N, CircuitORAM_time, CircuitORAM_time_err, None, 'r', ls='none', mew=3)
if(PLOT_LSIPRM):
  errbar3 = plt.errorbar(N, LSIPRM_time, LSIPRM_time_err, None, 'r', ls='none', mew=3)
errbar4 = plt.errorbar(N, LSOPRM_time, LSOPRM_time_err, None, 'r', ls='none', mew=3)
errbar5 = plt.errorbar(N, XPIR_time, XPIR_time_err, None, 'r', ls='none', mew=3)
errbar6 = plt.errorbar(N, SealPIR_time, SealPIR_time_err , None, 'r', ls='none', mew=3)

if(PLOT_PATHORAM):
  plt.setp(points1, 'mew', '3.0')
if(PLOT_CIRCUITORAM):
  plt.setp(points2, 'mew', '3.0')
if(PLOT_LSIPRM):
  plt.setp(points3, 'mew', '3.0')
plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
#plt.setp(points7, 'mew', '3.0')
#plt.setp(line1, 'linewidth', '2.0')
#plt.setp(line2, 'linewidth', '2.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
#labels_sort = [4,5,6,7,3,2,1]
labels_sort = [3,4,5,6,2,1]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Total computation time (in ms) vs number of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=2, shadow=True)
plt.savefig('total_time_microbenchmark.png', bbox_inches='tight')
plt.close()


print("Done with total time graph..")
###################################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Request size per query (in bytes)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

points4 = plt.plot(N, LSOPRM_query_size, POINT_STYLES[c_ctr+3], label='ZeroTrace', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_REQUEST_SIZE, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_query_size, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))

plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
labels_sort = [3,1,2]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Request size (in bytes) vs \nnumber of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=2, shadow=True)
plt.savefig('request_size.png', bbox_inches='tight')
plt.close()

print("Done with request size graph..")
###################################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Response size per query (in bytes)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

TrivialPIR_size = np.multiply(N, DESC_SIZE)

points4 = plt.plot(N, LSOPRM_response_size, POINT_STYLES[c_ctr+3], label='ZeroTrace', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_RESPONSE_SIZE, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_response_size, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))
points7 = plt.plot(N, TrivialPIR_size, POINT_STYLES[c_ctr+6], label='Trivial PIR', color = str("C")+str(c_ctr+6))

plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
plt.setp(points7, 'mew', '3.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
labels_sort = [4,2,3,1]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Response size (in bytes) vs \nnumber of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=4, shadow=True)
plt.savefig('response_size.png', bbox_inches='tight')
plt.close()

print("Done with response size graph..")
###################################################################

plt.xlabel('Number of Hidden Service Descriptors')
plt.ylabel('Total bandwidth per query (in bytes)')
plt.grid(True)
plt.yscale('log')
plt.xscale('log')

c_ctr=0

LSOPRM_bw = np.add(LSOPRM_query_size, LSOPRM_response_size)
XPIR_bw = np.add(XPIR_REQUEST_SIZE, XPIR_RESPONSE_SIZE)
SealPIR_bw = np.add(SealPIR_query_size, SealPIR_response_size)

points4 = plt.plot(N, LSOPRM_bw, POINT_STYLES[c_ctr+3], label='ZeroTrace', color = str("C")+str(c_ctr+3))
points5 = plt.plot(N, XPIR_bw, POINT_STYLES[c_ctr+4], label='XPIR', color = str("C")+str(c_ctr+4))
points6 = plt.plot(N, SealPIR_bw, POINT_STYLES[c_ctr+5], label='SealPIR', color = str("C")+str(c_ctr+5))
points7 = plt.plot(N, TrivialPIR_size, POINT_STYLES[c_ctr+6], label='Trivial PIR', color = str("C")+str(c_ctr+6))

plt.setp(points4, 'mew', '3.0')
plt.setp(points5, 'mew', '3.0')
plt.setp(points6, 'mew', '3.0')
plt.setp(points7, 'mew', '3.0')

ax = plt.subplot()
handles, labels = ax.get_legend_handles_labels()
#labels_sort = [4,1,3,2]
labels_sort = [4,3,2,1]
hl = sorted(zip(handles, labels, labels_sort),
            key=operator.itemgetter(2))
handles2, labels2, labels_sort= zip(*hl)
#ax.legend(handles2, labels2, loc = 7)

plt.title('Total bandwidth required (in bytes) vs \nnumber of hidden service descriptors')
ax.legend(handles2, labels2, loc='upper center', bbox_to_anchor=(0.5, -0.15), ncol=4, shadow=True)
plt.savefig('total_bw.png', bbox_inches='tight')
plt.close()

print("Done with total bandwidth graph..")

###################################################################
