Skip to content

Commit

Permalink
- ensure that callbacks work with max_time argument
Browse files Browse the repository at this point in the history
  • Loading branch information
fbergmann committed Feb 15, 2023
1 parent 34c9f0c commit 3a8febb
Show file tree
Hide file tree
Showing 2 changed files with 209 additions and 28 deletions.
29 changes: 17 additions & 12 deletions basico/callbacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,13 @@ class TqmdCallback(COPASI.CProcessReport):
"""Utility class that uses tqdm progress information
"""
def __init__(self, maxTime=0, **tqdm_args):
super(TqmdCallback, self).__init__(maxTime)
def __init__(self, max_time=0, **tqdm_args):
""" Creates a new TqmdCallback instance
:param max_time: maximum time to run the tasks (defaults to 0 = no limit)
:param tqdm_args: arguments to be passed on to tqdm
"""
super(TqmdCallback, self).__init__(max_time)
self.shouldProceed = True
self.count = 0
self.handlers = {}
Expand All @@ -32,7 +37,7 @@ def progressItem(self, handle):
try:
update = self.handlers.get(handle, None)
if update is None:
return self.shouldProceed
return self.proceed()

assert (isinstance(update, tqmd_lib.tqdm))

Expand All @@ -44,24 +49,24 @@ def progressItem(self, handle):
update.update(current - update.n)
except KeyboardInterrupt:
return False
return self.shouldProceed
return self.proceed()

def resetItem(self, handle):
update = self.handlers.get(handle, None)
if update is None:
return self.shouldProceed
return self.proceed()

assert (isinstance(update, tqmd_lib.tqdm))
update.reset()
return self.shouldProceed
return self.proceed()

def reset(self):
for k in self.handlers.keys():
self.resetItem(k)
return self.shouldProceed
return self.proceed()

def proceed(self):
return self.shouldProceed
return self.shouldProceed and super(TqmdCallback, self).proceed()

def askToStop(self):
self.shouldProceed = False
Expand Down Expand Up @@ -109,25 +114,25 @@ def addItem(self, *args, **kwargs):
def finishItem(self, handle):
update = self.handlers.get(handle, None)
if not update:
return self.shouldProceed
return self.proceed()

assert (isinstance(update, tqmd_lib.tqdm))
update.update(update.total)
update.close()
del self.handlers[handle]
self.ptrs[handle] = None
del self.ptrs[handle]
return self.shouldProceed
return self.proceed()

def finish(self):
for k in self.handlers.keys():
self.finishItem(k)
self.handlers.clear()
return self.shouldProceed
return self.proceed()

def setName(self, name):
#print(name)
return self.shouldProceed
return self.proceed()


