Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 14 additions & 15 deletions demos/ex_1_basic_functionality.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import numpy as np
import pandas as pd
import cplex as cp

import slim_python as slim

#### LOAD DATA ####
Expand All @@ -15,8 +15,8 @@
data_csv_file = data_dir + data_name + '_processed.csv'

# load data file from csv
df = pd.read_csv(data_csv_file, sep = ',')
data = df.as_matrix()
df = pd.read_csv(data_csv_file, sep=',')
data = df.to_numpy()
data_headers = list(df.columns.values)
N = data.shape[0]

Expand Down Expand Up @@ -100,9 +100,9 @@
slim_IP.parameters.threads.set(1)
slim_IP.parameters.parallel.set(1)
slim_IP.parameters.output.clonelog.set(0)
slim_IP.parameters.mip.tolerances.mipgap.set(np.finfo(np.float).eps)
slim_IP.parameters.mip.tolerances.absmipgap.set(np.finfo(np.float).eps)
slim_IP.parameters.mip.tolerances.integrality.set(np.finfo(np.float).eps)
slim_IP.parameters.mip.tolerances.mipgap.set(np.finfo(np.cfloat).eps)
slim_IP.parameters.mip.tolerances.absmipgap.set(np.finfo(np.cfloat).eps)
slim_IP.parameters.mip.tolerances.integrality.set(np.finfo(np.cfloat).eps)
slim_IP.parameters.emphasis.mip.set(1)


Expand All @@ -114,7 +114,7 @@

#### CHECK RESULTS ####
slim_results = slim.get_slim_summary(slim_IP, slim_info, X, Y)
pprint(slim_results)
print(slim_results)

# print model
print(slim_results['string_model'])
Expand All @@ -123,11 +123,10 @@
print(slim_results['rho'])

# print accuracy metrics
print 'error_rate: %1.2f%%' % (100*slim_results['error_rate'])
print 'TPR: %1.2f%%' % (100*slim_results['true_positive_rate'])
print 'FPR: %1.2f%%' % (100*slim_results['false_positive_rate'])
print 'true_positives: %d' % slim_results['true_positives']
print 'false_positives: %d' % slim_results['false_positives']
print 'true_negatives: %d' % slim_results['true_negatives']
print 'false_negatives: %d' % slim_results['false_negatives']

print('error_rate: %1.2f%%' % (100 * slim_results['error_rate']))
print('TPR: %1.2f%%' % (100 * slim_results['true_positive_rate']))
print('FPR: %1.2f%%' % (100 * slim_results['false_positive_rate']))
print('true_positives: %d' % slim_results['true_positives'])
print('false_positives: %d' % slim_results['false_positives'])
print('true_negatives: %d' % slim_results['true_negatives'])
print('false_negatives: %d' % slim_results['false_negatives'])
20 changes: 10 additions & 10 deletions slim_python/SLIMCoefficientConstraints.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def check_numeric_input(self, input_name, input_value):
raise ValueError("length of %s is %d; should be %d" % (input_name, len(input_value), self.P))

else:
raise ValueError("user provided %s with an unsupported type" % (input_name))
raise ValueError("user provided %s with an unsupported type" % input_name)

def __init__(self, **kwargs):
if 'variable_names' in kwargs:
Expand Down Expand Up @@ -92,25 +92,25 @@ def check_set(self):

if self.ub[i] < self.lb[i]:
if self.print_flag:
print "fixed issue: ub < lb for variable %s" % self.variable_names[i]
print("fixed issue: ub < lb for variable %s" % self.variable_names[i])
ub = ub[i]
lb = lb[i]
self.ub[i] = lb
self.lb[i] = ub

if self.sign[i] > 0 and self.lb[i] < 0:
if self.sign[i] > 0 > self.lb[i]:
self.lb[i] = 0.0

if self.sign[i] < 0 and self.ub[i] > 0:
if self.sign[i] < 0 < self.ub[i]:
self.ub[i] = 0.0

if self.variable_names[i] in {'Intercept','(Intercept)', 'intercept', '(intercept)'}:
if self.C_0j[i] > 0 or np.isnan(self.C_0j[i]):
if self.print_flag:
print "found intercept variable with penalty value of C_0j = %1.4f" % self.C_0j[i]
print("found intercept variable with penalty value of C_0j = %1.4f" % self.C_0j[i])
if self.fix_flag:
if self.print_flag:
print "setting C_0j for intercept to 0.0 to ensure that intercept is not penalized"
print("setting C_0j for intercept to 0.0 to ensure that intercept is not penalized")
self.C_0j[i] = 0.0

