Skip to content

Allow inducing G-sets along group homomorphisms#4921

Merged
lgoettgens merged 5 commits intooscar-system:masterfrom
lgoettgens:lg/induce-GSets
May 23, 2025
Merged

Allow inducing G-sets along group homomorphisms#4921
lgoettgens merged 5 commits intooscar-system:masterfrom
lgoettgens:lg/induce-GSets

Conversation

@lgoettgens
Copy link
Copy Markdown
Member

As discussed earlier today with @ThomasBreuer. I tried to align the name and argument order with the methods for GAPClassFunction and GModule.
Due to not all group types having usable morphism types, I added an undocumented method for general maps between groups, which should get adapted once we have proper group homes.

@jamesnohilly this allows for a similar cleanup of action_homomorphism in #4609 as forFinGenAbGroups in this PR. Depending on the order these two PRs get merged, the later one should perform the cleanup.

@lgoettgens lgoettgens added topic: groups release notes: use title For PRs: the title of this PR is suitable for direct use in the release notes labels May 22, 2025
@codecov
Copy link
Copy Markdown

codecov Bot commented May 22, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 84.92%. Comparing base (fffc6ad) to head (9c75ddf).
Report is 1 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #4921      +/-   ##
==========================================
- Coverage   84.93%   84.92%   -0.01%     
==========================================
  Files         686      686              
  Lines       92260    92277      +17     
==========================================
+ Hits        78361    78370       +9     
- Misses      13899    13907       +8     
Files with missing lines Coverage Δ
src/Groups/GrpAb.jl 93.28% <100.00%> (-0.11%) ⬇️
src/Groups/action.jl 98.00% <100.00%> (+0.09%) ⬆️
src/Groups/gsets.jl 94.27% <100.00%> (+0.22%) ⬆️

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ThomasBreuer
Copy link
Copy Markdown
Member

ThomasBreuer commented May 23, 2025

In the example

G = symmetric_group(4)
Omega = gset(G, permuted, [[1,1,2,3]])
H = permutation_group(8, [cperm([1,3], [2,4]), cperm([1,5], [2,6], [3,7], [4,8])])
phi = hom(H, G, [cperm([1,2]), cperm([1,3], [2,4])])
Omega2 = induce(Omega, phi)

my interpretation of the documentation is that Omega and Omega2 shall be equal as sets, they just carry different actions. G acts on Omega, H acts on Omega2.
For that, we cannot take just the seeds of Omega (the points whose closure under the action of G is Omega) as the seeds of Omega2, because H can be (and in the example is) smaller.
(If phi is known to be surjective then taking the seeds of Omega as the seeds of Omega2 is sufficient.
The check whether acting_group(Omega) equals codomain(phi) does not guarantee surjectivity.)

We could "unpack" Omega by computing all its elements, and take them as the seeds for the intended H-set.
If that is not desirable, we could think of creating the orbits of phi(H) on Omega, and then taking orbit representatives as seeds for Omega2. (Then we can also set the flag that Omega2 is closed under the action.)

(If we are instead interested in an H-orbit of a particular element omega of Omega, w.r.t. the action induced by phi, then this is something different. For that, we can first create the action function for H from phi and the action function of Omega, and then create the H-orbit of omega w.r.t. that function. In the above example, omega is [1,1,2,3], and the H-orbit of omega is Omega2.)

@lgoettgens
Copy link
Copy Markdown
Member Author

my interpretation of the documentation is that Omega and Omega2 shall be equal as sets, they just carry different actions. G acts on Omega, H acts on Omega2.
For that, we cannot take just the seeds of Omega (the points whose closure under the action of G is Omega) as the seeds of Omega2, because H can be (and in the example is) smaller.

Indeed, good catch. I opted to use Omega as an iterable of the seeds of Omega2 (with closed=true) as was already sone previously in the now replaced action_homomorphism(GSetByElements{FinGenAbGroup})).