_DEFAULT_HANDLER = COPASI.CProcessReport()
Expand Down
208 changes: 192 additions & 16 deletions docs/notebooks/Using_callbacks.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -229,12 +229,26 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "056bd6f7d8284ab5a785ff163131a082",
"model_id": "2cb077dc66034079a8b79f0f77bfd1cb",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Function Evaluations: 1212 [00:01, 1210.78/s]"
"Function Evaluations: 1311 [00:01, 1309.69/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0f057d39b03944898d2babc12dbb723c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Best Value: 22.32126236098639 [00:01, 2516.34/s]"
]
},
"metadata": {},
Expand Down Expand Up @@ -279,49 +293,49 @@
" <th>(R1).k2</th>\n",
" <td>1e-6</td>\n",
" <td>1e6</td>\n",
" <td>0.000014</td>\n",
" <td>0.000123</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(R2).k1</th>\n",
" <td>1e-6</td>\n",
" <td>1e6</td>\n",
" <td>45.274788</td>\n",
" <td>40.864396</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.178417</td>\n",
" <td>0.108320</td>\n",
" <td>[Experiment_1]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>-0.022335</td>\n",
" <td>0.216139</td>\n",
" <td>[Experiment_3]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>-0.050647</td>\n",
" <td>0.010154</td>\n",
" <td>[Experiment]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.010597</td>\n",
" <td>0.368608</td>\n",
" <td>[Experiment_4]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>-0.068453</td>\n",
" <td>-0.057231</td>\n",
" <td>[Experiment_2]</td>\n",
" </tr>\n",
" </tbody>\n",
Expand All @@ -331,13 +345,13 @@
"text/plain": [
" lower upper sol affected\n",
"name \n",
"(R1).k2 1e-6 1e6 0.000014 []\n",
"(R2).k1 1e-6 1e6 45.274788 []\n",
"Values[offset] -0.2 0.4 0.178417 [Experiment_1]\n",
"Values[offset] -0.2 0.4 -0.022335 [Experiment_3]\n",
"Values[offset] -0.2 0.4 -0.050647 [Experiment]\n",
"Values[offset] -0.2 0.4 0.010597 [Experiment_4]\n",
"Values[offset] -0.2 0.4 -0.068453 [Experiment_2]"
"(R1).k2 1e-6 1e6 0.000123 []\n",
"(R2).k1 1e-6 1e6 40.864396 []\n",
"Values[offset] -0.2 0.4 0.108320 [Experiment_1]\n",
"Values[offset] -0.2 0.4 0.216139 [Experiment_3]\n",
"Values[offset] -0.2 0.4 0.010154 [Experiment]\n",
"Values[offset] -0.2 0.4 0.368608 [Experiment_4]\n",
"Values[offset] -0.2 0.4 -0.057231 [Experiment_2]"
]
},
"execution_count": 6,
Expand All @@ -358,6 +372,168 @@
"\n",
"![callback handlder](https://p194.p3.n0.cdn.getcloudapp.com/items/RBuB4pxg/994c750c-2854-4682-8d7d-e9cbfead5d33.gif?v=fee23795786ee71c721d6ae7cc3687f6)"
]
},
{
"cell_type": "markdown",
"id": "ff6c63de",
"metadata": {},
"source": [
"### Timeouts\n",
"callbacks can also be used, to ensure that tasks are automatically interrupted after a certain number of seconds. So if we repeat the example from above, and stop the parameter estimation automatically after 10seconds, we could use: "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "3d03b15c",
"metadata": {},
"outputs": [],
"source": [
"create_default_handler(max_time=10)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "f64b59aa",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "906bd2a53606486a8be75ce031b9cc92",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Function Evaluations: 1330 [00:01, 1328.85/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "146eb8eee74545dba8e4307b4bbb0a1a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Best Value: 18.52026239524136 [00:01, 2366.75/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>lower</th>\n",
" <th>upper</th>\n",
" <th>sol</th>\n",
" <th>affected</th>\n",
" </tr>\n",
" <tr>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>(R1).k2</th>\n",
" <td>1e-6</td>\n",
" <td>1e6</td>\n",
" <td>0.000002</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(R2).k1</th>\n",
" <td>1e-6</td>\n",
" <td>1e6</td>\n",
" <td>43.882694</td>\n",
" <td>[]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>-0.061506</td>\n",
" <td>[Experiment_1]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.062814</td>\n",
" <td>[Experiment_3]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>-0.016544</td>\n",
" <td>[Experiment]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.001578</td>\n",
" <td>[Experiment_4]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Values[offset]</th>\n",
" <td>-0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.096818</td>\n",
" <td>[Experiment_2]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" lower upper sol affected\n",
"name \n",
"(R1).k2 1e-6 1e6 0.000002 []\n",
"(R2).k1 1e-6 1e6 43.882694 []\n",
"Values[offset] -0.2 0.4 -0.061506 [Experiment_1]\n",
"Values[offset] -0.2 0.4 0.062814 [Experiment_3]\n",
"Values[offset] -0.2 0.4 -0.016544 [Experiment]\n",
"Values[offset] -0.2 0.4 0.001578 [Experiment_4]\n",
"Values[offset] -0.2 0.4 0.096818 [Experiment_2]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"run_parameter_estimation(method=PE.RANDOM_SEARCH)"
]
}
],
"metadata": {
Expand Down

0 comments on commit 3a8febb

Please sign in to comment.