Skip to content

Commit 653220a

Browse files
authored
Merge pull request #3488 from Utkarsh-Detha/master
mosek_direct.py : Fixed iparam parsing and added support for Task.putparam
2 parents ae2750e + 11f744b commit 653220a

File tree

2 files changed

+77
-14
lines changed

2 files changed

+77
-14
lines changed

pyomo/solvers/plugins/solvers/mosek_direct.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,28 @@ def _process_stream(msg):
163163
for key, option in self.options.items():
164164
try:
165165
param = key.split('.')
166-
if param[0] == 'mosek':
167-
param.pop(0)
168-
param = getattr(mosek, param[0])(param[1])
169-
if 'sparam' in key.split('.'):
170-
self._solver_model.putstrparam(param, option)
171-
elif 'dparam' in key.split('.'):
172-
self._solver_model.putdouparam(param, option)
173-
elif 'iparam' in key.split('.'):
174-
if isinstance(option, str):
175-
option = option.split('.')
176-
if option[0] == 'mosek':
177-
option.pop('mosek')
178-
option = getattr(mosek, option[0])(option[1])
179-
else:
166+
if key == param[0]:
167+
self._solver_model.putparam(key, option)
168+
else:
169+
if param[0] == 'mosek':
170+
param.pop(0)
171+
assert (
172+
len(param) == 2
173+
), "unrecognized MOSEK parameter name '{}'".format(key)
174+
param = getattr(mosek, param[0])(param[1])
175+
if 'sparam.' in key:
176+
self._solver_model.putstrparam(param, option)
177+
elif 'dparam.' in key:
178+
self._solver_model.putdouparam(param, option)
179+
elif 'iparam.' in key:
180+
if isinstance(option, str):
181+
option = option.split('.')
182+
if option[0] == 'mosek':
183+
option.pop(0)
184+
option = getattr(mosek, option[0])(option[1])
180185
self._solver_model.putintparam(param, option)
186+
else:
187+
raise ValueError(f"unrecognized MOSEK parameter name '{key}'")
181188
except (TypeError, AttributeError):
182189
raise
183190
try:

pyomo/solvers/tests/checks/test_MOSEKDirect.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,62 @@ def test_conic_duals(self):
313313
results.Solution.constraint['x11']['Dual'][i], check[i], 5
314314
)
315315

316+
def test_solver_parameters(self):
317+
import mosek
318+
319+
solver = pyo.SolverFactory('mosek_direct')
320+
model = self._test_model()
321+
solver.solve(
322+
model,
323+
options={
324+
'dparam.optimizer_max_time': 1.0,
325+
'iparam.intpnt_solve_form': mosek.solveform.dual,
326+
'mosek.iparam.intpnt_max_iterations': 10,
327+
'MSK_DPAR_INTPNT_CO_TOL_REL_GAP': '1.0e-7',
328+
'MSK_IPAR_PRESOLVE_USE': '0',
329+
'sparam.param_comment_sign': '##',
330+
},
331+
)
332+
# Check if iparams were set correctly
333+
self.assertEqual(
334+
solver._solver_model.getintparam(mosek.iparam.intpnt_solve_form),
335+
mosek.solveform.dual,
336+
)
337+
self.assertEqual(
338+
solver._solver_model.getintparam(mosek.iparam.intpnt_max_iterations), 10
339+
)
340+
self.assertEqual(
341+
solver._solver_model.getintparam(mosek.iparam.presolve_use),
342+
mosek.presolvemode.off,
343+
)
344+
# Check if dparams were set correctly
345+
self.assertEqual(
346+
solver._solver_model.getdouparam(mosek.dparam.optimizer_max_time), 1.0
347+
)
348+
self.assertEqual(
349+
solver._solver_model.getdouparam(mosek.dparam.intpnt_co_tol_rel_gap), 1.0e-7
350+
)
351+
# Check if sparam is set correctly
352+
self.assertEqual(
353+
solver._solver_model.getstrparam(mosek.sparam.param_comment_sign)[1], '##'
354+
)
355+
# Check for TypeErrors
356+
with self.assertRaises(TypeError) as typeCheck:
357+
solver.solve(model, options={'mosek.dparam.intpnt_co_tol_rel_gap': '1.4'})
358+
with self.assertRaises(TypeError) as typeCheck:
359+
solver.solve(model, options={'iparam.log': 1.2})
360+
# Check for AttributeError
361+
with self.assertRaises(AttributeError) as assertCheck:
362+
solver.solve(model, options={'wrong.name': '1'})
363+
with self.assertRaises(AttributeError) as typeCheck:
364+
solver.solve(model, options={'mosek.iparam.log': 'mosek.wrong.input'})
365+
# Check for wrong parameter name (but valid MOSEK attribute)
366+
with self.assertRaises(ValueError) as typeCheck:
367+
solver.solve(model, options={'mosek.mark.up': 'wrong.val'})
368+
# Check for parameter names with wrong length
369+
with self.assertRaises(AssertionError) as typeCheck:
370+
solver.solve(model, options={'mosek.iparam.log.level': 10})
371+
316372

317373
if __name__ == "__main__":
318374
unittest.main()

0 commit comments

Comments
 (0)