import os from collections import defaultdict import plotly.graph_objects as go def plot_trace(results_trace: dict, plot_file: str): utilities = defaultdict(lambda: defaultdict(lambda: {"x": [], "y": [], "bids": []})) accept = {"x": [], "y": [], "bids": []} for index, action in enumerate(results_trace["actions"], 1): if "Offer" in action: offer = action["Offer"] actor = offer["actor"] for agent, util in offer["utilities"].items(): utilities[agent][actor]["x"].append(index) utilities[agent][actor]["y"].append(util) utilities[agent][actor]["bids"].append(offer["bid"]["issuevalues"]) elif "Accept" in action: offer = action["Accept"] index -= 1 for agent, util in offer["utilities"].items(): accept["x"].append(index) accept["y"].append(util) accept["bids"].append(offer["bid"]["issuevalues"]) fig = go.Figure() fig.add_trace( go.Scatter( mode="markers", x=accept["x"], y=accept["y"], name="agreement", marker={"color": "green", "size": 15}, hoverinfo="skip", ) ) color = {0: "red", 1: "blue"} for i, (agent, data) in enumerate(utilities.items()): for actor, utility in data.items(): name = "_".join(agent.split("_")[-2:]) text = [] for bid, util in zip(utility["bids"], utility["y"]): text.append( "
".join( [f"utility: {util:.3f}
"] + [f"{i}: {v}" for i, v in bid.items()] ) ) fig.add_trace( go.Scatter( mode="lines+markers" if agent == actor else "markers", x=utilities[agent][actor]["x"], y=utilities[agent][actor]["y"], name=f"{name} offered" if agent == actor else f"{name} received", legendgroup=agent, marker={"color": color[i]}, hovertext=text, hoverinfo="text", ) ) fig.update_layout( # width=1000, height=800, legend={ "yanchor": "bottom", "y": 1, "xanchor": "left", "x": 0, }, ) fig.update_xaxes(title_text="round", range=[0, index + 1], ticks="outside") fig.update_yaxes(title_text="utility", range=[0, 1], ticks="outside") print("{os.path.splitext(plot_file)[0]}.html") fig.write_html(f"{os.path.splitext(plot_file)[0]}.html") def plot_characteristics(characteristics: dict[str, tuple[list[int], list[float], str]], n_rounds: int): fig = go.Figure() for title, data in characteristics.items(): fig.add_trace( go.Scatter( mode="lines+markers", x=data[0], y=data[1], name=title, marker={"color": data[2],"size": 5}, hoverinfo="skip", ) ) fig.update_layout( # width=1000, height=800, legend={ "yanchor": "bottom", "y": 1, "xanchor": "left", "x": 0, }, ) fig.update_xaxes(title_text="round", range=[0, n_rounds], ticks="outside") fig.update_yaxes(title_text="utility", range=[0, 1], ticks="outside") fig.write_html(f"characteristics.html")