/
sim_mlca.py
142 lines (122 loc) · 5.17 KB
/
sim_mlca.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import argparse
import glob
import json
import logging
import os
import re
from collections import defaultdict
import sys
from sklearn.preprocessing import MinMaxScaler
from mlca.mlca_mechanism import mechanism
from mlca.mlca_util import create_value_model
from util import StreamToLogger
def load_HPO_winners(dir: str, domain: str, q: float):
results = defaultdict(lambda: defaultdict(dict))
for file in glob.glob(os.path.join(dir, '*')):
if file.endswith('.json'):
hpo_winner = json.load(open(file))
config_key = [key for key in hpo_winner.keys() if 'config' in key][0]
config = hpo_winner[config_key]
q_eval = float(re.findall('0\.[0-9.]{1,2}', file)[0])
config['layer_type'] = 'MVNNLayerReLUProjected'
results[config['SATS_domain']][q_eval][config['bidder_type']] = config
return results[domain][q]
def main(domain: str,
q: float,
seed: int,
acquisition: str
):
# 1. Create directory for results
res_path = os.path.join(os.getcwd(),
'results',
domain,
str(q),
str(seed),
acquisition
)
os.makedirs(res_path, exist_ok=False)
# --------------------------------------
# 2. Clear existing logger
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
# --------------------------------------
# 3. Define logger and log current STATUS_MSG
logging.basicConfig(level=logging.INFO,
datefmt='%Y-%m-%d %H:%M:%S',
format='%(asctime)s: %(message)s',
filename=os.path.join(res_path, 'log.txt'),
filemode='w'
)
log = logging.getLogger('log')
# Nice solution to add the stdout and stderr to logging from here
# https://stackoverflow.com/a/39215961
sys.stdout = StreamToLogger(log, logging.INFO)
sys.stderr = StreamToLogger(log, logging.ERROR)
# --------------------------------------
# 4. Loading HPO MVNN Winners
NN_parameters = load_HPO_winners(os.path.join(os.getcwd(),'hpo_results_mvnnUB4','winner'),
domain=domain,
q=q)
value_model = create_value_model(domain)
NN_parameters = value_model.parameters_to_bidder_id(NN_parameters)
scaler = MinMaxScaler(feature_range=(0, 500))
# --------------------------------------
# 5. SET BOCA PARAMETERS:
Qinit = 40 # number of initial queries sampled uniformly at random
Qmax = 100 # number of queries asked in total (i.e., query budget)
Qround = 4 # number of queries asked in each MLCA round (Qround-1 marginal economy queries and 1 main economy query)
separate_economy_training = False # MVNNs trained seperately for each economy (default=True)
new_query_option = 'restricted_MIP'
balanced_global_marginals = True # balanced sampling of marginal economies such that at the end of the auction one has asked approximately the same number of queries in each marginalo economy.
parallelize_training = True
# -------------------
# 6. SET MIP PARAMETERS:
MIP_parameters = {
'bigM': 2000,
'mip_bounds_tightening': None,
'warm_start': False,
'time_limit': 600,
'relative_gap': 5e-3,
'integrality_tol': 1e-6,
'feasibility_tol': 1e-9,
'attempts_DNN_WDP': 5
}
# -------------------
# 6. SET RandomSearch (RS) PARAMETERS:
RS_parameters = {
'attempts': 10000,
'weight_uUB_acquisition': 0.95
}
# -------------------
# 7. Run BOCA mechanism, OUR-MEAN-MVNN-MLCA mechanism, or RS.
kwargs = {
'SATS_domain_name': value_model.name.upper(),
'SATS_auction_instance_seed': seed,
'Qinit': Qinit,
'Qmax': Qmax,
'Qround': Qround,
'separate_economy_training': separate_economy_training, # NEW parameter
'new_query_option': new_query_option, # NEW parameter
'balanced_global_marginals': balanced_global_marginals, # NEW parameter
'parallelize_training': parallelize_training, # NEW parameter
'acquisition':acquisition, # NEW parameter
'NN_parameters': NN_parameters,
'MIP_parameters': MIP_parameters,
'RS_parameters':RS_parameters,
'scaler': scaler,
'init_bids_and_fitted_scaler': [None, None],
'calc_efficiency_per_iteration': True,
'isLegacy': False,
'local_scaling_factor': 1.0,
'res_path': res_path
}
mechanism(**kwargs)
# -------------------
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='MLCA')
parser.add_argument('--domain', type=str, choices=['LSVM', 'SRVM', 'MRVM'])
parser.add_argument('--q', type=float, choices=[0.6, 0.75, 0.9, 0.95])
parser.add_argument('--seed', type=int)
parser.add_argument('--acquisition', type=str, choices=['uUB_model','mean_model'])
args = parser.parse_args()
main(domain=args.domain, seed=args.seed, q=args.q, acquisition=args.acquisition)