@@ -297,10 +297,10 @@ InstallMethod( SkeletalCategoryOfTransitiveLeftGSets,
297297 end );
298298
299299 # # for two parallel morphisms uniquely determined by their images of the standard left coset
300- # # phi : G/U[s] → G/U[t], U[s] ↦ a U[t], psi : G/U[s] → G/U[t], U[s] ↦ b U[t],
301- # # the projection onto the coequalizer is given by a morphism pi : G/U[t] → G/U[p ], U[t] ↦ a U[p ],
302- # # which has to satisfy U[t] ⊆ ᵍU[p ] and (a g) U[p ] = (b g) U[p ] ⟺ g⁻¹ a⁻¹ b g ∈ U[p ],
303- # # which simplify to ⟨ U[t], a⁻¹ b ⟩ ⊆ ᵍU[p ], and hence ⟨ U[t], a⁻¹ b ⟩ = ᵍU[p ].
300+ # # φ : G/U[s] → G/U[t], U[s] ↦ a U[t], ψ : G/U[s] → G/U[t], U[s] ↦ b U[t],
301+ # # the projection onto the coequalizer is given by a morphism π : G/U[t] → G/U[c ], U[t] ↦ g U[c ],
302+ # # which has to satisfy U[t]ᵍ ⊆ U[c ] and (a g) U[c ] = (b g) U[c ] ⟺ g⁻¹ a⁻¹ b g ∈ U[c ],
303+ # # which simplify to ⟨ U[t], a⁻¹ b ⟩ᵍ ⊆ U[c ], and hence ⟨ U[t], a⁻¹ b ⟩ᵍ = U[c ].
304304 AddProjectionOntoCoequalizer( SkeletalTransitiveGSets,
305305 function ( SkeletalTransitiveGSets, target, diagram )
306306 local G, U, objects, t, l, gs, C, Ucoeq, index, cards, positions, pos, g, coeq;
@@ -317,7 +317,7 @@ InstallMethod( SkeletalCategoryOfTransitiveLeftGSets,
317317
318318 gs := List( [ 1 .. l ] , i -> UnderlyingGroupElement( diagram[ i] ) );
319319
320- C := List( [ 1 .. l - 1 ] , i -> Inverse( gs[ i] ) * gs[ i + 1 ] ); # # gs[1] is taken 1 in CoequalizerMorphisms
320+ C := List( [ 1 .. l - 1 ] , i -> Inverse( gs[ i] ) * gs[ i + 1 ] );
321321
322322 Ucoeq := Subgroup( G, Concatenation( GeneratorsOfGroup( U[ t] ), C ) );
323323
@@ -327,9 +327,49 @@ InstallMethod( SkeletalCategoryOfTransitiveLeftGSets,
327327
328328 positions := Filtered( [ 1 .. NumberOfObjects( SkeletalTransitiveGSets ) ] , i -> cards[ i] = index );
329329
330- # # pos := SafeUniqueEntry( positions, p -> IsConjugate( G, Ucoeq, U[p ] ) );
330+ # # pos := SafeUniqueEntry( positions, c -> IsConjugate( G, Ucoeq, U[c ] ) );
331331 # # but for performance we use:
332- pos := SafeFirst( positions, p -> IsConjugate( G, Ucoeq, U[ p] ) );
332+ pos := SafeFirst( positions, c -> IsConjugate( G, Ucoeq, U[ c] ) );
333+
334+ g := RepresentativeAction( G, Ucoeq, U[ pos] );
335+
336+ coeq := objects[ pos] ;
337+
338+ return MorphismConstructor( SkeletalTransitiveGSets,
339+ target,
340+ g,
341+ coeq );
342+
343+ end );
344+
345+ # #
346+ AddProjectionOntoCoequalizerOfIdentityAndAutomorphisms( SkeletalTransitiveGSets,
347+ function ( SkeletalTransitiveGSets, target, diagram )
348+ local G, U, objects, t, l, gs, Ucoeq, index, cards, positions, pos, g, coeq;
349+
350+ G := UnderlyingGroup( SkeletalTransitiveGSets );
351+
352+ U := RepresentativesOfSubgroupsUpToConjugation( SkeletalTransitiveGSets );
353+
354+ objects := SetOfObjects( SkeletalTransitiveGSets );
355+
356+ t := ObjectNumber( target );
357+
358+ l := Length( diagram );
359+
360+ gs := List( [ 1 .. l ] , i -> UnderlyingGroupElement( diagram[ i] ) );
361+
362+ Ucoeq := Subgroup( G, Concatenation( GeneratorsOfGroup( U[ t] ), gs ) );
363+
364+ index := Index( G, Ucoeq );
365+
366+ cards := CardinalitiesOfObjects( SkeletalTransitiveGSets );
367+
368+ positions := Filtered( [ 1 .. NumberOfObjects( SkeletalTransitiveGSets ) ] , i -> cards[ i] = index );
369+
370+ # # pos := SafeUniqueEntry( positions, c -> IsConjugate( G, Ucoeq, U[c] ) );
371+ # # but for performance we use:
372+ pos := SafeFirst( positions, c -> IsConjugate( G, Ucoeq, U[ c] ) );
333373
334374 g := RepresentativeAction( G, Ucoeq, U[ pos] );
335375
@@ -513,7 +553,7 @@ InstallMethod( Size,
513553end );
514554
515555# #
516- InstallOtherMethodForCompilerForCAP( CoequalizerMorphisms ,
556+ InstallOtherMethodForCompilerForCAP( CoequalizerAutomorphisms ,
517557 " for the skeletal category of transitive left G-sets and a transitive left G-set therein" ,
518558 [ IsSkeletalCategoryOfTransitiveLeftGSets, IsObjectInSkeletalCategoryOfTransitiveLeftGSets ] ,
519559
@@ -526,7 +566,7 @@ InstallOtherMethodForCompilerForCAP( CoequalizerMorphisms,
526566
527567 U := RepresentativesOfSubgroupsUpToConjugation( SkeletalTransitiveGSets );
528568
529- gs := Concatenation( [ One( UnderlyingGroup( SkeletalTransitiveGSets ) ) ] , GeneratorsOfGroup( U[ ObjectNumber( Omega )] ) );
569+ gs := GeneratorsOfGroup( U[ ObjectNumber( Omega )] );
530570
531571 return List( gs, g ->
532572 MorphismConstructor( G_as_cat,
@@ -537,13 +577,13 @@ InstallOtherMethodForCompilerForCAP( CoequalizerMorphisms,
537577end );
538578
539579# #
540- InstallMethod( CoequalizerMorphisms ,
580+ InstallMethod( CoequalizerAutomorphisms ,
541581 " for a skeletal transitive left G-set" ,
542582 [ IsObjectInSkeletalCategoryOfTransitiveLeftGSets ] ,
543583
544584 function ( Omega )
545585
546- return CoequalizerMorphisms ( CapCategory( Omega ), Omega );
586+ return CoequalizerAutomorphisms ( CapCategory( Omega ), Omega );
547587
548588end );
549589
@@ -609,25 +649,25 @@ InstallMethodForCompilerForCAP( ExtendFunctorToSkeletalCategoryOfTransitiveLeftG
609649 function ( obj_in_SkeletalTransitiveGSets )
610650 local coeq_mors, diagram, coeq;
611651
612- coeq_mors := CoequalizerMorphisms ( SkeletalTransitiveGSets, obj_in_SkeletalTransitiveGSets );
652+ coeq_mors := CoequalizerAutomorphisms ( SkeletalTransitiveGSets, obj_in_SkeletalTransitiveGSets );
613653
614654 diagram := List( coeq_mors, g ->
615655 functor_on_morphisms(
616656 img_obj,
617657 g,
618658 img_obj ) );
619659
620- return Coequalizer ( category_with_coequalizers, img_obj, diagram );
660+ return CoequalizerOfIdentityAndAutomorphisms ( category_with_coequalizers, img_obj, diagram );
621661
622662 end ;
623663
624664 extended_functor_on_morphisms :=
625665 function ( source, mor_in_SkeletalTransitiveGSets, target )
626666 local coeq_mors_source, coeq_mors_target, diagram_source, diagram_target, g;
627667
628- coeq_mors_source := CoequalizerMorphisms ( SkeletalTransitiveGSets, Source( mor_in_SkeletalTransitiveGSets ) );
668+ coeq_mors_source := CoequalizerAutomorphisms ( SkeletalTransitiveGSets, Source( mor_in_SkeletalTransitiveGSets ) );
629669
630- coeq_mors_target := CoequalizerMorphisms ( SkeletalTransitiveGSets, Target( mor_in_SkeletalTransitiveGSets ) );
670+ coeq_mors_target := CoequalizerAutomorphisms ( SkeletalTransitiveGSets, Target( mor_in_SkeletalTransitiveGSets ) );
631671
632672 diagram_source := List( coeq_mors_source, g ->
633673 functor_on_morphisms(
@@ -641,19 +681,19 @@ InstallMethodForCompilerForCAP( ExtendFunctorToSkeletalCategoryOfTransitiveLeftG
641681 g,
642682 img_obj ) );
643683
644- if not IsEqualForObjects( category_with_coequalizers, source, Coequalizer ( category_with_coequalizers, diagram_source ) ) then
684+ if not IsEqualForObjects( category_with_coequalizers, source, CoequalizerOfIdentityAndAutomorphisms ( category_with_coequalizers, img_obj , diagram_source ) ) then
645685 # COVERAGE_IGNORE_NEXT_LINE
646686 Error( " source and Coequalizer( diagram_source ) do not coincide\n " );
647687 fi ;
648688
649- if not IsEqualForObjects( category_with_coequalizers, target, Coequalizer ( category_with_coequalizers, diagram_target ) ) then
689+ if not IsEqualForObjects( category_with_coequalizers, target, CoequalizerOfIdentityAndAutomorphisms ( category_with_coequalizers, img_obj , diagram_target ) ) then
650690 # COVERAGE_IGNORE_NEXT_LINE
651691 Error( " target and Coequalizer( diagram_target ) do not coincide\n " );
652692 fi ;
653693
654694 g := GroupAsCategoryMorphism( G_as_cat, UnderlyingGroupElement( mor_in_SkeletalTransitiveGSets ) );
655695
656- return CoequalizerFunctorialWithGivenCoequalizers ( category_with_coequalizers,
696+ return CoequalizerOfIdentityAndAutomorphismsFunctorialWithGivenCoequalizers ( category_with_coequalizers,
657697 source,
658698 diagram_source,
659699 functor_on_morphisms(
0 commit comments