Skip to content
This repository was archived by the owner on Jan 31, 2023. It is now read-only.

Latest commit

 

History

History
447 lines (343 loc) · 23.7 KB

20624.md

File metadata and controls

447 lines (343 loc) · 23.7 KB

Issue 20624: maximum recursion depth exceeded in MonoDictEraser

archive/issues_020387.json:

{
    "assignees": [],
    "body": "<div id=\"comment:0\"></div>\n\nThis has recently started to appear randomly:\n\n```\nsage -t --long src/sage/functions/other.py\n**********************************************************************\nFile \"src/sage/functions/other.py\", line 364, in sage.functions.other.Function_ceil.__init__\nFailed example:\n    a(x=4.0)\nExpected:\n    5\nGot:\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e3748> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e36e0> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e34d8> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bc227338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bc227338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e3540> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.misc.weak_dict.WeakValueDictEraser object at 0x7f431d8e33a0> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.misc.weak_dict.WeakValueDictEraser object at 0x7f431d8e33a0> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.misc.weak_dict.WeakValueDictEraser object at 0x7f4311ebd8e8> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431bd74268> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431bd7d2d0> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e36e0> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f4315cfce30> ignored\n    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f4315d19880> ignored\n    5\n**********************************************************************\n1 item had failures:\n   1 of  22 in sage.functions.other.Function_ceil.__init__\n    [496 tests, 1 failure, 4.74 s]\n```\n\nCC:  @simon-king-jena\n\nComponent: **misc**\n\nKeywords: **random_fail**\n\nAuthor: **Nils Bruin**\n\nBranch/Commit: **[`58db8ae`](https://github.com/sagemath/sagetrac-mirror/commit/58db8ae83a2d9e2148a31c1711c1879517685fc7)**\n\nReviewer: **Volker Braun**\n\n_Issue created by migration from https://trac.sagemath.org/ticket/20624_\n\n",
    "closed_at": "2016-05-21T16:40:35Z",
    "created_at": "2016-05-18T20:53:11Z",
    "labels": [
        "https://github.com/sagemath/sage/labels/p%3A%20major%20/%203",
        "https://github.com/sagemath/sage/labels/bug"
    ],
    "milestone": "https://github.com/sagemath/sage/milestones/sage-7.3",
    "reactions": [],
    "repository": "https://github.com/sagemath/sage",
    "title": "maximum recursion depth exceeded in MonoDictEraser",
    "type": "issue",
    "updated_at": "2016-05-21T16:40:35Z",
    "url": "https://github.com/sagemath/sage/issues/20624",
    "user": "https://github.com/vbraun"
}

This has recently started to appear randomly:

sage -t --long src/sage/functions/other.py
**********************************************************************
File "src/sage/functions/other.py", line 364, in sage.functions.other.Function_ceil.__init__
Failed example:
    a(x=4.0)
Expected:
    5
Got:
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e3748> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e36e0> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e34d8> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bc227338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bc227338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e3540> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.misc.weak_dict.WeakValueDictEraser object at 0x7f431d8e33a0> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.TripleDictEraser object at 0x7f43bd61c338> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.misc.weak_dict.WeakValueDictEraser object at 0x7f431d8e33a0> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.misc.weak_dict.WeakValueDictEraser object at 0x7f4311ebd8e8> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431bd74268> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431bd7d2d0> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f431d8e36e0> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f4315cfce30> ignored
    Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <sage.structure.coerce_dict.MonoDictEraser object at 0x7f4315d19880> ignored
    5
**********************************************************************
1 item had failures:
   1 of  22 in sage.functions.other.Function_ceil.__init__
    [496 tests, 1 failure, 4.74 s]

CC: @simon-king-jena

Component: misc

Keywords: random_fail

Author: Nils Bruin

Branch/Commit: 58db8ae

Reviewer: Volker Braun

Issue created by migration from https://trac.sagemath.org/ticket/20624


archive/issue_events_287908.json:

