From de8fa7227a00f0568e5c61369ec6a9874a266cad Mon Sep 17 00:00:00 2001 From: Stefan Heid Date: Wed, 18 Oct 2023 13:34:40 +0200 Subject: [PATCH] Updated code to work with python 3 (tested with 3.11) --- demos/ex_1_basic_functionality.py | 29 +++++++++++------------ slim_python/SLIMCoefficientConstraints.py | 20 ++++++++-------- slim_python/create_slim_IP.py | 5 ++-- slim_python/helper_functions.py | 21 ++++++++-------- 4 files changed, 36 insertions(+), 39 deletions(-) diff --git a/demos/ex_1_basic_functionality.py b/demos/ex_1_basic_functionality.py index 264daa9..06a77d9 100644 --- a/demos/ex_1_basic_functionality.py +++ b/demos/ex_1_basic_functionality.py @@ -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 #### @@ -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] @@ -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) @@ -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']) @@ -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']) diff --git a/slim_python/SLIMCoefficientConstraints.py b/slim_python/SLIMCoefficientConstraints.py index a4ec50f..710e0f1 100644 --- a/slim_python/SLIMCoefficientConstraints.py +++ b/slim_python/SLIMCoefficientConstraints.py @@ -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: @@ -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): @@ -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") @@ -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() @@ -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 \ No newline at end of file + print(x) diff --git a/slim_python/create_slim_IP.py b/slim_python/create_slim_IP.py index 1fa072f..c3383cc 100644 --- a/slim_python/create_slim_IP.py +++ b/slim_python/create_slim_IP.py @@ -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): """ diff --git a/slim_python/helper_functions.py b/slim_python/helper_functions.py index ac21e4e..949b318 100644 --- a/slim_python/helper_functions.py +++ b/slim_python/helper_functions.py @@ -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'): @@ -359,7 +358,7 @@ 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): @@ -367,7 +366,7 @@ def get_rho_summary(rho, slim_info, X, Y): 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) @@ -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) @@ -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): @@ -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) \ No newline at end of file + return slim_summary