{"action":"created","comment":{"url":"https://api.github.com/repos/sympy/sympy/pulls/comments/201169898","pull_request_review_id":135614932,"id":201169898,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMTE2OTg5OA==","diff_hunk":"@@ -978,6 +985,313 @@ def _solveset(f, symbol, domain, _check=False):\n     return result\n \n \n+def _solve_expo(f):\n+    r\"\"\"\n+    Helper function for solving (supported) exponential equations.\n+\n+    Exponential equations are the sum of (currently) at most\n+    two terms with one or both of them having a power with a\n+    symbol-dependent exponent.\n+\n+    For example\n+\n+    .. math:: 5^{2x + 3} - 5^{3x - 1}\n+\n+    .. math:: 4^{5 - 9x} - e^{2 - x}\n+\n+    The function reduces the equation (`f`) to a better log form\n+    (if possible) and returns the modified equation which can be\n+    further handled by `solveset`.\n+\n+    Examples\n+    ========\n+\n+    >>> from sympy.solvers.solveset import _solve_expo as solve_expo\n+    >>> from sympy import symbols\n+    >>> x = symbols('x', real=True)\n+    >>> solve_expo(3**(2*x) - 2**(x + 3))\n+    2*x*log(3) - (x + 3)*log(2)\n+\n+    * Proof of correctness of the method\n+\n+    The logarithm is the inverse function to exponentiation.\n+    The defining relation between exponentiation and logarithm is:\n+\n+    .. math:: {log_b x} = y \\enspace if \\enspace b^y = x\n+\n+    Therefore if we are given an equation with exponent terms, we can\n+    convert every term to its corresponding log form. This is achieved by\n+    taking logarithms and expanding the equation using log identities\n+    so that it can be easily handled by `solveset`.\n+\n+    For example:\n+\n+    .. math:: 3^{2x} = 2^{x + 3}\n+\n+    Taking log both sides will reduce the equation to\n+\n+    .. math:: (2x)*log(3) = (x + 3)*log(2)\n+\n+    This form can be easily handed by `solveset`.\n+    \"\"\"\n+\n+    if not (isinstance(f, Add) and len(f.args) == 2):\n+        # solving for the sum of more than two powers is possible\n+        # but not yet implemented\n+        return None\n+\n+    lhs, rhs = list(ordered(f.args))\n+\n+    log_type_equation = expand_log(log(lhs)) - expand_log(log(-rhs))\n+\n+    return log_type_equation\n+\n+\n+def _check_expo(f, symbol):\n+    r\"\"\"\n+    Helper to check whether an equation is exponential or not.\n+\n+    ``f`` is the equation to be checked\n+\n+    ``symbol`` is the variable in which the equation needs to be checked\n+\n+    The function extracts each term of the equation and checks if it is\n+    of exponential form w.r.t `symbol`.\n+    Returns `True` if any term is of exponential type otherwise `False`.\n+\n+    Examples\n+    ========\n+\n+    >>> from sympy import symbols, cos, exp\n+    >>> from sympy.solvers.solveset import _check_expo as check\n+    >>> x, y = symbols('x y')\n+    >>> check(x**y - x, y)\n+    True\n+    >>> check(x**y - x, x)\n+    False\n+    >>> check(exp(x + 3), x)\n+    True\n+    >>> check(cos(2**x), x)\n+    False\n+    \"\"\"\n+\n+    for add_arg in Add.make_args(f):\n+        for mul_arg in Mul.make_args(add_arg):\n+            if isinstance(mul_arg, (Pow, exp)) and \\\n+                    symbol in mul_arg.exp.free_symbols:\n+                return True\n+    return False\n+\n+\n+def _transolve(f, symbol, domain):\n+    r\"\"\"\n+    Function to solve transcendental equations. It is a helper to\n+    `solveset` and should be used internally. `\\_transolve`\n+    currently supports the following class of equations:\n+\n+        - Exponential equations\n+\n+    Parameters\n+    ==========\n+\n+    f : is any transcendental equation that needs to be solved.\n+        This needs to be an expression, which is assumed\n+        to be equal to 0.\n+\n+    symbol : is variable for which the equation is solved.\n+        This needs to be of class `Symbol`.\n+\n+    domain : is a set over which the equation is solved.\n+        This needs to be of class `Set`.\n+\n+    How to use `\\_transolve`\n+    ========================\n+\n+    `\\_transolve` should not be used as an independent function, because\n+    it assumes that the equation (`f`) and the `symbol` comes from\n+    `solveset` and might have undergone a few modification(s).\n+    To use `\\_transolve` as an independent function the equation (`f`)\n+    and the `symbol` should be passed as they would have been by\n+    `solveset`.\n+\n+    Examples\n+    ========\n+\n+    >>> from sympy.solvers.solveset import _transolve as transolve\n+    >>> from sympy.solvers.solvers import _tsolve as tsolve\n+    >>> from sympy import symbols, S, pprint\n+    >>> x = symbols('x', real=True) # assumption added\n+    >>> transolve(5**(x - 3) - 3**(2*x + 1), x, S.Reals)\n+    {-log(375)/(-log(5) + 2*log(3))}\n+\n+    How `\\_transolve` works\n+    =======================\n+\n+    `\\_transolve` uses two types of helper functions to solve equations\n+    of a particular class:\n+\n+    Identifying helpers: These helpers are used to determine whether a\n+    given equation belongs to a certain class of equation or not.\n+    These functions return either True or False.\n+\n+    Solving helpers: These are the helpers that solve the equation.\n+    They are invoked once the equation is identified by the `identifying\n+    helpers`. These functions return either the complete solution or\n+    a modified version of the equation that `solveset` might better\n+    handle.\n+\n+    * Philosophy behind the module\n+\n+    `\\_transolve` comes into action when `solveset` is unable to solve\n+    the equation as a last resort to get the solutions. The idea is to\n+    get the equation in a case (Add, Pow etc.) that satisfies its\n+    general form, for example exponential equations take the form as\n+    `a*f(x) + b*g(x)`, where `f(x)` and `g(x)` are power terms,\n+    therefore they are included in `Add` case.\n+\n+    Once done different `identifying helper` conditions are included\n+    to check which class the equation belongs. `Solving helper` is\n+    invoked once the class of the equation is identified. If the\n+    equation is solved the result is returned otherwise a\n+    `ConditionSet` is returned.\n+\n+    How `\\_transolve` is better than `\\_tsolve`\n+    ===========================================\n+\n+    1) Better output\n+\n+    `\\_transolve` provides expressions in a more simplified form.\n+\n+    Consider a simple exponential equation\n+\n+    >>> f = 3**(2*x) - 2**(x + 3)\n+    >>> pprint(transolve(f, x, S.Reals), use_unicode=False)\n+        -3*log(2)\n+    {------------------}\n+     -2*log(3) + log(2)\n+    >>> pprint(tsolve(f, x), use_unicode=False)\n+         /   3     \\\n+         | --------|\n+         | log(2/9)|\n+    [-log\\2         /]\n+\n+    2) Extensible\n+\n+    The API of `\\_transolve` is designed such that it is easily\n+    extensible, i.e. the code that solves a given class of\n+    equations is encapsulated in a helper and not mixed in with\n+    the code of \\_transolve itself.\n+\n+    3) Modular\n+\n+    `\\_transolve` is designed to be modular i.e, for every class of\n+    equation a separate helper for identification and solving is\n+    implemented. This makes it easy to change or modify any of the\n+    method implemented directly in the helpers without interfering\n+    with the actual structure of the API.\n+\n+    4) Faster Computation\n+\n+    Solving equation via `\\_transolve` is much faster as compared to\n+    `\\_tsolve`. In `solve` attempts are made computing every possibility\n+    to get the solutions. This series of attempts makes solving a bit\n+    slow. Whereas in `\\_transolve` computation begins only when the\n+    equation is identified of being a particular type.\n+\n+    How to add new class of equations\n+    =================================\n+\n+    `\\_transolve` is designed in such a way that it becomes an easy task to\n+    add a new class of equation solver.\n+\n+    The first task that needs to be done for adding your own solver\n+    is to decide from where its `identification helper` will be\n+    invoked. To do so determine the general form of the class of the\n+    equation, for example the general form of the exponential equation\n+    is `a*f(x) + b*g(x)` where `f(x)` and `g(x)` are power terms, so we\n+    need to place the invocation condition inside `Add` case. Once the\n+    place for `identification helper` is determined, you can add a call\n+    to its `solving helper`.\n+\n+    For your class of equation you need to define your own\n+    identification and solving helpers. The `identification helper`\n+    should be implemented for generalised cases and should return\n+    either `True` if the given equation belongs to the class otherwise\n+    `False`. `Solving helpers` needs to be implemented with\n+    heuristics or algorithms that solve a majority of the equations\n+    belonging to that class. The value returned could be either the\n+    exact solution or a reduced form of the equation which `solveset`\n+    can handle.\n+\n+    Apart from this, a few other things needs to be taken care while\n+    adding an equation solver:\n+\n+    - Naming conventions:\n+      Name of the `identification helper` should be like  `\\_check\\_class`\n+      where `class` will be the name or abbreviation of the class of\n+      equation. The `solving helper` will be named as `\\_solve\\_class`.\n+      For example: for exponential equations it becomes `\\_check\\_expo`\n+      and `\\_solve\\_expo`.\n+    - The helper should take two input parameters, the equation to be\n+      checked and the variable for which a solution is being sought.\n+    - Be sure to consider corner cases.\n+    - Add tests for each helper.\n+    - Add a docstring to your helper that describes the method\n+      implemented.\n+      The following things needs to be included while writing the\n+      documentation for the helpers:\n+\n+      - What is the purpose of the helper.\n+      - How it solves the equation and how does it identifies the equation.\n+      - Examples should be included with its proof of correctness.\n+      - What does the helper returns.\n+    \"\"\"\n+\n+    def add_type(eq, symbol, domain):\n+        \"\"\"\n+        Helper for `_transolve` to handle equations of\n+        `Add` type.\n+        \"\"\"\n+        result = ConditionSet(symbol, Eq(eq, 0), domain)\n+        # try factoring it;\n+        # powdenest is used to try get powers in standard form\n+        # for better factoring\n+        simplified_equation = factor(powdenest(eq))\n+\n+        if simplified_equation.is_Mul:\n+            result = _solveset(\n+                simplified_equation, symbol, domain)\n+\n+        # check if it is exponential type equation\n+        elif _check_expo(simplified_equation, symbol):\n+            new_eq = _solve_expo(simplified_equation)\n+            if new_eq:\n+                result = _solveset(new_eq, symbol, domain)\n+\n+        return result\n+\n+    unsolved_result = ConditionSet(symbol, Eq(f, 0), domain)\n+    result = unsolved_result\n+\n+    # invert_complex handles the call to the desired inverter based\n+    # on the domain specified.\n+    lhs, rhs_s = invert_complex(f, 0, symbol, domain)\n+\n+    if isinstance(rhs_s, FiniteSet):\n+        rhs = rhs_s.args[0]","path":"sympy/solvers/solveset.py","position":395,"original_position":370,"commit_id":"90efc7a40791d393d2db412d6a46af358209b0c6","original_commit_id":"154ee3be93c1e76c8cdd3d9e7b70af9029427fb8","user":{"login":"aktech","id":5647941,"node_id":"MDQ6VXNlcjU2NDc5NDE=","avatar_url":"https://avatars2.githubusercontent.com/u/5647941?v=4","gravatar_id":"","url":"https://api.github.com/users/aktech","html_url":"https://github.com/aktech","followers_url":"https://api.github.com/users/aktech/followers","following_url":"https://api.github.com/users/aktech/following{/other_user}","gists_url":"https://api.github.com/users/aktech/gists{/gist_id}","starred_url":"https://api.github.com/users/aktech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aktech/subscriptions","organizations_url":"https://api.github.com/users/aktech/orgs","repos_url":"https://api.github.com/users/aktech/repos","events_url":"https://api.github.com/users/aktech/events{/privacy}","received_events_url":"https://api.github.com/users/aktech/received_events","type":"User","site_admin":false},"body":"That's fine, but add an assert here to make your intentions clear, so that if someone changes that in `solveset` tomorrow, transolve should tell the world that it broke.","created_at":"2018-07-09T22:41:28Z","updated_at":"2018-07-09T22:50:59Z","html_url":"https://github.com/sympy/sympy/pull/14736#discussion_r201169898","pull_request_url":"https://api.github.com/repos/sympy/sympy/pulls/14736","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/sympy/sympy/pulls/comments/201169898"},"html":{"href":"https://github.com/sympy/sympy/pull/14736#discussion_r201169898"},"pull_request":{"href":"https://api.github.com/repos/sympy/sympy/pulls/14736"}},"in_reply_to_id":199618918},"pull_request":{"url":"https://api.github.com/repos/sympy/sympy/pulls/14736","id":189899610,"node_id":"MDExOlB1bGxSZXF1ZXN0MTg5ODk5NjEw","html_url":"https://github.com/sympy/sympy/pull/14736","diff_url":"https://github.com/sympy/sympy/pull/14736.diff","patch_url":"https://github.com/sympy/sympy/pull/14736.patch","issue_url":"https://api.github.com/repos/sympy/sympy/issues/14736","number":14736,"state":"open","locked":false,"title":"transcendental equation solver for solveset: transolve","user":{"login":"Yathartha22","id":14955840,"node_id":"MDQ6VXNlcjE0OTU1ODQw","avatar_url":"https://avatars1.githubusercontent.com/u/14955840?v=4","gravatar_id":"","url":"https://api.github.com/users/Yathartha22","html_url":"https://github.com/Yathartha22","followers_url":"https://api.github.com/users/Yathartha22/followers","following_url":"https://api.github.com/users/Yathartha22/following{/other_user}","gists_url":"https://api.github.com/users/Yathartha22/gists{/gist_id}","starred_url":"https://api.github.com/users/Yathartha22/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yathartha22/subscriptions","organizations_url":"https://api.github.com/users/Yathartha22/orgs","repos_url":"https://api.github.com/users/Yathartha22/repos","events_url":"https://api.github.com/users/Yathartha22/events{/privacy}","received_events_url":"https://api.github.com/users/Yathartha22/received_events","type":"User","site_admin":false},"body":"This PR aims at extending capability of `solveset` by implementing `transolve` that is a helper to solveset for solving transcendental equations.\r\n\r\nThe following things are done:\r\n\r\n- [x] API design and flow of transolve\r\n- [x] Exponential solver\r\n- [x] import test from solve\r\n- [x] Fix pep8\r\n- [x] address comments\r\n\r\nThe following needs to be done:\r\n\r\n* solving exponential equation in complex domain~ (will be solved later, added tests as XFAIL as of now)\r\n\r\n- [x] XFails\r\n\r\n- [x] Documentation with proof of correctness.\r\n\r\nthis is an alternative to #13045.\r\n~#10864~\r\n\r\nping @aktech @smichr ","created_at":"2018-05-23T08:50:49Z","updated_at":"2018-07-09T22:50:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"513aa9b47def0af1e8b1f5881e47eaca02427350","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":222449974,"node_id":"MDU6TGFiZWwyMjI0NDk5NzQ=","url":"https://api.github.com/repos/sympy/sympy/labels/PR:%20author's%20turn","name":"PR: author's turn","color":"ffff80","default":false},{"id":84627360,"node_id":"MDU6TGFiZWw4NDYyNzM2MA==","url":"https://api.github.com/repos/sympy/sympy/labels/solvers","name":"solvers","color":"0000FF","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/sympy/sympy/pulls/14736/commits","review_comments_url":"https://api.github.com/repos/sympy/sympy/pulls/14736/comments","review_comment_url":"https://api.github.com/repos/sympy/sympy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sympy/sympy/issues/14736/comments","statuses_url":"https://api.github.com/repos/sympy/sympy/statuses/90efc7a40791d393d2db412d6a46af358209b0c6","head":{"label":"Yathartha22:transolve_gsoc","ref":"transolve_gsoc","sha":"90efc7a40791d393d2db412d6a46af358209b0c6","user":{"login":"Yathartha22","id":14955840,"node_id":"MDQ6VXNlcjE0OTU1ODQw","avatar_url":"https://avatars1.githubusercontent.com/u/14955840?v=4","gravatar_id":"","url":"https://api.github.com/users/Yathartha22","html_url":"https://github.com/Yathartha22","followers_url":"https://api.github.com/users/Yathartha22/followers","following_url":"https://api.github.com/users/Yathartha22/following{/other_user}","gists_url":"https://api.github.com/users/Yathartha22/gists{/gist_id}","starred_url":"https://api.github.com/users/Yathartha22/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yathartha22/subscriptions","organizations_url":"https://api.github.com/users/Yathartha22/orgs","repos_url":"https://api.github.com/users/Yathartha22/repos","events_url":"https://api.github.com/users/Yathartha22/events{/privacy}","received_events_url":"https://api.github.com/users/Yathartha22/received_events","type":"User","site_admin":false},"repo":{"id":77686804,"node_id":"MDEwOlJlcG9zaXRvcnk3NzY4NjgwNA==","name":"sympy","full_name":"Yathartha22/sympy","owner":{"login":"Yathartha22","id":14955840,"node_id":"MDQ6VXNlcjE0OTU1ODQw","avatar_url":"https://avatars1.githubusercontent.com/u/14955840?v=4","gravatar_id":"","url":"https://api.github.com/users/Yathartha22","html_url":"https://github.com/Yathartha22","followers_url":"https://api.github.com/users/Yathartha22/followers","following_url":"https://api.github.com/users/Yathartha22/following{/other_user}","gists_url":"https://api.github.com/users/Yathartha22/gists{/gist_id}","starred_url":"https://api.github.com/users/Yathartha22/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yathartha22/subscriptions","organizations_url":"https://api.github.com/users/Yathartha22/orgs","repos_url":"https://api.github.com/users/Yathartha22/repos","events_url":"https://api.github.com/users/Yathartha22/events{/privacy}","received_events_url":"https://api.github.com/users/Yathartha22/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Yathartha22/sympy","description":"A computer algebra system written in pure Python","fork":true,"url":"https://api.github.com/repos/Yathartha22/sympy","forks_url":"https://api.github.com/repos/Yathartha22/sympy/forks","keys_url":"https://api.github.com/repos/Yathartha22/sympy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Yathartha22/sympy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Yathartha22/sympy/teams","hooks_url":"https://api.github.com/repos/Yathartha22/sympy/hooks","issue_events_url":"https://api.github.com/repos/Yathartha22/sympy/issues/events{/number}","events_url":"https://api.github.com/repos/Yathartha22/sympy/events","assignees_url":"https://api.github.com/repos/Yathartha22/sympy/assignees{/user}","branches_url":"https://api.github.com/repos/Yathartha22/sympy/branches{/branch}","tags_url":"https://api.github.com/repos/Yathartha22/sympy/tags","blobs_url":"https://api.github.com/repos/Yathartha22/sympy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Yathartha22/sympy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Yathartha22/sympy/git/refs{/sha}","trees_url":"https://api.github.com/repos/Yathartha22/sympy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Yathartha22/sympy/statuses/{sha}","languages_url":"https://api.github.com/repos/Yathartha22/sympy/languages","stargazers_url":"https://api.github.com/repos/Yathartha22/sympy/stargazers","contributors_url":"https://api.github.com/repos/Yathartha22/sympy/contributors","subscribers_url":"https://api.github.com/repos/Yathartha22/sympy/subscribers","subscription_url":"https://api.github.com/repos/Yathartha22/sympy/subscription","commits_url":"https://api.github.com/repos/Yathartha22/sympy/commits{/sha}","git_commits_url":"https://api.github.com/repos/Yathartha22/sympy/git/commits{/sha}","comments_url":"https://api.github.com/repos/Yathartha22/sympy/comments{/number}","issue_comment_url":"https://api.github.com/repos/Yathartha22/sympy/issues/comments{/number}","contents_url":"https://api.github.com/repos/Yathartha22/sympy/contents/{+path}","compare_url":"https://api.github.com/repos/Yathartha22/sympy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Yathartha22/sympy/merges","archive_url":"https://api.github.com/repos/Yathartha22/sympy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Yathartha22/sympy/downloads","issues_url":"https://api.github.com/repos/Yathartha22/sympy/issues{/number}","pulls_url":"https://api.github.com/repos/Yathartha22/sympy/pulls{/number}","milestones_url":"https://api.github.com/repos/Yathartha22/sympy/milestones{/number}","notifications_url":"https://api.github.com/repos/Yathartha22/sympy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Yathartha22/sympy/labels{/name}","releases_url":"https://api.github.com/repos/Yathartha22/sympy/releases{/id}","deployments_url":"https://api.github.com/repos/Yathartha22/sympy/deployments","created_at":"2016-12-30T13:07:17Z","updated_at":"2018-07-09T20:26:54Z","pushed_at":"2018-07-09T15:22:31Z","git_url":"git://github.com/Yathartha22/sympy.git","ssh_url":"git@github.com:Yathartha22/sympy.git","clone_url":"https://github.com/Yathartha22/sympy.git","svn_url":"https://github.com/Yathartha22/sympy","homepage":"http://sympy.org/","size":91032,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"sympy:master","ref":"master","sha":"125e8863c84473636ddc94500abbd667c291961a","user":{"login":"sympy","id":260832,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2MDgzMg==","avatar_url":"https://avatars1.githubusercontent.com/u/260832?v=4","gravatar_id":"","url":"https://api.github.com/users/sympy","html_url":"https://github.com/sympy","followers_url":"https://api.github.com/users/sympy/followers","following_url":"https://api.github.com/users/sympy/following{/other_user}","gists_url":"https://api.github.com/users/sympy/gists{/gist_id}","starred_url":"https://api.github.com/users/sympy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sympy/subscriptions","organizations_url":"https://api.github.com/users/sympy/orgs","repos_url":"https://api.github.com/users/sympy/repos","events_url":"https://api.github.com/users/sympy/events{/privacy}","received_events_url":"https://api.github.com/users/sympy/received_events","type":"Organization","site_admin":false},"repo":{"id":640534,"node_id":"MDEwOlJlcG9zaXRvcnk2NDA1MzQ=","name":"sympy","full_name":"sympy/sympy","owner":{"login":"sympy","id":260832,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2MDgzMg==","avatar_url":"https://avatars1.githubusercontent.com/u/260832?v=4","gravatar_id":"","url":"https://api.github.com/users/sympy","html_url":"https://github.com/sympy","followers_url":"https://api.github.com/users/sympy/followers","following_url":"https://api.github.com/users/sympy/following{/other_user}","gists_url":"https://api.github.com/users/sympy/gists{/gist_id}","starred_url":"https://api.github.com/users/sympy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sympy/subscriptions","organizations_url":"https://api.github.com/users/sympy/orgs","repos_url":"https://api.github.com/users/sympy/repos","events_url":"https://api.github.com/users/sympy/events{/privacy}","received_events_url":"https://api.github.com/users/sympy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sympy/sympy","description":"A computer algebra system written in pure Python","fork":false,"url":"https://api.github.com/repos/sympy/sympy","forks_url":"https://api.github.com/repos/sympy/sympy/forks","keys_url":"https://api.github.com/repos/sympy/sympy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sympy/sympy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sympy/sympy/teams","hooks_url":"https://api.github.com/repos/sympy/sympy/hooks","issue_events_url":"https://api.github.com/repos/sympy/sympy/issues/events{/number}","events_url":"https://api.github.com/repos/sympy/sympy/events","assignees_url":"https://api.github.com/repos/sympy/sympy/assignees{/user}","branches_url":"https://api.github.com/repos/sympy/sympy/branches{/branch}","tags_url":"https://api.github.com/repos/sympy/sympy/tags","blobs_url":"https://api.github.com/repos/sympy/sympy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sympy/sympy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sympy/sympy/git/refs{/sha}","trees_url":"https://api.github.com/repos/sympy/sympy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sympy/sympy/statuses/{sha}","languages_url":"https://api.github.com/repos/sympy/sympy/languages","stargazers_url":"https://api.github.com/repos/sympy/sympy/stargazers","contributors_url":"https://api.github.com/repos/sympy/sympy/contributors","subscribers_url":"https://api.github.com/repos/sympy/sympy/subscribers","subscription_url":"https://api.github.com/repos/sympy/sympy/subscription","commits_url":"https://api.github.com/repos/sympy/sympy/commits{/sha}","git_commits_url":"https://api.github.com/repos/sympy/sympy/git/commits{/sha}","comments_url":"https://api.github.com/repos/sympy/sympy/comments{/number}","issue_comment_url":"https://api.github.com/repos/sympy/sympy/issues/comments{/number}","contents_url":"https://api.github.com/repos/sympy/sympy/contents/{+path}","compare_url":"https://api.github.com/repos/sympy/sympy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sympy/sympy/merges","archive_url":"https://api.github.com/repos/sympy/sympy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sympy/sympy/downloads","issues_url":"https://api.github.com/repos/sympy/sympy/issues{/number}","pulls_url":"https://api.github.com/repos/sympy/sympy/pulls{/number}","milestones_url":"https://api.github.com/repos/sympy/sympy/milestones{/number}","notifications_url":"https://api.github.com/repos/sympy/sympy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sympy/sympy/labels{/name}","releases_url":"https://api.github.com/repos/sympy/sympy/releases{/id}","deployments_url":"https://api.github.com/repos/sympy/sympy/deployments","created_at":"2010-04-30T20:37:14Z","updated_at":"2018-07-09T20:57:55Z","pushed_at":"2018-07-09T20:15:59Z","git_url":"git://github.com/sympy/sympy.git","ssh_url":"git@github.com:sympy/sympy.git","clone_url":"https://github.com/sympy/sympy.git","svn_url":"https://github.com/sympy/sympy","homepage":"http://sympy.org/","size":91827,"stargazers_count":4930,"watchers_count":4930,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2302,"mirror_url":null,"archived":false,"open_issues_count":3368,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2302,"open_issues":3368,"watchers":4930,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sympy/sympy/pulls/14736"},"html":{"href":"https://github.com/sympy/sympy/pull/14736"},"issue":{"href":"https://api.github.com/repos/sympy/sympy/issues/14736"},"comments":{"href":"https://api.github.com/repos/sympy/sympy/issues/14736/comments"},"review_comments":{"href":"https://api.github.com/repos/sympy/sympy/pulls/14736/comments"},"review_comment":{"href":"https://api.github.com/repos/sympy/sympy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sympy/sympy/pulls/14736/commits"},"statuses":{"href":"https://api.github.com/repos/sympy/sympy/statuses/90efc7a40791d393d2db412d6a46af358209b0c6"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"aktech"}}