/*
* Vertices in strip are numbered as follows:
*
- * |
+ * :axis of symmetry
+ * | :
+ * | :
* ___ X-2 ___ X-1 ___| 0 ___ 1 ___ 2 ___ 3 ___ 4 __
- * Y-1 Y-1 |0 0 0 0 0
- * / \ / \ / \ / \ / \ / \ / \
- * / \ / \ /| \ / \ / \ / \ / \
+ * Y-1 Y-1 |0: 0 0 0 0
+ * / \ / \ / :\ / \ / \ / \ / \
+ * / \ / \ /| : \ / \ / \ / \ / \
* X-3 ___ X-2 ___ X-1|___ 0 ___ 1 ___ 2 ___ 3 ___ 4
- * Y-2 Y-2 Y-2| 1 1 1 1 1
- * \ / \ / \| / \ / \ / \ / \ /
- * \ / \ / \ / \ / \ / \ / \ /
+ * Y-2 Y-2 Y-2| : 1 1 1 1 1
+ * \ / \ / \| : / \ / \ / \ / \ /
+ * \ / \ / \ :/ \ / \ / \ / \ /
* ___ X-2 ___ X-1 ___| 0 ___ 1 ___ 2 ___ 3 __ 4 ___
- * Y-3 Y-3 |2 2 2 2 2
- * / \ / \ / \ / \ / \ / \ / \
- * / \ / \ /| \ / \ / \ / \ / \
+ * Y-3 Y-3 |2: 2 2 2 2
+ * / \ / \ / :\ / \ / \ / \ / \
+ * / \ / \ /| : \ / \ / \ / \ / \
* X-3 ___ X-2 ___ X-1|___ 0 ___ 1 ___ 2 ___ 3 ___ 4
- * Y-4 Y-4 Y-4| 3 3 3 3 3
- * |
- * . . . . .| . . . . . . . . . .
- * |
+ * Y-4 Y-4 Y-4| : 3 3 3 3 3
+ * | :
+ * . . . . .| :. . . . . . . . . .
+ * | :
* ___ X-2 ___ X-1 ___| 0 ___ 1 ___ 2 ___ 3 ___ 4 ___
* 2 2 |Y-3 Y-3 Y-3 Y-3 Y-3
- * / \ / \ / \ / \ / \ / \ / \
- * / \ / \ /| \ / \ / \ / \ / \
+ * / \ / \ / :\ / \ / \ / \ / \
+ * / \ / \ /| : \ / \ / \ / \ / \
* __ X-2 ___ X-1|___ 0 ___ 1 ___ 2 ___ 3 ___ 3 ___ 4
- * 1 1 | Y-2 Y-2 Y-2 Y-2 Y-2 Y-2
- * / \ / \ / \| / \ / \ / \ / \ /
- * / \ / \ / \ / \ / \ / \ / \ /
+ * 1 1 | : Y-2 Y-2 Y-2 Y-2 Y-2 Y-2
+ * / \ / \ / \| : / \ / \ / \ / \ /
+ * / \ / \ / \ :/ \ / \ / \ / \ /
* -3 ___ X-2 ___ X-1 ___| 0 ___ 1 ___ 2 ___ 3 ___ 4 ___
* 0 0 0 |Y-1 Y-1 Y-1 Y-1 Y-1
+ * | :
+ * | :
* |
* ^ join, where there is
* a discontinuity in numbering
*
* Node x,y for
* 0 <= x < X = 2^XBITS x = distance along
- * 0 <= y < Y = 2^YBITS-1 y = distance across
+ * 0 <= y < Y = 2^YBITS-1 y = distance across
*
* Vertices are in reading order from diagram above ie x varies fastest.
*
* 3 1 0
* / \
* 4/ 5\
+ *
+ * vertex number: 0000 | y | x
+ * YBITS XBITS
*/
#ifndef MGRAPH_H
#include "common.h"
+#ifndef DEFBITS
#define XBITS 3
-#define X (1<<XBITS)
#define YBITS 3
-#define Y ((1<<YBITS) - 1)
+#else
+#define XBITS (DEFBITS / 10)
+#define YBITS (DEFBITS % 10)
+#endif
-/* vertex number: 0000 | y | x
- * YBITS XBITS
- */
+#define X (1<<XBITS)
+#define Y ((1<<YBITS) - 1)
#define N (X*Y)
#define XMASK (X-1)
#define Y1 (1 << YSHIFT)
#define YMASK (Y << YSHIFT)
-#define DIM (N*D3)
-
#define V6 6
#define FOR_VERTEX(v) \
#define FOR_VPEDGE(v,e) \
for ((e)=0; (e)<V6; (e)++)
-extern int edge_end2(unsigned v1, int e);
+int edge_end2(unsigned v1, int e);
#define EDGE_END2 edge_end2
+/* given v1,e s.t. v2==EDGE_END2(v1,e) >= 0,
+ * returns eprime s.t. v1==EDGE_END2(v2,eprime) */
+int edge_reverse(int v1, int e);
+
#define RIM_VERTEX_P(v) (((v) & YMASK) == 0 || ((v) & YMASK) == (Y-1)*Y1)
#define FOR_VEDGE_X(v1,e,v2,init,otherwise) \
for ((vx)=0; (v)= (vy)<<YSHIFT | (vx), (vx)<X; (vx)++)
typedef double Vertices[N][D3];
+struct Vertices { Vertices a; };
#endif /*MGRAPH_H*/