(If we are instead interested in an H-orbit of a particular element omega of Omega, w.r.t. the action induced by phi, then this is something different. For that, we can first create the action function for H from phi and the action function of Omega, and then create the H-orbit of omega w.r.t. that function. In the above example, omega is [1,1,2,3], and the H-orbit of omega is Omega2.)

I am not quite sure which of the two scenarios is the correct one for my use-case (in the cases of non-surjective homs). But just to make sure: With the now updated code, I could compute the H-orbit of some omega by orbit(Omega2, omega), right?

@ThomasBreuer
Copy link
Copy Markdown
Member

Concerning the idea to document induce only for the case that the map phi is a GAPGroupHomomorphism{U, T} but to allow also for a Map{U, T}, I thought that a Map between groups is always assumed to be structure preserving (i. e., a group homomorphism).

The manual is not good enough in this respect: The section "Group homomorphisms" talks only about GAPGroupHomomorphism{S, T}, and the section "Maps" belongs to "Groups"/"Abelian Groups"/"Morphisms".

@ThomasBreuer
Copy link
Copy Markdown
Member

I am not quite sure which of the two scenarios is the correct one for my use-case (in the cases of non-surjective homs). But just to make sure: With the now updated code, I could compute the H-orbit of some omega by orbit(Omega2, omega), right?

Yes.

However, if one is interested just in one particular H-orbit, it might be cheaper to compute this directly, without creating the perhaps much too large H-set Omega2. For example, if H is the trivial group then computing the H-orbit of an element in Omega is cheap, but describing Omega as an H-set can be expensive. (We need a better way to describe Omega as an H-set, relative to the known G-set, and without the need to write down all elements.)

Copy link
Copy Markdown
Member

@ThomasBreuer ThomasBreuer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Thanks.

@lgoettgens
Copy link
Copy Markdown
Member Author

However, if one is interested just in one particular H-orbit, it might be cheaper to compute this directly, without creating the perhaps much too large H-set Omega2. For example, if H is the trivial group then computing the H-orbit of an element in Omega is cheap, but describing Omega as an H-set can be expensive. (We need a better way to describe Omega as an H-set, relative to the known G-set, and without the need to write down all elements.)

Indeed. My idea for that would be to add a function induced_action_function(Omega, phi) that returns the fun object from this PR, and then rewrite _induce to make use of that action function.
If we export that function as well, one could make use of it as orbit(H, fun, omega) for the H-orbit of omega.
What dou you think about this idea @ThomasBreuer ?

@ThomasBreuer
Copy link
Copy Markdown
Member

My idea for that would be to add a function induced_action_function(Omega, phi) that returns the fun object from this PR, and then rewrite _induce to make use of that action function.
If we export that function as well, one could make use of it as orbit(H, fun, omega) for the H-orbit of omega.
What do you think about this idea @ThomasBreuer ?

Yes.
We discussed yesterday that for some purposes, it is good to work with explicit G-sets, and for other purposes, it is good to work directly with their ingredients (the points, the group, the function). Thus it makes sense to switch between the two viewpoints.

@lgoettgens lgoettgens requested a review from ThomasBreuer May 23, 2025 12:50
@lgoettgens
Copy link
Copy Markdown
Member Author

I now added induced_action and induced_action_function where the latter is just a shorthand for induced_action(action_function(Omega), phi). It is just there for convenience.

Copy link
Copy Markdown
Member

@ThomasBreuer ThomasBreuer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good.
(I am a bit surprised that comparing the two functions with == works.)

@lgoettgens lgoettgens enabled auto-merge (squash) May 23, 2025 13:42
@lgoettgens lgoettgens merged commit 694e5c1 into oscar-system:master May 23, 2025
34 of 35 checks passed
@lgoettgens lgoettgens deleted the lg/induce-GSets branch May 23, 2025 15:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release notes: use title For PRs: the title of this PR is suitable for direct use in the release notes topic: groups

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants