In [34]:
from __future__ import print_function

%matplotlib inline
%load_ext autoreload
%autoreload 2

import matplotlib.pyplot as plt
import numpy as np
import tables as t
from collections import defaultdict
import os
from cyclopts import tools, analysis
from cyclopts import io_tools


The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload

In [35]:
# configurable input
mod_kind = 'rxtr' # rxtr or reqr or rand

if mod_kind == 'rxtr':
    species_module = "cyclopts.structured_species.request"
    species_class = "StructuredRequest"
elif mod_kind == 'reqr':
    species_module = "cyclopts.structured_species.supply"
    species_class = "StructuredSupply"  
elif mod_kind == 'rand':
    species_module = "cyclopts.random_request_species"
    species_class = "RandomRequest"   

family_module = "cyclopts.exchange_family"
family_class = "ResourceExchange"
# imports
import importlib
fam_mod = importlib.import_module(family_module)
fam_cls = getattr(fam_mod, family_class)
sp_mod = importlib.import_module(species_module)
sp_cls = getattr(sp_mod, species_class)

In [ ]:
data = analysis.cyclopts_data(h5file, fam_cls(), sp_cls())

In [36]:
def full_path(base, dirname, fname):
    return os.path.join(os.path.expanduser(base), dirname, fname)

In [37]:
#dirnames = ['ratio_0_1_{0}_0', 'base_{0}_0', 'ratio_10_{0}_0']
#ratios = [0.1, 1, 10]

dirnames = ['base_{0}_1', 'ratio_10_{0}_1']
ratios = [1, 10]

dirnames = [x.format(mod_kind) for x in dirnames]
ratio_to_dir = {x: dirnames[i] for i, x in enumerate(ratios)}
base = '~/phd/cyclopts/structured_runs/'
fname = 'combined.h5'

In [38]:
, below=0.8e9# iids needed from one file
dirname = dirnames[1]
f = t.open_file(full_path(base, dirname, fname), mode='r')
rows = f.root.Results.read_where("""solver == x""", condvars={'x': 'cbc'})
iids = set(x['instid'] for x in rows)
inst_props = io_tools.tbl_to_dict(f.root.Family.ResourceExchange.ExchangeInstProperties, 'instid')
f.close()


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-38-7449b279f42b> in <module>()
----> 1 below("=0.8e9#", "iids", "needed", "from", "one", "file")
      2 dirname = dirnames[1]
      3 f = t.open_file(full_path(base, dirname, fname), mode='r')
      4 rows = f.root.Results.read_where("""solver == x""", condvars={'x': 'cbc'})
      5 iids = set(x['instid'] for x in rows)

NameError: name 'below' is not defined

In [ ]:
, below=0.8e9, below=0.8e9#
# basic per file aggregations
#
def soln_aggs(f, by='sid'): 
    # info from Results table
    rows = f.root.Results.read_where("""solver == x""", condvars={'x': 'cbc'})
    iid_to_sids = {x['instid']: x['solnid'] for x in rows}
    sids = set(iid_to_sids.values())
    objs = {x['solnid']: x['objective'] for x in rows}
    times = {x['solnid']: x['time'] for x in rows}

    # info from Family Solution Props
    rows = f.root.Family.ResourceExchange.PostProcess.read()
    pflow = {x['solnid']: x['pref_flow'] for x in rows}
    pflow = {k: v for k, v in pflow.items() if k in sids} # subset where solver == cbc

    # info from Species Solution Props
    if mod_kind == 'reqr':
        rows = f.root.Species.StructuredSupply.PostProcess.read()
    else:
        rows = f.root.Species.StructuredRequest.PostProcess.read()
    pcflow = {x['solnid']: x['c_pref_flow'] for x in rows}
    pcflow = {k: v for k, v in pcflow.items() if k in sids} # subset where solver == cbc
    plflow = {k: pflow[k] - v for k, v in pcflow.items()} # hack because loc flow is recorded without ratio

    if by == 'sid': # by solnid
        return {x: np.array((objs[x], pflow[x], pcflow[x], plflow[x])) for x in sids}
    else: # by instid
        sid_to_iid = {v: k for k, v in iid_to_sids.items()}
        return {sid_to_iid[x]: np.array((times[x], objs[x], pflow[x], pcflow[x], plflow[x])) for x in sids}

In [ ]:
h5files = [t.open_file(full_path(base, x, fname), mode='r') for x in dirnames]
data = [soln_aggs(f, by='iid') for f in h5files]

In [ ]:
def relative_values(xdata, ydata, idx=None):
    if idx is None:
        return {k: (xdata[k] - ydata[k]) / xdata[k] for k in xdata.keys()}
    else:
        return {k: (xdata[k][idx] - ydata[k][idx]) / xdata[k][idx] for k in xdata.keys()}

