[BACK]Return to tk_edge2.rr CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / src

File: [local] / OpenXM / src / asir-contrib / packages / src / tk_edge2.rr (download)

Revision 1.1, Mon May 2 02:11:15 2016 UTC (8 years ago) by takayama
Branch: MAIN
CVS Tags: HEAD

A package for the paper
H.Nakayama and N.Takayama, An Introduction to Algorithms for D-modules
with Quiver D-modules.

/* 
$OpenXM: OpenXM/src/asir-contrib/packages/src/tk_edge2.rr,v 1.1 2016/05/02 02:11:15 takayama Exp $
 */
/* This is a package for the paper 
  H.Nakayama and N.Takayama, An Introduction to Algorithms for D-modules
    with Quiver D-modules.
  - Module is not defined, because this package is for the paper above.
  - Comments are in UTF-8.
*/

// 2016.05.02  a copy from misc-2016/04/lyon/Prog/edge2.rr
// cvs-misc diff -r1.28 -r1.29 edge2.rr   nd_gr の括弧の多い bug. 2016.02.24
// 2016.01.04
// Generate edge framing for 2-dim case.
// Generate associated D-modules.
//Note: 2016/01/04-my-note-tmp-edge-framing.pdf
//Ref:  @s/2016/01/12-my-note-from-oct-to-jan.pdf
import("names.rr")$
extern Edge_x$
extern Edge_dx$
extern Edge_n$
extern Edge_frame$
extern Edge_fvector$
extern Edge_quiver$
extern Edge_rank$
extern Edge_rank2$
extern Edge_module_basis$
extern Edge_module_vars$
extern MyDebug$
MyDebug=0$
Edge_x=[x,y]$
Edge_dx=[dx,dy]$
Edge_n=length(Edge_x)$
// Edge_frame=0$
// Edge_rank=1$

/* omega_alpha for dim(X_alpha)=1 and Closure(V(F)) = X_alpha 
 */
def omega1(F) {
  /* F=ax+by-c ==> omega=(a dy - b dx)/(a^2+b^2)
     dF * omega = dx*dy 
   */
  A = coef(F,1,Edge_x[0]);
  B = coef(F,1,Edge_x[1]);
  Omega = (A*Edge_dx[1]-B*Edge_dx[0])/(A^2+B^2);
  return(Omega);
}

/*
  f_{beta,alpha} where alpha > beta
  Closure(X_alpha) = V(F)
  Closure(X_{alpha,beta}) = V(F,G)
  df = omega1(F) and f(V(F,G))=0
 */
def fba(F,G) {
  /* Return f such that Vanish on V(F,G) and df = omega_alpha. */
  Omega = omega1(F);
  N = Edge_n;
  P=newvect(N);
  Ans=0;
  for (I=0; I<N; I++) {
    P[I] = coef(Omega,1,Edge_dx[I]);
    Ans += P[I]*Edge_x[I];
  }
  Rule=poly_solve_linear([F,G],Edge_x);
  Val = base_replace(Ans,Rule);
  Ans = Ans-Val;
  return(Ans);
}