def get_field_as_nparray(self, field_name):
Expand All @@ -127,13 +127,13 @@ def set_field(self, field_name, variable_names, field_values):

variable_names = [variable_names]
if type(field_values) is list:
if len(field_values) is 1:
if len(field_values) == 1:
pass
else:
raise ValueError("user provided multiple values for single field")

elif type(field_values) is np.ndarray:
if len(field_values) is 1:
if len(field_values) == 1:
pass
else:
raise ValueError("user provided multiple values for single field")
Expand Down Expand Up @@ -164,7 +164,7 @@ def set_field(self, field_name, variable_names, field_values):
curr_values[self_ind] = field_values[user_ind]
else:
if self.print_flag:
print "warning: Lset object does not contain variable with name: %s" % variable_name
print("warning: Lset object does not contain variable with name: %s" % variable_name)

if self.check_flag: self.check_set()
if self.print_flag: self.view()
Expand All @@ -178,4 +178,4 @@ def view(self):
x.add_column("lb", self.get_field_as_list('lb'))
x.add_column("ub", self.get_field_as_list('ub'))
x.add_column("C_0j", self.get_field_as_list('C_0j'))
print x
print(x)
5 changes: 2 additions & 3 deletions slim_python/create_slim_IP.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import cplex
import numpy as np
from math import ceil, floor
from helper_functions import *
from SLIMCoefficientConstraints import SLIMCoefficientConstraints
from .helper_functions import *
from .SLIMCoefficientConstraints import SLIMCoefficientConstraints

def create_slim_IP(input, print_flag = False):
"""
Expand Down
21 changes: 10 additions & 11 deletions slim_python/helper_functions.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import os
import sys
import time
import numpy as np
import cplex
import warnings
import cplex
import numpy as np
from prettytable import PrettyTable

#PRINTING AND LOGGING
def print_log(msg, print_flag = True):
if print_flag:
if type(msg) is str:
print ('%s | ' % (time.strftime("%m/%d/%y @ %I:%M %p", time.localtime()))) + msg
print(('%s | ' % (time.strftime("%m/%d/%y @ %I:%M %p", time.localtime()))) + msg)
else:
print '%s | %r' % (time.strftime("%m/%d/%y @ %I:%M %p", time.localtime()), msg)
print('%s | %r' % (time.strftime("%m/%d/%y @ %I:%M %p", time.localtime()), msg))
sys.stdout.flush()

def get_rho_string(rho, vtypes = 'I'):
Expand Down Expand Up @@ -359,15 +358,15 @@ def print_slim_model(rho, X_names, Y_name, show_omitted_variables = False):
m.align["Variable"] = "l"
m.align["Points"] = "r"
m.align["Tally"] = "r"
return(m)
return m

def get_rho_summary(rho, slim_info, X, Y):

#build a pretty table model
printed_model = print_slim_model(rho, X_names = slim_info['X_names'], Y_name = slim_info['Y_name'], show_omitted_variables = False)

#transform Y
y = np.array(Y.flatten(), dtype = np.float)
y = np.array(Y.flatten(), dtype=np.cfloat)
pos_ind = y == 1
neg_ind = ~pos_ind
N = len(Y)
Expand All @@ -376,7 +375,7 @@ def get_rho_summary(rho, slim_info, X, Y):

#get predictions
yhat = X.dot(rho) > 0
yhat = np.array(yhat, dtype = np.float)
yhat = np.array(yhat, dtype=np.cfloat)
yhat[yhat == 0] = -1

true_positives = np.sum(yhat[pos_ind] == 1)
Expand All @@ -399,7 +398,7 @@ def get_rho_summary(rho, slim_info, X, Y):
'L0_norm': np.sum(rho[slim_info['L0_reg_ind']]),
}

return(rho_summary)
return rho_summary

def get_slim_summary(slim_IP, slim_info, X, Y):

Expand Down Expand Up @@ -439,7 +438,7 @@ def get_slim_summary(slim_IP, slim_info, X, Y):
try:
rho = np.array(slim_IP.solution.get_values(slim_info['rho_idx']))
slim_summary.update(get_rho_summary(rho, slim_info, X, Y))
except CplexError as e:
except cplex.CplexError as e:
print_log(e)

return(slim_summary)
return slim_summary