mirror of
https://github.com/allaunthefox/SilverSight.git
synced 2026-07-31 01:25:21 +00:00
Hopf Portability Criterion: - 6 necessary conditions for problem portability (A-F) - 28 = 4×7 = 2²×(2³−1) factorization theorem - n=8 is the maximal group-theoretic Hopf encoding - 15 annotated domain templates Hopf Ingest Bridge: - Input schema: problem metadata → 6 conditions → fingerprint - 15 pre-classified templates (physics, optimization, NT, geometry) - Output receipt: schema hopf_ingest_receipt_v1 - Architecture: JSON → Checker → Computer → Matcher → Receipt Cross-agent consensus: - Topological insulators: strongest physics port - Anyons/TQC: π⁷(S⁴)=ℤ₂₈ exact match (deepest theory) - QUBO: strongest optimization port - Crystalline cohomology: strongest arithmetic port
325 lines
10 KiB
Julia
325 lines
10 KiB
Julia
"""
|
|
SilverSight Engine — Julia Port
|
|
|
|
Mirrors `python/silversight_engine.py` and `rust/src/silversight/mod.rs`.
|
|
All formulas verified by 3 independent agents.
|
|
|
|
References:
|
|
* `formal/CoreFormalism/BraidEigensolid.lean` — eigensolid convergence theorem
|
|
* `formal/SilverSight/PIST/FisherRigidity.lean` — Fisher rigidity
|
|
"""
|
|
module SilverSightEngine
|
|
|
|
using Random
|
|
|
|
export normalize, byte_class, F, tau, Phi,
|
|
d_F, d_Phi,
|
|
C, geodesic_step, chaos_game,
|
|
corkscrew_index,
|
|
Concept, SilverSight
|
|
|
|
# ── Constants ─────────────────────────────────────────────────────────
|
|
|
|
const PHI = (1 + sqrt(5.0)) / 2.0
|
|
const PSI = 2.0 * pi / (PHI^2)
|
|
|
|
# ── R1: Token Normalization ──────────────────────────────────────────
|
|
|
|
function normalize(s::AbstractString)::String
|
|
lower = lowercase(s)
|
|
out = IOBuffer()
|
|
i = 1
|
|
while i <= length(lower)
|
|
c = lower[i]
|
|
if isdigit(c)
|
|
write(out, 'N')
|
|
while i <= length(lower) && isdigit(lower[i]); i += 1; end
|
|
elseif isletter(c)
|
|
write(out, 'V')
|
|
while i <= length(lower) && isletter(lower[i]); i += 1; end
|
|
else
|
|
write(out, c)
|
|
i += 1
|
|
end
|
|
end
|
|
String(take!(out))
|
|
end
|
|
|
|
# ── Byte Classification ──────────────────────────────────────────────
|
|
|
|
function byte_class(c::Char)::Int
|
|
asc = Int(c)
|
|
asc <= 31 && return 0
|
|
asc <= 47 && return 1
|
|
asc <= 57 && return 2
|
|
asc <= 64 && return 3
|
|
asc <= 90 && return 4
|
|
asc <= 96 && return 5
|
|
asc <= 122 && return 6
|
|
return 7
|
|
end
|
|
|
|
# ── Feature Extraction ───────────────────────────────────────────────
|
|
|
|
function F(s::AbstractString)::Vector{Float64}
|
|
norm = normalize(s)
|
|
counts = zeros(Int, 8)
|
|
for c in norm
|
|
counts[byte_class(c) + 1] += 1
|
|
end
|
|
total = sum(counts)
|
|
total == 0 && return zeros(8)
|
|
return Float64.(counts) ./ total
|
|
end
|
|
|
|
function parse_tree_depth(expr::AbstractString)::Vector{Tuple{Char, Int}}
|
|
ops = Tuple{Char, Int}[]
|
|
depth = 0
|
|
for c in expr
|
|
if c == '('
|
|
depth += 1
|
|
elseif c == ')'
|
|
depth -= 1
|
|
elseif c in "+-*/="
|
|
push!(ops, (c, depth))
|
|
end
|
|
end
|
|
ops
|
|
end
|
|
|
|
function tau(s::AbstractString)::Vector{Float64}
|
|
op_depths = parse_tree_depth(s)
|
|
weights = zeros(6)
|
|
for (op, d) in op_depths
|
|
w = 2.0^(-d)
|
|
if op == '+'; weights[2] += w
|
|
elseif op == '='; weights[3] += w
|
|
elseif op == '/'; weights[4] += w
|
|
elseif op == '*'; weights[5] += w
|
|
elseif op == '-'; weights[6] += w
|
|
end
|
|
end
|
|
total = sum(weights)
|
|
if total > 0
|
|
weights ./= total
|
|
end
|
|
weights
|
|
end
|
|
|
|
function Phi(s::AbstractString)::Vector{Float64}
|
|
vcat(F(s), tau(s))
|
|
end
|
|
|
|
# ── Fisher Distance ──────────────────────────────────────────────────
|
|
|
|
function d_F(p::Vector{Float64}, q::Vector{Float64})::Float64
|
|
s = sum(sqrt.(max.(p .* q, 0.0)))
|
|
s = clamp(s, -1.0, 1.0)
|
|
2.0 * acos(s)
|
|
end
|
|
|
|
function d_Phi(phi1::Vector{Float64}, phi2::Vector{Float64})::Float64
|
|
f1, t1 = phi1[1:8], phi1[9:14]
|
|
f2, t2 = phi2[1:8], phi2[9:14]
|
|
sqrt(d_F(f1, f2)^2 + d_F(t1, t2)^2)
|
|
end
|
|
|
|
# ── Coarse-Graining / Eigensolid ────────────────────────────────────
|
|
|
|
function C(phi::Vector{Float64})::Vector{Float64}
|
|
result = copy(phi)
|
|
for k in 0:3
|
|
avg = (phi[2k+1] + phi[2k+2]) / 2.0
|
|
result[2k+1] = avg
|
|
result[2k+2] = avg
|
|
end
|
|
for k in 0:2
|
|
avg = (phi[9+2k] + phi[10+2k]) / 2.0
|
|
result[9+2k] = avg
|
|
result[10+2k] = avg
|
|
end
|
|
result
|
|
end
|
|
|
|
function geodesic_step(phi1::Vector{Float64}, phi2::Vector{Float64}; eps::Float64=0.5)::Vector{Float64}
|
|
f1, t1 = phi1[1:8], phi1[9:14]
|
|
f2, t2 = phi2[1:8], phi2[9:14]
|
|
|
|
sf1 = sqrt.(clamp.(f1, 0.0, 1.0))
|
|
sf2 = sqrt.(clamp.(f2, 0.0, 1.0))
|
|
interp_f = (1.0 - eps) .* sf1 .+ eps .* sf2
|
|
interp_f_sq = interp_f.^2
|
|
sum_f = sum(interp_f_sq)
|
|
if sum_f > 0; interp_f_sq ./= sum_f; end
|
|
|
|
st1 = sqrt.(clamp.(t1, 0.0, 1.0))
|
|
st2 = sqrt.(clamp.(t2, 0.0, 1.0))
|
|
interp_t = (1.0 - eps) .* st1 .+ eps .* st2
|
|
interp_t_sq = interp_t.^2
|
|
sum_t = sum(interp_t_sq)
|
|
if sum_t > 0; interp_t_sq ./= sum_t; end
|
|
|
|
vcat(interp_f_sq, interp_t_sq)
|
|
end
|
|
|
|
# ── Chaos Game ────────────────────────────────────────────────────────
|
|
|
|
function chaos_game(start::Vector{Float64}, references::Dict{String, Vector{Float64}};
|
|
steps::Int=30, eps::Float64=0.5, seed::Int=42)::Vector{Float64}
|
|
rng = MersenneTwister(seed)
|
|
refs = collect(values(references))
|
|
x = copy(start)
|
|
for _ in 1:steps
|
|
dists = [d_Phi(x, r) for r in refs]
|
|
nearest = refs[argmin(dists)]
|
|
x = geodesic_step(x, nearest; eps=eps)
|
|
end
|
|
x
|
|
end
|
|
|
|
# ── Corkscrew Index ──────────────────────────────────────────────────
|
|
|
|
function corkscrew_index(phi::Vector{Float64})::Int
|
|
coeffs = floor.(Int, phi[1:9] .* 256)
|
|
spiral = 0
|
|
for (i, c) in enumerate(coeffs)
|
|
spiral += c * (8^(i - 1))
|
|
end
|
|
abs(spiral)
|
|
end
|
|
|
|
# ── Concept Data Structure ───────────────────────────────────────────
|
|
|
|
mutable struct Concept
|
|
name::String
|
|
prototype::Vector{Float64}
|
|
attractor::Vector{Float64}
|
|
corkscrew_index::Int
|
|
operator_type::String
|
|
members::Vector{Tuple{String, Vector{Float64}}}
|
|
end
|
|
|
|
function Concept(name::String, prototype::Vector{Float64}, attractor::Vector{Float64},
|
|
corkscrew_idx::Int, op_type::String)
|
|
Concept(name, prototype, attractor, corkscrew_idx, op_type, Tuple{String, Vector{Float64}}[])
|
|
end
|
|
|
|
# ── SilverSight Engine ───────────────────────────────────────────────
|
|
|
|
mutable struct SilverSight
|
|
concepts::Vector{Concept}
|
|
references::Dict{String, Vector{Float64}}
|
|
basin_map::Dict{NTuple{14, Int}, Int}
|
|
end
|
|
|
|
SilverSight() = SilverSight(Concept[], Dict{String, Vector{Float64}}(), Dict{NTuple{14, Int}, Int}())
|
|
|
|
function detect_operator(s::AbstractString)::String
|
|
norm = normalize(s)
|
|
for (op, name) in [('+', "addition"), ('/', "division"), ('*', "multiplication"),
|
|
('-', "subtraction"), ('=', "equality")]
|
|
if occursin(op, norm)
|
|
return name
|
|
end
|
|
end
|
|
"literal"
|
|
end
|
|
|
|
function learn(ss::SilverSight, equation::AbstractString)::Int
|
|
phi = Phi(equation)
|
|
ss.references[equation] = phi
|
|
|
|
limit = chaos_game(phi, ss.references; steps=30, eps=0.5)
|
|
eigensolid = C(limit)
|
|
idx = corkscrew_index(eigensolid)
|
|
|
|
attractor_key = Tuple(round.(Int, limit .* 1e8))
|
|
|
|
if haskey(ss.basin_map, attractor_key)
|
|
cid = ss.basin_map[attractor_key]
|
|
push!(ss.concepts[cid].members, (equation, phi))
|
|
return cid
|
|
end
|
|
|
|
op_type = detect_operator(equation)
|
|
cid = length(ss.concepts) + 1
|
|
concept = Concept("concept_$(cid - 1)", eigensolid, limit, idx, op_type)
|
|
push!(concept.members, (equation, phi))
|
|
push!(ss.concepts, concept)
|
|
ss.basin_map[attractor_key] = cid
|
|
cid
|
|
end
|
|
|
|
function classify(ss::SilverSight, equation::AbstractString)::Tuple{Union{Concept, Nothing}, Float64}
|
|
isempty(ss.concepts) && return (nothing, Inf)
|
|
phi = Phi(equation)
|
|
best = nothing
|
|
best_dist = Inf
|
|
for concept in ss.concepts
|
|
d = d_Phi(phi, concept.attractor)
|
|
if d < best_dist
|
|
best_dist = d
|
|
best = concept
|
|
end
|
|
end
|
|
(best, best_dist)
|
|
end
|
|
|
|
function is_novel(ss::SilverSight, equation::AbstractString)::Tuple{Bool, Float64}
|
|
if length(ss.concepts) < 2
|
|
return (isempty(ss.concepts), Inf)
|
|
end
|
|
|
|
inter_dists = Float64[]
|
|
for i in 1:length(ss.concepts)
|
|
for j in (i+1):length(ss.concepts)
|
|
push!(inter_dists, d_Phi(ss.concepts[i].attractor, ss.concepts[j].attractor))
|
|
end
|
|
end
|
|
threshold = isempty(inter_dists) ? 0.5 : minimum(inter_dists) / 2.0
|
|
|
|
_, dist = classify(ss, equation)
|
|
(dist > threshold, dist)
|
|
end
|
|
|
|
function summary(ss::SilverSight)
|
|
println("SilverSight: $(length(ss.concepts)) concepts, $(length(ss.references)) references")
|
|
for (i, c) in enumerate(ss.concepts)
|
|
members = join([m[1] for m in c.members], ", ")
|
|
println(" [$(i-1)] $(rpad(c.operator_type, 15)) idx=$(lpad(c.corkscrew_index, 12)) members: $members")
|
|
end
|
|
end
|
|
|
|
# ── Demo ──────────────────────────────────────────────────────────────
|
|
|
|
function demo()
|
|
ss = SilverSight()
|
|
equations = [
|
|
"a+b=c", "x+y=z",
|
|
"p/q=r", "a/b=c",
|
|
"a*b=c",
|
|
"a-b=c",
|
|
"hello",
|
|
"(a+b)*c=d",
|
|
]
|
|
for eq in equations
|
|
learn(ss, eq)
|
|
end
|
|
summary(ss)
|
|
|
|
println("\nClassification:")
|
|
for eq in ["a+b=c", "m+n=p", "p/q=r", "foo", "a+b+c=d"]
|
|
concept, dist = classify(ss, eq)
|
|
n, _ = is_novel(ss, eq)
|
|
status = n ? "NOVEL" : "known"
|
|
cname = concept === nothing ? "none" : concept.operator_type
|
|
println(" $(rpad(eq, 15)) -> [$(findfirst(==(concept), ss.concepts) !== nothing ? findfirst(==(concept), ss.concepts) - 1 : "?")] $(rpad(cname, 15)) d=$(round(dist, digits=6)) [$status]")
|
|
end
|
|
end
|
|
|
|
end # module
|
|
|
|
if abspath(PROGRAM_FILE) == @__FILE__
|
|
using .SilverSightEngine
|
|
SilverSightEngine.demo()
|
|
end
|