def test1() {
  printf("f_{14,4}=%a\n",fba(2*x+y-2,x));
  printf("f_{14,1}=%a\n",fba(x,2*x+y-2));
}
// 2016.01.07
// p.10  xi1 is basis of T_F/T_point \ni xi_F_point
def xi1(F) {
  N = Edge_n;
  P=newvect(N);
  Ans=0;
  for (I=0; I<N; I++) {
    P[I] = coef(F,1,Edge_x[I]);
  }
  X=-P[1]*Edge_dx[0]+P[0]*Edge_dx[1];
  return(X);
}
// basis of T_empty/T_F
def xi2(F) {
  N = Edge_n;
  P=newvect(N);
  Ans=0;
  for (I=0; I<N; I++) {
    P[I] = coef(F,1,Edge_x[I]);
  }
  X=(P[0]*Edge_dx[0]+P[1]*Edge_dx[1])/(P[0]^2+P[1]^2);
  return(X);
}
//  Eval of i_xi Omega
def ixi(Xi,Omega) {
  DV = Edge_dx; V=Edge_x; N=Edge_n;
  // Todo
}
def test2() {
  L=[x,y,x+y-1,2*x+y-2];
  edge_frame2(L);
}
def test2b() {
  L=[x,y];
  edge_frame2(L);
}
def edge_frame2(L) {
  // L is a list of polynomials.
  V=Edge_x; DV=Edge_dx; N=Edge_n;
  M=length(L);
  Face0=[];  // 0-face
  for (I=0; I<M; I++) {
    for (J=0; J<M; J++) {
      Rule=poly_solve_linear([L[I],L[J]],V);
      if (length(Rule) == 2) {
	Point = base_replace(V,Rule);
	if (!base_memberq(Point,Face0)) Face0=cons(Point,Face0);
      }
    }
  }
  Face0=reverse(Face0); // Face0 is the set of 0-face.
  // Face0to1[I] is a list of one-faces which pass through the I-th 0-face Face0[I]
  Face0to1=newvect(length(Face0));
  for (I=0; I<length(Face0to1); I++) {
    Point=Face0[I]; Face1=[];
    for (J=0; J<M; J++) {
      if (base_replace(L[J],assoc(V,Point)) == 0) Face1=cons(J,Face1);
    }
    Face0to1[I] = reverse(Face1);
  }
  Face0to1 = vtol(Face0to1);
  // return [Face0,Face0to1];
  Omega1=newvect(M);
  for (I=0; I<M; I++) Omega1[I] = omega1(L[I]);
  Omega1 = vtol(Omega1);
  // return [Face0,Face0to1,Omega1];
  // f_ba given by face0*face1
  Fba0to1=newmat(length(Face0),M);
  for (I=0; I<length(Face0); I++) {
    Point=Face0[I];
    Upface=Face0to1[I];
    for (K=0; K<length(Upface); K++) {
      J = Upface[K];
      if (K==0) JJ=Upface[1]; else JJ=Upface[0];
      Fba0to1[I][J] = fba(L[J],L[JJ]);
    }
  }
  Face1=L; Face2=[0];
  Omega2=[DV[0]*DV[1]];
  Omega0=newvect(length(Face0));
  for (I=0; I<length(Face0); I++) Omega0[I]=1;
  Omega0=vtol(Omega0);
  Fba1to2=matrix_transpose(newmat(1,length(L),[L]));
  // We need basis of T_alpha and F_alpha (p.10)
  //  T_alpha = xi s.t.   xi f = 0 for all f in F_alpha
  Talpha0=vtol(newvect(length(Face0)));
  Talpha1=newvect(M);
  for (I=0; I<M; I++) Talpha1[I]=xi1(L[I]);
  Talpha1=vtol(Talpha1);
  Talpha2=DV;
  // We need a list of xi_ba
  // b>a, i_xi_ba(omega_b) = omega_a,  xi_ba \in T_b/T_a   note: 2016/01/04, 01/08
  // Xib is the set of xi_ba
  Xi0=0;
  Xi1=newvect(length(Face1));
  for (I=0; I<length(Face1); I++) Xi1[I]=xi1(Face1[I]);
  Xi1=vtol(Xi1);
  Xi2=newvect(length(Face1));
  for (I=0; I<length(Face1); I++) Xi2[I]=xi2(Face1[I]);
  Xi2=vtol(Xi2);

  Ans=   [[Face0,Face1,Face2,Face0to1],
	  [Omega0,Omega1,Omega2],
	  [Fba0to1,Fba1to2],
	  [Talpha0,Talpha1,Talpha2],
	  [Xi0,Xi1,Xi2]
	  ];
  Edge_frame=Ans;
  Edge_fvector=reverse(cdr(reverse(map(length,Ans[0]))));
  return(Ans);
}
// p.30  differential eq.
def usage() {
 printf("Usage: edge_frame2(list of poly in x,y);\n")$
   printf(" [[face0,face1,[0],face0_by_face1], [0]\n  [omega0,omega1,omega2], [1]\n  [f_ba(0-face * 1-face),f_ba(1-face to 2 face)], [2]\n")$
   printf("  [T_0,T_1,T_2], [3] tangent space on X_a\n");
   printf("  [[0],  Xi10=T_i/T_point,  Xi21=T_empty/T_i]] [4] representative of xi_ba, T_i stands for the i-th 1-face.\n")$
     printf("This function sets the global variables Edge_frame, ...\n")$
     printf("Example: test2();\n")$
       printf("genQuiver(1); map(ptomb,base_flatten(qd2()));\n")$
}
usage()$
//test2();

// 2016.01.09
//  It is assumed that Edge_frame is set. It returns index of the 0-face or expression of 0-face by 1-faces.
def idx0(F) {
  Face0_by_face1=Edge_frame[0][3];
  if (type(F) <= 1) {
    return(Face0_by_face1[F]);
  }
  F=qsort(F);
  return(base_position(F,Face0_by_face1));
}

// 2016.01.08 --> redo 2016.01.09

// Quiver representation.
def usage_q() {
  printf("Quiver representation:\n")$
  printf(" f is the f-vector.\n")$
  printf(" [[f0-vector of basis, f1-vector of basis, f2-vector of basis],\n")$
  printf("  [f_0*f_1 matrix m01,f_1*f_2 matrix m12],\n")$
  printf("  [f_2*f_1 matrix m21,f_1*f_0 matrix m10]]\n")$
    printf(" The (p,q) entry of mij is the linear map from p-th i-face to q-th j-face.\n");
    printf(" If it is 0, there is no edge standing for the entry.\n")$
      printf(" Global variables: Edge_quiver\n")$
}

def genmat(Sym,Idx,R) {
  M = newmat(R,R);
  for (I=0; I<R; I++) {
    for (J=0; J<R; J++) {
      M[I][J] = util_v(Sym,append(Idx,[I,J]));
    }
  }
  return(M);
}
// 2016.04.18
def genmat2(Sym,Idx,R1,R2) {
  M = newmat(R2,R1);
  for (I=0; I<R2; I++) {
    for (J=0; J<R1; J++) {
      M[I][J] = util_v(Sym,append(Idx,[I,J]));
    }
  }
  return(M);
}

def isConnected(Face0Idx,Face1Idx) {
  Incidence = Edge_frame[0];
  if ((Face0Idx < 0) || (Face1Idx < 0)) debug("error: isConnected.");
  if (Face0Idx > Edge_fvector[0]) debug("error: isConnected.");
  if (Face1Idx > Edge_fvector[1]) debug("error: isConnected.");
  In=idx0(Face0Idx);
  if (base_memberq(Face1Idx,In)) return(1);
  else return(0);
}

def genQuiver(Rank) {
  if (type(Rank)<4) {
    Edge_rank2=[Rank,Rank,Rank]; 
    Edge_rank=Rank;
  } else {Edge_rank2 = Rank; Edge_rank=-1;}
  Fvector=Edge_fvector;
  Basis0 = newvect(Fvector[0]);
  for (I=0; I<Fvector[0]; I++) Basis0[I]=genvect(v_0,I,Edge_rank2[0]);
  Basis0=vtol(Basis0);

  Basis1 = newvect(Fvector[1]);
  for (I=0; I<Fvector[1]; I++) Basis1[I]=genvect(v_1,I,Edge_rank2[1]);
  Basis1=vtol(Basis1);

  Basis2 = newvect(Fvector[2]);
  for (I=0; I<Fvector[2]; I++) Basis2[I]=genvect(v_2,I,Edge_rank2[2]);
  Basis2=vtol(Basis2);

  M01=newmat(Fvector[0],Fvector[1]);
  for (I=0; I<Fvector[0]; I++) for (J=0; J<Fvector[1]; J++) {
      if (!isConnected(I,J)) M01[I][J]=0;
      else M01[I][J] = genmat2(m01,[I,J],Edge_rank2[0],Edge_rank2[1]);
  }
  M12=newmat(Fvector[1],Fvector[2]);
  for (I=0; I<Fvector[1]; I++) for (J=0; J<Fvector[2]; J++) {
      M12[I][J] = genmat2(m12,[I,J],Edge_rank2[1],Edge_rank2[2]);
  }

  M21=newmat(Fvector[2],Fvector[1]);
  for (I=0; I<Fvector[2]; I++) for (J=0; J<Fvector[1]; J++) {
      M21[I][J] = genmat2(m21,[I,J],Edge_rank2[2],Edge_rank2[1]);
  }

  M10=newmat(Fvector[1],Fvector[0]);
  for (I=0; I<Fvector[1]; I++) for (J=0; J<Fvector[0]; J++) {
      if (!isConnected(J,I)) M10[I][J]=0;
      else M10[I][J] = genmat2(m10,[I,J],Edge_rank2[1],Edge_rank2[0]);
  }

  Edge_quiver=[[Basis0,Basis1,Basis2],[M01,M12],[M21,M10]];
  module_basis();
  return(Edge_quiver);
}
// 2016.01.09  changelog by bandicam  fe:/Movies/archive/bandicam

// 2016.01.10 
def genvect(Symb,Idx,Rank) {
  V=newvect(Rank);
  for (I=0; I<Rank; I++) V[I] = util_v(Symb,[Idx,I]);
  return(V);
}
//test: test2(); Ans=genQuiver(2); eq_type1_2();

  /* xi \in T_a, X_a > X_b    dim X_a >= 1
     xi*omega_a*v_a-sum <xi,f_ab>*omega_b*A_ba(v_a)
  Ans[1]=Omega: [[1],[dy,-dx],[dy*dx]]
  Ans[2]=Fba: [[ y -x ],[x,y]]
  eq_type1
  */
def eq_type1_2() { // p.30 (4.25), the case of dim X_a = 2, diff op.
  // Edge_frame, Edge_quiver, Edge_rank are used.
  Eframe=Edge_frame;
  Omega=Eframe[1];
  Fba=Eframe[2];  // Fba[1][I][0] : f_empty_I 
  Dx=Edge_dx[0]; Dy=Edge_dx[1]; // basis of xi
  X=Edge_x[0]; Y=Edge_x[1];
  Two2One=Edge_quiver[2][0];  // 1*f_1 matrix.
  Vbase1=Edge_quiver[0][1];    // length is f_1
  Vbase2=Edge_quiver[0][2];   // length is f_2=1. Element is a basis. 
  Ans=[];
  for (K=0; K<Edge_rank2[2]; K++) {
    Eqx=Dx*util_v(om,[2,0])*Vbase2[0][K];
    for (I=0; I<length(Omega[1]); I++) {
      if (MyDebug) printf("Vbase1[I]=%a, Two2One[0][I]=%a\n",Vbase1[I],Two2One[0][I]);
      if (MyDebug) printf("size(Vbase1[I])=%a, size(Two2One[0][I])=%a\n",size(Vbase1[I]),size(Two2One[0][I]));
      Image=(Vbase1[I]*Two2One[0][I]);
%%Note:  Vbase1[q]*Two2One[0][q]  2-face から 1-face への写像. 
%%       これの K 番目を取出すと 2-face の K-番目の基底\in V の像 \in V_{q番目の 1-faceに対応する vector space}
      if (MyDebug) printf("Image=%a\n",Image);
      //     if (Image != 0) Image=Image[K];
      if (Two2One[0][I] != 0) Image=Image[K]; else Image=0;
      Eqx -= diff(Fba[1][I][0],X)*util_v(om,[1,I])*Image;
      // f_ab of 2-face and I-th 1-face.
    }
    Ans=cons(Eqx,Ans);
    Eqy=Dy*util_v(om,[2,0])*Vbase2[0][K];
    for (I=0; I<length(Omega[1]); I++) {
      Image=(Vbase1[I]*Two2One[0][I]);
      //      if (Image != 0) Image=Image[K];
      if (Two2One[0][I] != 0) Image=Image[K]; else Image=0;
      Eqy -= diff(Fba[1][I][0],Y)*util_v(om,[1,I])*Image;
    }
    Ans=cons(Eqy,Ans);
  }
  return(reverse(Ans));
}
def test_e1() {
  E=edge_frame2([x,y]);
  genQuiver(1);  // rank 1
  eq_type1_2();
}

  /* xi \in T_a, X_a > X_b    dim X_a >= 1
     xi*omega_a*v_a-sum <xi,f_ab>*omega_b*A_ba(v_a)
  Ans[1]=Omega: [[1],[dy,-dx],[dy*dx]]
  Ans[2]=Fba: [[ y -x ],[x,y]]
  eq_type1
  */
