Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,22 +1,22 @@
|
|
| 1 |
#!/usr/bin/env python3
|
| 2 |
"""
|
| 3 |
-
PRACTICALITY SYSTEM 24.
|
| 4 |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 5 |
ARCHITECTURE:
|
| 6 |
User Text β [GEMINI ENCODER] β AXLProblemDef
|
| 7 |
-
β [STRUCTURAL SKETCH] β Axiom affinity map
|
| 8 |
β [TEMPLATE ENGINE] β Positive Space Grid Sketching
|
| 9 |
-
β [WISDOM LAYER] β Masked Deduction (
|
| 10 |
β³ [UCB1 BANDIT] β Reinforcement Learning Axiom Selection
|
| 11 |
β [GEMINI COLLAPSER] β Domain-language explanation
|
| 12 |
|
| 13 |
-
CRITICAL UPDATE 24.
|
| 14 |
-
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
"""
|
| 21 |
|
| 22 |
import os, time, random, math, threading, warnings, json, textwrap, itertools
|
|
@@ -45,22 +45,22 @@ except ImportError:
|
|
| 45 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 46 |
# AI CONFIGURATION
|
| 47 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 48 |
-
DEFAULT_GEMINI_API_KEY = os.environ.get("
|
| 49 |
-
GEMINI_MODEL = "gemini-
|
| 50 |
|
| 51 |
warnings.filterwarnings("ignore")
|
| 52 |
USE_GPU = torch.cuda.is_available()
|
| 53 |
DEVICE = torch.device("cuda" if USE_GPU else "cpu")
|
| 54 |
-
print(f"[SYSTEM 24.
|
| 55 |
|
| 56 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 57 |
-
# SECTION 1: CONSTANTS
|
| 58 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 59 |
-
SOLVE_THRESHOLD = 0.001 #
|
| 60 |
-
VERIFY_G1_THRESHOLD = 0.005
|
| 61 |
VERIFY_G2_TOLERANCE = 1e-3
|
| 62 |
-
|
| 63 |
-
|
| 64 |
N_MPRT_EXPLORE = 1000
|
| 65 |
PROJECTION_CACHE: Dict = {}
|
| 66 |
|
|
@@ -300,15 +300,21 @@ class AXLtoPSLCompiler:
|
|
| 300 |
else: lines.append(f"{c['kind']} {c['expr']} WEIGHT {wt}")
|
| 301 |
for sc in prob.scopes:
|
| 302 |
lines.append(f"SCOPE {sc['name']} ORDER {sc.get('order',0)}")
|
|
|
|
| 303 |
for c in sc.get("constraints",[]):
|
| 304 |
lines.append(f" {c['kind']} {c['expr']} WEIGHT {c.get('weight',1.0)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
lines.append("END")
|
| 306 |
return "\n".join(lines)
|
| 307 |
|
| 308 |
AXL_COMPILER=AXLtoPSLCompiler()
|
| 309 |
|
| 310 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββοΏ½οΏ½βββββββββββββ
|
| 311 |
-
# SECTION 5: PROBLEM COMPILATION
|
| 312 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 313 |
@dataclass
|
| 314 |
class Constraint:
|
|
@@ -405,6 +411,7 @@ class Problem:
|
|
| 405 |
is_quantum: bool = False
|
| 406 |
circuit: Any = None
|
| 407 |
quantum_vm: Any = None
|
|
|
|
| 408 |
|
| 409 |
def __post_init__(self):
|
| 410 |
self.compiled_constraints=[compile_mc(c.kind,c.expr,c.direction,self.variables,c.weight,c.scope,c.branches) for c in self.constraints]
|
|
@@ -413,6 +420,21 @@ class Problem:
|
|
| 413 |
if self.is_quantum and HAS_QUANTUM:
|
| 414 |
self.quantum_vm = QuantumCircuits.NativeQuantumVM(self.circuit, self.var_idx)
|
| 415 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 416 |
for mc in self.compiled_constraints:
|
| 417 |
pair=_extract_ordering_pair(mc,self.variables)
|
| 418 |
if pair and pair not in self.ordering_pairs: self.ordering_pairs.append(pair)
|
|
@@ -439,6 +461,20 @@ class Problem:
|
|
| 439 |
if target not in self.monotone_targets: self.monotone_targets.append(target)
|
| 440 |
except: pass
|
| 441 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 442 |
def tensor_energy(self, X: torch.Tensor, step_ratio: float = 1.0) -> torch.Tensor:
|
| 443 |
if self.is_quantum and self.quantum_vm:
|
| 444 |
return self.quantum_vm.execute(X, step_ratio, DEVICE)
|
|
@@ -479,7 +515,7 @@ class Problem:
|
|
| 479 |
return total.squeeze()
|
| 480 |
|
| 481 |
def scalar_energy(self,b:Dict[str,float]) -> float:
|
| 482 |
-
if self.is_quantum: return float('inf')
|
| 483 |
total=0.0
|
| 484 |
for mc in self.compiled_constraints:
|
| 485 |
if getattr(mc,'weight',1.0)==0.0: continue
|
|
@@ -512,7 +548,7 @@ def build_base_problem(axl_def:AXLProblemDef) -> Problem:
|
|
| 512 |
if axl_def.is_quantum:
|
| 513 |
prob.is_quantum = True
|
| 514 |
prob.circuit = axl_def.circuit
|
| 515 |
-
prob.__post_init__()
|
| 516 |
return prob
|
| 517 |
|
| 518 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -613,7 +649,6 @@ def compute_sketch(problem: Problem) -> StructuralSketch:
|
|
| 613 |
notes.append(f"{len(problem.bilinear_pairs)} bilinear pairs β BILINEAR boosted")
|
| 614 |
|
| 615 |
if problem.monotone_targets: affinities["MONOTONE_PRODUCT"] += 5.0
|
| 616 |
-
|
| 617 |
if any(problem.scope_vars.values()): affinities["DISCRETE"] += 2.0
|
| 618 |
|
| 619 |
has_sos = any(mc.parsed is not None and mc.parsed.is_Add and any(t.is_Pow and t.args[1] == 2 for t in mc.parsed.args) for mc in problem.compiled_constraints if mc.kind == "equality")
|
|
@@ -672,7 +707,7 @@ def templates_to_hypotheses(templates, problem, init_binding):
|
|
| 672 |
_ALL_AXIOMS_PLACEHOLDER: List[str] = []
|
| 673 |
|
| 674 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 675 |
-
# SECTION 7:
|
| 676 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 677 |
@dataclass
|
| 678 |
class L9Certificate:
|
|
@@ -685,17 +720,30 @@ def _batched_deduce_and_evaluate(problem: Problem, hyps: List['Hypothesis']) ->
|
|
| 685 |
x_data, mask_data, target_data = [], [], []
|
| 686 |
for hyp in hyps:
|
| 687 |
xr, mr, tr = [], [], []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 688 |
for v in problem.variables:
|
| 689 |
if v in hyp.pinned_vars:
|
| 690 |
val = hyp.pinned_vars[v]; xr.append(val); mr.append(0.0); tr.append(val)
|
| 691 |
else:
|
| 692 |
-
val = hyp.binding.get(v, (problem.bounds[v][0] + problem.bounds[v][1]) / 2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 693 |
x_data.append(xr); mask_data.append(mr); target_data.append(tr)
|
| 694 |
|
| 695 |
X = torch.tensor(x_data, device=DEVICE, dtype=torch.float32, requires_grad=True)
|
| 696 |
mask = torch.tensor(mask_data, device=DEVICE, dtype=torch.float32)
|
| 697 |
target = torch.tensor(target_data, device=DEVICE, dtype=torch.float32)
|
| 698 |
-
|
|
|
|
|
|
|
| 699 |
|
| 700 |
for step in range(DEDUCE_ADAM_STEPS):
|
| 701 |
optimizer.zero_grad()
|
|
@@ -828,12 +876,19 @@ def _hyp_mutable(p, bt, a, m):
|
|
| 828 |
if bt.l9 and bt.l9.dominant_vars:
|
| 829 |
v = bt.l9.dominant_vars[0]; lo, hi = p.bounds.get(v, (-10, 10))
|
| 830 |
b[v] = max(lo, min(hi, b.get(v, 0) + random.gauss(0, (hi - lo) * 0.05)))
|
| 831 |
-
return [_make_hyp("mut", b, "mutable", "Perturb", [], {}, p.variables, 0.40)]
|
| 832 |
def _hyp_network(p, bt, a, m): return [_make_hyp("net", bt.binding, "network", "HubProp", [], {}, p.variables, 0.65)]
|
| 833 |
def _hyp_equilibrium(p, bt, a, m): return [_make_hyp("eql", bt.binding, "equilibrium", "GradBal", [], {}, p.variables, 0.72)]
|
| 834 |
def _hyp_superposition(p, bt, a, m): return [_make_hyp("sup", bt.binding, "superposition", "Superpose", [], {}, p.variables, 0.58)]
|
| 835 |
def _hyp_locality(p, bt, a, m): return [_make_hyp("loc", bt.binding, "locality", "LocalFirst", [], {}, p.variables, 0.72)]
|
| 836 |
-
def _hyp_extremal(p, bt, a, m):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 837 |
def _hyp_entropy(p, bt, a, m): return [_make_hyp("ent", {v: random.uniform(*p.bounds[v]) for v in p.variables}, "entropy", "MaxEnt", [], {}, p.variables, 0.48)]
|
| 838 |
def _hyp_injective(p, bt, a, m): return [_make_hyp("inj", bt.binding, "injective", "Distinct", [], {}, p.variables, 0.50)]
|
| 839 |
def _hyp_surjective(p, bt, a, m): return [_make_hyp("sur", bt.binding, "surjective", "Sweep", [], {}, p.variables, 0.45)]
|
|
@@ -865,7 +920,6 @@ class UCB1BanditSeeder:
|
|
| 865 |
self.total_tries = 0
|
| 866 |
|
| 867 |
def record_reward(self, axiom: str, ce_before: float, ce_after: float):
|
| 868 |
-
"""Calculates RL reward. Positive if CE drops."""
|
| 869 |
reward = max(0.0, ce_before - ce_after)
|
| 870 |
self.stats[axiom]["tries"] += 1
|
| 871 |
self.stats[axiom]["reward"] += reward
|
|
@@ -890,10 +944,9 @@ class UCB1BanditSeeder:
|
|
| 890 |
|
| 891 |
w_sketch = sketch.axiom_affinities.get(ax, 1.0)
|
| 892 |
|
| 893 |
-
# --- The UCB1 Bandit Score ---
|
| 894 |
tries = self.stats[ax]["tries"]
|
| 895 |
if tries == 0:
|
| 896 |
-
ucb = 999.0
|
| 897 |
else:
|
| 898 |
avg_reward = self.stats[ax]["reward"] / tries
|
| 899 |
exploration = math.sqrt(math.log(self.total_tries + 1) / tries)
|
|
@@ -967,9 +1020,9 @@ class SequenceRayTracer:
|
|
| 967 |
with STATE_LOCK: GLOBAL_SOLVE_STATE["recent_traces"].append(HypothesisTrace(hid=template.template_id, round_idx=0, ray_name=f"template:{template.source}", ray_type="template", ce_before=init_ce, ce_after=final_ce, survived=(g1p and g2p), elapsed_ms=0.0, g1_pass=g1p, g2_pass=g2p, binding=final_b, invariant_results=inv_res, tension_class=tc, depth=0))
|
| 968 |
if final_ce < best_ce:
|
| 969 |
best_ce = final_ce; best_binding = dict(final_b)
|
| 970 |
-
if g1p and g2p:
|
| 971 |
_update_state(best_ce=best_ce, best_ray=f"template:{template.source}")
|
| 972 |
-
return best_binding, best_ce, list(GLOBAL_SOLVE_STATE["recent_traces"]), 0
|
| 973 |
|
| 974 |
_update_state(phase="SEARCHING")
|
| 975 |
queues = {"core": bandit.sketch_weighted_seeds(sketch, best_ce)}
|
|
@@ -998,7 +1051,6 @@ class SequenceRayTracer:
|
|
| 998 |
ray = batch_rays[ray_idx]
|
| 999 |
parent_ce = (ray.baton or seed_baton).ce
|
| 1000 |
|
| 1001 |
-
# Feedback to RL Agent
|
| 1002 |
bandit.record_reward(ray.sequence[-1], parent_ce, final_ce)
|
| 1003 |
|
| 1004 |
g1_pass, g2_pass, inv_results, _ = _verify(final_b, base_problem, axl_def.anchors)
|
|
@@ -1015,7 +1067,8 @@ class SequenceRayTracer:
|
|
| 1015 |
best_ce = final_ce; best_binding = dict(final_b)
|
| 1016 |
model.best_ray = ray.name
|
| 1017 |
|
| 1018 |
-
if g1_pass and g2_pass
|
|
|
|
| 1019 |
|
| 1020 |
if final_ce < parent_ce * CE_EARN_RATIO or ray.depth < 1:
|
| 1021 |
remaining = [a for a in ALL_AXIOMS if a not in ray.sequence]
|
|
@@ -1028,7 +1081,7 @@ class SequenceRayTracer:
|
|
| 1028 |
|
| 1029 |
if solved: break
|
| 1030 |
|
| 1031 |
-
return best_binding, best_ce, list(GLOBAL_SOLVE_STATE["recent_traces"]), total_fired
|
| 1032 |
|
| 1033 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 1034 |
# LLM BRIDGE & GLOBAL SOLVER TASK
|
|
@@ -1068,9 +1121,9 @@ def global_solve_task(original_problem_text, api_key, prebuilt_axl=None):
|
|
| 1068 |
_update_state(phase="COMPILING")
|
| 1069 |
base_prob = build_base_problem(axl_def)
|
| 1070 |
|
| 1071 |
-
_add_log("π Firing Ray Tracer (RL UCB1 Bandit
|
| 1072 |
tracer = SequenceRayTracer()
|
| 1073 |
-
binding, ce, traces, total_fired
|
| 1074 |
|
| 1075 |
solved_str = "β SOLVED" if ce < SOLVE_THRESHOLD else "β UNSOLVED"
|
| 1076 |
best_ray = traces[-1].ray_name if traces else "β"
|
|
@@ -1125,8 +1178,8 @@ def build_live_html():
|
|
| 1125 |
</div>
|
| 1126 |
"""
|
| 1127 |
|
| 1128 |
-
with gr.Blocks(css=CSS, title="Practicality 24.
|
| 1129 |
-
gr.Markdown("## β Practicality 24.
|
| 1130 |
|
| 1131 |
with gr.Row():
|
| 1132 |
with gr.Column(scale=2, min_width=300):
|
|
@@ -1136,12 +1189,12 @@ with gr.Blocks(css=CSS, title="Practicality 24.4") as demo:
|
|
| 1136 |
problem_input = gr.Textbox(label="Problem Description", lines=5, elem_classes=["solver-log"])
|
| 1137 |
solve_btn = gr.Button("β Solve Natural Language", variant="primary")
|
| 1138 |
if HAS_QUANTUM:
|
| 1139 |
-
with gr.Tab("Quantum Circuits
|
| 1140 |
-
q_dropdown = gr.Dropdown(choices=["Bell State", "VQE H2", "QAOA MaxCut"], value="
|
| 1141 |
q_solve_btn = gr.Button("β Run Quantum Solver (Bypass Encoder)", variant="primary")
|
| 1142 |
|
| 1143 |
with gr.Column(scale=1, min_width=250):
|
| 1144 |
-
gr.Textbox(value=(f"Compute: {DEVICE.type.upper()}\nNew:
|
| 1145 |
|
| 1146 |
with gr.Row():
|
| 1147 |
live_html = gr.HTML(value=build_live_html())
|
|
|
|
| 1 |
#!/usr/bin/env python3
|
| 2 |
"""
|
| 3 |
+
PRACTICALITY SYSTEM 24.5 β THE MARKOV BLANKET & DEEP CONVERGENCE
|
| 4 |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 5 |
ARCHITECTURE:
|
| 6 |
User Text β [GEMINI ENCODER] β AXLProblemDef
|
| 7 |
+
β [STRUCTURAL SKETCH] β Axiom affinity map
|
| 8 |
β [TEMPLATE ENGINE] β Positive Space Grid Sketching
|
| 9 |
+
β [WISDOM LAYER] β Masked Deduction (Markov Blanket + L2 MSE)
|
| 10 |
β³ [UCB1 BANDIT] β Reinforcement Learning Axiom Selection
|
| 11 |
β [GEMINI COLLAPSER] β Domain-language explanation
|
| 12 |
|
| 13 |
+
CRITICAL UPDATE 24.5:
|
| 14 |
+
- MARKOV BLANKET MASKING: High-dimensional topologies (like deep quantum circuits)
|
| 15 |
+
suffer from gradient sloshing when optimizing 400+ variables simultaneously.
|
| 16 |
+
The engine now builds an adjacency graph from the circuit scopes. When an axiom
|
| 17 |
+
pins a variable, PyTorch freezes all variables outside a 2-hop radius, surgically
|
| 18 |
+
optimizing the local geometry without destabilizing the rest of the system.
|
| 19 |
+
- DEEP CONVERGENCE: LR lowered to 0.01, Steps to 60, and Threshold to 0.001.
|
| 20 |
"""
|
| 21 |
|
| 22 |
import os, time, random, math, threading, warnings, json, textwrap, itertools
|
|
|
|
| 45 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 46 |
# AI CONFIGURATION
|
| 47 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 48 |
+
DEFAULT_GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY", "")
|
| 49 |
+
GEMINI_MODEL = "gemini-2.5-pro-preview-06-05"
|
| 50 |
|
| 51 |
warnings.filterwarnings("ignore")
|
| 52 |
USE_GPU = torch.cuda.is_available()
|
| 53 |
DEVICE = torch.device("cuda" if USE_GPU else "cpu")
|
| 54 |
+
print(f"[SYSTEM 24.5] Compute: {DEVICE.type.upper()} | Markov Blanket Active")
|
| 55 |
|
| 56 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 57 |
+
# SECTION 1: CONSTANTS (Deep Convergence Specs)
|
| 58 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 59 |
+
SOLVE_THRESHOLD = 0.001 # Pushed for absolute perfection
|
| 60 |
+
VERIFY_G1_THRESHOLD = 0.005
|
| 61 |
VERIFY_G2_TOLERANCE = 1e-3
|
| 62 |
+
DEDUCE_ADAM_STEPS = 60 # Increased for deep settling
|
| 63 |
+
ADAM_LEARNING_RATE = 0.01 # Lowered to prevent L2 orbiting
|
| 64 |
N_MPRT_EXPLORE = 1000
|
| 65 |
PROJECTION_CACHE: Dict = {}
|
| 66 |
|
|
|
|
| 300 |
else: lines.append(f"{c['kind']} {c['expr']} WEIGHT {wt}")
|
| 301 |
for sc in prob.scopes:
|
| 302 |
lines.append(f"SCOPE {sc['name']} ORDER {sc.get('order',0)}")
|
| 303 |
+
# For Quantum VM, scopes are just structure hints, we don't write constraints to string
|
| 304 |
for c in sc.get("constraints",[]):
|
| 305 |
lines.append(f" {c['kind']} {c['expr']} WEIGHT {c.get('weight',1.0)}")
|
| 306 |
+
|
| 307 |
+
# 24.5 Fix: Ensure scope variables are explicitly declared in PSL for graph building
|
| 308 |
+
if "vars" in sc:
|
| 309 |
+
for sv in sc["vars"]:
|
| 310 |
+
lines.append(f" VAR {sv} 0 0") # Dummy bounds to link scope
|
| 311 |
lines.append("END")
|
| 312 |
return "\n".join(lines)
|
| 313 |
|
| 314 |
AXL_COMPILER=AXLtoPSLCompiler()
|
| 315 |
|
| 316 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββοΏ½οΏ½βββββββββββββ
|
| 317 |
+
# SECTION 5: PROBLEM COMPILATION & THE MARKOV GRAPH
|
| 318 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 319 |
@dataclass
|
| 320 |
class Constraint:
|
|
|
|
| 411 |
is_quantum: bool = False
|
| 412 |
circuit: Any = None
|
| 413 |
quantum_vm: Any = None
|
| 414 |
+
adjacency_list: Dict[str, Set[str]] = field(default_factory=lambda: defaultdict(set))
|
| 415 |
|
| 416 |
def __post_init__(self):
|
| 417 |
self.compiled_constraints=[compile_mc(c.kind,c.expr,c.direction,self.variables,c.weight,c.scope,c.branches) for c in self.constraints]
|
|
|
|
| 420 |
if self.is_quantum and HAS_QUANTUM:
|
| 421 |
self.quantum_vm = QuantumCircuits.NativeQuantumVM(self.circuit, self.var_idx)
|
| 422 |
|
| 423 |
+
# ββ MARKOV BLANKET GRAPH BUILDER ββ
|
| 424 |
+
# Link variables sharing a standard constraint
|
| 425 |
+
for mc in self.compiled_constraints:
|
| 426 |
+
for v1 in mc.syms_used:
|
| 427 |
+
for v2 in mc.syms_used:
|
| 428 |
+
if v1 != v2: self.adjacency_list[v1].add(v2)
|
| 429 |
+
|
| 430 |
+
# Link variables sharing a topological scope (Critical for Quantum circuits)
|
| 431 |
+
for sn, svars in self.scope_vars.items():
|
| 432 |
+
for i in range(len(svars)):
|
| 433 |
+
for j in range(i + 1, len(svars)):
|
| 434 |
+
self.adjacency_list[svars[i]].add(svars[j])
|
| 435 |
+
self.adjacency_list[svars[j]].add(svars[i])
|
| 436 |
+
|
| 437 |
+
# ββ Pre-compute heuristics ββ
|
| 438 |
for mc in self.compiled_constraints:
|
| 439 |
pair=_extract_ordering_pair(mc,self.variables)
|
| 440 |
if pair and pair not in self.ordering_pairs: self.ordering_pairs.append(pair)
|
|
|
|
| 461 |
if target not in self.monotone_targets: self.monotone_targets.append(target)
|
| 462 |
except: pass
|
| 463 |
|
| 464 |
+
def get_markov_blanket(self, pinned_vars: Set[str], depth: int = 2) -> Set[str]:
|
| 465 |
+
"""BFS search to isolate variables affected by an axiom, freezing the rest."""
|
| 466 |
+
if not pinned_vars: return set(self.variables)
|
| 467 |
+
visited = set(pinned_vars)
|
| 468 |
+
queue = deque([(v, 0) for v in pinned_vars])
|
| 469 |
+
while queue:
|
| 470 |
+
curr, d = queue.popleft()
|
| 471 |
+
if d < depth:
|
| 472 |
+
for neighbor in self.adjacency_list.get(curr, []):
|
| 473 |
+
if neighbor not in visited:
|
| 474 |
+
visited.add(neighbor)
|
| 475 |
+
queue.append((neighbor, d + 1))
|
| 476 |
+
return visited
|
| 477 |
+
|
| 478 |
def tensor_energy(self, X: torch.Tensor, step_ratio: float = 1.0) -> torch.Tensor:
|
| 479 |
if self.is_quantum and self.quantum_vm:
|
| 480 |
return self.quantum_vm.execute(X, step_ratio, DEVICE)
|
|
|
|
| 515 |
return total.squeeze()
|
| 516 |
|
| 517 |
def scalar_energy(self,b:Dict[str,float]) -> float:
|
| 518 |
+
if self.is_quantum: return float('inf')
|
| 519 |
total=0.0
|
| 520 |
for mc in self.compiled_constraints:
|
| 521 |
if getattr(mc,'weight',1.0)==0.0: continue
|
|
|
|
| 548 |
if axl_def.is_quantum:
|
| 549 |
prob.is_quantum = True
|
| 550 |
prob.circuit = axl_def.circuit
|
| 551 |
+
prob.__post_init__()
|
| 552 |
return prob
|
| 553 |
|
| 554 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 649 |
notes.append(f"{len(problem.bilinear_pairs)} bilinear pairs β BILINEAR boosted")
|
| 650 |
|
| 651 |
if problem.monotone_targets: affinities["MONOTONE_PRODUCT"] += 5.0
|
|
|
|
| 652 |
if any(problem.scope_vars.values()): affinities["DISCRETE"] += 2.0
|
| 653 |
|
| 654 |
has_sos = any(mc.parsed is not None and mc.parsed.is_Add and any(t.is_Pow and t.args[1] == 2 for t in mc.parsed.args) for mc in problem.compiled_constraints if mc.kind == "equality")
|
|
|
|
| 707 |
_ALL_AXIOMS_PLACEHOLDER: List[str] = []
|
| 708 |
|
| 709 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 710 |
+
# SECTION 7: MASKED DEDUCTION WITH MARKOV BLANKETS
|
| 711 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 712 |
@dataclass
|
| 713 |
class L9Certificate:
|
|
|
|
| 720 |
x_data, mask_data, target_data = [], [], []
|
| 721 |
for hyp in hyps:
|
| 722 |
xr, mr, tr = [], [], []
|
| 723 |
+
|
| 724 |
+
# ββ MARKOV BLANKET MASKING ββ
|
| 725 |
+
# Find local blast radius of pinned variables. Freezes the rest.
|
| 726 |
+
active_vars = problem.get_markov_blanket(set(hyp.pinned_vars.keys()), depth=2)
|
| 727 |
+
|
| 728 |
for v in problem.variables:
|
| 729 |
if v in hyp.pinned_vars:
|
| 730 |
val = hyp.pinned_vars[v]; xr.append(val); mr.append(0.0); tr.append(val)
|
| 731 |
else:
|
| 732 |
+
val = hyp.binding.get(v, (problem.bounds[v][0] + problem.bounds[v][1]) / 2)
|
| 733 |
+
xr.append(val)
|
| 734 |
+
# If nothing is pinned (e.g. initial scout), allow all. Otherwise, mask.
|
| 735 |
+
is_active = (v in active_vars) or (len(hyp.pinned_vars) == 0)
|
| 736 |
+
mr.append(1.0 if is_active else 0.0)
|
| 737 |
+
tr.append(0.0)
|
| 738 |
+
|
| 739 |
x_data.append(xr); mask_data.append(mr); target_data.append(tr)
|
| 740 |
|
| 741 |
X = torch.tensor(x_data, device=DEVICE, dtype=torch.float32, requires_grad=True)
|
| 742 |
mask = torch.tensor(mask_data, device=DEVICE, dtype=torch.float32)
|
| 743 |
target = torch.tensor(target_data, device=DEVICE, dtype=torch.float32)
|
| 744 |
+
|
| 745 |
+
# 24.5 Deep Convergence Fix: Lower LR to prevent L2 orbiting
|
| 746 |
+
optimizer = torch.optim.Adam([X], lr=ADAM_LEARNING_RATE)
|
| 747 |
|
| 748 |
for step in range(DEDUCE_ADAM_STEPS):
|
| 749 |
optimizer.zero_grad()
|
|
|
|
| 876 |
if bt.l9 and bt.l9.dominant_vars:
|
| 877 |
v = bt.l9.dominant_vars[0]; lo, hi = p.bounds.get(v, (-10, 10))
|
| 878 |
b[v] = max(lo, min(hi, b.get(v, 0) + random.gauss(0, (hi - lo) * 0.05)))
|
| 879 |
+
return [_make_hyp("mut", b, "mutable", "Perturb", [], {v: b[v]}, p.variables, 0.40)]
|
| 880 |
def _hyp_network(p, bt, a, m): return [_make_hyp("net", bt.binding, "network", "HubProp", [], {}, p.variables, 0.65)]
|
| 881 |
def _hyp_equilibrium(p, bt, a, m): return [_make_hyp("eql", bt.binding, "equilibrium", "GradBal", [], {}, p.variables, 0.72)]
|
| 882 |
def _hyp_superposition(p, bt, a, m): return [_make_hyp("sup", bt.binding, "superposition", "Superpose", [], {}, p.variables, 0.58)]
|
| 883 |
def _hyp_locality(p, bt, a, m): return [_make_hyp("loc", bt.binding, "locality", "LocalFirst", [], {}, p.variables, 0.72)]
|
| 884 |
+
def _hyp_extremal(p, bt, a, m):
|
| 885 |
+
hyps = []; b = dict(bt.binding)
|
| 886 |
+
if bt.l9 and bt.l9.dominant_vars:
|
| 887 |
+
v = bt.l9.dominant_vars[0]; lo, hi = p.bounds.get(v, (0, 1))
|
| 888 |
+
for val in [lo, hi]:
|
| 889 |
+
nb = dict(b); nb[v] = val
|
| 890 |
+
hyps.append(_make_hyp(f"ext_{v}_{val:.3f}", nb, "extremal", f"PinBound({v}={val:.3f})", [], {v: val}, p.variables, 0.65))
|
| 891 |
+
return hyps
|
| 892 |
def _hyp_entropy(p, bt, a, m): return [_make_hyp("ent", {v: random.uniform(*p.bounds[v]) for v in p.variables}, "entropy", "MaxEnt", [], {}, p.variables, 0.48)]
|
| 893 |
def _hyp_injective(p, bt, a, m): return [_make_hyp("inj", bt.binding, "injective", "Distinct", [], {}, p.variables, 0.50)]
|
| 894 |
def _hyp_surjective(p, bt, a, m): return [_make_hyp("sur", bt.binding, "surjective", "Sweep", [], {}, p.variables, 0.45)]
|
|
|
|
| 920 |
self.total_tries = 0
|
| 921 |
|
| 922 |
def record_reward(self, axiom: str, ce_before: float, ce_after: float):
|
|
|
|
| 923 |
reward = max(0.0, ce_before - ce_after)
|
| 924 |
self.stats[axiom]["tries"] += 1
|
| 925 |
self.stats[axiom]["reward"] += reward
|
|
|
|
| 944 |
|
| 945 |
w_sketch = sketch.axiom_affinities.get(ax, 1.0)
|
| 946 |
|
|
|
|
| 947 |
tries = self.stats[ax]["tries"]
|
| 948 |
if tries == 0:
|
| 949 |
+
ucb = 999.0
|
| 950 |
else:
|
| 951 |
avg_reward = self.stats[ax]["reward"] / tries
|
| 952 |
exploration = math.sqrt(math.log(self.total_tries + 1) / tries)
|
|
|
|
| 1020 |
with STATE_LOCK: GLOBAL_SOLVE_STATE["recent_traces"].append(HypothesisTrace(hid=template.template_id, round_idx=0, ray_name=f"template:{template.source}", ray_type="template", ce_before=init_ce, ce_after=final_ce, survived=(g1p and g2p), elapsed_ms=0.0, g1_pass=g1p, g2_pass=g2p, binding=final_b, invariant_results=inv_res, tension_class=tc, depth=0))
|
| 1021 |
if final_ce < best_ce:
|
| 1022 |
best_ce = final_ce; best_binding = dict(final_b)
|
| 1023 |
+
if g1p and g2p and final_ce < SOLVE_THRESHOLD:
|
| 1024 |
_update_state(best_ce=best_ce, best_ray=f"template:{template.source}")
|
| 1025 |
+
return best_binding, best_ce, list(GLOBAL_SOLVE_STATE["recent_traces"]), 0
|
| 1026 |
|
| 1027 |
_update_state(phase="SEARCHING")
|
| 1028 |
queues = {"core": bandit.sketch_weighted_seeds(sketch, best_ce)}
|
|
|
|
| 1051 |
ray = batch_rays[ray_idx]
|
| 1052 |
parent_ce = (ray.baton or seed_baton).ce
|
| 1053 |
|
|
|
|
| 1054 |
bandit.record_reward(ray.sequence[-1], parent_ce, final_ce)
|
| 1055 |
|
| 1056 |
g1_pass, g2_pass, inv_results, _ = _verify(final_b, base_problem, axl_def.anchors)
|
|
|
|
| 1067 |
best_ce = final_ce; best_binding = dict(final_b)
|
| 1068 |
model.best_ray = ray.name
|
| 1069 |
|
| 1070 |
+
if g1_pass and g2_pass and final_ce < SOLVE_THRESHOLD:
|
| 1071 |
+
solved = True
|
| 1072 |
|
| 1073 |
if final_ce < parent_ce * CE_EARN_RATIO or ray.depth < 1:
|
| 1074 |
remaining = [a for a in ALL_AXIOMS if a not in ray.sequence]
|
|
|
|
| 1081 |
|
| 1082 |
if solved: break
|
| 1083 |
|
| 1084 |
+
return best_binding, best_ce, list(GLOBAL_SOLVE_STATE["recent_traces"]), total_fired
|
| 1085 |
|
| 1086 |
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 1087 |
# LLM BRIDGE & GLOBAL SOLVER TASK
|
|
|
|
| 1121 |
_update_state(phase="COMPILING")
|
| 1122 |
base_prob = build_base_problem(axl_def)
|
| 1123 |
|
| 1124 |
+
_add_log("π Firing Ray Tracer (Markov Blanket + RL UCB1 Bandit)...")
|
| 1125 |
tracer = SequenceRayTracer()
|
| 1126 |
+
binding, ce, traces, total_fired = tracer.trace(axl_def, base_prob)
|
| 1127 |
|
| 1128 |
solved_str = "β SOLVED" if ce < SOLVE_THRESHOLD else "β UNSOLVED"
|
| 1129 |
best_ray = traces[-1].ray_name if traces else "β"
|
|
|
|
| 1178 |
</div>
|
| 1179 |
"""
|
| 1180 |
|
| 1181 |
+
with gr.Blocks(css=CSS, title="Practicality 24.5") as demo:
|
| 1182 |
+
gr.Markdown("## β Practicality 24.5 β Markov Blanket & Deep Convergence")
|
| 1183 |
|
| 1184 |
with gr.Row():
|
| 1185 |
with gr.Column(scale=2, min_width=300):
|
|
|
|
| 1189 |
problem_input = gr.Textbox(label="Problem Description", lines=5, elem_classes=["solver-log"])
|
| 1190 |
solve_btn = gr.Button("β Solve Natural Language", variant="primary")
|
| 1191 |
if HAS_QUANTUM:
|
| 1192 |
+
with gr.Tab("Quantum Circuits"):
|
| 1193 |
+
q_dropdown = gr.Dropdown(choices=["Bell State", "VQE H2", "QAOA MaxCut"], value="QAOA MaxCut")
|
| 1194 |
q_solve_btn = gr.Button("β Run Quantum Solver (Bypass Encoder)", variant="primary")
|
| 1195 |
|
| 1196 |
with gr.Column(scale=1, min_width=250):
|
| 1197 |
+
gr.Textbox(value=(f"Compute: {DEVICE.type.upper()}\nNew: True Markov Blanket Masking\nNew: Adjacency Graph Builder\nNew: Deep Convergence Logic (0.001 CE)\nNew: UCB1 RL Bandit"), lines=7, interactive=False, elem_classes=["solver-log"])
|
| 1198 |
|
| 1199 |
with gr.Row():
|
| 1200 |
live_html = gr.HTML(value=build_live_html())
|