From 58042ba4f24fdf983a4616cc5743d430701710a9 Mon Sep 17 00:00:00 2001 From: Daniel Rosel Date: Fri, 27 Mar 2026 17:19:27 +0100 Subject: [PATCH 1/3] updating node positinoing --- paper/src/chapters/mdp_agent.pdf | Bin 10743 -> 11308 bytes paper/src/chapters/mdp_human.pdf | Bin 12194 -> 12049 bytes sim/rl/behavior_loader/models.py | 95 ++++++++++++++++++++++++------- 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/paper/src/chapters/mdp_agent.pdf b/paper/src/chapters/mdp_agent.pdf index 0566be9e926934d4b553b90623800f40acac21ea..6845eb5e38a36c814ccf729d04281671097dd95c 100644 GIT binary patch delta 9665 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 Dqd%DZ delta 9154 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 C?lHaq delta 10510 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 QE*=UwG&Kq(B}Gq03MMgmB>(^b diff --git a/sim/rl/behavior_loader/models.py b/sim/rl/behavior_loader/models.py index cb67cbf..0b1a285 100644 --- a/sim/rl/behavior_loader/models.py +++ b/sim/rl/behavior_loader/models.py @@ -3,7 +3,7 @@ try: except ImportError: from sim.rl.behavior_loader.loader import Loader, AgentLoader, JointLoader from collections import defaultdict -from typing import Dict, List, Tuple, Set +from typing import Dict, List, Optional, Set, Tuple import numpy as np import graphviz import sys @@ -195,6 +195,35 @@ def aggregate_event_transitions(mdp: Dict) -> Dict[str, Dict[str, float]]: return dict(evt_trans) +def _resolve_event_order( + evt_trans: Dict[str, Dict[str, float]], + event_order: Optional[List[str]] = None, +) -> List[str]: + observed = set(evt_trans.keys()) | { + dst for transitions in evt_trans.values() for dst in transitions + } + if event_order: + ordered = list(dict.fromkeys(event_order)) + missing = sorted(observed - set(ordered)) + return ordered + missing + return sorted(observed) + + +def _fixed_circle_positions( + events: List[str], radius: float +) -> Dict[str, Tuple[float, float]]: + if not events: + return {} + step = (2 * np.pi) / len(events) + return { + evt: ( + float(radius * np.cos(idx * step)), + float(radius * np.sin(idx * step)), + ) + for idx, evt in enumerate(events) + } + + def visualize_mdp( model: BehaviorModel, threshold: float = 0.05, @@ -202,20 +231,31 @@ def visualize_mdp( fmt: str = "svg", view: bool = False, export_dot: bool = False, + event_order: Optional[List[str]] = None, + layout_radius: float = 6.0, + node_diameter: float = 2.4, ): if not model.mdp: raise ValueError("build MDP first") evt_trans = aggregate_event_transitions(model.mdp) - g = graphviz.Digraph(format=fmt) - g.attr(rankdir="LR", size="30") - g.attr("node", shape="circle", width="1", height="1") + ordered_events = _resolve_event_order(evt_trans, event_order=event_order) + positions = _fixed_circle_positions(ordered_events, radius=layout_radius) - events = set(evt_trans.keys()) | { - e for trans in evt_trans.values() for e in trans.keys() - } - for evt in events: - g.node(evt) + g = graphviz.Digraph(format=fmt, engine="neato") + g.attr(overlap="false", splines="true", outputorder="edgesfirst") + g.attr( + "node", + shape="circle", + width=f"{node_diameter:.2f}", + height=f"{node_diameter:.2f}", + fixedsize="true", + fontsize="10", + ) + + for evt in ordered_events: + x_pos, y_pos = positions[evt] + g.node(evt, pos=f"{x_pos:.3f},{y_pos:.3f}!", pin="true") for src, dsts in evt_trans.items(): for dst, prob in dsts.items(): @@ -342,11 +382,6 @@ if __name__ == "__main__": f"Built MDP: {human_mdp['num_states']} states, " f"{sum(len(t) for t in human_mdp['transitions'].values())} transitions" ) - if not human_mdp["states"]: - exit("No states found") - visualize_mdp( - human_model, threshold=0.05, output="human_mdp_viz", fmt="pdf", export_dot=True - ) agent_model = AgentBehaviorModel(agent_dir) agent_mdp = agent_model.build_MDP() @@ -355,14 +390,35 @@ if __name__ == "__main__": f"AGENT... Built MDP: {agent_mdp['num_states']} states, " f"{sum(len(t) for t in agent_mdp['transitions'].values())} transitions" ) - if not agent_mdp["states"]: - exit("No states found") - visualize_mdp( - agent_model, threshold=0.05, output="agent_mdp_viz", fmt="pdf", export_dot=True - ) human_evt = aggregate_event_transitions(human_mdp) agent_evt = aggregate_event_transitions(agent_mdp) + canonical_events = sorted( + (set(human_evt.keys()) | {e for tr in human_evt.values() for e in tr.keys()}) + | (set(agent_evt.keys()) | {e for tr in agent_evt.values() for e in tr.keys()}) + ) + + if not human_mdp["states"]: + exit("No states found") + visualize_mdp( + human_model, + threshold=0.05, + output="human_mdp_viz", + fmt="pdf", + export_dot=True, + event_order=canonical_events, + ) + + if not agent_mdp["states"]: + exit("No states found") + visualize_mdp( + agent_model, + threshold=0.05, + output="agent_mdp_viz", + fmt="pdf", + export_dot=True, + event_order=canonical_events, + ) common = set(human_evt.keys()) & set(agent_evt.keys()) @@ -394,6 +450,7 @@ if __name__ == "__main__": output="joint_mdp_viz", fmt="pdf", export_dot=True, + event_order=canonical_events, ) inter_class_avg = float(np.mean([kl for _, kl in kl_divs])) From 9c464eaf3b8ce70c0771316f3a131ce273d56033 Mon Sep 17 00:00:00 2001 From: Daniel Rosel Date: Fri, 27 Mar 2026 21:14:54 +0100 Subject: [PATCH 2/3] chore: forgot the fiures --- .../final_focus_coi_preservation_grid.csv | 45 ++++++++++++++++++ .../final/plots/final_focus_coi_by_alpha.pdf | Bin 0 -> 24919 bytes .../final_focus_coi_preservation_grid.pdf | Bin 0 -> 21304 bytes .../final/final_focus_coi_by_alpha.tex | 1 + .../final_focus_coi_preservation_grid.tex | 1 + 5 files changed, 47 insertions(+) create mode 100644 paper/src/chapters/figures/results/generated/final/final_focus_coi_preservation_grid.csv create mode 100644 paper/src/chapters/figures/results/generated/final/plots/final_focus_coi_by_alpha.pdf create mode 100644 paper/src/chapters/figures/results/generated/final/plots/final_focus_coi_preservation_grid.pdf create mode 100644 paper/src/chapters/figures/results/includes/final/final_focus_coi_by_alpha.tex create mode 100644 paper/src/chapters/figures/results/includes/final/final_focus_coi_preservation_grid.tex diff --git a/paper/src/chapters/figures/results/generated/final/final_focus_coi_preservation_grid.csv b/paper/src/chapters/figures/results/generated/final/final_focus_coi_preservation_grid.csv new file mode 100644 index 0000000..a2e5115 --- /dev/null +++ b/paper/src/chapters/figures/results/generated/final/final_focus_coi_preservation_grid.csv @@ -0,0 +1,45 @@ +alpha,n_products,baseline_runs,defended_runs,baseline_coi_level_mean,defended_coi_level_mean,coi_preserved,coi_preserved_pct +0.0,5.0,9,10,137.060822623968,136.18680853180368,-0.874014092164316,-0.6376833842316922 +0.0,25.0,9,2,137.114858903596,136.13793579187393,-0.9769231117220727,-0.7124852255501622 +0.0,50.0,9,11,137.16224858153575,136.92415566181484,-0.23809291972091273,-0.17358487643878118 +0.0,100.0,9,12,135.86629045322655,137.3609873086303,1.4946968554037596,1.1001234010420895 +0.1,5.0,3,6,136.59581715538818,135.6308466787041,-0.9649704766840728,-0.7064421859904723 +0.1,25.0,11,8,135.9860669350444,136.43616365263273,0.45009671758833747,0.33098737814318313 +0.1,50.0,10,11,136.28362874897243,136.92880179422633,0.6451730452538982,0.4734046570203046 +0.1,100.0,8,8,137.35578496752095,137.53394777402949,0.17816280650853855,0.12970899372797937 +0.2,5.0,8,9,135.55116314329388,137.30311388107864,1.7519507377847674,1.2924645551973204 +0.2,25.0,10,9,137.01587649612287,137.22137163685403,0.20549514073115915,0.1499790724887083 +0.2,50.0,4,8,137.45096138958434,137.1307018163465,-0.32025957323784837,-0.2329991511155169 +0.2,100.0,9,9,137.50780776750915,137.43195025898902,-0.07585750852013007,-0.0551659645744523 +0.3,5.0,6,6,134.95569459599133,134.21855668602896,-0.7371379099623709,-0.5462073402453271 +0.3,25.0,9,16,136.38346021911525,136.32131251342705,-0.06214770568820427,-0.04556835967378819 +0.3,50.0,8,6,136.97414077213367,136.88041560990786,-0.09372516222580884,-0.06842544271310845 +0.3,100.0,7,16,137.19706520314455,137.31020460277784,0.11313939963329744,0.08246488324351146 +0.4,5.0,8,11,135.6494813257779,136.5487738152141,0.899292489436192,0.6629531352769695 +0.4,25.0,7,9,136.38451372914378,136.10614648175604,-0.27836724738773455,-0.20410473284420322 +0.4,50.0,7,10,137.12976275807247,136.98838321468799,-0.14137954338448822,-0.10309909427460566 +0.4,100.0,11,8,137.4158065068933,137.4849148270489,0.06910832015560686,0.050291390715769026 +0.5,5.0,7,19,135.91101413475477,136.145621134976,0.2346070002212457,0.1726180925915501 +0.5,25.0,8,7,137.0972914279529,137.35620682163616,0.2589153936832531,0.18885522170896996 +0.5,50.0,8,1,137.0714841014652,135.66696334266234,-1.404520758802846,-1.0246629837050352 +0.5,100.0,10,8,137.4717672869487,137.35366167964338,-0.11810560730532416,-0.08591262746975456 +0.6,5.0,8,13,133.13626070539635,136.09936023073067,2.9630995253343144,2.225614201296411 +0.6,25.0,5,10,136.0741624588533,136.26219778039936,0.18803532154606728,0.13818591137970535 +0.6,50.0,8,10,135.09036188289087,136.05846380616936,0.968101923278482,0.7166328595060871 +0.6,100.0,7,8,137.29304001584052,137.07512338179083,-0.2179166340496863,-0.15872372993164377 +0.7,5.0,7,7,136.0533783988379,135.14350016006424,-0.9098782387736719,-0.6687656341075052 +0.7,25.0,8,11,137.12781750399415,136.8176582131797,-0.3101592908144539,-0.2261826203172962 +0.7,50.0,14,11,137.06965735909125,136.7028634119364,-0.3667939471548607,-0.26759674914335285 +0.7,100.0,11,11,137.48279078937205,137.09121810549402,-0.39157268387802446,-0.28481578067317975 +0.8,5.0,4,7,135.3095773096514,136.59715728802078,1.2875799783693935,0.9515808148766959 +0.8,25.0,12,13,136.93488398652164,135.73319876476054,-1.201685221761096,-0.8775596011600497 +0.8,50.0,6,8,136.4704324290659,136.86568018140107,0.39524775233516607,0.289621528487943 +0.8,100.0,4,11,137.519864039095,137.4763376137669,-0.04352642532811046,-0.03165100957032396 +0.9,5.0,5,5,134.77024204025943,136.6651608019597,1.8949187617002679,1.4060364758669837 +0.9,25.0,9,13,136.7554042236364,136.06108143100832,-0.6943227926280713,-0.507711411164888 +0.9,50.0,10,12,136.08715955450202,137.07569864767092,0.988539093168896,0.7264014447836223 +0.9,100.0,11,9,137.57053132642514,137.30115968842037,-0.2693716380047704,-0.19580620602940735 +1.0,5.0,5,7,136.43177888041947,135.92674388998284,-0.5050349904366271,-0.37017401266847305 +1.0,25.0,11,9,136.7037183889911,136.22617845471228,-0.47753993427880914,-0.34932475861407586 +1.0,50.0,11,5,136.93074105866745,137.05826644845806,0.12752538979060546,0.09313130769953819 +1.0,100.0,8,9,136.4880191421812,137.41913068956546,0.9311115473842619,0.682192879079234 diff --git a/paper/src/chapters/figures/results/generated/final/plots/final_focus_coi_by_alpha.pdf b/paper/src/chapters/figures/results/generated/final/plots/final_focus_coi_by_alpha.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b47a4fd8a175372b94fc20f6e8e179d5444e99f5 GIT binary patch literal 24919 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 Y-ow+}-IFp!qew)sA`lT#)>47}Urh=UiU0rr literal 0 HcmV?d00001 diff --git a/paper/src/chapters/figures/results/includes/final/final_focus_coi_by_alpha.tex b/paper/src/chapters/figures/results/includes/final/final_focus_coi_by_alpha.tex new file mode 100644 index 0000000..6eafa3f --- /dev/null +++ b/paper/src/chapters/figures/results/includes/final/final_focus_coi_by_alpha.tex @@ -0,0 +1 @@ +\includegraphics[width=0.98\linewidth]{chapters/figures/results/generated/final/plots/final_focus_coi_by_alpha.pdf} diff --git a/paper/src/chapters/figures/results/includes/final/final_focus_coi_preservation_grid.tex b/paper/src/chapters/figures/results/includes/final/final_focus_coi_preservation_grid.tex new file mode 100644 index 0000000..1ca04c8 --- /dev/null +++ b/paper/src/chapters/figures/results/includes/final/final_focus_coi_preservation_grid.tex @@ -0,0 +1 @@ +\includegraphics[width=0.98\linewidth]{chapters/figures/results/generated/final/plots/final_focus_coi_preservation_grid.pdf} From e77f037d626ccd8c58de900c3c7392e45349342c Mon Sep 17 00:00:00 2001 From: Daniel Rosel Date: Sat, 28 Mar 2026 11:56:37 +0100 Subject: [PATCH 3/3] initial progress --- paper/src/chapters/03-methodology.tex | 2 +- paper/src/chapters/mdp_agent.pdf | Bin 11308 -> 11236 bytes paper/src/chapters/mdp_human.pdf | Bin 12049 -> 11953 bytes scripts/nx_paper.sh | 21 ++++ sim/rl/behavior_loader/models.py | 163 ++++++++++++++++++++++---- 5 files changed, 163 insertions(+), 23 deletions(-) diff --git a/paper/src/chapters/03-methodology.tex b/paper/src/chapters/03-methodology.tex index 8c58717..799486e 100644 --- a/paper/src/chapters/03-methodology.tex +++ b/paper/src/chapters/03-methodology.tex @@ -23,7 +23,7 @@ where: The platform does not directly observe the true underlying demand function $d(p)$. Instead, it observes a behavioral proxy $\hat{q}_t$, which is a composite signal derived from the mixture of actor types. We define the demand proxy for product $i$ at epoch $t$ as a weighted aggregation of events: \begin{equation} \label{eq:qhat} -\hat{q}_{t,i} = \sum_{s \in \mathcal{S}_t} \sum_{k=1}^{L_s} \omega(a_{s,k}) \cdot \mathds{1}[i_{s,k} = i] +\hat{q}_{t,i} = \sum_{s \in \mathcal{S}_t} \sum_{k=1}^{L_s} \omega(a_{s,k}) \cdot \mathbf{1}[i_{s,k} = i] \end{equation} where $\omega: \mathcal{A} \to \mathbb{R}_+$ assigns weights to actions based on their signal strength regarding willingness to pay. diff --git a/paper/src/chapters/mdp_agent.pdf b/paper/src/chapters/mdp_agent.pdf index 6845eb5e38a36c814ccf729d04281671097dd95c..aeab1b7ff171d39eb33df300f16001377afec8b7 100644 GIT binary patch delta 9869 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 USXd(e+cY;9G7XJ{k|gr~0L^FmbN~PV delta 9894 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 diff --git a/paper/src/chapters/mdp_human.pdf b/paper/src/chapters/mdp_human.pdf index 69bc8d3cde21065fc132b2dbbab5b534201752f5..b753b4ea8fce0f6dfcb47961aafd33ed07beeed4 100644 GIT binary patch delta 10531 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 RK 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 str: + ports = ("e", "ne", "n", "nw", "w", "sw", "s", "se") + normalized = (angle_rad + (2 * np.pi)) % (2 * np.pi) + step = np.pi / 4 + idx = int(np.round(normalized / step)) % len(ports) + return ports[idx] + + +def _edge_ports( + src: str, + dst: str, + positions: Dict[str, Tuple[float, float]], + has_reverse: bool, +) -> Tuple[str, str]: + src_x, src_y = positions[src] + dst_x, dst_y = positions[dst] + angle = float(np.arctan2(dst_y - src_y, dst_x - src_x)) + + if has_reverse: + bend = np.pi / 10 + angle += bend if src < dst else -bend + + tail_port = _compass_from_angle(angle) + head_port = _compass_from_angle(angle + np.pi) + return tail_port, head_port + + +def _edge_style(prob: float) -> Dict[str, str]: + if prob >= 0.75: + edge_color = "#111827" + elif prob >= 0.50: + edge_color = "#374151" + elif prob >= 0.25: + edge_color = "#6b7280" + else: + edge_color = "#9ca3af" + return { + "color": edge_color, + "fontcolor": "#111827", + "fontsize": "10", + "penwidth": f"{0.9 + 3.6 * prob:.2f}", + "arrowsize": f"{0.55 + 0.55 * prob:.2f}", + } + + +def _format_node_label(evt: str) -> str: + max_line_len = 16 + tokens = evt.split("_") + if len(tokens) == 1: + return evt + + lines: List[str] = [] + curr = "" + for token in tokens: + piece = token if not curr else f"_{token}" + if curr and len(curr) + len(piece) > max_line_len: + lines.append(curr) + curr = token + else: + curr = f"{curr}{piece}" if curr else token + if curr: + lines.append(curr) + return "\n".join(lines) + + +def _compute_flow_positions( + events: List[str], + layout_radius: float, ) -> Dict[str, Tuple[float, float]]: + """Balanced grid layout for paper-friendly diagrams.""" if not events: return {} - step = (2 * np.pi) / len(events) - return { - evt: ( - float(radius * np.cos(idx * step)), - float(radius * np.sin(idx * step)), - ) - for idx, evt in enumerate(events) - } + + num_events = len(events) + cols = int(np.ceil(np.sqrt(num_events))) + rows = int(np.ceil(num_events / cols)) + x_step = max(layout_radius * 1.10, 3.6) + y_step = max(layout_radius * 0.95, 3.2) + + positions: Dict[str, Tuple[float, float]] = {} + for idx, evt in enumerate(events): + row = idx // cols + col = idx % cols + x = (col - (cols - 1) / 2.0) * x_step + y = ((rows - 1) / 2.0 - row) * y_step + positions[evt] = (float(x), float(y)) + + return positions def visualize_mdp( @@ -232,35 +307,79 @@ def visualize_mdp( view: bool = False, export_dot: bool = False, event_order: Optional[List[str]] = None, - layout_radius: float = 6.0, - node_diameter: float = 2.4, + layout_radius: float = 10.0, + node_diameter: float = 1.8, + label_threshold: float = 0.08, ): if not model.mdp: raise ValueError("build MDP first") evt_trans = aggregate_event_transitions(model.mdp) ordered_events = _resolve_event_order(evt_trans, event_order=event_order) - positions = _fixed_circle_positions(ordered_events, radius=layout_radius) + positions = _compute_flow_positions(ordered_events, layout_radius=layout_radius) g = graphviz.Digraph(format=fmt, engine="neato") - g.attr(overlap="false", splines="true", outputorder="edgesfirst") + g.attr( + overlap="false", + splines="true", + outputorder="edgesfirst", + pad="0.5", + sep="+9", + esep="+4", + bgcolor="white", + dpi="180", + ) g.attr( "node", shape="circle", + fixedsize="true", width=f"{node_diameter:.2f}", height=f"{node_diameter:.2f}", - fixedsize="true", - fontsize="10", + fontsize="11", + fontname="Helvetica", + style="filled", + fillcolor="white", + color="#374151", + fontcolor="#111827", + penwidth="1.8", + peripheries="1", + ) + g.attr( + "edge", + fontname="Helvetica", ) for evt in ordered_events: - x_pos, y_pos = positions[evt] - g.node(evt, pos=f"{x_pos:.3f},{y_pos:.3f}!", pin="true") + x, y = positions[evt] + g.node(evt, label=_format_node_label(evt), pos=f"{x:.2f},{y:.2f}!", pin="true") - for src, dsts in evt_trans.items(): - for dst, prob in dsts.items(): - if prob > threshold: - g.edge(src, dst, label=f"{prob:.2f}") + edges = [ + (src, dst, prob) + for src, dsts in evt_trans.items() + for dst, prob in dsts.items() + if prob > threshold + ] + edge_set = {(src, dst) for src, dst, _ in edges} + + for src, dst, prob in sorted(edges, key=lambda row: row[2]): + edge_attrs: Dict[str, str] = _edge_style(prob) + + if src == dst: + # pick a loop port away from the main flow + sx, sy = positions[src] + loop_port = "n" if sy <= 0 else "s" + edge_attrs.update({"tailport": loop_port, "headport": loop_port}) + else: + has_reverse = (dst, src) in edge_set + tail_port, head_port = _edge_ports(src, dst, positions, has_reverse) + edge_attrs.update({"tailport": tail_port, "headport": head_port}) + if has_reverse: + edge_attrs["constraint"] = "false" + + if prob >= label_threshold or src == dst: + edge_attrs["label"] = f" {prob:.2f} " + + g.edge(src, dst, **edge_attrs) g.render(output, view=view, cleanup=True) print(f"Saved MDP graph to {output}.{fmt}")