def eq_type1_1() { // the case of dim X_a = 1, diff op.  p.30
  // Edge_frame, Edge_quiver, Edge_rank are used.
  Eframe=Edge_frame;
  Fvector=Edge_fvector;
  Omega=Eframe[1];
  Fba=Eframe[2];  // Fba[0][I][J] : I-th 0 face <--> J-th 1-face.
  Dx=Edge_frame[3][1]; // Dx[J] basis of T_a, for J-th X_a, dim X_a = 1;
  X=Edge_x[0]; Y=Edge_x[1];
  One2Zero=Edge_quiver[2][1];  // f_1*f_0 matrix.
  Vbase0=Edge_quiver[0][0];   // length is f_0. Element is a basis. 
  Vbase1=Edge_quiver[0][1];    // length is f_1
  Ans=[];
  if (MyDebug) printf("size(One2Zero)=%a,size(Vbase0)=%a,size(Vbase1)=%a\n",
		      size(One2Zero),length(Vbase0),length(Vbase1));
  // 
  for (K=0; K<Edge_rank2[1]; K++) for (J=0; J<Fvector[1]; J++) {
    Op = Dx[J];
    Eqx=Op*util_v(om,[1,J])*Vbase1[J][K];
    for (I=0; I<Fvector[0]; I++) {
      //if ((K==1)&&(I==2)) debug();
      Image=(Vbase0[I]*One2Zero[J][I]);

      if (MyDebug) printf("Vbase1[I]=%a, Two2One[0][I]=%a\n",Vbase0[I],One2Zero[J][I]);
      if (MyDebug) printf("size(Vbase0[I])=%a, size(One2Zero[J][I])=%a\n",size(Vbase0[I]),size(One2Zero[J][I]));
      if (MyDebug) printf("Image=%a,[I,J,K]=%a\n",Image,[I,J,K]);

      //      if (Image != 0) Image=Image[K];
      if (One2Zero[J][I] != 0) Image=Image[K]; else Image=0;
      Eqx -= act_d(Op,Fba[0][I][J])*util_v(om,[0,I])*Image;
      // f_ab of I-th 0-face and J-th 1-face.
    }
    Ans=cons(Eqx,Ans);
  }
  return(reverse(Ans));
}

def act_d(Op,F) {
  // print([Op,F]);
  A=coef(Op,1,Edge_dx[0]);
  B=coef(Op,1,Edge_dx[1]);
  return(A*diff(F,Edge_x[0])+B*diff(F,Edge_x[1])+base_replace(Op,assoc(Edge_dx,[0,0]))*F);
}
  /* p.30
     f \in F_a, X_a < X_b     dim X_a <= 1
     f*omega_a*v_a - sum <xi_ab,f>*omega_b*A_ba(v_a)
  */
def eq_type2_1() { //  f*one_face - sum of two face.  p.30 of [KV]
  // Edge_frame, Edge_quiver, Edge_rank are used.
  Eframe=Edge_frame;
  Fvector=Edge_fvector;
  Omega=Eframe[1];
  Xiba=Eframe[4];  // Xiba[2][I] : I-th 1 face <--> the 2-face.
  X=Edge_x[0]; Y=Edge_x[1];
  F=Edge_frame[0][1];
  One2Two=Edge_quiver[1][1];  // f_1*f_2 matrix.
  Vbase1=Edge_quiver[0][1];    // length is f_1
  Vbase2=Edge_quiver[0][2];    // length is f_2
  Ans=[];
  for (K=0; K<Edge_rank2[1]; K++) for (J=0; J<Fvector[1]; J++) {
    Eqx=F[J]*util_v(om,[1,J])*Vbase1[J][K];
    Image=(Vbase2[0]*One2Two[J][0]);
    //    if (Image != 0) Image=Image[K];
    if (One2Two[J][0] == 0) Image=0; else Image=Image[K];
    Eqx -= act_d(Xiba[2][J],F[J])*util_v(om,[2,0])*Image;
    // xi_ba of 0-th 2-face and J-th 1-face.
    Ans=cons(Eqx,Ans);
  }
  return(reverse(Ans));
}