{
    "actor": "https://github.com/vbraun",
    "created_at": "2016-05-18T20:53:11Z",
    "event": "milestoned",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "milestone_number": null,
    "milestone_title": "sage-7.3",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287908"
}

archive/issue_events_287909.json:

{
    "actor": "https://github.com/vbraun",
    "created_at": "2016-05-18T20:53:11Z",
    "event": "labeled",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "label": "https://github.com/sagemath/sage/labels/p%3A%20major%20/%203",
    "label_color": "ffbb00",
    "label_name": "p: major / 3",
    "label_text_color": "ffffff",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287909"
}

archive/issue_events_287910.json:

{
    "actor": "https://github.com/vbraun",
    "created_at": "2016-05-18T20:53:11Z",
    "event": "labeled",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "label": "https://github.com/sagemath/sage/labels/bug",
    "label_color": "d73a4a",
    "label_name": "bug",
    "label_text_color": "ffffff",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287910"
}

archive/issue_comments_298171.json:

{
    "body": "<div id=\"comment:1\" align=\"right\">comment:1</div>\n\nAh goodie! This brings back fond memories from the ticket from hell #10963. Specifically: [comment:242](https://github.com/sagemath/sage/issues/10963#comment:242). Note that there the (ignored) errors in the Eraser classes were a symptom of an overloaded call stack caused by other (basically) infinite recursions.\n\nI'm curious to see what's causing this. If it's actually a too-deep recursion in a deletion somewhere, I would be very surprised.",
    "created_at": "2016-05-18T22:59:17Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298171",
    "user": "https://github.com/nbruin"
}
comment:1

Ah goodie! This brings back fond memories from the ticket from hell #10963. Specifically: comment:242. Note that there the (ignored) errors in the Eraser classes were a symptom of an overloaded call stack caused by other (basically) infinite recursions.

I'm curious to see what's causing this. If it's actually a too-deep recursion in a deletion somewhere, I would be very surprised.


archive/issue_comments_298172.json:

{
    "body": "<div id=\"comment:2\" align=\"right\">comment:2</div>\n\nOh boy, it turns out `BuiltinFunction` does some shuffling around of `_eval*_` methods, so looking at the source doesn't give a clear picture. We really have to use introspection.\n\n`ceil._evalf_(self,x,**kwds)` -> `return self.eval_(x)` [throws away keywords!]\n`ceil._eval_(self,*args)` -> `self._evalf_try_(*args)` or `self._eval0_(*args)` if evalf_try returns None.\n`ceil._evalf_try_(self,*args)` -> does some tests, but can end up calling `self._evalf_(*args,parent=p)`. Does all of this inside a `try...except Exception:pass`\n\nwhenever you run\n\n```\nceil(x+2/5)(x=4.0)\n```\nthe `_evalf_try_/_evalf_` loop will run out the python call stack, the error will be caught by the try/except, `evalf_try` will then call `ceil._eval0_(x)` which simply tries `x.ceil()` or some alternatives.\n\nStrong evidence that this happens:\n\n```\nsage: sys.setrecursionlimit(<N>)\nsage: %prun ceil(x+2/5)(x=4.0)\n    <N/4-epsilon>/1    0.003    0.000    0.003    0.003 {method '_evalf_or_eval_' of 'sage.symbolic.function.BuiltinFunction' objects}\n        1    0.000    0.000    0.004    0.004 <string>:1(<module>)\n    <N/4-epsilon>1    0.000    0.000    0.003    0.003 other.py:501(_evalf_)\n```\n\nSo the change is that apparently something has become collectible and that now it can happen the garbage collector runs when the call stack is nearly full, so that the Eraser classes don't have space to run.\n\nThe real solution is to stop `BuiltinFunction` from mangling methods. It makes it very hard for people to write decent code. It's a horrible design. Just looking at the implementation of ceil, everything seems to be fine (although why would you implement `evalf` as `eval`?. With the magic in BuiltinFunction, perhaps just deleting `evalf` does the trick)\n\nThe commit that seems to have introduced this behavior in `BuiltinFunction` is [6d107297](https://github.com/sagemath/sagetrac-mirror/blob/6d107297a5d8867f1a1e9996678ffa441adc8a2d/src/sage/symbolic/function.pyx). I think a comprehensive audit of `_evalf_/_eval_` implementations on classes that inherit from `BuiltinFunction` is in order, because this sort of problem is likely occurring elsewhere to.",
    "created_at": "2016-05-19T02:34:57Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298172",
    "user": "https://github.com/nbruin"
}
comment:2

