Skip to content

Commit

Permalink
Fix dropEvent bug (#828)
Browse files Browse the repository at this point in the history
* Fix weakly referenced object no longer exists

Co-authored-by: Mohammed Ghannam <ghannam@zib.de>

* Update CHANGELOG

---------

Co-authored-by: Mohammed Ghannam <ghannam@zib.de>
  • Loading branch information
Joao-Dionisio and mmghannam committed Apr 1, 2024
1 parent 9e16f75 commit 1f858fe
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- Add SCIP function SCIPgetTreesizeEstimation and wrapper getTreesizeEstimation
- Add recipes sub-package
### Fixed
- Fixed "weakly-referenced object no longer exists" when calling dropEvent in test_customizedbenders
- Fixed incorrect writing/printing when user had a non-default locale
### Changed
### Removed
Expand Down
4 changes: 4 additions & 0 deletions src/pyscipopt/scip.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -4861,6 +4861,8 @@ cdef class Model:
_eventhdlr = SCIPfindEventhdlr(self._scip, n)
else:
raise Warning("event handler not found")

Py_INCREF(self)
PY_SCIP_CALL(SCIPcatchEvent(self._scip, eventtype, _eventhdlr, NULL, NULL))

def dropEvent(self, eventtype, Eventhdlr eventhdlr):
Expand All @@ -4871,6 +4873,8 @@ cdef class Model:
_eventhdlr = SCIPfindEventhdlr(self._scip, n)
else:
raise Warning("event handler not found")

Py_DECREF(self)
PY_SCIP_CALL(SCIPdropEvent(self._scip, eventtype, _eventhdlr, NULL, -1))

def catchVarEvent(self, Variable var, eventtype, Eventhdlr eventhdlr):
Expand Down
5 changes: 3 additions & 2 deletions tests/test_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ def eventinit(self):
calls.append('eventinit')
self.model.catchEvent(self.event_type, self)

#def eventexit(self):
# self.model.dropEvent(self.event_type, self)
def eventexit(self):
# PR #828 fixes an error here, but the underlying cause might not be solved (self.model being deleted before dropEvent is called)
self.model.dropEvent(self.event_type, self)

def eventexec(self, event):
assert str(event) == event.getName()
Expand Down

0 comments on commit 1f858fe

Please sign in to comment.