def eq_type2_0() { //  f*zero_face - sum of one face.  p.30 of [KV]
  // Edge_frame, Edge_quiver, Edge_rank are used.
  Eframe=Edge_frame;
  Fvector=Edge_fvector;
  Xiba=Eframe[4];  // Xiba[1][I] : I-th 1 face <--> 0-face.
  X=Edge_x[0]; Y=Edge_x[1];
  F=Edge_frame[0][1];
  Zero2One=Edge_quiver[1][0];  // f_0*f_1 matrix.
  Vbase0=Edge_quiver[0][0];    // length is f_2
  Vbase1=Edge_quiver[0][1];    // length is f_1
  Ans=[];
  for (K=0; K<Edge_rank2[0]; K++) for (J=0; J<Fvector[0]; J++) {
    ZeroFace=idx0(J);
    for (JJ=0; JJ<length(ZeroFace); JJ++) {
      Eqx=F[ZeroFace[JJ]]*util_v(om,[0,J])*Vbase0[J][K];
      for (I=0; I<Fvector[1]; I++) {
        Image=(Vbase1[I]*Zero2One[J][I]); 
	if (Zero2One[J][I] == 0) Image=0; else Image=Image[K];
        // if (Image != 0) Image=Image[K];
        Eqx -= act_d(Xiba[1][I],F[ZeroFace[JJ]])*util_v(om,[1,I])*Image;
        // xi_ba of I-th 1-face and 0-face.
      }
      Ans=cons(Eqx,Ans);
    }
  }
  return(reverse(Ans));
}
// 2016.01.10  bandicam.

def qd2() {
  E=[eq_type1_2(),eq_type1_1(),eq_type2_1(),eq_type2_0()];
  return(E);
}

def test3() {
  L=[x,y,x+y-1,2*x+y-2];
  edge_frame2(L); genQuiver(1);
  qd2();
}

// 2016.01.11  free module form. relations of coef's.
def module_basis() {
  Basis=[];
  Fvector=Edge_fvector;
  Vbase2=Edge_quiver[0][2];
  Vbase1=Edge_quiver[0][1];
  Vbase0=Edge_quiver[0][0];
  for (K=0; K<Edge_rank2[2];K++) Basis=cons(util_v(om,[2,0])*Vbase2[0][K],Basis);
  for (I=0; I<Fvector[1];I++) for (K=0; K<Edge_rank2[1]; K++) 
				Basis = cons(util_v(om,[1,I])*Vbase1[I][K],Basis);
  for (I=0; I<Fvector[0];I++) for (K=0; K<Edge_rank2[0]; K++) 
				Basis = cons(util_v(om,[0,I])*Vbase0[I][K],Basis);
  Basis = reverse(Basis);
  Edge_module_basis = Basis;

  V=[]; 
  for (KK=0; KK<=2; KK++) {
    for (I=0; I<Fvector[KK]; I++) {
      V = cons(util_v(om,[KK,I]),V);
    }
  }
  for (KK=0; KK<=2; KK++) {
    for (I=0; I<Fvector[KK]; I++) {
      for (K=0; K<Edge_rank2[KK]; K++) {
         V = cons(Edge_quiver[0][KK][I][K],V);
      }
    }
  }
  V = reverse(V);
  Edge_module_vars=V;

  return(Basis);
}

// translate output of qd2() to the free module expression.
// map(ptomb,base_flatten(qd2()));
def ptomb(Op) {
  V = Edge_module_vars;
  MB = map(dp_etov,map(dp_ptod,Edge_module_basis,V));
  Ans = newvect(length(Edge_module_basis));
  Op_d = dp_ptod(Op,V);
  while (Op_d != 0) {
    E = dp_etov(dp_ht(Op_d));
    Pos = base_position(E,MB);
    if (Pos < 0) debug();
    Ans[Pos] = dp_hc(Op_d);
    Op_d = dp_rest(Op_d);
  }
  return(vtol(Ans));
}

// type 1 condition for the quiver representation.
// a -- b --- c   and  b runs over the one face.
def qrep_cond1() {
  Fvector=Edge_fvector;
  Ans=[];
  for (Gamma = 0 ; Gamma < Fvector[0]; Gamma++) {
    Faces1 = idx0(Gamma);
    Cond = 0;
    for (I=0; I<length(Faces1); I++) {
      Beta = Faces1[I];
      // a <--(A1)--b<--(A2)--c
      A1 = Edge_quiver[1][1][Beta][0]; // f1*f2 matrix
      A2 = Edge_quiver[1][0][Gamma][Beta]; // f0*f1 matrix
      Cond += A1*A2; 
    }
    Ans=cons(base_flatten(Cond),Ans);
  }

  // opposite direction.
  for (Gamma = 0 ; Gamma < Fvector[0]; Gamma++) {
    Faces1 = idx0(Gamma);
    Cond = 0;
    for (I=0; I<length(Faces1); I++) {
      Beta = Faces1[I];
      // a --(A1)-->b--(A2)-->c
      A1 = Edge_quiver[2][0][0][Beta]; // f2*f1 matrix, usage_q();
      A2 = Edge_quiver[2][1][Beta][Gamma]; // f1*f0 matrix
      Cond += A2*A1; 
    }
    Ans=cons(base_flatten(Cond),Ans);
  }
  Ans = reverse(Ans);
  return(Ans);
} 
// type 2 condition for the quiver representation.
/* 
   b-->  a
     <-- c    b is the two face.
  or     a <-- b
         c --->     b is the zero face
 */
