# coding: utf8 def fonctionCoucoufrontend(): print ("Fichier frontend.sage chargé") fonctionCoucoufrontend() def mutationPasAPas(W,v,repw): """ Calcule l'évolution de la graine initiale de C_w choisie en graine initiale de C_v,w en terme de Delta-vecteurs Nécessite W, le groupe de Weyl considére, v le mot dans W, repw, le représentant du mot w """ if not(v.bruhat_le(repVersMot(repw,W))): print(u"v n'est pas plus petit que w pour l'ordre de Bruhat") return False M=2*identity_matrix(W.cartan_type()[1])-CartanMatrix(W) #On crée la matrice d'adjacence du diagramme de Dynkin à partir de la #matrice de Cartan de W via des ajustements mineurs dimVi=calculDimVi2(W,repw)#Nécessite d'avoir chargé calculGroupeWeyl.sage [mutationsAFaire,sommetsAExclure]=listeMuta(W,v,repw)#On récupère la liste des mutations à faire #On génère la graine initiale graineIni=graineInitiale(repw,W,1,False) graineActuelle=deepcopy(graineIni) dDelta=vecteurdDelta(calculDimMi(dimVi,repw),creationCarquois2(M),repw) texte=u'(T)' listeCarquois=[Graphics()]*(len(mutationsAFaire)+1) listeCarquois[0]=genCarquois2(graineActuelle,repw,u"Mutation : "+texte) for i in range(1,len(mutationsAFaire)+1):#On affiche le résultat de chaque mutation graineActuelle=mutaStratesDeltaVecteurs(graineActuelle,dDelta,mutationsAFaire[-i]) if i==1: texte=r"$\mu$"+str(mutationsAFaire[-i])+'(T)' else: texte=r'$\mu$'+str(mutationsAFaire[-i])+r'$\circ$'+texte listeCarquois[i]=genCarquois2(graineActuelle,repw,u"Mutation : "+texte) k=len(listeCarquois) nbligne=ceil(k/3) G=graphics_array(listeCarquois,nbligne,3) return([graineActuelle,G]) def creerGroupeWeyl(nom): """ Permet de définir le groupe Weyl de type nom (chaine de caractères) et ses réflexions simples nommées s_i en fonction du diagramme de Dynkin affiché. Renvoie (W,s) avec W le groupe de Weyl considéré et s la liste des réflexions. """ type=nom[0] n=int(nom[1:])#On récupère tout à partir du deuxième caractère (et pas juste #le deuxième, pour gérer le cas d'un nombre à plusieurs chiffres) W=WeylGroup(nom,prefix='s') s=list(var(['s%i' %i for i in range(1,n+1)])) print(DynkinDiagram(nom)) for j in range(1,n+1): s[j-1]=(W.simple_reflections())[j] return(W,s) def creerCarquois(W): """ Renvoie un carquois correspondant de même type de Dynkin que W, avec les flèches choisies pour être toujours croissantes """ M=2*identity_matrix(W.cartan_type()[1])-CartanMatrix(W)#On récupère la #matrice d'adjacence (symétrique) convenable return(creationCarquois2(M)) def testAlgo(repw,v,mutationsAFaire=[],listeSommetsAExclure=[],lettrepourW='e',lettrepourV='f',enregistrement=False,enregistrementSSVZ=False): """ Prend en entrée le représentant repw d'un mot w d'un groupe de Weyl W un mot d'un groupe de Weyl v tel que vtailleMaxString:#Texte est trop long, on passe à la ligne texte="\n"+texte tailleMaxString=tailleMaxString+tailleMaxStringInitiale #On n'ajoute pas les images à la liste elif listeMutations[-i][1]==-1:#On est sur une suppression de sommet texte='S('+str(listeMutations[-i][0])+r')$\circ$'+texte if len(texte)>tailleMaxString:#Texte est trop long, on passe à la ligne texte="\n"+texte tailleMaxString=tailleMaxString+tailleMaxStringInitiale listeExclusion=listeExclusion+[listeMutations[-i][0]] #On rajoute le sommet des sommets à supprimer [listeCarquois[2*j],listeCarquois[2*j+1]]=genCarquois2(Q,listeDeltaV,listeDeltaW,repwcomplete,listeDimDeltaW,r"Mutation : "+texte,exclusion=listeExclusion,lettreW=lettrepourW,lettreV=lettrepourV,v=v,couperADroite=couperADroite) j=j+1 else : for i in range(1,len(listeMutations)+1):#On affiche le résultat de chaque mutation if listeMutations[-i][1]==0:#On est sur une mutation listeDeltaV=mutaStratesDeltaVecteurs([Q,listeDeltaV],dDeltaV,listeMutations[-i][0])[1]#On recalcule les delta_v vecteurs [Q,listeDeltaW]=mutaStratesDeltaVecteurs([Q,listeDeltaW],dDeltaW,listeMutations[-i][0])#On recalcule le nouveau carquois et les delta_w vecteurs if i==1: texte=r'$\mu$'+str(listeMutations[-i][0])+'(T)' else: texte=r'$\mu$'+str(listeMutations[-i][0])+r'$\circ$'+texte if len(texte)>tailleMaxString:#Texte est trop long, on passe à la ligne texte="\n"+texte tailleMaxString=tailleMaxString+tailleMaxStringInitiale [listeCarquois[2*i],listeCarquois[2*i+1]]=genCarquois2(Q,listeDeltaV,listeDeltaW,repwcomplete,listeDimDeltaW,r"Mutation : "+texte,exclusion=listeExclusion,lettreW=lettrepourW,lettreV=lettrepourV,v=v,couperADroite=couperADroite) elif listeMutations[-i][1]==-1:#On est sur une suppression de sommet texte='S('+str(listeMutations[-i][0])+r')$\circ$'+texte if len(texte)>tailleMaxString:#Texte est trop long, on passe à la ligne texte="\n"+texte tailleMaxString=tailleMaxString+tailleMaxStringInitiale listeExclusion=listeExclusion+[listeMutations[-i][0]] #On rajoute le sommet des sommets à supprimer [listeCarquois[2*i],listeCarquois[2*i+1]]=genCarquois2(Q,listeDeltaV,listeDeltaW,listeDimDeltaW,repwcomplete,r"Mutation : "+texte,exclusion=listeExclusion,lettreW=lettrepourW,lettreV=lettrepourV,v=v,couperADroite=couperADroite) [listeCarquois[-2],listeCarquois[-1]]=genCarquois2(Q,listeDeltaV,listeDeltaW,repwcomplete,listeDimDeltaW,r"Mutation : "+texte+" correctement decoupe",listeExclusion,lettreW=lettrepourW,lettreV=lettrepourV,couperADroite=couperADroite,v=v) k=len(listeCarquois) nbligne=ceil(k/4) G=graphics_array(listeCarquois,nbligne,4) #Définition des bons noms de fichiers if enregistrement: chemin=repertoireSauvegarde(repw,v) if mutationsCourtes : if couperADroite: if couperAGauche: for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+"coupeDroit coupeGauche "+str(i)+' court.png')) save(G[2*i+1],os.path.expanduser(chemin+"coupeDroit coupeGauche "+str(i)+' coords court.png')) else: for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+"coupeDroit "+str(i)+' court.png')) save(G[2*i+1],os.path.expanduser(chemin+"coupeDroit "+str(i)+' coords court.png')) else: if couperAGauche : for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+"coupeGauche"+str(i)+' court.png')) save(G[2*i+1],os.path.expanduser(chemin+"coupeGauche"+str(i)+' coords court.png')) else : for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+str(i)+' court.png')) save(G[2*i+1],os.path.expanduser(chemin+str(i)+' coords court.png')) else: if couperADroite: if couperAGauche : for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+"coupeDroit coupeGauche "+str(i)+'.png')) save(G[2*i+1],os.path.expanduser(chemin+"coupeDroit coupeGauche "+str(i)+'coords.png')) else : for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+"coupeDroit "+str(i)+'.png')) save(G[2*i+1],os.path.expanduser(chemin+"coupeDroit "+str(i)+'coords.png')) else: if couperAGauche: for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+"coupeGauche "+str(i)+'.png')) save(G[2*i+1],os.path.expanduser(chemin+"coupeGauche "+str(i)+' coords.png')) else : for i in range(len(listeCarquois)/2): save(G[2*i],os.path.expanduser(chemin+str(i)+'.png')) save(G[2*i+1],os.path.expanduser(chemin+str(i)+' coords.png')) print("Les images ont été enregistrées dans "+os.path.expanduser(chemin)) if couperAGauche:#Si on ne coupe pas à gauche ça plante forcément for i in range(len(listeDeltaV)):#On regarde la liste des Delta_v vecteurs if not(i+1 in listeExclusion):#On regarde seulement les sommets #qui existent encore for j in range(v.length()):#On regarde coordonnée par coordonnée if listeDeltaV[i][j]!=0: print(i) print(listeDeltaV[i]) print(j) print(r"ECHEC DE L'ALGORITHME") return([False,[Q,listeDeltaV,listeDeltaW],G,listeMouvements]) return([True,[Q,listeDeltaV,listeDeltaW],G,listeMouvements])