Oh boy, it turns out BuiltinFunction does some shuffling around of _eval*_ methods, so looking at the source doesn't give a clear picture. We really have to use introspection.

ceil._evalf_(self,x,**kwds) -> return self.eval_(x) [throws away keywords!] ceil._eval_(self,*args) -> self._evalf_try_(*args) or self._eval0_(*args) if evalf_try returns None. ceil._evalf_try_(self,*args) -> does some tests, but can end up calling self._evalf_(*args,parent=p). Does all of this inside a try...except Exception:pass

whenever you run

ceil(x+2/5)(x=4.0)

the _evalf_try_/_evalf_ loop will run out the python call stack, the error will be caught by the try/except, evalf_try will then call ceil._eval0_(x) which simply tries x.ceil() or some alternatives.

Strong evidence that this happens:

sage: sys.setrecursionlimit(<N>)
sage: %prun ceil(x+2/5)(x=4.0)
    <N/4-epsilon>/1    0.003    0.000    0.003    0.003 {method '_evalf_or_eval_' of 'sage.symbolic.function.BuiltinFunction' objects}
        1    0.000    0.000    0.004    0.004 <string>:1(<module>)
    <N/4-epsilon>1    0.000    0.000    0.003    0.003 other.py:501(_evalf_)

So the change is that apparently something has become collectible and that now it can happen the garbage collector runs when the call stack is nearly full, so that the Eraser classes don't have space to run.

The real solution is to stop BuiltinFunction from mangling methods. It makes it very hard for people to write decent code. It's a horrible design. Just looking at the implementation of ceil, everything seems to be fine (although why would you implement evalf as eval?. With the magic in BuiltinFunction, perhaps just deleting evalf does the trick)

The commit that seems to have introduced this behavior in BuiltinFunction is 6d107297. I think a comprehensive audit of _evalf_/_eval_ implementations on classes that inherit from BuiltinFunction is in order, because this sort of problem is likely occurring elsewhere to.


archive/issue_comments_298173.json:

{
    "body": "Branch: **[u/nbruin/maximum_recursion_depth_exceeded_in_monodicteraser](https://github.com/sagemath/sagetrac-mirror/tree/u/nbruin/maximum_recursion_depth_exceeded_in_monodicteraser)**",
    "created_at": "2016-05-19T16:30:57Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298173",
    "user": "https://github.com/nbruin"
}

Branch: u/nbruin/maximum_recursion_depth_exceeded_in_monodicteraser


archive/issue_events_287911.json:

{
    "actor": "https://github.com/nbruin",
    "created_at": "2016-05-19T16:32:57Z",
    "event": "labeled",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "label": "https://github.com/sagemath/sage/labels/needs%20review",
    "label_color": "7fff00",
    "label_name": "needs review",
    "label_text_color": "ffffff",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287911"
}

archive/issue_comments_298174.json:

{
    "body": "Commit: **[`58db8ae`](https://github.com/sagemath/sagetrac-mirror/commit/58db8ae83a2d9e2148a31c1711c1879517685fc7)**",
    "created_at": "2016-05-19T16:32:57Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298174",
    "user": "https://github.com/nbruin"
}

Commit: 58db8ae


archive/issue_comments_298175.json:

