Skip to content

Commit 97dc4a2

Browse files
committed
Pass names to HiGHS
1 parent e8b7df9 commit 97dc4a2

File tree

3 files changed

+27
-30
lines changed

3 files changed

+27
-30
lines changed

Diff for: include/pyoptinterface/highs_model.hpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717
B(Highs_writeSolution); \
1818
B(Highs_writeSolutionPretty); \
1919
B(Highs_addCol); \
20+
B(Highs_passColName); \
21+
B(Highs_getColName); \
2022
B(Highs_getNumCol); \
2123
B(Highs_changeColIntegrality); \
2224
B(Highs_deleteColsBySet); \
2325
B(Highs_addRow); \
26+
B(Highs_passRowName); \
27+
B(Highs_getRowName); \
2428
B(Highs_getNumRow); \
2529
B(Highs_deleteRowsBySet); \
2630
B(Highs_passHessian); \
@@ -216,9 +220,6 @@ class POIHighsModel
216220
// So we need to keep track of binary variables
217221
Hashset<IndexT> binary_variables;
218222

219-
// Store the names internally because use HiGHS API to set them is very expensive
220-
Hashmap<IndexT, std::string> m_var_names, m_con_names;
221-
222223
/* Highs part */
223224
std::unique_ptr<void, HighsfreemodelT> m_model;
224225

Diff for: lib/highs_model.cpp

+20-25
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ VariableIndex POIHighsModel::add_variable(VariableDomain domain, double lb, doub
174174
}
175175
if (name)
176176
{
177-
m_var_names.insert({variable.index, name});
177+
error = highs::Highs_passColName(m_model.get(), column, name);
178+
check_error(error);
178179
}
179180

180181
m_n_variables++;
@@ -196,7 +197,6 @@ void POIHighsModel::delete_variable(const VariableIndex &variable)
196197
binary_variables.erase(variable.index);
197198

198199
m_n_variables--;
199-
m_var_names.erase(variable.index);
200200
}
201201

202202
void POIHighsModel::delete_variables(const Vector<VariableIndex> &variables)
@@ -223,7 +223,6 @@ void POIHighsModel::delete_variables(const Vector<VariableIndex> &variables)
223223
for (int i = 0; i < n_variables; i++)
224224
{
225225
m_variable_index.delete_index(variables[i].index);
226-
m_var_names.erase(variables[i].index);
227226
}
228227
m_n_variables -= columns.size();
229228
}
@@ -297,7 +296,8 @@ ConstraintIndex POIHighsModel::add_linear_constraint(const ScalarAffineFunction
297296
}
298297
if (name)
299298
{
300-
m_con_names.insert({constraint.index, name});
299+
error = highs::Highs_passRowName(m_model.get(), row, name);
300+
check_error(error);
301301
}
302302

303303
m_n_constraints++;
@@ -324,7 +324,6 @@ void POIHighsModel::delete_constraint(const ConstraintIndex &constraint)
324324
check_error(error);
325325

326326
m_linear_constraint_index.delete_index(constraint.index);
327-
m_con_names.erase(constraint.index);
328327

329328
m_n_constraints--;
330329
}
@@ -632,20 +631,18 @@ double POIHighsModel::get_raw_info_double(const char *info_name)
632631

633632
std::string POIHighsModel::get_variable_name(const VariableIndex &variable)
634633
{
635-
auto iter = m_var_names.find(variable.index);
636-
if (iter != m_var_names.end())
637-
{
638-
return iter->second;
639-
}
640-
else
641-
{
642-
return fmt::format("x{}", variable.index);
643-
}
634+
auto column = _checked_variable_index(variable);
635+
char name[kHighsMaximumStringLength];
636+
auto error = highs::Highs_getColName(m_model.get(), column, name);
637+
check_error(error);
638+
return std::string(name);
644639
}
645640

646641
void POIHighsModel::set_variable_name(const VariableIndex &variable, const char *name)
647642
{
648-
m_var_names[variable.index] = name;
643+
auto column = _checked_variable_index(variable);
644+
auto error = highs::Highs_passColName(m_model.get(), column, name);
645+
check_error(error);
649646
}
650647

651648
VariableDomain POIHighsModel::get_variable_type(const VariableIndex &variable)
@@ -732,20 +729,18 @@ void POIHighsModel::set_variable_upper_bound(const VariableIndex &variable, doub
732729

733730
std::string POIHighsModel::get_constraint_name(const ConstraintIndex &constraint)
734731
{
735-
auto iter = m_con_names.find(constraint.index);
736-
if (iter != m_con_names.end())
737-
{
738-
return iter->second;
739-
}
740-
else
741-
{
742-
return fmt::format("con{}", constraint.index);
743-
}
732+
auto row = _checked_constraint_index(constraint);
733+
char name[kHighsMaximumStringLength];
734+
auto error = highs::Highs_getRowName(m_model.get(), row, name);
735+
check_error(error);
736+
return std::string(name);
744737
}
745738

746739
void POIHighsModel::set_constraint_name(const ConstraintIndex &constraint, const char *name)
747740
{
748-
m_con_names[constraint.index] = name;
741+
auto row = _checked_constraint_index(constraint);
742+
auto error = highs::Highs_passRowName(m_model.get(), row, name);
743+
check_error(error);
749744
}
750745

751746
double POIHighsModel::get_constraint_primal(const ConstraintIndex &constraint)

Diff for: tests/highs_writefile.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
model = highs.Model()
55

6-
x = model.add_m_variables(10, lb=0.0, ub=10.0)
7-
model.add_linear_constraint(poi.quicksum(x) >= 20.0)
6+
x = model.add_m_variables(10, name="x", lb=0.0, ub=10.0)
7+
model.add_linear_constraint(poi.quicksum(x) >= 20.0, name="con")
88

99
model.set_objective(poi.quicksum(v * v for v in x))
1010
model.optimize()
1111

12+
model.write("highs_test.lp")
1213
model.write("highs_test.sol")
1314
model.write("highs_test_pretty.sol", pretty=True)

0 commit comments

Comments
 (0)