In [ ]:
# soln time
rel_data = [relative_values(data[0], data[i], idx=0) for i in range(1, len(dirnames))]
print(np.average(rel_data[0].values())) # average relative time saved by increasing ratio gap from 0.1 to 1%
print(np.average(rel_data[1].values())) # average relative time saved by increasing ratio gap from 0.1 to 10%

In [ ]:
# obj
rel_data = [relative_values(data[0], data[i], idx=1) for i in range(1, len(dirnames))]
print(np.average(rel_data[0].values())) # average relative time saved by increasing ratio gap from 0.1 to 1%
print(np.average(rel_data[1].values())) # average relative time saved by increasing ratio gap from 0.1 to 10%

In [ ]:
# pref flow
rel_data = [relative_values(data[0], data[i], idx=2) for i in range(1, len(dirnames))]
print(np.average(rel_data[0].values())) # average relative time saved by increasing ratio gap from 0.1 to 1%
print(np.average(rel_data[1].values())) # average relative time saved by increasing ratio gap from 0.1 to 10%

In [ ]:
for i in range(len(dirnames)):
    _, _, _ = plt.hist([data[i][k][0] / inst_props[k]['n_arcs'] for k in data[i].keys()], bins=50, alpha=0.5)
#_, _, _ = plt.hist([data[0][k][0] / inst_props[k]['n_arcs'] for k in data[0].keys()], bins=50, alpha=0.5)
#_, _, _ = plt.hist([data[1][k][0] / inst_props[k]['n_arcs'] for k in data[1].keys()], bins=50, alpha=0.5)
#_, _, _ = plt.hist([data[2][k][0] / inst_props[k]['n_arcs'] for k in data[2].keys()], bins=50, alpha=0.5)

In [ ]:
labels = ['0.1%', '1%', '10%']
for i in range(len(dirnames)):
    _, _, _ = plt.hist([data[i][k][2] / inst_props[k]['n_arcs'] for k in data[i].keys()], bins=75, alpha=0.5, label=labels[i])
    
#_, _, _ = plt.hist([data[0][k][2] / inst_props[k]['n_arcs'] for k in data[0].keys()], bins=75, alpha=0.5, label='0.1%')
#_, _, _ = plt.hist([data[1][k][2] / inst_props[k]['n_arcs'] for k in data[1].keys()], bins=75, alpha=0.5, label='1%')
#_, _, _ = plt.hist([data[2][k][2] / inst_props[k]['n_arcs'] for k in data[2].keys()], bins=75, alpha=0.5, label='10%')
plt.title('Distribution of Arc-Normalized Preference Flows')
plt.xlabel('Value')
plt.ylabel('Population')
plt.legend()
plt.savefig('dist.png')

In [ ]:
for i in range(len(dirnames)):
    _, _, _ = plt.hist([data[i][k][2]for k in data[i].keys()], bins=100, alpha=0.5)
#_, _, _ = plt.hist([data[0][k][2]for k in data[0].keys()], bins=100, alpha=0.5)
#_, _, _ = plt.hist([data[1][k][2] for k in data[1].keys()], bins=100, alpha=0.5)
#_, _, _ = plt.hist([data[2][k][2] for k in data[2].keys()], bins=100, alpha=0.5)

In [ ]:
rel_data = [relative_values(data[0], data[i], idx=2) for i in range(1, len(dirnames))]
_, _, _ = plt.hist([rel_data[0][k] for k in rel_data[0].keys()], bins=100, alpha=0.5)
_, _, _ = plt.hist([rel_data[1][k] for k in rel_data[1].keys()], bins=100, alpha=0.5)

In [ ]:
# pref flow
obj_data = [relative_values(data[0], data[i], idx=1) for i in range(1, len(dirnames))]
# obj
flow_data = [relative_values(data[0], data[i], idx=2) for i in range(1, len(dirnames))]

ratios = []
ids = obj_data[0].keys()
for i in range(len(obj_data)):
    x = []
    for k in ids:
        #print(obj_data[i][k], flow_data[i][k])
        if obj_data[i][k] != 0.0:
            ratio = flow_data[i][k] / obj_data[i][k]
            if abs(ratio) < 1e4:
                x.append(ratio)
    ratios.append(x)

_, _, _ = plt.hist(ratios[0], bins=20, alpha=0.5)
_, _, _ = plt.hist(ratios[1], bins=20, alpha=0.5)
#ratios[1]

#ratios = [flow_data[i][k] / obj_data[i][k] if obj_data[i][k] > 0 for i in range(2) for k in obj_data.keys() ]

In [ ]: