Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

master -> web #5763

Merged
merged 39 commits into from
Dec 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
311c122
Fix buggy subgroup page when subgroup is in the database but without …
jwj61 Nov 12, 2023
96d2aaf
Retrigger tests
jwj61 Nov 12, 2023
4be6ca5
Make subgroup thing a WebAbstractGroup
jwj61 Nov 16, 2023
31d285d
matrix groups display
jenpaulhus Nov 17, 2023
cb16c42
updating matrix gp title
Nov 17, 2023
2e2e568
simplify
Nov 17, 2023
82df9a5
modcurve changes to handle missing decompositions
AndrewVSutherland Nov 26, 2023
727b014
Update web_curve.py
roed314 Nov 26, 2023
7f1994a
Merge pull request #5745 from AndrewVSutherland/master
roed314 Nov 26, 2023
926833e
quick fix
AndrewVSutherland Nov 26, 2023
788bb8c
Merge pull request #5747 from AndrewVSutherland/master
AndrewVSutherland Nov 26, 2023
514b106
Merge pull request #5733 from jenpaulhus/matrix
roed314 Nov 29, 2023
3431f50
autopep8 action fixes
roed314 Nov 29, 2023
c6ef3d4
Merge pull request #5754 from LMFDB/autopep8-patches
roed314 Nov 30, 2023
d177885
updates to character tables
Nov 30, 2023
647a51e
Merge branch 'master' of github.com:LMFDB/lmfdb into chartableupdate
jenpaulhus Nov 30, 2023
a80055f
Some updates to rational character tables
roed314 Nov 30, 2023
5682dca
Parallel changes to complex character tables
roed314 Nov 30, 2023
3163ef4
Merge pull request #44 from roed314/chartableupdate
jenpaulhus Nov 30, 2023
6d8efb1
updates to latex and auto_gens pages
jenpaulhus Nov 30, 2023
d456435
Adjust phrasing
jwj61 Dec 1, 2023
49b4cc8
pyflakes
jwj61 Dec 1, 2023
fbb620f
Update main.py
roed314 Dec 1, 2023
b294e4d
Update main.py
roed314 Dec 1, 2023
5f5f86a
Merge pull request #5729 from jwj61/biggroupsubfix
roed314 Dec 2, 2023
dcb98f1
autopep8 action fixes
roed314 Dec 2, 2023
cc6fd7a
Add minimal siblings
jwj61 Nov 28, 2023
4682c7c
show poly
jwj61 Nov 29, 2023
eb6e596
Move minimal sibling
jwj61 Dec 2, 2023
33e7275
Merge pull request #5750 from jwj61/minsib
AndrewVSutherland Dec 2, 2023
dbc41d2
Merge pull request #5757 from LMFDB/autopep8-patches
AndrewVSutherland Dec 2, 2023
196b07f
Add missing semicolon
roed314 Dec 5, 2023
97862ec
Merge pull request #5761 from roed314/semicolon
edgarcosta Dec 5, 2023
7f4284c
Remove incorrect __version__
davidlowryduda Dec 6, 2023
0c2ee16
Merge pull request #5766 from davidlowryduda/remove_useless_version
edgarcosta Dec 6, 2023
4e2482b
change -1 to - in irrQ and irrC
jenpaulhus Dec 7, 2023
65ecfd3
Merge pull request #5755 from jenpaulhus/chartableupdate
jwj61 Dec 9, 2023
27b7610
autopep8 action fixes
jwj61 Dec 9, 2023
fcf875c
Merge pull request #5773 from LMFDB/autopep8-patches
jwj61 Dec 10, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions lmfdb/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
# -*- coding: utf-8 -*-

__version__ = '0.1'

#from .website import main
#assert main
from .lmfdb_database import db
assert db
95 changes: 66 additions & 29 deletions lmfdb/groups/abstract/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def find_props(
props = []
noted = set()
for prop in overall_order:
if not getattr(gp, prop) or prop in noted or prop not in show:
if not getattr(gp, prop, None) or prop in noted or prop not in show:
continue
noted.add(prop)
impl = [B for B in implications.get(prop, []) if B not in noted]
Expand Down Expand Up @@ -229,41 +229,54 @@ def find_props(

def get_group_prop_display(gp):
# We want elementary and hyperelementary to display which primes, but only once
elementaryp = ",".join(str(p) for (p, e) in ZZ(gp.elementary).factor())
hyperelementaryp = ",".join(
str(p)
for (p, e) in ZZ(gp.hyperelementary).factor()
if not p.divides(gp.elementary)
)
elementaryp = ''
hyperelementaryp = ''
if hasattr(gp, 'elementary'):
elementaryp = ",".join(str(p) for (p, e) in ZZ(gp.elementary).factor())
hyperelementaryp = ",".join(
str(p)
for (p, e) in ZZ(gp.hyperelementary).factor()
if not p.divides(gp.elementary)
)
if (
gp.order == 1
): # here it will be implied from cyclic, so both are in the implication list
elementaryp = " (for every $p$)"
hyperelementaryp = ""
elif gp.pgroup: # We don't display p since there's only one in play
elif hasattr(gp, 'pgroup') and gp.pgroup: # We don't display p since there's only one in play
elementaryp = hyperelementaryp = ""
elif gp.cyclic: # both are in the implication list
elementaryp = f" ($p = {elementaryp}$)"
if gp.elementary == gp.hyperelementary:
hyperelementaryp = ""
else:
hyperelementaryp = f" (also for $p = {hyperelementaryp}$)"
elif gp.is_elementary: # Now elementary is a top level implication
elif hasattr(gp, 'is_elementary') and gp.is_elementary: # Now elementary is a top level implication
elementaryp = f" for $p = {elementaryp}$"
if gp.elementary == gp.hyperelementary:
if hasattr(gp, 'hyperelementary') and gp.elementary == gp.hyperelementary:
hyperelementaryp = ""
else:
hyperelementaryp = f" (also for $p = {hyperelementaryp}$)"
elif gp.hyperelementary: # Now hyperelementary is a top level implication
elif hasattr(gp, 'hyperelementary') and gp.hyperelementary: # Now hyperelementary is a top level implication
hyperelementaryp = f" for $p = {hyperelementaryp}$"
nilp_class = getattr(gp, 'nilpotency_class', None)
if nilp_class is not None:
nilp_phrase = f"{display_knowl('group.nilpotent', 'nilpotent')} of class {nilp_class}"
else:
nilp_phrase = f"{display_knowl('group.nilpotent', 'nilpotent')} of uncomputed class"
solv_length = getattr(gp, 'derived_length', None)
if solv_length is not None:
solv_phrase = f"{display_knowl('group.solvable', 'solvable')} of {display_knowl('group.derived_series', 'length')} {solv_length}"
else:
solv_phrase = f"{display_knowl('group.solvable', 'solvable')} of uncomputed length"
overall_display = {
"cyclic": display_knowl("group.cyclic", "cyclic"),
"abelian": display_knowl("group.abelian", "abelian"),
"nonabelian": display_knowl("group.abelian", "nonabelian"),
"nilpotent": f"{display_knowl('group.nilpotent', 'nilpotent')} of class {gp.nilpotency_class}",
"nilpotent": nilp_phrase,
"supersolvable": display_knowl("group.supersolvable", "supersolvable"),
"monomial": display_knowl("group.monomial", "monomial"),
"solvable": f"{display_knowl('group.solvable', 'solvable')} of {display_knowl('group.derived_series', 'length')} {gp.derived_length}",
"solvable": solv_phrase,
"nonsolvable": display_knowl("group.solvable", "nonsolvable"),
"Zgroup": f"a {display_knowl('group.z_group', 'Z-group')}",
"Agroup": f"an {display_knowl('group.a_group', 'A-group')}",
Expand All @@ -289,9 +302,19 @@ def get_group_prop_display(gp):

def get_group_impl_display(gp):
# Mostly we display things the same in implication lists, but there are a few extra parentheses
nilp_class = getattr(gp, 'nilpotency_class', None)
if nilp_class is not None:
nilp_phrase = f"{display_knowl('group.nilpotent', 'nilpotent')} of class {nilp_class}"
else:
nilp_phrase = f"{display_knowl('group.nilpotent', 'nilpotent')} of uncomputed class"
solv_length = getattr(gp, 'derived_length', None)
if solv_length is not None:
solv_phrase = f"{display_knowl('group.solvable', 'solvable')} of {display_knowl('group.derived_series', 'length')} {solv_length}"
else:
solv_phrase = f"{display_knowl('group.solvable', 'solvable')} of uncomputed length"
return {
"nilpotent": f"{display_knowl('group.nilpotent', 'nilpotent')} (of class {gp.nilpotency_class})",
"solvable": f"{display_knowl('group.solvable', 'solvable')} (of {display_knowl('group.derived_series', 'length')} {gp.derived_length})",
"nilpotent": f"{display_knowl('group.nilpotent', 'nilpotent')} ({nilp_phrase})",
"solvable": f"{display_knowl('group.solvable', 'solvable')} ({solv_phrase})",
}


Expand Down Expand Up @@ -468,7 +491,11 @@ def create_boolean_subgroup_string(sgp, type="normal"):
main = f"The subgroup is {display_props(props)}."
else:
main = f"This subgroup is {display_props(props)}."
unknown = [overall_display[prop] for prop in overall_order if getattr(sgp, prop) is None]
unknown = [prop for prop in overall_order if getattr(sgp, prop, None) is None]
if {'ab_simple', 'nab_simple'} <= set(unknown):
unknown.remove('ab_simple')

unknown = [overall_display[prop] for prop in unknown]
if unknown:
main += f" Whether it is {display_props(unknown, 'or')} has not been computed."
return main
Expand All @@ -478,6 +505,8 @@ def create_boolean_string(gp, type="normal"):
# We totally order the properties in two ways: by the order that they should be listed overall,
# and by the order they should be listed in implications
# For the first order, it's important that A come before B whenever A => B
if not gp:
return "Properties have not been computed"
overall_order = [
"cyclic",
"abelian",
Expand Down Expand Up @@ -563,7 +592,11 @@ def create_boolean_string(gp, type="normal"):
main = f"{display_props(props)}."
else:
main = f"This group is {display_props(props)}."
unknown = [overall_display[prop] for prop in overall_order if getattr(gp, prop) is None]
unknown = [prop for prop in overall_order if getattr(gp, prop, None) is None]
if {'ab_simple', 'nab_simple'} <= set(unknown):
unknown.remove('ab_simple')

unknown = [overall_display[prop] for prop in unknown]
if unknown and type != "knowl":
main += f" Whether it is {display_props(unknown, 'or')} has not been computed."
return main
Expand Down Expand Up @@ -733,10 +766,9 @@ def auto_gens(label):
return render_template(
"auto_gens_page.html",
gp=gp,
title="Generators of automorphism group for %s" % label,
bread=get_bread([("Automorphism group generators", " ")]),
learnmore=learnmore_list(),
)
title="Generators of automorphism group for $%s$" % gp.tex_name,
bread=get_bread([(label, url_for(".by_label", label=label)), ("Automorphism group generators", " ")]),
)


@abstract_page.route("/sub/<label>")
Expand All @@ -758,9 +790,8 @@ def char_table(label):
return render_template(
"character_table_page.html",
gp=gp,
title="Character table for %s" % label,
bread=get_bread([("Character table", " ")]),
learnmore=learnmore_list(),
title="Character table for $%s$" % gp.tex_name,
bread=get_bread([(label, url_for(".by_label", label=label)), ("Character table", " ")]),
)


Expand All @@ -774,9 +805,8 @@ def Qchar_table(label):
return render_template(
"rational_character_table_page.html",
gp=gp,
title="Rational character table for %s" % label,
bread=get_bread([("Rational character table", " ")]),
learnmore=learnmore_list(),
title="Rational character table for $%s$" % gp.tex_name,
bread=get_bread([(label, url_for(".by_label", label=label)), ("Rational character table", " ")]),
)

def _subgroup_diagram(label, title, only, style):
Expand Down Expand Up @@ -883,6 +913,13 @@ def show_factor(n):
return "$0$"
return f"${latex(ZZ(n).factor())}$"

#for irrQ_degree and irrC_degree gives negative value as "-"
def remove_negatives(n):
if n < 1:
return "-"
return n


def get_url(label):
return url_for(".by_label", label=label)

Expand Down Expand Up @@ -955,8 +992,8 @@ def group_postprocess(res, info, query):
ProcessedCol("outer_order", "group.outer_aut", r"$\card{\mathrm{Out}(G)}$", show_factor, align="center", short_title="outer automorphisms", default=False),
MathCol("transitive_degree", "group.transitive_degree", "Tr. deg", short_title="transitive degree", default=False),
MathCol("permutation_degree", "group.permutation_degree", "Perm. deg", short_title="permutation degree", default=False),
MathCol("irrC_degree", "group.min_complex_irrep_deg", r"$\C$-irrep deg", short_title=r"$\C$-irrep degree", default=False),
MathCol("irrQ_degree", "group.min_rational_irrep_deg", r"$\Q$-irrep deg", short_title=r"$\Q$-irrep degree", default=False),
ProcessedCol("irrC_degree", "group.min_complex_irrep_deg", r"$\C$-irrep deg", remove_negatives, short_title=r"$\C$-irrep degree", default=False, align="center"),
ProcessedCol("irrQ_degree", "group.min_rational_irrep_deg", r"$\Q$-irrep deg", remove_negatives, short_title=r"$\Q$-irrep degree", default=False, align="center"),
MultiProcessedCol("type", "group.type", "Type - length",
["abelian", "nilpotent", "solvable", "smith_abelian_invariants", "nilpotency_class", "derived_length", "composition_length"],
show_type,
Expand Down
30 changes: 17 additions & 13 deletions lmfdb/groups/abstract/templates/abstract-show-group.html
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,15 @@ <h3>Minimal Presentations</h3>
<tr>
<td>{{KNOWL('group.rank', 'Rank')}}:</td>
{% if gp.rank %}
<td>${{gp.rank}}$</td>
<td>{{gp.rank}}</td>
{% else %}
<td>not computed</td>
{% endif %}
</tr>
<tr>
<td>{{KNOWL('group.generators', 'Inequivalent ' + gp.gen_noun())}}:</td>
{% if gp.eulerian_function != None %}
<td>${{gp.eulerian_function}}$</td>
<td>{{gp.eulerian_function}}</td>
{% else %} <td>not computed</td> {% endif %}
</tr>
</table>
Expand Down Expand Up @@ -309,8 +309,8 @@ <h2> Homology </h2>
<tr>
<td>{{KNOWL('group.commutator_length', 'Commutator length')}}:</td>
{% if gp.commutator_count %}
<td>${{gp.commutator_count}}$</td>
{% elif gp.abelian %} <td>$0$</td>
<td>{{gp.commutator_count}}</td>
{% elif gp.abelian %} <td>0</td>
{% else %} <td>not computed</td> {% endif %}
</tr>
{% endif %}
Expand Down Expand Up @@ -584,6 +584,7 @@ <h2> Character theory </h2>
<p>



{% if not gp.rational_characters and gp.number_conjugacy_classes == None %}

<p> The character tables for this group have not been computed. </p>
Expand All @@ -592,6 +593,17 @@ <h2> Character theory </h2>

<h3>{{KNOWL('group.complex_character_table','Complex character table')}}</h3>

{% if gp.number_divisions == gp.number_conjugacy_classes %}

<p>
Every character has rational values, so the {{KNOWL('group.complex_character_table','complex character table')}} is the same as the rational character table below.
</p>


{% else %}



{% if gp.number_conjugacy_classes == None %}

<p> The complex character table for this group is not computed. </p>
Expand Down Expand Up @@ -626,16 +638,9 @@ <h3>{{KNOWL('group.complex_character_table','Complex character table')}}</h3>

{% endif %}

{% if gp.number_divisions == gp.number_conjugacy_classes %}

<p>
Every character has rational values, so the {{KNOWL('group.rational_character_table','rational character table')}} is the same as the complex character table.
</p>


{% else %}


{% endif %}

<h3>{{KNOWL('group.rational_character_table','Rational character table')}}</h3>

Expand All @@ -656,7 +661,6 @@ <h3>{{KNOWL('group.rational_character_table','Rational character table')}}</h3>
</p>
{% endif %}
{% endif %}
{% endif %}
{% endif %} {# gp.live() #}

{% endblock %}
40 changes: 35 additions & 5 deletions lmfdb/groups/abstract/templates/abstract-show-subgroup.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ <h2> Subgroup ($H$) information</h2>
{% endif %}
<tr><td>{{KNOWL('group.order',title='Order:')}}</td><td> {{info.pos_int_and_factor(seq.subgroup_order)}} </td></tr>
<tr><td>{{KNOWL('group.subgroup.index',title='Index:')}}</td><td> {{info.pos_int_and_factor(seq.quotient_order)}} </td></tr>
<tr><td>{{KNOWL('group.exponent',title='Exponent:')}}</td><td> {{info.pos_int_and_factor(seq.sub.exponent)}} </td></tr>
<tr><td>{{KNOWL('group.exponent',title='Exponent:')}}</td><td>
{% if seq.sub.exponent %}
{{info.pos_int_and_factor(seq.sub.exponent)}}
{% else %}
not computed
{% endif %}
</td></tr>
{% if seq.amb.show_subgroup_flag() %}<tr><td>{{KNOWL('group.generators', 'Generators:')}}</td><td> ${{seq.amb.show_subgroup_generators(seq)}}$</td></tr>{% endif %}
</table>
</p>
Expand Down Expand Up @@ -60,9 +66,27 @@ <h2> Quotient group ($Q$) structure </h2>
{% if seq.quotient is not none %} <tr><td>{{KNOWL('group.name', title='Description:')}}</td>
<td><a href="{{url_for('.by_label', label=seq.quotient)}}">${{seq.quotient_tex}}$</a></td></tr> {% endif %}
<tr><td>{{KNOWL('group.order',title='Order:')}}</td><td> {{info.pos_int_and_factor(seq.quotient_order)}} </td></tr>
<tr><td>{{KNOWL('group.exponent',title='Exponent:')}}</td><td> {{info.pos_int_and_factor(seq.quo.exponent)}} </td></tr>
<tr><td>Automorphism Group:</td><td>{{seq.quo.show_aut_group()|safe}}</td></tr>
<tr><td>Outer Automorphisms:</td><td>{{seq.quo.show_outer_group()|safe}}</td></tr>
<tr><td>{{KNOWL('group.exponent',title='Exponent:')}}</td><td>
{% if seq.sub|attr('exponent') %}
{{info.pos_int_and_factor(seq.quo.exponent)}}
{% else %}
not computed
{% endif %}
</td></tr>
<tr><td>Automorphism Group:</td><td>
{% if seq.quo|attr('show_aut_group')%}
{{seq.quo.show_aut_group()|safe}}
{% else %}
not computed
{% endif %}
</td></tr>
<tr><td>Outer Automorphisms:</td><td>
{% if seq.quo|attr('show_outer_group')%}
{{seq.quo.show_outer_group()|safe}}
{% else %}
not computed
{% endif %}
</td></tr>
</table>
</p>

Expand All @@ -88,7 +112,13 @@ <h2> Automorphism information </h2>
{% endif %}
<table>
<tr><td>$\operatorname{Aut}(G)$</td><td>{{seq.amb.show_aut_group()|safe}}</td></tr>
<tr><td>$\operatorname{Aut}(H)$</td><td>{{seq.sub.show_aut_group()|safe}}</td></tr>
<tr><td>$\operatorname{Aut}(H)$</td><td>
{% if seq.sub|attr('show_aut_group') %}
{{seq.sub.show_aut_group()|safe}}
{% else %}
not computed
{% endif %}
</td></tr>
{% if seq.aut_weyl_group is not none %}
<tr><td>$\operatorname{res}({{S}})$</td><td><a href="{{url_for('.by_label', label=seq.aut_weyl_group)}}">${{seq.aut_weyl.tex_name}}$</a>, of order {{info.pos_int_and_factor(seq.aut_weyl.order)}}</td></tr>
{% elif seq.aut_weyl_index is not none %}
Expand Down
16 changes: 13 additions & 3 deletions lmfdb/groups/abstract/templates/auto_gens_page.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

{% extends "base.html" %}
{% extends "homepage.html" %}

{% block content %}

{% block body %}

<br>

<p>
&nbsp; Each row represents an {{KNOWL('group.automorphism', 'automorphism')}} given by its image on a set of {{KNOWL('group.generators','generators')}} of the group (listed as the headers of the columns). <br>
Expand Down Expand Up @@ -33,6 +33,16 @@
</table>
</p>

{% endblock %}


{# Hack to remove the sidebar and move main content over #}
{% block sidebar %}
<style>
#main {
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 10px;
min-height:600px;
}
</style>
{% endblock %}
15 changes: 13 additions & 2 deletions lmfdb/groups/abstract/templates/character_table_page.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
{% extends "base.html" %}
{% extends "homepage.html" %}

{% block body %}
{% block content %}

{% include 'character_table.html' %}

{% endblock %}

{# Hack to remove the sidebar and move main content over #}
{% block sidebar %}
<style>
#main {
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 10px;
min-height:600px;
}
</style>
{% endblock %}
Loading