Source code for tests.abstract.statement.test_solve
#!/usr/bin/env python
# encoding: utf-8
#
# Copyright SAS Institute
#
# Licensed under the Apache License, Version 2.0 (the License);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""
Unit test for solve statements.
"""
import os
import sys
import unittest
import warnings
import sasoptpy as so
from inspect import cleandoc
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.abspath(os.path.join(current_dir, '../..')))
from util import assert_equal_wo_temps
from sasoptpy.actions import solve, print_item
from tests.swat_config import create_cas_connection
[docs]class TestSolve(unittest.TestCase):
"""
Unit tests for SOLVE statements
"""
@classmethod
def setUpClass(cls):
so.reset()
cls.conn = None
from swat import CAS, SWATError
try:
cls.conn = create_cas_connection()
except SWATError:
warnings.warn('CAS connection is not available', RuntimeWarning)
except TypeError:
warnings.warn('CAS variables are not available', RuntimeWarning)
@classmethod
def tearDownClass(cls):
if cls.conn is not None:
cls.conn.close()
def setUp(self):
so.reset()
def test_regular_solve(self):
with so.Workspace('w') as w:
x = so.Variable(name='x', lb=1, ub=10)
o = so.Objective(2*x, sense=so.maximize, name='obj')
s = solve()
p = print_item(x)
assert_equal_wo_temps(self, so.to_optmodel(w), cleandoc('''
proc optmodel;
var x >= 1 <= 10;
max obj = 2 * x;
solve;
print x;
quit;'''))
if TestSolve.conn:
w.set_session(TestSolve.conn)
w.submit()
self.assertEqual(str(p.get_response()), cleandoc('''
x
0 10.0'''))
self.assertEqual(str(s.get_response()['Problem Summary']), cleandoc('''
Problem Summary
Value
Label
Objective Sense Maximization
Objective Function obj
Objective Type Linear
Number of Variables 1
Bounded Above 0
Bounded Below 0
Bounded Below and Above 1
Free 0
Fixed 0
Number of Constraints 0
Constraint Coefficients 0'''))
def test_with_model(self):
def produce_order_error():
with so.Workspace('w') as w:
m = so.Model(name='m')
x = so.Variable(name='x')
m.solve()
m.include(x)
m.solve()
self.assertRaises(ReferenceError, produce_order_error)
so.reset()
with so.Workspace('w') as w:
x = so.Variable(name='x')
m = so.Model(name='m')
m.include(x)
m.solve()
self.assertEqual(so.to_optmodel(w), cleandoc('''
proc optmodel;
var x;
problem m include x;
use problem m;
solve;
quit;'''))
def test_with_options(self):
with so.Workspace('w') as w:
solve()
solve(options={'with': 'milp'})
solve(options={'with': 'milp'}, primalin=True)
solve(options={'with': 'milp', 'presolver': None, 'feastol': 1e-6,
'logfreq': 2, 'maxsols': 3, 'scale': 'automatic',
'restarts': None, 'cutmir': 'aggressive'})
self.assertEqual(so.to_optmodel(w), cleandoc('''
proc optmodel;
solve;
solve with milp;
solve with milp / primalin;
solve with milp / presolver=None feastol=1e-06 logfreq=2 maxsols=3 scale=automatic restarts=None cutmir=aggressive;
quit;'''))
def test_warning_without_abstract(self):
def solve_without_abstract():
m = so.Model(name='m1')
x = m.add_variable(name='x')
m.set_objective(2*x, name='o')
solve()
self.assertWarns(UserWarning, solve_without_abstract)