-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathps_infer.py
More file actions
61 lines (47 loc) · 2.07 KB
/
ps_infer.py
File metadata and controls
61 lines (47 loc) · 2.07 KB
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
import pickle
import cplex
from config import *
def evaluate(filepath,prepath,exp_dir,timelimit,method,perc):
# parameters
m = cplex.Cplex(filepath)
logfile = os.path.join(exp_dir,os.path.basename(filepath)+'.log')
logstring = open(logfile, 'w')
m.set_log_stream(logstring)
m.set_results_stream(logstring)
m.set_warning_stream(logstring)
# instance_cpx.set_error_stream(logstring)
m.set_error_stream(open(os.devnull, 'w'))
""" Set CPLEX parameters, if any """
m.parameters.timelimit.set(timelimit)
m.parameters.emphasis.mip.set(1)
m.parameters.mip.display.set(3)
m.parameters.threads.set(1)
m.parameters.workmem.set(1024)
m.parameters.mip.limits.treememory.set(20000)
m.parameters.mip.strategy.file.set(2)
m.parameters.workdir.set('./temp')
os.makedirs('./temp', exist_ok=True)
# read prediction
data = pickle.load(open(prepath,'rb'))
pre = data['pre']
reorderInds = data['reorderInds']
biInds = data['biInds']
var_names = m.variables.get_names()
var_ind_pairs = [ [step,varname] for step,varname in enumerate(var_names)]
var_ind_pairs.sort(key=lambda x:x[1])
var_ind_pairs = np.array(var_ind_pairs)[biInds][reorderInds].tolist()
var_ind_pre_tuples = [ [var_ind_pairs[i][0],var_ind_pairs[i][1],pre[i]] for i in range(len(var_ind_pairs))]
var_ind_pre_tuples.sort(key=lambda x: abs(0.5-x[2]), reverse=True )
varInds = [ var_ind_pre_tuples[i][1] for i in range(int(len(var_ind_pairs)*perc))]
coefs = np.array([1 if var_ind_pre_tuples[i][2]<0.5 else -1 for i in range(int(len(var_ind_pairs) * perc))])
rhs = (coefs<0).sum()
rad = 0
if('PS' in method):
pres = [var_ind_pre_tuples[i][2] if var_ind_pre_tuples[i][2]<0.5 else 1-var_ind_pre_tuples[i][2] for i in range(int(len(var_ind_pairs) * perc))]
rad = round(sum(pres)+0.5)
m.linear_constraints.add(
lin_expr=[[varInds,coefs.tolist()]],
senses=['L'],
rhs=[float(rad - rhs)],
names=['fixing'])
m.solve()