belief-prop + min-sum

This commit is contained in:
2026-05-10 19:07:36 +02:00
parent 296331096c
commit 22e61fcbd1
3 changed files with 9198 additions and 6417 deletions

View File

@ -2423,3 +2423,461 @@
content((-7.3, (y_cn + y_check) / 2), angle: 90deg, text(size: 1.1em, style: "italic", weight: "bold")[iter $+1$]) content((-7.3, (y_cn + y_check) / 2), angle: 90deg, text(size: 1.1em, style: "italic", weight: "bold")[iter $+1$])
}) })
} }
/////
//
//
//
#let schema_llr_droite() = {
cetz.canvas(length: 1cm, {
import cetz.draw: *
let col_left = blue.darken(10%) // Bit 0 (Inversé)
let col_right = red.darken(10%) // Bit 1 (Inversé)
let col_ax = black
let col_mid = gray.darken(30%)
let L = 7.0 // demi-longueur de l'axe
let y0 = 0.0
let y_top = 1.8
// ── 1. Zones colorées (Dessinées en PREMIER, en HAUT) ──
// Zone gauche (négative) -> Bit 0
rect((-L, y0 + 0.02), (-0.05, y0 + 0.32), fill: col_left.lighten(92%), stroke: none)
content((-L / 2, y0 + 0.65), text(fill: col_left, weight: "bold", size: 0.9em)[Bit = 0])
// Zone droite (positive) -> Bit 1
rect((0.05, y0 + 0.02), (L, y0 + 0.32), fill: col_right.lighten(92%), stroke: none)
content((L / 2, y0 + 0.65), text(fill: col_right, weight: "bold", size: 0.9em)[Bit = 1])
// ── 2. Axe horizontal (Dessiné APRÈS pour passer AU-DESSUS) ──
line((-L, y0), (L, y0), stroke: 1.8pt + col_ax, mark: (end: "stealth", fill: col_ax, size: 0.22))
content((L + 0.5, y0), text(size: 0.85em)[$L(v_i)$], anchor: "west")
// ── 3. Zéro ──
line((0, -0.2), (0, 0.2), stroke: 1.5pt + col_mid)
content((0, -0.5), text(size: 0.8em, fill: col_mid)[0])
// ── 4. Points exemples (Sans les Volts) ──
// -6 (Bit 0 à gauche)
let px_left = -5.0
circle((px_left, y0), radius: 0.15, fill: col_left, stroke: none)
// La ligne pointillée part de l'axe vers le haut
line((px_left, y0), (px_left, y_top), stroke: (paint: col_left, thickness: 1pt, dash: "dashed"))
content(
(px_left, y_top + 0.1),
box(fill: col_left.lighten(92%), stroke: 0.5pt + col_left, radius: 3pt, inset: 4pt)[
#text(fill: col_left, weight: "bold", size: 0.75em)[$-6$]
],
anchor: "south",
)
// +0.3 (Proche de zéro, Bit 1)
let px_near = 0.6
circle((px_near, y0), radius: 0.15, fill: col_right.lighten(40%), stroke: none)
line((px_near, y0), (px_near, y_top - 0.7), stroke: (paint: col_right.lighten(20%), thickness: 1pt, dash: "dashed"))
content(
(px_near, y_top - 0.65),
box(fill: white, stroke: 0.5pt + col_right.lighten(30%), radius: 3pt, inset: 3pt)[
#text(fill: col_right.darken(20%), size: 0.7em)[$+0.3$]
],
anchor: "south-west",
)
// +10 (Bit 1 à droite)
let px_right = 5.8
circle((px_right, y0), radius: 0.15, fill: col_right, stroke: none)
line((px_right, y0), (px_right, y_top), stroke: (paint: col_right, thickness: 1pt, dash: "dashed"))
content(
(px_right, y_top + 0.1),
box(fill: col_right.lighten(92%), stroke: 0.5pt + col_right, radius: 3pt, inset: 4pt)[
#text(fill: col_right, weight: "bold", size: 0.75em)[$+10$]
],
anchor: "south",
)
})
}
///2
#let schema_sum_product_dual() = {
cetz.canvas(length: 1cm, {
import cetz.draw: *
let col_cn = orange.darken(0%)
let col_vn = blue.darken(0%)
let col_msg = gray.darken(35%)
// --- PARTIE HAUTE : MISE À JOUR CN (PRODUIT DES TANH) ---
group({
let base_y = 4.0
let cn_pos = (0.0, base_y)
let vn_in_pos = ((-3.2, base_y + 1.3), (-3.2, base_y - 1.3))
let vn_out_pos = (3.2, base_y)
// 1. Check Node Central (cj)
rect(
(cn_pos.at(0) - 0.45, cn_pos.at(1) - 0.45),
(cn_pos.at(0) + 0.45, cn_pos.at(1) + 0.45),
fill: col_cn.lighten(90%),
stroke: 2pt + col_cn,
name: "cj_top",
)
content("cj_top", text(size: 0.75em, fill: col_cn, weight: "bold")[$c_j$])
// 2. Variable Node de sortie (v0)
circle(vn_out_pos, radius: 0.5, fill: white, stroke: 2pt + col_vn, name: "v0_top")
content("v0_top", text(size: 0.7em, fill: col_vn, weight: "bold")[$v_0$])
// 3. Arête de sortie : cj -> v0
line("cj_top", "v0_top", stroke: 2.2pt + orange, mark: (end: "stealth", fill: orange, size: 0.25))
content((1.8, base_y + 0.6), text(size: 0.8em, fill: orange.darken(0%), weight: "bold")[$m_(c_j arrow v_0)$])
// 4. Voisins entrants (vi)
for (i, p) in vn_in_pos.enumerate() {
let n_name = "vin_" + str(i)
circle(p, radius: 0.45, fill: col_vn.lighten(92%), stroke: 1.2pt + col_vn, name: n_name)
content(n_name, text(size: 0.65em, fill: col_vn, weight: "bold")[$v_#(i + 1)$])
line(n_name, "cj_top", stroke: 1.1pt + col_msg, mark: (end: "stealth", fill: col_msg, size: 0.2))
content((p.at(0) + 1.4, p.at(1)), text(size: 0.75em, fill: col_msg)[$m_(v_#(i + 1) arrow c_j)$])
}
})
// Séparateur discret
line((-4.5, 1.8), (4.5, 1.8), stroke: (paint: gray.lighten(85%), dash: "dashed"))
// --- PARTIE BASSE : MISE À JOUR VN (SOMME DES LLR) ---
group({
let base_y = -1.5
let vn_pos = (0.0, base_y)
let cn_in_pos = ((-3.2, base_y + 1.2), (-3.2, base_y - 1.2))
let cn_out_pos = (3.2, base_y)
// 1. Variable Node Central (vj)
circle(vn_pos, radius: 0.55, fill: col_vn.lighten(90%), stroke: 2pt + col_vn, name: "vj_bot")
content("vj_bot", text(weight: "bold", fill: col_vn)[$v_j$])
// 2. Check Node de sortie (c0) - Toujours ORANGE
rect(
(cn_out_pos.at(0) - 0.4, cn_out_pos.at(1) - 0.4),
(cn_out_pos.at(0) + 0.4, cn_out_pos.at(1) + 0.4),
fill: white,
stroke: 1.8pt + orange,
name: "c0_bot",
)
content("c0_bot", text(size: 0.65em, fill: orange.darken(0%), weight: "bold")[$c_0$])
// 3. Arête de sortie : vj -> c0
line("vj_bot", "c0_bot", stroke: 2.2pt + blue, mark: (end: "stealth", fill: blue, size: 0.25))
content((1.8, base_y - 0.7), text(size: 0.8em, fill: blue.darken(0%), weight: "bold")[$m_(v_j arrow c_0)$])
// 4. Entrée Canal LLR
let canal_top = (0.0, base_y + 2.2)
line(canal_top, "vj_bot", stroke: 1.8pt + blue, mark: (end: "stealth", fill: blue, size: 0.22))
content((canal_top.at(0), canal_top.at(1) + 0.3), text(
size: 0.85em,
fill: blue,
weight: "bold",
)[$L_"canal" (y_j)$])
// 5. Check Nodes entrants
for (i, p) in cn_in_pos.enumerate() {
let n_name = "cin_" + str(i)
rect(
(p.at(0) - 0.35, p.at(1) - 0.35),
(p.at(0) + 0.35, p.at(1) + 0.35),
fill: orange.lighten(95%),
stroke: 1pt + orange,
name: n_name,
)
content(n_name, text(size: 0.6em, fill: orange.darken(0%))[$c_#(i + 1)$])
line(n_name, "vj_bot", stroke: 1.1pt + col_msg, mark: (end: "stealth", fill: col_msg, size: 0.2))
content((p.at(0) + 1.4, p.at(1)), text(size: 0.75em, fill: col_msg)[$m_(c_#(i + 1) arrow v_j)$])
}
})
})
}
#let col_cn = orange
#let col_vn = blue
#let col_msg = gray.darken(50%)
#let s_len = 1.1cm
// 1. INITIALISATION
#let schema_detailed_init() = cetz.canvas(length: s_len, {
import cetz.draw: *
// Couleurs pures
let col_vn_pure = blue
let col_cn_pure = orange
let col_msg_dark = gray.darken(50%)
// Noeud Variable
circle((0, 0), radius: 0.6, fill: col_vn_pure.lighten(90%), stroke: 2pt + col_vn_pure, name: "vj")
content("vj", text(weight: "bold")[$v_j$])
// Entrée canal
line((0, 1.8), (0, 0.6), stroke: 2pt + blue, mark: (end: "stealth", fill: blue, size: 0.2))
content((0, 2.1), text(fill: blue, size: 0.9em, weight: "bold")[$L_("canal")$])
// Targets plus éloignées sur la droite (x: 4.0)
let targets = ((4.0, 1.2), (4.0, -1.2))
for (i, p) in targets.enumerate() {
let name = "c" + str(i + 1)
// Check Nodes
rect(
(p.at(0) - 0.4, p.at(1) - 0.4),
(p.at(0) + 0.4, p.at(1) + 0.4),
fill: col_cn_pure.lighten(95%),
stroke: 1.5pt + col_cn_pure,
name: name,
)
content(name, text(size: 0.7em, fill: col_cn_pure, weight: "bold")[$c_#(i + 1)$])
// Arête
line("vj.east", name, stroke: 1.2pt + col_msg_dark, mark: (end: "stealth", fill: col_msg_dark))
// Position du message calculée pour être "collée" à l'arête
// On place le texte à mi-chemin (x=2.0) avec un léger offset y
let y_offset = if p.at(1) > 0 { 0.4 } else { -0.25 }
content((2.0, p.at(1) * 0.5 + y_offset), text(size: 0.75em, fill: col_msg_dark)[$m_(v_j arrow c_#(i + 1))$])
}
})
// 2. CN UPDATE
#let schema_detailed_cn() = cetz.canvas(length: s_len, {
import cetz.draw: *
rect((-0.5, -0.5), (0.5, 0.5), fill: col_cn.lighten(90%), stroke: 2.2pt + col_cn, name: "cj")
content("cj", text(weight: "bold", fill: col_cn)[$c_j$])
let ins = ((-3.0, 1.3), (-3.0, -1.3))
for (i, p) in ins.enumerate() {
let v_name = "vi" + str(i + 1)
circle(p, radius: 0.45, fill: col_vn.lighten(92%), stroke: 1.2pt + col_vn, name: v_name)
line(v_name, "cj", stroke: 1.1pt + col_msg, mark: (end: "stealth", fill: col_msg))
content(v_name, text(size: 0.65em, fill: col_vn, weight: "bold")[$v_#(i + 1)$])
content((p.at(0) + 1.5, p.at(1)), text(size: 0.75em, fill: col_msg)[$m_(v_#(i + 1) arrow c_j)$])
}
circle((3.0, 0), radius: 0.6, fill: white, stroke: 2pt + col_vn, name: "v0")
content("v0", text(size: 0.75em, fill: col_vn, weight: "bold")[$v_0$])
line("cj", "v0", stroke: 2.3pt + orange, mark: (end: "stealth", fill: orange, size: 0.25))
content((1.8, 0.6), text(size: 0.85em, fill: orange, weight: "bold")[$m_(c_j arrow v_0)$])
})
// 3. VN UPDATE
#let schema_detailed_vn() = cetz.canvas(length: s_len, {
import cetz.draw: *
circle((0, 0), radius: 0.7, fill: col_vn.lighten(90%), stroke: 2.5pt + col_vn, name: "vj")
content("vj", text(weight: "bold", fill: col_vn)[$v_j$])
line((0, 2.0), (0, 0.7), stroke: 2pt + blue, mark: (end: "stealth", fill: blue, size: 0.2))
content((0, 2.3), text(size: 0.85em, fill: blue, weight: "bold")[$L_("canal")$])
let ins = ((-3.0, 1.2), (-3.0, -1.2))
for (i, p) in ins.enumerate() {
let c_name = "ci" + str(i + 1)
rect(
(p.at(0) - 0.4, p.at(1) - 0.4),
(p.at(0) + 0.4, p.at(1) + 0.4),
fill: col_cn.lighten(95%),
stroke: 1.2pt + col_cn,
name: c_name,
)
line(c_name, "vj", stroke: 1.1pt + col_msg, mark: (end: "stealth", fill: col_msg))
content(c_name, text(size: 0.65em, fill: col_cn, weight: "bold")[$c_#(i + 1)$])
content((p.at(0) + 1.5, p.at(1)), text(size: 0.75em, fill: col_msg)[$m_(c_#(i + 1) arrow v_j)$])
}
rect((2.6, -0.45), (3.4, 0.45), fill: white, stroke: 2pt + orange, name: "c0")
content("c0", text(size: 0.7em, fill: col_cn, weight: "bold")[$c_0$])
line("vj", "c0", stroke: 2.3pt + blue, mark: (end: "stealth", fill: blue, size: 0.25))
content((1.7, -0.8), text(size: 0.85em, fill: blue, weight: "bold")[$m_(v_j arrow c_0)$])
})
// 4. DÉCISION FINALE
#let schema_detailed_decision() = cetz.canvas(length: s_len, {
import cetz.draw: *
let col_vn_dec = green
// 1. Variable Node Central (Le bit j)
circle((0, 0), radius: 0.75, fill: green.lighten(92%), stroke: 2.5pt + col_vn_dec, name: "vn")
content("vn", text(weight: "bold", size: 1.1em)[$Lambda_j$])
// 2. Entrée LLR Canal
line((0, 1.7), (0, 0.75), stroke: 1.8pt + blue, mark: (end: "stealth", fill: blue, size: 0.15))
content((0, 2.0), text(fill: blue, size: 0.8em, weight: "bold")[$L_"canal"$])
// 3. Arrivées des Check Nodes (i)
let ins = ((-2.3, 1.0), (-2.3, -1.0), (2.3, 1.0), (2.3, -1.0))
for (i, p) in ins.enumerate() {
let name = "call" + str(i)
rect(
(p.at(0) - 0.3, p.at(1) - 0.3),
(p.at(0) + 0.3, p.at(1) + 0.3),
fill: orange.lighten(95%),
stroke: 1.1pt + orange,
name: name,
)
line(name, "vn", stroke: 1.1pt + orange, mark: (end: "stealth", fill: orange, size: 0.12))
content(name, text(size: 0.5em, fill: orange, weight: "bold")[$c_#i$])
}
// 4. ÉQUATION LAMBDA : On somme sur les voisins du bit j -> N(v_j)
content((0, -2), text(size: 0.8em, fill: col_vn_dec)[
$display(Lambda_j = L_("canal") + sum_(i in cal(N)(v_j)) m_(c_i arrow v_j))$
])
// 5. Bloc Hard Decision
content((3.5, 0), name: "verdict", box(fill: white, stroke: 1.5pt + black, inset: 6pt, radius: 2pt)[
#set text(size: 0.6em)
#set math.cases(gap: 0.3em)
$hat(v)_j = cases(0 "si" Lambda_j > 0, 1 "si" Lambda_j < 0)$
])
// 6. Liaison pointillés
line((0.8, 0), "verdict.west", stroke: (paint: black, thickness: 1.3pt, dash: "dotted"))
})
// ③ Schéma Min-Sum : comparaison SP vs MS + highlight du terme minimum
// #let schema_min_sum_vis() = {
// cetz.canvas(length: 1cm, {
// import cetz.draw: *
//
// let col_ms = blue.darken(15%)
// let col_min = red.darken(5%)
// let col_sgn = orange.darken(5%)
//
// // Messages entrants (4 voisins u ≠ v)
// let msgs = (2.1, 0.4, 3.7, 1.2)
// let sgns = (1, -1, 1, 1) // signes
//
// let y_base = 0.0
// let xs = (-4.5, -1.5, 1.5, 4.5)
//
// // Titre colonnes
// content((-3.0, 4.8), text(size: 0.82em, fill: col_sgn, weight: "bold")[Signes])
// content((3.0, 4.8), text(size: 0.82em, fill: col_ms, weight: "bold")[|Amplitudes|])
//
// for (i, x) in xs.enumerate() {
// let m = msgs.at(i)
// let s = sgns.at(i)
// let is_min = (m == 0.4)
// let col_box = if is_min { col_min } else { col_ms }
//
// // Barre amplitude
// let bar_h = m * 0.55
// rect((x - 0.5, y_base), (x + 0.5, y_base + bar_h),
// fill: col_box.lighten(if is_min { 70% } else { 85% }),
// stroke: 1.5pt + col_box)
//
// // Valeur amplitude
// content((x, y_base + bar_h + 0.35),
// text(size: 0.82em, fill: col_box, weight: "bold")[#m])
//
// // Signe (XOR logic)
// let s_txt = if s > 0 { [+] } else { [] }
// let s_col = col_sgn
// content((x, -0.65),
// box(fill: s_col.lighten(88%), stroke: 0.5pt + s_col,
// radius: 2pt, inset: (x:6pt, y:3pt))[
// #text(size: 0.88em, fill: s_col, weight: "bold")[#s_txt]
// ])
//
// // Label u_i
// content((x, -1.3), text(size: 0.74em, fill: gray.darken(30%))[
// $m_(#(i+1)→c)$
// ])
// }
//
// // Flèche vers résultat
// let y_res = -2.4
// line((0, -1.6), (0, y_res + 0.3),
// mark: (end: "stealth", fill: black, size: 0.2),
// stroke: 1.4pt + black)
//
// // Encadré résultat
// content((0, y_res - 0.1),
// box(fill: col_min.lighten(88%), stroke: 1.5pt + col_min,
// radius: 5pt, inset: (x: 14pt, y: 8pt))[
// #set text(size: 0.82em)
// Signe produit : #text(fill: col_sgn, weight: "bold")[$(-1)^1 = -$]
// #h(8pt)
// Min : #text(fill: col_min, weight: "bold")[$0.4$]
// #h(8pt)
// $=>$ #text(fill: col_min, weight: "bold")[$m_(c→v) = -0.4$]
// ])
//
// // Étiquette "minimum"
// content((-1.5, y_base + 0.4 * 0.55 + 0.95),
// text(size: 0.72em, fill: col_min, style: "italic",
// weight: "bold")[← minimum !])
// })
// }
#let schema_min_sum_complet() = cetz.canvas(length: 1cm, {
import cetz.draw: *
let msgs = (2.8, 0.7, 4.2, 1.8)
let sgns = (1, -1, 1, 1)
let vals = ("+2.8", "-0.7", "+4.2", "+1.8")
let col_ms = blue.darken(15%)
let col_min = red.darken(10%)
let col_vn_bg = blue.lighten(94%)
// --- 1. GRAPHE DE TANNER ---
group(name: "tanner", {
for i in (0, 1, 2, 3) {
let y_pos = 2.25 - i*1.5
line((-6.5, y_pos), (-2.0, 0), stroke: 1.2pt + gray.lighten(30%))
}
rect((-2.5, -0.5), (-1.5, 0.5), name: "cn", stroke: 2pt + orange, fill: orange.lighten(92%))
content((-2.0, 0), text(size: 1.2em, fill: orange, weight: "bold")[$c$])
for i in (0, 1, 2, 3) {
let y_pos = 2.25 - i*1.5
circle((-6.5, y_pos), radius: 0.4, name: "v"+str(i), fill: col_vn_bg, stroke: 1.5pt + blue)
content("v"+str(i), text(size: 0.75em, fill: blue.darken(20%), weight: "bold")[$v_#i$])
let val = vals.at(i)
content(((-6.5, y_pos), 42%, (-2.0, 0)),
box(fill: col_vn_bg, stroke: 0.5pt + blue.lighten(60%), radius: 2pt, inset: 4pt)[
#text(size: 0.65em, fill: black.lighten(10%), weight: "bold")[#val]
])
}
})
// --- 2. FLÈCHE GRISE ---
line((-1.0, 0), (0.5, 0), mark: (end: "stealth", fill: gray), stroke: 1.5pt + gray)
// --- 3. GRAPHIQUE DES BARRES ---
group(name: "bars", {
let base_x = 1.4
for (i, m) in msgs.enumerate() {
let x = base_x + i * 1.4
let is_min = (m == 0.7)
let col = if is_min { col_min } else { col_ms }
rect((x - 0.4, 0), (x + 0.4, m * 0.45), fill: col.lighten(if is_min { 75% } else { 88% }), stroke: 1.5pt + col)
content((x, m * 0.45 + 0.35), text(size: 0.7em, fill: col, weight: "bold")[#m])
content((x, -0.7), box(fill: orange.lighten(92%), stroke: 0.5pt + orange, inset: 5pt, radius: 2pt)[
#text(size: 0.8em, fill: orange, weight: "bold")[#(if sgns.at(i) > 0 [+] else [])]
])
if is_min { content((x, m * 0.45 + 0.8), text(size: 0.55em, fill: col, weight: "bold")[MIN]) }
}
})
// --- 4. FLÈCHE ROUGE ---
line((6.5, 0), (8.0, 0), mark: (end: "stealth", fill: col_min), stroke: 2pt + col_min)
// --- 5. RÉSULTAT FINAL (Décalé plus à droite à x = 11.5) ---
content((10.5, 0), box(stroke: 1.5pt + col_min, fill: col_min.lighten(96%), radius: 5pt, inset: 10pt)[
#text(size: 0.8em, weight: "bold")[$m_(c arrow v_"cible") = -0.7$]
])
})

14962
main.pdf

File diff suppressed because it is too large Load Diff

195
main.typ
View File

@ -937,6 +937,7 @@
] ]
#myslide("Bit-Flipping : Analyse")[ #myslide("Bit-Flipping : Analyse")[
// TODO PARLER DU GIRTH 4 => MAUVAIS
#set text(size: 17pt) #set text(size: 17pt)
#definition(titre: "Avantages", accent: green.darken(10%))[ #definition(titre: "Avantages", accent: green.darken(10%))[
@ -962,15 +963,199 @@
] ]
] ]
#myslide("Soft decoding")[ #myslide("Décodage Soft : Le LLR")[
belief propagation, log ou virgule fixe, explication resultat meilleur #set text(size: 17pt)
#definition(titre: "Signal", accent: blue.darken(10%))[
On reçoit une valeur $y_i$ (ex: $+4.5$V ou $-0.2$V). Le LLR transforme cette mesure physique en une valeur statistique sans unité.
]
#v(0.6em)
#definition(titre: "Log-Likelihood Ratio (LLR)", accent: black)[
$
L(v_i) = ln(display(frac(P(v_i = 0 | y_i), P(v_i = 1 | y_i))))
$
]
#v(0.6em)
#align(center)[
#scale(125%)[#schema_llr_droite()]
]
#v(1em)
// Blocs de légende centrés
#align(center)[
#grid(
columns: (220pt, 220pt),
gutter: 1cm,
block(fill: blue.lighten(92%), stroke: 1pt + blue, radius: 6pt, inset: 12pt)[
#align(center)[
#text(fill: blue.darken(20%), weight: "bold")[Signe] \
#text(size: 0.85em)[Définit la valeur du bit]
]
],
block(fill: orange.lighten(90%), stroke: 1pt + orange, radius: 6pt, inset: 12pt)[
#align(center)[
#text(fill: orange.darken(20%), weight: "bold")[|Valeur|] \
#text(size: 0.85em)[Confiance dans la décision]
]
],
)
]
] ]
#myslide("Implementation")[ #myslide("Sum-Product : Belief Propagation")[
#set text(size: 17pt)
#v(-0.4em)
#definition(titre: "Décodage Optimal")[
Échange itératif de croyances (LLR) entre les nœuds du graphe
]
#definition(titre: "Information Extrinsèque")[
Exclure l'avis du destinataire pour éviter l'auto-influence
]
#block(
fill: orange.lighten(92%),
stroke: (left: 4pt + orange),
radius: 4pt,
inset: 18pt,
width: 100%,
)[
#set text(size: 1.2em)
*Mise à jour CN* \
#set text(size: 1.1em)
$ tanh(m_(c arrow v) / 2) = product_(u != v) tanh(m_(u arrow c) / 2) $
]
#block(
fill: blue.lighten(92%),
stroke: (left: 4pt + blue),
radius: 4pt,
inset: 18pt,
width: 100%,
)[
#set text(size: 1.2em)
*Mise à jour VN* \
#set text(size: 1.1em)
$ m_(v arrow c) = L_"canal" + sum_(c' != c) m_(c' arrow v) $
]
]
#myslide("Sum-Product")[
#set text(size: 16pt)
#place(left, dx: 1.5cm, dy: 0cm)[
#text(weight: "bold", size: 1.1em * 1.3)[Initialisation]
]
#place(left, dx: 1.5cm, dy: 2cm)[
#scale(130%)[
#grid(
columns: 1,
gutter: 0.2cm,
align: horizon,
schema_detailed_init(),
text(size: 0.9em)[$m_(v_j arrow c_i) = L_"canal"$],
)
]
]
#place(right, dx: -4.5cm, dy: 0cm)[
#text(weight: "bold", fill: orange, size: 1.1em * 1.3)[Échange CN]
]
#place(right, dx: -1cm, dy: 2.7cm)[
#scale(130%)[
#schema_detailed_cn()
]
]
#place(left, dx: 1.5cm, dy: 9cm)[
#text(weight: "bold", fill: blue, size: 1.1em * 1.3)[Échange VN]
]
#place(left, dx: 1.5cm, dy: 11cm)[
#scale(130%)[
#schema_detailed_vn()
]
]
#place(right, dx: -3.5cm, dy: 9cm)[
#text(weight: "bold", fill: green, size: 1.1em * 1.3)[Décision Finale]
]
#place(right, dx: -1cm, dy: 11cm)[
#scale(145%)[
#schema_detailed_decision()
]
]
#place(center + horizon, dx: -0.9cm, dy: 8.2cm)[
#scale(115%)[
#cetz.canvas(length: 1cm, {
import cetz.draw: *
let col_iter = gray.darken(50%)
arc(
(0, 0),
radius: 1.8,
start: 150deg,
delta: -300deg,
stroke: (paint: col_iter, thickness: 2pt, cap: "round"),
mark: (end: "stealth", fill: col_iter, size: 0.3),
)
content((1.6, -1), [
#set text(fill: col_iter, weight: "bold", size: 0.8em)
#set align(center)
Itérations\
$i = 1, dots, I_(max)$
])
})
]
]
]
#myslide("Implementation rust")[
] ]
#myslide("Test")[ #myslide("Min-Sum")[
#set text(size: 15pt)
#grid(
columns: (1fr, 1fr),
gutter: 0.5cm,
definition(titre: "Avantage Matériel", accent: black)[
- *Comparateurs* pour le minimum
- *XOR* pour le produit des signes
#v(0.21cm)
],
definition(titre: "Mise à jour du CN", accent: orange)[
#set text(size: 19pt)
$
m_(c arrow v_i) = product_(j != i) "sgn"(m_(v_j arrow c)) times min_(j != i) |m_(v_j arrow c)|
$
],
)
#v(4.5em)
#align(center)[#scale(130%)[#schema_min_sum_complet()]]
#v(0.5em)
#align(center)[
#text(size: 1.1em, fill: gray.darken(40%), style: "italic")[
Pour les VN : $m_(v arrow c) = L_"canal" + sum_(c' != c) m_(c' arrow v)$
]
]
]
#myslide("Test réel")[
Irl hackrf, test de diff de debit avec des paquets Irl hackrf, test de diff de debit avec des paquets
] ]
@ -999,4 +1184,6 @@
] ]
#myslide("Maths deriere Belief Propagation")[
]