Skip to content

Commit fd502c8

Browse files
committed
Add .close method to release the resource manually
1 parent f901b6b commit fd502c8

16 files changed

+96
-3
lines changed

include/pyoptinterface/copt_model.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ class COPTEnv
124124
COPTEnv(COPTEnvConfig &config);
125125
~COPTEnv();
126126

127+
void close();
128+
127129
private:
128130
copt_env *m_env;
129131

@@ -166,6 +168,7 @@ class COPTModel
166168
COPTModel() = default;
167169
COPTModel(const COPTEnv &env);
168170
void init(const COPTEnv &env);
171+
void close();
169172

170173
void write(const std::string &filename);
171174

include/pyoptinterface/gurobi_model.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,12 @@ class GurobiEnv
9494
void set_raw_parameter_string(const char *param_name, const char *value);
9595

9696
void start();
97+
void close();
9798

9899
void check_error(int error);
99100

100101
private:
101-
GRBenv *m_env;
102+
GRBenv *m_env = nullptr;
102103

103104
friend class GurobiModel;
104105
};
@@ -137,6 +138,7 @@ class GurobiModel
137138
GurobiModel() = default;
138139
GurobiModel(const GurobiEnv &env);
139140
void init(const GurobiEnv &env);
141+
void close();
140142

141143
void write(const std::string &filename);
142144

include/pyoptinterface/highs_model.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ class POIHighsModel
110110
public:
111111
POIHighsModel();
112112
void init();
113+
void close();
113114

114115
void write(const std::string &filename);
115116

include/pyoptinterface/ipopt_model.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct IpoptModel
4545
{
4646
/* Methods */
4747
IpoptModel();
48+
void close();
4849

4950
VariableIndex add_variable(double lb = -INFINITY, double ub = INFINITY, double start = 0.0,
5051
const char *name = nullptr);

include/pyoptinterface/mosek_model.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class MOSEKEnv
103103
public:
104104
MOSEKEnv();
105105
~MOSEKEnv();
106+
void close();
106107

107108
void putlicensecode(const std::vector<MSKint32t> &code);
108109

@@ -126,6 +127,7 @@ class MOSEKModel
126127
MOSEKModel() = default;
127128
MOSEKModel(const MOSEKEnv &env);
128129
void init(const MOSEKEnv &env);
130+
void close();
129131

130132
void write(const std::string &filename);
131133

lib/copt_model.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ void COPTModel::init(const COPTEnv &env)
143143
m_model = std::unique_ptr<copt_prob, COPTfreemodelT>(model);
144144
}
145145

146+
void COPTModel::close()
147+
{
148+
m_model.reset();
149+
}
150+
146151
void COPTModel::write(const std::string &filename)
147152
{
148153
int error;
@@ -1021,6 +1026,15 @@ COPTEnv::~COPTEnv()
10211026
check_error(error);
10221027
}
10231028

1029+
void COPTEnv::close()
1030+
{
1031+
if (m_env != nullptr)
1032+
{
1033+
copt::COPT_DeleteEnv(&m_env);
1034+
}
1035+
m_env = nullptr;
1036+
}
1037+
10241038
COPTEnvConfig::COPTEnvConfig()
10251039
{
10261040
if (!copt::is_library_loaded())

lib/copt_model_ext.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ NB_MODULE(copt_model_ext, m)
2020

2121
nb::class_<COPTEnvConfig>(m, "EnvConfig").def(nb::init<>()).def("set", &COPTEnvConfig::set);
2222

23-
nb::class_<COPTEnv>(m, "Env").def(nb::init<>()).def(nb::init<COPTEnvConfig &>());
23+
nb::class_<COPTEnv>(m, "Env")
24+
.def(nb::init<>())
25+
.def(nb::init<COPTEnvConfig &>())
26+
.def("close", &COPTEnv::close);
2427

2528
nb::class_<COPTModel>(m, "_RawModelBase");
2629

@@ -31,6 +34,7 @@ NB_MODULE(copt_model_ext, m)
3134
// clang-format off
3235
BIND_F(init)
3336
BIND_F(write)
37+
BIND_F(close)
3438
// clang-format on
3539

3640
.def("add_variable", &COPTModelMixin::add_variable,

lib/gurobi_model.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ void GurobiModel::init(const GurobiEnv &env)
180180
m_model = std::unique_ptr<GRBmodel, GRBfreemodelT>(model);
181181
}
182182

183+
void GurobiModel::close()
184+
{
185+
m_model.reset();
186+
}
187+
183188
void GurobiModel::write(const std::string &filename)
184189
{
185190
int error = gurobi::GRBwrite(m_model.get(), filename.c_str());
@@ -1069,7 +1074,7 @@ GurobiEnv::GurobiEnv(bool empty)
10691074

10701075
GurobiEnv::~GurobiEnv()
10711076
{
1072-
gurobi::GRBfreeenv(m_env);
1077+
close();
10731078
}
10741079

10751080
int GurobiEnv::raw_parameter_type(const char *param_name)
@@ -1101,6 +1106,15 @@ void GurobiEnv::start()
11011106
check_error(error);
11021107
}
11031108

1109+
void GurobiEnv::close()
1110+
{
1111+
if (m_env != nullptr)
1112+
{
1113+
gurobi::GRBfreeenv(m_env);
1114+
}
1115+
m_env = nullptr;
1116+
}
1117+
11041118
void GurobiEnv::check_error(int error)
11051119
{
11061120
if (error)

lib/gurobi_model_ext.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ NB_MODULE(gurobi_model_ext, m)
2323
.def(nb::init<bool>(), nb::arg("empty") = false)
2424
// clang-format off
2525
BIND_F(start)
26+
BIND_F(close)
2627
BIND_F(raw_parameter_type)
2728
BIND_F(set_raw_parameter_int)
2829
BIND_F(set_raw_parameter_double)
@@ -39,6 +40,7 @@ NB_MODULE(gurobi_model_ext, m)
3940
.def(nb::init<const GurobiEnv &>())
4041
// clang-format off
4142
BIND_F(init)
43+
BIND_F(close)
4244
BIND_F(write)
4345
// clang-format on
4446

lib/highs_model.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ void POIHighsModel::init()
114114
m_model = std::unique_ptr<void, HighsfreemodelT>(model);
115115
}
116116

117+
void POIHighsModel::close()
118+
{
119+
m_model.reset();
120+
}
121+
117122
void POIHighsModel::write(const std::string &filename)
118123
{
119124
auto error = highs::Highs_writeModel(m_model.get(), filename.c_str());

0 commit comments

Comments
 (0)