def qrep_cond2() {
  Fvector=Edge_fvector;
  Ans=[];
  for (I=0; I<Fvector[1]; I++){
    for (J=0; J<Fvector[1]; J++) {
      Alpha=I; Gamma=J;
      if (Alpha == Gamma) continue;
      Cond=0;
      // the case b is the two face.
      A2 = Edge_quiver[1][1][Gamma][0]; // f1*f2 matrix
      A1 = Edge_quiver[2][0][0][Alpha]; // f2*f1 matrix
      Cond += A1*A2;
      // the case b is the zero face.
      ThereIsB=0;
      for (B=0; B<Fvector[0]; B++) {
        Beta=idx0(B);
        if (base_memberq(Gamma,Beta) && base_memberq(Alpha,Beta)) {
          ThereIsB=1;  // condition there exists b s.t. a >b, c>b, p.15 3.Quivers
	  A1=Edge_quiver[1][0][B][Alpha];
          A2=Edge_quiver[2][1][Gamma][B];
          Cond += A1*A2;
        }
      }
      if (ThereIsB) Ans=cons(base_flatten(Cond),Ans);
    }
  }
  Ans=reverse(Ans);
  return(Ans);
}
// Ans=base_flatten([qrep_cond1(),qrep_cond2()]);
// V = base_prune(0,base_flatten([Edge_quiver[1],Edge_quiver[2]]));
// nd_gr(Ans,V,0,2);
test3()$
// 2016.01.12

def getMonomials(L,V) {
  Ans=[];
  for (I=0; I<length(L); I++) {
    if (dp_rest(dp_ptod(L[I],V)) == 0) Ans=cons(L[I],Ans);
  }
  return(reverse(Ans));
}
def test_xy() {
  F=[x,y];
  edge_frame2(F);
  genQuiver(1);
  Eq=qd2();  printf("Eq=%a\n",Eq);
  Eq2=map(ptomb,base_flatten(Eq)); printf("Eq2=%a\n",Eq2);
  Ans=base_flatten([qrep_cond1(),qrep_cond2()]);
  V = base_prune(0,base_flatten([Edge_quiver[1],Edge_quiver[2]]));
  printf("V=%a\n",V);
  printf("Monomial eq=%a\n",getMonomials(Ans,V));
  // nd_gr(Ans,V,0,2); 
  // V=[m01_0_0_0_0,m01_0_1_0_0,m12_0_0_0_0,m12_1_0_0_0,m21_0_0_0_0,m21_0_1_0_0,m10_0_0_0_0,m10_1_0_0_0];
  V1=[m01_0_0_0_0,m01_0_1_0_0,m12_0_0_0_0,m12_1_0_0_0];
  V2=[m21_0_0_0_0,m21_0_1_0_0,m10_0_0_0_0,m10_1_0_0_0];
  //Rule=assoc(V2,[0,0,0,0]);
  Rule=assoc(cdr(V),[1/2,1/3,1/5,0,0,0,0]);
  //nd_gr(base_replace(Ans,Rule),V1,0,2); 
  G=nd_gr(base_replace(Ans,Rule),[car(V)],0,2); 
  printf("G=%a\n",G);
  Rule2=[[m01_0_0_0_0,-3/10]];
  RuleAll=append(Rule,Rule2);
  printf("For M2. load \"Dmodules.m2\";\n");
  printf("R=QQ[x,y,dx,dy,WeylAlgebra=>{x=>dx,y=>dy}]\n");
  printf("I = matrix(Eq2) ; replace [ ] by { }\n");
  printf("II = transpose(I); M = coker II; Ddim(M); charIdeal(M)\n"); 
  return(base_replace(Eq2,RuleAll));
}
// test_xy();
def test_q5() {
  F=[x,y,x+y-1];
  edge_frame2(F);
  genQuiver(1);
  Eq=qd2();  printf("Eq=%a\n",Eq);
  Eq2=map(ptomb,base_flatten(Eq)); printf("Eq2=%a\n",Eq2);
  Ans=base_flatten([qrep_cond1(),qrep_cond2()]);
  V = base_prune(0,base_flatten([Edge_quiver[1],Edge_quiver[2]]));
  printf("V=%a\n",V);
  printf("Monomial eq=%a\n",getMonomials(Ans,V));
  // page 41 of 2015/10/02-my-notes-june-july-lyon-*.pdf. set m12 and m01 to 0.
  V1=[m01_0_0_0_0,m01_0_1_0_0,m01_1_0_0_0,m01_1_2_0_0, m01_2_1_0_0,m01_2_2_0_0,
     m12_0_0_0_0,m12_1_0_0_0,m12_2_0_0_0];
  V2=[m21_0_0_0_0,m21_0_1_0_0,m21_0_2_0_0];
  V3=[m10_0_0_0_0,m10_0_1_0_0,m10_1_0_0_0,m10_1_2_0_0,m10_2_1_0_0,m10_2_2_0_0] ;
  Rule1 = assoc(V1,vtol(newvect(length(V2))));
  Rule2 = assoc(V2,[1,2,3]); // page 40 of the note note.
  Rule3 = assoc(V3,[-2,-3,1,-3,1,2]);
  // Rule = append(Rule1,Rule2);
  Rule = append(append(Rule1,Rule2),Rule3);
  printf("Reduced Cond=%a == [ ] ? \n",base_prune(0,base_replace(Ans,Rule)));
  // nd_gr(base_replace(Ans,Rule),V3,0,2); 
  return(base_replace(Eq2,Rule));  // diff eq  for q5.m2
}
test_q5();