{
    "body": "<div id=\"comment:4\" align=\"right\">comment:4</div>\n\nJust removing the `_evalf_` implementations seems to do the trick. If someone wants to add doctests, go ahead.\n\n---\nNew commits:\n<table><tr><td><a href=\"https://github.com/sagemath/sagetrac-mirror/commit/58db8ae83a2d9e2148a31c1711c1879517685fc7\"><code>58db8ae</code></a></td><td><code>trac 20624: remove `_evalf_` that leads to infinite recursion due to changes on #14766</code></td></tr></table>\n",
    "created_at": "2016-05-19T16:32:57Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298175",
    "user": "https://github.com/nbruin"
}
comment:4

Just removing the _evalf_ implementations seems to do the trick. If someone wants to add doctests, go ahead.


New commits:

58db8aetrac 20624: remove `_evalf_` that leads to infinite recursion due to changes on #14766

archive/issue_comments_298176.json:

{
    "body": "Author: **Nils Bruin**",
    "created_at": "2016-05-19T16:32:57Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298176",
    "user": "https://github.com/nbruin"
}

Author: Nils Bruin


archive/issue_comments_298177.json:

{
    "body": "Reviewer: **Volker Braun**",
    "created_at": "2016-05-19T18:06:31Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298177",
    "user": "https://github.com/vbraun"
}

Reviewer: Volker Braun


archive/issue_comments_298178.json:

{
    "body": "<div id=\"comment:5\" align=\"right\">comment:5</div>\n\nthanks!",
    "created_at": "2016-05-19T18:06:31Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298178",
    "user": "https://github.com/vbraun"
}
comment:5

thanks!


archive/issue_events_287912.json:

{
    "actor": "https://github.com/vbraun",
    "created_at": "2016-05-19T18:06:31Z",
    "event": "unlabeled",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "label": "https://github.com/sagemath/sage/labels/needs%20review",
    "label_color": "7fff00",
    "label_name": "needs review",
    "label_text_color": "ffffff",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287912"
}

archive/issue_events_287913.json:

{
    "actor": "https://github.com/vbraun",
    "created_at": "2016-05-19T18:06:31Z",
    "event": "labeled",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "label": "https://github.com/sagemath/sage/labels/positive%20review",
    "label_color": "dfffc0",
    "label_name": "positive review",
    "label_text_color": "ffffff",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287913"
}

archive/issue_events_287914.json:

{
    "actor": "https://github.com/vbraun",
    "created_at": "2016-05-21T16:40:35Z",
    "event": "unlabeled",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "label": "https://github.com/sagemath/sage/labels/positive%20review",
    "label_color": "dfffc0",
    "label_name": "positive review",
    "label_text_color": "ffffff",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287914"
}

archive/issue_events_287915.json:

{
    "actor": "https://github.com/vbraun",
    "commit_id": "4ab2820e72a13b2fe1b0790888211753a97677d3",
    "commit_repository": "https://github.com/sagemath/sage",
    "created_at": "2016-05-21T16:40:35Z",
    "event": "closed",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_event",
    "url": "https://github.com/sagemath/sage/issues/20624#event-287915"
}

archive/issue_comments_298179.json:

{
    "body": "Changed branch from **[u/nbruin/maximum_recursion_depth_exceeded_in_monodicteraser](https://github.com/sagemath/sagetrac-mirror/tree/u/nbruin/maximum_recursion_depth_exceeded_in_monodicteraser)** to **[`58db8ae`](https://github.com/sagemath/sagetrac-mirror/commit/58db8ae83a2d9e2148a31c1711c1879517685fc7)**",
    "created_at": "2016-05-21T16:40:35Z",
    "formatter": "markdown",
    "issue": "https://github.com/sagemath/sage/issues/20624",
    "type": "issue_comment",
    "url": "https://github.com/sagemath/sage/issues/20624#issuecomment-298179",
    "user": "https://github.com/vbraun"
}

Changed branch from u/nbruin/maximum_recursion_depth_exceeded_in_monodicteraser to 58db8ae