Skip to content

Commit

Permalink
Merge branch 'release-0.3.0'
Browse files Browse the repository at this point in the history
PyPI-ready version
  • Loading branch information
judejeh committed Jul 21, 2021
2 parents 3db19b3 + 04569ac commit 58bb22f
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 53 deletions.
2 changes: 1 addition & 1 deletion LICENSE
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2021 Jude E.
Copyright (c) 2021 Jude Ejeh

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
99 changes: 51 additions & 48 deletions PyoSolveWrapper/SolveWrapper.py
Expand Up @@ -48,7 +48,7 @@ def __init__(self):
'time_limit': 1200,
'threads': 2,
'neos': False,
'verbosity': True,
'verbosity': False,
'debug_mode': False,
'solver_progress': True,
'write_solution': True,
Expand Down Expand Up @@ -97,12 +97,12 @@ def __init__(self, solver_name=None, solver_path=None, time_limit=None, threads=
self.result_precision = self.__apattr(result_precision, self.constants.var_defaults['result_precision'])

# Set other defaults
self.model_name_str = None
self.current_datetime_str = None
self.pyomo_version = pyoversion.version
self.pyutilib_version = self.__get_pkg_version("PyUtilib")
self.dependency_check_count = 1
self.dependency_check = self.__pyutilib_dependency_check()
self.__model_name_str = None
self.__current_datetime_str = None
self.__pyomo_version = pyoversion.version
self.__pyutilib_version = self.__get_pkg_version("PyUtilib")
self.__dependency_check_count = 1
self.__dependency_check = self.__pyutilib_dependency_check()
self.__DEF_registered_email = "pyosolvewrapper@gmail.com"
self.__DEF_REGEX = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
self.neos_registered_email = neos_registered_email
Expand Down Expand Up @@ -201,7 +201,10 @@ def __psmsg(self, *msg):
Custom status messages to print to stdout and stop execution
:param message: Error message to be printed
"""
self.__msg("INFO:", *msg, text_indent=1)
if self.verbosity:
self.__msg("INFO:", *msg, text_indent=1)
else:
pass

def __page_borders(self, bottom=False):
if self.verbosity:
Expand Down Expand Up @@ -242,31 +245,31 @@ def __get_pkg_version(self, pkg):
return None

def __pyutilib_dependency_check(self):
if self.dependency_check_count <= 3:
if self.pyomo_version == '5.6.8':
if '5.7.3' not in self.pyutilib_version:
if self.__dependency_check_count <= 3:
if self.__pyomo_version == '5.6.8':
if '5.7.3' not in self.__pyutilib_version:
system('pip install pyutilib==5.7.3')
self.pyutilib_version = self.__get_pkg_version("PyUtilib")
self.dependency_check_count += 1
self.__pyutilib_version = self.__get_pkg_version("PyUtilib")
self.__dependency_check_count += 1
self.__pyutilib_dependency_check()
else:
self.dependency_check = True
elif self.pyomo_version == '5.6.9':
if '5.8.0' not in self.pyutilib_version:
self.__dependency_check = True
elif self.__pyomo_version == '5.6.9':
if '5.8.0' not in self.__pyutilib_version:
system('pip install pyutilib==5.8.0')
self.pyutilib_version = self.__get_pkg_version("PyUtilib")
self.dependency_check_count += 1
self.__pyutilib_version = self.__get_pkg_version("PyUtilib")
self.__dependency_check_count += 1
self.__pyutilib_dependency_check()
else:
self.dependency_check = True
elif self.pyomo_version > '5.6.9':
if '6.0.0' not in self.pyutilib_version:
self.__dependency_check = True
elif self.__pyomo_version > '5.6.9':
if '6.0.0' not in self.__pyutilib_version:
system('pip install pyutilib==6.0.0')
self.pyutilib_version = self.__get_pkg_version("PyUtilib")
self.dependency_check_count += 1
self.__pyutilib_version = self.__get_pkg_version("PyUtilib")
self.__dependency_check_count += 1
self.__pyutilib_dependency_check()
else:
self.dependency_check = True
self.__dependency_check = True
else:
self.__pemsg("The right version of pyutilib could not be installed.")

Expand All @@ -276,21 +279,21 @@ def __set_tempdir(self, folder):
:param folder: path to folder
:return:
"""
if self.pyomo_version <= '5.7.1':
if self.__pyomo_version <= '5.7.1':
from pyutilib.services import TempfileManager
TempfileManager.tempdir = folder
else:
from pyomo.common.tempfiles import TempfileManager
TempfileManager.tempdir = folder

def __get_set_list(self, pyo_obj):
if self.pyomo_version < '5.7.0'[:len(self.pyomo_version)]:
if self.__pyomo_version < '5.7.0'[:len(self.__pyomo_version)]:
return [set for set in pyo_obj._index.set_tuple]
else:
return [set.name for set in pyo_obj._index.subsets()]

def __get_set_list_alt(self, pyo_obj):
if self.pyomo_version < '5.7.0'[:len(self.pyomo_version)]:
if self.__pyomo_version < '5.7.0'[:len(self.__pyomo_version)]:
return [set for set in pyo_obj.domain.set_tuple]
else:
return [set.name for set in pyo_obj.domain.subsets()]
Expand Down Expand Up @@ -359,7 +362,7 @@ def solve_model(self, model):

# Get model name
model_name = model.name
self.model_name_str = str(re.sub(" ", "_", model_name))
self.__model_name_str = str(re.sub(" ", "_", model_name))

# Solver name to lower case characters
self.solver_name = self.solver_name.lower()
Expand Down Expand Up @@ -409,22 +412,22 @@ def solve_model(self, model):

# Write log to file named <model_name>/DD_MM_YY_HH_MM_xx.log
# Create (if it does not exist) the '_log' folder
log_store_folder = path.join(log_folder, self.model_name_str, '')
log_store_folder = path.join(log_folder, self.__model_name_str, '')
if not path.exists(log_store_folder):
makedirs(log_store_folder)

self.current_datetime_str = datetime.now().strftime("%d_%m_%y_%H_%M_")
self.__current_datetime_str = datetime.now().strftime("%d_%m_%y_%H_%M_")
file_suffix = 0
# Results filename
if self.model_name_str == 'Unknown' or len(self.model_name_str) <= 10:
log_filename = self.model_name_str + self.current_datetime_str + str(file_suffix) + ".log"
if self.__model_name_str == 'Unknown' or len(self.__model_name_str) <= 10:
log_filename = self.__model_name_str + self.__current_datetime_str + str(file_suffix) + ".log"
else:
log_filename = self.model_name_str[:4] + '..' + self.model_name_str[-4:] + \
self.current_datetime_str + str(file_suffix) + ".log"
log_filename = self.__model_name_str[:4] + '..' + self.__model_name_str[-4:] + \
self.__current_datetime_str + str(file_suffix) + ".log"
while path.exists(log_store_folder + log_filename):
file_suffix += 1
log_filename = self.current_datetime_str + str(file_suffix) + ".log"
log_filename = self.current_datetime_str + str(file_suffix) + ".log"
log_filename = self.__current_datetime_str + str(file_suffix) + ".log"
log_filename = self.__current_datetime_str + str(file_suffix) + ".log"

# Solve <model> with/without writing final solution to stdout
processed_results = None
Expand Down Expand Up @@ -472,27 +475,27 @@ def _process_solver_results(self, model):

# Write solution to file named <model_name>/DD_MM_YY_HH_MM_xx.json
# Create (if it does not exist) the '_results_store' folder
results_store_folder = path.join('_results_store', self.model_name_str, '')
results_store_folder = path.join('_results_store', self.__model_name_str, '')
if not path.exists(results_store_folder):
makedirs(results_store_folder)

if self.pyomo_version <= '5.7.1':
if self.__pyomo_version <= '5.7.1':
model.solutions.store_to(self.solver_results) # define solutions storage folder
else:
pass
self.current_datetime_str = datetime.now().strftime("%d_%m_%y_%H_%M_")
self.__current_datetime_str = datetime.now().strftime("%d_%m_%y_%H_%M_")
file_suffix = 0
# Results filename
if self.model_name_str == 'Unknown' or len(self.model_name_str) <= 10:
result_filename = self.model_name_str + self.current_datetime_str + str(
if self.__model_name_str == 'Unknown' or len(self.__model_name_str) <= 10:
result_filename = self.__model_name_str + self.__current_datetime_str + str(
file_suffix) + ".json"
else:
result_filename = self.model_name_str[:4] + '..' + self.model_name_str[-4:] + \
self.current_datetime_str + str(file_suffix) + ".json"
result_filename = self.__model_name_str[:4] + '..' + self.__model_name_str[-4:] + \
self.__current_datetime_str + str(file_suffix) + ".json"
while path.exists(results_store_folder + result_filename):
file_suffix += 1
result_filename = self.current_datetime_str + str(file_suffix) + ".json"
result_filename = self.current_datetime_str + str(file_suffix) + ".json"
result_filename = self.__current_datetime_str + str(file_suffix) + ".json"
result_filename = self.__current_datetime_str + str(file_suffix) + ".json"
self.solver_results.write(filename=results_store_folder + result_filename, format="json")
else:
pass
Expand Down Expand Up @@ -539,7 +542,7 @@ def _process_solver_results(self, model):
final_result['solver']['gap'] = None

# Check state of available solution
if self.pyomo_version < '5.7.1':
if self.__pyomo_version < '5.7.1':
try:
for key, value in final_result['solver_results_def']['Solution'][0]['Objective'].items():
objective_value = value['Value']
Expand Down Expand Up @@ -622,7 +625,7 @@ def indexed_value_extract(index, object):
# print(par_set_lens)
# print(par_set_list)
# print(par_object_dim)
if self.pyomo_version < '5.7': # FIXME: Better way to do this?
if self.__pyomo_version < '5.7': # FIXME: Better way to do this?
final_result['parameters'][par][i - 1][j - 1] = par_object[i, j]
else:
final_result['parameters'][par][ind] = par_object[i, j]
Expand Down Expand Up @@ -677,7 +680,7 @@ def indexed_value_extract(index, object):
for ind, (i, j) in enumerate(getattr(model, str(set))):
# print(type(final_result['variables'][variable]),final_result['variables'][variable])
# print(i,j,final_result['variables'][variable][i-1][j-1])
if self.pyomo_version < '5.7': # FIXME: Better way to do this?
if self.__pyomo_version < '5.7': # FIXME: Better way to do this?
final_result['variables'][variable][i - 1][j - 1] = variable_object[i, j].value
else:
final_result['variables'][variable][ind] = variable_object[i, j].value
Expand Down
2 changes: 1 addition & 1 deletion PyoSolveWrapper/__init__.py
Expand Up @@ -6,4 +6,4 @@
# Copyright 2021 The Pyomo Solver Wrapper authors <https://github.com/judejeh>
# ---------------------------------------------------------------------------------

__all__ = ['SolveWrapper']
from PyoSolveWrapper.SolveWrapper import SolverWrapper
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -43,6 +43,7 @@ Solver.solver_path = '<PATH_TO_SOLVER>'
Note that whatever solver supplied should be compatible with Pyomo.

Where solvers are not locally installed, optimisation models may be solved using the [NEOS server](https://neos-server.org/neos/) if doing so for non-commercial purposes.
Note that for now, results are not post-processed.

**Finally**, the model can be solved as:
```
Expand Down
2 changes: 2 additions & 0 deletions setup.cfg
@@ -0,0 +1,2 @@
[metadata]
description-file = README.md
8 changes: 5 additions & 3 deletions setup.py
Expand Up @@ -6,14 +6,16 @@
# Copyright 2021 The Pyomo Solver Wrapper authors <https://github.com/judejeh>
# ---------------------------------------------------------------------------------

from setuptools import setup
from distutils.core import setup

setup(name='PyoSolveWrapper',
version='0.2.1',
packages=['PyoSolveWrapper'],
version='0.3.0',
description='Wrapper for Pyomo solve method',
url='https://github.com/judejeh/PyomoSolverWrapper',
download_url='https://github.com/judejeh/PyomoSolverWrapper/archive/refs/tags/v0.3.0.tar.gz',
author='Jude Ejeh, Solomon F. Brown',
author_email='j.ejeh@sheffield.ac.uk',
author_email='joe@judejeh.com',
license='MIT',
python_requires='>=3.5',
install_requires=[
Expand Down

0 comments on commit 58bb22f

Please sign in to comment.