Example #1
0
func ExampleReadWriteSGFFile() {
	err := sgf.SetupSGFProperties(defaultSpecFile, false, false)
	if err == 0 {
		fmt.Println("Reading SGF Tests, SGFDir =", SGFDir, ", outDir =", OutDir)
		dirFiles, err := ioutil.ReadDir(SGFDir)
		if err != nil && err != io.EOF {
			fmt.Println("Can't read test directory:", SGFDir)
			return
		}
		// Check the output directory. If missing, create it.
		_, errS := os.Stat(OutDir)
		if errS != nil {
			err2 := os.MkdirAll(OutDir, os.ModeDir|os.ModePerm)
			if err2 != nil {
				fmt.Println("ExampleReadWriteSGFFile Error:", err2, "trying to create test output directory:", OutDir)
				fmt.Println("Original Error:", err, "trying os.Stat")
				return
			}
		}

		count := 0
		for _, f := range dirFiles {
			if strings.Index(f.Name(), ".sgf") >= 0 {
				count += 1
				fmt.Println("Processing:", f.Name())
				if count > testStringsVerified {
					ah.SetAHTrace(true)
					fmt.Println("Tracing", f.Name())
				}
				fileName := SGFDir + "/" + f.Name()
				b, err := ioutil.ReadFile(fileName)
				if err != nil && err != io.EOF {
					fmt.Println("Error reading file:", fileName, err)
					return
				}
				// prsr , errL := sgf.ParseFile(fileName, b, sgf.ParseComments, 0)
				prsr, errL := sgf.ParseFile(fileName, b, sgf.ParseComments+sgf.ParserPlay, 0)
				if len(errL) != 0 {
					fmt.Println("Error while parsing:", fileName, ", ", errL.Error())
					return
				}
				outFileName := OutDir + "/" + f.Name()
				err = prsr.GameTree.WriteFile(outFileName, sgf.DefaultNumPerLine)
				if err != nil {
					fmt.Printf("Error writing: %s, %s\n", outFileName, err)
				}
				if count > outputVerified {
					prsr.PrintAbstHier(fileName, true)
				}
			}
		}
	}
	// Output:
	// Reading SGF Tests, SGFDir = ./testdata , outDir = ./testout
	// Processing: 0.sgf
	// Processing: 0A.sgf
	// Processing: 0B.sgf
	// Processing: 0C.sgf
	// Processing: 0D.sgf
	// Processing: 0E.sgf
	// Processing: 0F.sgf
	// Processing: 0G.sgf
	// Processing: 0H.sgf
	// Processing: 0K.sgf
	// Processing: 0L.sgf
	// Processing: 0M.sgf
	// Processing: 1.sgf
	// Processing: 10.sgf
	// ./testdata/10.sgf:1:33: Unknown SGF property: WHAT:bb
	// Processing: 1000.sgf
	// Processing: 1001.sgf
	// Processing: 1002.sgf
	// Processing: 1003.sgf
	// Processing: 1004.sgf
	// Processing: 1005.sgf
	// Processing: 1006.sgf
	// Processing: 1007.sgf
	// Processing: 1008.sgf
	// Processing: 1009.sgf
	// Processing: 1010.sgf
	// Processing: 1011.sgf
	// Processing: 1012.sgf
	// Processing: 1013.sgf
	// Processing: 1014.sgf
	// Processing: 1015.sgf
	// Processing: 1016.sgf
	// Processing: 1017.sgf
	// Processing: 1018.sgf
	// Processing: 1019.sgf
	// Processing: 1020.sgf
	// Processing: 1021.sgf
	// Processing: 1022.sgf
	// Processing: 1023.sgf
	// Processing: 1024.sgf
	// Processing: 1025.sgf
	// Processing: 2.sgf
	// Processing: 3.sgf
	// Processing: 4.sgf
	// Processing: 5.sgf
	// Processing: 6.sgf
	// Processing: Lyonweiqi-ken1jf-2.sgf
	// Processing: Lyonweiqi-ken1jf-Apr_26.sgf
	// Processing: Lyonweiqi-ken1jf_4.sgf
	// Processing: Lyonweiqi-ken1jf_May_30.sgf
	// Processing: Lyonweiqi-ken1jf_May_7_2008.sgf
	// Processing: Lyonweiqi-ken1jf_May_9_2008.sgf
	// Processing: Lyonweiqi-scottSsgf.sgf
	// Processing: Lyonweiqi.sgf
	// Processing: print1.sgf
	// Processing: print2.sgf
	// Abstraction Hierarchy: ./testdata/print2.sgf
	// Level 1
	// Black nodes
	// 57:1,1 1-mem:(Q,16):1:1,adj:270(1),269(1),164(1),252(1),
	// 66:1,1 4-mem:(S,4):1:1,(P,4),(Q,4),(R,4),adj:19(1),12(3),285(1),281(1),272(1),105(1),205(2),
	// 67:1,1 1-mem:(F,3):1:1,adj:56(1),6(1),180(1),177(1),
	// 71:1,1 1-mem:(Q,6):1:1,adj:59(1),286(1),204(1),205(1),
	// 82:1,1 2-mem:(J,3):1:1,(J,4),adj:79(1),74(1),73(1),16(1),275(1),92(1),
	// 88:1,1 1-mem:(L,1):1:1,adj:276(1),91(1),185(1),
	// 93:1,1 2-mem:(O,3):1:1,(N,3),adj:19(1),12(1),83(1),279(1),278(1),183(1),
	// 111:1,1 1-mem:(M,17):1:1,adj:265(1),267(1),258(1),266(1),
	// 186:1,1 1-mem:(K,2):1:1,adj:92(1),185(1),276(1),275(1),
	// 201:1,1 1-mem:(Q,10):1:1,adj:20(1),43(1),35(1),203(1),
	// 280:1,1 1-mem:(M,2):1:1,adj:279(1),276(1),83(1),91(1),
	// Total 11 nodes, with 16 members
	// White nodes
	// 12:2,2 3-mem:(P,3):2:2,(Q,3),(R,3),adj:273(1),272(1),190(1),93(1),66(3),85(1),
	// 19:2,2 1-mem:(O,4):2:2,adj:283(1),66(1),278(1),93(1),
	// 25:2,2 1-mem:(C,14):2:2,adj:9(1),166(1),47(1),78(1),
	// 55:2,2 1-mem:(K,16):2:2,adj:37(1),54(1),261(1),168(1),
	// 83:2,2 1-mem:(M,3):2:2,adj:18(1),86(1),280(1),93(1),
	// 98:2,2 1-mem:(D,17):2:2,adj:53(1),62(1),58(1),146(1),
	// 181:2,2 1-mem:(D,4):2:2,adj:44(1),271(1),196(1),195(1),
	// 193:2,2 1-mem:(D,6):2:2,adj:132(1),192(1),209(1),196(1),
	// 205:2,2 2-mem:(Q,5):2:2,(P,5),adj:71(1),204(1),66(2),285(1),283(1),
	// 274:2,2 2-mem:(L,5):2:2,(L,4),adj:86(1),18(1),81(1),17(1),23(1),79(1),
	// 275:2,2 1-mem:(K,3):2:2,adj:86(1),79(1),82(1),186(1),
	// 276:2,2 1-mem:(L,2):2:2,adj:86(1),186(1),88(1),280(1),
	// Total 12 nodes, with 16 members
	// Unocc nodes
	// 0:202,3 1-mem:(T,19):202:202,adj:65(1),8(1),
	// 1:778,3 1-mem:(A,1):778:778,adj:69(1),2(1),
	// 2:906,3 8-mem:(J,1):906:906,(H,1),(G,1),(F,1),(E,1),(D,1),(C,1),(B,1),adj:1(1),185(1),99(1),5(1),133(1),100(1),92(2),6(2),
	// 3:394,3 1-mem:(T,1):394:394,adj:188(1),31(1),
	// 4:842,3 7-mem:(A,18):842:842,(A,17),(A,16),(A,15),(A,14),(A,13),(A,12),adj:110(1),64(1),61(1),9(6),
	// 5:3018,3 1-mem:(B,2):3018:3018,adj:2(1),100(1),102(1),69(1),
	// 6:4042,3 2-mem:(E,2):4042:4042,(F,2),adj:2(2),177(1),99(1),133(1),67(1),
	// 7:12234,3 1-mem:(K,6):12234:12234,adj:17(1),154(1),33(1),23(1),
	// 8:458,3 12-mem:(T,18):458:458,(T,17),(T,16),(T,15),(T,14),(T,13),(T,12),(T,11),(T,10),(T,9),(T,8),(T,7),adj:0(1),247(1),84(1),34(1),13(10),
	// 9:4042,3 6-mem:(B,17):4042:4042,(B,16),(B,15),(B,14),(B,13),(B,12),adj:4(6),225(1),166(1),151(1),145(1),25(1),78(1),61(1),58(1),
	// 10:24786,3 1-mem:(D,13):24786:24786,adj:141(1),224(1),47(1),78(1),
	// 11:5259,3 1-mem:(T,3):5259:5259,adj:272(1),105(1),188(1),
	// 13:4042,3 10-mem:(S,17):4042:4042,(S,16),(S,15),(S,14),(S,13),(S,12),(S,11),(S,10),(S,9),(S,8),adj:8(10),277(1),270(1),247(1),115(1),84(1),20(7),
	// 14:17163,3 1-mem:(N,9):17163:17163,adj:241(1),107(1),199(1),126(1),
	// 15:18509,3 1-mem:(B,10):18509:18509,adj:178(1),120(1),151(1),118(1),
	// 16:8138,3 1-mem:(H,4):8138:8138,adj:114(1),94(1),82(1),73(1),
	// 17:10900,3 1-mem:(L,6):10900:10900,adj:7(1),274(1),113(1),28(1),
	// 18:6867,3 1-mem:(M,4):6867:6867,adj:278(1),81(1),274(1),83(1),
	// 20:6090,3 7-mem:(R,15):6090:6090,(R,14),(R,13),(R,12),(R,11),(R,10),(R,9),adj:13(7),277(1),270(1),164(1),201(1),35(1),43(4),
	// 21:14540,3 1-mem:(D,8):14540:14540,adj:125(1),96(1),209(1),135(1),
	// 22:16403,3 1-mem:(A,9):16403:16403,adj:120(1),150(1),118(1),
	// 23:8781,3 1-mem:(K,5):8781:8781,adj:7(1),274(1),74(1),79(1),
	// 24:27101,3 1-mem:(H,14):27101:27101,adj:52(1),158(1),49(1),106(1),
	// 26:10186,3 1-mem:(E,14):10186:10186,adj:141(1),159(1),47(1),50(1),
	// 27:6090,3 1-mem:(P,17):6090:6090,adj:252(1),60(1),264(1),269(1),
	// 28:12234,3 2-mem:(N,6):12234:12234,(M,6),adj:17(1),284(1),29(1),240(1),128(1),81(1),
	// 29:11210,3 1-mem:(O,6):11210:11210,adj:28(1),283(1),204(1),243(1),
	// 30:10186,3 1-mem:(P,13):10186:10186,adj:162(1),242(1),160(1),43(1),
	// 31:1104,3 1-mem:(S,1):1104:1104,adj:3(1),189(1),89(1),
	// 32:13258,3 1-mem:(G,7):13258:13258,adj:36(1),220(1),130(1),39(1),
	// 33:10770,3 1-mem:(J,6):10770:10770,adj:7(1),97(1),42(1),74(1),
	// 34:11408,3 1-mem:(T,6):11408:11408,adj:8(1),282(1),139(1),
	// 35:17362,3 1-mem:(Q,9):17362:17362,adj:20(1),202(1),201(1),200(1),
	// 36:14282,3 4-mem:(G,11):14282:14282,(G,8),(G,9),(G,10),adj:32(1),236(1),237(1),238(1),222(1),149(1),227(1),148(1),234(1),147(1),
	// 37:29259,3 1-mem:(K,15):29259:29259,adj:87(1),55(1),51(1),48(1),
	// 38:14282,3 1-mem:(N,12):14282:14282,adj:46(1),219(1),161(1),155(1),
	// 39:10638,3 1-mem:(G,6):10638:10638,adj:32(1),208(1),42(1),121(1),
	// 40:1994,3 1-mem:(K,10):1994:1994,adj:231(1),134(1),228(1),232(1),
	// 41:15179,3 1-mem:(O,8):15179:15179,adj:243(1),206(1),107(1),241(1),
	// 42:10699,3 1-mem:(H,6):10699:10699,adj:33(1),39(1),220(1),114(1),
	// 43:8138,3 4-mem:(Q,14):8138:8138,(Q,13),(Q,12),(Q,11),adj:20(4),30(1),162(1),164(1),201(1),170(1),160(1),
	// 44:6290,3 1-mem:(C,4):6290:6290,adj:75(1),194(1),181(1),102(1),
	// 45:16666,3 1-mem:(E,9):16666:16666,adj:96(1),137(1),135(1),148(1),
	// 46:13258,3 1-mem:(N,13):13258:13258,adj:38(1),163(1),242(1),216(1),
	// 47:26830,3 1-mem:(D,14):26830:26830,adj:26(1),25(1),10(1),70(1),
	// 48:27230,3 1-mem:(K,14):27230:27230,adj:37(1),138(1),63(1),158(1),
	// 49:29132,3 1-mem:(H,15):29132:29132,adj:24(1),144(1),51(1),54(1),
	// 50:9162,3 1-mem:(E,15):9162:9162,adj:26(1),142(1),70(1),123(1),
	// 51:29204,3 1-mem:(J,15):29204:29204,adj:49(1),37(1),158(1),54(1),
	// 52:12234,3 1-mem:(G,14):12234:12234,adj:24(1),144(1),159(1),143(1),
	// 53:33043,3 1-mem:(E,17):33043:33043,adj:253(1),123(1),98(1),62(1),
	// 54:8138,3 2-mem:(J,16):8138:8138,(H,16),adj:49(1),51(1),117(1),248(1),131(1),55(1),
	// 56:4492,3 1-mem:(G,3):4492:4492,adj:73(1),94(1),67(1),133(1),
	// 58:5066,3 1-mem:(C,17):5066:5066,adj:9(1),145(1),98(1),62(1),
	// 59:13264,3 1-mem:(Q,7):13264:13264,adj:80(1),202(1),207(1),71(1),
	// 60:35723,3 1-mem:(P,18):35723:35723,adj:27(1),251(1),174(1),260(1),
	// 61:3018,3 1-mem:(B,18):3018:3018,adj:4(1),9(1),116(1),62(1),
	// 62:4042,3 3-mem:(E,18):4042:4042,(D,18),(C,18),adj:53(1),61(1),58(1),175(1),98(1),116(3),
	// 63:27280,3 1-mem:(L,14):27280:27280,adj:48(1),218(1),217(1),87(1),
	// 64:586,3 1-mem:(A,19):586:586,adj:4(1),116(1),
	// 65:37968,3 1-mem:(S,19):37968:37968,adj:0(1),247(1),101(1),
	// 68:37328,3 1-mem:(H,19):37328:37328,adj:76(1),77(1),176(1),
	// 69:842,3 3-mem:(A,2):842:842,(A,3),(A,4),adj:5(1),1(1),72(1),102(2),
	// 70:8138,3 1-mem:(D,15):8138:8138,adj:50(1),47(1),146(1),166(1),
	// 72:8208,3 1-mem:(A,5):8208:8208,adj:69(1),182(1),90(1),
	// 73:6090,3 1-mem:(H,3):6090:6090,adj:56(1),16(1),92(1),82(1),
	// 74:8721,3 1-mem:(J,5):8721:8721,adj:23(1),33(1),114(1),82(1),
	// 75:5066,3 1-mem:(C,3):5066:5066,adj:44(1),271(1),102(1),100(1),
	// 76:35275,3 1-mem:(H,18):35275:35275,adj:68(1),257(1),254(1),248(1),
	// 77:37387,3 1-mem:(J,19):37387:37387,adj:68(1),257(1),255(1),
	// 78:24723,3 1-mem:(C,13):24723:24723,adj:10(1),25(1),9(1),225(1),
	// 79:6748,3 1-mem:(K,4):6748:6748,adj:23(1),275(1),274(1),82(1),
	// 80:13323,3 1-mem:(R,7):13323:13323,adj:59(1),286(1),84(1),277(1),
	// 81:10186,3 1-mem:(M,5):10186:10186,adj:18(1),28(1),284(1),274(1),
	// 84:13392,3 1-mem:(S,7):13392:13392,adj:80(1),8(1),13(1),282(1),
	// 85:4042,3 1-mem:(Q,2):4042:4042,adj:12(1),273(1),190(1),191(1),
	// 86:4756,3 1-mem:(L,3):4756:4756,adj:83(1),276(1),274(1),275(1),
	// 87:29332,3 1-mem:(L,15):29332:29332,adj:63(1),37(1),169(1),168(1),
	// 89:1038,3 1-mem:(R,1):1038:1038,adj:31(1),190(1),191(1),
	// 90:10251,3 1-mem:(A,6):10251:10251,adj:72(1),245(1),152(1),
	// 91:716,3 1-mem:(M,1):716:716,adj:88(1),280(1),187(1),
	// 92:4042,3 2-mem:(H,2):4042:4042,(J,2),adj:73(1),82(1),2(2),133(1),186(1),
	// 94:6541,3 1-mem:(G,4):6541:6541,adj:56(1),16(1),180(1),121(1),
	// 95:18638,3 1-mem:(D,10):18638:18638,adj:178(1),137(1),226(1),135(1),
	// 96:10186,3 1-mem:(E,8):10186:10186,adj:45(1),21(1),149(1),210(1),
	// 97:12814,3 1-mem:(J,7):12814:12814,adj:33(1),221(1),220(1),154(1),
	// 99:2251,3 1-mem:(D,2):2251:2251,adj:6(1),2(1),271(1),100(1),
	// 100:4042,3 1-mem:(C,2):4042:4042,adj:75(1),99(1),5(1),2(1),
	// 101:714,3 1-mem:(R,19):714:714,adj:65(1),250(1),173(1),
	// 102:4042,3 2-mem:(B,3):4042:4042,(B,4),adj:75(1),5(1),44(1),69(2),182(1),
	// 103:14412,3 1-mem:(B,8):14412:14412,adj:125(1),120(1),150(1),244(1),
	// 104:29579,3 1-mem:(P,15):29579:29579,adj:269(1),164(1),165(1),162(1),
	// 105:7312,3 1-mem:(T,4):7312:7312,adj:11(1),66(1),139(1),
	// 106:25043,3 1-mem:(H,13):25043:25043,adj:24(1),235(1),215(1),143(1),
	// 107:17232,3 1-mem:(O,9):17232:17232,adj:41(1),14(1),200(1),157(1),
	// 108:8138,3 1-mem:(F,16):8138:8138,adj:253(1),142(1),123(1),131(1),
	// 109:27476,3 1-mem:(O,14):27476:27476,adj:165(1),162(1),163(1),242(1),
	// 110:20493,3 1-mem:(A,11):20493:20493,adj:4(1),151(1),118(1),
	// 112:16526,3 1-mem:(C,9):16526:16526,adj:125(1),178(1),135(1),120(1),
	// 113:12940,3 1-mem:(L,7):12940:12940,adj:17(1),154(1),128(1),129(1),
	// 114:8652,3 1-mem:(H,5):8652:8652,adj:42(1),74(1),16(1),121(1),
	// 115:33818,3 1-mem:(R,17):33818:33818,adj:13(1),270(1),250(1),252(1),
	// 116:714,3 4-mem:(B,19):714:714,(C,19),(D,19),(E,19),adj:64(1),61(1),62(3),167(1),
	// 117:33293,3 1-mem:(J,17):33293:33293,adj:54(1),261(1),257(1),248(1),
	// 118:842,3 1-mem:(A,10):842:842,adj:15(1),110(1),22(1),
	// 119:714,3 2-mem:(L,19):714:714,(M,19),adj:258(1),255(1),136(1),171(1),
	// 120:16462,3 1-mem:(B,9):16462:16462,adj:103(1),112(1),15(1),22(1),
	// 121:8604,3 1-mem:(G,5):8604:8604,adj:39(1),114(1),94(1),197(1),
	// 122:970,3 1-mem:(L,12):970:970,adj:219(1),218(1),214(1),233(1),
	// 123:30988,3 1-mem:(E,16):30988:30988,adj:108(1),53(1),50(1),146(1),
	// 124:22796,3 1-mem:(E,12):22796:22796,adj:229(1),213(1),141(1),224(1),
	// 125:6090,3 1-mem:(C,8):6090:6090,adj:21(1),112(1),103(1),246(1),
	// 126:17100,3 1-mem:(M,9):17100:17100,adj:14(1),230(1),239(1),127(1),
	// 127:15053,3 1-mem:(M,8):15053:15053,adj:126(1),241(1),129(1),128(1),
	// 128:13004,3 1-mem:(M,7):13004:13004,adj:127(1),113(1),28(1),240(1),
	// 129:14988,3 1-mem:(L,8):14988:14988,adj:127(1),113(1),239(1),153(1),
	// 130:12234,3 1-mem:(F,7):12234:12234,adj:32(1),149(1),210(1),208(1),
	// 131:31118,3 1-mem:(G,16):31118:31118,adj:54(1),108(1),249(1),144(1),
	// 132:10507,3 1-mem:(E,6):10507:10507,adj:208(1),210(1),193(1),198(1),
	// 133:2446,3 1-mem:(G,2):2446:2446,adj:92(1),56(1),6(1),2(1),
	// 134:970,3 2-mem:(J,11):970:970,(K,11),adj:40(1),212(1),236(1),228(1),214(1),233(1),
	// 135:16592,3 1-mem:(D,9):16592:16592,adj:112(1),95(1),45(1),21(1),
	// 136:35474,3 1-mem:(L,18):35474:35474,adj:119(1),258(1),266(1),256(1),
	// 137:10186,3 1-mem:(E,10):10186:10186,adj:95(1),45(1),147(1),229(1),
	// 138:25168,3 1-mem:(K,13):25168:25168,adj:48(1),214(1),218(1),215(1),
	// 139:9356,3 1-mem:(T,5):9356:9356,adj:105(1),34(1),281(1),
	// 140:24922,3 1-mem:(F,13):24922:24922,adj:213(1),141(1),159(1),143(1),
	// 141:24843,3 1-mem:(E,13):24843:24843,adj:124(1),140(1),26(1),10(1),
	// 142:10186,3 1-mem:(F,15):10186:10186,adj:108(1),50(1),144(1),159(1),
	// 143:24974,3 1-mem:(G,13):24974:24974,adj:52(1),106(1),140(1),237(1),
	// 144:29070,3 1-mem:(G,15):29070:29070,adj:142(1),52(1),49(1),131(1),
	// 145:30862,3 1-mem:(C,16):30862:30862,adj:58(1),9(1),166(1),146(1),
	// 146:30926,3 1-mem:(D,16):30926:30926,adj:70(1),123(1),98(1),145(1),
	// 147:18771,3 1-mem:(F,10):18771:18771,adj:137(1),36(1),238(1),148(1),
	// 148:16716,3 1-mem:(F,9):16716:16716,adj:36(1),147(1),45(1),149(1),
	// 149:14675,3 1-mem:(F,8):14675:14675,adj:96(1),36(1),130(1),148(1),
	// 150:14350,3 1-mem:(A,8):14350:14350,adj:103(1),22(1),152(1),
	// 151:20558,3 1-mem:(B,11):20558:20558,adj:15(1),9(1),110(1),179(1),
	// 152:12302,3 1-mem:(A,7):12302:12302,adj:90(1),150(1),244(1),
	// 153:14930,3 1-mem:(K,8):14930:14930,adj:129(1),232(1),221(1),154(1),
	// 154:12878,3 1-mem:(K,7):12878:12878,adj:97(1),7(1),113(1),153(1),
	// 155:21267,3 1-mem:(N,11):21267:21267,adj:38(1),211(1),199(1),156(1),
	// 156:12234,3 1-mem:(O,11):12234:12234,adj:155(1),170(1),161(1),157(1),
	// 157:19293,3 1-mem:(O,10):19293:19293,adj:107(1),156(1),203(1),199(1),
	// 158:27147,3 1-mem:(J,14):27147:27147,adj:48(1),51(1),24(1),215(1),
	// 159:26958,3 1-mem:(F,14):26958:26958,adj:142(1),52(1),26(1),140(1),
	// 160:23438,3 1-mem:(P,12):23438:23438,adj:43(1),30(1),170(1),161(1),
	// 161:23374,3 1-mem:(O,12):23374:23374,adj:156(1),160(1),38(1),242(1),
	// 162:27532,3 1-mem:(P,14):27532:27532,adj:104(1),43(1),109(1),30(1),
	// 163:27404,3 1-mem:(N,14):27404:27404,adj:109(1),46(1),262(1),217(1),
	// 164:29648,3 1-mem:(Q,15):29648:29648,adj:104(1),20(1),57(1),43(1),
	// 165:29516,3 1-mem:(O,15):29516:29516,adj:104(1),109(1),263(1),262(1),
	// 166:28814,3 1-mem:(C,15):28814:28814,adj:70(1),145(1),9(1),25(1),
	// 167:37198,3 1-mem:(F,19):37198:37198,adj:116(1),176(1),175(1),
	// 168:31379,3 1-mem:(L,16):31379:31379,adj:55(1),87(1),267(1),266(1),
	// 169:10186,3 1-mem:(M,15):10186:10186,adj:87(1),262(1),267(1),217(1),
	// 170:21390,3 1-mem:(P,11):21390:21390,adj:156(1),43(1),160(1),203(1),
	// 171:37648,3 1-mem:(N,19):37648:37648,adj:119(1),259(1),172(1),
	// 172:37707,3 1-mem:(O,19):37707:37707,adj:171(1),260(1),174(1),
	// 173:37838,3 1-mem:(Q,19):37838:37838,adj:101(1),251(1),174(1),
	// 174:37774,3 1-mem:(P,19):37774:37774,adj:60(1),172(1),173(1),
	// 175:35150,3 1-mem:(F,18):35150:35150,adj:167(1),62(1),254(1),253(1),
	// 176:37260,3 1-mem:(G,19):37260:37260,adj:68(1),167(1),254(1),
	// 177:4371,3 1-mem:(E,3):4371:4371,adj:6(1),67(1),271(1),195(1),
	// 178:6090,3 1-mem:(C,10):6090:6090,adj:95(1),15(1),112(1),179(1),
	// 179:20627,3 1-mem:(C,11):20627:20627,adj:178(1),151(1),225(1),226(1),
	// 180:6483,3 1-mem:(F,4):6483:6483,adj:94(1),67(1),197(1),195(1),
	// 182:8270,3 1-mem:(B,5):8270:8270,adj:72(1),102(1),245(1),194(1),
	// 183:2894,3 1-mem:(O,2):2894:2894,adj:93(1),279(1),273(1),184(1),
	// 184:844,3 1-mem:(O,1):844:844,adj:183(1),187(1),191(1),
	// 185:592,3 1-mem:(K,1):592:592,adj:88(1),2(1),186(1),
	// 187:781,3 1-mem:(N,1):781:781,adj:91(1),184(1),279(1),
	// 188:3216,3 1-mem:(T,2):3216:3216,adj:11(1),3(1),189(1),
	// 189:3018,3 1-mem:(S,2):3018:3018,adj:188(1),31(1),272(1),190(1),
	// 190:3086,3 1-mem:(R,2):3086:3086,adj:189(1),12(1),85(1),89(1),
	// 191:906,3 2-mem:(Q,1):906:906,(P,1),adj:89(1),85(1),184(1),273(1),
	// 192:10395,3 1-mem:(C,6):10395:10395,adj:245(1),246(1),194(1),193(1),
	// 194:8332,3 1-mem:(C,5):8332:8332,adj:192(1),182(1),44(1),196(1),
	// 195:6414,3 1-mem:(E,4):6414:6414,adj:180(1),181(1),177(1),198(1),
	// 196:8403,3 1-mem:(D,5):8403:8403,adj:193(1),194(1),181(1),198(1),
	// 197:8526,3 1-mem:(F,5):8526:8526,adj:121(1),180(1),208(1),198(1),
	// 198:8460,3 1-mem:(E,5):8460:8460,adj:132(1),197(1),196(1),195(1),
	// 199:19211,3 1-mem:(N,10):19211:19211,adj:14(1),157(1),155(1),230(1),
	// 200:17298,3 1-mem:(P,9):17298:17298,adj:107(1),35(1),206(1),203(1),
	// 202:15314,3 1-mem:(Q,8):15314:15314,adj:59(1),35(1),277(1),206(1),
	// 203:19340,3 1-mem:(P,10):19340:19340,adj:201(1),170(1),157(1),200(1),
	// 204:11155,3 1-mem:(P,6):11155:11155,adj:29(1),71(1),207(1),205(1),
	// 206:15248,3 1-mem:(P,8):15248:15248,adj:41(1),202(1),200(1),207(1),
	// 207:13195,3 1-mem:(P,7):13195:13195,adj:59(1),206(1),204(1),243(1),
	// 208:10574,3 1-mem:(F,6):10574:10574,adj:130(1),132(1),39(1),197(1),
	// 209:12499,3 1-mem:(D,7):12499:12499,adj:21(1),193(1),246(1),210(1),
	// 210:12562,3 1-mem:(E,7):12562:12562,adj:96(1),130(1),132(1),209(1),
	// 211:21203,3 1-mem:(M,11):21203:21203,adj:155(1),233(1),219(1),230(1),
	// 212:23066,3 1-mem:(J,12):23066:23066,adj:134(1),235(1),214(1),215(1),
	// 213:22859,3 1-mem:(F,12):22859:22859,adj:124(1),140(1),237(1),238(1),
	// 214:23115,3 1-mem:(K,12):23115:23115,adj:122(1),138(1),212(1),134(1),
	// 215:25099,3 1-mem:(J,13):25099:25099,adj:138(1),158(1),106(1),212(1),
	// 216:25296,3 1-mem:(M,13):25296:25296,adj:46(1),218(1),217(1),219(1),
	// 217:27341,3 1-mem:(M,14):27341:27341,adj:169(1),163(1),216(1),63(1),
	// 218:25227,3 1-mem:(L,13):25227:25227,adj:122(1),216(1),63(1),138(1),
	// 219:23245,3 1-mem:(M,12):23245:23245,adj:122(1),216(1),38(1),211(1),
	// 220:12747,3 1-mem:(H,7):12747:12747,adj:97(1),32(1),42(1),222(1),
	// 221:14862,3 1-mem:(J,8):14862:14862,adj:153(1),97(1),223(1),222(1),
	// 222:14795,3 1-mem:(H,8):14795:14795,adj:36(1),221(1),220(1),227(1),
	// 223:16915,3 1-mem:(J,9):16915:16915,adj:221(1),232(1),228(1),227(1),
	// 224:22740,3 1-mem:(D,12):22740:22740,adj:124(1),10(1),225(1),226(1),
	// 225:6090,3 1-mem:(C,12):6090:6090,adj:224(1),78(1),9(1),179(1),
	// 226:8138,3 1-mem:(D,11):8138:8138,adj:224(1),179(1),95(1),229(1),
	// 227:16846,3 1-mem:(H,9):16846:16846,adj:36(1),223(1),222(1),234(1),
	// 228:18962,3 1-mem:(J,10):18962:18962,adj:134(1),40(1),223(1),234(1),
	// 229:20750,3 1-mem:(E,11):20750:20750,adj:137(1),226(1),124(1),238(1),
	// 230:19150,3 1-mem:(M,10):19150:19150,adj:126(1),199(1),211(1),231(1),
	// 231:19091,3 1-mem:(L,10):19091:19091,adj:40(1),230(1),239(1),233(1),
	// 232:16974,3 1-mem:(K,9):16974:16974,adj:40(1),223(1),153(1),239(1),
	// 233:21131,3 1-mem:(L,11):21131:21131,adj:122(1),211(1),134(1),231(1),
	// 234:18891,3 1-mem:(H,10):18891:18891,adj:228(1),36(1),227(1),236(1),
	// 235:22990,3 1-mem:(H,12):22990:22990,adj:212(1),106(1),237(1),236(1),
	// 236:20942,3 1-mem:(H,11):20942:20942,adj:36(1),134(1),235(1),234(1),
	// 237:22926,3 1-mem:(G,12):22926:22926,adj:36(1),213(1),235(1),143(1),
	// 238:20818,3 1-mem:(F,11):20818:20818,adj:36(1),229(1),213(1),147(1),
	// 239:17035,3 1-mem:(L,9):17035:17035,adj:126(1),231(1),232(1),129(1),
	// 240:13069,3 1-mem:(N,7):13069:13069,adj:128(1),28(1),243(1),241(1),
	// 241:15116,3 1-mem:(N,8):15116:15116,adj:41(1),14(1),127(1),240(1),
	// 242:25420,3 1-mem:(O,13):25420:25420,adj:109(1),46(1),30(1),161(1),
	// 243:13134,3 1-mem:(O,7):13134:13134,adj:29(1),207(1),41(1),240(1),
	// 244:12371,3 1-mem:(B,7):12371:12371,adj:103(1),152(1),245(1),246(1),
	// 245:4042,3 1-mem:(B,6):4042:4042,adj:192(1),244(1),90(1),182(1),
	// 246:12428,3 1-mem:(C,7):12428:12428,adj:125(1),209(1),244(1),192(1),
	// 247:35918,3 1-mem:(S,18):35918:35918,adj:13(1),8(1),65(1),250(1),
	// 248:33235,3 1-mem:(H,17):33235:33235,adj:76(1),117(1),54(1),249(1),
	// 249:6090,3 1-mem:(G,17):6090:6090,adj:248(1),131(1),254(1),253(1),
	// 250:4042,3 1-mem:(R,18):4042:4042,adj:247(1),101(1),115(1),251(1),
	// 251:35790,3 1-mem:(Q,18):35790:35790,adj:60(1),250(1),173(1),252(1),
	// 252:33742,3 1-mem:(Q,17):33742:33742,adj:27(1),115(1),251(1),57(1),
	// 253:33099,3 1-mem:(F,17):33099:33099,adj:249(1),175(1),53(1),108(1),
	// 254:35214,3 1-mem:(G,18):35214:35214,adj:76(1),249(1),176(1),175(1),
	// 255:37458,3 1-mem:(K,19):37458:37458,adj:77(1),119(1),256(1),
	// 256:35403,3 1-mem:(K,18):35403:35403,adj:136(1),255(1),261(1),257(1),
	// 257:35340,3 1-mem:(J,18):35340:35340,adj:256(1),77(1),76(1),117(1),
	// 258:35534,3 1-mem:(M,18):35534:35534,adj:119(1),136(1),111(1),259(1),
	// 259:35595,3 1-mem:(N,18):35595:35595,adj:171(1),258(1),265(1),260(1),
	// 260:35662,3 1-mem:(O,18):35662:35662,adj:60(1),259(1),172(1),264(1),
	// 261:33358,3 1-mem:(K,17):33358:33358,adj:256(1),117(1),55(1),266(1),
	// 262:29459,3 1-mem:(N,15):29459:29459,adj:169(1),165(1),163(1),268(1),
	// 263:31571,3 1-mem:(O,16):31571:31571,adj:165(1),268(1),269(1),264(1),
	// 264:33619,3 1-mem:(O,17):33619:33619,adj:27(1),263(1),260(1),265(1),
	// 265:33548,3 1-mem:(N,17):33548:33548,adj:264(1),259(1),111(1),268(1),
	// 266:33420,3 1-mem:(L,17):33420:33420,adj:111(1),136(1),261(1),168(1),
	// 267:31442,3 1-mem:(M,16):31442:31442,adj:169(1),111(1),168(1),268(1),
	// 268:8138,3 1-mem:(N,16):8138:8138,adj:263(1),265(1),267(1),262(1),
	// 269:31630,3 1-mem:(P,16):31630:31630,adj:27(1),57(1),263(1),104(1),
	// 270:31756,3 1-mem:(R,16):31756:31756,adj:13(1),115(1),57(1),20(1),
	// 271:4302,3 1-mem:(D,3):4302:4302,adj:75(1),177(1),181(1),99(1),
	// 272:5202,3 1-mem:(S,3):5202:5202,adj:189(1),11(1),66(1),12(1),
	// 273:2955,3 1-mem:(P,2):2955:2955,adj:183(1),85(1),12(1),191(1),
	// 277:15372,3 1-mem:(R,8):15372:15372,adj:80(1),13(1),20(1),202(1),
	// 278:6924,3 1-mem:(N,4):6924:6924,adj:19(1),18(1),93(1),284(1),
	// 279:2832,3 1-mem:(N,2):2832:2832,adj:183(1),93(1),187(1),280(1),
	// 281:9298,3 1-mem:(S,5):9298:9298,adj:139(1),66(1),285(1),282(1),
	// 282:4042,3 1-mem:(S,6):4042:4042,adj:34(1),84(1),281(1),286(1),
	// 283:9037,3 1-mem:(O,5):9037:9037,adj:205(1),29(1),19(1),284(1),
	// 284:8976,3 1-mem:(N,5):8976:8976,adj:283(1),278(1),28(1),81(1),
	// 285:9234,3 1-mem:(R,5):9234:9234,adj:281(1),205(1),66(1),286(1),
	// 286:11276,3 1-mem:(R,6):11276:11276,adj:282(1),80(1),71(1),285(1),
	// Total 264 nodes, with 329 members
	// Move[0]: Loc: R4, Type: Black, Num: 1,
	// Move[1]: Loc: D4, Type: White, Num: 2,
	// Move[2]: Loc: F3, Type: Black, Num: 3,
	// Move[3]: Loc: D6, Type: White, Num: 4,
	// Move[4]: Loc: Q16, Type: Black, Num: 5,
	// Move[5]: Loc: D17, Type: White, Num: 6,
	// Move[6]: Loc: L3, Type: Black, Num: 7, CapdBy: 23
	// Move[7]: Loc: C14, Type: White, Num: 8,
	// Move[8]: Loc: Q10, Type: Black, Num: 9,
	// Move[9]: Loc: K16, Type: White, Num: 10,
	// Move[10]: Loc: M17, Type: Black, Num: 11,
	// Move[11]: Loc: P5, Type: White, Num: 12,
	// Move[12]: Loc: Q6, Type: Black, Num: 13,
	// Move[13]: Loc: L5, Type: White, Num: 14,
	// Move[14]: Loc: J4, Type: Black, Num: 15,
	// Move[15]: Loc: M3, Type: White, Num: 16,
	// Move[16]: Loc: M2, Type: Black, Num: 17,
	// Move[17]: Loc: L2, Type: White, Num: 18, CapdBy: 20
	// Move[18]: Loc: K2, Type: Black, Num: 19,
	// Move[19]: Loc: L4, Type: White, Num: 20,
	// Move[20]: Loc: L1, Type: Black, Num: 21, FirstCap: 17
	// Move[21]: Loc: K3, Type: White, Num: 22,
	// Move[22]: Loc: J3, Type: Black, Num: 23,
	// Move[23]: Loc: L2, Type: White, Num: 24, CapdBy: 30 FirstCap: 6
	// Move[24]: Loc: N3, Type: Black, Num: 25, Ko: L3
	// Move[25]: Loc: R3, Type: White, Num: 26,
	// Move[26]: Loc: Q4, Type: Black, Num: 27,
	// Move[27]: Loc: Q3, Type: White, Num: 28,
	// Move[28]: Loc: P4, Type: Black, Num: 29,
	// Move[29]: Loc: P3, Type: White, Num: 30,
	// Move[30]: Loc: L3, Type: Black, Num: 31, CapdBy: 33 FirstCap: 23
	// Move[31]: Loc: O4, Type: White, Num: 32, Ko: L2
	// Move[32]: Loc: O3, Type: Black, Num: 33,
	// Move[33]: Loc: L2, Type: White, Num: 34, FirstCap: 30
	// Move[34]: Loc: S4, Type: Black, Num: 35, Ko: L3
	// Move[35]: Loc: Q5, Type: White, Num: 36,
}
Example #2
0
// Test the transformation logic
func ExampleTestTrans() {
	// Set up the test data boards.
	var col ah.ColSize
	var row ah.RowSize
	for size := 5; size <= 19; size += 2 {
		switch size {
		case 5:
			col = 5
			row = 5
			brd_5 = brd_5.InitAbstHier(col, row, ah.StringLevel, true)
			//				ah.SetAHTrace(false)
			printInitBoard(brd_5, "Initial 5x5 Board")
			brd_5.PrintAbstHier("Initial 5x5 Board", true)
			SetUpTestBoard(size, brd_5, &test_5)
			brds[0] = brd_5
		case 7:
			col = 7
			row = 7
			//				brd_7 = new(ah.AbstHier)
			//				brd_7.SetSize(col, row)
			brd_7 = brd_7.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard2(brd_7)
			SetUpTestBoard(size, brd_7, &test_7)
			brds[1] = brd_7
		case 9:
			col = 9
			row = 9
			//				brd_9 = new(ah.AbstHier)
			//				brd_9.SetSize(col, row)
			brd_9 = brd_9.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard(brd_9, "Initial 9x9 Board")
			SetUpTestBoard(size, brd_9, &test_9)
			brds[2] = brd_9
		case 11:
			col = 11
			row = 11
			//				brd_11 = new(ah.AbstHier)
			//				brd_11.SetSize(col, row)
			brd_11 = brd_11.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard2(brd_11)
			SetUpTestBoard(size, brd_11, &test_11)
			brds[3] = brd_11
		case 13:
			col = 13
			row = 13
			brd_13 = brd_13.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard(brd_13, "Initial 13x13 Board")
			SetUpTestBoard(size, brd_13, &test_13)
			brds[4] = brd_13
		case 15:
			col = 15
			row = 15
			brd_15 = brd_15.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard2(brd_15)
			SetUpTestBoard(size, brd_15, &test_15)
			brds[5] = brd_15
		case 17:
			col = 17
			row = 17
			brd_17 = brd_17.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard(brd_17, "Initial 17x17 Board")
			SetUpTestBoard(size, brd_17, &test_17)
			brds[6] = brd_17
		case 19:
			col = 19
			row = 19
			brd_19 = brd_19.InitAbstHier(col, row, ah.StringLevel, true)
			printInitBoard2(brd_19)
			SetUpTestBoard(size, brd_19, &test_19)
			brds[7] = brd_19
		}
	}
	// Print each board, after applying one of the transformations,
	// and print it (for visual verification)
	//	ah.SetAHTrace(true) // trace first one
	for i, brd := range brds {
		fmt.Println("Checking brds[", i, "]")
		if brd == nil {
			fmt.Println("Error in setup: brd == nil")
		} else {
			newBrd := brd.TransBoard(ah.BoardTrans(i))
			printBrds("Visual Check", brd, newBrd, ah.TransName[i])
		}
		ah.SetAHTrace(false) // turn off after first one
	}
	// Verify that the inverse transformations produce the original
	for i, brd := range brds {
		t := ah.BoardTrans(i)
		inv := ah.InverseTrans[t]
		fmt.Println("Checking", ah.TransName[i], "and its inverse:", ah.TransName[inv])
		newBrd := brd.TransBoard(t)
		newBrdInv := newBrd.TransBoard(inv)
		if differBrds(brd, newBrdInv) {
			printBrds("Error: inverse differs", brd, newBrdInv, ah.TransName[i])
		}
	}
	// Verify the transformation composition table
	nxtBrd := 0 // used to pick the next board
	for A := ah.T_FIRST; A <= ah.T_LAST; A++ {
		for B := ah.T_FIRST; B <= ah.T_LAST; B++ {
			C := ah.ComposeTrans[A][B]
			fmt.Println("Checking", ah.TransName[C], "=", ah.TransName[A], "*", ah.TransName[B])
			brd := brds[nxtBrd]
			nxtBrd++
			if nxtBrd >= 8 {
				nxtBrd = 0
			}
			brdA := brd.TransBoard(A)
			brdAB := brdA.TransBoard(B)
			brdC := brd.TransBoard(C)
			if differBrds(brdAB, brdC) {
				printBrds("Error: "+ah.TransName[ah.ComposeTrans[A][B]], brdAB, brdC,
					"not equal"+ah.TransName[A]+"*"+ah.TransName[B])
			}
		}
	}
	// Output:
	// Initial 5x5 Board Board 5 by 5
	// ┏┯┯┯┓
	// ┠╬┼╬┨
	// ┠┼◘┼┨
	// ┠╬┼╬┨
	// ┗┷┷┷┛
	// Abstraction Hierarchy: Initial 5x5 Board
	// Level 1
	// Black nodes
	// Total 0 nodes, with 0 members
	// White nodes
	// Total 0 nodes, with 0 members
	// Unocc nodes
	// 0:202,3 1-mem:(E,5):202:202,adj:16(1),8(1),
	// 1:778,3 1-mem:(A,1):778:778,adj:4(1),2(1),
	// 2:906,3 3-mem:(D,1):906:906,(C,1),(B,1),adj:1(1),7(1),6(1),5(1),3(1),
	// 3:394,3 1-mem:(E,1):394:394,adj:2(1),8(1),
	// 4:842,3 3-mem:(A,4):842:842,(A,3),(A,2),adj:1(1),15(1),12(1),9(1),5(1),
	// 5:3018,3 1-mem:(B,2):3018:3018,adj:4(1),2(1),9(1),6(1),
	// 6:4042,3 1-mem:(C,2):4042:4042,adj:5(1),2(1),10(1),7(1),
	// 7:3018,3 1-mem:(D,2):3018:3018,adj:6(1),2(1),11(1),8(1),
	// 8:458,3 3-mem:(E,4):458:458,(E,3),(E,2),adj:0(1),7(1),3(1),14(1),11(1),
	// 9:4042,3 1-mem:(B,3):4042:4042,adj:4(1),5(1),12(1),10(1),
	// 10:1994,3 1-mem:(C,3):1994:1994,adj:9(1),6(1),13(1),11(1),
	// 11:4042,3 1-mem:(D,3):4042:4042,adj:8(1),10(1),7(1),14(1),
	// 12:3018,3 1-mem:(B,4):3018:3018,adj:4(1),9(1),16(1),13(1),
	// 13:4042,3 1-mem:(C,4):4042:4042,adj:12(1),10(1),16(1),14(1),
	// 14:3018,3 1-mem:(D,4):3018:3018,adj:8(1),13(1),11(1),16(1),
	// 15:586,3 1-mem:(A,5):586:586,adj:4(1),16(1),
	// 16:714,3 3-mem:(D,5):714:714,(C,5),(B,5),adj:0(1),14(1),13(1),15(1),12(1),
	// Total 17 nodes, with 25 members
	// Board 7 by 7
	// ┏┯┯┯┯┯┓
	// ┠╬┼┼┼╬┨
	// ┠┼◘┼◘┼┨
	// ┠┼┼╋┼┼┨
	// ┠┼◘┼◘┼┨
	// ┠╬┼┼┼╬┨
	// ┗┷┷┷┷┷┛
	// Initial 9x9 Board Board 9 by 9
	// ┏┯┯┯┯┯┯┯┓
	// ┠╬┼┼┼┼┼╬┨
	// ┠┼◘┼┼┼◘┼┨
	// ┠┼┼╬┼╬┼┼┨
	// ┠┼┼┼◘┼┼┼┨
	// ┠┼┼╬┼╬┼┼┨
	// ┠┼◘┼┼┼◘┼┨
	// ┠╬┼┼┼┼┼╬┨
	// ┗┷┷┷┷┷┷┷┛
	// Board 11 by 11
	// ┏┯┯┯┯┯┯┯┯┯┓
	// ┠╬┼┼┼┼┼┼┼╬┨
	// ┠┼◘┼┼┼┼┼◘┼┨
	// ┠┼┼╬┼┼┼╬┼┼┨
	// ┠┼┼┼╬┼╬┼┼┼┨
	// ┠┼┼┼┼◘┼┼┼┼┨
	// ┠┼┼┼╬┼╬┼┼┼┨
	// ┠┼┼╬┼┼┼╬┼┼┨
	// ┠┼◘┼┼┼┼┼◘┼┨
	// ┠╬┼┼┼┼┼┼┼╬┨
	// ┗┷┷┷┷┷┷┷┷┷┛
	// Initial 13x13 Board Board 13 by 13
	// ┏┯┯┯┯┯┯┯┯┯┯┯┓
	// ┠╬┼┼┼┼┼┼┼┼┼╬┨
	// ┠┼╬┼┼┼┼┼┼┼╬┼┨
	// ┠┼┼◘┼┼┼┼┼◘┼┼┨
	// ┠┼┼┼╬┼┼┼╬┼┼┼┨
	// ┠┼┼┼┼╬┼╬┼┼┼┼┨
	// ┠┼┼┼┼┼◘┼┼┼┼┼┨
	// ┠┼┼┼┼╬┼╬┼┼┼┼┨
	// ┠┼┼┼╬┼┼┼╬┼┼┼┨
	// ┠┼┼◘┼┼┼┼┼◘┼┼┨
	// ┠┼╬┼┼┼┼┼┼┼╬┼┨
	// ┠╬┼┼┼┼┼┼┼┼┼╬┨
	// ┗┷┷┷┷┷┷┷┷┷┷┷┛
	// Board 15 by 15
	// ┏┯┯┯┯┯┯┯┯┯┯┯┯┯┓
	// ┠╬┼┼┼┼┼┼┼┼┼┼┼╬┨
	// ┠┼╬┼┼┼┼┼┼┼┼┼╬┼┨
	// ┠┼┼◘┼┼┼◘┼┼┼◘┼┼┨
	// ┠┼┼┼╬┼┼┼┼┼╬┼┼┼┨
	// ┠┼┼┼┼╬┼┼┼╬┼┼┼┼┨
	// ┠┼┼┼┼┼╬┼╬┼┼┼┼┼┨
	// ┠┼┼◘┼┼┼◘┼┼┼◘┼┼┨
	// ┠┼┼┼┼┼╬┼╬┼┼┼┼┼┨
	// ┠┼┼┼┼╬┼┼┼╬┼┼┼┼┨
	// ┠┼┼┼╬┼┼┼┼┼╬┼┼┼┨
	// ┠┼┼◘┼┼┼◘┼┼┼◘┼┼┨
	// ┠┼╬┼┼┼┼┼┼┼┼┼╬┼┨
	// ┠╬┼┼┼┼┼┼┼┼┼┼┼╬┨
	// ┗┷┷┷┷┷┷┷┷┷┷┷┷┷┛
	// Initial 17x17 Board Board 17 by 17
	// ┏┯┯┯┯┯┯┯┯┯┯┯┯┯┯┯┓
	// ┠╬┼┼┼┼┼┼┼┼┼┼┼┼┼╬┨
	// ┠┼╬┼┼┼┼┼┼┼┼┼┼┼╬┼┨
	// ┠┼┼◘┼┼┼┼◘┼┼┼┼◘┼┼┨
	// ┠┼┼┼╬┼┼┼┼┼┼┼╬┼┼┼┨
	// ┠┼┼┼┼╬┼┼┼┼┼╬┼┼┼┼┨
	// ┠┼┼┼┼┼╬┼┼┼╬┼┼┼┼┼┨
	// ┠┼┼┼┼┼┼╋╋╋┼┼┼┼┼┼┨
	// ┠┼┼◘┼┼┼╋◘╋┼┼┼◘┼┼┨
	// ┠┼┼┼┼┼┼╋╋╋┼┼┼┼┼┼┨
	// ┠┼┼┼┼┼╬┼┼┼╬┼┼┼┼┼┨
	// ┠┼┼┼┼╬┼┼┼┼┼╬┼┼┼┼┨
	// ┠┼┼┼╬┼┼┼┼┼┼┼╬┼┼┼┨
	// ┠┼┼◘┼┼┼┼◘┼┼┼┼◘┼┼┨
	// ┠┼╬┼┼┼┼┼┼┼┼┼┼┼╬┼┨
	// ┠╬┼┼┼┼┼┼┼┼┼┼┼┼┼╬┨
	// ┗┷┷┷┷┷┷┷┷┷┷┷┷┷┷┷┛
	// Board 19 by 19
	// ┏┯┯┯┯┯┯┯┯┯┯┯┯┯┯┯┯┯┓
	// ┠╬┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼╬┨
	// ┠┼╬┼┼┼┼┼┼┼┼┼┼┼┼┼╬┼┨
	// ┠┼┼◘┼┼┼┼┼◘┼┼┼┼┼◘┼┼┨
	// ┠┼┼┼╬┼┼┼┼┼┼┼┼┼╬┼┼┼┨
	// ┠┼┼┼┼╬┼┼┼┼┼┼┼╬┼┼┼┼┨
	// ┠┼┼┼┼┼╬┼┼┼┼┼╬┼┼┼┼┼┨
	// ┠┼┼┼┼┼┼╋╋╋╋╋┼┼┼┼┼┼┨
	// ┠┼┼┼┼┼┼╋╋╋╋╋┼┼┼┼┼┼┨
	// ┠┼┼◘┼┼┼╋╋◘╋╋┼┼┼◘┼┼┨
	// ┠┼┼┼┼┼┼╋╋╋╋╋┼┼┼┼┼┼┨
	// ┠┼┼┼┼┼┼╋╋╋╋╋┼┼┼┼┼┼┨
	// ┠┼┼┼┼┼╬┼┼┼┼┼╬┼┼┼┼┼┨
	// ┠┼┼┼┼╬┼┼┼┼┼┼┼╬┼┼┼┼┨
	// ┠┼┼┼╬┼┼┼┼┼┼┼┼┼╬┼┼┼┨
	// ┠┼┼◘┼┼┼┼┼◘┼┼┼┼┼◘┼┼┨
	// ┠┼╬┼┼┼┼┼┼┼┼┼┼┼┼┼╬┼┨
	// ┠╬┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼╬┨
	// ┗┷┷┷┷┷┷┷┷┷┷┷┷┷┷┷┷┷┛
	// Checking brds[ 0 ]
	// Board size 5 by 5 after T_IDENTITY
	// 1.... | 1....
	// 2..x. | 2..x.
	// 3.+.. | 3.+..
	// 4.... | 4....
	// 5.... | 5....
	// Checking brds[ 1 ]
	// Board size 7 by 7 after T_ROTA_090
	// 1...... | .......
	// 2...... | .......
	// 3.+.+.. | ..+x+..
	// 4...x.. | .......
	// 5.+.+.. | ..+.+..
	// 6...... | .......
	// 7...... | 1234567
	// Checking brds[ 2 ]
	// Board size 9 by 9 after T_ROTA_180
	// 1........ | ........9
	// 2........ | ........8
	// 3.+...+.. | ..+...+.7
	// 4.....x.. | ........6
	// 5........ | ........5
	// 6........ | ..x.....4
	// 7.+...+.. | ..+...+.3
	// 8........ | ........2
	// 9........ | ........1
	// Checking brds[ 3 ]
	// Board size 11 by 11 after T_ROTA_270
	// 1.......... | BA987654321
	// 2.......... | ...........
	// 3.+.....+.. | ..+.....+..
	// 4.......x.. | ...........
	// 5.......... | ...........
	// 6....+..... | .....+.....
	// 7.......... | ...........
	// 8.......... | ...........
	// 9.+.....+.. | ..+....x+..
	// A.......... | ...........
	// B.......... | ...........
	// Checking brds[ 4 ]
	// Board size 13 by 13 after T_FLP_SLAS
	// 1............ | .............
	// 2............ | .............
	// 3............ | .........X...
	// 4..+.....+X.. | ...+.....+...
	// 5............ | .............
	// 6............ | .............
	// 7....+....... | .............
	// 8............ | ......+......
	// 9............ | .............
	// A..+.....+... | ...+.....+...
	// B............ | .............
	// C............ | .............
	// D............ | DCBA987654321
	// Checking brds[ 5 ]
	// Board size 15 by 15 after T_FLP_VERT
	// 1.............. | ..............1
	// 2.............. | ..............2
	// 3.............. | ..............3
	// 4..+.......+X.. | ..X+.......+..4
	// 5.............. | ..............5
	// 6.............. | ..............6
	// 7.............. | ..............7
	// 8.....+........ | ........+.....8
	// 9.............. | ..............9
	// A.............. | ..............A
	// B.............. | ..............B
	// C..+.......+... | ...+.......+..C
	// D.............. | ..............D
	// E.............. | ..............E
	// F.............. | ..............F
	// Checking brds[ 6 ]
	// Board size 17 by 17 after T_FLP_BACK
	// 1................ | 123456789ABCDEFGH
	// 2................ | .................
	// 3................ | .................
	// 4..+.........+X.. | ...+.........+...
	// 5................ | .................
	// 6................ | .................
	// 7................ | .................
	// 8................ | ........+........
	// 9......+......... | .................
	// A................ | .................
	// B................ | .................
	// C................ | .................
	// D................ | .................
	// E..+.........+... | ...+.........+...
	// F................ | ...X.............
	// G................ | .................
	// H................ | .................
	// Checking brds[ 7 ]
	// Board size 19 by 19 after T_FLP_HORI
	// 1.................. | J..................
	// 2.................. | I..................
	// 3.................. | H..................
	// 4..+.....+.....+X.. | G..+.....+.....+...
	// 5.................. | F..................
	// 6.................. | E..................
	// 7.................. | D..................
	// 8.................. | C..................
	// 9.................. | B..................
	// A..+.....+.....+... | A..+.....+.....+...
	// B.................. | 9..................
	// C.................. | 8..................
	// D.................. | 7..................
	// E.................. | 6..................
	// F.................. | 5..................
	// G..+.....+.....+... | 4..+.....+.....+X..
	// H.................. | 3..................
	// I.................. | 2..................
	// J.................. | 1..................
	// Checking T_IDENTITY and its inverse: T_IDENTITY
	// Checking T_ROTA_090 and its inverse: T_ROTA_270
	// Checking T_ROTA_180 and its inverse: T_ROTA_180
	// Checking T_ROTA_270 and its inverse: T_ROTA_090
	// Checking T_FLP_SLAS and its inverse: T_FLP_SLAS
	// Checking T_FLP_VERT and its inverse: T_FLP_VERT
	// Checking T_FLP_BACK and its inverse: T_FLP_BACK
	// Checking T_FLP_HORI and its inverse: T_FLP_HORI
	// Checking T_IDENTITY = T_IDENTITY * T_IDENTITY
	// Checking T_ROTA_090 = T_IDENTITY * T_ROTA_090
	// Checking T_ROTA_180 = T_IDENTITY * T_ROTA_180
	// Checking T_ROTA_270 = T_IDENTITY * T_ROTA_270
	// Checking T_FLP_SLAS = T_IDENTITY * T_FLP_SLAS
	// Checking T_FLP_VERT = T_IDENTITY * T_FLP_VERT
	// Checking T_FLP_BACK = T_IDENTITY * T_FLP_BACK
	// Checking T_FLP_HORI = T_IDENTITY * T_FLP_HORI
	// Checking T_ROTA_090 = T_ROTA_090 * T_IDENTITY
	// Checking T_ROTA_180 = T_ROTA_090 * T_ROTA_090
	// Checking T_ROTA_270 = T_ROTA_090 * T_ROTA_180
	// Checking T_IDENTITY = T_ROTA_090 * T_ROTA_270
	// Checking T_FLP_HORI = T_ROTA_090 * T_FLP_SLAS
	// Checking T_FLP_SLAS = T_ROTA_090 * T_FLP_VERT
	// Checking T_FLP_VERT = T_ROTA_090 * T_FLP_BACK
	// Checking T_FLP_BACK = T_ROTA_090 * T_FLP_HORI
	// Checking T_ROTA_180 = T_ROTA_180 * T_IDENTITY
	// Checking T_ROTA_270 = T_ROTA_180 * T_ROTA_090
	// Checking T_IDENTITY = T_ROTA_180 * T_ROTA_180
	// Checking T_ROTA_090 = T_ROTA_180 * T_ROTA_270
	// Checking T_FLP_BACK = T_ROTA_180 * T_FLP_SLAS
	// Checking T_FLP_HORI = T_ROTA_180 * T_FLP_VERT
	// Checking T_FLP_SLAS = T_ROTA_180 * T_FLP_BACK
	// Checking T_FLP_VERT = T_ROTA_180 * T_FLP_HORI
	// Checking T_ROTA_270 = T_ROTA_270 * T_IDENTITY
	// Checking T_IDENTITY = T_ROTA_270 * T_ROTA_090
	// Checking T_ROTA_090 = T_ROTA_270 * T_ROTA_180
	// Checking T_ROTA_180 = T_ROTA_270 * T_ROTA_270
	// Checking T_FLP_VERT = T_ROTA_270 * T_FLP_SLAS
	// Checking T_FLP_BACK = T_ROTA_270 * T_FLP_VERT
	// Checking T_FLP_HORI = T_ROTA_270 * T_FLP_BACK
	// Checking T_FLP_SLAS = T_ROTA_270 * T_FLP_HORI
	// Checking T_FLP_SLAS = T_FLP_SLAS * T_IDENTITY
	// Checking T_FLP_VERT = T_FLP_SLAS * T_ROTA_090
	// Checking T_FLP_BACK = T_FLP_SLAS * T_ROTA_180
	// Checking T_FLP_HORI = T_FLP_SLAS * T_ROTA_270
	// Checking T_IDENTITY = T_FLP_SLAS * T_FLP_SLAS
	// Checking T_ROTA_090 = T_FLP_SLAS * T_FLP_VERT
	// Checking T_ROTA_180 = T_FLP_SLAS * T_FLP_BACK
	// Checking T_ROTA_270 = T_FLP_SLAS * T_FLP_HORI
	// Checking T_FLP_VERT = T_FLP_VERT * T_IDENTITY
	// Checking T_FLP_BACK = T_FLP_VERT * T_ROTA_090
	// Checking T_FLP_HORI = T_FLP_VERT * T_ROTA_180
	// Checking T_FLP_SLAS = T_FLP_VERT * T_ROTA_270
	// Checking T_ROTA_270 = T_FLP_VERT * T_FLP_SLAS
	// Checking T_IDENTITY = T_FLP_VERT * T_FLP_VERT
	// Checking T_ROTA_090 = T_FLP_VERT * T_FLP_BACK
	// Checking T_ROTA_180 = T_FLP_VERT * T_FLP_HORI
	// Checking T_FLP_BACK = T_FLP_BACK * T_IDENTITY
	// Checking T_FLP_HORI = T_FLP_BACK * T_ROTA_090
	// Checking T_FLP_SLAS = T_FLP_BACK * T_ROTA_180
	// Checking T_FLP_VERT = T_FLP_BACK * T_ROTA_270
	// Checking T_ROTA_180 = T_FLP_BACK * T_FLP_SLAS
	// Checking T_ROTA_270 = T_FLP_BACK * T_FLP_VERT
	// Checking T_IDENTITY = T_FLP_BACK * T_FLP_BACK
	// Checking T_ROTA_090 = T_FLP_BACK * T_FLP_HORI
	// Checking T_FLP_HORI = T_FLP_HORI * T_IDENTITY
	// Checking T_FLP_SLAS = T_FLP_HORI * T_ROTA_090
	// Checking T_FLP_VERT = T_FLP_HORI * T_ROTA_180
	// Checking T_FLP_BACK = T_FLP_HORI * T_ROTA_270
	// Checking T_ROTA_090 = T_FLP_HORI * T_FLP_SLAS
	// Checking T_ROTA_180 = T_FLP_HORI * T_FLP_VERT
	// Checking T_ROTA_270 = T_FLP_HORI * T_FLP_BACK
	// Checking T_IDENTITY = T_FLP_HORI * T_FLP_HORI
}