// 2016.02.11
// x, y, x+y-1, 2x+y-1
def test_e4() {
  F=[x,y,x+y-1,2*x+y-1];
  edge_frame2(F);
  genQuiver(1);
  Eq=qd2();  printf("Eq=%a\n",Eq);
  Eq2=map(ptomb,base_flatten(Eq)); printf("Eq2=%a\n",Eq2);
  Ans=base_flatten([qrep_cond1(),qrep_cond2()]);
  V0=[m01_0_0_0_0,m01_0_1_0_0,m01_1_0_0_0,m01_1_2_0_0,m01_1_3_0_0,m01_2_1_0_0,
      m01_2_2_0_0,m01_3_1_0_0,m01_3_3_0_0,
      m12_0_0_0_0,m12_1_0_0_0,m12_2_0_0_0,m12_3_0_0_0];
  Rule0=assoc(V0,vtol(newvect(length(V0))));
  Ans = base_prune(0,base_replace(Ans,Rule0)); // 上向はすべて 0 に.
  V2= [m21_0_0_0_0,m21_0_1_0_0,m21_0_2_0_0,m21_0_3_0_0];
  V1= [m10_0_0_0_0,m10_0_1_0_0,m10_1_0_0_0,m10_1_2_0_0,m10_1_3_0_0,
       m10_2_1_0_0,m10_2_2_0_0,m10_3_1_0_0,m10_3_3_0_0];

  /* 見やすい変数を使う */
  V2a = [a1,a2,a3,a4];
  V1b = [b1,b2,c1,c3,c4,e2,e3,f2,f4];
  RuleV2=assoc(V2,V2a);
  RuleV1=assoc(V1,V1b);
  G=base_prune(0,base_replace(Ans,append(RuleV1,RuleV2)));
  G0=map(dp_ptod,G,[a1,a2,a3,a4]);
  printf("Relations (before GB) is \n"); map(print,G0);
  G=nd_gr(G,append(V2a,V1b),0,0);
  //  G=nd_gr(G,append(V2a,V1b),0,0));  // これでもエラーでない. なぜ? 答えも違う.  2016.02.24
  // edge.tex 修正. --> edge.tex は修正不要. 2016.02.29
  G2=map(dp_ptod,G,[a1,a2,a3,a4]);
  printf("Relations (dist poly w.r.t. a1,a2,a3,a4)= %a\n",G2);
  map(print,G2);
  
  RuleN1 = assoc(cdr(V1b),[1,1,1,1,1,1,1,1]); // ここの数字を変更すればよい.
  RuleN1 = cons([b1,base_replace(-b2*c1*e3*f4/(c3*e2*f4+c4*e3*f2),RuleN1)],RuleN1); 
    // cf. det(test_e4b()); 
  printf("RuleN1 = %a\n",RuleN1);
  // print(det(base_replace(test_e4b(),RuleN1)));
  G2=nd_gr(base_replace(G,RuleN1),V2a,0,0);
  RuleL=poly_solve_linear(G2,V2a);
  printf("RuleL=%a\n",RuleL);
  Rule=append(RuleL,RuleN1);  // この変数は quiver 表現を与える. a1 とかが残れば任意定数
  printf("Result Rule=%a\n",Rule);
  L = base_replace(qd2(),append(append(RuleV1,RuleV2),Rule0));
  L = base_replace(L,Rule);
  Eq=map(ptomb,base_flatten(L)); // 方程式系
  return(Eq);
}
test_e4();
def test_e4b() {
  M=newmat(4,4,
   [[b1,c1,0,0],
    [b2,0,e2,f2],
    [0,c3,e3,0],
    [0,c4,0,f4]]);
}

// 2016.03.17 tsukuba  数を適当に入れた具体的な方程式.
def test_e4c() {
  MM=test_e4b();
  M=det(MM);
  /* ここの数を適当に設定 */
  Rule=[[b1,1],[b2,2],[c1,3],[c3,4],[c4,5],[e2,6],[e3,7],[f2,8]];
  M=base_replace(M,Rule);
  Rule2=poly_solve_linear([M],[f4]);
  Rule=append(Rule,Rule2);

  F=[x,y,x+y-1,2*x+y-1];
  edge_frame2(F);
  genQuiver(1);
  Eq=qd2();  printf("Eq=%a\n",Eq);
  Eq2=map(ptomb,base_flatten(Eq)); printf("Eq2=%a\n",Eq2);

  V0=[m01_0_0_0_0,m01_0_1_0_0,m01_1_0_0_0,m01_1_2_0_0,m01_1_3_0_0,m01_2_1_0_0,
      m01_2_2_0_0,m01_3_1_0_0,m01_3_3_0_0,
      m12_0_0_0_0,m12_1_0_0_0,m12_2_0_0_0,m12_3_0_0_0];
  Rule0=assoc(V0,vtol(newvect(length(V0)))); /* 上向きはすべて 0*/
  V2= [m21_0_0_0_0,m21_0_1_0_0,m21_0_2_0_0,m21_0_3_0_0];
  V1= [m10_0_0_0_0,m10_0_1_0_0,m10_1_0_0_0,m10_1_2_0_0,m10_1_3_0_0,
       m10_2_1_0_0,m10_2_2_0_0,m10_3_1_0_0,m10_3_3_0_0];

  /* 見やすい変数を使う */
  V2a = [a1,a2,a3,a4];
  V1b = [b1,b2,c1,c3,c4,e2,e3,f2,f4];
  RuleV2=assoc(V2,V2a);
  RuleV1=assoc(V1,V1b);
  Eq3=base_replace(Eq2,append(Rule0,append(RuleV1,RuleV2)));

  L=base_replace(MM,Rule)*newvect(4,[a1,a2,a3,a4]);
  RuleA=poly_solve_linear(L,[a1,a2,a3,a4]);
  RuleAB=append(RuleA,Rule);
  return base_replace(Eq3,RuleAB);
}
test_e4c();

