From d727913d1c79a7e15ffd32611d88ede1fdba90b8 Mon Sep 17 00:00:00 2001 From: selpo Date: Tue, 17 Sep 2019 00:16:00 +0900 Subject: [PATCH 01/15] implemented toQboot --- inv.m | 63 +++++++++++++++++++++++ tocpp.m | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+) create mode 100644 tocpp.m diff --git a/inv.m b/inv.m index cc128c9..e3473ed 100644 --- a/inv.m +++ b/inv.m @@ -1,6 +1,7 @@ (* Do not import this package directly. *) Needs["CommonFunctions`", "common.m"] Needs["ToPython`", "topy.m"] +Needs["ToCpp`", "tocpp.m"] ClebschGordan`clearCG[]; BeginPackage["ClebschGordan`"] @@ -78,6 +79,7 @@ makeMat::usage = "makeMat[eqn[sec,{a,b,...}]] gives a matrix-representation of extracted bootstrap equation eqn[sec,{a,b,...}]." makeSDP::usage = "makeSDP[eqn[{a,b,...}]] converts whole bootstrap equation eqn[{a,b,...}] into sdp-object." sdpobj::usage = "sdpobj[secs,scalarnum,vals,mats] is a sdp-object. secs is section data of bootstrap equation. scalarnum is the number of connected components in scalar sections. vals are real constants in bootstrap equation. mats are matrix-representation of bootstrap equation." +toQboot::usage = "toQboot[sdp] converts sdp-object into c++ code for qboot." toCboot::usage = "toCboot[sdp] converts sdp-object into python code for cboot." toTeX::usage = "toTeX[eq] gives latex string of eq (you need call Print[toTeX[eq]] to paste to your tex file). toTeX[eqn[{a,b,...}]] gives latex string of eq with align environment (you need call Print[toTeX[eq]] to paste to your tex file)." @@ -669,6 +671,67 @@ sdpobj[secs, scalnum, keys[val], mat] ] +toCString[F[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[H[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[Hp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[Fp[x_, y_, z_, w_, o_]] := TemplateApply["ops.at(\"`o`\"), ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w, "o"->o|>]; +toCString[Hp[x_, y_, z_, w_, o_]] := TemplateApply["ops.at(\"`o`\"), ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w, "o"->o|>]; + +toQboot[sdpobj[secs_, scalarnum_, vals_, mat_]] := + Module[{s, v, o, revval = reverseIndex[vals], numeq = Length @ mat[unit, 1], secsStr, valsStr, filename, extdelta, exts, extops, scalarsecs, secname, matsize, terms, syms, n, i, e, r, c, f, regsym, eqStr, convert}, + terms = ConstantArray[{}, numeq]; + syms = ConstantArray[None, numeq]; + Do[matsize[scalar, i] = Length @ mat[scalar, i][[1]], {i, scalarnum}]; + Do[matsize[s, i] = Length @ mat[s, i][[1]], {s, Keys[secs]}, {i, secs[s]}]; + secname[unit] = secname[unit, 1] = "\"unit\""; + secname[scalar, id_] := TemplateApply["\"(scalar, `n`)\"", <|"n" -> id - 1|>]; + secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p`, `n`)\"", <|"r" -> r, "p" -> (1 - p)/2, "n" -> id - 1|>]; + secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; + valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; + exts = DeleteDuplicates[#[[1]] & /@ keys[allopsForBoot]]; + filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str(8)", <|"k" -> #|>] & /@ exts, " + \"-\" + "]; + extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = R(args[`i`]);", <|"i" -> #, "k" -> exts[[#]]|>] &, Length[exts]], "\n\t"]; + extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(deltas.at(\"`k`\"), 0, c));", <|"k" -> #|>] & /@ exts, "\n\t"]; + scalarsecs = StringRiffle[Array[TemplateApply["secs.emplace_back(`sec`, `s`);", <|"sec" -> secname[scalar, #], "s" -> matsize[scalar, #]|>] &, scalarnum], "\n\t"]; + regsym[e_, F] := (syms[[e]] = "Odd";); + regsym[e_, H] := (syms[[e]] = "Even";); + regsym[e_, Fp] := (syms[[e]] = "Odd";); + regsym[e_, Hp] := (syms[[e]] = "Even";); + (* diagonal *) + convert[0, block[1, 1, bl_]] := toCString[bl]; + convert[0, block[-1, 1, bl_]] := TemplateApply["R(-1), `bl`", <|"bl" -> toCString[bl]|>]; + convert[0, block[1, v_, bl_]] := TemplateApply["val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + convert[0, block[-1, v_, bl_]] := TemplateApply["-val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + (* off-diagonal *) + convert[1, block[1, 1, bl_]] := TemplateApply["R(2), `bl`", <|"bl" -> toCString[bl]|>]; + convert[1, block[-1, 1, bl_]] := TemplateApply["R(-2), `bl`", <|"bl" -> toCString[bl]|>]; + convert[1, block[1, v_, bl_]] := TemplateApply["2 * val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + convert[1, block[-1, v_, bl_]] := TemplateApply["-2 * val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + convert[s_, r_, r_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> r - 1, "block" -> convert[0, x]|>]; + convert[s_, r_, c_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> c - 1, "block" -> convert[1, x]|>]; + f[s_, n_, e_, r_, c_, 0] := None; + f[s_, n_, e_, r_, c_, x_Plus] := Scan[f[s, n, e, r, c, #] &, List @@ x]; + f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]); + Do[f[unit, 1, e, 1, 1, mat[unit, 1][[e, 1, 1]]], {e, numeq}]; + Do[f[scalar, n, e, r, c, mat[scalar, n][[e, r, c]]], {n, scalarnum}, {e, numeq}, {r, matsize[scalar, n]}, {c, matsize[scalar, n]}]; + Do[f[s, n, e, r, c, mat[s, n][[e, r, c]]], {s, Keys[secs]}, {n, secs[s]}, {e, numeq}, {r, matsize[s, n]}, {c, matsize[s, n]}]; + eqStr = StringRiffle[Array[TemplateApply[eqTemplate, <|"sym" -> syms[[#]], "terms" -> StringRiffle[terms[[#]], "\n\t\t"]|>] &, numeq], "\n\t"]; + ToCpp`createCpp[secsStr, scalarsecs, valsStr, Length[vals], eqStr, Length[exts] + 1, extops, extdelta, filename] + ] + +eqTemplate = "{ + Eq eq(boot, `sym`); + `terms` + boot.add_equation(eq); + }" + +secTemplate = "{ + Sector s(`sec`, `sz`, ContinuousType); + for (const auto& spin: spins) if (spin % 2 == `p`) s.add_op(spin); + secs.push_back(s); + }" + toString[F[x_, y_, z_, w_]] := TemplateApply["get(F, \"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toString[H[x_, y_, z_, w_]] := TemplateApply["get(H, \"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["get(F, \"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; diff --git a/tocpp.m b/tocpp.m new file mode 100644 index 0000000..08f126e --- /dev/null +++ b/tocpp.m @@ -0,0 +1,152 @@ +BeginPackage["ToCpp`"] + +cppeval::usage = "cppeval[x]" +createCpp::usage = "createCpp[secs,scalarsecs,vals,numval,eqs,extops,extdelta,filename]" + +Begin["`Private`"] + +cppeval[n_Integer] := TemplateApply["R(\"``\")", n] +cppeval[a_Times] := StringRiffle[cppeval /@ List @@ a, {"(", " * ", ")"}] +cppeval[a_Plus] := StringRiffle[cppeval /@ List @@ a, {"(", " + ", ")"}] +cppeval[Power[a_, b_]] := TemplateApply["mpfr::pow(``, ``)", {cppeval[a], cppeval[b]}] +cppeval[Surd[x_, n_]] /; x >= 0 := TemplateApply["mpfr::pow(``, ``)", {cppeval[x], cppeval[1/n]}] +cppeval[Surd[x_, n_]] := cppeval[-Surd[-x, n]] +cppeval[Sqrt[a_]] := TemplateApply["mpfr::sqrt(``)", cppeval[a]] +cppeval[Rational[a_, b_]] := TemplateApply["(`` / ``)", {cppeval[a], cppeval[b]}] +cppeval[Sin[a_]] := TemplateApply["mpfr::sin(``)", cppeval[a]] +cppeval[Cos[a_]] := TemplateApply["mpfr::cos(``)", cppeval[a]] +cppeval[Tan[a_]] := TemplateApply["mpfr::tan(``)", cppeval[a]] +cppeval[Sec[a_]] := TemplateApply["mpfr::sec(``)", cppeval[a]] +cppeval[Csc[a_]] := TemplateApply["mpfr::csc(``)", cppeval[a]] +cppeval[Cot[a_]] := TemplateApply["mpfr::cot(``)", cppeval[a]] +cppeval[Exp[a_]] := TemplateApply["mpfr::exp(``)", cppeval[a]] +cppeval[Log[a_]] := TemplateApply["mpfr::log(``)", cppeval[a]] +cppeval[Log[b_, a_]] := cppeval[Log[a] / Log[b]] +cppeval[Pi] = "mpfr::const_pi()"; +cppeval[E] = cppeval[Exp[1]]; +cppeval[x_?ExactNumberQ] := TemplateApply["R(\"``\")", ToString @ FortranForm @ N[x, 400]] +cppeval[x_?NumberQ] := TemplateApply["R(\"``\")", ToString @ FortranForm[x]] + +createCpp[secs_, scalarsecs_, vals_, numval_, eqs_, numext_, extops_, extdelta_, filename_] := + TemplateApply[template, <|"secs"->secs, "scalarsecs"->scalarsecs, "vals"->vals, "numval"->numval, "eqs"->eqs, "numext"->numext, "extops"->extops, "extdelta"->extdelta, "filename"->filename|>] + +(* filename: "deltas[\"e\"].str(8) + \"-\" + ..." *) +(* numext: 3 *) +(* extdelta: "deltas[\"s\"] = R(args[1]);\n..." *) +(* extops: "ops.emplace(\"s\", Op(deltas[\"s\"], 0, c));\n..." *) +(* scalarsecs: "secs.emplace_back(\"(scalar, 0)\", 2);\n..." *) +(* secs: "{\nSector s(\"even\", 2, ContinuousType);\nfor (const auto& spin: spins) if (spin % 2 == 0) s.add_op(spin);\nsecs.push_back(s);\n}\n..." *) +(* vals: "val[0] = R(-1);\n..." *) +(* eqs: "{\nEq eq(boot, Odd);\neq.add(\"scalar;0\", 0, 0, ops[\"s\"], ext(\"e\", \"s\", \"e\", \"s\"));\neq.add(\"odd+\", ext(\"e\", \"s\", \"e\", \"s\"));\neq.add(\"odd-\", ext(\"e\", \"s\", \"e\", \"s\"));\nboot.add_equation(eq);\n}..." *) + +template = "#include +#include +#include +#include +#include +#include +#include + +#include \"bootstrap_equation.hpp\" +#include \"complex_function.hpp\" +#include \"context.hpp\" +#include \"matrix.hpp\" +#include \"polynomial_program.hpp\" +#include \"primary_op.hpp\" +#include \"real.hpp\" + +using algebra::Vector; +using qboot::Context, qboot::PolynomialProgram, qboot::BootstrapEquation, qboot::Sector; +using std::array, std::map, std::set, std::move, std::vector, std::string, std::unique_ptr; +namespace fs = std::filesystem; +using R = mpfr::real; +using Op = qboot::PrimaryOperator; +using Eq = qboot::Equation; +constexpr auto ContinuousType = qboot::SectorType::Continuous; +constexpr auto Odd = algebra::FunctionSymmetry::Odd; +constexpr auto Even = algebra::FunctionSymmetry::Even; + +static string name(map>& deltas); +static PolynomialProgram create(const Context& c, map>& deltas, uint32_t numax, set spins); + +string name(map>& deltas) +{ + return string(\"sdp-\") + `filename`; +} + +PolynomialProgram create(const Context& c, map>& deltas, uint32_t numax, set spins) +{ + map ops; + `extops` + auto ext = [&ops](auto o1, auto o2, auto o3, auto o4) { + return array{ops.at(o1), ops.at(o2), ops.at(o3), ops.at(o4)}; + }; + Op one{c}; + vector secs; + // you can add discrete sectors + // for example, to add sector \"hoge\" whose size of the matrix is 4, + // secs.emplace_back(\"hoge\", 4); + // if you know OPE coefficients of the sector, for example, {1.2, 0.7, -0.1, 0.3}, + // secs.emplace_back(\"hoge\", 4, Vector{R(\"1.2\"), R(\"0.7\"), R(\"-0.1\"), R(\"0.3\")}); + secs.emplace_back(\"unit\", 1, Vector{R(1)}); + `scalarsecs` + // you can customize spectrums + // example: + // customize + // Sector s(\"hoge\", 2, ContinuousType); + // for (const auto& spin: spins) if (spin % 2 == 0) s.add_op(spin); + // secs.push_back(s); + // to + // Sector s(\"hoge\", 2, ContinuousType); + // s.add_op(0, R(\"3\")); // first scalar: 3 <= delta (irrelevance) + // s.add_op(2); // use unitarity bound for spin-2 + // s.add_op(4, R(\"8.1\")); // first spin-4: 8.1 <= delta + // // sector \"hoge\" consists of even-spin operators, and we customized spin-0, 2, 4 + // // use unitarity bound for other operators + // for (const auto& spin: spins) if (spin % 2 == 0 && spin >= 6) s.add_op(spin); + // secs.push_back(s); + `secs` + // do not edit from here + Vector val(`numval`); + `vals` + BootstrapEquation boot(c, secs, numax); + `eqs` + boot.finish(); + // to maximize (resp. minimize) OPE in \"hoge\" sector, + // call boot.ope_maximize(\"hoge\", \"unit\") (resp. ope_minimize) + return boot.find_contradiction(\"unit\"); +} + +int main(int argc, char* argv[]) +{ + // internal precision (in binary digits) + mpfr::global_prec = 1000; + mpfr::global_rnd = MPFR_RNDN; + // n_Max: the order of taylor expansion of gBlock (we recommend n_Max >= 0.4 * global_prec) + // lambda: controls the number of derivatives (z = x + sqrt(y), (der x) ^ m (der y) ^ n for m + 2 n <= lambda) + // dim: the dimension of the physical space + // numax: controls the number of poles picked in the gBlock (numax + min(spin, numax) / 2) + constexpr uint32_t n_Max = 400, lambda = 14, dim = 3, numax = 6; + // spins: spins for the continuous sectors + set spins; + for (uint32_t s = 0; s < 27; ++s) spins.insert(s); + spins.merge(set{49u, 50u}); + assert(argc == `numext`); + unique_ptr args(argv); + map> deltas; + // external scalars + `extdelta` + args.release(); + Context c(n_Max, lambda, dim); + auto prob = create(c, deltas, numax, spins); + auto dir = fs::current_path() / name(deltas); + move(prob).create_input().write(dir); + return 0; +} +" + +Protect[cppeval, createCpp] + +End[ ] + +EndPackage[ ] From 0a6e8a761fcebb71bf7c33612af4adf08bce3a5d Mon Sep 17 00:00:00 2001 From: selpo Date: Thu, 19 Sep 2019 20:44:16 +0900 Subject: [PATCH 02/15] reflected updates in qboot (commit 7daa08cf5df530775d01e9eb0d990ca47dab4147 of qboot) --- inv.m | 15 ++++++----- tocpp.m | 81 ++++++++++++++++++++++++++++++--------------------------- 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/inv.m b/inv.m index e3473ed..f324e0a 100644 --- a/inv.m +++ b/inv.m @@ -690,9 +690,9 @@ secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; exts = DeleteDuplicates[#[[1]] & /@ keys[allopsForBoot]]; - filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str(8)", <|"k" -> #|>] & /@ exts, " + \"-\" + "]; - extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = R(args[`i`]);", <|"i" -> #, "k" -> exts[[#]]|>] &, Length[exts]], "\n\t"]; - extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(deltas.at(\"`k`\"), 0, c));", <|"k" -> #|>] & /@ exts, "\n\t"]; + filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str('#')", <|"k" -> #|>] & /@ exts, " + \"-\" + "]; + extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = parse(args[`i`]).value();", <|"i" -> #, "k" -> exts[[#]]|>] &, Length[exts]], "\n\t"]; + extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(real(deltas.at(\"`k`\")), 0, c));", <|"k" -> #|>] & /@ exts, "\n\t"]; scalarsecs = StringRiffle[Array[TemplateApply["secs.emplace_back(`sec`, `s`);", <|"sec" -> secname[scalar, #], "s" -> matsize[scalar, #]|>] &, scalarnum], "\n\t"]; regsym[e_, F] := (syms[[e]] = "Odd";); regsym[e_, H] := (syms[[e]] = "Even";); @@ -700,12 +700,12 @@ regsym[e_, Hp] := (syms[[e]] = "Even";); (* diagonal *) convert[0, block[1, 1, bl_]] := toCString[bl]; - convert[0, block[-1, 1, bl_]] := TemplateApply["R(-1), `bl`", <|"bl" -> toCString[bl]|>]; + convert[0, block[-1, 1, bl_]] := TemplateApply["real(-1), `bl`", <|"bl" -> toCString[bl]|>]; convert[0, block[1, v_, bl_]] := TemplateApply["val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; convert[0, block[-1, v_, bl_]] := TemplateApply["-val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; (* off-diagonal *) - convert[1, block[1, 1, bl_]] := TemplateApply["R(2), `bl`", <|"bl" -> toCString[bl]|>]; - convert[1, block[-1, 1, bl_]] := TemplateApply["R(-2), `bl`", <|"bl" -> toCString[bl]|>]; + convert[1, block[1, 1, bl_]] := TemplateApply["real(2), `bl`", <|"bl" -> toCString[bl]|>]; + convert[1, block[-1, 1, bl_]] := TemplateApply["real(-2), `bl`", <|"bl" -> toCString[bl]|>]; convert[1, block[1, v_, bl_]] := TemplateApply["2 * val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; convert[1, block[-1, v_, bl_]] := TemplateApply["-2 * val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; convert[s_, r_, r_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> r - 1, "block" -> convert[0, x]|>]; @@ -728,7 +728,8 @@ secTemplate = "{ Sector s(`sec`, `sz`, ContinuousType); - for (const auto& spin: spins) if (spin % 2 == `p`) s.add_op(spin); + for (const auto& spin : spins) + if (spin % 2 == `p`) s.add_op(spin); secs.push_back(s); }" diff --git a/tocpp.m b/tocpp.m index 08f126e..67aea75 100644 --- a/tocpp.m +++ b/tocpp.m @@ -5,38 +5,38 @@ Begin["`Private`"] -cppeval[n_Integer] := TemplateApply["R(\"``\")", n] +cppeval[n_Integer] := TemplateApply["real(\"``\")", n] cppeval[a_Times] := StringRiffle[cppeval /@ List @@ a, {"(", " * ", ")"}] cppeval[a_Plus] := StringRiffle[cppeval /@ List @@ a, {"(", " + ", ")"}] -cppeval[Power[a_, b_]] := TemplateApply["mpfr::pow(``, ``)", {cppeval[a], cppeval[b]}] -cppeval[Surd[x_, n_]] /; x >= 0 := TemplateApply["mpfr::pow(``, ``)", {cppeval[x], cppeval[1/n]}] +cppeval[Power[a_, b_]] := TemplateApply["mp::pow(``, ``)", {cppeval[a], cppeval[b]}] +cppeval[Surd[x_, n_]] /; x >= 0 := TemplateApply["mp::pow(``, ``)", {cppeval[x], cppeval[1/n]}] cppeval[Surd[x_, n_]] := cppeval[-Surd[-x, n]] -cppeval[Sqrt[a_]] := TemplateApply["mpfr::sqrt(``)", cppeval[a]] +cppeval[Sqrt[a_]] := TemplateApply["mp::sqrt(``)", cppeval[a]] cppeval[Rational[a_, b_]] := TemplateApply["(`` / ``)", {cppeval[a], cppeval[b]}] -cppeval[Sin[a_]] := TemplateApply["mpfr::sin(``)", cppeval[a]] -cppeval[Cos[a_]] := TemplateApply["mpfr::cos(``)", cppeval[a]] -cppeval[Tan[a_]] := TemplateApply["mpfr::tan(``)", cppeval[a]] -cppeval[Sec[a_]] := TemplateApply["mpfr::sec(``)", cppeval[a]] -cppeval[Csc[a_]] := TemplateApply["mpfr::csc(``)", cppeval[a]] -cppeval[Cot[a_]] := TemplateApply["mpfr::cot(``)", cppeval[a]] -cppeval[Exp[a_]] := TemplateApply["mpfr::exp(``)", cppeval[a]] -cppeval[Log[a_]] := TemplateApply["mpfr::log(``)", cppeval[a]] +cppeval[Sin[a_]] := TemplateApply["mp::sin(``)", cppeval[a]] +cppeval[Cos[a_]] := TemplateApply["mp::cos(``)", cppeval[a]] +cppeval[Tan[a_]] := TemplateApply["mp::tan(``)", cppeval[a]] +cppeval[Sec[a_]] := TemplateApply["mp::sec(``)", cppeval[a]] +cppeval[Csc[a_]] := TemplateApply["mp::csc(``)", cppeval[a]] +cppeval[Cot[a_]] := TemplateApply["mp::cot(``)", cppeval[a]] +cppeval[Exp[a_]] := TemplateApply["mp::exp(``)", cppeval[a]] +cppeval[Log[a_]] := TemplateApply["mp::log(``)", cppeval[a]] cppeval[Log[b_, a_]] := cppeval[Log[a] / Log[b]] -cppeval[Pi] = "mpfr::const_pi()"; +cppeval[Pi] = "mp::const_pi()"; cppeval[E] = cppeval[Exp[1]]; -cppeval[x_?ExactNumberQ] := TemplateApply["R(\"``\")", ToString @ FortranForm @ N[x, 400]] -cppeval[x_?NumberQ] := TemplateApply["R(\"``\")", ToString @ FortranForm[x]] +cppeval[x_?ExactNumberQ] := TemplateApply["real(\"``\")", ToString @ FortranForm @ N[x, 400]] +cppeval[x_?NumberQ] := TemplateApply["real(\"``\")", ToString @ FortranForm[x]] createCpp[secs_, scalarsecs_, vals_, numval_, eqs_, numext_, extops_, extdelta_, filename_] := TemplateApply[template, <|"secs"->secs, "scalarsecs"->scalarsecs, "vals"->vals, "numval"->numval, "eqs"->eqs, "numext"->numext, "extops"->extops, "extdelta"->extdelta, "filename"->filename|>] (* filename: "deltas[\"e\"].str(8) + \"-\" + ..." *) (* numext: 3 *) -(* extdelta: "deltas[\"s\"] = R(args[1]);\n..." *) +(* extdelta: "deltas[\"s\"] = real(args[1]);\n..." *) (* extops: "ops.emplace(\"s\", Op(deltas[\"s\"], 0, c));\n..." *) (* scalarsecs: "secs.emplace_back(\"(scalar, 0)\", 2);\n..." *) (* secs: "{\nSector s(\"even\", 2, ContinuousType);\nfor (const auto& spin: spins) if (spin % 2 == 0) s.add_op(spin);\nsecs.push_back(s);\n}\n..." *) -(* vals: "val[0] = R(-1);\n..." *) +(* vals: "val[0] = real(-1);\n..." *) (* eqs: "{\nEq eq(boot, Odd);\neq.add(\"scalar;0\", 0, 0, ops[\"s\"], ext(\"e\", \"s\", \"e\", \"s\"));\neq.add(\"odd+\", ext(\"e\", \"s\", \"e\", \"s\"));\neq.add(\"odd-\", ext(\"e\", \"s\", \"e\", \"s\"));\nboot.add_equation(eq);\n}..." *) template = "#include @@ -56,27 +56,30 @@ #include \"real.hpp\" using algebra::Vector; +using mp::real, mp::rational, mp::parse; using qboot::Context, qboot::PolynomialProgram, qboot::BootstrapEquation, qboot::Sector; using std::array, std::map, std::set, std::move, std::vector, std::string, std::unique_ptr; -namespace fs = std::filesystem; -using R = mpfr::real; +namespace fs = qboot::fs; + +template +using dict = map>; using Op = qboot::PrimaryOperator; using Eq = qboot::Equation; constexpr auto ContinuousType = qboot::SectorType::Continuous; constexpr auto Odd = algebra::FunctionSymmetry::Odd; constexpr auto Even = algebra::FunctionSymmetry::Even; -static string name(map>& deltas); -static PolynomialProgram create(const Context& c, map>& deltas, uint32_t numax, set spins); +static string name(const dict& deltas); +static PolynomialProgram create(const Context& c, const dict& deltas, uint32_t numax, set spins); -string name(map>& deltas) +string name(const dict& deltas) { return string(\"sdp-\") + `filename`; } -PolynomialProgram create(const Context& c, map>& deltas, uint32_t numax, set spins) +PolynomialProgram create(const Context& c, const dict& deltas, uint32_t numax, set spins) { - map ops; + dict ops; `extops` auto ext = [&ops](auto o1, auto o2, auto o3, auto o4) { return array{ops.at(o1), ops.at(o2), ops.at(o3), ops.at(o4)}; @@ -87,41 +90,43 @@ PolynomialProgram create(const Context& c, map>& deltas, // for example, to add sector \"hoge\" whose size of the matrix is 4, // secs.emplace_back(\"hoge\", 4); // if you know OPE coefficients of the sector, for example, {1.2, 0.7, -0.1, 0.3}, - // secs.emplace_back(\"hoge\", 4, Vector{R(\"1.2\"), R(\"0.7\"), R(\"-0.1\"), R(\"0.3\")}); - secs.emplace_back(\"unit\", 1, Vector{R(1)}); + // secs.emplace_back(\"hoge\", 4, Vector{real(\"1.2\"), real(\"0.7\"), real(\"-0.1\"), real(\"0.3\")}); + secs.emplace_back(\"unit\", 1, Vector{real(1)}); `scalarsecs` // you can customize spectrums // example: // customize // Sector s(\"hoge\", 2, ContinuousType); - // for (const auto& spin: spins) if (spin % 2 == 0) s.add_op(spin); - // secs.push_back(s); + // for (const auto& spin: spins) + // if (spin % 2 == 0) s.add_op(spin); + // secs.push_back(s); // to // Sector s(\"hoge\", 2, ContinuousType); - // s.add_op(0, R(\"3\")); // first scalar: 3 <= delta (irrelevance) - // s.add_op(2); // use unitarity bound for spin-2 - // s.add_op(4, R(\"8.1\")); // first spin-4: 8.1 <= delta + // s.add_op(0, real(\"3\")); // first scalar: 3 <= delta (irrelevance) + // s.add_op(2); // use unitarity bound for spin-2 + // s.add_op(4, real(\"8.1\")); // first spin-4: 8.1 <= delta // // sector \"hoge\" consists of even-spin operators, and we customized spin-0, 2, 4 // // use unitarity bound for other operators - // for (const auto& spin: spins) if (spin % 2 == 0 && spin >= 6) s.add_op(spin); - // secs.push_back(s); + // for (const auto& spin: spins) + // if (spin % 2 == 0 && spin >= 6) s.add_op(spin); + // secs.push_back(s); `secs` // do not edit from here - Vector val(`numval`); + Vector val(`numval`); `vals` BootstrapEquation boot(c, secs, numax); `eqs` boot.finish(); // to maximize (resp. minimize) OPE in \"hoge\" sector, // call boot.ope_maximize(\"hoge\", \"unit\") (resp. ope_minimize) - return boot.find_contradiction(\"unit\"); + return boot.find_contradiction(\"unit\"); } int main(int argc, char* argv[]) { // internal precision (in binary digits) - mpfr::global_prec = 1000; - mpfr::global_rnd = MPFR_RNDN; + mp::global_prec = 1000; + mp::global_rnd = MPFR_RNDN; // n_Max: the order of taylor expansion of gBlock (we recommend n_Max >= 0.4 * global_prec) // lambda: controls the number of derivatives (z = x + sqrt(y), (der x) ^ m (der y) ^ n for m + 2 n <= lambda) // dim: the dimension of the physical space @@ -133,7 +138,7 @@ int main(int argc, char* argv[]) spins.merge(set{49u, 50u}); assert(argc == `numext`); unique_ptr args(argv); - map> deltas; + dict deltas; // external scalars `extdelta` args.release(); From 4c20a3f465e0bbd431f02df2a42c1ed03f76728e Mon Sep 17 00:00:00 2001 From: selpo Date: Wed, 2 Oct 2019 17:13:42 +0900 Subject: [PATCH 03/15] improved naming conventions for sectors --- inv.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inv.m b/inv.m index f324e0a..5bcd656 100644 --- a/inv.m +++ b/inv.m @@ -685,8 +685,8 @@ Do[matsize[scalar, i] = Length @ mat[scalar, i][[1]], {i, scalarnum}]; Do[matsize[s, i] = Length @ mat[s, i][[1]], {s, Keys[secs]}, {i, secs[s]}]; secname[unit] = secname[unit, 1] = "\"unit\""; - secname[scalar, id_] := TemplateApply["\"(scalar, `n`)\"", <|"n" -> id - 1|>]; - secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p`, `n`)\"", <|"r" -> r, "p" -> (1 - p)/2, "n" -> id - 1|>]; + secname[scalar, id_] := If[scalarnum > 1, TemplateApply["\"(scalar, `n`)\"", <|"n" -> id - 1|>], "\"scalar\""]; + secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p``n`)\"", <|"r" -> r, "p" -> If[p > 0, "even", "odd"], "n" -> If[secs[op[op, r, 1, p]] > 1, ", " <> ToString[id - 1], ""]|>]; secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; exts = DeleteDuplicates[#[[1]] & /@ keys[allopsForBoot]]; From 16aad97146bba24374595167c0b5e4fa0e91d630 Mon Sep 17 00:00:00 2001 From: selpo Date: Wed, 2 Oct 2019 18:29:03 +0900 Subject: [PATCH 04/15] parallelized --- tocpp.m | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/tocpp.m b/tocpp.m index 67aea75..6de1ebe 100644 --- a/tocpp.m +++ b/tocpp.m @@ -40,6 +40,7 @@ (* eqs: "{\nEq eq(boot, Odd);\neq.add(\"scalar;0\", 0, 0, ops[\"s\"], ext(\"e\", \"s\", \"e\", \"s\"));\neq.add(\"odd+\", ext(\"e\", \"s\", \"e\", \"s\"));\neq.add(\"odd-\", ext(\"e\", \"s\", \"e\", \"s\"));\nboot.add_equation(eq);\n}..." *) template = "#include +#include #include #include #include @@ -47,37 +48,33 @@ #include #include -#include \"bootstrap_equation.hpp\" -#include \"complex_function.hpp\" -#include \"context.hpp\" -#include \"matrix.hpp\" -#include \"polynomial_program.hpp\" -#include \"primary_op.hpp\" -#include \"real.hpp\" +#include \"qboot/qboot.hpp\" -using algebra::Vector; +namespace fs = qboot::fs; +namespace mp = qboot::mp; using mp::real, mp::rational, mp::parse; using qboot::Context, qboot::PolynomialProgram, qboot::BootstrapEquation, qboot::Sector; +using qboot::algebra::Vector; using std::array, std::map, std::set, std::move, std::vector, std::string, std::unique_ptr; -namespace fs = qboot::fs; template using dict = map>; using Op = qboot::PrimaryOperator; using Eq = qboot::Equation; constexpr auto ContinuousType = qboot::SectorType::Continuous; -constexpr auto Odd = algebra::FunctionSymmetry::Odd; -constexpr auto Even = algebra::FunctionSymmetry::Even; +constexpr auto Odd = qboot::algebra::FunctionSymmetry::Odd; +constexpr auto Even = qboot::algebra::FunctionSymmetry::Even; static string name(const dict& deltas); -static PolynomialProgram create(const Context& c, const dict& deltas, uint32_t numax, set spins); +static BootstrapEquation create(const Context& c, const dict& deltas, uint32_t numax, + const set& spins); string name(const dict& deltas) { return string(\"sdp-\") + `filename`; } -PolynomialProgram create(const Context& c, const dict& deltas, uint32_t numax, set spins) +BootstrapEquation create(const Context& c, const dict& deltas, uint32_t numax, const set& spins) { dict ops; `extops` @@ -117,9 +114,6 @@ PolynomialProgram create(const Context& c, const dict& deltas, uint32_ BootstrapEquation boot(c, secs, numax); `eqs` boot.finish(); - // to maximize (resp. minimize) OPE in \"hoge\" sector, - // call boot.ope_maximize(\"hoge\", \"unit\") (resp. ope_minimize) - return boot.find_contradiction(\"unit\"); } int main(int argc, char* argv[]) @@ -131,7 +125,8 @@ int main(int argc, char* argv[]) // lambda: controls the number of derivatives (z = x + sqrt(y), (der x) ^ m (der y) ^ n for m + 2 n <= lambda) // dim: the dimension of the physical space // numax: controls the number of poles picked in the gBlock (numax + min(spin, numax) / 2) - constexpr uint32_t n_Max = 400, lambda = 14, dim = 3, numax = 6; + // parallel: the number of internal threads + constexpr uint32_t n_Max = 400, lambda = 14, dim = 3, numax = 6, parallel = 8; // spins: spins for the continuous sectors set spins; for (uint32_t s = 0; s < 27; ++s) spins.insert(s); @@ -142,10 +137,13 @@ int main(int argc, char* argv[]) // external scalars `extdelta` args.release(); - Context c(n_Max, lambda, dim); - auto prob = create(c, deltas, numax, spins); + Context c(n_Max, lambda, dim, parallel); + auto boot = create(c, deltas, numax, spins); + // to maximize (resp. minimize) OPE in \"hoge\" sector, + // call boot.ope_maximize(\"hoge\", \"unit\", parallel) (resp. ope_minimize) + auto prob = boot.find_contradiction(\"unit\", parallel); auto dir = fs::current_path() / name(deltas); - move(prob).create_input().write(dir); + move(prob).create_input(parallel).write(dir, parallel); return 0; } " From 1748e0f515f1e8a3b38e4518b2a5e6666cd75d9b Mon Sep 17 00:00:00 2001 From: selpo Date: Wed, 2 Oct 2019 19:56:32 +0900 Subject: [PATCH 05/15] fixed typo --- tocpp.m | 1 + 1 file changed, 1 insertion(+) diff --git a/tocpp.m b/tocpp.m index 6de1ebe..3386ca1 100644 --- a/tocpp.m +++ b/tocpp.m @@ -114,6 +114,7 @@ BootstrapEquation create(const Context& c, const dict& deltas, uint32_ BootstrapEquation boot(c, secs, numax); `eqs` boot.finish(); + return boot; } int main(int argc, char* argv[]) From 06408d4c06ce8ca716c30bf5cbf57428ad2b6163 Mon Sep 17 00:00:00 2001 From: selpo Date: Fri, 7 Feb 2020 18:00:02 +0900 Subject: [PATCH 06/15] reflected updates in qboot (commit 8ced0952e3f5ff29829df5f5cd42ad3142d4b3fb of qboot), and updated ninv.m --- inv.m | 98 ++++++++++++++++--------------- ninv.m | 175 +++++++++++++++++++++++++++++++++++++++++--------------- tocpp.m | 7 ++- topy.m | 9 +-- 4 files changed, 192 insertions(+), 97 deletions(-) diff --git a/inv.m b/inv.m index 5bcd656..d9b1e61 100644 --- a/inv.m +++ b/inv.m @@ -166,7 +166,7 @@ l = Length[sol = NullSpace @ Expand @ eq[r, r, t]]; If[l == 0, Message[setOPE::imcmpt, r, r, t]; Return[]]; If[l != inv[{r, r}, {t}], Message[setOPE::diff, r, r, t, l, inv[{r, r}, {t}]]; Return[]]; - even = Select[simp @ Orthogonalize[simp[sym[#, +1] & /@ sol], simp[Conjugate[#1].#2] &], AnyTrue[#, simp @ # != 0 &] &]; + even = Select[simp @ Orthogonalize[simp[sym[#, 1] & /@ sol], simp[Conjugate[#1].#2] &], AnyTrue[#, simp @ # != 0 &] &]; odd = Select[simp @ Orthogonalize[simp[sym[#, -1] & /@ sol], simp[Conjugate[#1].#2] &], AnyTrue[#, simp @ # != 0 &] &]; l = Length[even]; myAbortProtect[ @@ -339,10 +339,10 @@ eqList[x_ == y_] := {x == y} eqList[True] = {} eqList[a_And] := List @@ a -sum[a_?NumericQ b_, x_op] := a sum[b, x] +sum[Times[a_?NumericQ, b_], x_op] := a sum[b, x] sum[a_Plus, x_op] := Plus @@ (sum[#, x] &) /@ List @@ a sum[0, x_op] := 0 -single[a_?NumericQ b_] := a single[b] +single[Times[a_?NumericQ, b_]] := a single[b] single[a_Plus] := Plus @@ single /@ List @@ a single[0] = 0 @@ -367,7 +367,7 @@ setOPE[o1 : op[_, _, -1, 1], o2 : op[_, _, 1 | -1, 1], o3 : op[_, t_, 1, 1 | -1]] /; ! isPseaudo[t] := setOPE[dualOp[o1], dualOp[o2], dualOp[o3]] setOPE[o1 : op[_, r_, 1, 1], o2 : op[_, _, -1, 1], o3 : op[_, t_, 1, 1 | -1]] /; ! isPseaudo[t] && ! isPseaudo[r] := setOPE[dualOp[o1], dualOp[o2], dualOp[o3]] setOPE[o1 : op[_, r_, 1 | -1, 1], o2 : op[_, s_, 1 | -1, 1], o3 : op[_, t_, 1 | -1, 1 | -1]] := - Module[{re, im, a, b, c, d, e, v, cnt, d1 = dualOp[o1], d2 = dualOp[o2], d3 = dualOp[o3], n, N = inv[r, s, t], sol, add, eq, ev0, res}, + Module[{re, im, a, b, c, d, cnt, n, N = inv[r, s, t], sol, add, eq, ev0, res}, add[x_] := Sow[Join[Array[D[x, re[#]] &, N], Array[D[x, im[#]] &, N]]]; a = Array[L[L[o1, o2, o3, #], re[#] + I im[#]] &, N]; b = flip12[a]; @@ -385,7 +385,7 @@ Scan[ev0, Keys[cnt]]; myAbortProtect @ Scan[ev, Keys[cnt]]] setOPES[o1 : op[_, r_, 1 | -1, 1], o2 : op[_, s_, 1 | -1, 1], o3 : op[_, t_, 1 | -1, 1]] := - Module[{re, im, eq, a123, b123, e, v, cnt, x, N = inv[r, s, t], a213, a132, a231, a312, a321, b213, b132, b231, b312, b321, sol, add, n, ev0, res}, + Module[{re, im, eq, a123, b123, cnt, x, N = inv[r, s, t], a213, a132, a231, a312, a321, b213, b132, b231, b312, b321, sol, add, n, ev0, res}, add[x_] := Sow[Join[Array[D[x, re[#]] &, N], Array[D[x, im[#]] &, N]]]; a123 = Array[L[L[o1, o2, o3, #], re[#] + I im[#]] &, N]; a312 = rotate[a123]; @@ -464,7 +464,7 @@ sign[-1, x_] := SuperMinus[x] extract2[a_Plus, o_] := extract2[#, o] & /@ a -extract2[x_?NumericQ y_, o_] := x extract2[y, o] +extract2[Times[x_?NumericQ, y_], o_] := x extract2[y, o] extract2[sum[x_, o_op], o_] := sum[x, o] extract2[sum[_, _op], _] := 0 extract2[x_single, unit | scalar] := x @@ -488,7 +488,7 @@ tmpsec = newSet[] tmpf[a_ + b_] := (tmpf[a]; tmpf[b];) -tmpf[a_?NumericQ b_] := (tmpf[b];) +tmpf[Times[a_?NumericQ, b_]] := (tmpf[b];) tmpf[sum[x_, o_op]] := add[tmpsec, o] sector[eqn[eq_List]] := Module[{pr}, clear[tmpsec]; @@ -591,7 +591,7 @@ TemplateApply["\\frac{`x``s`}{`y`}", <|"x" -> If[n == 1, "", " " <> numToTeX[n]], "y" -> numToTeX[d], "s" -> s|>] , r != 1, TemplateApply["`x` `s`", <|"x" -> numToTeX[r], "s" -> s|>] - , _, + , True, s]] termToTeX[1, sum[x_, op[op, rp_, 1, l_]]] := @@ -627,11 +627,11 @@ connectedComponents[eqn[_, z_]] := Module[{f, uf = newUF[]}, f[a_Plus] := Scan[f, a]; - f[x_?NumericQ y_] := f[y]; - f[sum[(_F | _H) a_ b_, _]] := unite[uf, a, b]; - f[sum[(_F | _H) a_^2, _]] := add[uf, a]; - f[single[(_Fp | _Hp) a_ b_]] := unite[uf, a, b]; - f[single[(_Fp | _Hp) a_^2]] := add[uf, a]; + f[Times[x_?NumericQ, y_]] := f[y]; + f[sum[Times[_F | _H, a_, b_], _]] := unite[uf, a, b]; + f[sum[Times[_F | _H, a_^2], _]] := add[uf, a]; + f[single[Times[_Fp | _Hp, a_, b_]]] := unite[uf, a, b]; + f[single[Times[_Fp | _Hp, a_^2]]] := add[uf, a]; Scan[f, z]; classify[uf]] @@ -641,36 +641,39 @@ ind[_] := 0; mat = Array[0&, {size, size}]; f[a_Plus] := Scan[f, a]; - f[x_?NumericQ y_] := f[x, y]; + f[Times[x_?NumericQ, y_]] := f[x, y]; f[x : _sum | _single] := f[1, x]; add[_, _, ___, 0, ___] := Null; add[c_, x_, n_, m_] := (mat[[n, m]] += c x / 2; mat[[m, n]] += c x / 2;); add[c_, x_, n_] := (mat[[n, n]] += c x;); - f[c_, sum[(x:_F | _H) a_ b_, _]] := add[c, x, ind[a], ind[b]]; - f[c_, sum[(x:_F | _H) a_^2, _]] := add[c, x, ind[a]]; - f[c_, single[(x:_Fp | _Hp) a_ b_]] := add[c, x, ind[a], ind[b]]; - f[c_, single[(x:_Fp | _Hp) a_^2]] := add[c, x, ind[a]]; + f[c_, sum[Times[x:_F | _H, a_, b_], _]] := add[c, x, ind[a], ind[b]]; + f[c_, sum[Times[x:_F | _H, a_^2], _]] := add[c, x, ind[a]]; + f[c_, single[Times[x:_Fp | _Hp, a_, b_]]] := add[c, x, ind[a], ind[b]]; + f[c_, single[Times[x:_Fp | _Hp, a_^2]]] := add[c, x, ind[a]]; f[z]; mat ] makeMat[z:eqn[_, eq_List]] := Module[{con = connectedComponents[z], c}, - If[Length[con] == 0, {{{# /. single[x_] :> x}} & /@ eq}, Table[makeMatHelper[#, c]& /@ eq, {c, con}]]] + If[Length[con] == 0, {{{1}, {{# /. single[x_] :> x}} & /@ eq}}, Table[{c, makeMatHelper[#, c]& /@ eq}, {c, con}]]] makeSDP[z:eqn[eq_List]] := Module[{mat, tmp, sec = sector[z], secs = <||>, scalnum, val = newSet[], f, s, i}, f[x_Plus] := f /@ x; f[0] = 0; - f[x_?NumericQ y_] := If[x > 0, add[val, x]; block[1, x, y], If[x != -1, add[val, -x]]; block[-1, -x, y]]; + f[Times[x_?NumericQ, y_]] := If[x > 0, add[val, x]; block[1, x, y], If[x != -1, add[val, -x]]; block[-1, -x, y]]; f[y_] := block[1, 1, y]; SetAttributes[f, Listable]; - mat[unit, 1] = f[makeMat[extract[z, unit]][[1]]]; + tmp = makeMat[extract[z, unit]][[1]]; + mat[unit, 1] = {tmp[[1]], f[tmp[[2]]]}; tmp = makeMat[extract[z, scalar]]; scalnum = Length[tmp]; - Do[mat[scalar, i] = f[tmp[[i]]], {i, scalnum}]; - Do[tmp = makeMat[extract[z, s]]; secs[s] = Length[tmp]; Do[mat[s, i] = f[tmp[[i]]], {i, secs[s]}];, {s, Drop[sec, 2]}]; + Do[mat[scalar, i] = {tmp[[i, 1]], f[tmp[[i, 2]]]}, {i, scalnum}]; + Do[tmp = makeMat[extract[z, s]]; secs[s] = Length[tmp]; Do[mat[s, i] = {tmp[[i, 1]], f[tmp[[i, 2]]]}, {i, secs[s]}];, {s, Drop[sec, 2]}]; sdpobj[secs, scalnum, keys[val], mat] ] +betaToString[1] = 1 +betaToString[\[Beta][a_, b_, c_][n_]] := TemplateApply["beta[`a`, `b`, `c`][`n`]", <|"a"->ToString@a[[1]], "b"->ToString@b[[1]], "c"->ToString@c[[1]], "n"->ToString[n]|>] toCString[F[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toCString[H[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toCString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; @@ -679,21 +682,21 @@ toCString[Hp[x_, y_, z_, w_, o_]] := TemplateApply["ops.at(\"`o`\"), ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w, "o"->o|>]; toQboot[sdpobj[secs_, scalarnum_, vals_, mat_]] := - Module[{s, v, o, revval = reverseIndex[vals], numeq = Length @ mat[unit, 1], secsStr, valsStr, filename, extdelta, exts, extops, scalarsecs, secname, matsize, terms, syms, n, i, e, r, c, f, regsym, eqStr, convert}, + Module[{s, v, revval = reverseIndex[vals], numeq = Length @ mat[unit, 1][[2]], secsStr, valsStr, filename, extdelta, exts, extops, scalarsecs, secname, matsize, terms, syms, n, i, e, r, c, f, regsym, eqStr, convert}, terms = ConstantArray[{}, numeq]; syms = ConstantArray[None, numeq]; - Do[matsize[scalar, i] = Length @ mat[scalar, i][[1]], {i, scalarnum}]; - Do[matsize[s, i] = Length @ mat[s, i][[1]], {s, Keys[secs]}, {i, secs[s]}]; + Do[matsize[scalar, i] = Length @ mat[scalar, i][[2, 1]], {i, scalarnum}]; + Do[matsize[s, i] = Length @ mat[s, i][[2, 1]], {s, Keys[secs]}, {i, secs[s]}]; secname[unit] = secname[unit, 1] = "\"unit\""; secname[scalar, id_] := If[scalarnum > 1, TemplateApply["\"(scalar, `n`)\"", <|"n" -> id - 1|>], "\"scalar\""]; secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p``n`)\"", <|"r" -> r, "p" -> If[p > 0, "even", "odd"], "n" -> If[secs[op[op, r, 1, p]] > 1, ", " <> ToString[id - 1], ""]|>]; - secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; + secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i], "opes" -> StringRiffle[betaToString /@ mat[s, i][[1]], ", "]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; - exts = DeleteDuplicates[#[[1]] & /@ keys[allopsForBoot]]; - filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str('#')", <|"k" -> #|>] & /@ exts, " + \"-\" + "]; - extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = parse(args[`i`]).value();", <|"i" -> #, "k" -> exts[[#]]|>] &, Length[exts]], "\n\t"]; - extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(real(deltas.at(\"`k`\")), 0, c));", <|"k" -> #|>] & /@ exts, "\n\t"]; - scalarsecs = StringRiffle[Array[TemplateApply["secs.emplace_back(`sec`, `s`);", <|"sec" -> secname[scalar, #], "s" -> matsize[scalar, #]|>] &, scalarnum], "\n\t"]; + exts = DeleteDuplicatesBy[keys[allopsForBoot], {#[[1]], #[[2]]} &]; + filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str('#')", <|"k" -> #[[1]]|>] & /@ exts, " + \"-\" + "]; + extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = parse(args[`i`]).value();", <|"i" -> #, "k" -> exts[[#, 1]]|>] &, Length[exts]], "\n\t"]; + extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(real(deltas.at(\"`k`\")), 0, c)); // `r`", <|"k" -> #[[1]], "r" -> #[[2]]|>] & /@ exts, "\n\t"]; + scalarsecs = StringRiffle[Array[TemplateApply["// {`opes`}\n\tsecs.emplace_back(`sec`, `s`);", <|"sec" -> secname[scalar, #], "s" -> matsize[scalar, #], "opes" -> StringRiffle[betaToString /@ mat[scalar, #][[1]], ", "]|>] &, scalarnum], "\n\t"]; regsym[e_, F] := (syms[[e]] = "Odd";); regsym[e_, H] := (syms[[e]] = "Even";); regsym[e_, Fp] := (syms[[e]] = "Odd";); @@ -713,9 +716,9 @@ f[s_, n_, e_, r_, c_, 0] := None; f[s_, n_, e_, r_, c_, x_Plus] := Scan[f[s, n, e, r, c, #] &, List @@ x]; f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]); - Do[f[unit, 1, e, 1, 1, mat[unit, 1][[e, 1, 1]]], {e, numeq}]; - Do[f[scalar, n, e, r, c, mat[scalar, n][[e, r, c]]], {n, scalarnum}, {e, numeq}, {r, matsize[scalar, n]}, {c, matsize[scalar, n]}]; - Do[f[s, n, e, r, c, mat[s, n][[e, r, c]]], {s, Keys[secs]}, {n, secs[s]}, {e, numeq}, {r, matsize[s, n]}, {c, matsize[s, n]}]; + Do[f[unit, 1, e, 1, 1, mat[unit, 1][[2, e, 1, 1]]], {e, numeq}]; + Do[f[scalar, n, e, r, c, mat[scalar, n][[2, e, r, c]]], {n, scalarnum}, {e, numeq}, {r, matsize[scalar, n]}, {c, matsize[scalar, n]}]; + Do[f[s, n, e, r, c, mat[s, n][[2, e, r, c]]], {s, Keys[secs]}, {n, secs[s]}, {e, numeq}, {r, matsize[s, n]}, {c, matsize[s, n]}]; eqStr = StringRiffle[Array[TemplateApply[eqTemplate, <|"sym" -> syms[[#]], "terms" -> StringRiffle[terms[[#]], "\n\t\t"]|>] &, numeq], "\n\t"]; ToCpp`createCpp[secsStr, scalarsecs, valsStr, Length[vals], eqStr, Length[exts] + 1, extops, extdelta, filename] ] @@ -727,6 +730,7 @@ }" secTemplate = "{ + // {`opes`} Sector s(`sec`, `sz`, ContinuousType); for (const auto& spin : spins) if (spin % 2 == `p`) s.add_op(spin); @@ -744,15 +748,16 @@ secs = <|op[op, rep[1], 1, 1] -> 3, ...|> scalarnum = 2 vals = {1/2, Sqrt[2], Pi, ...} -mat[sec, num] = {{{block[-1,Sqrt[2],F[e,v,e,v]]+block[1,Sqrt[3]/2,F[e,e,v,v]], ...}, ...}, ...} +mat[sec, num] = {{\[Beta][op[], op[], op[]][1], \[Beta][op[], op[], op[]][1]}, {{{block[-1,Sqrt[2],F[e,v,e,v]]+block[1,Sqrt[3]/2,F[e,e,v,v]], ...}, ...}, ...}} *) toCboot[sdpobj[secs_, scalarnum_, vals_, mat_]] := - Module[{s, v, o, revval = reverseIndex[vals], blk, f, convert, make, tmp, secsStr, valsStr, rmats, smats, umats, filename}, + Module[{s, v, revval = reverseIndex[vals], blk, f, convert, make, tmp, secsStr, valsStr, rmats, smats, umats, filename, opinfo}, secsStr = StringRiffle[TemplateApply["(\"`r`\", `p`): `n`", <|"r" -> #[[2]], "p" -> (1 - #[[4]])/2, "n" -> secs[#]|>] & /@ Keys[secs], ", "]; valsStr = tensorToString[vals, ToPython`pyeval]; rmats = newSet[]; smats = newSet[]; filename = StringRiffle[TemplateApply["{0[`k`]}", <|"k" -> #|>] & /@ DeleteDuplicates[#[[1]] & /@ keys[allopsForBoot]], "-"]; + opinfo = StringRiffle[TemplateApply["# `o`: `r`", <|"o" -> #[[1]], "r" -> #[[2]]|>] & /@ DeleteDuplicates[{#[[1]], #[[2]]} & /@ keys[allopsForBoot]], "\n"]; (* convert elements of mats into string. *) convert[0] = "0"; convert[block[1, 1, bl_]] := TemplateApply["bl[`i`]", <|"i" -> blk[bl]|>]; @@ -766,16 +771,17 @@ f[block[_, _, bl_]] := If[!KeyExistsQ[blk, bl], blk[bl] = Length[blk];]; make[m_, init_] := Module[{tmp = <||>}, Scan[(tmp[#] = init[#]) &, Keys[init]]; - blk = <||>; f[m]; + blk = <||>; f[m[[2]]]; tmp["bl"] = tensorToString[Keys[blk], toString]; - tmp["mats"] = If[Length[m[[1]]] != 1, tensorToString[m, convert], tensorToString[#[[1, 1]] & /@ m , convert]]; + tmp["opes"] = StringRiffle[betaToString /@ m[[1]], ", "]; + tmp["mats"] = If[Length[m[[2, 1]]] != 1, tensorToString[m[[2]], convert], tensorToString[#[[1, 1]] & /@ m[[2]], convert]]; tmp]; Do[add[rmats, make[mat[s, n], <|"r" -> s[[2]], "p" -> (1 - s[[4]])/2, "n" -> n - 1|>]], {s, Keys[secs]}, {n, secs[s]}]; Do[add[smats, make[mat[scalar, n], <|"n" -> n - 1|>]], {n, scalarnum}]; rmats = StringRiffle[TemplateApply[rmatstemplate, #] & /@ keys[rmats], "\n"]; smats = StringRiffle[TemplateApply[smatstemplate, #] & /@ keys[smats], "\n"]; umats = TemplateApply[umatstemplate, make[mat[unit, 1], <||>]]; - ToPython`createPython[secsStr, scalarnum, valsStr, rmats, smats, umats, filename] + ToPython`createPython[secsStr, scalarnum, valsStr, rmats, smats, umats, filename, opinfo] ] tensorToString[tensor_List, conv_] := "[" <> StringRiffle[tensorToString[#, conv] & /@ tensor, ", "] <> "]" @@ -783,10 +789,12 @@ rmatstemplate = " if sector == \"`r`\" and spin % 2 == `p` and num == `n`: bl = `bl` + # {`opes`} return `mats`" smatstemplate = " if num == `n`: bl = `bl` + # {`opes`} return `mats`" umatstemplate = "bl = `bl` @@ -800,11 +808,11 @@ add[a_, a_] := add[a]; add[a_, b_] := (vs[a] = 1; vs[b] = 1; es[Sort[{a, b}]] = 1); f[a_Plus] := Scan[f, List @@ a]; - f[_?NumericQ y_] := f[y]; - f[sum[(_F | _H) a_ b_, _]] := add[a, b]; - f[single[(_Fp | _Hp) a_ b_]] := add[a, b]; - f[sum[(_F | _H) a_^2, _]] := add[a, a]; - f[single[(_Fp | _Hp) a_^2]] := add[a, a]; + f[Times[_?NumericQ, y_]] := f[y]; + f[sum[Times[_F | _H, a_, b_], _]] := add[a, b]; + f[single[Times[_Fp | _Hp, a_, b_]]] := add[a, b]; + f[sum[Times[_F | _H, a_^2], _]] := add[a, a]; + f[single[Times[_Fp | _Hp, a_^2]]] := add[a, a]; Scan[f, eq]; Graph[Labeled[#, format[#]] & /@ Keys[vs], #[[1]] <-> #[[2]] & /@ Keys[es], PlotLabel -> ToString[label, StandardForm]]] diff --git a/ninv.m b/ninv.m index 79744f4..30273c9 100644 --- a/ninv.m +++ b/ninv.m @@ -1,6 +1,7 @@ (* Do not import this package directly. *) Needs["CommonFunctions`", "common.m"] Needs["ToPython`", "topy.m"] +Needs["ToCpp`", "tocpp.m"] NClebschGordan`clearCG[]; BeginPackage["NClebschGordan`"] @@ -78,17 +79,19 @@ makeMat::usage = "makeMat[eqn[sec,{a,b,...}]] gives a matrix-representation of extracted bootstrap equation eqn[sec,{a,b,...}]." makeSDP::usage = "makeSDP[eqn[{a,b,...}]] converts whole bootstrap equation eqn[{a,b,...}] into sdp-object." sdpobj::usage = "sdpobj[secs,scalarnum,vals,mats] is a sdp-object. secs is section data of bootstrap equation. scalarnum is the number of connected components in scalar sections. vals are real constants in bootstrap equation. mats are matrix-representation of bootstrap equation." +toQboot::usage = "toQboot[sdp] converts sdp-object into c++ code for qboot." toCboot::usage = "toCboot[sdp] converts sdp-object into python code for cboot." toTeX::usage = "toTeX[eq] gives latex string of eq (you need call Print[toTeX[eq]] to paste to your tex file). toTeX[eqn[{a,b,...}]] gives latex string of eq with align environment (you need call Print[toTeX[eq]] to paste to your tex file)." repToTeX::usage = "repToTeX[r] is needed to transrate irrep-object r as latex string. Please set appropriate value." -opToTeX::usage = "opToTeX[o] is needed to transrate operator object o as latex string. Please set appropriate value." +opToTeX::usage = "opToTeX[o] is needed to transrate operator name o as latex string. Please set appropriate value." Begin["`Private`"] setOPE::usage = "setOPE[r,s,t] calculates all values of ope[r,s,t]. setOPE[r,s] calls setOPE[r,s,t] for all t in prod[r,s]." setAllOPE::usage = "setAllOPE[reps] calls setOPE[r,s] and setOPE[t,dual[t],id] for all r,s in reps and t in prod[r,s]." +opToTeX2::usage = "opToTeX2[op[...]] is needed to transrate operator object op[...] as latex string." precision::usage = "precision represents internal precision for calculation." allPublicSymbol = {clearCG, inv, ope, cor, @@ -135,6 +138,7 @@ x:invs[r1_, r2_, r3_, r4_] := myAbortProtect[x = Module[{t = inv[r1, r2, r3, r4], s, n, m}, MyReap @ Do[Sow[{s, n, m}], {s, Keys[t]}, {n, t[s][[1]]}, {m, t[s][[2]]}]]] +(* eq[r,s,t] gives equations which Clebsch-Gordan coefficients {a,b/r,s|c/t} must satisfy. *) eq[r_, s_, t_] /; inv[{r, s}, {t}] > 0 := Module[{a, b, c, x, y, z, X, g, e, d1 = dim[r], d2 = dim[s], d3 = dim[t], d}, d = d1 d2 d3; @@ -164,7 +168,7 @@ l = Length[sol = NullSpace @ num @ eq[r, r, t]]; If[l == 0, Message[setOPE::imcmpt, r, r, t]; Return[]]; If[l != inv[{r, r}, {t}], Message[setOPE::diff, r, r, t, l, inv[{r, r}, {t}]]; Return[]]; - even = Select[num @ Orthogonalize[num @ sym[#, +1] & /@ sol, Conjugate[#1].#2 &], AnyTrue[#, # != 0 &] &]; + even = Select[num @ Orthogonalize[num @ sym[#, 1] & /@ sol, Conjugate[#1].#2 &], AnyTrue[#, # != 0 &] &]; odd = Select[num @ Orthogonalize[num @ sym[#, -1] & /@ sol, Conjugate[#1].#2 &], AnyTrue[#, # != 0 &] &]; l = Length[even]; myAbortProtect[ @@ -220,9 +224,14 @@ 1 <= n <= inv[{r1, r2}, {s}] && 1 <= m <= inv[r3, r4, s] := (setCor[r1, r2, r3, r4, s]; x) cor[_, _, _, _][_, _, _][_, _, _, _] := 0 +(* decompose invariant tensor f into linear combination of cor[r,s,t][n]. *) dec[r_, s_, t_][f_] := Module[{vec}, decPrep[r, s, t]; vec = Array[{f @@ bas[r, s, t][#]} &, inv[r, s, t]]; num @ Flatten[invmat[r, s, t].vec]] +(* decPrep[r,s,t] prepares bas[r,s,t][n] and invmat for dec. +dec could be done by just taking inner-product, but most of cor[r,s,t][n][a,b,c] are zero, we need decPrep for more efficiency. +bas[r,s,t] are sufficient components to distinguish invariant tensors. +mat is a matrix whose components are values of cor[r,s,t][n] evaluated at bas[r,s,t], and invmat is its inverse. *) x:decPrep[r_, s_, t_] /; inv[r, s, t] > 0 := x = Module[{n, f = cor[r, s, t], max = inv[r, s, t], mat, rev, new, old, sc, a, b, c, tmp, tmp2, res}, Do[If[f[1][a, b, c] != 0, res[1] = {a, b, c}; mat = {{num @ f[1][a, b, c]}}; rev = Inverse[mat]; Break[]] @@ -312,8 +321,8 @@ x:setOmega[r_, s_, t_] := x = Module[{n, m, l = inv[r, s, t], v, f, res}, Do[ - f[a_, b_, c_] := - num @ Sum[ope[dual[r]][a2, a] ope[dual[s]][b2, b] ope[dual[t]][c2, c] Conjugate[cor[dual[r], dual[s], dual[t]][m][a2, b2, c2]] + f[a_, b_, c_] := num @ + Sum[ope[dual[r]][a2, a] ope[dual[s]][b2, b] ope[dual[t]][c2, c] Conjugate[cor[dual[r], dual[s], dual[t]][m][a2, b2, c2]] , {a2, dim[r]}, {b2, dim[s]}, {c2, dim[t]}]; v = dec[r, s, t][f]; Do[res[n, m] = v[[n]], {n, l}] @@ -358,10 +367,10 @@ eqList[x_ == y_] := {x == y} eqList[True] = {} eqList[a_And] := List @@ a -sum[a_?NumericQ b_, x_op] := a sum[b, x] +sum[Times[a_?NumericQ, b_], x_op] := a sum[b, x] sum[a_Plus, x_op] := Plus @@ (sum[#, x] &) /@ List @@ a sum[0, x_op] := 0 -single[a_?NumericQ b_] := a single[b] +single[Times[a_?NumericQ, b_]] := a single[b] single[a_Plus] := Plus @@ single /@ List @@ a single[0] = 0 @@ -386,7 +395,7 @@ setOPE[o1 : op[_, _, -1, 1], o2 : op[_, _, 1 | -1, 1], o3 : op[_, t_, 1, 1 | -1]] /; ! isPseaudo[t] := setOPE[dualOp[o1], dualOp[o2], dualOp[o3]] setOPE[o1 : op[_, r_, 1, 1], o2 : op[_, _, -1, 1], o3 : op[_, t_, 1, 1 | -1]] /; ! isPseaudo[t] && ! isPseaudo[r] := setOPE[dualOp[o1], dualOp[o2], dualOp[o3]] setOPE[o1 : op[_, r_, 1 | -1, 1], o2 : op[_, s_, 1 | -1, 1], o3 : op[_, t_, 1 | -1, 1 | -1]] := - Module[{re, im, a, b, c, d, e, v, cnt, d1 = dualOp[o1], d2 = dualOp[o2], d3 = dualOp[o3], n, N = inv[r, s, t], sol, add, eq, ev0, res}, + Module[{re, im, a, b, c, d, cnt, n, N = inv[r, s, t], sol, add, eq, ev0, res}, add[x_] := Sow[Join[Array[D[x, re[#]] &, N], Array[D[x, im[#]] &, N]]]; a = Array[L[L[o1, o2, o3, #], re[#] + I im[#]] &, N]; b = flip12[a]; @@ -404,7 +413,7 @@ Scan[ev0, Keys[cnt]]; myAbortProtect @ Scan[ev, Keys[cnt]]] setOPES[o1 : op[_, r_, 1 | -1, 1], o2 : op[_, s_, 1 | -1, 1], o3 : op[_, t_, 1 | -1, 1]] := - Module[{re, im, eq, a123, b123, e, v, cnt, x, N = inv[r, s, t], a213, a132, a231, a312, a321, b213, b132, b231, b312, b321, sol, add, n, ev0, res}, + Module[{re, im, eq, a123, b123, cnt, x, N = inv[r, s, t], a213, a132, a231, a312, a321, b213, b132, b231, b312, b321, sol, add, n, ev0, res}, add[x_] := Sow[Join[Array[D[x, re[#]] &, N], Array[D[x, im[#]] &, N]]]; a123 = Array[L[L[o1, o2, o3, #], re[#] + I im[#]] &, N]; a312 = rotate[a123]; @@ -469,7 +478,7 @@ reduceBoot[x_ == y_] := {Expand[x - y]} reduceBoot[eq_And] := Module[{add, bls = <||>, ks, scan, scan2, mat = <||>, row, n, b, min = Infinity, max = 0}, scan[x_, n_] := scan2[#, n]& /@ x; - scan2[x_?NumericQ y_, n_] := (add[y]; mat[n][bls[y]] = x); + scan2[Times[x_?NumericQ, y_], n_] := (add[y]; mat[n][bls[y]] = x); add[x:(_sum|_single)] := If[!KeyExistsQ[bls, x], bls[x] = 1 + Length[bls]]; Do[mat[n] = <||>; scan[Expand[eq[[n, 1]] - eq[[n, 2]]], n], {n, Length[eq]}]; mat = Table[If[KeyExistsQ[mat[n], b], mat[n][b], 0], {n, Length[eq]}, {b, Length[bls]}]; @@ -497,7 +506,7 @@ sign[-1, x_] := SuperMinus[x] extract2[a_Plus, o_] := extract2[#, o] & /@ a -extract2[x_?NumericQ y_, o_] := x extract2[y, o] +extract2[Times[x_?NumericQ, y_], o_] := x extract2[y, o] extract2[sum[x_, o_op], o_] := sum[x, o] extract2[sum[_, _op], _] := 0 extract2[x_single, unit | scalar] := x @@ -521,7 +530,7 @@ tmpsec = newSet[] tmpf[a_ + b_] := (tmpf[a]; tmpf[b];) -tmpf[a_?NumericQ b_] := (tmpf[b];) +tmpf[Times[a_?NumericQ, b_]] := (tmpf[b];) tmpf[sum[x_, o_op]] := add[tmpsec, o] sector[eqn[eq_List]] := Module[{pr}, clear[tmpsec]; @@ -552,7 +561,7 @@ Hp[a_, b_, c_, d_, o_] /; lexComp[{c, d, a, b}, {a, b, c, d}] < 0 := Hp[c, d, a, b, o] addOp[o : op[x_, r_, 1 | -1, 1]] := myAbortProtect[allops[o] = 1; add[allopsForBoot, o]; If[!KeyExistsQ[allreps, r], allreps[r] = <|o->1|>, allreps[r][o] = 1]; - op[x] = op[x, r]; + If[Length[op[x]] == 1, op[x] = op[x, r]]; If[!KeyExistsQ[ord, x], ord[x] = Length[ord]];] setOps[ops_List] := myAbortProtect[allops = <|one->1|>; allreps = <|id-><|one->1|>|>; ord = <||>; allopsForBoot = newSet[]; Scan[(addOp[#]; addOp[dualOp[#]]) &, ops]] @@ -566,6 +575,9 @@ opToTeX[op] := "\\op{O}" +opToTeX2[op[x_, r_, p : 1 | -1, 1 | -1]] /; !isComplex[r] := TemplateApply[If[p > 0, "``", "\\overline{``}"], opToTeX[x]] +opToTeX2[op[x_, r_?isComplex, 1, 1 | -1]] := TemplateApply[If[r === minrep[r, dual[r]], "``", "\\overline{``}"], opToTeX[x]] + FtoTeX[F[a_, b_, c_, d_]] := TemplateApply[ "F^{`o1` `o2`,`o3` `o4`}_{-,\\op{O}}", @@ -595,11 +607,11 @@ \[Beta]toTeX[\[Beta][a_, b_, c_][n_]] := TemplateApply[ "\\lambda_{`o1` `o2` `o3`}^{(`n`)}", - <|"o1" -> opToTeX[a[[1]]], "o2" -> opToTeX[b[[1]]], "o3" -> opToTeX[c[[1]]], "n" -> numToTeX[n]|>] + <|"o1" -> opToTeX2[a], "o2" -> opToTeX2[b], "o3" -> opToTeX2[c], "n" -> numToTeX[n]|>] \[Beta]toTeX[\[Beta][a_, b_, c_][1]] := TemplateApply[ "\\lambda_{`o1` `o2` `o3`}", - <|"o1" -> opToTeX[a[[1]]], "o2" -> opToTeX[b[[1]]], "o3" -> opToTeX[c[[1]]]|>] + <|"o1" -> opToTeX2[a], "o2" -> opToTeX2[b], "o3" -> opToTeX2[c]|>] \[Beta]FtoTeX[(x : \[Beta][__][_]) (y : \[Beta][__][_]) (z_F | z_H | z_Fp | z_Hp)] := TemplateApply[ @@ -619,10 +631,10 @@ Which[ r[[0]] === Rational, n = Numerator[r]; d = Denominator[r]; - TemplateApply["\\frac{`x``s`}{`y`}", <|"x" -> If[n == 1, "", " "<>numToTeX[n]], "y" -> numToTeX[d], "s" -> s|>] + TemplateApply["\\frac{`x``s`}{`y`}", <|"x" -> If[n == 1, "", " " <> numToTeX[n]], "y" -> numToTeX[d], "s" -> s|>] , r != 1, TemplateApply["`x` `s`", <|"x" -> numToTeX[r], "s" -> s|>] - , _, + , True, s]] termToTeX[one_, sum[x_, op[op, rp_, 1, l_]]] /; num[Abs[one - 1]] < epsilon := @@ -658,11 +670,11 @@ connectedComponents[eqn[_, z_]] := Module[{f, uf = newUF[]}, f[a_Plus] := Scan[f, a]; - f[x_?NumericQ y_] := f[y]; - f[sum[(_F | _H) a_ b_, _]] := unite[uf, a, b]; - f[sum[(_F | _H) a_^2, _]] := add[uf, a]; - f[single[(_Fp | _Hp) a_ b_]] := unite[uf, a, b]; - f[single[(_Fp | _Hp) a_^2]] := add[uf, a]; + f[Times[x_?NumericQ, y_]] := f[y]; + f[sum[Times[_F | _H, a_, b_], _]] := unite[uf, a, b]; + f[sum[Times[_F | _H, a_^2], _]] := add[uf, a]; + f[single[Times[_Fp | _Hp, a_, b_]]] := unite[uf, a, b]; + f[single[Times[_Fp | _Hp, a_^2]]] := add[uf, a]; Scan[f, z]; classify[uf]] @@ -672,36 +684,103 @@ ind[_] := 0; mat = Array[0&, {size, size}]; f[a_Plus] := Scan[f, a]; - f[x_?NumericQ y_] := f[x, y]; + f[Times[x_?NumericQ, y_]] := f[x, y]; f[x : _sum | _single] := f[1, x]; add[_, _, ___, 0, ___] := Null; add[c_, x_, n_, m_] := (mat[[n, m]] += c x / 2; mat[[m, n]] += c x / 2;); add[c_, x_, n_] := (mat[[n, n]] += c x;); - f[c_, sum[(x:_F | _H) a_ b_, _]] := add[c, x, ind[a], ind[b]]; - f[c_, sum[(x:_F | _H) a_^2, _]] := add[c, x, ind[a]]; - f[c_, single[(x:_Fp | _Hp) a_ b_]] := add[c, x, ind[a], ind[b]]; - f[c_, single[(x:_Fp | _Hp) a_^2]] := add[c, x, ind[a]]; + f[c_, sum[Times[x:_F | _H, a_, b_], _]] := add[c, x, ind[a], ind[b]]; + f[c_, sum[Times[x:_F | _H, a_^2], _]] := add[c, x, ind[a]]; + f[c_, single[Times[x:_Fp | _Hp, a_, b_]]] := add[c, x, ind[a], ind[b]]; + f[c_, single[Times[x:_Fp | _Hp, a_^2]]] := add[c, x, ind[a]]; f[z]; - mat + N[mat, precision - 30] ] makeMat[z:eqn[_, eq_List]] := Module[{con = connectedComponents[z], c}, - If[Length[con] == 0, {{{# /. single[x_] :> x}} & /@ eq}, Table[makeMatHelper[#, c]& /@ eq, {c, con}]]] + If[Length[con] == 0, {{{1}, {{# /. single[x_] :> x}} & /@ eq}}, Table[{c, makeMatHelper[#, c]& /@ eq}, {c, con}]]] -makeSDP[z:eqn[eq_List]] := Module[{mat, tmp, sec = sector[z], secs = <||>, scalnum, val = newSet[], f, s, i}, +makeSDP[z:eqn[eq_List]] := Module[{mat, tmp, sec = sector[z], secs = <||>, scalnum, val = newSet[], f, s, i, add2}, + add2[x_] := If[num @ Abs[x - 1] >= 10^21 epsilon, add[val, x]]; f[x_Plus] := f /@ x; f[0] = 0; - f[x_?NumericQ y_] := If[x > 0, add[val, x]; block[1, x, y], add[val, -x]; block[-1, -x, y]]; + f[Times[x_?NumericQ, y_]] := If[x > 0, add2[x]; block[1, x, y], add2[-x]; block[-1, -x, y]]; f[y_] := block[1, 1, y]; SetAttributes[f, Listable]; - mat[unit, 1] = f[makeMat[extract[z, unit]][[1]]]; + tmp = makeMat[extract[z, unit]][[1]]; + mat[unit, 1] = {tmp[[1]], f[tmp[[2]]]}; tmp = makeMat[extract[z, scalar]]; scalnum = Length[tmp]; - Do[mat[scalar, i] = f[tmp[[i]]], {i, scalnum}]; - Do[tmp = makeMat[extract[z, s]]; secs[s] = Length[tmp]; Do[mat[s, i] = f[tmp[[i]]], {i, secs[s]}];, {s, Drop[sec, 2]}]; + Do[mat[scalar, i] = {tmp[[i, 1]], f[tmp[[i, 2]]]}, {i, scalnum}]; + Do[tmp = makeMat[extract[z, s]]; secs[s] = Length[tmp]; Do[mat[s, i] = {tmp[[i, 1]], f[tmp[[i, 2]]]}, {i, secs[s]}];, {s, Drop[sec, 2]}]; sdpobj[secs, scalnum, keys[val], mat] ] +betaToString[1] = 1 +betaToString[\[Beta][a_, b_, c_][n_]] := TemplateApply["beta[`a`, `b`, `c`][`n`]", <|"a"->ToString@a[[1]], "b"->ToString@b[[1]], "c"->ToString@c[[1]], "n"->ToString[n]|>] +toCString[F[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[H[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[Hp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; +toCString[Fp[x_, y_, z_, w_, o_]] := TemplateApply["ops.at(\"`o`\"), ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w, "o"->o|>]; +toCString[Hp[x_, y_, z_, w_, o_]] := TemplateApply["ops.at(\"`o`\"), ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w, "o"->o|>]; + +toQboot[sdpobj[secs_, scalarnum_, vals_, mat_]] := + Module[{s, v, revval = reverseIndex[vals], numeq = Length @ mat[unit, 1][[2]], secsStr, valsStr, filename, extdelta, exts, extops, scalarsecs, secname, matsize, terms, syms, n, i, e, r, c, f, regsym, eqStr, convert}, + terms = ConstantArray[{}, numeq]; + syms = ConstantArray[None, numeq]; + Do[matsize[scalar, i] = Length @ mat[scalar, i][[2, 1]], {i, scalarnum}]; + Do[matsize[s, i] = Length @ mat[s, i][[2, 1]], {s, Keys[secs]}, {i, secs[s]}]; + secname[unit] = secname[unit, 1] = "\"unit\""; + secname[scalar, id_] := If[scalarnum > 1, TemplateApply["\"(scalar, `n`)\"", <|"n" -> id - 1|>], "\"scalar\""]; + secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p``n`)\"", <|"r" -> r, "p" -> If[p > 0, "even", "odd"], "n" -> If[secs[op[op, r, 1, p]] > 1, ", " <> ToString[id - 1], ""]|>]; + secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i], "opes" -> StringRiffle[betaToString /@ mat[s, i][[1]], ", "]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; + valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; + exts = DeleteDuplicatesBy[keys[allopsForBoot], {#[[1]], #[[2]]} &]; + filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str('#')", <|"k" -> #[[1]]|>] & /@ exts, " + \"-\" + "]; + extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = parse(args[`i`]).value();", <|"i" -> #, "k" -> exts[[#, 1]]|>] &, Length[exts]], "\n\t"]; + extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(real(deltas.at(\"`k`\")), 0, c)); // `r`", <|"k" -> #[[1]], "r" -> #[[2]]|>] & /@ exts, "\n\t"]; + scalarsecs = StringRiffle[Array[TemplateApply["// {`opes`}\n\tsecs.emplace_back(`sec`, `s`);", <|"sec" -> secname[scalar, #], "s" -> matsize[scalar, #], "opes" -> StringRiffle[betaToString /@ mat[scalar, #][[1]], ", "]|>] &, scalarnum], "\n\t"]; + regsym[e_, F] := (syms[[e]] = "Odd";); + regsym[e_, H] := (syms[[e]] = "Even";); + regsym[e_, Fp] := (syms[[e]] = "Odd";); + regsym[e_, Hp] := (syms[[e]] = "Even";); + (* diagonal *) + convert[0, block[1, one_, bl_]] /; num[Abs[one - 1]] < 10^21 epsilon := toCString[bl]; + convert[0, block[-1, one_, bl_]] /; num[Abs[one - 1]] < 10^21 epsilon := TemplateApply["real(-1), `bl`", <|"bl" -> toCString[bl]|>]; + convert[0, block[1, v_, bl_]] := TemplateApply["val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + convert[0, block[-1, v_, bl_]] := TemplateApply["-val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + (* off-diagonal *) + convert[1, block[1, one_, bl_]] /; num[Abs[one - 1]] < 10^21 epsilon := TemplateApply["real(2), `bl`", <|"bl" -> toCString[bl]|>]; + convert[1, block[-1, one_, bl_]] /; num[Abs[one - 1]] < 10^21 epsilon := TemplateApply["real(-2), `bl`", <|"bl" -> toCString[bl]|>]; + convert[1, block[1, v_, bl_]] := TemplateApply["2 * val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + convert[1, block[-1, v_, bl_]] := TemplateApply["-2 * val[`i`], `bl`", <|"i" -> revval[v], "bl" -> toCString[bl]|>]; + convert[s_, r_, r_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> r - 1, "block" -> convert[0, x]|>]; + convert[s_, r_, c_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> c - 1, "block" -> convert[1, x]|>]; + f[s_, n_, e_, r_, c_, 0] := None; + f[s_, n_, e_, r_, c_, x_Plus] := Scan[f[s, n, e, r, c, #] &, List @@ x]; + f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]); + Do[f[unit, 1, e, 1, 1, mat[unit, 1][[2, e, 1, 1]]], {e, numeq}]; + Do[f[scalar, n, e, r, c, mat[scalar, n][[2, e, r, c]]], {n, scalarnum}, {e, numeq}, {r, matsize[scalar, n]}, {c, r, matsize[scalar, n]}]; + Do[f[s, n, e, r, c, mat[s, n][[2, e, r, c]]], {s, Keys[secs]}, {n, secs[s]}, {e, numeq}, {r, matsize[s, n]}, {c, r, matsize[s, n]}]; + eqStr = StringRiffle[Array[TemplateApply[eqTemplate, <|"sym" -> syms[[#]], "terms" -> StringRiffle[terms[[#]], "\n\t\t"]|>] &, numeq], "\n\t"]; + ToCpp`createCpp[secsStr, scalarsecs, valsStr, Length[vals], eqStr, Length[exts] + 1, extops, extdelta, filename] + ] + +eqTemplate = "{ + Eq eq(boot, `sym`); + `terms` + boot.add_equation(eq); + }" + +secTemplate = "{ + // {`opes`} + Sector s(`sec`, `sz`, ContinuousType); + for (const auto& spin : spins) + if (spin % 2 == `p`) s.add_op(spin); + secs.push_back(s); + }" + toString[F[x_, y_, z_, w_]] := TemplateApply["get(F, \"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toString[H[x_, y_, z_, w_]] := TemplateApply["get(H, \"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["get(F, \"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; @@ -713,36 +792,40 @@ secs = <|op[op, rep[1], 1, 1] -> 3, ...|> scalarnum = 2 vals = {1/2, Sqrt[2], Pi, ...} -mat[sec, num] = {{{block[-1,Sqrt[2],F[e,v,e,v]]+block[1,Sqrt[3]/2,F[e,e,v,v]], ...}, ...}, ...} +mat[sec, num] = {{\[Beta][op[], op[], op[]][1], \[Beta][op[], op[], op[]][1]}, {{{block[-1,Sqrt[2],F[e,v,e,v]]+block[1,Sqrt[3]/2,F[e,e,v,v]], ...}, ...}, ...}} *) toCboot[sdpobj[secs_, scalarnum_, vals_, mat_]] := - Module[{s, v, o, revval = reverseIndex[vals], blk, f, convert, make, tmp, secsStr, valsStr, rmats, smats, umats, filename}, + Module[{s, v, revval = reverseIndex[vals], blk, f, convert, make, tmp, secsStr, valsStr, rmats, smats, umats, filename, opinfo}, secsStr = StringRiffle[TemplateApply["(\"`r`\", `p`): `n`", <|"r" -> #[[2]], "p" -> (1 - #[[4]])/2, "n" -> secs[#]|>] & /@ Keys[secs], ", "]; valsStr = tensorToString[vals, ToPython`pyeval]; rmats = newSet[]; smats = newSet[]; filename = StringRiffle[TemplateApply["{0[`k`]}", <|"k" -> #|>] & /@ DeleteDuplicates[#[[1]] & /@ keys[allopsForBoot]], "-"]; + opinfo = StringRiffle[TemplateApply["# `o`: `r`", <|"o" -> #[[1]], "r" -> #[[2]]|>] & /@ DeleteDuplicates[{#[[1]], #[[2]]} & /@ keys[allopsForBoot]], "\n"]; + (* convert elements of mats into string. *) convert[0] = "0"; - convert[block[1, 1, bl_]] := TemplateApply["bl[`i`]", <|"i" -> blk[bl]|>]; - convert[block[-1, 1, bl_]] := TemplateApply["-bl[`i`]", <|"i" -> blk[bl]|>]; + convert[block[1, one_, bl_]] /; num[Abs[one - 1]] < 10^21 epsilon := TemplateApply["bl[`i`]", <|"i" -> blk[bl]|>]; + convert[block[-1, one_, bl_]] /; num[Abs[one - 1]] < 10^21 epsilon := TemplateApply["-bl[`i`]", <|"i" -> blk[bl]|>]; convert[block[1, v_, bl_]] := TemplateApply["val[`j`] * bl[`i`]", <|"i" -> blk[bl], "j" -> revval[v]|>]; convert[block[-1, v_, bl_]] := TemplateApply["-val[`j`] * bl[`i`]", <|"i" -> blk[bl], "j" -> revval[v]|>]; convert[x_Plus] := Module[{lx = List @@ x}, convert[lx[[1]]] <> StringJoin[Table[If[y[[1]] > 0, " + " <> convert[y], " - " <> convert[block[1, y[[2]], y[[3]]]]], {y, Rest[lx]}]]]; + (* assign indices to block *) f[x_List] := Scan[f, x]; f[x_Plus] := Scan[f, List @@ x]; f[block[_, _, bl_]] := If[!KeyExistsQ[blk, bl], blk[bl] = Length[blk];]; make[m_, init_] := Module[{tmp = <||>}, Scan[(tmp[#] = init[#]) &, Keys[init]]; - blk = <||>; f[m]; + blk = <||>; f[m[[2]]]; tmp["bl"] = tensorToString[Keys[blk], toString]; - tmp["mats"] = If[Length[m[[1]]] != 1, tensorToString[m, convert], tensorToString[#[[1, 1]] & /@ m , convert]]; + tmp["opes"] = StringRiffle[betaToString /@ m[[1]], ", "]; + tmp["mats"] = If[Length[m[[2, 1]]] != 1, tensorToString[m[[2]], convert], tensorToString[#[[1, 1]] & /@ m[[2]], convert]]; tmp]; Do[add[rmats, make[mat[s, n], <|"r" -> s[[2]], "p" -> (1 - s[[4]])/2, "n" -> n - 1|>]], {s, Keys[secs]}, {n, secs[s]}]; Do[add[smats, make[mat[scalar, n], <|"n" -> n - 1|>]], {n, scalarnum}]; rmats = StringRiffle[TemplateApply[rmatstemplate, #] & /@ keys[rmats], "\n"]; smats = StringRiffle[TemplateApply[smatstemplate, #] & /@ keys[smats], "\n"]; umats = TemplateApply[umatstemplate, make[mat[unit, 1], <||>]]; - ToPython`createPython[secsStr, scalarnum, valsStr, rmats, smats, umats, filename] + ToPython`createPython[secsStr, scalarnum, valsStr, rmats, smats, umats, filename, opinfo] ] tensorToString[tensor_List, conv_] := "[" <> StringRiffle[tensorToString[#, conv] & /@ tensor, ", "] <> "]" @@ -750,10 +833,12 @@ rmatstemplate = " if sector == \"`r`\" and spin % 2 == `p` and num == `n`: bl = `bl` + # {`opes`} return `mats`" smatstemplate = " if num == `n`: bl = `bl` + # {`opes`} return `mats`" umatstemplate = "bl = `bl` @@ -767,11 +852,11 @@ add[a_, a_] := add[a]; add[a_, b_] := (vs[a] = 1; vs[b] = 1; es[Sort[{a, b}]] = 1); f[a_Plus] := Scan[f, List @@ a]; - f[_?NumericQ y_] := f[y]; - f[sum[(_F | _H) a_ b_, _]] := add[a, b]; - f[single[(_Fp | _Hp) a_ b_]] := add[a, b]; - f[sum[(_F | _H) a_^2, _]] := add[a, a]; - f[single[(_Fp | _Hp) a_^2]] := add[a, a]; + f[Times[_?NumericQ, y_]] := f[y]; + f[sum[Times[_F | _H, a_, b_], _]] := add[a, b]; + f[single[Times[_Fp | _Hp, a_, b_]]] := add[a, b]; + f[sum[Times[_F | _H, a_^2], _]] := add[a, a]; + f[single[Times[_Fp | _Hp, a_^2]]] := add[a, a]; Scan[f, eq]; Graph[Labeled[#, format[#]] & /@ Keys[vs], #[[1]] <-> #[[2]] & /@ Keys[es], PlotLabel -> ToString[label, StandardForm]]] diff --git a/tocpp.m b/tocpp.m index 3386ca1..80eb27d 100644 --- a/tocpp.m +++ b/tocpp.m @@ -25,7 +25,7 @@ cppeval[Pi] = "mp::const_pi()"; cppeval[E] = cppeval[Exp[1]]; cppeval[x_?ExactNumberQ] := TemplateApply["real(\"``\")", ToString @ FortranForm @ N[x, 400]] -cppeval[x_?NumberQ] := TemplateApply["real(\"``\")", ToString @ FortranForm[x]] +cppeval[x_?NumberQ] := Module[{r = Rationalize[x, 0]}, If[Abs[Denominator[r]] + Abs[Numerator[r]] < 10000, cppeval[r], TemplateApply["real(\"``\")", ToString @ FortranForm[x]]]] createCpp[secs_, scalarsecs_, vals_, numval_, eqs_, numext_, extops_, extdelta_, filename_] := TemplateApply[template, <|"secs"->secs, "scalarsecs"->scalarsecs, "vals"->vals, "numval"->numval, "eqs"->eqs, "numext"->numext, "extops"->extops, "extdelta"->extdelta, "filename"->filename|>] @@ -141,8 +141,9 @@ int main(int argc, char* argv[]) Context c(n_Max, lambda, dim, parallel); auto boot = create(c, deltas, numax, spins); // to maximize (resp. minimize) OPE in \"hoge\" sector, - // call boot.ope_maximize(\"hoge\", \"unit\", parallel) (resp. ope_minimize) - auto prob = boot.find_contradiction(\"unit\", parallel); + // replace the first argument from qboot::FindContradiction(...) + // to qboot::ExtremalOPE(true (resp. false), \"hoge\", \"unit\") + auto prob = boot.convert(qboot::FindContradiction(\"unit\"), parallel); auto dir = fs::current_path() / name(deltas); move(prob).create_input(parallel).write(dir, parallel); return 0; diff --git a/topy.m b/topy.m index 097ce6f..e425e25 100644 --- a/topy.m +++ b/topy.m @@ -1,7 +1,7 @@ BeginPackage["ToPython`"] pyeval::usage = "pyeval[x]" -createPython::usage = "createPython[secs,scalarnum,vals,rmats,smats,umats,filename]" +createPython::usage = "createPython[secs,scalarnum,vals,rmats,smats,umats,filename,opinfo]" Begin["`Private`"] @@ -48,10 +48,10 @@ pyeval[Log[b_, a_]] := TemplateApply["log(``, ``)", {pyeval[a], pyeval[b]}] pyeval[I] = "I"; pyeval[x_?ExactNumberQ] := TemplateApply["context(\"``\")", ToString @ FortranForm @ N[x, 300]] -pyeval[x_?NumberQ] := TemplateApply["context(\"``\")", ToString @ FortranForm[x]] +pyeval[x_?NumberQ] := Module[{r = Rationalize[x, 0]}, If[Abs[Denominator[r]] + Abs[Numerator[r]] < 10000, pyeval[r], TemplateApply["context(\"``\")", ToString @ FortranForm[x]]]] -createPython[secs_, scalarnum_, vals_, rmats_, smats_, umats_, filename_] := - TemplateApply[template, <|"secs"->secs, "scalarnum"->scalarnum, "vals"->vals, "rmats"->rmats, "smats"->smats, "umats"->umats, "filename"->filename|>] +createPython[secs_, scalarnum_, vals_, rmats_, smats_, umats_, filename_, opinfo_] := + TemplateApply[template, <|"secs"->secs, "scalarnum"->scalarnum, "vals"->vals, "rmats"->rmats, "smats"->smats, "umats"->umats, "filename"->filename, "opinfo"->opinfo|>] template = "# -*- coding: utf-8 -*- from __future__ import print_function @@ -66,6 +66,7 @@ context = cb.context_for_scalar(epsilon=0.5, Lambda=15, Prec=800) spins = list(range(27)) + [49, 50] nu_max = 14 +`opinfo` # {(r, s): d, ...} means operators in irrep r and spin s must have Delta >= d. mygap = {} def gaps(deltas): From fdea0360ea86cddc7d5e192ccaecca67130ec464 Mon Sep 17 00:00:00 2001 From: selpo Date: Fri, 7 Feb 2020 19:19:36 +0900 Subject: [PATCH 07/15] represent dual of op by ~op --- inv.m | 6 ++++-- ninv.m | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/inv.m b/inv.m index d9b1e61..f7467d7 100644 --- a/inv.m +++ b/inv.m @@ -673,7 +673,9 @@ ] betaToString[1] = 1 -betaToString[\[Beta][a_, b_, c_][n_]] := TemplateApply["beta[`a`, `b`, `c`][`n`]", <|"a"->ToString@a[[1]], "b"->ToString@b[[1]], "c"->ToString@c[[1]], "n"->ToString[n]|>] +betaToString[op[x_, r_, p : 1 | -1, 1 | -1]] /; !isComplex[r] := TemplateApply["`sg``x`", <|"sg"->If[p > 0, "", "~"], "x"->ToString@x|>] +betaToString[op[x_, r_?isComplex, 1, 1 | -1]] := TemplateApply["`sg``x`", <|"sg"->If[r === minrep[r, dual[r]], "", "~"], "x"->ToString@x|>] +betaToString[\[Beta][a_, b_, c_][n_]] := TemplateApply["beta[`a`, `b`, `c`][`n`]", <|"a"->betaToString@a, "b"->betaToString@b, "c"->betaToString@c, "n"->ToString[n]|>] toCString[F[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toCString[H[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toCString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; @@ -692,7 +694,7 @@ secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p``n`)\"", <|"r" -> r, "p" -> If[p > 0, "even", "odd"], "n" -> If[secs[op[op, r, 1, p]] > 1, ", " <> ToString[id - 1], ""]|>]; secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i], "opes" -> StringRiffle[betaToString /@ mat[s, i][[1]], ", "]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; - exts = DeleteDuplicatesBy[keys[allopsForBoot], {#[[1]], #[[2]]} &]; + exts = DeleteDuplicatesBy[Select[keys[allopsForBoot], #[[2]] === minrep[#[[2]], dual[#[[2]]]] && #[[3]] > 0 &], {#[[1]], #[[2]]} &]; filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str('#')", <|"k" -> #[[1]]|>] & /@ exts, " + \"-\" + "]; extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = parse(args[`i`]).value();", <|"i" -> #, "k" -> exts[[#, 1]]|>] &, Length[exts]], "\n\t"]; extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(real(deltas.at(\"`k`\")), 0, c)); // `r`", <|"k" -> #[[1]], "r" -> #[[2]]|>] & /@ exts, "\n\t"]; diff --git a/ninv.m b/ninv.m index 30273c9..3183a1c 100644 --- a/ninv.m +++ b/ninv.m @@ -716,8 +716,9 @@ sdpobj[secs, scalnum, keys[val], mat] ] -betaToString[1] = 1 -betaToString[\[Beta][a_, b_, c_][n_]] := TemplateApply["beta[`a`, `b`, `c`][`n`]", <|"a"->ToString@a[[1]], "b"->ToString@b[[1]], "c"->ToString@c[[1]], "n"->ToString[n]|>] +betaToString[op[x_, r_, p : 1 | -1, 1 | -1]] /; !isComplex[r] := TemplateApply["`sg``x`", <|"sg"->If[p > 0, "", "~"], "x"->ToString@x|>] +betaToString[op[x_, r_?isComplex, 1, 1 | -1]] := TemplateApply["`sg``x`", <|"sg"->If[r === minrep[r, dual[r]], "", "~"], "x"->ToString@x|>] +betaToString[\[Beta][a_, b_, c_][n_]] := TemplateApply["beta[`a`, `b`, `c`][`n`]", <|"a"->betaToString@a, "b"->betaToString@b, "c"->betaToString@c, "n"->ToString[n]|>] toCString[F[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toCString[H[x_, y_, z_, w_]] := TemplateApply["ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; toCString[Fp[x_, y_, z_, w_, 0]] := TemplateApply["one, ext(\"`x`\", \"`y`\", \"`z`\", \"`w`\")", <|"x"->x, "y"->y, "z"->z, "w"->w|>]; @@ -736,7 +737,7 @@ secname[op[op, r_, 1, p_], id_] := TemplateApply["\"(`r`, `p``n`)\"", <|"r" -> r, "p" -> If[p > 0, "even", "odd"], "n" -> If[secs[op[op, r, 1, p]] > 1, ", " <> ToString[id - 1], ""]|>]; secsStr = StringRiffle[Flatten[Function[s, Array[Function[i, TemplateApply[secTemplate, <|"sec" -> secname[s, i], "p" -> (1 - s[[4]])/2, "sz" -> matsize[s, i], "opes" -> StringRiffle[betaToString /@ mat[s, i][[1]], ", "]|>]], secs[s]]] /@ Keys[secs]], "\n\t"]; valsStr = StringRiffle[Array[TemplateApply["val[`i`] = `v`;", <|"i" -> # - 1, "v" -> ToCpp`cppeval @ vals[[#]]|>] &, Length[vals]], "\n\t"]; - exts = DeleteDuplicatesBy[keys[allopsForBoot], {#[[1]], #[[2]]} &]; + exts = DeleteDuplicatesBy[Select[keys[allopsForBoot], #[[2]] === minrep[#[[2]], dual[#[[2]]]] && #[[3]] > 0 &], {#[[1]], #[[2]]} &]; filename = StringRiffle[TemplateApply["deltas.at(\"`k`\").str('#')", <|"k" -> #[[1]]|>] & /@ exts, " + \"-\" + "]; extdelta = StringRiffle[Array[TemplateApply["deltas[\"`k`\"] = parse(args[`i`]).value();", <|"i" -> #, "k" -> exts[[#, 1]]|>] &, Length[exts]], "\n\t"]; extops = StringRiffle[TemplateApply["ops.emplace(\"`k`\", Op(real(deltas.at(\"`k`\")), 0, c)); // `r`", <|"k" -> #[[1]], "r" -> #[[2]]|>] & /@ exts, "\n\t"]; From 9c41c17b7bf7e7f5f9f769b58115328646172fef Mon Sep 17 00:00:00 2001 From: selpo Date: Sun, 9 Feb 2020 17:41:03 +0900 Subject: [PATCH 08/15] reflected updates in qboot v.0.8.1 --- tocpp.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tocpp.m b/tocpp.m index 80eb27d..2ab8965 100644 --- a/tocpp.m +++ b/tocpp.m @@ -127,7 +127,8 @@ int main(int argc, char* argv[]) // dim: the dimension of the physical space // numax: controls the number of poles picked in the gBlock (numax + min(spin, numax) / 2) // parallel: the number of internal threads - constexpr uint32_t n_Max = 400, lambda = 14, dim = 3, numax = 6, parallel = 8; + constexpr uint32_t n_Max = 400, lambda = 14, numax = 6, parallel = 8; + const rational dim(\"3\"); // spins: spins for the continuous sectors set spins; for (uint32_t s = 0; s < 27; ++s) spins.insert(s); From 5f530aaebccca09d164f395b14f58a1728af7d11 Mon Sep 17 00:00:00 2001 From: selpo Date: Tue, 9 Jun 2020 19:53:07 +0900 Subject: [PATCH 09/15] added a link to my thesis --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5212721..24658f0 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ Automatical Generator of Conformal Bootstrap Equation For more information, see -[autoboot: A generator of bootstrap equations with global symmetry](https://arxiv.org/abs/1903.10522). +[autoboot: A generator of bootstrap equations with global symmetry](https://arxiv.org/abs/1903.10522), +or [An Automated Generation of Bootstrap Equations for Numerical Study of Critical Phenomena](https://arxiv.org/abs/2006.04173). Some usages also can be checked by typing `?someSymbolName` (for example, `?getGroup`) in [Mathematica](http://reference.wolfram.com/language/tutorial/GettingInformationAboutWolframLanguageObjects.html). ``?somePackageName`*`` (for example, ``?ClebschGordan`*``) will give package-lebel information. From 1999b3c76ab62bafe4f9372ef731c3e27971caf9 Mon Sep 17 00:00:00 2001 From: selpo Date: Sat, 19 Sep 2020 17:33:47 +0900 Subject: [PATCH 10/15] fixed a bug --- inv.m | 2 +- ninv.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inv.m b/inv.m index f7467d7..e233fe6 100644 --- a/inv.m +++ b/inv.m @@ -717,7 +717,7 @@ convert[s_, r_, c_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> c - 1, "block" -> convert[1, x]|>]; f[s_, n_, e_, r_, c_, 0] := None; f[s_, n_, e_, r_, c_, x_Plus] := Scan[f[s, n, e, r, c, #] &, List @@ x]; - f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]); + f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; If[r <= c, AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]]); Do[f[unit, 1, e, 1, 1, mat[unit, 1][[2, e, 1, 1]]], {e, numeq}]; Do[f[scalar, n, e, r, c, mat[scalar, n][[2, e, r, c]]], {n, scalarnum}, {e, numeq}, {r, matsize[scalar, n]}, {c, matsize[scalar, n]}]; Do[f[s, n, e, r, c, mat[s, n][[2, e, r, c]]], {s, Keys[secs]}, {n, secs[s]}, {e, numeq}, {r, matsize[s, n]}, {c, matsize[s, n]}]; diff --git a/ninv.m b/ninv.m index 3183a1c..ef988dc 100644 --- a/ninv.m +++ b/ninv.m @@ -760,7 +760,7 @@ convert[s_, r_, c_, x_] := TemplateApply["eq.add(`sec`, `r`, `c`, `block`);", <|"sec" -> s, "r" -> r - 1, "c" -> c - 1, "block" -> convert[1, x]|>]; f[s_, n_, e_, r_, c_, 0] := None; f[s_, n_, e_, r_, c_, x_Plus] := Scan[f[s, n, e, r, c, #] &, List @@ x]; - f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]); + f[s_, n_, e_, r_, c_, x_] := (regsym[e, x[[3, 0]]]; If[r <= c, AppendTo[terms[[e]], convert[secname[s, n], r, c, x]]]); Do[f[unit, 1, e, 1, 1, mat[unit, 1][[2, e, 1, 1]]], {e, numeq}]; Do[f[scalar, n, e, r, c, mat[scalar, n][[2, e, r, c]]], {n, scalarnum}, {e, numeq}, {r, matsize[scalar, n]}, {c, r, matsize[scalar, n]}]; Do[f[s, n, e, r, c, mat[s, n][[2, e, r, c]]], {s, Keys[secs]}, {n, secs[s]}, {e, numeq}, {r, matsize[s, n]}, {c, r, matsize[s, n]}]; From ee35678e0026b23e53ff6d14f344d4d05d9f5726 Mon Sep 17 00:00:00 2001 From: selpo Date: Sun, 25 Oct 2020 11:45:15 +0900 Subject: [PATCH 11/15] create documents from usages in inv.m --- doc/inv.md | 281 ++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/inv.pdf | Bin 0 -> 59507 bytes inv.m | 4 +- ninv.m | 4 +- 4 files changed, 285 insertions(+), 4 deletions(-) create mode 100644 doc/inv.md create mode 100644 doc/inv.pdf diff --git a/doc/inv.md b/doc/inv.md new file mode 100644 index 0000000..2030ca9 --- /dev/null +++ b/doc/inv.md @@ -0,0 +1,281 @@ +# inv.m + +Do not import this package directly. `inv.m` memoise many values automatically and is imported or cleared by `group.m`. + +- [Symmetry](#symmetry) +- [Clebsch-Gordan Coefficients](#clebsch-gordan-coefficients) +- [Symmetries of CG Coefficients](#symmetries-of-cg-coefficients) +- [Conformal Blocks](#conformal-blocks) +- [OPE Coefficients](#ope-coefficients) +- [Bootstrap Equations](#bootstrap-equations) +- [Conversions of Bootstrap Equations](#conversions-of-bootstrap-equations) + +--- + +## Symmetry + +### `symmetryGroup` + +`symmetryGroup` represents the global symmetry of CFT. + +### `clearCG` + +`clearCG[]` clears all values calculated by this package. + +--- + +## Clebsch-Gordan Coefficients + +### irrep-object + +An irrep-object `r` is a symbol such that `symmetryGroup[isrep[r]]` is True. +We use `r,s,t,r1,r2,...` to denote irrep-objects, and `id` is the irrep-object of the trivial irrep. +`a,b,c,a1,a2,...` are indices of irreps. An index `a` of irrep `r` must sutisfy `1 <= a <= symmetryGroup[dim[r]]`. +`n,m` represents multiplicity of Clebsch-Gordan coefficients. +For more information, please refer to [`arXiv:1903.10522`](https://arxiv.org/abs/1903.10522). + +### `inv` + +`inv[r,s,t]` gives multiplicity of `id` in decomposition of `r \[TensorProduct] s \[TensorProduct] t`. + +`inv[{r,s},{t}]` gives multiplicity of `t` in decomposition of `r \[TensorProduct] s`. + +`inv[r1,r2,r3,r4]` gives an association +whose key is a irrep `s` such that `inv[{r1,r2},{s}]>0` and `inv[r3,r4,s]>0`, +whose value is a list `{inv[{r1,r2},{s}], inv[r3,r4,s]}`. + +### `invs` + +`invs[r1,r2,r3,r4]` gives a list of `{s,n,m}` such that `cor[r1,r2,r3,r4][s,n,m]` is defined. + +### `ope` + +`ope[r,s,t][n][a,b,c]` gives Clebsch-Gordan coefficient defined by +`|r,a\[RightAngleBracket] \[TensorProduct] |s,b\[RightAngleBracket] = \[Sum] ope[r,s,t][n][a,b,c] |t,c,n\[RightAngleBracket]`. + +`ope[r][a,b]` gives `Sqrt[dim[r]] ope[r,dual[r],id][1][a,b,1]`. + +### `cor` + +`cor[r,s,t][n][a,b,c]` gives `\[Sum] ope[r,s,dual[t]][n][a,b,c2] ope[dual[t]][c2,c] / Sqrt[dim[t]]`. + +`cor[r1,r2,r3,r4][s,n,m][a1,a2,a3,a4]` gives`\[Sum] cor[r1,r2,dual[s]][n][a1,a2,b] ope[r3,r4,dual[s]][a3,a4,b].` + +--- + +## Symmetries of CG Coefficients + +### `\[Sigma]` + +`\[Sigma][r,s,t][n]` gives the sign change in swap between `r` and `s` in `cor`, +i.e. `cor[r,s,t][n][a,b,c] = \[Sigma][r,s,t][n] cor[s,r,t][n][b,a,c]`. + +`\[Sigma][r]` gives `\[Sigma][r,dual[r],id]`. + +`\[Sigma][op[x,r,p,q]]` gives `p`. + +### `\[Tau]` + +`\[Tau][r,s,t][n,m]` describes the behavior of `cor` under cyclic permutation of `r,s,t`, +i.e. `cor[s,t,r][m][b,c,a] = \[Sum] cor[r,s,t][n][a,b,c] \[Tau][r,s,t][n,m]`. + +### `\[Omega]` + +`\[Omega][r,s,t][n,m]` describes the behavior of `cor` under complex conjugate, +i.e. `\[Sum] ope[dual[r]][a2,a] ope[dual[s]][b2,b] ope[dual[t]][c2,c] cor[dual[r],dual[s],dual[t]][m][a2,b2,c2]\[Conjugate] = \[Sum] cor[r,s,t][n][a,b,c] \[Omega][r,s,t][n,m]`. + +### `six` + +`six[r1,r2,r3,r4][s,n,m,t,k,l]` describes the behavior of `cor` under swap between `r2` and `r4`, +i.e. `cor[r1,r4,r3,r2][t,k,l][a1,a4,a3,a2] = \[Sum] cor[r1,r2,r3,r4][s,n,m][a1,a2,a3,a4] six[r1,r2,r3,r4][s,n,m,t,k,l]`. + +### `isReal` + +`isReal[r]` gives whether `r` is a real representation or not. + +### `isComplex` + +`isComplex[r]` gives whether `r` is a complex representation or not. + +### `isPseaudo` + +`isPseaudo[r]` gives whether `r` is a pseaudo real representation or not. + +--- + +## Conformal Blocks + +### `op` + +`op[x,r,p,q]` represents a primary operator object O whose name is `x`, which belongs to irrep `r`, +which sign (=`\[Sigma][O]`) is `p` and whose parity of spin is `q` (=`±1`). +If O appears in summation, we use 'op' as its name. + +`op[x,r]` is a short-hand for `op[x,r,1,1]`. + +`op[x]` is a short-hand for `op[x,r,1,1]` if you registered `op[x,r,1,1]` as a fundamental scalar. + +### `dualOp` + +`dualOp[op[x,r,p,q]]` gives dual operator object of `op[x,r,p,q]`. + +### `format` + +`format[eq]` gives readable format of `eq` with little loss of information. +We need much redundancy to calculate properly, so formatted value cannot be used for any argument of our function. +`format[eq]` is assumed to be used only for human-readability of last output. + +### `sum` + +`sum[x,op[op,r,1,q]]` represents sum of `x` over all intermediate primary operator `O=op[op,r,1,q]` +which belongs to irrep `r` and whose parity of spin is `q`. +`sum[...]` is automatically expanded so as `x` to be `(F or H)*\[Beta]^2`. + +### `single` + +`single[x]` represents `x`. We need to wrap `x` for redundancy. +`single[...]` is automatically expanded so as `x` to be `(Fp or Hp)*\[Beta]^2`, or `(Fp or Hp)`. + +### `F` + +`F[o1,o2,o3,o4,s,p]` represents generalized conformal block `F_{p,s}^{1,2,3,4}`, where `o1,...,o4` are primary scalars. + +`F[a,b,c,d]` represents normal conformal block of type-F. + +### `H` + +`H[a,b,c,d]` represents normal conformal block of type-H. + +### `Fp` + +`Fp[o1,o2,o3,o4,o]` represents generalized conformal block `F_{o}^{1,2,3,4}`, where `o1,...,o4` and intermediate `o` are primary scalars. + +`Fp[a,b,c,d,o]` represents normal conformal block of type-F with intermediate `o`. + +### `Hp` + +`Hp[a,b,c,d,o]` represents normal conformal block of type-H with intermediate `o`. + +--- + +## OPE Coefficients + +### `\[Lambda]` + +`\[Lambda][o1,o2,o3][n]` gives `n`-th OPE coefficient of `o1\[Times]o2 \[Rule] OverBar[o3]`. + +### `\[Alpha]` + +`\[Alpha][o1,o2,o3][n]` gives `n`-th coefficient of three-point function `\[LeftAngleBracket]o1 o2 o3\[RightAngleBracket]`. + +### `\[Mu]` + +`\[Mu][o1,o2,o3][n]` gives n-th OPE coefficient of `o1\[Times]o2 \[Rule] OverBar[o3]`, where `o3` is registered as a fundamental scalar. + +### `\[Nu]` + +`\[Nu][o1,o2,o3][n]` gives `n`-th coefficient of three-point function `\[LeftAngleBracket]o1 o2 o3\[RightAngleBracket]`, +where `o3` is registered as a fundamental scalar." + +### `\[Beta]` + +`\[Beta][o1,o2,o3][n]` gives minimal basis to describe `\[Lambda]`, `\[Alpha]`, etc. + +`\[Lambda]`, `\[Alpha]`, `\[Mu]` and `\[Nu]` are linear combination of `\[Beta]`. + +--- + +## Bootstrap Equations + +### `eqn` + +`eqn[{a,b,...}]` represents bootstrap equation that claims `a,b,...` must equals to `0`, +where `a,b,...` are real-linear combination of sum and single. + +`eqn[sec,{a,b,...}]` represents extracted part of `eqn[{...}]` which contains only `sum` or `single` related to `sec`. + +### `bootAll` + +`bootAll[ops]` generates bootstrap equation from all four-point functions of `ops`. + +`bootAll[]` generates bootstrap equation from all four-point functions of fundamental scalars. + +### `setOps` + +`setOps[ops]` registers `ops` and duals of `ops` as fundamental scalars. + +Fundamental scalars are used to seperate sum of conformal blocks over scalars to `single[...]` and `sum[...]`. + +### `one` + +`one` represents the unit operator. This is implicitly registered as a fundamental scalar. + +### `extract` + +`extract[x,op[op,r,1,p]]` extracts terms of the form `sum[...,op[op,r,1,p]]` from `x`. + +`extract[x,scalar]` extracts terms of the form `single[(Fp or Hp)*\[Beta]^2]` from `x`. + +`extract[x,unit]` extracts terms of the form `single[Fp or Hp]` from `x` (contribution of the unit operator). + +`extract` is a projection: +`x == extract[x,unit] + extract[x,scalar] + \[Sum]_{r,p} extract[x,op[op,r,1,p]]` and `extract[x,sec] == extract[extract[x,sec]]`. + +### `unit` + +`unit` is a option for `extract` and means contribution of unit operator. + +### `scalar` + +`scalar` is a option for `extract` and means contribution of fundamental scalars but unit operator. + +### `sector` + +`sector[eq]` gives a list of all nontrivial option `sec` for extract applied to `eq`, i.e. `{sec | extract[eq,sec] != 0}`. + +--- + +## Conversions of Bootstrap Equations + +### `makeG` + +`makeG[eqn[sec,{a,b,...}]]` gives an undirected graph +whose vertices are OPE coefficients `\[Beta]` in extracted bootstrap equation `eqn[sec,{a,b,...}]`. + +### `makeMat` + +`makeMat[eqn[sec,{a,b,...}]]` gives a matrix-representation of extracted bootstrap equation `eqn[sec,{a,b,...}]`. + +### `makeSDP` + +`makeSDP[eqn[{a,b,...}]]` converts whole bootstrap equation `eqn[{a,b,...}]` into sdp-object. + +### `sdpobj` + +`sdpobj[secs,scalarnum,vals,mats]` is a sdp-object. +`secs` is section data of bootstrap equation. +`scalarnum` is the number of connected components in scalar sections. +`vals` are real constants in bootstrap equation. +`mats` are matrix-representation of bootstrap equation. + +### `toQboot` + +`toQboot[sdp]` converts sdp-object into `c++` code for `qboot`. + +### `toCboot` + +`toCboot[sdp]` converts sdp-object into `python` code for `cboot`. + +### `toTeX` + +`toTeX[eq]` gives `LaTeX` string of `eq` (you need call `Print[toTeX[eq]]` to paste to your `tex` file). + +`toTeX[eqn[{a,b,...}]]` gives `LaTeX` string of `eq` with `align` environment (you need call `Print[toTeX[eq]]` to paste to your `tex` file). + +### `repToTeX` + +`repToTeX[r]` is needed to transrate irrep-object `r` as `LaTeX` string. Please set appropriate value. + +### `opToTeX` + +`opToTeX[o]` is needed to transrate operator name `o` as `LaTeX` string. Please set appropriate value. diff --git a/doc/inv.pdf b/doc/inv.pdf new file mode 100644 index 0000000000000000000000000000000000000000..450321e7908dde529e948a82b2b106034f5e367c GIT binary patch literal 59507 zcmdSAWmp|ay9J5|cY*|WcXxMpf(6;QvvJqp7F>f%(BSS8Ah=6_;O=gBXJ*cs`R0>* zpL@=q!_(~QuCBLxy{oF;>aMOup)4-Rz{1E5PcePCzX8ue%uH-=Yz5EH&m`sqFap{; z5mSp3R~LSi5md{#MI)vtjw&; zEX=GN%&hFJEG%@)%v7KaR8GO(^gkC76od!Znf`*n_9qk*BVrbKCQ$`qCPjNETO*r4 z3vvBfNZrE$K+Gg!XJ-$DXHs)92L5&|Z)s-@&m>9A4zjm*G6g}`Wd_+W>%%jt0!)C! zx@;^U?|FE5xQJP~IT<-Qd3d;q*_qiGxj>m*#B9vWj65u$JWzQNVh}5T+{FY4au#$O zVkQk$8Tem6#MBl*po23n6O)mXyQM3my^}eUk+Cxq3lHdGEX*9NtTck4zyI=%`+p3a zi&$n3IQtk^L7)Vip#j-<$zuaxwG#?hOdJIKUZ5%;fB0YYPB6dHe~2=YJCf z7x(W>5wkM0GqQ4kP=WmZMdyD5FtGs`JDXTAn1d?9$d19p9$;o>X<`Ym13LeSiRD-I z{Luvee^%*VnBipogBey9Rz?seu0N{yzcKwmiY36A!QPC)#Qfi(`b)?7pQB>u_=74I z4t8QrPUgS!WN&BoTRUekwy`&{{wq1G|C{8nf*Q;3&4!(ukqg8QJKNuyjJ*Tk-x2bc z?)g6_1XMY{^)g}>PEKM@R<6GhVr*{@bOt&ZIWPbmU5tKpy}xq8{=dix2M_0eH5fK- zVonz3zY$_$Z|4eda{h(jS9|%-z&QQ{CTVE{1jQaENgGgr6bG2tn*!jOaQB;VVrg%A$1|FsiyI5n0!P+5`JY~dj|T!;w5z7J zV{?dJZi+`b<4!mU&J0H(5xEu=4EIi}g!G5|i8=+nZ$Gs^J)H8tm%quYXJKDpO3T}u zbP9+SY!~ppJz(6wxIsWpyr0H~td>BUH0-(?Sx)(QnlyFtab(#Zg~|Sneu91rb>u3d zPv`P1ZF`zW!%WK)^sBGm1g{M_&;i@gGD=D#4K`ySyPPrO)bh@$e(kaBAgbjK>_pmS z0sl;>E}1cwxSMtebDHJ{wahoXvyu%JFN;}i3Ab@skLa9WtIzfv7AS>|&TE)fh8X7_ zYV0|KUDiY+K7`mz?G?ar+pFX31Ge0$lGt99AFU~#&tXI*oBa=MOzfVFv6m5R;~{Ph zPjA6T0SF&f0M3N|>dojGQlS#EyIe{1yfWBtpiFPy4$LQU?M73i%~|okq9Rt!>!NSxJ0)U{UPwqta=zYhDq9ZKM%VN641QaD~y7nAHW;1-)ER=rr4DNBz^PqZwvGZS$F=-^C* zSn0G4CEF&uEt;o0hjkoD_wpYB1B*|x0-asAL}YI~a?#N6%X!hHRKJt%ED$@611A(7 z$6Mx%wXEM!CT57~bpf>Vt+C~+NlYMyElJDXoW(c#>2)wwr<2rndzDw;dq;`&X{)o9 z6NlK4icnawMk%ObOD}h07BHrwD>Mv$fG?OVBqD|mpBa=B7r~2WSOt^mgNkwpoEfbY z|D;U{S2iNS7YN5yJAJ`?wC2=<_a=)0`Rz{jrfkF_S=@DZ{II7r3B&bB&3H2Nmu?%5 zT`&^qZx^yqaHZVzIum@D9U|FtfUN5v#`1SoP=YW z0%k@_f}+7AWDSxdLK3Dmi@$kReCu9r+^XllR8@-9!V%( zFm?%+@fLYc4KLr3U$n_au@#DuHeAnTYo&M;Y(<2{!BQ-rW}sc4E(>LM#lG~L*sfM? zh!hB34`!e+Aha8{^dw4FvK1~Vj5QaXaR-4G%~paUZ_ES5jwZS7qXp>LQIaB0p+vj@ zD=Cb3S0HVmM4U`c9sRoiX&r!yIN@)!MiXQI9s|(qwVdyRVJ{U2kR)Ddx!y8N^ z_}cfQnqIQnq{EqaIJQ)v6kbj|>%%vTPtbEgiIj#1;K^aU1%l$KYD9Txrd|G^laAje zcB)e+5t|a<1rw!0r-aG`Tc`0{qtPR1VfDZjpID)e*<*jeyP|~{X6zzAf?AE@g80ND zOD@FIJPA$di6!I6K`Rzfr9snM-(@{v)Qdwk#)uG^*{WU#L&gwEE zUUxN;+_GPGpjfRPJNiO3z9I!$Tbgn}(!S>BO#YQn9Us|#EivhC*_9E$Nj2k;RiGF4>ebVh>DJSeWH(8!fbM2Xnyk>f%$43P>el)_x>B3?iEu=g=)R zKz45kTC7Q_*ui(`?TvURIM%dbP2kvvM1;L^W>ngU8qGMU%AoQFbnuMWsTEqselpjeE!b=(5=wZn`=mxAI@! z{FJmP)RCodN;krL8)h3z$5gA{k7a0>{tX+zpx+!y!mMQz{`CWFIfZWCIBdTIgH6VzqDQSXzp zKd7F_d*0V!rCSFuaEyY1Sx;&%jB0*D=7uOFO(l=%Q{{omW-JoG54Y@&hdtb(==lNq z4_YuXOo#=`WgWkss+g(k!zM9+j!GyIN^N@ChA8^om<0 zK}OX7mv^wiSru}==g2OH=w_JXiw}xdKioudU@+hDkXG=fk)q(_OoJQv1v}3{~RB zY#kB!Iha0`Y5z>FQxyV2k zU4gQ3M8f)-VbM0fKGyPv*#Aw=bN;v!kX)Kj$7(RXlF&Y3Fh$hX538gZpRMJ10{3x@ zq{B1k#k%Sy{Q_lmhDz{f3ZIJX20z0mg2%|$2L|$rikAqOH_hM}SD!_}TzS`?xIQEV z;=1P_I%P7iw_wn3sTI@*l@fSQ#mg@Fz;_BIJe~_jh-K?}VgC%eQU9>-Jov>NAJXj2 zY+aA~F<4$7?`q63+OZS|zGB;2fOrK<+C^Xmke9hW_cl`n`78dVGu=*0dN-mw;?WN= zn`W;OTZp2o&r*|0OpdrC!*Gg*OTrW9gpMa~%bnHL3DPn&tRky$S4j2>vfi=`EEIk5 zTZCABn-76h8A8`s``K8fJtv{P|4EkuA;`}tJ@sqPuv^I*GB`q?%kVs~@2l?^EsMME zMYu}%_T9m?@HImrP~}76M*n(p*Y`QERX%L5M*pG;Sp!NP2q)#H?7eX^3fgg)%qXe! zb_bazMaace)9;(#8ozZ^7?OrBXPs73HDtlfMrvm@G|{MQg&qt`pE71v2_5w`mG*>P zcaKq`O69cTmC;>OysU3OW)JT*hhhQrTL_691^3rBxArS>&@b(Y+XEP}420T-RiB4xA}TA#`GP)jO>LDK_wE}aHtlgG`E9W1yo~OD zgO-$ci?F&p)cx;mGOV7}F_hoCXFJ_Zju)d+pIxS6XUmV=j(e!|jPHj??|(1Cr_Bmd zq6rjVhUTY@rf``7(?Y;xIe9)R>mJHX$^MuqZeP7OD8R2$C036qSvf)!@vSwN+ipF= zQR+HV2^Z;vd03R|+bg|j+pOyQYh9X``;<60*g>WEWl5lwSjq58(N{H&lftHu7#D!5 zOaBzd5q*_n9qA;z1V`0R&bFRa+w$oK*qZGa`c)}W*KmruOJDkZ`hqYjYMGi!Iqwc3 zBHg9FXkY#1;%A{S`dC~^aS!PET?Wg*#ja^i&xB_`wz7m}y&o)aX{UG^yKXAg8wWgh zV?Jcv-REUrwPva3V}CyE7lnPk?e!4r!f(UI6f4rG#a&~qOg1_Oh;32FQp_GA&wedS z;T^1X7%n}!ZC<9!0L!U{-7F8eR19R)<$}y-?6lQE?{#;kgdB)h;sEMDSqbZ`DZk~? zoAG^5BqE{!pj-2R-j@5cE4u`c9m zCi_@zz0e-XJuX0rj_5IGP3n#T{Mc0cHs@<>7uHt(V^|i9pG#2u!z66(XkPWWA@W|z znMalhVXO9*K#n5C%%|`+|?QtfxMy!dpYHO1qXX^Ao?{e^v4U} zAJbnff0^3)Pj8Pb+^pRH@b>s_IbxIZO2BYqx5vt59xYKcA??U{L|Ewasy?-iQR6F$ zK+8zXwss9$EgOmW-1Un61uA3t>pN;+!MFo7auSZKw=IxoT zAm=+cehX=m&RtNCZ#*rH!>uJvYv<3br!z$HRJ$x#S2jxoH60}l{gZQ_n;;Qpk(26{xl<*5`Jbatp@b?hkJ$?i?{Q`|gxa%S+*!A>L=Z+eFSv6a&;V%JkTYY9%46tYW#v%!g0+vFCwov?dEe}`q)a`ou5 z#|zKKK7bYCmMhuFYZVI!Ij3J82a+8C9kXoHQKdpQ4;^J!>k(zXtYE9N>ulUC9{nx<7km>o?q zibf9szTlZ87&@670Y$LLt#Xv?=P0Ibgku@VL^!k@EJ-cW?Y-%B|~RUJC&TtCUpy#wpDl8&R>;B z8e=sc)g3F`zX~soghhG?tu<&oYS$~>PDJR6S&(Z;S{iWOkmjIfQg0yX2|B4T&8fO; z`p)M0j;gtmyV&A(QP>K3^&i%wj-A&Fha6uj5IVaeeR+$fiH7ryS|wq_l{W*3ZS@89 z3@SMTXD4T$TH=hPLt$TZK|y<~w9L&pTvV2NjuKioxcqo0&O&E+ryUo)V`C@P4za70 z*|0eIDEnlnocNyr570Gx>#^{IWB`5vnf9{ z9==$(MmMIEX8it3jAJ&nj>+4#CPui$m^5;U-tY@Xt2$f1>OpcA66sWBCL=r7koRSn z4O+@yUQjjSQv2jT3!W;P2aRP$gEJ!MzH|5zRt+5G@TBRg)eij7N}9_}g@LrlMXD%s z5AT(GRC$xPk*DG6JF<}2GZK1d;2a61=2 zle)Nt78n3qh~|&fpFcbLVGk1$aj7dQ2*r|wgl|YlWwv)iZ!Nin z?g{XM8NsrR$^b-6f*^%A2dbpMT0DEyo#g4oewj91sqle+95UGkU)P{7hB8j7A|D<4 z5pft=$n2Zc=Ul>Y(4@ZVc2Gx7Tin06%EVkrfA_t>4E&@%g+mMQ5@>>C(o(16^37KL zc)lb?n+MW626b^y30SZ){&V+7pP;PuPiwglAj*Z?z|K>d%j!}&?eeDW93&G~dt84D zy~{XXDeqoj@!g|0%3?ES_!0Ec?QROQ;UMmhy|?U~iB!!BS|%oCb$Zjwvz-Oam=h}S_ys` zOHwLhl2+1a?Z~UkXdhB?0CWgD_Wmd|;)rGF(@8cwwQQ+K&Nop&SkeOO_!bJL%8Ay3&Zy%T?g|Rw+%UG*HbjEY@SYE^3Lpl zp(%c}O}%f}PxWq`kt+`0jgF^aalVWXzZM4q5C6qj`sY(3yBxF3 ziR!afHQ^kSQ<&M z@WUOOXvvaKP!vq(gc=2)=bc* z&KTsad`lHEKk)aX8mk}t()&f`n759|IfLRh{ou|K*TQTf5kD)L$bhhnl5w0t)6I%b zm9|R0sG&N2qNo>3tAs>o{y2?ye3`v{+{YrGqTu2>@d5t$T%THXWG&=MfW#~toxQdW zMK=>l{!rt7&U!C(3=`ObGOm%j;hehv{J<*zQ*ROm+gU6ZJESnlJ#-Bc+hld*RLvc% zmcjrCuH4~@@ngu$cbzoVl=;>@#5>6?O-O6hB4{!I(d~-?(^Bl1=h#$iIyain$PPn4 zqnRse9Y%KhNQ2pwTMrwYGfLFyHV@Xj2%n3&xg&47arI%={HAy|Bmzl_syZ|D%v6`& zas4PBfUdyKEG7y+Mut$_f_NK8rQSG4a~38d90#>2<5%`@ZYaHy&52ztKF|g32z2YA7J*T~l6MPbcXEvdr$IrtX!3AIfx>J@+ zV%XAX^2ThYZEu_HvblKW1GHIB@wxNhmg!>jJ9Gmhv)&}3-b5Phks{Qj=oJVbkOL9H z6zHAQ>4z3@9B53LlA@#4X?C14OC>$sKUVLDn%lS+m1I4K(_3?M=qG+4xYh*jr4!P* zqv}gMH)D3u`Cs(~zw^q8xmb?wVX!ISmk1r67_TX(Sjry=NXTxgf&iV3G zB@`uUE;&5na1U2#N9(e6%%TUpXFIzrk#lzr3h>e`PA{yo+6fdOR|x*O?4x>H6gv~Iawl~fOT8%Jd1ns>*`yCJ zYCMi5ae&=#CVH+!w__ea2%mb_ucVbz_WJeq&J!^u{dF2s!;}>pSK%XopOOze@#DNa ziZaR6nM?^k<)f|q645cO>X?HnG9}-AhtRO}T&8Nnfu`WH72_cE2{I~8n0!kpQ9GG7 zWf^}Q!D=0UB9FO1cPBmYZ5WwXJKDdPky5WDSY2w*Uw2mlfnoVsaH3eBA$rfq&aERx zOL9g})m+r|WFb%+y%vGon@n_WhwZ&!v1QSAQnLzb~2`0TY& z$w06V-vYLtmtjSn20nQfoT~jit?C-3OGe9$!cOHuZ!(}=&TAD1tEM!wGcCGwr&o@< zwqJQEbSV$kZiaHrGndNj%x_|=l+NXDb0&XaLQE3n-VU*{)+du^jZaV^?cSJ(GGR`+ zx!+Z7k=Nv0h7R7Y?gbrb$H0pwdv>yLGvzLLv!Spm1qn1^_T^TN+a$Cd z^}&hjpV^0pbQYM*@mJeVuuZmpDgUPrYz~JJy*B6wU6jI)B%@z?fo(RR=l+G}U zMw36cqum^%jAGJ7tjLhKi6V2{@3&oK69709o0_SWK&Lp>NX-#)f9SlDllflJ{5s&i z#ZVib`@?h!#rTsGj)FHo{FKb5P=EsEg4|CMlr(u*=6ci?CSuE8@fZ$3UxXAPHD%#r z^*mwoqg@ze-iZ_^iNpKIwVRdCiO}&<6wITe4uE@85#2>W#xI`?gBlY2<-aHDoUmWr!q=| zSy#cTp*-k6Trx#|%4g(H9&F>tM?9{hd5D$oO;|oDO{ka-v(F2QN!8HN!jCurQ{`R` z*YhURu;X&wge6OVrrFFdYmR)bB+cJys9ro*i2N>#l?#)p0a#8;J%3%>a3-f%9ZeJc z;_run4^|8BOv2tC%7hY3I`jwwoH>Ov=RaS4Ss3axYkhC=b_7PeY_sSKxc0mZTiw|! z$t$?iNa>eG%# z*<)MWlViC}r}!!Qy|6w@jmHNR31Pqjg)DI7UoHn9X?}R$yL&zwC=zwTSPguG6NXhf z5_9kInRge{KP6JKXX0+&KZitvf9fVL2f&o8e8RHwd;&fsIWwOY4f-je#0HTl8X#>X zgu?mxIF)R5^?7rqe0);O8K(mK{*=d|xIf3k0+%bT-lGk}{xw1_bS>Mv&04b45eAWM zMUaW7o2rl@hMekYMpQAqfi8Srh;^wUHnm1mUS2l zFQOp%5@`&=t?!ug*0)P=gQnZkReTCe=eGbUn9tM19B@r@#0+ZocteF(vN!nW5uEma=V9ry9ci3=r*GmaEr$j~L; zp;dSl8SZih;ohOxlb}zRKwRjsvH5ecb|GGAbG&r~e^NN;^|G~b{t>5i_&|T9C1v!9 zwTU2O9oA+F%-JT;K13lTq*5P_EWwjm5oIAnvL&u8zaX=fQGx zztBGTj6}^3sRz^G3lPL!z`Jb>-@9z{T51$0QT7<_nb3X*i=`DgJ4vRpbRq584D9+y zF<37uj#-|v4ls;!lUFtFY>VhO{&uj3eOHgS#Zdok@A@#X2AWLRXCYgAFjzCUNVRCu z!!Q$h&_!-!0iY(_pSU%|;V;SgX-d?tO%U%>)K!1Z9eb4dN61C+<084lI{I^zjC(Fp zuOsLe1bK>&DH{`WHz(DxR2C!87bLpaXoT^}WE9EgC7v=;RZrio7RcUh!f`|-8aNS~ zdsL<%B$*Ps^N1tOA4!@fMl-okM+JOKc#7f4tWEv2;Rs}gX9q1z91yb3owzMXz_`sY zs*Gt8$vR9CeNY%&hN3RZay#DO>~QEjOMAAeEnCU9rF;|5)3(61ny9$byC?Z1rc#9h zjR*-TaF5STqf601Ug)sphsAvCiWtk=zM{-chSJQds_axL)<~1!=r|fvuj#Tu5HQHUPiP@mO#14eY4caNy1&=@RC4_-8$f)*aASjyk6Dz4XfJ053y8O zEW7xMH~&=oNH|h0lNl-h?mKsNCgXRE!0W&j5eL}Bdxl|#Wyi{x@3a>BXvA6_z$A$Y zu2|DupGmq7{CVcX3zBXCN7%iUGX2f?9OGBplYz!rn%V>0TZ-zAt$MsBa+%p@uGq3mdp>n7xB1#Uzpr%HWX;r^bf2?ffB3Y zmPvsq-aFq@zp$gfKFgVHS6li!Ug=!c`&YXH*lpy+gyq>uGOjz;5HF3IqO_geS(Xl6 zG=ui9W?TcxVDxdFx-tZkRoO^uGGB^V=k%1lce2{%Lbc#n={pE1dA=5OyR@X>4<31^ zma(+SPF&UyXi+zqdMnz|ES}Bxv%9*jW5T2&&7SFNQsWQY*;ocVNLydMYHazXY^u`! zi=p=~%j5pz(96Ta@z9&bgvh%xmHBQw6xq|T zI&E+7v{6aF?fzx^>ipAD$J0B{S_4;6FlFbtEe;|nTrO2Bpe z+8&)%o{80w`RVaYgj>1Wi`)HsKv8%~KBb;9+vh`LHPCFrhJ_&4J=SYSRxooErLB63 zUHeC5;ry~LUdn2KMhfCu>7)C6-3xJ-*Z0iC!!pPpmYXw~2i4j-i9PF{6wjge8}4OQ z@5*5zre?aFD+zp|c87mTZ3xiH6q@r2s5O>|*q;5EG0*LY887AcE56C?kh9f065{Xu z5?UlwMmDWcENCK#Aa!bN@*;}JEHPuF#iBY&m&&x2pYS6PyX~hm@~bm-LoKXdaB0U}teQ>~ zu4?p$55XTaY4?{lhT&n@@i}V!xl7Y&JZ7?630RP*QY8yXD$+@U7noX%5WmYPl$1F+ZWmZd}kz z0sjbxHm|M8&DOm*Dnw!|koMTZ$!Y99u4dSHCve6Xjm7PCJT8)DO|+<($h!QwsYYhQ zGp@o5v8`b2Fe%vw!eF-Q+2818q}VA{iJww3I6O{FPUluR86x$_)0sPoC%fIMnJ=Y}Gs=R^m@S={2?}37vA#4~*R(kJMDpd+4@5f&Oxz%U_DRV&XvBFO z78v_UN_)0h9mp<1`!quostm3#rpsmGbe{sKePY}0gRAiYPyzxJ<10}vG}$r15nU3B z$~5Rxqbj6b(0NL6cAfX(K3Pof9@AFmyq=SgWKstT^S_5xHZ7XKLEJa#(3v6IuMP>@n~wxwyMR^`A3ed_`;xA3OF zet*)bwv1a2E@5f299PcF%L>8b_8w9pRaO2A&ZfqF4BJKzUlCZvpv8m0!)%+huYvky ze(QFn-V|A!O#!3e%$(kk_sy1vHA2-~jeWVrYWt+-SDstz)UZJ^g?alhs3kV0$0-6S zaMZm4C`jhiM>>}E5_;44V%%F>meIN38~XSi&iH!vE%9y})fePYo!On~DKq?T%7ofv zE?~2H&`s#Q#q6Q9(YX^XACVA}+FYY=nHN+MVg%w_7NoI>R~N8y9b+Qw8s1Ry{8cmA zZrvp6!VegD74j4pr|O{jAeUYZoK%1ihIyh&;m(dZXwyBvhA6Q+H+ zhb1A>l(kWKkO`r5nP2VAf=uX(GuQZ1t<=DjR8(F2yZ1QBTb8lK&8Y!0a*fdp^3lRk z!49mtoEC0DJBT_Nf~7^OQgIlRU2;pM5)35lGx>rVbw}GaZS%Ke<&A8DCf5y%NS;ep zr}rK{`vUV4c~E7=u!O!R;E_E+I7S@nQ-XnW6zk16(>LQet3O~7p-cx`BAU%MBE2SB zAhiro*fJo;oT@!eAjJz!g9Qg4!QiJ0^4}{Ly(Fc@6?#~T854mfsa!k)@dbU-gO<)o zE>w~SCziR-8A9^rLi(P~q_ht+RSC-RDtabRh zedEGA$ZUCuTt!@P2%sA_$yBpHqD$vu$-qd9MwoXd4Nk=kk_LktF?(_Ah2?xej;_0P z@3@Dq%*OT#XKURBBwLOlw(Yu&=!gv=XUic3_Dgg?Dt^G*J#lwUAufrz!f~>;8?{dG zVkF)i_`MxGAhiWenzp#wNy(I?&yx?DNJuJ4WUUI zAx#stV=d$!+KU}vVB6;+9AjI#arGsG-gWT?g_Zkb_JT?Ah|J4d=Zv+4n~i!TRcivX zg1L=I#K4sK6OEg%SHZlx%S>-c=k;Q##*wU^H|T~Iml!Cz=06Jq1_KG?7Nw(ocI?OZ z?(fEW9E?Ic^M_~xZn%(&gcg6^Fj6}cJbn?Wf{C-8XdQ|pn?3!>^fvHo1gsBP>tZfi zSDm!n`-eB4HL-T-*%~^%nlxin`Ec_d=vvD7Wm?IJI!RFJHuxOkXPN!XpKUmCU%vVSVx{ zHrIFhj8Pzda9j1!{td2_l%$S*!o$n{*)qxjlkW*T)Jvp}@cahg^VaR5lm^~fC;kt= zx`UB5o%iyZ;KUKt~ZISM=x_@9A49gxcyQkR{8G4^ z!vg_SlqQu@qy9(9d*R9^MJZBsUR2(~EUE-R3QC4tkZ~60*Yi+MsTyU(hNU#o1~yC3 zf*7@*S059=aS;9AAx>C)ptj;iZSk*RIGKXUUb8_}`O3B^Zn;Z`L#!CEb>BQHa?(oa z5f|ZG8u>{}H;2A>P`F3W>J}hQr1vGp zlh}MDXYTzG&B39+0!6KJW`ED_BhCdp%A|yck3cHA`+m^XHX}JH_zqun@i_M6To+^j zawSyuRIfY2q=jPR(X-6)YFmh4)^th#{lQj*JMKrNC`h9mB?7I^QOa- zv?sWSiLHVs<%O`R~P6i*~@0l^oj@e+H-dl!_#m>l(U>TcJ42Sx%{>p zw(;yOGY2D_AWl1iodV|%Qkkw2^5aqynmZd#|+Aaj z^1FgZ*~lEEN>K$k+q*cKfM$?EayO9R&qNIXlF9w1^8xPydbGPaO9BWom0~0Q^%A5Cl6Emk+S>tt#=|5EFyf^s;Bf5pRJdmzQn@8y1# zQ~;P-8j0Gw|1Q(x;9+Ov;o#xnB<5yk`BRAZOXKHEtov()lq&HrC7mkquP?Z&#J`Eh zK*_I(Pf+qpEd@$`gF(#l+nqru#Xw+wY0ijQ{y?AxbaF8PDjPZdmdgy1IsUdw%=!ne zU)23lq_O-u{s(E={}smmbon>VK*Gg;a2X`7{C6(@lTPvfp3A>Ajla9h`fpuk{U-t9 z|2da`oA?KHt$(a#wtw&PKgkOJ@45V2C;z+4Al2``Y1pj)q#FFc=kmV{UmXA5<$oEz zoPPyG7f^WSglCeoGzEp#KcePu!H<~b_wf2#r%)wk{r%i;Cn1zRn8#H$Q$JtJ1Htv5|Ky~Z|2TYW>Ijwl;Fqqm`)_+K z0Q>Zx`111u!w$pNpH`EuUbSXdS#Zy@cuq5Kf26q;b*vb!mbKKcwzz!hI6-D1l?5*` z&8q$UxqAECU?sUR^48p}`ew16 zh;*l!$8y9h#_9Jnbbyd}BF=l2wMogvEz)6KM32LWJw6(=ik-dHH;SY$H0^>v&xx{Ya_ zf!>jEhWeek3ib*MF&DfA^|JwEp4*E00#o|Ng4PFGZ(6c_UaSgYQ7IOd-t+O2k?ot2 zuI-9;R0vGCYK?y+!bmDaOGA)WsWjG=k&;}sZ6USjCX7x>vE*sQbph!JoY2%Cij@Ug z^~emNMBGa33F%nn0Rn=?(qfZ@s|J(r3L&vnQ(<`}j51kAod5T+HU5Paabg-vx02F*rfJuDy<}E}b7Bp$>*GWkQ-W?H-O{L0_F3 z;g4adx7ArH{*xRJC6nF}UIFYSDk4D5lC(Nemh_dFNC6^w(sZ3Y9fJOiuO!wL+Xo5- zXvN~GA(`}mBt99oQbg{^BJlAv($q# zb8z8j@(}L(u_Kbgr(8BMOYL{>)w}jZ1RtfbIQ7O95 z(A5j1(?@EH4vcTyp9dnHxwgE$dl&9DaouHG2klN}3;hGyJMyIHoquQHyMWsXCjZ+h zg?O%gx2ut%wLQTWTz8>o_&fi;H~VkbPxm#~#jdQ^d(nwX@@!VdQ<91N(M#^~bO zlUZLQ?~w6>=#WqXUn?pmW12Jym)c7kio8N5fFdk34>*!J;x5Gar8btC-QSC8xeL@$??}T_2se*jX_yOk2c#h!7 zc0unWV-Mb$*BD?3i893n#JOW20QZ$T1?x<4kN6SIFXjV8#L2z&e?8xS-Sv4ef87y$ zK7IYF^twmo{U9ZDu}}08tn|7rCHVa8*Ii6>c)Ncb22abbpmURZK*% zJ{>EYs-0BxOFO0RC6#jlSKS2-=k zuY)^;;Q-3 zZaJg`F}F!~i1OcaOF~6@rE>Isy_w!TBDb>r=yGLDz_zhzH`vhz$0vtkcxirAcJB@x z>I?@+d2R%p_N1Qll$rJL=|gx8f6zHY$*`z(g01J=Y{P|LuBKAjcI#m%I^L@q#g)!4*<1tpNexnSTW!^_hD|befT?B~x%M4~YY%n~q+hk} zJre(S+hO!13C;C76^EAcK^%4W`Q1hE6Ny9c2Y*0KWTI2u#j-T@1$hDfS&YI$t=ED( zXHY9JlB~8S8F$YF@_jp2t2uTy^G(;g(Q-cA<~J|A?{>%NM~hPoKD{D_t_!warX#VLUkyn5fsrc0F z?w!TE)?I?+Uibxk&0eW9P2Z1GF_(NqE`vQnTw-gDpRXI!QjUL`z2sf!Uf&+LJ&^cF zk;-VJq41B}@5PP=rdgE-=?@r~oL)F}B)+B-Y1pX}DI2oPn9S{VTN}P%y1=Tf3AZ8S zOW~-ATu3^Cai#OhZtoM^0<@)9{iI5y-1gpPaly-mw)*(syo%LgeMNLLdn2%T>$Ij7 z-!p{8UCbEB)B$eo^v0~=o!6ZU|Hpmm=^F9mU?~&EhB*DOU36E1){ND0!Vm3x+Z3*e zK7B9U9Us=22rub(J=`TWqv<(@EJq7zCHHQI*V0TDm7-m{d^B~`e) z(w>&^97I|{c{0wdmM<5z8s2)XZnk{#tlePM^Ui*JX)Kn^_H2!Ps61$Gt}3p=&K4lB zPK9LPcI+AN<x%;pFc=0)p``9M9ui)CS{Z{)E$4iB=GJ29Jg+6ZSsB$tjc%j;2$x3-} z;%;JNV*YT-@U1&(nT$)Bm`3b@hIxtHZ2bYj!JC6OE&VO#E~onn53>(+S4Pj~p>Uz4 zq0ONlp%kGEq57d((Js|vRO^#O1b5#U`SSG2)M@$lJq-%XF0t4^6GMnzYvgQY7>cfVj^{lI=LBCa+=wb#^w;_L;^ zU_X(uNbwZ>LtY@t9q!@j6RYGk?fBHYVIwo;)4a}7%H(e`mye0f)q#UEr7iEBXd0)< zhVPGzm%h=3%dg>9g%IR?Ck!?$F$+1erVxb}dZ(#g9>(T_^-9-v=$X0JX&ik3pE)UU zM0&TiW~3E0Q85`iQ(SBAUW>O?TAtGM0A{Au6UriyBAHT4F>L#Q@#M0?WuUHb)o_6- z`AX_1o>q}P^W9uw0UUcX*}->9b*bcwhM^Iiv=K*QafI^=X`!+U$$$^!k0P-5V}Vo% zYH6(Rcyy{WYd>HkY>?RXIwL#-&DCu|mWs8hN|fwkUdA``rio=a0n5tV>QlIj*eEk_J7sIgnX*S2z=`T2H97cSmv{*Jv@XA<%T~O7SKM8?s$hL%%;0(Y4<2tJECV z@~iX>TAoH)VCx*P-7#2^Z5U}+>Tu?AbFIr+n`<$187WKpu0WUkCYhmBpxDglIakuspih~{l~R(={!uM)q2>EQ0MYkZnA0$F55&z+ zIpjVnGKQVxwN`2t!zJDoQxzfERSwoh4HgCrcZakqz6?OUi&~0Kjf=NujM%gmNjeHx z@55#-lXCYD(*u)Suq-P1Ce=?EQBozh)f#EgY)G4wi&`r(0E&QwjkKgsEj+jkIO^1c z`YO1?u3BMe!HI3d4+9e`9`#9Bt|=ozv_gHu{|{g99GpoMt$RX3 zheLvZ3lR&{`aFw6?3i;dQ*B@0(i%c^W` z^JHv3`_Yy;$=of5O5V-P#APd2g$L*cP0)tGpGNTsd;aC=+tunMA_v)^0l&;(Fhvy3 zhcZbZe@PYU_6vm)ykM9IVb=bh%nQ70%XNw$L3or#E%@o{24YyEKeUqbIT5NVY`PgmTJAR`>fgew3 zli|eR5NieHR|B_F4@j=ejM%`Dt%XccgxZON_7<(w@Uyi<5^P0CAyFr?V44pH1p zpBlW5ivuK4V=fW#x;3>KiCm8R^)8H~$SFGeaFe%hn|Vgs&Er~FJ%BdSxK(8>RoLkH z25Z)KbM59Btwvq>OKZwFXJscVIFpVJ>-269^f7Z63pNTv8no8mibPCtxfEcF54Ht~ z&DT!|PNNFS#v_h`sc{pGL-**+fo@FGn3p4joOiqWtMDoX#9b{7;amnx)sz%oB2sIi zh~;Fff^2qTs3L-_h>MLpinTWJHgz@>w1+dHBWL_mxFa&g4F(jHMo-oa>^jCF>Z;F% zIbO|{X5LbDQ1QR3%X#4l(eyzu1$<`1Xg~D8pwJetQYB1veiIdk;d4=g(c8j_4-;K{ zVB1utftRE901M}t_Osv)5WPT**qZS8#P?iX8F+hR{)&2E<9&x$c%edtPd?F1=d zm>cDhg{ijvl0WjQjO^6gL0E1D=OWAIs+`#Z;ZCnF`&?}=Cn$Bhq{V9(aCRdRd> z6Ql$q&3H?g2i=X1XXQ8}p+jpm(#lJEl8e}0r&XXm!XDVlCSrLZQg;i^<-q1-6wrcs zME^aNp$=nhm>C9L>8!34u$K!Po}nnnT?Rot><(FZ3u}(Z&_cFLU{l%a@mk)B z{7nX=XLgu^7+RQI-AmM5_f18C6IIeO1#9WMQx4YMASJ{IU&FPN=;ho2xeofJ$ZN6v zb9=vN_)Ft>jMv@elOkn>VP=S-e#dWlFt)yI|_}nIv(RyA(kJKlc#X zddV`*{uob3B1w(rs_EFBMt7#Y`Pk~x^q&bH=AdsKNjG>T&c1|Q(E$*8=Erlo{fJbp-w)QA9(>S|{>r%cN>PbFboU#wWb{ugYYN&8B_^h#Plhp)6bvFxhB5G{ zM(x!XMrsyW?`ghNiaZh|5yxr|C;h}>ba0*#Y5{tYqIqtiA7FaGjK)4~)OZ!3!+TeV zPv~WzFxHJ9{Out7R+o_Q2sLWX0@a}A%Wj-C9nU30x+Z~Wb(&gyf7(LBX$P0l$6^36 z)r6~Q--SlG8wEy`UoM}n-lrfDC}0|vA`ErO6G_c~J%5Ur%Fa*9WJpOq;>I(m0xaFS zLGIqE_Ynv&DE!gBRVTRE&7m<|}1uNR~WE>f|wKbn4{if_GG=aowsVdUni&|U=JDd>@bjGDtQRyFfWvC+72#V z@V+%5)CE65%2Rqd|9JE$@{ZIwI_1eoa!zvoeD-wyjG4{CvrqTk6Kir&ynG@`9BqY0 ztaGht`bm4r<0*mt=rb&)_zsY;Sh9@gcu>fW%`PGeTd|V5FGtn7MAvOHoQa%_XspgT z$R-YL3BGTvn8tk9`T`vLS`sW3=M!4})8J!ykCJ~St!QW=&h1x5PspK($7@kxT$1!d znxb>^T~SApO<$5F9G-|wQ_(wSEn$kTqUR}!2Z(t>M%}|pDeWxfe2ue_HYO}ulj-su^_{85O$RtTAS9i$$xg=8Pyi@zQWvtLSba^FogxoN}!Muw% zUi8xw@0V7jSKW_&s?YLxDoP zqZia0s!>p@sx6EqIw&lyCcR=%FD02pVOUUO%~#d@oUdxywxB0Yrxq{s%i|@1<_E+- zGu+ZQ21Q*nXUs2FaDU*A9Z7fnjFbu4RksYd=ws=jvHWz7Q!qGJD{C|dj3d5_oijj} z8KTRL(&fhI^%FvyMTW!;pY5hT9>;{gWmgu|^;zo6J`ps9NC!sn>_`S?itP2QrQ?08 zgd@j20O@EQk#yD5os#(~&e$x@QkDh#DrOe)is!7=xLL)zE`5<7eK@uEK?n#2W$TvW zEWOUoO+=)eA|*SxRv3DtQ)Bjpk`eY|5foHph$6~6)D%?wN+7D zuu^O20{HCV9v2=sd|J)tpW10@I4CERR}i}NjqV%GI;&#vR&8w;?}o;kp1fYx@CYxC z)tj|3+Ai|j=dO0JXslZ)Ey zMl!as6?`w+kvK=chFe%R9+BKz9f40wr#hLCo2XkWpkM(|(;mb5O(c|{*?!N$%ZD*IDuw04 zVlW6Z?S>Et45b)95htg%A0?-HWh36pf$zx^-!(i8%S`h7bv$VqGxJxgxvG(SHVo?f zVJ^JLpHWj#L}nL}SKU^S6_IUbI4Y*=%dwY;Wxn6O7z$jdD2!v5C?nrYPIspxXQw7-rY2tn<~^1~(Rz=+lG+m&AMJ8P z#TqIYrQjs;#D^8s2}hS3Q?Mv^N^pu$Zu~pWLnZlEL$z^Jq0U8l)nC_S-sEM;MO^>= zf2=P%H#PstaICAtGLk{fuC3iRr5QL=rh0CB6~hpb+OR z?b>v2_xSLv(-4ZCyg;f#V!HJy61?iTI>+5{>W~#%cWCOI=j)z)$p}XK z{$R8Dae{nuCx?5X+1hS9g_hS#a2i3%hlPq7=lBR7bCd_u)}A9FErHqyvOXv7yq+!s zbeX)}+SEFIFmar0nu11SwNIg%&eWI0^ES4WNAxw8Ew3XbG^};uHopuzK2jZ75|@mq}nX zreFI9CW$4DK&(~5s_~$OC^=cOmZPMN|e6&yj{hMSM5I;dD^ig2od?JQn zO{&!1R}>g1vr2Mis%tt!0W{s@d?N8ktbT2%>Lx!w8fCvVx3qdb^r;GEoVRV7b_d;W z!&S?>P7htWSYa>^%q`uhfbqygs{Yu>$oWKdqnWz80j#&&SUwgE!0IZmdh)R?yftZn zf7qN6dZ}69COugyxnl6FHLG3-G$iU+T;9w+fdnQXSqK(`Bodwf4k-eNAkE$=H8Drl z5C>pPEFFB;Cy>9;YgC#@D!3@*dil_6bjqX<4667C(Fm4iyl|F*s;Yv>P7n*-zCyG&7`qF}4P1{4I~;NQF`h>886q-v9?pP6kZFFU&R95d`XuyD4jP8qLZ_2NhjM#m zE53Tt6s}@yd8+Ihptz*nO{Md0w>r^N_f+!pEc&Q`ya~-M+MRBQks&O`ifEc#{4(qo zQn|!Jzk`DhY)iB z8vkV|xWrGe#wWorGK*qxu>t{1L4#6s05dbccK?=n(*B9ixfR17z>-A*+0Yghu}DE7 z^koBnc1#CK$+kES0}3Cu?*oT!L1IHFE8mRN0hOS*?-HR)^o1VGTlBLNs{2al({esF zj8${~rm^{t?H^q*Mwg#nW}l4cg2FpopQZX^Df{sEmH`#P-a*MiSTGF~BpxIR(jzEE z7W7lmf88Lon8sThJ`P-yCB00UU`~w`a$xFsFLRF2t^P2xC`v!op%%f|cl~a}wyI7k zC$(Q1TZA5I;(T8=L>(e(n5R0gjC;$XItMQl;`_)~H*c5EN5zr{s3g4Nj3B&Ooa+qY z9TAKLQ8O19gGZ@YE4C#KCw}H`j^Q5W@h30g)-SeXHRfMOP57g#{QfHNV^Le$0&Fw1 zw~@?j&2F@bP~vhMPh2c9S7u?Y11A`!vGCUDTSZ{j%09D#f ztms#^k>?IlnjcnPT2)>?W|`VGs4V%jq^mMHIp>x}^S!t6?VAGpg34hlmX8`hmy{wn zOcre{wbn};8>&pLXD~I^S(+j^(oMak;*JpH?YdaHyNW8sGt|3_^BVO~?58cQGzumG z>njBAW!C0bGa6t`^&O2`8A}}%Mc@4y!ybR7sW_H7HB?#I{4&)SI6q$pSzBX{@^h|K zoG?&nbXIW?)Rh+1ty@C)W$L#$4jdKbCsIkAUd{~0fw`8kKJe4%Tj4zQc9a}FI~T(w znKd0OydcJTdZII~uU1|2<+IhF0JacuHH}hJkJ=iKIW@34r?MtbXdOfNSNtsG?aQSz z_>dQOe|ykC?#n~mu;pd@3oqpAY|i+pP%`;ovS{2%Git0V!-A?71|rHdM_^}Pt+;$`?SB4h!5`uM-PhTbWYra7{e+?$KK0;uKk@K(F|62IQt~u<`?)L$jvzk3 z?6AFOxYaP7>~7O%xP;Vh3pGnTqdlJz@zThCsaSxI~4P$_pv) z#DCEsdm~SCe&DPP#Qe$vk>p?Jd*`S1m+^i0_?6x7x;2!p=tanVb56J#f0<1I-x|QGc^QF1hibh@K=jL>Ldoa zhC0J8Tn!C4>dKJhrG&BNh>$M%!4>aKMtdSA=ZtAi{la<+xbwB) zwxjy0c6C)>C#}9V8Y3-5wPm-8@$ok73d$6xSG8qrk}cKt)M^*Gx`C9zHrTqV@9&o2 z=XW(#TuaQ6PG%J=Xh&7q>cR|ViL=oRwWsi3mJ}Vb3@-cyG%FoYJbJu0!g4~zp73+Q zB0=>I!d#BSBXg$i4~2aymN}$yw-8kQNRH@*`hMBI7~Fm$*?b_QJ^#u8Xa+*=XJN>L z9JFV|fT1o>333B+1B4@RVM;$c(B1+j)}Avv9sP;_O3$&c(%+xBw>nTXS9dVA92MH< zQbrL0#K(2)t#JTtsl9&Gx*~MNzKObX%JF3#b+SAvKb`63U(1utLwnTR+dWS8n(ka4 zSw^Q9s)^-&cWMxBYPfr03k37~qk71>-^?U~zb(d@kT zf$S@AI38I(vwaljc7M_Ay}QR>%l6HW8A0_3?VsHGpl5NV!>^pB9CuyI|m9npG^tNR6Bh11r6#g9gMSXSe7tP&`Z%FW8T5g1kBS7=&}}KSc#O=kD9Wi zM~W0|m0-5UMVjp~YE-*s$WB-gbA`dFrik7f?JQ5oEe=v@mdMIl~d)NtWt%A zmWKK-ijFZ-iixZ`)*! za`<73@6!?)_YzU<3o#rD?3;xT@8t08`-OhC2L2pNuy=!iP>?YasA@M*GZKET(NiEn zQpF>mk1K^qWKRW8>);|!m=y*un&^$BAwWu}5XOcLJ>V$(HBJzMY*&L#u5ce9#xHen z<{ejVBn$b@KZKA}iybzu7R`6Ww4IT~^Rw8k({k9*r(gf}{+`3d=!X(oo3WN+@(Xd+ z(&kRgC(Wi}b48x`z@uO6HcrVe<`&9^tI-Hq#SS%OS!Y$p`Mt5TwX4A{KH+J@?E?uH zuOOe{$kzRE@JA;nAD#W9?Bd$i{93#GYK*}@q3?w~GQzoK(eFpqnG_+U zKW1~Pin62Eava(-l~y_pEidH#W#snGyhNUnboTJws#Q{fgbdX6(1F4LK1P5G(vDzH zps2^>o()C&LW&NR6G<9HCZMYi!)Eci=nLp;^v~h{_D3-OFCq9p8^bqC$H3mq_M43K zpSA`WJ*$7%A$v1DOKGL=DN8*Qhkvvoeg}hZI{`jB9WxCBDEZ2MgP`6j#qy%*f2d)DfSRo`r^yj*Xcel2-g%nQ3OgZ*5{} zg#S-r`F$4x|6!4!W?^BXVP>XdWy7atWMHCUrDLUI{O0e_(S1817}@`G>05UCZ^yST z(})3|;XlOi|5wP#_&-|2{HF=z-?{&}{NJP{L2;pf zOaHFI@EwS_kdlq4xRA7-?YBY1@H=iZN4Ni&R&;atj#~U1ar4g+qF`iV_TBi_4WEqv z+hbw$jfj%{M`<#%Ho+(RuWjFxicYq+mPS_pem=VIyQfwC=MT|jWv0{mHko|ubs1P$ zY1kMU{v&$)Z}<>1GYbtpGXo>jcl1K4|FP%)m^c{!sbv3;iR1sJRb^me`JXO4ExB>? zL45elca-`LEkNX!H6%Y-GjiQYK=J2~f&@UGJiT#TcXbR?5Nrwd6#G! zK!*}~VODH|GzHM50|o!gnGaWWm7WqSM)+I&f^gt>Lw&^Wi-RVyBPz|9&L?muUV!tL49I;9v5;EA;=T zOoXk!nK%Ek`rpMsE%slJ#5WAe@!y5Mwdem)j|$&OQ?gOEHv5Ok!T*nh{c{ohR|5Y> zYlZ*P9y2hquzf#0|F3+~Gq5v#m(Ksi>|Az0I4TK0@p_+AcXnMpyGxU16(x{Z;>^Xu zi_yg!LjVJT3Uxz-lFW=mj}(VeN!W%(LL#C$0^(>HIaYwcKmx|t#zMzhuCXZg{c~Gj zK@J|Tx7;_y)r>ihef}OlbDC%$dzpJFKX0`;ovU=pfPnm9_5YbSySP6E!mI0#qE}_# z8#EiAo^sU+GJlv_)$Mw6vNqT_zSZ-v`Qy%y+yV2*54iuwgsOqtY~mo4;BrI)PtSwM z56#}g`{GFq`iD)kA5~~{UZV}cp!fK{^n5R9)O0dfJVp=KMR@~04|RPu-DP5?ThkxA z_u+eHG=9uKoGN1N@%ClHsC|)EY{xKk$XEdNjBux3F?db&l|OTz^mmEk3Z++NdkrQA zYrAPx4ZnHSew?zys7^DYaMpCnr|5DpnVj_n&kE*vBF-=CyB}@@vn$2`RO`UzN#l<4 z-BhX6Qn8^_fg-PE9*-w;IIg2@99;C>*?ftE-JmUrFgk=!ft@)=bmLe@iqznl1a6sI z0JfTjy);mW-aip!+C_BGA^EAoQa*xtlG&-?pag!Y#g7rivdT@z`f=}u&|F-m5<{TY zkT})&!^{rN!a56qCK_U~^@N@LWOhSTnt^AwC1~r(;sUb1`R&f;P5?3s?ss5^ZP5ok zA_UEcs!w7_`UR^V8-N}N7_b}>obZ#oLq8DU(Z@x`56+dmvx%Lq{Q-&4KZ8;W0~f4^Z@?iJvKA4HIHs?a4&4qPTDZdB zd;opVh3;1{0c`L+d`OS&Kpx%iS8Anxu>n1~09V{d0c_ZU1X10e0ADu5A^fEtwE_9i z5Iv?yK`y)@LhT=D1krvG2*Z6}MBRRNauKcs3k1<25Tk;&2vR~F=rsHvcrD1a$p$!p zRQ#!6;n4s(a8$ynLsw8h5F1=FzINCP`$R}lC=?q_ zpalY2Z{2}O4SF)6HYg=Rwa5o@a?fMvvMm5IDs;Kee89+7@a_jy2o{2Bk8~*I?$H6M zEe;cbHk<{#YHu|>*6z~5a1G`yQVWoE|4WoD=bm&8?5%MN;VS}Duls;zE`}YeB27UVPj78n-1jp)aZrM}M4^BtZ6&K>W8#~Z#oFVkRfgzLZ%_-p?VgzI3@`0HNo z8U#BKu5edcOMwo!zpSq`ADAqJTX5a{ohS0Tz`3oywF+ld;ZMk+xSI2+Po_t zouNy)_tnQTFd1soYoiOkXR|9lFr15WYd65U>r#Vc2X!If3H&$K69n;wNgrys@&AXV4lG*B%axx2wVOEp*H)m+l1a=yd=+k$JlUvvY|df zISAdpI`G|r2BA6xJa9Vwb_0U8z_(b@A$ioV*x0)-)IdY)73yQ4GGH)~{6YAUwTckK2zvX|0YBT&+#arh9!CB+)v$`FQU|#5 zx2p#N1{`riU!p9r7-V;?5Km-sx=Jt~CZ`S}I{RpKJgZBtch?q(6_t+cgO-T2p3hzA z2RvKg?x@WG2Y~U%rTiaCHzA6_Mtwr_BWgCr>bd4ZNvcv!hIr}H3(!(q)GgJ$$ZXFy zjpb8!EZ(ozq#n0=7L@JCME*Z7ou>11%UY)3&|@mMw%kJ;=3n>cKfG}R11`)+GUc5? zynmSV=g8p_&eFsr@y7D@bZ9itHm(eh$vElkiUG8vSZ*;JCYN^x_kRPsm%E0QG~VHRAI?f#Wz`_!QQQ^Yo3$)AAoD#3N{!|u_; z)v9&d$rhxillDivnrF7Pdy60)Io==Gb6G7*(ZeXVBnmuZT!PmDj214#1#{ou!f}bR zW`QnOVF99KmV-BNU+e_pGk+Q;%``JRcv>a?YWxMbYj98v6-fc&RCY$TB3KgjE#x&a zzML$+I{$inKEGW*Zl8BAe+4a507RGfVU3;ap{}4kQaetb;R5vBD*-W-cjg~}KGm(S zL2hws_m<~<83!=S;Vhlwa~?o7uW(Eum{-R=kUm;vv}~pvtM>-zaSX09qy50meJ~6L z7nut4&BmAmm{Q{NwdzuHL!s=osaC@7*ILE|DLQkviyl7y?N8WeHjeN1#TNe|8hT)RNgY@2qe1_XQj z4_WE&b|_7t`iD*siU$uA$D{)Smm!{>u8wp{S+S6}v|M!r*(W?zEW8z+IF_{4{U(U& zg68-40T6lcUn05)f1@ma4I-_fPfWvMvJ)cG6(?UU9he-ZLL9z2h3=apwVoPkZLWrH zghdZ$&yR5BFq=_J9L45A+%);#sRMf|U7E7Dj&>Q0$BJ@|_&K3R<0Wx?@Vqbomoff*O5EFMJmxz_@$|0eV;IZUL z1MEqKbB|6R5E^JE)@KQikRBJxOth0MCpnv4%v^~nRTV>aYum9KzZSUSi=x3tRgulZ z6Q{*!3~a2Y>bfioH){)b$QOWCmW^xP$Fx`}3Jq7p&r8h9<7LiW3Q-ORH^^`vyM}fD z{1eF2Yhp0K%lH_No6)})zt|+#&D>b>s$TnYuLmu?v({4X(E<^ zIQIZUs*~KDBO$uJ*ldEZ6<6FIS01nxg9<%UEec9yJz#DT;zz;rv%4s};W7w^-6(rI zwgn;TbSR{)(Bv=d3EC+kTr>E?=ag&~83xMaHV!R#(|E9gH~K)jlc6d?tjZ7eCi`;JflVRw|YfF?2cU2AVy83)^Yu%i+xOvvW^s8mO)wbvdh zp;9clhF1-@uLf#P^MS^(sh*Po&~qvIJ$5)fX~k7*!gc3b!KFto3)5^OR*8o8;4~ad5V{>5sD+|H$y(-BT-X7YjXAy!Dt^4jP2B3@mS@t56%d93sK;FGPwe z-oswSJ6lf!5!AIfqh1SBZiJPcWV&`UOUcMh$K5~;z%JPJ!Vdw~sOn7$Iz6$^owj5e zHSKoBz$y4?6tWZsa)kV!3v`xt<+{6%0h|UuDBVg27+u{ZC_%DK#Efkt6c){0Ez-V{f0v~`&ZT(W@P&_}P#>bA*kP|EKZ*wX0XAt7PH{BBbX zlUwT2O%OTakVhj(cv7tkV3d>AfLxU};J9}b@6%+o)~D+|bIw=DltVwq83n3?=W3Fh9zZHPHczQ3Yi16iUc_ob( z@k*7WS;=yqwAA0^*3^6fb%94gVAOgSB3lI9-umgyYV)W0~`xPjyNwS{!c z1adR4^7?n_tplN*Mv>AdI5(($LG}ai`ZMTSo1W@@pdx`&X_EysK}9=<28abnEb2}_ zF$AMd-%gK>aq;OIF;-Zb5&e;516;^5Tn2p~DgEu(TW z;>7R57iep(u+PnGwf^b6->xz^eA{~b)xM(t#Q4tHuA;O2)ZEmqxV`ycP=N^h?L0AH zNBLd;gJfW!5-~7V@FaS(M}pvJ44bBb1kS3T3(`fm2|j7H(3A*qbPX@e_epZe`^-fl z5B;fT3>=M`qr_uX?`+rE8L&b@HHcehklsU6(f%V!?iZ9mWbH}e2~ns__)h(+(QDsQ zQ%n%B^9P5!we}r676`2$PL6{gIXwc`66xIlS+w?opO#LT|Ijf5WLxs%rK*O1JHtHb zU;r43C^*~`91RUFLt%?6-6?^M=$!#4h8)Iy20s04A^FvS(4YZ|m+V2Qyt15TLP!`p zWEeYh`e<7F-F!IY1t{=B!XHK1J$3h}Vu4!h_L#w%_XN##2!tI<7C8;tsiQRjrlR!S zyb}q(uI%#emVB};{YLapF$R%PM0U)ud>&;!WRK;i;-3e7ni@X#9WQK~eX3Db)vSmy z4^#b7n1&(|_vRHNmd2<^_2!U~s8lK$S*tiQ%8AJG`j7_cBPBwRD>#Om80)dLyoYwH!LHe)!a4Use|HyI(qYb zt&&0nkQf;$sC+X97KTe;pndXK$Z+cCu*YKv=n>LoboR9b9M~C7&&7l}hLcnTQ?Mw2 z<#BT*gnWfqAgsuih3cnc{E$(#iikhQ-j4qCZ(dw!U9-{v+J$+Wu3z@0zx!JKb+!E@ zd?Rt|k9JzNyryV%uCn1KgL2PVl+?CZpK-RIWagOckxbALw>YTW3GmQ2Z;Xoi!J=Sj z4yGtXNgn2}K?D|Sn}Oq*NdI%6Cr9+Aq7sQqci7#zy?;+l((Ai#c))upbTw^Wt0Y^RE2~h4-)DpM<_ys`O`2loBk0NJR7F~BWkWj&xH)7ixSdr zM66OdP?q#C(v}(1nFr!70sdfB2z;7%WMCt-E)8b~#WX>nj}nsPI;5vX_>nKWfaiK| zl{^U6a2dC`SuiVu86HO#pA`c(p3*jWX@$DG z*`x}pxNfHx*|BTQ?U`aNIoq6F?LDtAEEGXO$3)>jc+o_sgd-nsJBT7BloEErfS^@; zc(il?kw2ap&kD`oDW?0TV%84yuj*JAf<9XE57T0prq1#8m-xLi76oHO)Jff#HMj%b!>4PoX6}DspKL|VC zQVzpCCuvaIP$G=Hz#)rlPATe$J#IDOXE;`^Q15<8S9+eow`rH5z|-;Mdz<6+RVmx zYmyO?Ic1Y4oL8BD4Zz^2E;#<)Sqx8f?8oCe>)=WhgPTY9srDbzx1Si-L0r~}Cn^@> zEm!Q*cd^Fyl84^ys2Y-tqxuaH#=8DQ46FeVA(0h7Q|6mC?gZn8{D3)CxpVnl<-9*6 zJk&4^JgZ+tWw>9~QVQ#EUUZVcdagJyZM54$17(;}_haHw%pevfJSZ7#HJ++zWgL}r z1vrShuC53eD!8Ve3YfOk7p46nwta7hhb2-Z<(Y3H7$GAFpj^J&25faPV@HzP2=|C7 z0^&B&yL3>#jx4h4X9bJvjdH((D}5T(D)Fm6@dt^#6m71bs0(R9rrcpFLV=7@^v0M; zVPu3v)>Bz* zt$d1D9H6LZ2v4Y7LESN~-F1k0v;`fC@d{v|Huiy0^!e5ta^&u{bpPgoE6(8d=<>Hv zr!L{~cBC$IaLOz6afvEEu@~|XW|%ewSda#t{bB&^E*NRO++vJGqCkdAo4)OOa1Ome z7|C|2Djs-8Sm&d;){Z2~FUc%E%m(qIi}U<~2(g`eebQ6EDRUD*`mT)pX{+qif-~u4 zO{cu%96}KAA4AyR!#+JwJ=I1Og$lR^n5-CTM(!{UijdS zDSn!n7k~Q5#0x-W39_sIgMwxZ+m)cKm z=t-izC;ms~#TFfnLqd<|$Q3CkV0S;6S{b{yNGh9=vSyr&0uo(S1f@O4IDuu;5G1>F; zgLHV?!|bVmGTq1FE2`N_y<3}SL*=W^`#_Srw3{fh#Y%X*HwD+@X`0RCTpo&~0QE)J z$x^>^q{6(IV&@15hJKrsX&J)%N`!e?o$1$Zg}`!5@C*(9>AmeepWBm+HqvcrWqjv> zl$6+Q}{?!VUft~mRhTMpZvrTB=yfjd^5Uxb}wga z#r9(VaUerHzY9V&=*c9QN$%vije^>2fWtlTfUYk(G<<-cGHN;wDk(W*R8!GCzVp)Y z6aN8F6%|t`IWa1tNS$YAw*x+P_keZx>+fyAO}d?Hb)Jdoo; z^|NGl4U&=ZeY8J!moY;xDI|v_w~&iG<4hbw5N=gTLxU?@mxR!d9x=7Hu1Y}+8q!Tw z0(LTF9y@AenfQPwyH)u}hDgHy@ZHSU>vGQaz0HYOK6Nl=&0RbUrd!ivfA|{5;H=9F z&)S$(yYog5&f~aN>z-B07{hA2R{L#~cHFwtXCCIjCOHq1%M@`YpZW493@Dwib05z{ zBUxR49@8?rQnPPz1VMjcx_qvWoSfmGq?I~EO%?s|HB(790GE>Mi|~Xvg`jKAb88G9_uB}P>_uBqu~-+; z%hsobOcerJ)#}3x-Ud^?dsX3XC|EAMcBC0gSXdcSNF&s;5fqN}t#Ek~V<~KkQN8X^ zX}T2@XWvLMui)dMt9|-8SNg&DLxhQ%DdlM^bJ6jJNjUuWlC?r;S#XK@_n>0N)Q3sl zCK6sH-0no?PCA|?pT6}gOTW=HHL4z{#Znu? zZ~Y6~te0e?6IT#x$Dh++6Etc!hlD<7@sC)UP?=2tBU(iw!Zp)<%%J`2#4{OcnN{A} z_h8ll8GQ4Qc;mQspiz*m$lCe`>$dD659rE^Nq;G+Zl55<)pEaCb)PE*wR@W6*Kz&I zRHIepKh<(ss+L&k6L{VC|etnh8a!4|B;Ka&Tz?eSc zr_Ydan|yL)mZLqm&UaT~`pCsB8D!GDPCAzP5s#o<(7OUgB^Xqe1>h|1+Z8l-V(Med zaZYyv&I*sie$w(4&9?QOkSHNeW7+TR>qPy4~jPp<*-guXKTGJN+XEJuG$Hu0j3 z6u)FL)>&50^TTP%PV&R6L|Cn~-eN-zh~UUw-;%p$jS216^iL)XWW&+Nnwg(imS)9- z2#rmdcL7Pcz&O(M=%LBUD#}UuG)9T`&%imU18~(^!L@cy=^;FKe?BmnFr@ccr&^qc zaIm_wJHd>2j~g+b4=27NqmV>CpRTxB8yX=WD_)*0)-{M-U6=F6w+0~6muR|x6DIAP zRb96W@x{9j$FU2GWI{gSxAlSr_3FowY>}-lX(KEXg+N3RrJ`fn(kEx7Hx98 zY<$KNFaxk>(x=F3wk4tf?zYb5itK*xipJT48E z#mddR#n158oW#ncIT?msWc_JWnkuotc zoNU)+c*m`onn`>j*-x>fry?d9c!y+S(#!pwOW!3W@|Dfds=dtZo~>OBFCukzX98`i zBTzz-?w)y;o+5tQOla>BSq2q=drMEN8P79UyRj3pLuSJE55VeVS86npv zIp|ckr&GFl7#X@VW}J6msu&WGtO=7mA!eMrzcMnk9akwRpLB(5s||e|w2yWg{eQ&0 zb8zLsy6-)iiEZ1qIdL+vZQItwwrwX9+qP}nc5>J3bMD^zyyw06?^dl^)z!cCbU%$> z*Q)ORJYW7Kj~|hshQ-=u&Chb^nf?uUeitmTJ@f*_I_m~|HZ`>QdvpnJUEJ?!-hF~s zsLERNCdc)s*V`>!WokToqg-L4NeBB0(G)nG9*WTfcZ-oNUGxkGkGLqpdNS2MP8S?~ zRV63t?Pdj47HTCPU0EQT6`u=8piyaTwNT>Zaooh3WTG?iU98Sg!wvIiPEgjXk*k)* z#UoK%pNE`GuzCKQa~!tM=Sg$X-dH4Qh4rk(oAAFJH)W_C$(A~ZF(V7KRMcJ9nhMB4 z+!GIWwLN@3z5T9)1J6J;i@s9CEDinsz+rJ!C)4zY1xPGm)6MB<%sr0RuYUiG!WnvI za!l7`AN&wWLH`Ve<*hCoMn<{|4Xc>Wm{SZNoxD#}ESjCkvO{-bd?0-%&bBQ(<@iXH z&0i5I`-NfbTV8f_53ytyU^CwENP-~WCbwTdUl?n}Pj*%pIeTDpc81I0{Lq1gw>i)V zb<>FRdYQBqa2Ly_sDDG^4gxG;5Jj>c+Zt9gfLIrQxN>4D1&MGgXv%mY$*&rrA^kZz zV~q-uU9wu5fKAC|Iv8#iEc8Ik;3P@CJ1lf8UPPeQBfWLD_|4HUAz`@3-7khIc!JS5-#(H`%76e@1$Zx)9|rCoFIl}a#(Mn zKA{TbI2?WpyJD1|_{24Ek7ZqX}mP~V#LMzDPC+i@fp~}s^e&f#vUi8r=t)+h`ppQ5)H{Vk8dms zE3;#no)#6mDwOmLVxPMUPCd`tm6E}b@n zQ1Ox`w3Hi$my2k|(qpx($F2CzY$Kdd*YoNKUj+pU7$6ABS#R5>HQU^i@-rW7c%E2S z`pgR&gV5er*aT@E$k4bxvYJ$LG-Irtqz-AFC9Ak`omiFegsXV1VNzu+HI*||1L56Z z2!b51#M>}kgN;;!4R4*7g2&sV;~Q!D2r(Bj)R$V6&wA&A=~mc-!o^y(SKZ1p0LT)! zq&6OjGvCs$879s5ia)KFdn4UUiP+GMR9Gv&=QbcR}G+54&rHG1$qw-xE5W3K zIL~PK!y;pqSDfFej8=F?Q{>IsaKyK%t0Qf4+o^Wu_YKrLKs@p$%YKR~_E8z2gpC)v0eR#!Ov3aWMx^;W)Nv z@w9=MLEe<=6BSmsR%EUYxx#|>{8WybN{+Wst%nDYbu~^FRfl8uhOaoOK=hu^SxKR84!rN6vjG0H#UmPazOYdowt0DU4dmcL(T?PjEac?k0t1*%2vS@vW zy0Nr~bW&1$C3)&EVlFbWp#ujauvSChW0$z@Tif&~&d0e>wILmahesQW;wp)QtomRU z+T3V_Fg@4(diU;4U(tZnYS634(jjL-wi;yXA=}N9hp&}|md6b037O>|+F1@CE zq*-UYAjosnF29XiMoAmr4FT^X9rfd8Nz`UV^;J320o~B~;Laso%|nuXv(GcAr(2|g zi)!(8$cI_j_Iz17O)w*FZz4;5(b%p05ujZ=+$}>+@N{yWU%DK;q7MOR*Ds~?TFXEP z)NNXxP#L#S@bGxS)Hg`BVNdxgf<$(u)kp&57EItJ19GoCFe_$lz%*=$MMGiUHWDFI zSzI(Ibn3eOLkgaXeZ4Khe=km!n-0gl)P;jiWc!bls*IDR1dara2=^6BXX!AT5Bdpz ziECN5QN2N-clCbvQ^8IRW18*dDUvXIbn#||obYif_ZD)8IrXb9Flx}85Rk@d7ef1$J!w0ndr z7*C`0{ql<`^`Tv%LTCIgef$v1DHQFF9o*msecVt-=INU&mq^#A^h@fyn*StzRs6&r zN9O6iQ<%%nLnilT_>g$o_-v@LMDb&y^vkcbPkwqlzHnVy>Htu7ysH7%AqFpyqCefW z9M=@%gZGLQDyKvXVn^afgv#~Ftk<(7wgfhMw7hG-vtQ7i|1dlxEOP!Tu>^ewZRh}Y z7sMkUS~eX|^*d1M{@zXpm;v+wd<@YBKMu#cmo>=;HknhRjG$c2DT5Sh z9`*a#t4@B7Nj}+*r$&${>`;z(eACDbvx)==-JGXSKMb?;Qk|P{FzA<3TeUiWMNg#z`OLMTP4qRauWo+q0;t?K(Qf3 zUP_`E(zr?J&vi}OEr;hj1-Hmj_PqF(`aNtxim+KHL2e%)yfq9l33p_!=bYQX_a+Zx zgARQ=|7Aj65?=o&X*)Fakx5QgzQRH?n6~e4+P&Dzy^`Z!ugDi|@D9a#?v$DVnwsMr z8q=E|7^7`?QRLdo91DnXLW_t7PQ>Im^9qRMISGr1sGa?W;;@~f$T&WSZ#<$zIlPB% zz=s5}`SzcAhg>*1d+hjzk~unu?eK=s*e?&Bv4>1JE_a@hMg410qhxF~`)*L9q_Axc zRVQoshD4&u+5c=eXY4UX#dAdMuxI4Q)4$d`0&D$-BIXQ;6yNH{tcVJefqiDG-SULe zJ8Agbp0!}o@xa*&uM$XMg426M0k1oJ^{+eplak$F8@rUuV@29~zyx0;{RCPpt>a~+ zeE9u~MUe3>dD}}GLNa5vzFGjuf)>_ zY7jLF+T-sEHS%Mv>k6T#NX>GsMKGdT!UeLt5k)wXo+!Q7!Qk^xY#3c9GEog(co>zw z4k&|%r?xhTSLV={Ji8`>N0sPQ7}O9%tX(!ltZeUP$?^!WVnGhP8JAgjhO0o-`)?8- zckPh=&8gvv=Wj@kh#zWKyzK}}CLAp&HBC&6l$~zsA>1865^8&k9+v2uCcspYy26qJ z*V^q@J-@Khj4ThkW0b6gzuWz?nmCj9oijOOw2Viwu|OuO+FgI)3GWE+ zN9tKTf`p{fpCat(AIz%250tr_Sx0%(A?1AJZh;%P-G$=Dy~7g@#a5>ka+gs?o{LE$ z3m8TkgMnzzZFNJEaXQnkN#FR!mLHF+SKh?B@*KZnVedd?Z5>A_71=mUBR1qjrE0ih zPf^=Gqw6wlxNmJw6uutt6zN(u=%JL4{L*@J71(p?(ALC|f7qDp;68(H2u1}rc=t zB-ixn{veu_ZPa#Q<1iFmL9I59HW!7lR}P7{QXZnoybyJGXJ?4=7Pm>+EXb*9-eoI1 z<{+hU&?x$!=P>=Y*wc5;d#mVI!7uLgLE5A%3YSIA@7N@0aQ) zK8KR?e#`!yW4v!9#3ZzkeiZ3GfInsjJgx?towQ>sp)JZh97gG(>|AxOzEW75!>E|5 zfl&di_)58vXkOSbt4N_NaF8;4L%s9IH|@qB2^ZOHBG4bHFg8t@ftgkgu~b}jNV398 z?|hMSTne16fe}4B#@ZZ(-WD#EzNRtJNdD$@TRMT5*!)!GtBe+LM7;k*6kYjnp5zy~ zy@xc;Jn^qVQoo%ZlXf)KZlEg1Rt4_a*$xY*JQF9uypmRLayrfBQON}+_0&ptkstc5 zrc`z4C+-n}!9{7NMnA}#+TB5olND&PE{EnmdPOucOLU=7X*vDtnNFCsVTDoO>%xk; z>+x%K_0qV)Zq|kHIp!=9rB?}6T+t) zcRi6U!rs>S!kZ+zJ`J=1Uy*MPxT5V;Zqw}0>`v&T^~c-scr$()yuUrqJiFWw-3Z>m z?OhFRMRp-<;rVcU>U-+E2R?5;JKUJ;dF;vzG!1F&%JeVw+k~2M=Z5_^2S_sBHLriV@%XeEW?HF7)3y8>atX(B@x2)_(w6|AC$<7@61@DTxEJ z{y*p$13eoDEdxCR3jj3xCws<1Ps_o^`Zw!8*fSO;T1H03e`Nd{dqz)B%fP|H1ki=~ zU$bW{Y>c#QEKD2>_%zG_qK$!xk^Qd-00##xJ%GCci0^Q)(=ssuxVHZSpfUYVO`!it z^ZXUD_%E6||A7?!{r*>b@&C~w{{=w%XS4qaAN@Z7&{zTJ-e3IgFGWWWfY1Pv4U8-R z8jl{IiGz`r{x8+1^;eV#pv}NR%fU|1%mzT|7y#Y&*W_QRe;5OJKQ;~k#sn}0{Pu4j z0!-Qd5_^pQdc=sY!OG4IDETky_ScLa|E~}9e@6?S1yDaDGa~~BJ}U!Y6pEPx{ZQ7vG0(EiP2{8yXl@j00O(>E;P+g z7Ipxi2S_mCGqe6D{Rqfor)6hl1Gvk=2#^P1<^Tv-Ffjm9?CgvHcmMU2l?A{{vT*?V z0wAWrz|O|Oui?0^dX&P70f{L>KNH7y4d!0=yw{HuH>W;R;D3jk;g zGk~FFVqj$kj1AL2efwu2%z)R49)MLc;Ijez{Z9)Pc7VSCbQ932OtkEP<}d1(X6N!)C7>IYn?uBR+7OM&tQrj!R*-Bu(aD(P>W1bI?&mbZOspBoIlPWE;b*)+=45O3pX19PFO5c5mgI7Q?Vp1a&mIU^4M2SKiaohwKQDQCloCE{9dAGl{tREhqPGy)9NHNPia%fG6DJYg@ zUv{NWD2bg$O36~GCz00`u7AQhqf?7%#~pOEuMiTM!J6qr6O@-f*>yH6Vq0RC)?6>Q zrEAF-UctRLW)S}O)%1U{#QbyN_;1wWKi8K3TWawiN<9CSTKtE6&c9KM|E7@hPim2a zp8o$tEwV5$GXDEi08opbio&b3+D_8hn_L^2j&agyF_(^r_?a<<;sVRFY7iFAV)#D= zQ2nsQh^cEKLcl>0;L(JD4dK}Wq`~NaLz)KI@e9ihrRp*JheZ9(@dGco^C>Tr0cYR( zxV-x8x|-~GV%u<=yi?9B<7{YuSkzbmgBJnE*d`P-m6V>bMGnCK-2h)cK^G;18N1~S z+-nT3qC8b$E~K6SweyCLt-)gx_0W3^hsy6tCLmy~wO60|@&Q#vNZj>1hSpeJNr4D( zDLp`vxJxgsImbH8Y#%m2fcGc4-A^worHLsEs|I*)?91YL!2rtW?0{)<@Vw#IREJBf z>aHtza8bg7Pa(^aKbYL6&4{CCP*X@I${S0j<9 zqTl5q(?Q7A!A-`q1)Q+u%h)3|2kaQL;&a=04Zmwk${iq$~cAK{4S~xkhtNRjy zDt1w0$!Vf({>?~*Z)I&WjF!0S>~zT~)q$Vx^;Zmyz$d(mRtb_aBpqaNj@E}MRMRJ& zq6PGQ53(ZEhb`Psp~!9&Q^d3g^Jz!$4X6(Wun9q^X@Poh8veRz&+WIFAEqGg;FUqP zNd47q5;OK8T7kGC7SlwgH15ci{wZKNd@B5-ES)LAzDqOp1rdp|kRvneL{p&k2qK0^ z?wD30Q#lXt-q8BEqB1|v6*g`(rt6pwGH*0KgHM|Btmqr3a&b(_BA&yKjnGX{UAPWW z0M|){Y2ds32haJldzyZ@%}6;yeT4k^omEo92Mc0_5jM14GwtzEpG=vvWSrYl0`yuQ zx@bV54oX98r6KU9OL4(8%U6*!Hsjxkt19)j?F`2)a@GZ5&VSl~u=?|K>hu!~b7=MH zZ85fO%4O@zo^c+Ey2B+`LBxa8;@nM_oh%avbvcu7QLe!Qgv5W zmMJU>8Fo|muVzjSEDFVvS&9sH0&Z$%;&yU+{GZE<4Edsw*s*NfY<~mB_a*XL9>?_f z&w>^e5f42@hhJdfpqNF2v!zFXc1Y(dQ=r%bp#nwdJDj&9D!VuqYM@$8jfE5Gd7ua> zK7^DwY7kI9O)^_skVqMKFcm_{FK#5x4#>B*D(L$=fny?~SxnSuY>?GmEV6RvRzvSM ztUTJ6zY!)5$*Q4B{on*&wv6dZGx#&r*lJhEGL*?x)yYxJh&5_4Q&M-X)^OUaI-j@r zy98)tV`+2Q?+vz3ar^ZU+T52!RuuQ_FyFq+d>tgvh+_pcy)t7kms&kZBkMqUy0&6Y zJaY!qLgIYpP;?dA)Vxqo!=S3PjNIW)DW)`a%FJ5(fR%Io<9y}P8xY%BFy3OL=J6c6 zsSh?VlJeC1n=_OgXj{VzrQhfpopv)*(I^^GG^3`l5V6$xC22F=2>2-|OTgm_Kz7?= zRnwFbczq0VOm#V|NS%8a<%-_F~52sHHN$d{RgCIljHK*9K#^ zxtUWQP)WvoA5H>@KVs&brn15jY*qdIZ|_C5F>2PPa_rWsb!}x0X^|0Y+ov~7T$6m6 zf|eXBm%=2(_#~>lghj^5-sJchKX40L&GS^j?I56_aL|zuW7wJ`J*c?29tBT|5JyoC z`0f1K+hLk4!->(l*0TnWW(aLkVBp|}pv;M3*JmttjQj}AZiPDKnxgIV^ z6i<}<#K)<#k=V{_9&~&15!*xYrf2e$7Wg542IjDcyp>ZCkVQt1%8qqd&V5R9A}b;< zsUa7|8ZX7207lMLUK)xPqW()bLjtzi9xIA&BVX7 zpHK%gL}iQ6_jvGV7Gx||)_=_SJ(1-+KM^PS>^AVmr+S(SAS8~ z={_F%0o5NVuT+9sSUV_bEY+4y(9o(l7)Tp^;HOYbJR-16Jnq&Kpsr@*)siFy7O;Mr zBI7E>K?vKC*9}CepfxsMpYB2!fx&D$RMAr0*`|z@jZ@o%26z~ORaO&Et48(5i6K_U zeWNG^|Nbj&(|$T|n$cZFgvhkH6^012IANE*%z95X!C12J zv@`y4-N2EWMfgZfP3P@TK=_iZJOyZuLp)w{n z_J~!#TYme~L$fmUO(Z(gPtXUC#(>nV48;>xT4`yK7&XQxg&(k{XrcUuFtSekk;Fw{ zPF#Q`EekQzw=q^$F2*BkhA~nef+?p3%cMjJ9~WU;o&%g%1uPaTaTkLDo?6DgRCcZy zU`kIqHo9>Ddpliwa^MJxwN5_83!adjNFfvtHjvErwiaK);kQy1r7kQ6;v_g=L_PSO z-&K|4j5rY0T-z#GVSe>G-3Sv0ZfNUOqMM^lao6pSIps|1l8Nf$q z@rp!6EJQInrgmUvnn(x4y|%shGcwP^v5@Y^J?uIr|LJ$1@|-f_69#!nJuJ%FEwI4^ z#k8b?-)q)d^C6U~SE}AH{mWp#QWN{B%{`6k>r_F^T2NncBn32yv^73vE+lbbYaO`SE+YFqTTU*ph-;OX;eJGqZB#Bx|%xk5;AqD2Y8cz^}7ke2( zu`TjrC|Ki~1+xT(6MkC?4n8rcTTF;ols))vKK9us)GSI^YdhDQ4&z@4{}{Ne%i31F zfl+YRkd=G233#RK%fz8 zI*2h*bptH7iU*1sB&4bbB&qCCVOeSk`}eKF^98mT~gGL2j0^BaW<=% z!j_fI^P)ReG(^Fh8N&$zV4p}>4<#DAva=8wEs48B0VlJom|1EL=ajJqc&Rr;PFTq; zMf*}~Qrfoy0MQUov(mMawg^q?idcbLdwgn_Sgja~GV&|9b@V&IaR36bA}mNvKpA;l zj1-W3dTLaXcv#6A!+ljx4yM$?(D23vqSxL^{#OgY}<02jp~Ci zlzsBt-e-Hz%s|t*mpO+M3W2JU!`~zx(4I>m6Q0}tPJwXyL;}*RsIP;T#6uxKap)*| z92^BVhl9tNgDonc&%wGHflSIb`KS8Hj+6xMcxvThWU^orTN)CQ_y*ylWgn=IJ$0)x z)>ExGB3*AHBZ;g$c1jzM$vtRn)8=)qA#}5`L`bW8VT+G@d5Vr*vwEGKOx4M8Z2i*_W$dOj~LhK50ywvA~(eb$6_rQJFy8bmguV z`bSGBU^Pd{VN52rDNhx;Ef3f(%}l}XW%VeuOSwuS^H>jpgk~xdV)uIONF%X)n=LwI zD&+?yFjtNkfNTD(F;OMtEiV;>M6VUttM&|;QO=mGp5Co}Vp(topRgE~@wAi$f&u-I zcWQF61kt=yqbJ8jb9PchKO{gWjqBASNn7&Rrsm{WIOButfZ|emb?|CVhc&OpTyZyb zxVYSYX^*=c5;z&GaSN6QKiTyoGaul%ew>iql#O7SgMy=8X*^km$&*F=8Ornu=JN0; z4lF`;{)|(MSzY6@WW7B>^|9eqn+$LQZ>&HoMsK#xOO`7bD z&__3%OoAnDR*J9a&bdhkP2$dChu7;tg{y(@(%FRpm{$e_Bs?flu`oY*`h<4C){4or zUS?=SvN{H~t#YCsXO-a(;WBS`#LQ52rEWF3#9Zb~w8Tz+y*+~bJ>P=d>e1d_O{eH4 zx*P9cC_BU`F7EBDi`_Y@oAmXhkv2RXdRpAqcbuzD7SSV;Ey#dR9*EU?u+sv8eDTP~ z8%hu|n?AZ$M@W_@7k=4ohf!#d`QQ^6#gkF4phsqTvX1T#tpMa-p3((o<0mH@q~FX@ zOqo_AS-oYBOfqziWWbtXS0HUxkTQd}&CrdUwRU|Fb^-ALX6#s2WT*Aoe|XB1Si6*3 zGWhC%0Si5yE(J}z-G&aW20gsxGdX=7CrZ5rMO4hFn&>%1qJ2K`2}yve7VoCOSC+3B&bsHe>?n%!L_Rx@2t; z9v*9LYP%y0?kSz!$o^bVhg*q#2kt0stT8eM=5i0c<#eLxZPSxprAT({<}osp1*k*n zH14SC!u3zNk-RJL%pvI3`a+JK<0hpM{Ut7c;K(&rOwNKK`P5zeH&i01SZNtDE6Jgt zy&HhHho#!_JycWSO$w=MjG~+kgd($N(#@PNXIYb7uH2dl!Bl6Sa@CIBJrDkzo^Vdj zh^P2DLPh?J?|u@2)frQqf8yVdl&de?_Wa+3dTKD@~vMkn|g`pmzZLdD~iiAX5p^9-uI6m(NWcWBC-x zWEHGj)Qw>7UwoC!kH;L^uJ_&FV}9MM&(*b_xDYq%KTm_<^>q|0xyDO2`PA~2HnwmB zu{nCXZs+O7fX~3(P9V90Sb*kfEU_w~eimLTzO0}3*SWo6zxa9N^giaX>EG1p7izHD z0HuS!$By@U%~-D%Tr{iZpXjG9C`m8yJ)%JS&)D`tyE=q1GgQ2<{Ln#}d^kpxz3LF${ik7KBL-mJ0}ZTYy)#N;(p{h-5jpXPO*d5!}y z$R`@2##X7N=S%aL-3Zhs&uD&IGI`X6r_^qF6qt)WoC&mmmC1J4*V`79wK3DW6YMGZ zSsP{3bec#Cl8VDwxZ)^Hs{-oy8>4*;m%&Dujx7_3AdoUgu)xfHm8jN!C6p&mDkN#K zjNqxMYICP2QYlLb1T5RzWOkB8fL^Ze2 zo?lEc56O$`bo00E=&M}M8VHP~;S}ia3DAN$o%|<{E)`^ z0auvV?`9u|t;A-!wMSM}(^F;QDG4#zFT=xr!DYeQCReyrm7SM?brZPM9;LRsRD3q8 z-UkD}yjGws?(-5pYxY!Zx8iRoU7s7w?xI5tt zr%BAcRV-&lqw_Gf#>BRg(igtnZ4jNGrRr|7&E^y(xop9nW@l^`_xqDgZF2B1*gxN& z&og)p{Ym-SeZ61Z@w$!*xF`RimKjG%jl<+<>=s0z`-_(>TlBmx`C{AcFLU{kROf0Mv(ub+50EKvnFDR-O&+j z9`HrAH9}KA3jD?ps)M%S2#enqpC=MMMPvbJ+&vm-vkW7~l^#9L+t>=^Lb^d`DE6S{ zWHwgEtJvIcGlgG-A~;!m);;KN+oQr`s7kQ7>{r{2YboyxjST5`S=v|O{R(6}jHO-j z7P1$YMh(Q#(vr9=>~`JLyMqjBaPzS77Vimb{(fhJB+diQ zKQ*y759A@ZsgZ7>v!us}0m4nAcC+*-NqwjMdn1aH`rf{o)U}NME+f2Gh@UZ*0}~{* zDCs$tKI9(MT3Dr0P6MVf0uxlR-?5#kRYusURqh};L^x4gZ`4`XuP|<*)lg;XOZZIt z7_jkd*s}~BXTx!M0iu$z0vul;-7{FT=4BFAu zpl!-dyjTNNAKcQ5xG!VZkrWOeGe-<}P@zqC-v$fFRyp5Lm`)0_iJq@)uL^G}OXJlu zwbHhCz92Muq3E0^p21Bl#Yacwi(o23Ln#G~tH}FUp(-J9Dx{IG9OiN9oCGPbkJ$Qq9!y`PgFh(Y7j()$S#n{KW`LJ9Pd-Wv20B^nf?A3nRxAa%=g zTq_x%g9A6W!{MENwmqR0pF9f4FqH^*41Tf6DZq<3gy?x5!^G0HT9^O{2FG1(s>@1D zUQKGVy~Z_J>_x(_& zT2X_)2tZ&Uz$(ij%3FY6P*ne!s;(u1oI4K)jTA&EmD|exUMBlraLH6#OPNtsbIWLH$(F3bI5i^s^%V$u4xSdDSuxPs`kM+Q_>QqE& zDi##Z!=z}_PLvTDF7BU&9W6H04mTOC&9FvcF!iH}p6uVFNF8ZVmCeu&5$6^rGg`jN zSl}J5IV{}Oc&?*WE#H3_^ve8+*Gr`)y;U^zy=1D~P0I~YQ{IJ}-f5n-W}n+hS2b39 z7Dtc|7RmB!DOm6#HHQhanEq+T-TLvPrPnwwED@7jirQEkg@SirkIq5U=z?i zyL!TcEIgXVbjrXc97*{hXo?`IBOML{|4I-KZFsgwzETdpRZh08RK5yjE z%J1r*QmgeaMsh2;s^|N7KGn~g8JjF~?QE8?b(|}l?vq+>$*;(AC3DV4tnmiEh&Ib&)@g zWUk+GNCDk|2y&hUByO5%Al2!=>*P1;v$^SD9Y#Z*KT;R@y01e>mq6D~$^`CEsoW=( z{-J>E0XaL9PuJBOWy&r0A#w1na_j2W(I2Yp+Kv_Mi_81|BR{U!b6lmO>)|~J<~wAB zH1t^_G7dU=<~$WO17}RVabS~QRq!HkFS7cmIub}_P0qIz88NFchQZ;UP~{7iGoScq zsJw-`I8e18e+WzY$60^oM`i25tb(=7Q#O*99=vV|y|7b_QK`p5foP)0MHkH|Ah^4q z&Asez(o<86=;B{%UF_clF@NS-@2}Qh@8pY!PI`A+>}I&IJ@r-|pZJ(!8!}um2E3Lp z^7W!s3{6Q`CB6PWUID5O@cKD5KYqm(lJG20{wr|aX1B{Xf5d-w1b+i18EA~T%u~8@ z+en~hyx58UWX?#ea^CRJM($H9k^YBS7k;qyn8?U3r<8iyG>)~-vfU65dd2`io z>xnduli@-gVl|O0Gq%1tg11s$p;93GW?-KCL6+#%G8^&cm;N7t&6jReqN0uxODKZ+!*^9PHwe%97wl_@?{G*R(N87?+a7wI6f5U?iF)wp4jeN9K_#PWsyibvR_E-T;2g6Y0+ zAn&qi*fEmLM$vS7#Sr}T+gP*86Z5Kp}0Wz z`_XkQ&f1eTc(1gLZHL<{j$4Tp1UK9>3V(+~NjTeFmkq0p+Pr>$bILt_w5xPXy2Wa4 z^!sQfM}FY0Jh-%_zT_2`GogK4r|M+n)6$penqjINWQA^ez@jlm8r*ELsq)=enIUnA z2BPD8-7a8>-wj@@#Dw7D=npvHe7W8G+ zQ8NEZP~yv^sblX1sMxKzm4y;B2RMgOm+F2gn#*u%FnGA13dwz@mS^>Dp+9VQoo zYrXm|IF`xsgY8O*XI1;L+clW1pTqcDbF-Jl9IN#p&aMX55JrTT_57Z&PJ8l`?pkkL zFewQF8C&-|s_9!B{a9i>j^$DR3*I2j{e0Vikt|3G`}KzG&)ml%{8BEvr%PGa4!X#k z4hqN(OqqCwOtO6Vg6d*1%&$w<-1miAnyHZuPdi_)=aM*JHlLmCh|wo$ZgxImr}gPc z;dxm9CogpKq=+Q?bhL1dCk;ZHSo7($k4h1zu*`ODba7brcfni2H%+EN$_fyANI!`V zsXCQDv-dw#1(h=w4zRaONUEZo4ByXV7kRgnW+N~Ix18kU?q#Al4IN){M+H5Ld7HE< zy4S!Sdpg`cZTGA5#1;0=v?(apn5;*jM);2?^D}9I(yEBP^~0K$Yof-iWX23 z>9DQ(K1WC}K0MxD(i?*VjEgm}z4WO`O)d>pBqy4gGj}i)evjbV)bu}|nZQbo(GYpX z!Fu$$1hQ9)Bs$hZbLt2B&qD?>s#Y;mL3f!iw0b%+EjwmDSqWy4orKx8;&{quo8XpA zV|b%9(28M3ScmnrpS)h+euz#Z(6lTD`Z(7X_mk8W4;F)a(wCV z%;sk?+9Q1-PH`LHWUXp?3*IaYH)-DZO3)kC_mv}(^id%+p07q2S4CA8{b_uW$D=~9 zt~*Aa$vr1hW6SN!tvXMzWuibib>D@qBoQ&Pn2gJvKPpzKblWY_ogn(9@lUiCrFJfL z!Wc;2y}08ND2W&OCUWld_lmN83)%rNQA*wyK_uk~7YC;J;=<9DVw9960c{Gg z%=ez*1-X8Ze;x_%+v1Mp(8Yy88V)ZN=c(7Vyy_I)p4;Ar%eUOFP_F23Tnk+;R8&J> z=-SJ#<*)2LalUpt@c6b#L^({Wo8qFJp{_*3)}xt)93Duf}jK{5^G zEZ_GNuCv6hTM?$vU|LZUOdIvki{oW8xKSl|FaQ_^T!I`o)#`y2`-v0mt%O1i(feX(4K0bSh)pdbV=IcmuMk0}ZA7LLfYw<=_EIO-W&*z)8JwL2U zR|-&#ID_v;{)C<&DKw3@yEg6a_2D0hb@A-v*on#S0;}xjGi!QQ;WziR-?6af{2)`3 zf!@6ATUTe(*VoA&X$AHhMTJ0`cp}^00nx80GMGGdCB?+XyKODZBUZ5E%{!>ZJ+3-e z%(}QhnSrYU(z1K~a}R6Axe(d2+GRrwH0JxuyXViFVo-<|iONbR-pC&Iun`3J1O)ej zM3#f$as9x8AMwnib$!9#rayDHBX>5g>%F!U?{uTvI%=x$OM2P3fify!M4Mhwa`o+{ zZwa{5I1MT@#-i6($YwSAivqpHPP^A$wjRce#|}52R1wd8eIJ1(sse_)yN7}G4koY| zUnV?$5Fydb(n#nNZ?rKxJ>+{B;ttGU9(hj&3=RQsvNbwL7iGeLq4;=haK}3&%au2UI~!KU^dpTS?B3c{zFa@4 zByvC*>V>s0vxPj7)o~9iRj}ViyHKDq&aHYEu>q&+y$i+MSD-5lVX|!i*3`IL25-&3z zHxN2&=3E}4m#m%qE5H#n6Bx(jn7}^?jTgZUVT2FCZ0h+wyTeO&&!Ge8IqwM{_p(yK zkoR`&sGzvw8dxiu%+@atrVBdVXNAl@_6vCH1GwcJNsdN(JTx1;T7#fHz@K2>Gk?Uh7tWu0_qgGKwm`xp#)|zUoxLZ)Hj;|Awqabj)OB=4O zjqg{mi@@AF$(ub*lbJ*g4rIyWT`&%F!;f=sF+IcnZ>*CjWlALpjFpRgKP#W+z_Ax? z?Rh-iXjEZaLdHQs}I*9vbr^5ETlG{Lv;g%Qog{8T#Ou+_cSPKT#f zA6l;u)D+l7sv3hGnYRiF+6XhXNw&9-ZQVE3!aO``2T2m_M)1QtJ7F+sMfNTg*7oN} zUwr(0$2GdXLh&eH{3iBzs zdqwFf%;8k92FofZ(YZO`TPPNa=VUG2^-g?e7y_Hjib)TcU*Y(L7e^eQl$nOQ*y0=X zJ_~Gho_D{LT^yM9OEhFA)5dhcE=9MDt8-oN;WOooWd|B8+1eTx3Z%gS8rnH!a?QzO zrcv~%`8!nXv?t|#v=9xvABO&d+E_&zh{d`7^PMD|%`h6=c^qXhj9_8%#vOZcB~_@s zw4t)UWz5tdqI^2zqc8nO%vR`WN0E^u-sZNp47~+WFLl_xo_fb~pFz(6 z!s6?&1_vEGp~HpwynIw*E!P8f`cc>>SDCN-S(lmo| z5{6DF7R}>am@HS-`@QFZkBqd5bv%a00L5eDBGkrIsy*2dv+Cdd%pAe`d1T!Y4b@Jj z>H21j-Qv%8f4k??(vopJDe`J8iCw$NJK^Ew6T;AM3S-k}qNQ%hbnKl(5nGy8C$Q9n zuS{2~#Vy@PNY?fg#_2EqR5u()NQFbXUyk4ep%!^fpM_I3rWf1tp&ZaVsMGlXrm3jO zH;kOdXf1YgT0a^)loY9>lD*huD>ou+J%g$#>!{KK*L0YdmE`kA-Ya_NFH?Rja|uY+Z1~7hVjshK6b8mYXSIk@ zWeOhzCBMg78IWj~uI9t+!(+E=`?tv7mjm0AI{qtdX*&D7_U;$U0~CE}cSV0F&eG|< z`8SbdVE&ATsyDLV#rlOX7>KN$HEqVvD(+QG%Jf?d@i^H8skaE{H<(D{X2{3rtD*6h zFdMlWnI4l`{gy^hvEM2gl(HKQkh{+q2YM?Ps+KpuhQVCs!dGt*AVOoNRPDrb0y%ZX zg|N?*eu$U+@d;`9SaeH&J4;oK)??m_C|1uHx}x=Z8_c)=vn;zm%WZrk6;EmaP!+@g0@t%WgUiU}I6^f&H0JQNK$_%%X z;B7mpIdE5&;L;sW0oUdpK3xgCNgy=Jm)yu8-z3D?s3e@Y8dJOON} zN?j51|LE;JqngSZHJlJBp=uNjMTl_d3Mqs(fDt4Tf*>F=HhL40E<~gpG~%d{5}I^0 zBcg&Z2oe-AhAxPJA}U=hQAC0uL`1m9`Mx!yaPO@7b4+Qqz z4i52t!k;g_n6WoC&iDG#CzmTNTtQ~hMSQ%R=<#p1vq3_oY2_$GyW(Cg+4pwR?Yrux zz5RM90iyPm1o>*mO-@l~^CUjzjJ>!|XuKHX)MHSj-?LJ*HbBJ*~ zGpjQh6F0y&u5KZhv>r_@?tNE&2Bep?bbNm5H#^h zhdnrCMSD$ND2kdY^HQ+>w&x|f{-n&srAT*J|5Z&IT%u2Q;V9#!UYy;njE>=6P5SsH zAupx(Ftbst;=P9935-mU%rSpfAA8OG*U=m83u%=qK#~9Zirz};RvYIApMvN^of zvN%t4+VK$lDthkzmF+>t{VumY7u=M}S3Vl2FQKe@dDHBYe%t$?vZ?jrgl9|aCu8xt z&o!>AF5TeH*>8TY`2;Kj#W}Wa3lx%i(M7)?v3MElRUM+gfBCc~F8g<3#vPrzOYyV! zau>c%mw)95N>>HWogcI194NH2oo$*FDTOKW+t$WR$(pMl8~QwGKiA|l|DaP?a?zz` zYPc{yelaSZG^vMct|)KNnXEeOp;MYut2COw)O+;X z+}q*8rTykbOA^to-bcPpM%&pJ2FkjtW*>)%a>89+KWFSsn(|k+c=4KBUcZ#Q`_svMU3gnqKg+xE0HaqmtkPiH5G ziK<%9-ast@Q#LXTQ8tL&H29%8@wsz&(Qk`SB^|0d3(U*n?9z@#9&wuZaIBj6%|p-O zoG(jVe`DmPn<=uFE#d)Alw{-XhI|orANamYQD5w%Z})D1yxo~&m2zA@hiZ8-SNDu!O#XQwFN1!MYH=Ef*@ASVaG{DAz=AVsQ3V;F zN!L>wwP*5A0WrGBLJIc~MX(!Xo=SIO^8Wy00Hm@FmqHPcP(xYtIbif4MZf~`Qs`q$ zeiBec<@PiAnSf#%oy82(8DMp)-r-9KTpo+ph%nTu+W~p3rihstcWT49W z#D3JQ4fi^;Vn50?m7b+Gsz#wXpj=bv2bugj;6plnBa@#81ZL5XF!`lGU@F}Y@VE(> zZb9Y(qgoW2BdQ>U-lFEg0!-DB3V_F5pfruXL(QWM(5G@6m=*g_dnjB>W`!e4DV;9M ztT=$mwBdeZR%}PDr*c&&zhaPc6mAUVf(9}ixJW_yQY}sb9ZY&Q6Jx`bq_B6Oim4WN z0oydX38f^1E>9`Rq+ez3QbT4iu~sN`Di@%Xq|nbWcj+R1m{?a-GsWU6kZx^}3aqoS zNB~|@xxZ4-sz_Be4?6J5#-bSTwmv~c^{9E20Fs$>eF|C=d6k)>f^1`ANvJ$#3V=Mr zOu-^QsvO2r`!_(Y#SJ?;t< z?RyLzkoqzRjcs;BETZU(MtWj*8Y=4S3q`WSgsI?w8b= z@TB#4(jK_7 zhlyFa=LuW|0fWEy09i1@p6@vndh~L2DDiS{s1x-%Q=2-b^H`@=i;_ld&``|g5bXrf zLWa6Gs`T%!%W9O(D&8>0YN9E8(>bfNdCPC@dPh21roPbjD+P5l?3fO*REm5(I>65B z`M@si>0mP)T@(!4Sv_x+UTqIb)X-Ao68zcYnl63UdfvpvTsV9}`wsi~{63aoKPoKM90ZfEj6+U6J(5Zdr1c+_zR9igk{mi=9vC-inTW#QTN(RxY-kr^pIM=lje=+4D$6(quQn{Mqhd zbiT)o3pw6n#*gfVpI^(;L&tXV2;?hrvG0*`k~2t_6T{qhW(`Y5F5i0w&YF|E+rm3Y zj`xl@(H%;j#0L1y7_e&48@(dZyVsC|@zE!{#~IQDlSUqfWsq#Fnzw-1Wh087@T*F8 z&{36PttSVOkIPMX%xJR)8Ll2PcvcqrZYxiidS|!@A?$17 zZ6fQ)nYH>0vqaHb{Hhq;j^sJQKCVBGWyM&J-^byZlc(h#dg*6%E0T9IdpDveS=i)F3MCs+m=WAankL#MO;g~nA3<}f-)SC5h7GN%gVQ#KphLt$R(FZeq(Wd7 z$`vwQ;(XY?2&aZY@GfWuy1?(i%X#8lH<36bUu8s?qsy5F^TDmKNLT?PP&5z`C~PY6 zOo%4Z)m#?Y`z~-aw_0k{9$^445Hdy5g!o48sv|g#2q&6j!eQmS;a7t@V2Qg1(6=|I zABO%8!fncZ{P2sfxv7!4k=cde^>v09!iD#9!(BcFyU!C$xHL2EP)2}LgzWh+9SQZ@ zQvp%CakaO_HQ2AO50*r58!Oi{l($@2I$Yaty{H;3?^+wVMZ8_{wX}}zG{3**v`=Po zn4W57yVYx56;*3TyTv2ctV7xFydL+dKd*$<4TAl*lWxg-t_@2#xF(VR+W^_j{8G#K z!mTe8pU39rH%^Tu31VN(WhhU6Qpn66_s=2J9J&%8ollB5!m zD0m%c$Jxn|;sk@^pc}jo<^sP5ixXK`#TH^q3f6=mL)L`A`G^r^a1uTY??luK=OJPc zMiPQwiV%F_hz@5M<_C)xUJ&N{ak9Xz@OoH`v_LXMp072smZQaK0h3|MLUuytusRu< z3}1I78C(mFfl;stum&CsPl6{2CH>PHfCX_}IoH8K&;_Q4a22W(qrodA_@?d}?xG{c zoJfuV=O(xX^n>NX|F8K5t3h8*1K0~X!=6cuWq_jainYz{a4LKbkqKMxmol!x5#q#x zUtrIUzBC5aIe{dE`+9eE(y9*F0OEpliKs2&2|NH!1Oqs`NwP&KtT0v%i`)gjAf_pr z4sS*@!)@SdpbBYI5iCUpErCX$k!X0Uu(uE%rb{w$*L25Xq_C?~#I4}~LIjov0wfg- ze6hk)2=}926cL z=n=jWo?r|)=#BA^Z~hn2Xg}>Pe29R?cXGHkt++KYGWD&<3eP<^Suz1L{ z4>|8K22h6We?CFb2FP4bfN%jnvlG61h<{8%{qDs77wm-Z1M(9);qPw$<$?bHhbI^q z<1s{iV_k@fU|_t$DX;$>ZSXH*dLh8XkM`(;X@dbLNvlsy#-6pFb7zr-P$9wZ&4&-Xtlk?vgTO-6W5XRejkS-6d&KW3dT98rLs6jY)qwEw%XZhN&56 zr7gb+c!mAP)S#s%XR+t+24eaWA6w??US@u=*ml3lZiDz!IZrjQKSCt5*Yp#b zQ0uU2hr8hG2x=wFONCpS*Cj+2t;*KTJaIsBP&UdXb-Gq`Vw)Nd_VS~4VphtdD=2{^ zp}6e&UNF*DxNw`SZn)@)@zoo}+0t{So`&tOf-94ANjZ&IRc`30`D%BYoSi~tBC^^J z{+_!#5!aaFx4({Vdf!ZKvy5XDQcJqiM0Tuz%Q<%Hjt?PIs=oYSIH5U6vD~=)MWuIs z@z*TuOv9yparay;dmgOZnm^DFehi!bYZ0z6;{Ux+|E&}M&wT5jocMpPq#t$-EzHMP z9E;J%i9vYX7HT=^0S6FFkUhCctaet z%9fQgB&=8mcta!n@-fwivfx*&D`?)9zgHi+d{$@>OlJ9aiH5`#^$`sXSJX!|f*=)t zw>cur0}7H46Ni9lPKTm>zHcKv$KYTn)gCJJ{g(MN*c}?kKQF5A2#>IcKQ|l^!m?n+ K)zqx)$^QeT3yvcI literal 0 HcmV?d00001 diff --git a/inv.m b/inv.m index e233fe6..c70549b 100644 --- a/inv.m +++ b/inv.m @@ -65,7 +65,7 @@ (* fundamental scalars are used to seperate sum of conformal blocks over scalars to single[...] and sum[...]. *) setOps::usage = "setOps[ops] registers ops and duals of ops as fundamental scalars." -one::usage = "one represents unit operator. This is implicitly registered as a fundamental scalar." +one::usage = "one represents the unit operator. This is implicitly registered as a fundamental scalar." (* extract is a projection. x==extract[x,unit]+extract[x,scalar]+\[Sum]_{r,p}extract[x,op[op,r,1,p]] and extract[x,sec]==extract[extract[x,sec]]. *) extract::usage = "extract[x,op[op,r,1,p]] extracts terms of the form sum[...,op[op,r,1,p]] from x. @@ -73,7 +73,7 @@ extract[x,unit] extracts terms of the form single[Fp or Hp] from x (contribution of unit operator)." unit::usage = "unit is a option for extract and means contribution of unit operator." scalar::usage = "scalar is a option for extract and means contribution of fundamental scalars but unit operator." -sector::usage = "sector[eq] gives a list of all nontrivial option sec for extract applied to eq, i.e. {sec | extract[eq,sec]!=0}. " +sector::usage = "sector[eq] gives a list of all nontrivial option sec for extract applied to eq, i.e. {sec | extract[eq,sec]!=0}." makeG::usage = "makeG[eqn[sec,{a,b,...}]] gives an undirected graph whose vertices are OPE coefficients \[Beta] in extracted bootstrap equation eqn[sec,{a,b,...}]." makeMat::usage = "makeMat[eqn[sec,{a,b,...}]] gives a matrix-representation of extracted bootstrap equation eqn[sec,{a,b,...}]." diff --git a/ninv.m b/ninv.m index ef988dc..c8c48db 100644 --- a/ninv.m +++ b/ninv.m @@ -65,7 +65,7 @@ (* fundamental scalars are used to seperate sum of conformal blocks over scalars to single[...] and sum[...]. *) setOps::usage = "setOps[ops] registers ops and duals of ops as fundamental scalars." -one::usage = "one represents unit operator. This is implicitly registered as a fundamental scalar." +one::usage = "one represents the unit operator. This is implicitly registered as a fundamental scalar." (* extract is a projection. x==extract[x,unit]+extract[x,scalar]+\[Sum]_{r,p}extract[x,op[op,r,1,p]] and extract[x,sec]==extract[extract[x,sec]]. *) extract::usage = "extract[x,op[op,r,1,p]] extracts terms of the form sum[...,op[op,r,1,p]] from x. @@ -73,7 +73,7 @@ extract[x,unit] extracts terms of the form single[Fp or Hp] from x (contribution of unit operator)." unit::usage = "unit is a option for extract and means contribution of unit operator." scalar::usage = "scalar is a option for extract and means contribution of fundamental scalars but unit operator." -sector::usage = "sector[eq] gives a list of all nontrivial option sec for extract applied to eq, i.e. {sec | extract[eq,sec]!=0}. " +sector::usage = "sector[eq] gives a list of all nontrivial option sec for extract applied to eq, i.e. {sec | extract[eq,sec]!=0}." makeG::usage = "makeG[eqn[sec,{a,b,...}]] gives an undirected graph whose vertices are OPE coefficients \[Beta] in extracted bootstrap equation eqn[sec,{a,b,...}]." makeMat::usage = "makeMat[eqn[sec,{a,b,...}]] gives a matrix-representation of extracted bootstrap equation eqn[sec,{a,b,...}]." From 3afb670cbdac69dc2b0d1aaf99e739a8535a67f0 Mon Sep 17 00:00:00 2001 From: selpo Date: Sun, 25 Oct 2020 12:13:57 +0900 Subject: [PATCH 12/15] create documents from usages in group.m --- doc/group.md | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ doc/group.pdf | Bin 0 -> 43896 bytes 2 files changed, 129 insertions(+) create mode 100644 doc/group.md create mode 100644 doc/group.pdf diff --git a/doc/group.md b/doc/group.md new file mode 100644 index 0000000..f9e5ba3 --- /dev/null +++ b/doc/group.md @@ -0,0 +1,129 @@ +# `group.m` + +Supported groups are direct products of finite groups and some Lie groups. +Supported finite groups are those whose irreps was calculated by `GAP` (in `sgd/`), +and any dihedral and quartenion groups. +Supported Lie groups are `su[2]`, `so[2]`, `o[2]`, `so[3]`, `o[3]`. +We support only compact groups, so we can assume any finite dimensional irrep can be unitarized. + +- [Get Groups](#get-groups) +- [Group Data](#group-data) +- [Irrep-Objects](#irrep-objects) + +--- + +## Get Groups + +### `getGroup` + +`getGroup[g,i]` loads data from `sgd/sg.g.i.m` and returns group-object `group[g,i]`. +`g` is the order of the finite group, `i` is the number of the group assined by `GAP`. + +### `product` + +`product[g1,g2]` returns group-object `pGroup[g1,g2]` +which represents direct product of two group-object `g1`, `g2`. + +### `group` + +`group[g,i]` is a group-object whose order is `g` and whose number assigned by `GAP` is `i`. +Before using this value, you have to call `getGroup[g,i]` to get proper group-object. + +### `pGroup` + +`pGroup[g1,g2]` is a group-object which is a direct product of `g1`, `g2`. +Before using this value, you have to call `product[g1,g2]` to get proper group-object. + +### `setGroup` + +`setGroup[G]` loads `inv.m` with global symmetry `G`. +This action clears all values calculated by `inv.m` previously. + +### `available` + +`available[g,i]` gives whether `group[g,i]` are supported or not. + +--- + +## Group Data + +A group-object `g` has attributes `ncg`, `ct`, `id`, `dim`, `prod`, `dual`, `isrep`, `gG`, `gA`, `minrep`. +You can evaluate attributes in putting it in `g[...]`. +For example, `g[dim[r]]` gives the dimension of irrep `r`. + +### `ncg` + +`ncg` is the number of conjugacy classes, which is also the number of inequivalent irreps. +This is not defined for Lie groups. + +### `ct` + +`ct` is the character table. This is not defined for Lie groups. + +### `id` + +`id` is the trivial representation. + +### `dim` + +`dim[r]` is the dimension of irrep `r`. + +### `prod` + +`prod[r,s]` gives a list of all irreps arising +in irreducible decomposition of direct product representation of `r` and `s`. +`prod[r,s]` may not be duplicate-free. + +### `dual` + +`dual[r]` gives dual representation of irrep `r`. + +### `isrep` + +`isrep[r]` gives whether `r` is recognised as a irrep-object of the group-object or not. + +### `gG` + +`gG` is a list of all generator-objects of finite group part of the group-object. + +### `gA` + +`gA` is a list of all generator-objects of Lie algebra part of the group-object. + +### `minrep` + +`minrep[r,s]` gives `r` if `r < s` else `s`. `r` and `s` are irrep-objects. + +--- + +## Irrep-Objects + +We need all irreps to be sorted in some linear order. +All irrep-objects of `G=group[g,i]` are `rep[1]`, `rep[2]`, ..., `rep[n]` (`n=G[ncg]`). +all irrep-objects of `pGroup[g1,g2]` are `rep[r1,r2]`, +where `r1` is a irrep-object of `g1` and `r2` is a irrep-object of `g2`. +`minrep` compares irreps in lexical order. + +### `rep` + +`rep[n]` is `n`-th irrep-object (`n` is assined by `GAP` and corresponds to the index of `ct`). +This is recognised only by `group[g,i]`. + +`rep[r1,r2]` is natural irrep-object of `pGroup[g1,g2]` +where `r1` is irrep-object of `g1`, `r2` is irrep-object of `g2`. +This is recognised only by `pGroup[g1,g2]`. + +### `v` + +`v[n]` is spin-`n` irrep-object. +This is recognised only by `dih[n]`, `dic[n]`, `su[2]`, `so[3]`, `o[2]` and `so[2]`. + +`v[n,s]` is spin-`n` irrep-object with sign `s`. This is recognised only by `o[3]`. + +### `i` + +`i[a]` is one-dimensional irrep-object with sign `a`. +This is recognised only by `dih[n]` (`n`: odd) and `o[2]`. + +`i[a,b]` is one-dimensional irrep-object with sign `a,b`. +This is recognised only by `dih[n]` (`n`:even), `dic[n]`. diff --git a/doc/group.pdf b/doc/group.pdf new file mode 100644 index 0000000000000000000000000000000000000000..286f29b2567a75d48cdd6b262da1ad35c4824421 GIT binary patch literal 43896 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 Wpl9dsYf%D(U?>)knOQ_u^#1^{G7AF$ literal 0 HcmV?d00001 From c10744390d605d123ec01cb66094e27b5e1f0026 Mon Sep 17 00:00:00 2001 From: selpo Date: Sun, 25 Oct 2020 13:36:02 +0900 Subject: [PATCH 13/15] create documents from usages in groupd.m and grouplie.m --- doc/group.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ doc/group.pdf | Bin 43896 -> 49732 bytes groupd.m | 4 +-- ngroupd.m | 4 +-- 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/doc/group.md b/doc/group.md index f9e5ba3..92c1251 100644 --- a/doc/group.md +++ b/doc/group.md @@ -6,9 +6,13 @@ and any dihedral and quartenion groups. Supported Lie groups are `su[2]`, `so[2]`, `o[2]`, `so[3]`, `o[3]`. We support only compact groups, so we can assume any finite dimensional irrep can be unitarized. +This package imports `groupd.m` and `grouplie.m`. + - [Get Groups](#get-groups) - [Group Data](#group-data) - [Irrep-Objects](#irrep-objects) +- [`groupd.m`](#groupdm) +- [`grouplie.m`](#groupliem) --- @@ -127,3 +131,69 @@ This is recognised only by `dih[n]` (`n`: odd) and `o[2]`. `i[a,b]` is one-dimensional irrep-object with sign `a,b`. This is recognised only by `dih[n]` (`n`:even), `dic[n]`. + +--- + +## `groupd.m` + +If `n` is even, all irrep-objects of `dih[n]` are `i[1,1], i[1,-1], i[-1,1], i[-1,-1], v[1], ..., v[n/2-1]`. +If `n` is odd, all irrep-objects of `dih[n]` are `i[1], i[-1] v[1], ..., v[(n-1)/2]`. +All irrep-objects of `dic[n]` are `i[1,1], i[1,-1], i[-1,1], i[-1,-1], v[1], ..., v[n-1]`. + +### `getDihedral` + +`getDihedral[n]` returns group-object `dih[n]` which represents the dihedral group of order `2n`. + +### `getDicyclic` + +`getDicyclic[n]` returns group-object `dic[n]` which represents the dicyclic group of order `4n`. + +### `dih` + +`dih[n]` is a group-object which is the dihedral group of order `2n`. +Before using this value, you have to call `getDihedral[n]` to get proper group-object. + +### `dic` + +`dic[n]` is a group-object which is the dicyclic group of order `4n`. +Before using this value, you have to call `getDicyclic[n]` to get proper group-object. + +--- + +## `grouplie.m` + +All irrep-objects of `G=su[2]` are `v[0], v[1/2], v[1], v[3/2], ...`. +All irrep-objects of `G=o[3]` are `v[0,1], v[0,-1], v[1,1], v[1,-1], v[2,1], v[2,-1], v[3,1], v[3,-1], ...`. +All irrep-objects of `G=so[3]` are `v[0], v[1], v[2], v[3], ...`. +All irrep-objects of `G=o[2]` are `i[1], i[-1], v[1], v[2], v[3], ...`. +All irrep-objects of `G=so[2]` are `v[x]` (`x \in \mathbb{R}`). + +### `getSU` + +`getSU[n]` returns group-object `su[n]` which represents the special unitary group of rank `n`. +`n` must be `2,4`. + +### `getO` + +`getO[n]` returns group-object `o[n]` which represents the orthogonal group of rank `n`. +`n` must be `2,3`. + +### `getSO` + +`getSO[n]` returns group-object `su[n]` which represents the special orthogonal group of rank `n`. +`n` must be `2,3`. + +### `su` + +`su[n]` is a group-object which is the special unitary group of rank `n`. +Before using this value, you have to call `getSU[n]` to get proper group-object. + +### `o` + +`o[n]` is a group-object which is the orthogonal group of rank `n`. +Before using this value, you have to call `getO[n]` to get proper group-object. + +### `so` + +`so[n]` is a group-object which is the special orthogonal group of rank `n`. +Before using this value, you have to call `getSO[n]` to get proper group-object. diff --git a/doc/group.pdf b/doc/group.pdf index 286f29b2567a75d48cdd6b262da1ad35c4824421..2f1efb6ff0e65f3fe487fe0dec97bdcbeb1e4315 100644 GIT binary patch delta 45613 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 E2Z17Uwg3PC delta 40187 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 IBC96%Uolc Date: Sun, 25 Oct 2020 13:53:29 +0900 Subject: [PATCH 14/15] update documents --- doc/group.md | 15 ++++++++++++++- doc/group.pdf | Bin 49732 -> 50591 bytes group.m | 2 +- ngroup.m | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/doc/group.md b/doc/group.md index 92c1251..2c9ed99 100644 --- a/doc/group.md +++ b/doc/group.md @@ -3,7 +3,7 @@ Supported groups are direct products of finite groups and some Lie groups. Supported finite groups are those whose irreps was calculated by `GAP` (in `sgd/`), and any dihedral and quartenion groups. -Supported Lie groups are `su[2]`, `so[2]`, `o[2]`, `so[3]`, `o[3]`. +Supported Lie groups are `su[2]`, `su[4]`, `so[2]`, `o[2]`, `so[3]`, `o[3]`. We support only compact groups, so we can assume any finite dimensional irrep can be unitarized. This package imports `groupd.m` and `grouplie.m`. @@ -47,6 +47,13 @@ This action clears all values calculated by `inv.m` previously. `available[g,i]` gives whether `group[g,i]` are supported or not. +### `setPrecision` (only in `ngroup.md`, not in `group.md`) + +After calling `setPrecision[prec]`, all calculation in this package will be done in precision `prec` +and any number less than `1/10^(prec-10)` will be choped. + +It is assumed that `prec` is sufficiently bigger than `10` and `setPrecision` is called just once just after loading this package. + --- ## Group Data @@ -163,9 +170,15 @@ Before using this value, you have to call `getDicyclic[n]` to get proper group-o ## `grouplie.m` All irrep-objects of `G=su[2]` are `v[0], v[1/2], v[1], v[3/2], ...`. + +All irrep-objects of `G=su[4]` are `v[n, m, l]` (`n,m,l=0,1,2,...` and `n >= m >= l`). + All irrep-objects of `G=o[3]` are `v[0,1], v[0,-1], v[1,1], v[1,-1], v[2,1], v[2,-1], v[3,1], v[3,-1], ...`. + All irrep-objects of `G=so[3]` are `v[0], v[1], v[2], v[3], ...`. + All irrep-objects of `G=o[2]` are `i[1], i[-1], v[1], v[2], v[3], ...`. + All irrep-objects of `G=so[2]` are `v[x]` (`x \in \mathbb{R}`). ### `getSU` diff --git a/doc/group.pdf b/doc/group.pdf index 2f1efb6ff0e65f3fe487fe0dec97bdcbeb1e4315..dcd26cf67d476195e829e7c41ac5bf44a0cd0f60 100644 GIT binary patch delta 22835 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 StLq|*rUnwlA}wubhW;N;)n!ru delta 21938 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 G!hZnk`@X0E diff --git a/group.m b/group.m index 9ebbba4..b29b334 100644 --- a/group.m +++ b/group.m @@ -4,7 +4,7 @@ (* Supported groups are direct products of finite groups and some lie groups. *) (* Supported finite groups are those whose irreps was calculated by GAP (in sgd folder), and any dihedral and quartenion groups. *) -(* Supported lie groups are su[2], so[2], o[2], so[3], o[3]. We support only compact groups, so we can assume any finite dim. irrep can be unitarized. *) +(* Supported lie groups are su[2], su[4], so[2], o[2], so[3], o[3]. We support only compact groups, so we can assume any finite dim. irrep can be unitarized. *) getGroup::usage = "getGroup[g,i] loads data from sg.g.i.m and returns group-object group[g,i]. g is the order of the finite group, i is the number of the group assined by GAP." product::usage = "product[g1,g2] returns group-object pGroup[g1,g2] which represents direct product of two group-object g1, g2." group::usage = "group[g,i] is a group-object whose order is g and whose number assigned by GAP is i. Before using this value, you have to call getGroup[g,i] to get proper group-object." diff --git a/ngroup.m b/ngroup.m index b503765..d5da2dc 100644 --- a/ngroup.m +++ b/ngroup.m @@ -31,7 +31,7 @@ minrep::usage = "minrep[r,s] gives r if r < s else s. r and s are irrep-objects." setGroup::usage = "setGroup[G] loads inv.m with global symmetry G. This action clears all values calculated by inv.m previously." available::usage = "available[g,i] gives whether group[g,i] are supported or not." -setPrecision::usage = "After calling setPrecision[prec], all calculation in this package will be done in precision prec and any number less than "<>ToString[Superscript[10,"prec-10"]]<>" will be choped. "<> +setPrecision::usage = "After calling setPrecision[prec], all calculation in this package will be done in precision prec and any number less than 1/"<>ToString[Superscript[10,"prec-10"]]<>" will be choped. "<> "It is assumed that prec is sufficiently bigger than 10 and setPrecision is called just once just after loading this package." (* all irrep-objects of G=group[g,i] are rep[1], rep[2], ..., rep[n] (n=G[ncg]). *) From 3384c1df0f14a642d7e8f3992b5e46a90f334e6f Mon Sep 17 00:00:00 2001 From: selpo Date: Sun, 25 Oct 2020 14:01:36 +0900 Subject: [PATCH 15/15] added table of contents --- README.md | 5 +++++ doc/CustomGroup.md | 8 ++++++++ doc/IrrepLabels.md | 12 ++++++++++++ 3 files changed, 25 insertions(+) diff --git a/README.md b/README.md index 24658f0..ddc6da4 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,11 @@ or [An Automated Generation of Bootstrap Equations for Numerical Study of Critic Some usages also can be checked by typing `?someSymbolName` (for example, `?getGroup`) in [Mathematica](http://reference.wolfram.com/language/tutorial/GettingInformationAboutWolframLanguageObjects.html). ``?somePackageName`*`` (for example, ``?ClebschGordan`*``) will give package-lebel information. +These usages are also documented in [inv.md](doc/inv.md), [group.md](doc/group.md). + +- [Setup](#setup) +- [Usage](#usage) +- [Example](#example) ## Setup diff --git a/doc/CustomGroup.md b/doc/CustomGroup.md index caf06a2..210bf19 100644 --- a/doc/CustomGroup.md +++ b/doc/CustomGroup.md @@ -6,6 +6,14 @@ You also attach labels of irrep-objects for all (unique) irreps. [`getO[3]`](https://github.com/selpoG/autoboot/tree/master/grouplie.m) is a good example for creating custom group-objects. +- [`isrep`](#isrep) +- [`minrep`](#minrep) +- [`dim`](#dim) +- [`dual`](#dual) +- [`id`](#id) +- [`prod`](#prod) +- [`gG` and `gA`](#gg-and-ga) + ## `isrep` `g[isrep[r]]` must give `True` or `False` (`True` if and only if `r` is a valid irrep-object for `g`). diff --git a/doc/IrrepLabels.md b/doc/IrrepLabels.md index 6ee659e..ffd5883 100644 --- a/doc/IrrepLabels.md +++ b/doc/IrrepLabels.md @@ -1,5 +1,17 @@ # Labels for Irreps +- [`G=group[g,i]`](#ggroupgi) +- [`G=so[2]`](#gso2) +- [`G=o[2]`](#go2) +- [`G=so[3]`](#gso3) +- [`G=o[3]`](#go3) +- [`G=su[2]`](#gsu2) +- [`G=su[4]`](#gsu4) +- [`G=dih[N]` (`N`: even)](#gdihn-n-even) +- [`G=dih[N]` (`N`: odd)](#gdihn-n-odd) +- [`G=dic[N]`](#gdicn) +- [`G=pGroup[G1,G2]`](#gpgroupg1g2) + All labels of irreps are defined as follows: ## `G=group[g,i]`