Skip to content

Commit a5ca80b

Browse files
committed
Add getMemUsed, getMemTotal, and getMemExternEstim methods
1 parent 4c87d81 commit a5ca80b

4 files changed

Lines changed: 63 additions & 0 deletions

File tree

src/pyscipopt/scip.pxd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,11 @@ cdef extern from "blockmemshell/memory.h":
18221822
void BMScheckEmptyMemory()
18231823
long long BMSgetMemoryUsed()
18241824

1825+
cdef extern from "scip/scip_mem.h":
1826+
SCIP_Longint SCIPgetMemUsed(SCIP* scip)
1827+
SCIP_Longint SCIPgetMemTotal(SCIP* scip)
1828+
SCIP_Longint SCIPgetMemExternEstim(SCIP* scip)
1829+
18251830
cdef extern from "scip/scip_expr.h":
18261831
SCIP_RETCODE SCIPcreateExpr(SCIP* scip,
18271832
SCIP_EXPR** expr,

src/pyscipopt/scip.pxi

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11467,6 +11467,41 @@ cdef class Model:
1146711467

1146811468
locale.setlocale(locale.LC_NUMERIC,user_locale)
1146911469

11470+
def getMemUsed(self):
11471+
"""
11472+
Gets the total number of bytes used in block and buffer memory.
11473+
11474+
Returns
11475+
-------
11476+
int
11477+
11478+
"""
11479+
return SCIPgetMemUsed(self._scip)
11480+
11481+
def getMemTotal(self):
11482+
"""
11483+
Gets the total number of bytes in block and buffer memory
11484+
(i.e., total allocated, including unused).
11485+
11486+
Returns
11487+
-------
11488+
int
11489+
11490+
"""
11491+
return SCIPgetMemTotal(self._scip)
11492+
11493+
def getMemExternEstim(self):
11494+
"""
11495+
Gets the estimated number of bytes used by external software,
11496+
e.g., the LP solver.
11497+
11498+
Returns
11499+
-------
11500+
int
11501+
11502+
"""
11503+
return SCIPgetMemExternEstim(self._scip)
11504+
1147011505
def getNLPs(self):
1147111506
"""
1147211507
Gets total number of LPs solved so far.

src/pyscipopt/scip.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,9 @@ class Model:
11531153
def getNLPIterations(self) -> Incomplete: ...
11541154
def getNLPRows(self) -> Incomplete: ...
11551155
def getNLPs(self) -> Incomplete: ...
1156+
def getMemUsed(self) -> int: ...
1157+
def getMemTotal(self) -> int: ...
1158+
def getMemExternEstim(self) -> int: ...
11561159
def getNLeaves(self) -> Incomplete: ...
11571160
def getNLimSolsFound(self) -> Incomplete: ...
11581161
def getNNlRows(self) -> Incomplete: ...

tests/test_model.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,3 +642,23 @@ def test_getSolVal():
642642
m.getVal("not_a_var")
643643
with pytest.raises(TypeError):
644644
m.getSolVal(sol, "not_a_var")
645+
646+
647+
def test_memory_methods():
648+
m = Model()
649+
650+
# Memory values should be non-negative even on an empty model
651+
assert m.getMemUsed() >= 0
652+
assert m.getMemTotal() >= 0
653+
assert m.getMemExternEstim() >= 0
654+
655+
# Total allocated should be at least as much as actively used
656+
assert m.getMemTotal() >= m.getMemUsed()
657+
658+
# After adding variables and solving, memory usage should increase
659+
x = m.addVar("x", vtype="C", obj=1.0)
660+
m.addCons(x >= 0)
661+
m.optimize()
662+
663+
assert m.getMemUsed() > 0
664+
assert m.getMemTotal() > 0

0 commit comments

Comments
 (0)