// 2016.04.20
def test_direct1() {
  F=[x,y,x-y];
  edge_frame2(F);
  genQuiver([2,1,1]);
  Eq=qd2();  printf("Eq=%a\n",Eq);
  Eq2=map(ptomb,base_flatten(Eq)); printf("Eq2=%a\n",Eq2);

  M01=[];
  for (I=0; I<=2; I++) {
    for (J=0; J<=1; J++) {
      M01 = cons(util_v(m01,[0,I,0,J]),M01);
    }
  }
  M01=reverse(M01);
  Rule01=assoc(M01,[1,0, -1,1, 0,-1]);
  printf("m01=%a\n",M01);
  M10=[];
  for (I=0; I<=2; I++) {
    for (J=0; J<=1; J++) {
      M10 = cons(util_v(m10,[I,0,J,0]),M10);
    }
  }
  M10=reverse(M10);
  Rule10=assoc(M10,[mu2,mu3, -mu1,mu3, -mu1,-mu1+mu2]);
  printf("m10=%a\n",M10);
  printf("Rule01,Rule10=%a\n",[Rule01,Rule10]);

  Rule12=[]; for (I=0; I<=2; I++) Rule12=cons(util_v(m12,[I,0,0,0]),Rule12);
  Rule12=reverse(Rule12);
  Rule12=assoc(Rule12,[1,1,1]);

  Rule21=[]; for (I=0; I<=2; I++) Rule21=cons(util_v(m21,[0,I,0,0]),Rule21);
  Rule21=reverse(Rule21);
  Rule21=assoc(Rule21,[mu1,mu2,mu3]);

  Rule=append(Rule01,Rule10);
  Rule=append(Rule,Rule21);
  Rule=append(Rule,Rule12);

  Eq2=base_replace(Eq2,Rule);
  return(Eq2);
}
Eq=test_direct1();
MyMu=1/7;
//MyMu=1;
Eq2=base_replace(Eq,[[mu1,MyMu],[mu2,MyMu],[mu3,MyMu]]);
// module_integration(Eq2,[x,y],[dx,dy],[1,1]);  [1,1] does not work
// II1= module_integration(Eq2,[x,y],[dx,dy],[1,0]);  [1,1] does not work
// II2= module_integration(II1,[y],[dy],[1]);  [1,1] does not work

// 2016.04.24
def test_direct2() {
  F=[x,y,x+y-1];
  edge_frame2(F);
  genQuiver([1,1,1]);
  Eq=qd2();  printf("Eq=%a\n",Eq);
  Eq2=map(ptomb,base_flatten(Eq)); printf("Eq2=%a\n",Eq2);

  M01=[];
  for (I=0; I<=2; I++) {
    for (J=0; J<=2; J++) {
      M01 = cons(util_v(m01,[J,I,0,0]),M01);
    }
  }
  M01=reverse(M01);
  // from 0-face to 1-face, index is I is 1-face
  Rule01=assoc(M01,[1,1,0,  -1,0,1,  0,-1,-1]);
  printf("m01=%a\n",M01);

  M10=[];
  for (I=0; I<=2; I++) {
    for (J=0; J<=2; J++) {
      M10 = cons(util_v(m10,[I,J,0,0]),M10);
    }
  }
  M10=reverse(M10);
  // from 1-face to 0-face.  note 2016.04.24 9:01
  Rule10=assoc(M10,[mu2,mu3,0, -mu1,0,mu3, 0,-mu1,-mu2]);

  printf("m10=%a\n",M10);
  printf("Rule01,Rule10=%a\n",[Rule01,Rule10]);

  Rule12=[]; 
  for (I=0; I<=2; I++) for (J=0; J<=2; J++) 
    Rule12=cons(util_v(m12,[I,0,0,0]),Rule12);
  Rule12=reverse(Rule12);
  // from 1-face to the unique 2-face
  Rule12=assoc(Rule12,[1,1,1]);

  Rule21=[]; for (I=0; I<=2; I++) Rule21=cons(util_v(m21,[0,I,0,0]),Rule21);
  Rule21=reverse(Rule21);
  // from the 2-face to 1-face
  Rule21=assoc(Rule21,[mu1,mu2,mu3]);

  Rule=append(Rule01,Rule10);
  Rule=append(Rule,Rule21);
  Rule=append(Rule,Rule12);

  Eq2=base_replace(Eq2,Rule);
  return(Eq2);
}
Eq=test_direct2();
MyMu=1/7;
//MyMu=1;
Eq2=base_replace(Eq,[[mu1,MyMu],[mu2,MyMu],[mu3,MyMu]]);
// load("module_gr2.rr");
// II1=module_integration(Eq2,[x,y],[dx,dy],[1,0]);
// II2=module_integration(II1,[y],[dy],[1]);
// matrix_rank(II2);

end$