Source code for sasoptpy.session.workspace
import warnings
import sasoptpy
from sasoptpy.abstract.util import (
is_solve_statement, is_print_statement, is_create_data_statement)
[docs]class Workspace:
"""
Workspace represents an OPTMODEL block that allows multiple solves
Parameters
----------
name : string
Name of the workspace
session : :class:`saspy.SASsession` or :class:`swat.cas.connection.CAS`, optional
Session to be submitted
"""
def __init__(self, name, session=None):
self.name = name
self._load_workspace_defaults()
self._session = session
self.response = None
self._primalSolution = None
self._dualSolution = None
self.active_model = '_start_'
def _load_workspace_defaults(self):
self._elements = []
[docs] def get_elements(self):
"""
Returns a list of elements in the workspace
"""
return self._elements
[docs] def set_active_model(self, model):
"""
Marks the specified model as active; to be used in solve statements
Parameters
----------
model : :class:`Model`
Model to be activated
"""
self.active_model = model
def __str__(self):
return 'Workspace[ID={}]'.format(id(self))
def __repr__(self):
return 'sasoptpy.Workspace({})'.format(self.name)
def __enter__(self):
sasoptpy.lock.acquire()
self.original = sasoptpy.container
sasoptpy.container = self
return self
def __exit__(self, type, value, traceback):
sasoptpy.container = self.original
sasoptpy.lock.release()
[docs] def append(self, element):
"""
Appends a new element (operation or statement) to the workspace
Parameters
----------
element : :class:`sasoptpy.abstract.Statement`
Any statement that can be appended
"""
self._elements.append(element)
def set_session(self, session):
self._session = session
def get_session(self):
return self._session
[docs] def submit(self, **kwargs):
"""
Submits the workspace as an OPTMODEL block and returns solutions
"""
return sasoptpy.util.submit(self, **kwargs)
[docs] def parse_solve_responses(self):
"""
Retrieves the solutions to all solve statements
"""
keys = self.response.keys()
solve_statements = [i for i in self.get_elements() if
is_solve_statement(i)]
for i, solve in enumerate(solve_statements):
ps_key = 'Solve{}.ProblemSummary'.format(i+1)
ss_key = 'Solve{}.SolutionSummary'.format(i+1)
ps = None
ss = None
if ps_key in keys:
ps = sasoptpy.interface.parse_optmodel_table(
self.response[ps_key])
if ss_key in keys:
ss = sasoptpy.interface.parse_optmodel_table(
self.response[ss_key])
if isinstance(solve, sasoptpy.abstract.SolveStatement):
solve.set_response(problem_summary=ps, solution_summary=ss)
elif isinstance(solve, sasoptpy.abstract.Statement):
solve.set_response(ss)
[docs] def parse_print_responses(self):
"""
Retrieves responses to all print statements
"""
keys = self.response.keys()
print_statements = [i for i in self.get_elements() if
is_print_statement(i)]
for i, p in enumerate(print_statements):
pp_key = 'Print{}.PrintTable'.format(i+1)
if pp_key in keys:
if isinstance(p, sasoptpy.abstract.Statement):
p.set_response(self.response[pp_key])
def parse_create_data_responses(self, mediator):
"""
Grabs responses to all print statements
"""
keys = self.response.keys()
cd_statements = [i for i in self.get_elements() if
is_create_data_statement(i)]
session = self._session
for i, c in enumerate(cd_statements):
table = c.get_table_expr()
try:
tabledf = mediator.parse_table(table)
c.set_response(tabledf)
except:
continue
[docs] def get_variable(self, name):
"""
Obtains the value of a specified variable name
Parameters
----------
name : string
Name of the variable
"""
vars = filter(
lambda i: isinstance(i, sasoptpy.Variable), self.get_elements())
variable = list(filter(lambda i: i.get_name() == name, vars))
if len(variable) > 1:
warnings.warn('More than one variable has name {}'.format(name),
UserWarning)
if len(variable) >= 1:
return variable[0]
vg = list(filter(
lambda i: isinstance(i, sasoptpy.VariableGroup) and
i.get_name() == name, self.get_elements()))
if len(vg) > 1:
warnings.warn(
'More than one variable group has name {}'.format(name),
UserWarning)
if len(vg) >= 1:
return vg[0]
if '[' in name:
group_name = sasoptpy.util.get_group_name(name)
group = self.get_variable(group_name)
if group:
return group.get_member_by_name(name)
return None
[docs] def set_variable_value(self, name, value):
"""
Specifies the value of a variable
Parameters
----------
name : string
Name of the variable
value : float
New value of the variable
"""
variable = self.get_variable(name)
if variable is not None:
variable.set_value(value)
[docs] def to_optmodel(self):
"""
Returns equivalent OPTMODEL code of the workspace
Returns
-------
optmodel : string
Generated OPTMODEL code of the workspace object
"""
return sasoptpy.to_optmodel(self)