9 use "factorization-coords"
20 const main = {args : byte[:][:]
27 match parse_KC_type(args[2])
28 | `std.Ok k: input_kc = k
29 | `std.Err e: std.fatal("{}\n", e)
33 if std.eq(dir, "forward")
34 var q = std.try(mk_Q(`F4))
35 std.get(quiver.find_vertex(q, "v1;1")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31"))
36 std.get(quiver.find_vertex(q, "v2;1")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31"))
37 std.get(quiver.find_vertex(q, "v3;1")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2"))
38 std.get(quiver.find_vertex(q, "v4;1")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2"))
40 std.get(quiver.find_vertex(q, "v1;2")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h32"))
41 std.get(quiver.find_vertex(q, "v2;2")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31 h32"))
42 std.get(quiver.find_vertex(q, "v3;2")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2 h32^2"))
43 std.get(quiver.find_vertex(q, "v4;2")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h32^2"))
45 std.get(quiver.find_vertex(q, "v1;3")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31"))
46 std.get(quiver.find_vertex(q, "v2;3")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2 h32"))
47 std.get(quiver.find_vertex(q, "v3;3")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2 h32^2"))
48 std.get(quiver.find_vertex(q, "v4;3")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2"))
50 std.get(quiver.find_vertex(q, "v1;4")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31 h32"))
51 std.get(quiver.find_vertex(q, "v2;4")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31 h32"))
52 std.get(quiver.find_vertex(q, "v3;4")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2 h32^2"))
53 std.get(quiver.find_vertex(q, "v4;4")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31^2"))
55 std.get(quiver.find_vertex(q, "v1;5")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h32"))
56 std.get(quiver.find_vertex(q, "v2;5")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h31 h32"))
57 std.get(quiver.find_vertex(q, "v3;5")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h32^2"))
58 std.get(quiver.find_vertex(q, "v4;5")).1.acoord = `std.Some std.try(yakmo.polynomialfromS("h33^2"))
64 [ "v1;1", "v2;1", "v3;1", "v4;1", ][:],
65 [ "v1;2", "v2;2", "v3;2", "v4;2", ][:],
66 [ "v1;1", "v2;1", "v3;1", "v4;1", ][:],
67 [ "v1;3", "v2;3", "v3;3", "v4;3", ][:],
68 [ "v1;2", "v2;2", "v3;2", "v4;2", ][:],
69 [ "v1;1", "v2;1", "v3;1", "v4;1", ][:],
70 [ "v1;4", "v2;4", "v3;4", "v4;4", ][:],
71 [ "v1;3", "v2;3", "v3;3", "v4;3", ][:],
72 [ "v1;2", "v2;2", "v3;2", "v4;2", ][:],
73 [ "v1;1", "v2;1", "v3;1", "v4;1", ][:],
74 [ "v1;5", "v2;5", "v3;5", "v4;5", ][:],
75 [ "v1;4", "v2;4", "v3;4", "v4;4", ][:],
76 [ "v1;3", "v2;3", "v3;3", "v4;3", ][:],
77 [ "v1;2", "v2;2", "v3;2", "v4;2", ][:],
78 [ "v1;1", "v2;1", "v3;1", "v4;1", ][:], ][:]
79 var untouched_q = auto t.dup(q)
81 quiver.mutateseq_ip(q, subseq)
83 elif std.eq(dir, "wordtest")
84 /* This is the one that gives you the weird numerator part of h1 */
88 var h : factorization_coordinate[:] = [][:]
89 for var k = 1; k <= rank; ++k
90 std.slpush(&h, `H((k : weyl_reflection), std.try(yakmo.ratfuncfromS(std.fmt("a{}", k), "1"))))
93 var wk_H_action_exps = get_wk_H_action_exps(kc)
96 for var k = 1; k <= w0.len; ++k
97 var hw = apply_wk(kc, k, h, x)
98 std.put("w_{w=3,p= }(h) = ", k)
106 col_start = "\u{001b}[48;2;55;55;55m"
107 col_end = "\u{001b}[0m"
108 extra = col_start.len + col_end.len - 2
110 var s = std.fmt("{} {} {}", col_start, rf, col_end)
111 std.put("{w=?}", s, 20 + extra)
120 elif std.eq(dir, "wordtest2")
121 /* This is for playing around with wordtest */
125 var h : factorization_coordinate[:] = [][:]
126 for var k = 1; k <= rank; ++k
127 std.slpush(&h, `H((k : weyl_reflection), std.try(yakmo.ratfuncfromS(std.fmt("a{}", k), "1"))))
130 var wk_H_action_exps = get_wk_H_action_exps(kc)
132 for x : [ 0, -1, 1 ][:]
133 for var k = rank; k < w0.len; ++k
134 var hw = apply_wk(kc, k, h, x)
135 std.put("w_{w=3,p= }(h) = ", k)
142 if k < w0.len && l == w0[k]
143 col_start = "\u{001b}[48;2;55;55;55m"
144 col_end = "\u{001b}[0m"
145 extra = col_start.len + col_end.len - 2
147 var s = std.fmt("{} {} {}", col_start, rf, col_end)
148 std.put("{w=?}", s, 20 + extra)
157 elif std.eq(dir, "seek-flip")
159 var qdv = std.try(mk_Qdv(kc))
160 var qdh = std.try(mk_Qdh(kc))
162 //quiver.mutateseq_ip(qdv, ["w1;1", "w2;1"][:])
163 //quiver.mutateseq_ip(qdv, ["w2;1", "w1;1"][:])
164 quiver.mutateseq_ip(qdv, [][:])
166 //quiver.mutateseq_ip(qdv, ["w1;3", "w2;3"][:])
167 //quiver.mutateseq_ip(qdv, ["w2;3", "w1;3"][:])
168 quiver.mutateseq_ip(qdv, [][:])
171 ("D1", "1"), ("D2", "1"),
172 ("E1", "1"), ("E2", "1"),
173 ("F1", "1"), ("F2", "1"),
174 ("G1", "1"), ("G2", "1"),
175 ("w1;1", "1"), ("w2;1", "1"),
176 ("w1;2", "1"), ("w2;2", "1"),
177 ("w1;3", "1"), ("w2;3", "1"),
179 match quiver.find_vertex(qdv, name)
181 vv.acoord = `std.Some std.try(yakmo.polynomialfromS(val))
187 std.try(yakmo.polynomialfromS("12")),
188 std.try(yakmo.polynomialfromS("36")),
190 std.try(yakmo.polynomialfromS("15")),
191 std.try(yakmo.polynomialfromS("18")),
192 std.try(yakmo.polynomialfromS("24")),
193 std.try(yakmo.polynomialfromS("2")),
196 for var j = 0; j < qdv.v.len; ++j
197 std.put(" > {w=8} {}\n", qdv.v[j].name, qdv.v[j].acoord)
200 for var depth = 2; depth < 20; ++depth
201 std.put("searching at depth = {}\n", depth)
202 exorcise(qdv, [][:], sought, depth, 0, 0)
204 elif std.eq(dir, "uinv-test")
207 var fc : factorization_coordinate[:] = [][:]
211 for var k = 0; k < i.len; ++k
212 std.slpush(&fc, `X(i[k], std.try(yakmo.ratfuncfromS("-1", "1"))))
213 std.slpush(&fc, `Y(i[k], std.try(yakmo.ratfuncfromS(" 1", "1"))))
214 std.slpush(&fc, `X(i[k], std.try(yakmo.ratfuncfromS("-1", "1"))))
219 std.slpush(&fc, `Y(ii, std.try(yakmo.ratfuncfromS(std.fmt("t{}", j++), "1"))))
223 //for var k = i.len - 1; k >= 0; --k
224 // std.slpush(&fc, `X(i[k], std.try(yakmo.ratfuncfromS(" 1", "1"))))
225 // std.slpush(&fc, `Y(i[k], std.try(yakmo.ratfuncfromS("-1", "1"))))
226 // std.slpush(&fc, `X(i[k], std.try(yakmo.ratfuncfromS(" 1", "1"))))
230 match canonicalize_factorization_coords(kc, &fc, `Ordering_YHX)
231 | `std.Err e: std.fatal(e)
235 for var j = 0; j < fc.len; ++j
237 | `X(ii, rf): std.put("X({w=2,p= }, {})\n", ii, rf)
238 | `H(ii, rf): std.put("H({w=2,p= }, {})\n", ii, rf)
239 | `Y(ii, rf): std.put("Y({w=2,p= }, {})\n", ii, rf)
242 elif std.eq(dir, "lusztigtest")
245 `Y (2, std.try(yakmo.ratfuncfromS(" t", "1"))),
247 `X (2, std.try(yakmo.ratfuncfromS("-1", "1"))),
248 `Y (2, std.try(yakmo.ratfuncfromS(" 1", "1"))),
249 `X (2, std.try(yakmo.ratfuncfromS("-1", "1"))),
252 match canonicalize_factorization_coords(kc, &fc, `Ordering_XYH)
253 | `std.Err e: std.fatal("\ncanonicalize_factorization_coords({}, {}): {}", kc, fc, e)
255 for var j = 0; j < fc.len; ++j
257 | `H(_, rf): yakmo.reduceratfunc(rf)
258 | `X(_, rf): yakmo.reduceratfunc(rf)
259 | `Y(_, rf): yakmo.reduceratfunc(rf)
264 elif std.eq(dir, "applyw0test")
267 `H (1, std.try(yakmo.ratfuncfromS("s", "1"))),
268 `H (2, std.try(yakmo.ratfuncfromS("t", "1"))),
270 std.put("wâ‚€( {} ) = ", fc)
271 match apply_wk(kc, 1, fc, 0)
272 | `std.Err e: std.fatal("{}\n", e)
273 | `std.Ok wkfc: std.put("{}\n", wkfc)
275 elif std.eq(dir, "phiinvtest")
278 [ .k = 1, .c = std.try(yakmo.ratfuncfromS("13", "1")) ],
279 [ .k = 2, .c = std.try(yakmo.ratfuncfromS("29", "1")) ],
280 [ .k = 3, .c = std.try(yakmo.ratfuncfromS("101", "1")) ],
281 [ .k = 4, .c = std.try(yakmo.ratfuncfromS("41", "1")) ],
284 match interior_fc_from_mc_and_undo_psi_phi_psi(kc, mc)
285 | `std.Err e: std.fatal("interior_fc_from_mc_and_undo_psi_phi_psi: {}\n", e)
286 | `std.Ok fc_: fc = fc_
288 std.put("mc = {}\n", mc)
289 std.put("fc = {}\n", fc)
290 elif std.eq(dir, "psiphitest")
294 for var j = 0; j < w0.len; ++j
295 std.slpush(&mc, [ .k = j + 1, .c = std.try(yakmo.ratfuncfromS(a_from_k(j), "1")) ])
299 match interior_fc_from_mc(kc, mc)
300 | `std.Err e: std.fatal("interior_fc_from_mc: {}\n", e)
301 | `std.Ok fc_: fc = fc_
307 | `std.Err e: std.fatal("phi: {}\n", e)
308 | `std.Ok fc_: phi_fc = fc_
313 match psi(kc, phi_fc)
314 | `std.Err e: std.fatal("psi: {}\n", e)
315 | `std.Ok fc_: psi_phi_fc = fc_
320 match interior_mc_from_fc(kc, psi_phi_fc)
321 | `std.Err e: std.fatal("interior_mc_from_fc: {}\n", e)
322 | `std.Ok mc_: phi_psi_mc = mc_
326 for var j = 0; j < mc.len; ++j
327 std.put("{} -> {}\n", mc[j], phi_psi_mc[j])
329 elif std.eq(dir, "psiphipsiphitest")
332 [ .k = 1, .c = std.try(yakmo.ratfuncfromS("a", "1")) ],
333 [ .k = 2, .c = std.try(yakmo.ratfuncfromS("b", "1")) ],
334 [ .k = 3, .c = std.try(yakmo.ratfuncfromS("c", "1")) ],
335 [ .k = 4, .c = std.try(yakmo.ratfuncfromS("d", "1")) ],
338 match interior_fc_from_mc(kc, mc)
339 | `std.Err e: std.fatal("interior_fc_from_mc: {}\n", e)
340 | `std.Ok fc_: fc = fc_
346 | `std.Err e: std.fatal("phi: {}\n", e)
347 | `std.Ok fc_: phi_fc = fc_
352 match psi(kc, phi_fc)
353 | `std.Err e: std.fatal("psi: {}\n", e)
354 | `std.Ok fc_: psi_phi_fc = fc_
359 match phi(kc, psi_phi_fc)
360 | `std.Err e: std.fatal("phi: {}\n", e)
361 | `std.Ok fc_: phi_psi_phi_fc = fc_
365 var psi_phi_psi_phi_fc
366 match phi(kc, phi_psi_phi_fc)
367 | `std.Err e: std.fatal("psi: {}\n", e)
368 | `std.Ok fc_: psi_phi_psi_phi_fc = fc_
372 var phi_psi_phi_psi_mc
373 match interior_mc_from_fc(kc, psi_phi_psi_phi_fc)
374 | `std.Err e: std.fatal("interior_mc_from_fc: {}\n", e)
375 | `std.Ok mc_: phi_psi_phi_psi_mc = mc_
379 for var j = 0; j < mc.len; ++j
380 std.put("{} -> {}\n", mc[j], phi_psi_phi_psi_mc[j])
382 elif std.eq(dir, "rottest")
384 var h1 : minor_coordinate[:] = [
385 [ .k = 1, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
386 [ .k = 2, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
388 var h2 : minor_coordinate[:] = [
389 [ .k = 1, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
390 [ .k = 2, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
392 var h3 : minor_coordinate[:] = [
393 [ .k = 1, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
394 [ .k = 2, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
396 var u : minor_coordinate[:] = [
397 [ .k = 3, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
398 [ .k = 4, .c = std.try(yakmo.ratfuncfromS("1", "1")) ],
401 var alpha : conf_3_star = [ .h1 = t.dup(h1), .h2 = t.dup(h2), .h3 = t.dup(h3), .u = t.dup(u) ]
402 var a012 : conf_3_star# = std.mk(alpha)
403 match fill_in_alpha(kc, a012)
404 | `std.Err e: std.fatal("fill_in_alpha: {}\n", e)
406 match rotate(kc, a012)
407 | `std.Err e: std.fatal("rotate: {}\n", e)
409 match rotate(kc, a201)
410 | `std.Err e: std.fatal("rotate: {}\n", e)
413 std.put(" h1 : {}\n", a012.h1)
414 std.put(" h2 : {}\n", a012.h2)
415 std.put(" h3 : {}\n", a012.h3)
416 std.put(" u : {}\n", a012.u)
417 std.put("-----------------\n")
419 std.put(" h1 : {}\n", a201.h1)
420 std.put(" h2 : {}\n", a201.h2)
421 std.put(" h3 : {}\n", a201.h3)
422 std.put(" u : {}\n", a201.u)
423 std.put("-----------------\n")
425 std.put(" h1 : {}\n", a120.h1)
426 std.put(" h2 : {}\n", a120.h2)
427 std.put(" h3 : {}\n", a120.h3)
428 std.put(" u : {}\n", a120.u)
437 const leftpad = {s, w
438 var needed_len = w - s.len
439 var sb : std.strbuf# = std.mksb()
440 for var j = 0; j < needed_len; ++j
441 std.sbputb(sb, (' ' : byte))
448 generic sameopts = {a : std.option(@t), b : std.option(@t)
450 | (`std.None, `std.None): -> true
451 | (`std.Some _, `std.None): -> false
452 | (`std.None, `std.Some _): -> false
453 | (`std.Some aa, `std.Some bb): -> std.eq(aa, bb)
457 const exorcise = {q : quiver.quiver#, history : std.size[:], targets : yakmo.polynomial#[:], depth : int, wildcat : int, last_num_good : int
462 /* Are all of our A-coordinates correct? */
465 var num_good : int = 0
466 for var j = 0; j < q.v.len; ++j
467 var v : quiver.vertex# = &q.v[j]
468 if v.name[0] != ('w' : byte) && v.name[0] != ('v' : byte)
472 if std.eq(v.name, "w1;2") && !sameopts(v.acoord, `std.Some targets[0])
476 if std.eq(v.name, "w2;2") && !sameopts(v.acoord, `std.Some targets[1])
482 if sameopts(v.acoord, `std.Some qt)
489 if num_good > 4 && w12_good && w22_good
490 std.put("Potential : [")
491 for var j = 0; j < history.len; ++j
492 std.put(" {}", q.v[history[j]].name)
496 match quiver.find_vertex(q, "w1;1")
497 | `std.Some (_, vv): std.put("w1;1 = {} ", vv.acoord)
500 match quiver.find_vertex(q, "w2;1")
501 | `std.Some (_, vv): std.put("w2;1 = {} ", vv.acoord)
504 match quiver.find_vertex(q, "w1;2")
505 | `std.Some (_, vv): std.put("w1;2 = {} ", vv.acoord)
508 match quiver.find_vertex(q, "w2;2")
509 | `std.Some (_, vv): std.put("w2;2 = {} ", vv.acoord)
512 match quiver.find_vertex(q, "w1;3")
513 | `std.Some (_, vv): std.put("w1;3 = {} ", vv.acoord)
516 match quiver.find_vertex(q, "w2;3")
517 | `std.Some (_, vv): std.put("w2;3 = {} ", vv.acoord)
523 elif num_good > 9 && num_good > last_num_good
524 std.put("{} : [", num_good)
525 for var j = 0; j < history.len; ++j
526 std.put(" {}", q.v[history[j]].name)
532 We're not all good. Mutate somewhere. I don't have a clue
533 what's "normal", so wildcat doesn't mean anything.
535 var candidates : (std.size, int)[:] = [][:]
536 var zero : yakmo.Q# = yakmo.gid()
538 for var j = 0; j < q.v.len; ++j
539 if q.v[j].name[0] != ('w' : byte) && q.v[j].name[0] != ('v' : byte)
543 var l = history[history.len - 1]
546 elif j < l && std.eq(q.epsilon[j][l], zero)
548 Mutating here and at the last
549 position commute, so we only need one
559 elif j == 1 && !yakmo.eq_gid(q.epsilon[1][2])
561 elif j == 2 && (!yakmo.eq_gid(q.epsilon[1][2]) || !yakmo.eq_gid(q.epsilon[2][8]))
563 elif j == 3 && (!yakmo.eq_gid(q.epsilon[3][6]) || !yakmo.eq_gid(q.epsilon[3][12]))
565 elif j == 6 && !yakmo.eq_gid(q.epsilon[6][3])
567 elif j == 8 && !yakmo.eq_gid(q.epsilon[2][8])
569 elif j == 12 && !yakmo.eq_gid(q.epsilon[3][12])
574 std.slpush(&candidates, (j, wildcat))
577 var new_history : std.size[:] = std.sldup(history)
578 std.slpush(&new_history, -1)
579 for var k = 0; k < candidates.len; ++k
581 match quiver.mutate_ip_i(q, candidates[k].0)
582 | `std.Err e: std.fatal(e)
587 new_history[new_history.len - 1] = candidates[k].0
588 exorcise(q, new_history, targets, depth - 1, candidates[k].1, num_good)
591 match quiver.mutate_ip_i(q, candidates[k].0)
592 | `std.Err e: std.fatal(e)
597 std.slfree(new_history)
598 std.slfree(candidates)
603 var ls = [ "a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z" ][:]
606 std.slpush(&p, ls[rem])
609 std.slpush(&p, ls[k])
612 for var k = p.len - 1; k >= 0; --k