Environment to perform calculations of equivariant vector bundles on homogeneous varieties
Equivariant_Vector_Bundles_On_Homogeneous_Varieties__0-2 / src / Equivariant_Vector_Bundles_On_Homogeneous_Varieties / Base_Space / Homogeneous_Variety.sage.py
1842 viewsLicense: GPL3
ubuntu2204
12# This file was *autogenerated* from the file Homogeneous_Variety.sage3from sage.all_cmdline import * # import sage library45_sage_const_1 = Integer(1); _sage_const_0 = Integer(0); _sage_const_2 = Integer(2); _sage_const_4 = Integer(4); _sage_const_6 = Integer(6); _sage_const_7 = Integer(7); _sage_const_8 = Integer(8)6from typing import Iterator7from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Foundation.Structure import Structure , Irreducible_Structure , Direct_Sum_Of_Structures8from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Base_Space.Cartan_Group import Irreducible_Cartan_Group9from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Base_Space.Parabolic_Subgroup import Parabolic_Subgroup_In_Irreducible_Cartan_Group10111213class Homogeneous_Variety ( Structure ) :1415BASIS_LABELLING = { 'sr' : [ 'sr' , 'simple roots' , 'alphas' , 'A' ] ,16'mx' : [ 'mx' , 'mixed' , 'simple roots for included nodes and fundamental weights for excluded nodes' , 'B' ] ,17'fw' : [ 'fw' , 'fundamental weights' , 'omegas' , 'C' ] ,18'ambt' : [ 'ambt' , 'ambient' , 'e_i`s' , 'D' ]19}20212223class Irreducible_Homogeneous_Variety ( Irreducible_Structure , Homogeneous_Variety ) :2425def __init__( self , Parabolic_Subgroup:Parabolic_Subgroup_In_Irreducible_Cartan_Group ) -> None :26"""27Initialize a homogeneous variety X=G/P.2829INPUT:30- ``Parabolic_Subgroup`` -- Parabolic_Subgroup_In_Irreducible_Cartan_Group ;3132OUTPUT: None.33"""34assert isinstance( Parabolic_Subgroup , Parabolic_Subgroup_In_Irreducible_Cartan_Group ) , TypeError('The input must be a parabolic subgroup in an irreducible Cartan group.')35self._Parabolic_Subgroup = Parabolic_Subgroup363738def __repr__ ( self ) -> Parabolic_Subgroup_In_Irreducible_Cartan_Group :39"""Returns all attributes which are necessary to initialize the object."""40return self.Parent_Group()414243def __str__ ( self , Output_Style='Long' ) -> str :44"""Returns a one-line string as short description."""45if Output_Style == 'Short' : return self.Parent_Group().Cartan_String() + '/P(' + str( self.Included_Nodes() ) + ')'46elif Output_Style == 'Long' : return 'Smooth projective variety ' + self.__str__( Output_Style='Short' ) + '.'47else : raise ValueError('The input for ``Output_Style`` is inappropriate.')484950def Available_Negative_Roots ( self ) -> "Root" :51"""Returns all available negative roots."""52for Root in self.Parent_Group().Cartan_Type().root_system().root_lattice().negative_roots() :53if not Root in self.Parabolic_Subgroup().Negative_Roots() :54yield Root555657def Available_Positive_Roots ( self ) -> "Root" :58"""Returns all available positive roots."""59for Root in self.Parent_Group().Cartan_Type().root_system().root_lattice().positive_roots() :60if not Root in self.Parabolic_Subgroup().Negative_Roots() :61yield Root626364def Available_Roots ( self ) -> "Root" :65"""Returns all available roots."""66for Root in self.Parent_Group().Cartan_Type().root_system().root_lattice().roots() :67if not Root in self.Parabolic_Subgroup().Negative_Roots() :68yield Root697071def Basis ( self , Label:str='mx' ) -> dict :72"""73Returns the basis in terms of simple roots and fundamental weights.7475INPUT:76- ``self`` -- Parabolic_Subgroup; the parabolic subgroup P of a Cartan group G.77- ``Label`` -- str (default: 'mx');7879OUTPUT:80- ``Output`` -- Dictionary.8182ALGORITHM:83- alpha_i : the simple root associated to the i-th node.84- omega_i : the fundamental weight associated to the i-th node.8586- sr = { alpha_i }87- mx_{ i : i excluded } = { alpha_i : i included } cup { omega_i : i excluded }.88Note: mx_{} = sr and mx_{ all i's } = fw89- fw = { omega_i }90- ambt = { standard basis e_i }91"""92if Label in self.BASIS_LABELLING['sr'] :93return dict( self.Parent_Group().Cartan_Type().root_system().weight_space().simple_roots() )9495elif Label in self.BASIS_LABELLING['mx'] :96MixedBasis = {}97for Node in self.Parent_Group().Cartan_Type().index_set() :98if Node in self.Parabolic_Subgroup().Included_Nodes() : Element = self.Parent_Group().Cartan_Type().root_system().weight_space().simple_root(Node)99elif Node in self.Parabolic_Subgroup().Excluded_Nodes() : Element = self.Parent_Group().Cartan_Type().root_system().weight_space().fundamental_weight(Node)100else : raise ValueError('Plausibility? The set of nodes subdivides into the disjoint union of marked ones and excluded ones.')101MixedBasis.update( { Node : Element } )102return MixedBasis103104elif Label in self.BASIS_LABELLING['fw'] :105return dict( self.Parent_Group().Cartan_Type().root_system().weight_space().fundamental_weights() )106107elif Label in self.BASIS_LABELLING['ambt'] :108n = self.Parent_Group().Cartan_Degree()109return { Node : vector( QQ , (Node-_sage_const_1 )*[ _sage_const_0 ] + [ _sage_const_1 ] + (n-Node)*[ _sage_const_0 ] ) for Node in (ellipsis_range( _sage_const_1 ,Ellipsis, n )) }110111else : raise ValueError('The input of ``Label`` is inappropriate.')112113114# Synonym for the method ``Tautological_Subbundle``115def calO ( self , *Twists:tuple[int] ) -> "Irreducible_Equivariant_Vector_Bundle" :116"""Returns the structure sheaf or a twist of it."""117return self.Structure_Sheaf( *Twists )118119120# Snynoms for different methods depending on the input121def calU ( self , *Input ) -> "Irreducible_Equivaraint_Vector_Bundle" :122"""Returns the tautological subbundle (if there no input) or the irreequivariant vector bundle associated to a highest weight (if there is some input otherwise)."""123if len(Input) == _sage_const_0 : # Synonym for the method ``Tautological_Subbundle``124return self.Tautological_Subbundle()125126else : # Synonym for the method ``Equivariant_Vector_Bundles``127return self.Equivariant_Vector_Bundle( *Input )128129130# Synonym for the method ``Trivial_Vector_Bundle``131def calV ( self ) -> "Direct_Sum_Of_Equivariant_Vector_Bundles" :132"""Returns the trivial vector bundle ."""133return self.Trivial_Vector_Bundle()134135136def Cartan_Degree ( self ) -> int :137"""Returns the Cartan degree of the parent Group G."""138return self.Parent_Group().Cartan_Degree()139140141def Cartan_Family ( self ) -> str :142"""Returns the Cartan family of the parent Group G."""143return self.Parent_Group().Cartan_Family()144145146def Cartan_Matrix ( self , From:str='fw' , To:str='mx' ) -> Matrix :147"""148Returns the base change between the bases sr, mx or fw.149150INPUT:151- ``self`` -- Parabolic_Subgroup; the parabolic subgroup P of a Cartan group G.152153OUTPUT:154- ``Output`` -- Matrix.155156ALGORITHM:157- alpha_i : the simple root associated to the i-th node.158- omega_i : the fundamental weight associated to the i-th node.159160- sr >> fw : Cartan matrix161- fw >> sr : Inverse of Cartan matrix (sr >> fw)162- mx >> fw : For each excluded node i, replace the i-th column by a standard vector e_i.163- fw >> mx : Inverse of mx >> fw164- sr >> mx : Composition of sr >> fw >> mx165- mx >> sr : Inverse of sr >> mx166"""167if From in self.BASIS_LABELLING['sr'] : From = 'sr'168elif From in self.BASIS_LABELLING['mx'] : From = 'mx'169elif From in self.BASIS_LABELLING['fw'] : From = 'fw'170elif From in self.BASIS_LABELLING['ambt'] : From = 'ambt'171else : raise ValueError('The input for ``From`` is inappropriate.')172if To in self.BASIS_LABELLING['sr'] : To = 'sr'173elif To in self.BASIS_LABELLING['mx'] : To = 'mx'174elif To in self.BASIS_LABELLING['fw'] : To = 'fw'175elif To in self.BASIS_LABELLING['ambt'] : To = 'ambt'176else : raise ValueError('The input for ``To`` is inappropriate.')177178if From == To : return matrix.identity( self.Parent_Group().Cartan_Degree() )179180elif From == 'sr' :181if To == 'mx' : return self.Cartan_Matrix( From = 'fw' , To = 'mx') * self.Cartan_Matrix( From = 'sr' , To = 'fw')182elif To == 'fw' : return self.Parent_Group().Cartan_Type().cartan_matrix()183elif To == 'ambt' :184sr = self.Basis('sr')185ambt = self.Basis('ambt')186return matrix( QQ , [ sum([ alpha.to_ambient()[Node-_sage_const_1 ]*e for Node , e in ambt.items() ]) for Node , alpha in sr.items() ] ).transpose()187188elif From == 'mx' :189if To == 'sr' : return self.Cartan_Matrix( From = 'sr' , To = 'mx' ).inverse()190elif To == 'fw' :191Matrix = copy( self.Cartan_Matrix( From = 'sr' , To = 'fw' ) )192for Node in self.Parabolic_Subgroup().Excluded_Nodes() :193Matrix[:,Node-_sage_const_1 ] = vector([ kronecker_delta( I , Node ) for I in (ellipsis_range( _sage_const_1 ,Ellipsis, self.Parent_Group().Cartan_Degree() )) ])194return Matrix195elif To == 'ambt' : return self.Cartan_Matrix( From = 'fw' , To = 'ambt') * self.Cartan_Matrix( From = 'mx' , To = 'fw')196197elif From == 'fw' :198if To == 'sr' : return self.Cartan_Matrix( From = 'sr' , To = 'fw' ).inverse()199elif To == 'mx' : return self.Cartan_Matrix( From = 'mx' , To = 'fw' ).inverse()200elif To == 'ambt' :201fw = self.Basis('fw')202ambt = self.Basis('ambt')203return matrix( QQ , [ sum([ omega.to_ambient()[Node-_sage_const_1 ]*e for Node , e in ambt.items() ]) for Node , omega in fw.items() ] ).transpose()204205elif From == 'ambt' :206if To == 'sr' : return self.Cartan_Matrix( From = 'sr' , To = 'ambt' ).inverse()207elif To == 'fw' : return self.Cartan_Matrix( From = 'fw' , To = 'ambt' ).inverse()208elif To == 'mx' : return self.Cartan_Matrix( From = 'mx' , To = 'ambt' ).inverse()209210211def Cartan_String ( self ) -> str :212"""Returns the Cartan string of the parent Group G."""213return self.Parent_Group().Cartan_String()214215216def Cartan_Type ( self ) -> CartanType :217"""Returns the attribute ``Cartan_Type`` of the parent Group G."""218return self.Parent_Group().Cartan_Type()219220221def Compare_Roots ( self , Root1 , Root2 ) -> str or None :222"""Returns None if the two roots are not comparable and a result '<', '==', or '>' otherwise."""223224RL = self.Parent_Group().Cartan_Type().root_system().root_lattice()225assert Root1 in RL , ValueError('The input for ``Root1`` is not a root.')226assert Root2 in RL , ValueError('The input for ``Root2`` is not a root.')227228if Root1 == Root2 :229return '=='230231else :232Difference_In_srBasis = Root1-Root2233if Difference_In_srBasis.is_positive_root() : return '>'234elif (-_sage_const_1 *Difference_In_srBasis).is_positive_root() : return '<'235else : return None236237238def Compare_Weights ( self , Weight1 , Weight2 ) -> str or None :239"""Returns None if the two weights are not comparable and a result '<', '==', or '>' otherwise."""240241WS = self.Parent_Group().Cartan_Type().root_system().weight_space()242assert Weight1 in WS , ValueError('The input for ``Weight1`` is not a weight.')243assert Weight2 in WS , ValueError('The input for ``Weight2`` is not a weight.')244245if Weight1 == Weight2 :246return '=='247248else :249RL = self.Parent_Group().Cartan_Type().root_system().root_space()250scr = RL.simple_coroots()251sr = RL.simple_roots()252Coefficients_For_fwBasis = [ (Weight1-Weight2).scalar(coroot) for coroot in scr ]253Coefficients_For_srBasis = vector( QQ , Coefficients_For_fwBasis ) * self.Cartan_Matrix( From='fw' , To='sr' )254Difference_In_srBasis = sum([ QQ(Coefficient)*sr[Node] for Node , Coefficient in enumerate( list( Coefficients_For_srBasis ) , start = _sage_const_1 ) ])255256if Difference_In_srBasis.is_positive_root() : return '>'257elif (-_sage_const_1 *Difference_In_srBasis).is_positive_root() : return '<'258else : return None259260261def Complex ( self , Objects ) -> "Complex_Over_Irreducible_Homogeneous_Variety" :262"""Returns a complex of equivariant vector bundles over ``self``."""263from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Overlying_Structure.Complex_Of_Equivariant_Vector_Bundles import Complex_Of_Coherent_Sheaves264return Complex_Of_Coherent_Sheaves( Base_Space=self , Objects=Objects )265266267# ..ToDo: For PP^n, it is only correct up to sign.268def Complex_Defining_Exterior_Power_Of_Tautological_Quotient_Bundle ( self , p :int =_sage_const_1 ) -> "Complex_Over_Irreducible_Homogeneous_Variety" :269"""Returns the complex defining the p-th exterior power of the tautological quotient bundle on ``self``."""270assert isinstance( p , Integer ) , 'The input for `p` need to be an integer.'271272G = self.Parent_Group()273fw = self.Basis('fw')274Terms = dict({})275for i in (ellipsis_range( _sage_const_0 ,Ellipsis, p+_sage_const_1 )) :276if i == _sage_const_0 : Terms.update({ _sage_const_0 : 'Cokernel' })277else : Terms.update({ -_sage_const_1 *i : self.Tautological_Subbundle().Symmetric_Power( i-_sage_const_1 ).Multiply_By( G.rmV( fw[_sage_const_1 ] ).exterior_power( p-i+_sage_const_1 ) ) })278return self.Complex( Terms )279280281def Dimension ( self ) -> int :282"""Returns the dimension dim X = dim G - dim P."""283return self.Parent_Group().Dimension() - self.Parabolic_Subgroup().Dimension()284285286def Equivariant_Vector_Bundle ( self , *Inputs:tuple ) -> "Equivariant_Vector_Bundles" :287"""Returns the direct sum of equivariant vector bundles induced by the given highest weights."""288Constituent_Parts = list(Inputs)289from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Overlying_Structure.Equivariant_Vector_Bundle import Equivariant_Vector_Bundle290return Equivariant_Vector_Bundle.Constructor( Base_Space=self , Constituent_Parts=Constituent_Parts )291292293def Excluded_Nodes ( self ) -> set :294"""Returns the attribute ``Excluded_Nodes`` of the parabolic subgroup P."""295return self.Parabolic_Subgroup().Excluded_Nodes()296297298def Expected_Support_Partition_For_Minimal_Full_Lefschetz_Collection ( self ) -> tuple[ int ] :299"""Returns the expected support partition for a minimal Lefschetz collection on ``self``."""300assert self.Parabolic_Subgroup().Is_Maximal() , ValueError('The method is only implemented for those homogeneous varieties where the parabolic subgroup is maximal.')301302Collection__Expected_Length = self.K0().rank()303Node , Fano_Index = next(self.Fano_Index())304305Rectangular_Part__Expected_Height = Fano_Index306Rectangular_Part__Expected_Width = floor( Collection__Expected_Length / Rectangular_Part__Expected_Height )307Residual_Part__Expected_Height = Collection__Expected_Length - Rectangular_Part__Expected_Height * Rectangular_Part__Expected_Width308if Residual_Part__Expected_Height == _sage_const_0 : Residual_Part__Expected_Width = _sage_const_0309else : Residual_Part__Expected_Width = _sage_const_1310311return tuple( Residual_Part__Expected_Height * [ Rectangular_Part__Expected_Width+_sage_const_1 ] + (Rectangular_Part__Expected_Height-Residual_Part__Expected_Height) * [ Rectangular_Part__Expected_Width ] )312313314def Fano_Index ( self ) -> Iterator[ tuple[ int , int ] ]:315"""316Returns the Fano index of ``self``.317318INPUT:319- ``self`` -- Parabolic_Subgroup; the parabolic subgroup P of a Cartan group G.320321OUTPUT:322- ``Node`` -- Excluded node323- ``Fano_Index`` -- Index associated to X = G/P(Excluded_Nodes={Node})324325ALGORITHM:326Thanks to the post by Pieter Belmans concerning the index of partial flag varieties327from Aug 23rd, 2018 on his blog (cf. to [Blog_PieterBelmans]_). The link is328https://pbelmans.ncag.info/blog/2018/08/23/index-partial-flag-varieties/329(Date: Apr 26th, 2021).330331The index, i.e. for X=G/P (P maximal), we have Pic(X) ≅ ZZ⋅O_X(1) and therefore define the index as the integer i332such that ω∨_X ≅ O_X(1) ⊗ i.333334To compute it, we use lemma 2.19 and remark 2.20 of [KP2016]. Combined they say the following:335Let β be the simple root corresponding to the chosen maximal parabolic subgroup P, and ξ the associated336fundamental weight. Let ¯β be the maximal root of the same length as β such that the coefficient of β337in the expression of ¯β is 1.338Then the index of G/P equals i_G/P = (ρ,β+¯β)/(ξ,β).339340REFERENCE:341[Blog_PieterBelmans] https://pbelmans.ncag.info/blog/342[KP2016] Kuznetsov, Alexander; Polishchuk, Alexander Exceptional collections on isotropic Grassmannians.343J. Eur. Math. Soc. (JEMS) 18 (2016), no. 3, 507–574.344"""345Root_Lattice = self.Parent_Group().Cartan_Type().root_system().root_lattice()346Ambient_Space = self.Parent_Group().Cartan_Type().root_system().ambient_space()347348for Node in self.Parabolic_Subgroup().Excluded_Nodes() :349Beta = Root_Lattice.simple_root(Node).to_ambient() # The simple root associated to ``Node``350Xi = Ambient_Space.fundamental_weight(Node) # The fundamental weight associated to ``Node``351Rho = Ambient_Space.rho() # Sum of fundamental weights352Length = Beta.dot_product(Beta)353Beta_Bar = [Alpha for Alpha in Root_Lattice.roots() if Alpha.coefficient(Node) == _sage_const_1 and Alpha.to_ambient().dot_product(Alpha.to_ambient()) == Length][-_sage_const_1 ].to_ambient()354# The maximal root of the same length as ``Beta`` such that the coefficient of ``Beta`` in the expression of ``Beta_Bar`` is 1.355Fano_Index = Rho.dot_product(Beta + Beta_Bar) / Xi.dot_product(Beta)356yield Node , Fano_Index357358359def Grothendieck_Group ( self ) -> FreeModule :360"""361Returns the Grothendieck Group of X=G/P.362363INPUT:364- ``self`` -- Homogeneous Variety.365366OUTPUT:367- ``Output`` -- Integer; The rank of the Grothendieck group of X=G/P.368369ALGORITHM:370Thanks to the post by Pieter Belmans concerning the index of partial flag varieties371from Aug 22nd, 2018 on his blog (cf. to [Blog_PieterBelmans]_). The link is372https://pbelmans.ncag.info/blog/2018/08/22/rank-flag-varieties/373(Date: Apr 26th, 2021).374375It can be computed as the rank of the homology of X=G/P using the Bruhat cell decomposition,376and is equal to #WG/#WL, where WG (resp. WL) denotes the Weyl group of G (resp. L).377L is the Levi subgroup inside the maximal parabolic P.378379.. TODO:380- Check if the rank of the Grothendieck group is always be given by the Euler characteristic.381- Fix Rank_Of_GrothendieckGroup for Borel subgroups.382383REFERENCE:384[Blog_PieterBelmans] https://pbelmans.ncag.info/blog/385[KP2016] Kuznetsov, Alexander; Polishchuk, Alexander Exceptional collections on isotropic Grassmannians.386J. Eur. Math. Soc. (JEMS) 18 (2016), no. 3, 507–574.387"""388Cartan_Type_of_Parent_Group = self.Parent_Group().Cartan_Type()389Weyl_Group_of_Parent_Group = Cartan_Type_of_Parent_Group.root_system().root_lattice().weyl_group()390391if self.Parabolic_Subgroup().Is_Borel() :392# Question: Because WeylGroup_of_Levi_Part.cardinality() == 1?393return Integers()**( Weyl_Group_of_Parent_Group.cardinality() )394395else :396Cartan_Type_of_Levi_Part = self.Parent_Group().Cartan_Type().dynkin_diagram().subtype( self.Parabolic_Subgroup().Included_Nodes() )397Weyl_Group_of_Levi_Part = Cartan_Type_of_Levi_Part.root_system().root_lattice().weyl_group()398return Integers()**( Weyl_Group_of_Parent_Group.cardinality() / Weyl_Group_of_Levi_Part.cardinality() )399400401def Kostant_Space ( self , i:int , j:int , Restriction:str or None =None ) -> Iterator[ "Weight" ] :402"""403Returns the K(G,P,i,j) as introduced in [BS2023].404405INPUT:406- ``self`` -- Homogeneous variety.407- ``i`` -- integer.408- ``j`` -- integer.409410OUTPUT:411- ``Weight`` -- highest weight corresponding to irreducible summand in K(G,P,i,j).412413414REFERENCE:415[BS2023] Belmans, Pieter; Smirnov, Maxim. Hochschild cohomology of generalised Grassmannians.416"""417G = self.Parent_Group()418P = self.Parabolic_Subgroup()419assert P.Is_Maximal() , 'The homogeneous variety ``self`` needs to be minimal; or equivalently, its associaed parabolic subgroup needs to be maximal.'420k = self.k()421422# Weyl Group423WG = WeylGroup( G.Cartan_Type() )424sr = WG.simple_reflections()425fw = self.Basis('fw')426# Weyl Character Ring427WCR = G.Weyl_Character_Ring()428# Sum of fundamental weights429Rho = sum(list(fw.values()))430# Fano index431Fano_Indices = { Node : Value for ( Node , Value ) in (G/P).Fano_Index() }432assert len(Fano_Indices.keys()) == _sage_const_1 and k in Fano_Indices.keys() , 'For minimal homogeneous variety, the Fano index needs to be a unique value associated to the excluded node k='+str(k)+'.'433FanoIndex = Fano_Indices[k]434# Dimension435Dimension = self.Dimension()436437CM = self.Cartan_Matrix( From='ambt' , To='fw' )438439for WeylElement , ReducedDescription in self.Weyl_Group_Coset_Representatives_Of_Minimal_Length() :440if len(ReducedDescription) == Dimension-i :441# See (1.7): Weight = WeylElement \cdot 0 + ( FanoIndex + j ) * fw[k]442Result = WeylElement.action(Rho.to_ambient()) - Rho.to_ambient() + (FanoIndex+j)*fw[k].to_ambient()443ambt_Description = vector( QQ , [ Result.coefficient(i) for i in range(G.Cartan_Degree()) ] )444fw_Description = CM*ambt_Description445Weight = sum([ Coefficient*fw[Node] for Node , Coefficient in enumerate( fw_Description , start=_sage_const_1 ) ])446447if Restriction in [ None , 'None' , 'none' , '' ] :448yield Weight449elif Restriction in [ 'Regular' , 'regular' , 'Reg' , 'reg' , 'Non-Singular' , 'non-singular' , 'Non-Sing' , 'non-sing' ] :450if self.Is_Regular( Weight+Rho ) : yield Weight451else :452raise ValueError('The input for ``Restriction`` is anppropriate.')453454455def Kuznetsov_Polishchuk_Collection ( self ) -> Iterator[ tuple[ int , int , int , "weight" , str ] ] :456"""457Returns the collection of Kuznetsov and Polishchuk on X=G/P.458459INPUT:460- ``self`` -- Homogeneous variety.461462OUTPUT:463- ``TotalCounter`` -- Counter running over all objects of the collection.464- ``BlockCounter`` -- Counter running over all objects of the current block.465- ``t`` -- Integer; block index.466- ``Lambda`` -- highest weight of object.467- ``cE`` -- string description of cE(Lambda).468469.. TODO:470- Implement collection for exceptional cases.471472REFERENCE:473[KP2016] Kuznetsov, Alexander; Polishchuk, Alexander Exceptional collections on isotropic Grassmannians.474J. Eur. Math. Soc. (JEMS) 18 (2016), no. 3, 507–574.475"""476477G = self.Parent_Group()478assert G.Is_Irreducible() , 'The parent group of ``self`` need to be irreducible.'479Cartan_Family = G.Cartan_Family()480n = self.Cartan_Degree()481482P = self.Parabolic_Subgroup()483assert P.Is_Maximal() , 'The parabolic subgroup of ``self`` need to be maximal.'484k = self.k()485486Blocks = dict({})487# Conjecture 9.8. on page 49488if Cartan_Family in [ 'A' ] :489l = n+_sage_const_1 -k490# Collect all intersection points between a line segment from (0,0) to (k,l) and a grid { (x,y) : x \in ZZ or y \in ZZ }491Slope = l/k492Q = []493for xRunner1 in (ellipsis_range( _sage_const_0 ,Ellipsis, k )) :494yRunner1 = Slope*xRunner1495Q += [ ( xRunner1 , yRunner1 ) ]496if xRunner1 < k: # Notice: 0 < Slope = (n+1)/k - 1 if and only if k < n+1497for yRunner2 in (ellipsis_range( ceil(yRunner1) ,Ellipsis, floor(yRunner1+Slope) )) :498xRunner2 = _sage_const_1 /Slope*yRunner2499if yRunner1 < yRunner2 and yRunner2 < yRunner1+Slope : Q += [ ( xRunner2 , yRunner2 ) ]500for t , (x,y) in enumerate(Q) :501a = floor(x)502b = floor(y)503c = k - ceil(x)504d = l - ceil(y)505Block = []506for p1 in IntegerListsLex( length=a , min_part=t , max_part=d+t , max_slope=_sage_const_0 ) :507p1 = list(p1)508p2 = [ t for Node in (ellipsis_range( a+_sage_const_1 ,Ellipsis, k )) ]509p3 = [ _sage_const_0 for Node in (ellipsis_range( k+_sage_const_1 ,Ellipsis, n+_sage_const_1 -b )) ]510for p4 in IntegerListsLex( length=b , min_part=_sage_const_0 , max_part=c , max_slope=_sage_const_0 ) :511p4 = [ Entry-c for Entry in p4 ]512Highest_Weight = p1+p2+p3+p4513Block += [ Highest_Weight ]514Block.reverse()515Blocks.update({ t : Block })516517elif Cartan_Family in [ 'B' , 'D' ] :518# Equation 56 on page 39519if Cartan_Family == 'B' : e = _sage_const_1 /_sage_const_2520elif Cartan_Family == 'D' : e = _sage_const_0521522# k <= n-1 if Cartan family is B or k <= n-2 if Cartan family is D523# Theorem 9.1. on page 42524if k in (ellipsis_range( _sage_const_1 ,Ellipsis, n+_sage_const_2 *e-_sage_const_2 )) :525for t in (ellipsis_range( _sage_const_0 ,Ellipsis, k-_sage_const_1 )) :526Block = []527for p1 in IntegerListsLex ( length=t , min_part=t , max_part=_sage_const_2 *n+_sage_const_2 *e-k-_sage_const_2 , max_slope=_sage_const_0 ) :528p1 = list(p1)529p2 = [ t for Node in (ellipsis_range( t+_sage_const_1 ,Ellipsis, k )) ]530for p3 in IntegerListsLex ( length=n-k , min_part=(_sage_const_2 *e-_sage_const_1 )*t , max_part=floor((k-t)/_sage_const_2 ) , max_slope=_sage_const_0 ) :531p3 = list(p3)532Highest_Weight = p1+p2+p3533if Highest_Weight[n-_sage_const_1 ] >= (_sage_const_2 *e-_sage_const_1 )*Highest_Weight[n-_sage_const_2 ] : Block += [ Highest_Weight ]534Block.reverse()535Blocks.update({ t : Block })536Block = []537for p1 in IntegerListsLex ( length=t , min_part=t , max_part=_sage_const_2 *n+_sage_const_2 *e-k-_sage_const_2 , max_slope=_sage_const_0 ) :538p1 = [ Entry+_sage_const_1 /_sage_const_2 for Entry in p1 ]539p2 = [ t+_sage_const_1 /_sage_const_2 for Node in (ellipsis_range( t+_sage_const_1 ,Ellipsis, k )) ]540for p3 in IntegerListsLex ( length=n-k , min_part=ceil((_sage_const_2 *e-_sage_const_1 )*t-_sage_const_1 /_sage_const_2 ) , max_part=floor((k-t)/_sage_const_2 -_sage_const_1 /_sage_const_2 ) , max_slope=_sage_const_0 ) :541p3 = [ Entry+_sage_const_1 /_sage_const_2 for Entry in p3 ]542Highest_Weight = p1+p2+p3543if Highest_Weight[n-_sage_const_1 ] >= (_sage_const_2 *e-_sage_const_1 )*Highest_Weight[n-_sage_const_2 ] : Block += [ Highest_Weight ]544Block.reverse()545Blocks.update({ t+_sage_const_1 /_sage_const_2 : Block })546for t in (ellipsis_range( k ,Ellipsis, _sage_const_2 *n+_sage_const_2 *e-k-_sage_const_2 )) :547Block = []548for p1 in IntegerListsLex ( length=k-_sage_const_1 , min_part=t , max_part=_sage_const_2 *n+_sage_const_2 *e-k-_sage_const_2 , max_slope=_sage_const_0 ) :549p1 = list(p1)550p2 = [ t ]551p3 = [ _sage_const_0 for Node in (ellipsis_range( k+_sage_const_1 ,Ellipsis, n )) ]552Highest_Weight = p1+p2+p3553Block += [ Highest_Weight ]554Block.reverse()555Blocks.update({ t : Block })556557# k == n if Cartan family is B or k from { n-1 , n } if Cartan family is D558# Theorem 9.3. on page 43559elif k in (ellipsis_range( n+_sage_const_2 *e-_sage_const_1 ,Ellipsis, n )) :560# D_n/P_n-1 and D_n/P_n are both isomorphic to B_n-1/P_n-1561if Cartan_Family == 'D' :562Cartan_Family = 'B'563n = n-_sage_const_1564k = n565for t in (ellipsis_range( _sage_const_0 ,Ellipsis, n-_sage_const_1 )) :566Block = []567for p1 in IntegerListsLex ( length=t , min_part=t , max_part=n-_sage_const_1 , max_slope=_sage_const_0 ) :568p1 = list(p1)569p2 = [ t for Node in (ellipsis_range( t+_sage_const_1 ,Ellipsis, n )) ]570Highest_Weight = p1+p2571Block += [ Highest_Weight ]572Block.reverse()573Blocks.update({ _sage_const_2 *t : Block })574Blocks.update({ _sage_const_2 *t+_sage_const_1 : [ [ Entry+_sage_const_1 /_sage_const_2 for Entry in Highest_Weight ] for Highest_Weight in Blocks[_sage_const_2 *t] ] })575576# Theorem 9.2. on page 42577elif Cartan_Family == 'C' :578for t in (ellipsis_range( _sage_const_0 ,Ellipsis, k-_sage_const_1 )) :579Block = []580for p1 in IntegerListsLex ( length=t , min_part=t , max_part=_sage_const_2 *n-k , max_slope=_sage_const_0 ) :581p1 = list(p1)582p2 = [ t for Node in (ellipsis_range( t+_sage_const_1 ,Ellipsis, k )) ]583for p3 in IntegerListsLex ( length=n-k , min_part=_sage_const_0 , max_part=floor((k-t)/_sage_const_2 ) , max_slope=_sage_const_0 ) :584p3 = list(p3)585Highest_Weight = p1+p2+p3586Block += [ Highest_Weight ]587Block.reverse()588Blocks.update({ t : Block })589for t in (ellipsis_range( k ,Ellipsis, _sage_const_2 *n-k )) :590Highest_Weights = []591for p1 in IntegerListsLex ( length=k-_sage_const_1 , min_part=t , max_part=_sage_const_2 *n-k , max_slope=_sage_const_0 ) :592p1 = list(p1)593p2 = [t]594p3 = [ _sage_const_0 for Node in (ellipsis_range( k+_sage_const_1 ,Ellipsis, n )) ]595Highest_Weight = p1+p2+p3596Block += [ Highest_Weight ]597Block.reverse()598Blocks.update({ t : Block })599600else :601raise ValueError('The algorithm is not implement for the exceptional cases E_6, E_7, E_8, F_4, or G_2.')602603fw = self.Basis('fw')604CM = self.Cartan_Matrix( From='ambt' , To='fw' )605if Cartan_Family == 'A' :606CM = block_matrix( QQ , [ [ CM , matrix( QQ , (n-_sage_const_1 )*[ [_sage_const_0 ] ] + [ [-_sage_const_1 ] ] ) ] ] , subdivide=False )607TotalCounter = _sage_const_0608for t , Block in Blocks.items() :609Previous_Objects = []610for BlockCounter , Highest_Weight_in_ambtBasis in enumerate( Block , start=_sage_const_1 ) :611TotalCounter += _sage_const_1612Highest_Weight_in_fwBasis = CM*vector( QQ , Highest_Weight_in_ambtBasis )613Highest_Weight = sum([ Coefficient*fw[Node] for Node , Coefficient in enumerate( Highest_Weight_in_fwBasis , start=_sage_const_1 ) ])614cU = str(self.calU(Highest_Weight))615if Cartan_Family in [ 'A' ] :616cE = cU617elif Cartan_Family in [ 'B' , 'C' , 'D' ] :618if len(Previous_Objects) == _sage_const_0 : cE = cU619else : cE = 'Right mutation of '+cU+' through <'+', '.join(Previous_Objects)+'>'620yield TotalCounter , BlockCounter , t , Highest_Weight , cE621Previous_Objects += [ cU ]622623624def Included_Nodes ( self ) -> set :625"""Returns the attribute ``Included_Nodes`` of the parabolic subgroup P."""626return self.Parabolic_Subgroup().Included_Nodes()627628629def Irreducible_Equivariant_Vector_Bundle ( self , Highest_Weight:"Weight" ) -> "Irreducible_Equivariant_Vector_Bundle" :630"""Returns the equivariant vector bundle induced by the given highest weight."""631if Highest_Weight == _sage_const_0 :632fw = self.Basis('fw')633Highest_Weight = _sage_const_0 * fw[_sage_const_1 ]634from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Overlying_Structure.Equivariant_Vector_Bundle import Irreducible_Equivariant_Vector_Bundle635return Irreducible_Equivariant_Vector_Bundle( Base_Space=self , Highest_Weight=Highest_Weight )636637638# ..ToDo : Improve the testing. Get a cleaner algorithm based immediately on the definition.639def Is_Adjoint ( self ) -> bool :640"""Tests if ``self`` is adjoint (cf. grassmannian.info)"""641G = self.Parent_Group()642Cartan_Family = G.Cartan_Family()643Cartan_Degree = G.Cartan_Degree()644P = self.Parabolic_Subgroup()645assert P.Is_Maximal() , ValueError('This method is only implemented for maximal parabolic subgroups.')646k = self.k()647if Cartan_Family == 'B' : return k == _sage_const_2648elif Cartan_Family == 'C' : return k == _sage_const_1649elif Cartan_Family == 'D' : return k == _sage_const_2 and _sage_const_4 <= Cartan_Degree650elif Cartan_Family == 'E' : return ( Cartan_Degree == _sage_const_6 and k == _sage_const_2 ) or ( Cartan_Degree == _sage_const_7 and k == _sage_const_1 ) or ( Cartan_Degree == _sage_const_8 and k == _sage_const_8 )651elif Cartan_Family == 'F' : return ( Cartan_Degree == _sage_const_4 and k == _sage_const_1 )652elif Cartan_Family == 'G' : return ( Cartan_Degree == _sage_const_2 and k == _sage_const_2 )653else : return False654655656# ..ToDo : Improve the testing. Get a cleaner algorithm based immediately on the definition.657def Is_Coadjoint ( self ) -> bool :658"""Tests if ``self`` is coadjoint (cf. grassmannian.info)"""659G = self.Parent_Group()660Cartan_Family = G.Cartan_Family()661Cartan_Degree = G.Cartan_Degree()662P = self.Parabolic_Subgroup()663assert P.Is_Maximal() , ValueError('This method is only implemented for maximal parabolic subgroups.')664k = self.k()665if Cartan_Family == 'B' : return k == _sage_const_1666elif Cartan_Family == 'C' : return k == _sage_const_2667elif Cartan_Family == 'D' : return k == _sage_const_2 and _sage_const_4 <= Cartan_Degree668elif Cartan_Family == 'E' : return ( Cartan_Degree == _sage_const_6 and k == _sage_const_2 ) or ( Cartan_Degree == _sage_const_7 and k == _sage_const_1 ) or ( Cartan_Degree == _sage_const_8 and k == _sage_const_8 )669elif Cartan_Family == 'F' : return ( Cartan_Degree == _sage_const_4 and k == _sage_const_4 )670elif Cartan_Family == 'G' : return ( Cartan_Degree == _sage_const_2 and k == _sage_const_1 )671else : return False672673674# ..ToDo : Improve the testing. Get a cleaner algorithm based immediately on the definition.675def Is_Cominuscule ( self ) -> bool :676"""Tests if ``self`` is cominuscule (cf. grassmannian.info)"""677G = self.Parent_Group()678Cartan_Family = G.Cartan_Family()679Cartan_Degree = G.Cartan_Degree()680P = self.Parabolic_Subgroup()681assert P.Is_Maximal() , ValueError('This function is only implemented for maximal parabolic subgroups.')682k = self.k()683if Cartan_Family == 'A' : return True684elif Cartan_Family == 'B' : return k == _sage_const_1685elif Cartan_Family == 'C' : return k == Cartan_Degree686elif Cartan_Family == 'D' : return k in [ _sage_const_1 , CartenDegree-_sage_const_1 , Cartan_Degree ]687elif Cartan_Family == 'E' : return ( Cartan_Degree == _sage_const_6 and k in [ _sage_const_1 , _sage_const_6 ] ) or ( Cartan_Degree == _sage_const_7 and k == _sage_const_7 )688else : return False689690691# ..ToDo : Specify the type for the input ``Weight``!692def Is_Levi_Dominant ( self , Weight ) -> bool :693"""Tests if a given weight on ``self`` is Levi-dominant (i.e. all coefficients over included nodes are non-negative)."""694assert Weight in self.Parent_Group().Cartan_Type().root_system().weight_space() , ValueError('The weight must be an element of the weight space: '+str(self.Parent_Group().Cartan_Type().root_system().weight_space()))695for Node in self.Parabolic_Subgroup().Included_Nodes() :696if Weight.coefficient(Node) < _sage_const_0 : return False697return True698699700# ..ToDo : Improve the testing. Get a cleaner algorithm based immediately on the definition.701def Is_Minuscule ( self ) -> bool :702"""Tests if ``self`` is minuscule (cf. grassmannian.info)"""703G = self.Parent_Group()704Cartan_Family = G.Cartan_Family()705Cartan_Degree = G.Cartan_Degree()706P = self.Parabolic_Subgroup()707assert P.Is_Maximal() , ValueError('This function is only implemented for maximal parabolic subgroups.')708k = self.k()709if Cartan_Family == 'A' : return True710elif Cartan_Family == 'B' : return k == Cartan_Degree711elif Cartan_Family == 'C' : return k == _sage_const_1712elif Cartan_Family == 'D' : return k in [ _sage_const_1 , CartenDegree-_sage_const_1 , Cartan_Degree ]713elif Cartan_Family == 'E' : return ( Cartan_Degree == _sage_const_6 and k in [ _sage_const_1 , _sage_const_6 ] ) or ( Cartan_Degree == _sage_const_7 and k == _sage_const_7 )714else : return False715716717def Is_Regular ( self , Weight:"Weight" ) -> bool :718"""Tests if a given weight on ``self`` is G-regular (i.e. does not ly on a wall of a Weyl chamber)."""719assert Weight in self.Parent_Group().Cartan_Type().root_system().weight_space() , ValueError('The weight must be an element of the weight space: '+str(self.Parent_Group().Cartan_Type().root_system().weight_space()))720return not self.Is_Singular( Weight )721722723def Is_Singular ( self , Weight:"Weight" ) -> bool :724"""Tests if a given weight on ``self`` is G-singular (i.e. lies on a wall of a Weyl chamber)."""725assert Weight in self.Parent_Group().Cartan_Type().root_system().weight_space() , ValueError('The weight must be an element of the weight space: '+str(self.Parent_Group().Cartan_Type().root_system().weight_space()))726# Move ``Weight`` to dominant chamber727Weight_In_Dominant_Chamber = Weight.to_dominant_chamber()728# Consider list of reflections of ``Weight`` and check whether ``Weight`` is invariant under some reflection729Reflections = [ Weight_In_Dominant_Chamber.simple_reflection( Index ) for Index in self.Parent_Group().Cartan_Type().index_set() ]730return Weight_In_Dominant_Chamber in Reflections731732733def k ( self ) -> int :734"""Returns the number ``k`` given in the realisation as Grassmannian."""735P = self.Parabolic_Subgroup()736Excluded_Nodes = P.Excluded_Nodes(Output_Type=list)737if P.Is_Maximal() : return Excluded_Nodes[_sage_const_0 ]738else : return Excluded_Nodes739740741# Synonym for the method ``Grothendieck_Group``742def K0 ( self ) -> FreeModule :743"""Returns the Grothendieck Group of X=G/P."""744return self.Grothendieck_Group()745746747def Lefschetz_Collection ( self , Starting_Block , Twist=None , Support_Pattern='Trivial' ) -> "Lefschetz_Collection" :748"""Returns a Lefschetz collection over ``self``."""749from Equivariant_Vector_Bundles_On_Homogeneous_Varieties.Overlying_Structure.Lefschetz_Collection import Lefschetz_Collection750return Lefschetz_Collection( Base_Space=self , Starting_Block=Starting_Block , Twist=Twist , Support_Pattern=Support_Pattern )751752753def Mapping ( self , Image:"Irreducible_Homogeneous_Variety" , Dictionary:dict , Output_Type:str='fw' ) -> dict :754"""755INPUT:756- ``self`` -- Irreducible homoegenous variety (Source)757- ``Image`` -- Irreducible homoegenous variety (Image)758- ``Dictionary`` -- Dictionary (Image); Description of the mapping on the level of simple roots759- ``Output_Type`` -- str 'fw' (default) or 'sr'; Output on the level of fundamental weights (fw) or simple roots (sr)760761OUTPUT:762- ``Output`` -- Dictionary; { Simple roots of Source : Root of Image } or { Fundamental weights of source : weight of Image }763764Caution: The mapping of the simple roots described by the input of ``Dictionary`` is a mapping of the form Torus(Image) --> Torus(Source)765and therefore in the opposite direction as the underlying mapping Source --> Image.766"""767Source = self768sr_Source = Source.Basis('sr')769fw_Source = Source.Basis('fw')770771assert isinstance( Image , Irreducible_Homogeneous_Variety ) , 'The input for ``Image`` need Image be an irreducible homogeneous variety.'772WeightSpace_Image = Image.Parent_Group().Cartan_Type().root_system().weight_space()773sr_Image = Image.Basis('sr')774fw_Image = Image.Basis('fw')775776assert isinstance( Dictionary , dict ) , 'The input for ``Dictionary`` need Image be a dictionary.'777778srOutput = dict({})779for Node in sr_Source.keys() :780From = sr_Source[Node]781assert From in Dictionary.keys() , 'The '+str(Node)+'-th simple root of ```self``` is not a key in ```Dictionary```.'782To = Dictionary[From]783assert To in WeightSpace_Image , 'The values of the dictionary need to be roots of weight space `'+str(WeightSpace_Image)+'`.'784srOutput.update({ From : To })785786if Output_Type in self.BASIS_LABELLING['sr'] :787return srOutput788elif Output_Type in self.BASIS_LABELLING['fw'] :789790fwOutput = { fw_Source[Node] : sum([ Coefficient*srOutput[sr_Source[i]] for i , Coefficient in enumerate( Row , start=_sage_const_1 ) ])791for Node , Row in enumerate( Source.Parent_Group().Cartan_Type().cartan_matrix().inverse().transpose() , start=_sage_const_1 )792}793return fwOutput794else :795raise ValueError('The input for ``Output_Type`` is inappropriate.')796797798def N ( self ) -> int :799"""Returns the number ``N`` given in the realisation as Grassmannian."""800G = self.Parent_Group()801assert G.Is_Ordinary() , ValueError('This method is only implemented for ordinary parent groups.')802Cartan_Family = G.Cartan_Family()803Cartan_Degree = G.Cartan_Degree()804if Cartan_Family == 'A' : return Cartan_Degree + _sage_const_1 # Grassmannians Gr(k,N) or Flag varieties FL( k1 , k2 , ... ; N )805elif Cartan_Family == 'B' : return _sage_const_2 *Cartan_Degree + _sage_const_1 # Orthogonal Grassmannians OGr(k,N) or orthogonal Flag varieties OFl( k1 , k2 , ... ; N )806elif Cartan_Family == 'C' : return _sage_const_2 *Cartan_Degree # Symplectic Grassmannians OGr(k,N) or symplectic Flag varieties SFl( k1 , k2 , ... ; N )807elif Cartan_Family == 'D' : return _sage_const_2 *Cartan_Degree # Orthogonal Grassmannians OGr(k,N) or orthogonal Flag varieties OFl( k1 , k2 , ... ; N )808809810def Null_Weight ( self ) -> "Weight" :811"""Returns the null weight of ``self``."""812fw = self.Basis('fw')813return _sage_const_0 *fw[_sage_const_1 ]814815816def Parent_Group ( self ) -> Irreducible_Cartan_Group :817"""Returns the parent group of ``self``."""818return self.Parabolic_Subgroup().Parent_Group()819820821def Parabolic_Subgroup ( self ) -> Parabolic_Subgroup_In_Irreducible_Cartan_Group :822"""Returns the attribute ``_Parabolic_Subgroup``."""823return self._Parabolic_Subgroup824825826# ..ToDo: Is not correct for Grassmannian!827#def SemiSimplification_Of_G_Bundle ( self ) :828# """Returns the semi-simplification of the tangent bundle on ``self``."""829# sr = self.Basis('sr')830# calTB = self.Zero_Vector_Bundle()831# for Counter1 , Root1 in enumerate( self.Available_Negative_Roots() ) :832# Comparison = [ self.Compare_Roots( Root1 , Root2 ) for Root2 in self.Available_Negative_Roots() ]833# if not ( '>' in Comparison[ : Counter1 ] or '>' in Comparison[ Counter1+1 : ] ) :834# # Write the root as linear combination of weights; as we worked with negative roots, we had the lowest weights and therefore need to mulitply with -1.835# Highest_Weight = -1*sum([ Coefficient * sr[Node] for Node , Coefficient in Root1 ])836# calTB += self.Equivariant_Vector_Bundle( Highest_Weight )837#838# return calTB839840841def Structure_Sheaf ( self , *Twists:tuple[int] ) -> "Irreducible_Equivariant_Vector_Bundle" :842"""Returns the structure sheaf or a twist of it."""843if len(Twists) == _sage_const_0 : Twists = tuple( len(self.Excluded_Nodes())*[_sage_const_0 ] )844else :845assert len(Twists) == len(self.Excluded_Nodes()) , ValueError('The input for ``Twists`` must be of the length ' + str( len(self.Excluded_Nodes()) ) +'(= number of excluded nodes).')846for Twist_Counter , Twist in enumerate( Twists , start=_sage_const_1 ) :847assert Twist in Integers() , 'The input data of the ' + str(Twist_Counter) + 'th twist is not an integer.'848fw = self.Basis('fw')849return self.Irreducible_Equivariant_Vector_Bundle( sum([ Twists[Counter]*fw[Node] for Counter , Node in enumerate( self.Excluded_Nodes() ) ]) )850851852def Tautological_Subbundle ( self ) -> "Irreducible_Equivariant_Vector_Bundle" :853"""Returns the tautological subbundle, i.e. the dual of the equivariant vector bundle induced by the highest weight omega_1."""854fw = self.Basis('fw')855return self.Irreducible_Equivariant_Vector_Bundle( fw[_sage_const_1 ] ).Dual()856857858def Trivial_Vector_Bundle ( self ) -> "Direct_Sum_Of_Equivariant_Vector_Bundles" :859"""Returns the trivial vector bundle, i.e. V^{ omega_1 } * calO."""860fw = self.Basis('fw')861return self.calO() * self.Parent_Group().rmV( fw[_sage_const_1 ] )862863864# Synonym for the method ``Equivariant_Vector_Bundle``865def VB ( self , *Input :tuple ) -> "Direct_Sum_Of_Equivariant_Vector_Bundle" :866"""Returns the equivariant vector bundle induced by the given highest weights."""867return self.Equivariant_Vector_Bundle( *Input )868869870def Weyl_Group_Coset_Representatives_Of_Minimal_Length ( self ) : #-> Iterator[ "Weyl group element" ] :871"""Returns the Weyl group coset representatives of minimal length"""872G = self.Parent_Group()873WG = WeylGroup( G.Cartan_Type() )874sr = WG.simple_reflections()875Identity = sr[_sage_const_1 ]*(sr[_sage_const_1 ].inverse())876877Stock = [ [ i+_sage_const_1 for i in w._reduced_word ] for w in WeylGroup( G.Cartan_Type() , implementation='permutation' ).iteration('breadth',True) ]878Stock = [ ( prod([ Identity ] + [ sr[Node] for Node in ReducedDescription ]) , ReducedDescription ) for ReducedDescription in Stock ]879880for WeylElement0 , ReducedDescription0 in Stock :881Length0 = len(ReducedDescription0)882883WeylElement0_Is_CosetRepresentaion_Of_Minimal_Length = True884for Node in self.Parabolic_Subgroup().Included_Nodes(Output_Type=list) :885WeylElement1 = sr[Node]*WeylElement0886887for WeylElement , ReducedDescription in Stock :888if WeylElement1 == WeylElement :889ReducedDescription1 = ReducedDescription890Length1 = len(ReducedDescription1)891break892893if Length1 != Length0+_sage_const_1 :894WeylElement0_Is_CosetRepresentaion_Of_Minimal_Length = False895break896897if WeylElement0_Is_CosetRepresentaion_Of_Minimal_Length :898yield WeylElement0 , ReducedDescription0899900901def Zero_Vector_Bundle ( self ) -> "Direct_Sum_Of_Equivariant_Vector_Bundle" :902"""Returns the zero vector bundle over ``self``."""903return self.Equivariant_Vector_Bundle()904905906907class Direct_Sum_Of_Homogeneous_Varieties ( Direct_Sum_Of_Structures , Homogeneous_Variety ) :908pass909910911912