diff --git a/.github/workflows/doc-build.yml b/.github/workflows/doc-build.yml index dbd8c99ff30..5eb3998feee 100644 --- a/.github/workflows/doc-build.yml +++ b/.github/workflows/doc-build.yml @@ -56,9 +56,23 @@ jobs: git config --global --add safe.directory $(pwd) git config --global user.email "ci-sage@example.com" git config --global user.name "Build & Test workflow" + # mathjax path in old doc + mathjax_path_from=$(SAGE_USE_CDNS=no /sage/sage -python -c "from sage_docbuild.conf import mathjax_path; print(mathjax_path)") .ci/retrofit-worktree.sh worktree-image /sage - # Keep track of changes to built HTML - new_version=$(cat src/VERSION.txt); (cd /sage/local/share/doc/sage/html/en && find . -name "*.html" | xargs sed -i '/class="sidebar-brand-text"/s/Sage [0-9a-z.]* /Sage '$new_version' /'; git init && (echo "*.svg binary"; echo "*.pdf binary") >> .gitattributes && (echo ".buildinfo"; echo '*.inv'; echo '.git*'; echo '*.svg'; echo '*.pdf'; echo '*.png'; echo 'searchindex.js') > .gitignore; git add -A && git commit --quiet -m "old") + # mathjax path in new doc + mathjax_path_to=$(SAGE_USE_CDNS=yes /sage/sage -python -c "from sage_docbuild.conf import mathjax_path; print(mathjax_path)") + new_version=$(cat src/VERSION.txt) + # Wipe out chronic diffs between old doc and new doc + (cd /sage/local/share/doc/sage/html/en && \ + find . -name "*.html" | xargs sed -i -e '/class="sidebar-brand-text"/ s/Sage [0-9a-z.]* /Sage '"$new_version"' /' \ + -e 's;'"$mathjax_path_from"';'"$mathjax_path_to"';' \ + -e '\;; d') + # Create git repo from old doc + (cd /sage/local/share/doc/sage/html/en && \ + git init && \ + (echo "*.svg binary"; echo "*.pdf binary") >> .gitattributes && \ + (echo ".buildinfo"; echo '*.inv'; echo '.git*'; echo '*.svg'; echo '*.pdf'; echo '*.png'; echo 'searchindex.js') > .gitignore; \ + git add -A && git commit --quiet -m "old") - name: Download upstream artifact uses: actions/download-artifact@v3 @@ -77,7 +91,7 @@ jobs: id: incremental run: | # Now re-bootstrap and build. The build is incremental because we were careful with the timestamps. - ./bootstrap && make build + ./bootstrap && make sagemath_doc_html-build-deps working-directory: ./worktree-image env: MAKE: make -j2 --output-sync=recurse @@ -88,7 +102,7 @@ jobs: if: always() && steps.worktree.outcome == 'success' && steps.incremental.outcome != 'success' run: | set -ex - make sagelib-clean && git clean -fx src/sage && ./config.status && make build + make sagelib-clean && git clean -fx src/sage && ./config.status && make sagemath_doc_html-build-deps working-directory: ./worktree-image env: MAKE: make -j2 --output-sync=recurse @@ -105,7 +119,7 @@ jobs: mv /sage/local/share/doc/sage/html/en/.git /sage/.git-doc make doc-clean doc-uninstall mkdir -p /sage/local/share/doc/sage/html/en/ && mv /sage/.git-doc /sage/local/share/doc/sage/html/en/.git - ./config.status && make doc-html + ./config.status && make sagemath_doc_html-no-deps working-directory: ./worktree-image env: MAKE: make -j2 --output-sync=recurse @@ -117,12 +131,58 @@ jobs: run: | set -ex mkdir -p ./docs - # Create changelog - echo '## Preview of CHANGES.html' - (cd /sage/local/share/doc/sage/html/en && git diff --name-only) | tee ./docs/CHANGES.txt - (cd /sage/local/share/doc/sage/html/en && git diff; rm -rf .git) > ./docs/html.diff - echo '## Preview of html.diff'; head -n 400 ./docs/html.diff - (echo '

HTML diff'; sed -E 's,(.*),

\1,' ./docs/CHANGES.txt) > ./docs/CHANGES.html + (cd /sage/local/share/doc/sage/html/en && git commit -a -m 'new') + # Wipe out chronic diffs between old doc and new doc + (cd /sage/local/share/doc/sage/html/en && \ + find . -name "*.html" | xargs sed -i -e '\;; d') + # Create CHANGES.html + echo '' > ./docs/CHANGES.html + echo '' >> ./docs/CHANGES.html + echo '' >> ./docs/CHANGES.html + echo '' >> ./docs/CHANGES.html + echo '' >> ./docs/CHANGES.html + cat >> ./docs/CHANGES.html << EOF + + EOF + echo '' >> ./docs/CHANGES.html + echo '' >> ./docs/CHANGES.html + (cd /sage/local/share/doc/sage/html/en && git diff HEAD^; rm -rf .git) > ./docs/diff.txt + /sage/sage -python - << EOF + import re, html + with open('./docs/diff.txt', 'r') as f: + diff_text = f.read() + diff_blocks = re.split(r'^(?=diff --git)', diff_text, flags=re.MULTILINE) + out_blocks = [] + for block in diff_blocks: + match = re.search(r'^diff --git a/(.*) b/\1', block, flags=re.MULTILINE) + if match: + path = match.group(1) + out_blocks.append(f'

{path}

\n
' + html.escape(block).strip() + '
') + output_text = '\n'.join(out_blocks) + with open('./docs/diff.html', 'w') as f: + f.write(output_text) + EOF + cat ./docs/diff.html >> ./docs/CHANGES.html + echo '' >> ./docs/CHANGES.html + echo '' >>./docs/CHANGES.html + rm ./docs/diff.txt ./docs/diff.html + (cd /sage/local/share/doc/sage/html/en && git reset --hard HEAD) # For some reason the deploy step below cannot find /sage/... # So copy everything from there to local folder # We also need to replace the symlinks because netlify is not following them diff --git a/src/sage/calculus/transforms/dft.py b/src/sage/calculus/transforms/dft.py index b413bc0ea81..1b165fa6503 100644 --- a/src/sage/calculus/transforms/dft.py +++ b/src/sage/calculus/transforms/dft.py @@ -277,7 +277,7 @@ def plot(self): S = self.list() return line([[RR(I[i]), RR(S[i])] for i in range(len(I) - 1)]) - def dft(self, chi=lambda x: x): + def dft(self, chi=None): r""" A discrete Fourier transform "over `\QQ`" using exact `N`-th roots of unity. @@ -340,6 +340,8 @@ def dft(self, chi=lambda x: x): implemented Group (permutation, matrix), call .characters() and test if the index list is the set of conjugacy classes. """ + if chi is None: + chi = lambda x: x J = self.index_object() # index set of length N N = len(J) S = self.list() diff --git a/src/sage/combinat/finite_state_machine.py b/src/sage/combinat/finite_state_machine.py index acd0adb2718..045a5de379c 100644 --- a/src/sage/combinat/finite_state_machine.py +++ b/src/sage/combinat/finite_state_machine.py @@ -949,7 +949,7 @@ from sage.structure.sage_object import SageObject -def full_group_by(l, key=lambda x: x): +def full_group_by(l, key=None): """ Group iterable ``l`` by values of ``key``. @@ -1003,6 +1003,8 @@ def full_group_by(l, key=lambda x: x): Here, the result ``r`` has been sorted in order to guarantee a consistent order for the doctest suite. """ + if key is None: + key = lambda x: x elements = defaultdict(list) original_keys = {} for item in l: diff --git a/src/sage/combinat/root_system/type_A.py b/src/sage/combinat/root_system/type_A.py index 96bcec25f39..48d1474c1f4 100644 --- a/src/sage/combinat/root_system/type_A.py +++ b/src/sage/combinat/root_system/type_A.py @@ -277,7 +277,7 @@ def dynkin_diagram(self): g.add_edge(i, i+1) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -297,6 +297,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n > 1: @@ -306,7 +308,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): return ret + "".join(node((i-1)*node_dist, 0, label(i)) for i in self.index_set()) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the Dynkin diagram. @@ -332,6 +334,8 @@ def ascii_art(self, label=lambda i: i, node=None): n = self.n if n == 0: return "" + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node ret = "---".join(node(label(i)) for i in range(1,n+1)) + "\n" diff --git a/src/sage/combinat/root_system/type_A_affine.py b/src/sage/combinat/root_system/type_A_affine.py index f10d15c7f0e..57ed18afd01 100644 --- a/src/sage/combinat/root_system/type_A_affine.py +++ b/src/sage/combinat/root_system/type_A_affine.py @@ -111,7 +111,7 @@ def dynkin_diagram(self): g.add_edge(0, n) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -128,6 +128,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[fill=white] (3.0 cm, 1.2 cm) circle (.25cm) node[anchor=south east]{$0$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n == 1: @@ -148,7 +150,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): ret += node(mid, 1.2, label(0), 'anchor=south east') return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the extended Dynkin diagram. @@ -178,6 +180,8 @@ def ascii_art(self, label=lambda i: i, node=None): O<=>O 2 3 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node n = self.n diff --git a/src/sage/combinat/root_system/type_A_infinity.py b/src/sage/combinat/root_system/type_A_infinity.py index c3a2c603266..9e0f4711ccd 100644 --- a/src/sage/combinat/root_system/type_A_infinity.py +++ b/src/sage/combinat/root_system/type_A_infinity.py @@ -86,7 +86,7 @@ def _latex_(self): """ return 'A_{{{}}}'.format(self.n._latex_()) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the extended Dynkin diagram. @@ -100,6 +100,8 @@ def ascii_art(self, label=lambda i: i, node=None): 0 1 2 3 4 5 6 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node diff --git a/src/sage/combinat/root_system/type_B.py b/src/sage/combinat/root_system/type_B.py index 67794141adc..8e9cb6e75a5 100644 --- a/src/sage/combinat/root_system/type_B.py +++ b/src/sage/combinat/root_system/type_B.py @@ -245,7 +245,7 @@ def dynkin_diagram(self): g.set_edge_label(n-1, n, 2) return g - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the Dynkin diagram. @@ -261,6 +261,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O---O=>=O 3 4 5 6 7 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node n = self.n @@ -271,7 +273,7 @@ def ascii_art(self, label=lambda i: i, node=None): ret += "".join("{!s:4}".format(label(i)) for i in range(1, n + 1)) return ret - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -307,6 +309,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= - :meth:`sage.combinat.root_system.type_C.CartanType._latex_dynkin_diagram` - :meth:`sage.combinat.root_system.type_BC_affine.CartanType._latex_dynkin_diagram` """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n == 1: diff --git a/src/sage/combinat/root_system/type_BC_affine.py b/src/sage/combinat/root_system/type_BC_affine.py index bbc261902fb..740dfa2e5f3 100644 --- a/src/sage/combinat/root_system/type_BC_affine.py +++ b/src/sage/combinat/root_system/type_BC_affine.py @@ -138,7 +138,7 @@ def _latex_(self): else: return "BC_{%s}^{(2)}" % self.n - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -180,6 +180,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n == 1: @@ -206,7 +208,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += "}\n" + node(0, 0, label(0)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return a ascii art representation of the extended Dynkin diagram. @@ -227,6 +229,8 @@ def ascii_art(self, label=lambda i: i, node=None): O=<=O 2 3 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node n = self.n diff --git a/src/sage/combinat/root_system/type_B_affine.py b/src/sage/combinat/root_system/type_B_affine.py index 6cfe46255ae..047144f02d6 100644 --- a/src/sage/combinat/root_system/type_B_affine.py +++ b/src/sage/combinat/root_system/type_B_affine.py @@ -96,7 +96,7 @@ def dynkin_diagram(self): g.add_edge(0,2) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -130,6 +130,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n == 1: @@ -155,7 +157,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += node(i*node_dist, 0, label(i+1)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the extended Dynkin diagram. @@ -184,6 +186,8 @@ def ascii_art(self, label=lambda i: i, node=None): """ n = self.n from .cartan_type import CartanType + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node if n == 1: diff --git a/src/sage/combinat/root_system/type_C.py b/src/sage/combinat/root_system/type_C.py index 57669883bea..8c7ebce3359 100644 --- a/src/sage/combinat/root_system/type_C.py +++ b/src/sage/combinat/root_system/type_C.py @@ -232,7 +232,7 @@ def dynkin_diagram(self): """ return self.dual().dynkin_diagram().dual() - def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -268,9 +268,11 @@ def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2, dual= - :meth:`sage.combinat.root_system.type_C.CartanType._latex_dynkin_diagram` - :meth:`sage.combinat.root_system.type_BC_affine.CartanType._latex_dynkin_diagram` """ + if label is None: + label = lambda i: i return self.dual()._latex_dynkin_diagram(label=label, node=node, node_dist=node_dist, dual=not dual) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return a ascii art representation of the extended Dynkin diagram. @@ -289,6 +291,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O---O=<=O 3 4 5 6 7 """ + if label is None: + label = lambda i: i return self.dual().ascii_art(label=label, node=node).replace("=>=", "=<=") def _default_folded_cartan_type(self): diff --git a/src/sage/combinat/root_system/type_C_affine.py b/src/sage/combinat/root_system/type_C_affine.py index 72843b4d0a9..adaf5c77562 100644 --- a/src/sage/combinat/root_system/type_C_affine.py +++ b/src/sage/combinat/root_system/type_C_affine.py @@ -76,7 +76,7 @@ def dynkin_diagram(self): g.add_edge(0,1,2) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -117,6 +117,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n == 1: @@ -134,7 +136,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += "}\n" + node(0, 0, label(0)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return a ascii art representation of the extended Dynkin diagram. @@ -156,6 +158,8 @@ def ascii_art(self, label=lambda i: i, node=None): O<=>O 0 1 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node n = self.n diff --git a/src/sage/combinat/root_system/type_D.py b/src/sage/combinat/root_system/type_D.py index 28d4cd29cb2..5f1469e48a8 100644 --- a/src/sage/combinat/root_system/type_D.py +++ b/src/sage/combinat/root_system/type_D.py @@ -272,7 +272,7 @@ def dynkin_diagram(self): g.add_edge(n-2, n) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -288,6 +288,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[fill=white] (4 cm, -0.7 cm) circle (.25cm) node[right=3pt]{$3$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n == 2: @@ -305,7 +307,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): ret += node(rt_most, -0.7, label(self.n-1), 'right=3pt') return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return a ascii art representation of the extended Dynkin diagram. @@ -336,6 +338,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O---O---O 3 4 5 6 7 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node n = self.n diff --git a/src/sage/combinat/root_system/type_D_affine.py b/src/sage/combinat/root_system/type_D_affine.py index 3ea86f32438..f77204e4a01 100644 --- a/src/sage/combinat/root_system/type_D_affine.py +++ b/src/sage/combinat/root_system/type_D_affine.py @@ -111,7 +111,7 @@ def dynkin_diagram(self): g.add_edge(0,2) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -130,6 +130,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (4 cm, -0.7 cm) circle (.25cm) node[right=3pt]{$3$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node n = self.n @@ -152,7 +154,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += node(rt_most, -0.7, label(n-1), "right=3pt") return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the extended Dynkin diagram. @@ -182,6 +184,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O 5 3 4 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node n = self.n diff --git a/src/sage/combinat/root_system/type_E.py b/src/sage/combinat/root_system/type_E.py index 478c628a5e9..5771d6d948f 100644 --- a/src/sage/combinat/root_system/type_E.py +++ b/src/sage/combinat/root_system/type_E.py @@ -573,7 +573,7 @@ def dynkin_diagram(self): g.add_edge(i, i+1) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -591,6 +591,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[fill=white] (4 cm, 2 cm) circle (.25cm) node[right=3pt]{$2$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node ret = "\\draw (0 cm,0) -- (%s cm,0);\n" % ((self.n-2)*node_dist) @@ -601,7 +603,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): ret += node(2*node_dist, node_dist, label(2), 'right=3pt') return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return a ascii art representation of the extended Dynkin diagram. @@ -626,6 +628,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O---O---O---O---O 2 4 5 6 7 8 9 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node labels = [label(i) for i in [1,3,4,5,6] + list(range(7, self.n+1))] # We exclude 2 because of the special case diff --git a/src/sage/combinat/root_system/type_E_affine.py b/src/sage/combinat/root_system/type_E_affine.py index ac64cbfbdde..3268d0603e5 100644 --- a/src/sage/combinat/root_system/type_E_affine.py +++ b/src/sage/combinat/root_system/type_E_affine.py @@ -132,7 +132,7 @@ def dynkin_diagram(self): raise ValueError("Invalid Cartan Type for Type E affine") return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -152,6 +152,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): """ n = self.n + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node @@ -181,7 +183,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): ret += node(2*node_dist, node_dist, label(2), "right=3pt") return ret - def ascii_art(self, label=lambda x: x, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the extended Dynkin diagram. @@ -210,6 +212,8 @@ def ascii_art(self, label=lambda x: x, node=None): -2 0 1 2 3 4 5 -3 """ n = self.n + if label is None: + label = lambda x: x if node is None: node = self._ascii_art_node if n == 6: diff --git a/src/sage/combinat/root_system/type_F.py b/src/sage/combinat/root_system/type_F.py index ac33d97fbee..524dd1f7c35 100644 --- a/src/sage/combinat/root_system/type_F.py +++ b/src/sage/combinat/root_system/type_F.py @@ -290,7 +290,7 @@ def dynkin_diagram(self): g.set_edge_label(2,3,2) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -308,6 +308,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node ret = "\\draw (0 cm,0) -- (%s cm,0);\n" % node_dist @@ -322,7 +324,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += node(i*node_dist, 0, label(i+1)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the extended Dynkin diagram. @@ -335,6 +337,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O=>=O---O -1 0 1 2 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node ret = "{}---{}=>={}---{}\n".format(node(label(1)), node(label(2)), diff --git a/src/sage/combinat/root_system/type_F_affine.py b/src/sage/combinat/root_system/type_F_affine.py index 403c5b6e8ad..3d2dc8350ee 100644 --- a/src/sage/combinat/root_system/type_F_affine.py +++ b/src/sage/combinat/root_system/type_F_affine.py @@ -72,7 +72,7 @@ def dynkin_diagram(self): g.add_edge(0, 1) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -95,6 +95,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node ret = "\\draw (0 cm,0) -- (%s cm,0);\n" % node_dist @@ -103,7 +105,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += "}\n" + node(0, 0, label(0)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Returns a ascii art representation of the extended Dynkin diagram @@ -113,6 +115,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O=>=O---O 2 3 4 5 6 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node ret = "{}---{}---{}=>={}---{}\n".format(node(label(0)), node(label(1)), diff --git a/src/sage/combinat/root_system/type_G.py b/src/sage/combinat/root_system/type_G.py index 15da57bc11c..21dae3effa7 100644 --- a/src/sage/combinat/root_system/type_G.py +++ b/src/sage/combinat/root_system/type_G.py @@ -200,7 +200,7 @@ def dynkin_diagram(self): g.set_edge_label(2,1,3) return g - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -215,6 +215,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node ret = "\\draw (0,0) -- (%s cm,0);\n" % node_dist @@ -228,7 +230,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual= ret += node(node_dist, 0, label(2)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the Dynkin diagram. @@ -239,6 +241,8 @@ def ascii_art(self, label=lambda i: i, node=None): O=<=O 3 4 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node ret = " 3\n{}=<={}\n".format(node(label(1)), node(label(2))) diff --git a/src/sage/combinat/root_system/type_G_affine.py b/src/sage/combinat/root_system/type_G_affine.py index 2cb1487dfd8..582f7d9ed03 100644 --- a/src/sage/combinat/root_system/type_G_affine.py +++ b/src/sage/combinat/root_system/type_G_affine.py @@ -70,7 +70,7 @@ def dynkin_diagram(self): g.add_edge(0, 2) return g - def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2, dual=False): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. @@ -89,6 +89,8 @@ def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2, dual= \draw[fill=white] (4 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; """ + if label is None: + label = lambda x: x if node is None: node = self._latex_draw_node ret = "\\draw (%s cm,0) -- (%s cm,0);\n" % (node_dist, node_dist*2.0) @@ -98,7 +100,7 @@ def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2, dual= ret += node(2*node_dist, 0, label(0)) return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Returns an ascii art representation of the Dynkin diagram @@ -109,6 +111,8 @@ def ascii_art(self, label=lambda i: i, node=None): O=<=O---O 3 4 2 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node ret = " 3\n{}=<={}---{}".format(node(label(1)), node(label(2)), node(label(0))) diff --git a/src/sage/combinat/root_system/type_dual.py b/src/sage/combinat/root_system/type_dual.py index c2ea5d978d3..22c4fb809d4 100644 --- a/src/sage/combinat/root_system/type_dual.py +++ b/src/sage/combinat/root_system/type_dual.py @@ -209,7 +209,7 @@ def __reduce__(self): """ return (attrcall("dual"), (self._type,)) - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" EXAMPLES:: @@ -229,11 +229,13 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): } \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node return self._type._latex_dynkin_diagram(label, node, node_dist, dual=True) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of this Cartan type @@ -261,6 +263,8 @@ def ascii_art(self, label=lambda i: i, node=None): O=>=O---O---O=>=O 0 1 2 3 4 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node res = self._type.ascii_art(label, node) diff --git a/src/sage/combinat/root_system/type_marked.py b/src/sage/combinat/root_system/type_marked.py index 5d80ca1052a..a9ca7d15a35 100644 --- a/src/sage/combinat/root_system/type_marked.py +++ b/src/sage/combinat/root_system/type_marked.py @@ -278,7 +278,7 @@ def _latex_draw_mark(self, x, y, color='black', thickness='thin'): ret += "\\draw[shift={{({}, {})}}, {}, {}] (0.25cm, -0.25cm) -- (-0.25cm, 0.25cm);\n".format(x, y, color, thickness) return ret - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -296,11 +296,13 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node return self._type._latex_dynkin_diagram(label, node, node_dist) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of this Cartan type. @@ -320,6 +322,8 @@ def ascii_art(self, label=lambda i: i, node=None): X---O---X=>=O---O 0 1 2 3 4 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node return self._type.ascii_art(label, node) diff --git a/src/sage/combinat/root_system/type_reducible.py b/src/sage/combinat/root_system/type_reducible.py index 0f84b3f3b90..46cdccd2ab4 100644 --- a/src/sage/combinat/root_system/type_reducible.py +++ b/src/sage/combinat/root_system/type_reducible.py @@ -308,7 +308,7 @@ def dynkin_diagram(self): g.add_edge(relabelling[i,e1], relabelling[i,e2], label=l) return g - def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -332,6 +332,8 @@ def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2): \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; } """ + if label is None: + label = lambda x: x types = self.component_types() relabelling = self._index_relabelling ret = "{\n" @@ -341,7 +343,7 @@ def _latex_dynkin_diagram(self, label=lambda x: x, node=None, node_dist=2): ret += "}" return ret - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of this reducible Cartan type. @@ -367,6 +369,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O=<=O 11 12 13 """ + if label is None: + label = lambda i: i types = self.component_types() relabelling = self._index_relabelling return "\n".join(types[i].ascii_art(lambda x: label(relabelling[i,x]), node) diff --git a/src/sage/combinat/root_system/type_relabel.py b/src/sage/combinat/root_system/type_relabel.py index 142ddeffa45..1cc633dc16c 100644 --- a/src/sage/combinat/root_system/type_relabel.py +++ b/src/sage/combinat/root_system/type_relabel.py @@ -271,7 +271,7 @@ def _latex_(self): ret += " \\text{ relabelled by } " + latex(self._relabelling) return ret - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -285,9 +285,11 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$}; """ + if label is None: + label = lambda i: i return self._type._latex_dynkin_diagram(lambda i: label(self._relabelling[i]), node, node_dist) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of this Cartan type. @@ -307,6 +309,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O=>=O---O 4 3 2 1 0 """ + if label is None: + label = lambda i: i if node is None: node = self._ascii_art_node return self._type.ascii_art(lambda i: label(self._relabelling[i]), node) diff --git a/src/sage/combinat/root_system/type_super_A.py b/src/sage/combinat/root_system/type_super_A.py index dedc56b9011..c2717a572ff 100644 --- a/src/sage/combinat/root_system/type_super_A.py +++ b/src/sage/combinat/root_system/type_super_A.py @@ -737,7 +737,7 @@ def _latex_draw_node(self, x, y, label, position="below=4pt"): x+.17, y-.17, x-.17, y+.17) return ret - def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): + def _latex_dynkin_diagram(self, label=None, node=None, node_dist=2): r""" Return a latex representation of the Dynkin diagram. @@ -775,6 +775,8 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): \draw[-,thick] (0.17 cm, 0.17 cm) -- (-0.17 cm, -0.17 cm); \draw[-,thick] (0.17 cm, -0.17 cm) -- (-0.17 cm, 0.17 cm); """ + if label is None: + label = lambda i: i if node is None: node = self._latex_draw_node if self.n + self.m > 1: @@ -784,7 +786,7 @@ def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2): return ret + "".join(node((self.m+i)*node_dist, 0, label(i)) for i in self.index_set()) - def ascii_art(self, label=lambda i: i, node=None): + def ascii_art(self, label=None, node=None): """ Return an ascii art representation of the Dynkin diagram. @@ -812,6 +814,8 @@ def ascii_art(self, label=lambda i: i, node=None): O---O---O---O---O---X -5 -4 -3 -2 -1 0 """ + if label is None: + label = lambda i: i if node is None: node = lambda i: 'O' ret = "---".join(node(label(i)) for i in range(1,self.m+1)) diff --git a/src/sage/graphs/digraph_generators.py b/src/sage/graphs/digraph_generators.py index ec2f608e28c..2b29e0e73ef 100644 --- a/src/sage/graphs/digraph_generators.py +++ b/src/sage/graphs/digraph_generators.py @@ -1331,7 +1331,7 @@ def RandomDirectedAcyclicGraph(self, n, p, weight_max=None): return D - def RandomDirectedGN(self, n, kernel=lambda x: x, seed=None): + def RandomDirectedGN(self, n, kernel=None, seed=None): r""" Return a random growing network (GN) digraph with `n` vertices. @@ -1346,7 +1346,7 @@ def RandomDirectedGN(self, n, kernel=lambda x: x, seed=None): - ``n`` -- integer; number of vertices - - ``kernel`` -- the attachment kernel + - ``kernel`` -- the attachment kernel (default: identity function) - ``seed`` -- a ``random.Random`` seed or a Python ``int`` for the random number generator (default: ``None``) @@ -1365,6 +1365,8 @@ def RandomDirectedGN(self, n, kernel=lambda x: x, seed=None): True sage: D.show() # long time """ + if kernel is None: + kernel = lambda x: x if seed is None: seed = int(current_randstate().long_seed() % sys.maxsize) import networkx diff --git a/src/sage/graphs/graph_generators.py b/src/sage/graphs/graph_generators.py index e45371bc6d9..e7347c4a2c4 100644 --- a/src/sage/graphs/graph_generators.py +++ b/src/sage/graphs/graph_generators.py @@ -1192,7 +1192,7 @@ def nauty_genbg(self, options="", debug=False): G = BipartiteGraph(s[:-1], format='graph6', partition=partition) yield G - def cospectral_graphs(self, vertices, matrix_function=lambda g: g.adjacency_matrix(), graphs=None): + def cospectral_graphs(self, vertices, matrix_function=None, graphs=None): r""" Find all sets of graphs on ``vertices`` vertices (with possible restrictions) which are cospectral with respect to a @@ -1288,6 +1288,9 @@ def cospectral_graphs(self, vertices, matrix_function=lambda g: g.adjacency_matr ....: == g[0][1].laplacian_matrix(normalized=True).charpoly()) True """ + if matrix_function is None: + matrix_function = lambda g: g.adjacency_matrix() + from sage.graphs.graph_generators import graphs as graph_gen if graphs is None: graph_list = graph_gen(vertices, property=lambda _: True) diff --git a/src/sage/misc/sageinspect.py b/src/sage/misc/sageinspect.py index 811afc48755..195a2efb485 100644 --- a/src/sage/misc/sageinspect.py +++ b/src/sage/misc/sageinspect.py @@ -1810,10 +1810,10 @@ def formatannotation(annotation, base_module=None): def sage_formatargspec(args, varargs=None, varkw=None, defaults=None, kwonlyargs=(), kwonlydefaults=None, annotations={}, formatarg=str, - formatvarargs=lambda name: '*' + name, - formatvarkw=lambda name: '**' + name, - formatvalue=lambda value: '=' + repr(value), - formatreturns=lambda text: ' -> ' + text, + formatvarargs=None, + formatvarkw=None, + formatvalue=None, + formatreturns=None, formatannotation=formatannotation): """ Format an argument spec from the values returned by getfullargspec. @@ -1843,6 +1843,15 @@ def sage_formatargspec(args, varargs=None, varkw=None, defaults=None, sage: sage_formatargspec(args, defaults=defaults) '(a, b, c=3)' """ + if formatvarargs is None: + formatvarargs = lambda name: '*' + name + if formatvarkw is None: + formatvarkw = lambda name: '**' + name + if formatvalue is None: + formatvalue = lambda value: '=' + repr(value) + if formatreturns is None: + formatreturns = lambda text: ' -> ' + text + def formatargandannotation(arg): result = formatarg(arg) if arg in annotations: diff --git a/src/sage/rings/polynomial/groebner_fan.py b/src/sage/rings/polynomial/groebner_fan.py index 7e067a3a087..eb8928d09b5 100644 --- a/src/sage/rings/polynomial/groebner_fan.py +++ b/src/sage/rings/polynomial/groebner_fan.py @@ -1234,7 +1234,7 @@ def homogeneity_space(self): return h def render(self, file=None, larger=False, shift=0, rgbcolor=(0, 0, 0), - polyfill=max_degree, scale_colors=True): + polyfill=True, scale_colors=True): """ Render a Groebner fan as sage graphics or save as an xfig file. @@ -1295,6 +1295,8 @@ def render(self, file=None, larger=False, shift=0, rgbcolor=(0, 0, 0), ... NotImplementedError """ + if polyfill is True: + polyfill = max_degree S = self.__ring if S.ngens() < 3: print("For 2-D fan rendering the polynomial ring must have 3 variables (or more, which are ignored).")