https://hal.archives-ouvertes.fr/hal-02398953
Tip revision: c33910a29d53f4e137c225b21a8d59e43327cbf9 authored by Software Heritage on 08 December 2019, 12:26:32 UTC
hal: Deposit 351 in collection hal
hal: Deposit 351 in collection hal
Tip revision: c33910a
Polytope.h
#ifndef POLYTOPE_H
#define POLYTOPE_H
#include <iostream>
#include <giac/config.h>
#include <giac/giac.h>
#include <string>
#include <map>
#include <algorithm>
#include <ctime>
using namespace std;
using namespace giac;
#include "CMfield.h"
#include "Prism.h"
#include "Util.h"
#include "edge.h"
#include "ridge.h"
#include "sgraph.h"
#include "FiniteGroup.h"
#include "FiniteLinearGroup.h"
extern context ct;
class Polytope
{
public:
Polytope(string s);
~Polytope(){
exit(1);
};
std::clock_t c_start, c_end;
bool verbose;
CMfield K;
void createGroup();
void startAlgo();
void startFromFaceData();
bool is_symmetric;
bool iscompact, isarithmeticitychecked, isarithmetic, naindex;
bool emb_dim1, emb_dim2, check_cycles, check_euler, check_sphere, perform_algo, draw_pics;
gen p0, p0c, p0_rootof, p0c_rootof;
bool is_p0_rootof_computed = false;
gen H; // Matrix of the ambient Hermitian form
gen H_rootof;
gen R1, R2, R3, R1i, R2i, R3i, J, Ji, P, Pi, Ppower;
vecteur Ppowers;
bool needppower;
gen Q; // change of basis to diagonal form, using eigenvectors of P
// Matrix of the symmetry of the polytope (this may be (123) or (1J))
bool issymmetric;
int tnum, tden; // only used for Mostow groups
int pval; // pval is the order of generators
gen taugen, tau, tauc, mult, multconj;
WVector e1w, e2w, e3w;
gen extramirror;
int orderofp, orderofppower;
gen euler_char, euler_char_top;
gen ipmin;
vector<int> word_p1, word_m1, word_123, word_321, w1, w2, w3;
vector<Prism> faces;
vector<Prism> faceReps;
vector<WVector> vertices;
vector<WVector> vertReps;
vector<vector<int> > vertexPOrbits;
vector<vector<int> > vertexOrbits;
vector<int> currentVertexOrbit;
vector<int> orbitsToVisit;
vector<vector<int> > facePOrbits;
vector<vector<int> > edgePOrbits;
vector<vector<int> > ridgePOrbits;
vector<vector<int> > vertexPairings;
vector<vector<int> > vertexPOrbitPairings;
vector<vector<int> > vertexPOrbitPairingMaps;
vector<vector<int> > edgePairings;
vector<vector<int> > ridgePairings;
vector<int> facePairings;
vector<edge> edges;
vector<ridge> ridges;
vector<vector<int> > relations;
gen Proj(gen v, gen w);
gen Inn(gen v, gen w);
gen SqNorm(gen v);
gen BoxProd(gen v, gen w);
gen refl(gen x, gen v, gen z);
gen reflMat(gen v, gen z);
bool testSame(WVector V, WVector W);
bool isInList(WVector V, vector<WVector> li);
int findInList(WVector V, vector<WVector> li);
int findInList(gen V, vector<WVector> li);
bool isInList(gen a, vector<gen> list);
void initSporadicGroup();
void initThompsonGroup();
void initMostowGroup();
Prism createPrism(WVector v0, WVector v1, WVector v2);
void updateFreeRidges();
void expand();
bool isPrismNew(Prism A);
bool isVertexNew(WVector V);
bool comparePrisms(Prism A, Prism B);
bool samePolygon(vector<WVector> V, vector<WVector> W);
bool samePolygon(vector<gen> V, vector<gen> W);
bool computeVertices(Prism &A);
bool isOnPrism(gen X, Prism A);
bool isOnMirror(gen X, Prism A);
bool isOnTopFace(gen X, Prism A);
gen reflectAcrossSpine(gen X, Prism A);
Prism createPimage(Prism A);
Prism createPinvimage(Prism A);
Prism applyReflection(Prism A);
Prism applyInverseReflection(Prism A);
Prism applyMatrix(gen M, Prism A);
void addFaceOrbit(Prism A);
bool isVertexSafe(WVector V, Prism A);
vector<int> findFaces(WVector v);
vector<int> findFaces(gen V);
vector<int> findBisectors(WVector v);
vector<int> findBisectors(gen V);
vector<WVector> findMirrors(WVector v);
vector<WVector> findMirrors(gen V);
void useRelations(vector<int> &w);
void useRelations(Prism &A);
void computeStabilizer(int k);
void studyVertexStabilizers();
void findNextVertexInCycle(int k);
void addEdge(edge e);
bool isSame(edge e1, edge e2);
bool isFlipped(edge e1, edge e2);
bool isEdgeNew(edge e);
void addRidge(ridge e);
bool isSame(ridge e1, ridge e2);
bool isRotated(ridge e1, ridge e2);
bool isRotatedFlip(ridge e1, ridge e2);
bool isRidgeNew(ridge e);
int applyPtoVertex(int k);
vector<int> getPOrbitOfVertex(int k);
vector<int> getPOrbitOfFace(int k);
int findNextInFacePOrbit(int k);
void addEdgeOld(edge e);
void createBraidRelation(vector<int> w1, vector<int> w2);
gen evalWord(vector<int> w);
gen evalWordAsRootOf(vector<int> w);
int applyPairing(ridge e);
void checkCycles();
int applyPairingToVertex(int jface, int j);
int applyPairingToEdge(int jface, int j);
int applyPairingToRidge(int jface, int j);
int applyPToVertex(int pow, int j);
int applyPToEdge(int pow, int j);
int applyPToRidge(int pow, int j);
int applyPinvToVertex(int pow, int j);
int applyPinvToEdge(int pow, int j);
int applyPinvToRidge(int pow, int j);
void drawFace(int j);
void drawFaceSector(int j, int k1, int k2);
void drawProjection(int axis);
bool checkSide();
void checkEdge(int j);
void checkRidge(int j);
void checkPairings();
void computeAllVertices();
void computeAllEdges();
void computeAllRidges();
bool checkt1val(gen rur, gen par, gen t1v, int &res);
bool checkt1valAttempt(gen rur, gen par, gen t1v, int &res);
bool checkEqualt1val(gen rur, gen par, gen t1v);
bool checkt2val(gen rur, gen par, gen t1v, int &res);
bool checkt2valAttempt(gen rur, gen par, gen t1v, int &res);
bool checkEqualt2val(gen rur, gen par, gen t1v);
bool checkt3val(gen rur, gen par, gen t3v, gen vl, gen wl, gen vt, int &res);
bool checkt3valAttempt(gen rur, gen par, gen t3v, gen vl, gen wl, gen vt, int &res);
bool checkEqualt3val(gen rur, gen par, gen t3v, gen vl, gen wl, gen vt);
bool checkEqSign(gen rur, gen par, gen eq, int &res);
bool checkEqSignAttempt(gen rur, gen par, gen eq, int &res);
bool checkEqZero(gen rur, gen par, gen eq);
void drawRidgePic(int i);
void computeEulerCharacteristic();
vecteur eulerdim0();
vecteur eulerdim1();
vecteur eulerdim2();
vecteur eulerdim3();
bool isStabilizedByPpower(int j);
bool isRidgeComplex(int j, gen &mi);
void exportFaceData();
void importFaceData();
void checkSphere();
void checkLinks();
gen computeAngle(int j, gen X);
gen computeAngleNum(int j, gen X);
bool expressAsWord(gen M, vecteur list, gen fixed_pt, gen mirror, vector<int> &inds);
bool isArithmetic();
bool isArithmeticAlt();
string checkSignature(gen A);
bool checkTraceField(gen &res);
bool findEigenVectors_P();
bool checkPairOfPrisms(Prism A1, Prism A2, bool &res);
gen lowerDegree(gen g);
bool isPPower(gen M);
int testPoint(gen V);
bool findMirror(gen M, gen &res);
bool my_jordan(gen M, vecteur &bas, vecteur &evs);
bool my_jordan_knowing_linear_order(gen M, int o, vecteur &bas, vecteur &evs);
bool my_jordan_knowing_linear_order_alt(gen M, int o, vecteur &bas, vecteur &evs);
bool identify_in_field(gen x, gen pol, gen &res);
void reduce_degree(gen &x);
void reduce_degree_vect(gen &x);
void reduce_degree_mat(gen &x);
bool my_giac_kernel(gen M, gen &res);
bool my_giac_are_dep(gen v, gen w);
void normalize_vector(gen &v);
string convert_time(long double x);
};
#endif