Skip to content

Commit c8e7e15

Browse files
authored
[KNITRO] Add support for retrieving variable domain (metab0t#81)
* feat: add get_variable_domain method to KNITRO. * feat: add variable domain test * doc: add variable domain get.
1 parent e7964ea commit c8e7e15

6 files changed

Lines changed: 40 additions & 8 deletions

File tree

docs/source/attribute/knitro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
-
8484
-
8585
* - Domain
86-
-
86+
-
8787
-
8888
* - PrimalStart
8989
-

include/pyoptinterface/knitro_model.hpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@
2222
B(KN_new); \
2323
B(KN_free); \
2424
B(KN_update); \
25+
B(KN_solve); \
2526
B(KN_get_param_id); \
2627
B(KN_get_param_type); \
2728
B(KN_set_int_param); \
2829
B(KN_set_char_param); \
2930
B(KN_set_double_param); \
3031
B(KN_get_int_param); \
3132
B(KN_get_double_param); \
32-
B(KN_add_vars); \
3333
B(KN_add_var); \
34-
B(KN_add_cons); \
3534
B(KN_add_con); \
3635
B(KN_set_var_lobnd); \
3736
B(KN_set_var_upbnd); \
@@ -43,7 +42,6 @@
4342
B(KN_get_var_name); \
4443
B(KN_set_con_lobnd); \
4544
B(KN_set_con_upbnd); \
46-
B(KN_set_con_eqbnd); \
4745
B(KN_get_con_lobnd); \
4846
B(KN_get_con_upbnd); \
4947
B(KN_set_con_name); \
@@ -54,10 +52,8 @@
5452
B(KN_add_obj_constant); \
5553
B(KN_del_obj_constant); \
5654
B(KN_add_obj_linear_struct); \
57-
B(KN_del_obj_linear_struct); \
5855
B(KN_del_obj_linear_struct_all); \
5956
B(KN_add_obj_quadratic_struct); \
60-
B(KN_del_obj_quadratic_struct); \
6157
B(KN_del_obj_quadratic_struct_all); \
6258
B(KN_chg_obj_linear_term); \
6359
B(KN_add_con_constant); \
@@ -71,7 +67,6 @@
7167
B(KN_set_cb_grad); \
7268
B(KN_set_cb_hess); \
7369
B(KN_del_obj_eval_callback_all); \
74-
B(KN_solve); \
7570
B(KN_get_var_primal_value); \
7671
B(KN_get_var_dual_value); \
7772
B(KN_get_con_value); \
@@ -324,6 +319,21 @@ inline int knitro_var_type(VariableDomain domain)
324319
}
325320
}
326321

322+
inline VariableDomain knitro_variable_domain(int var_type)
323+
{
324+
switch (var_type)
325+
{
326+
case KN_VARTYPE_CONTINUOUS:
327+
return VariableDomain::Continuous;
328+
case KN_VARTYPE_INTEGER:
329+
return VariableDomain::Integer;
330+
case KN_VARTYPE_BINARY:
331+
return VariableDomain::Binary;
332+
default:
333+
throw std::runtime_error("Unknown variable type");
334+
}
335+
}
336+
327337
inline int knitro_obj_goal(ObjectiveSense sense)
328338
{
329339
switch (sense)
@@ -423,6 +433,7 @@ class KNITROModel : public OnesideLinearConstraintMixin<KNITROModel>,
423433
std::string get_variable_name(const VariableIndex &variable) const;
424434
void set_variable_name(const VariableIndex &variable, const std::string &name);
425435
void set_variable_domain(const VariableIndex &variable, VariableDomain domain);
436+
VariableDomain get_variable_domain(const VariableIndex &variable) const;
426437
double get_variable_rc(const VariableIndex &variable) const;
427438
std::string pprint_variable(const VariableIndex &variable) const;
428439

lib/knitro_model.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,13 @@ void KNITROModel::set_variable_domain(const VariableIndex &variable, VariableDom
290290
_mark_dirty();
291291
}
292292

293+
VariableDomain KNITROModel::get_variable_domain(const VariableIndex &variable) const
294+
{
295+
KNINT indexVar = _variable_index(variable);
296+
int var_type = _get_value<KNINT, int>(knitro::KN_get_var_type, indexVar);
297+
return knitro_variable_domain(var_type);
298+
}
299+
293300
double KNITROModel::get_variable_rc(const VariableIndex &variable) const
294301
{
295302
_check_dirty();

lib/knitro_model_ext.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ NB_MODULE(knitro_model_ext, m)
6464
BIND_F(get_variable_name)
6565
BIND_F(set_variable_name)
6666
BIND_F(set_variable_domain)
67+
BIND_F(get_variable_domain)
6768
BIND_F(get_variable_rc)
6869
BIND_F(delete_variable)
6970
// clang-format on

src/pyoptinterface/_src/knitro.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def autoload_library():
106106
VariableAttribute.LowerBound: lambda model, v: model.get_variable_lb(v),
107107
VariableAttribute.UpperBound: lambda model, v: model.get_variable_ub(v),
108108
VariableAttribute.Name: lambda model, v: model.get_variable_name(v),
109+
VariableAttribute.Domain: lambda model, v: model.get_variable_domain(v),
109110
VariableAttribute.ReducedCost: lambda model, v: model.get_variable_rc(v),
110111
}
111112

tests/test_knitro.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,20 +484,32 @@ def test_variable_attribute_primal_start():
484484

485485

486486
def test_variable_attribute_domain():
487-
"""Test setting variable domain."""
487+
"""Test getting and setting variable domain."""
488488
model = knitro.Model()
489489
x = model.add_variable(lb=0.0, ub=10.0)
490490

491+
# Default domain should be Continuous
492+
domain = model.get_variable_attribute(x, poi.VariableAttribute.Domain)
493+
assert domain == poi.VariableDomain.Continuous
494+
495+
# Set to Integer and verify
491496
model.set_variable_attribute(
492497
x, poi.VariableAttribute.Domain, poi.VariableDomain.Integer
493498
)
499+
domain = model.get_variable_attribute(x, poi.VariableAttribute.Domain)
500+
assert domain == poi.VariableDomain.Integer
494501

495502
model.set_objective(x, poi.ObjectiveSense.Minimize)
496503
model.add_linear_constraint(x, poi.ConstraintSense.GreaterEqual, 2.5)
497504
model.optimize()
498505

499506
assert model.get_value(x) == approx(3.0)
500507

508+
# Test Binary domain
509+
y = model.add_variable(domain=poi.VariableDomain.Binary)
510+
domain = model.get_variable_attribute(y, poi.VariableAttribute.Domain)
511+
assert domain == poi.VariableDomain.Binary
512+
501513

502514
def test_constraint_attribute_name():
503515
"""Test getting and setting constraint name."""

0 commit comments

Comments
 (0)