def plot_trial(trial_spec, info_space): '''Plot the trial graph, 1 pane: mean and error envelope of reward graphs from all sessions. Each aeb_df gets its own color''' prepath = util.get_prepath(trial_spec, info_space) predir = util.prepath_to_predir(prepath) session_datas = session_datas_from_file(predir, trial_spec, info_space.get('trial')) aeb_count = len(session_datas[0]) palette = get_palette(aeb_count) fig = None for idx, (a, e, b) in enumerate(session_datas[0]): aeb = (a, e, b) aeb_str = f'{a}{e}{b}' color = palette[idx] aeb_rewards_df = gather_aeb_rewards_df(aeb, session_datas) aeb_fig = build_aeb_reward_fig(aeb_rewards_df, aeb_str, color) if fig is None: fig = aeb_fig else: fig.data.extend(aeb_fig.data) fig.layout.update( title=f'trial graph: {trial_spec["name"]} t{info_space.get("trial")}', width=500, height=600) viz.plot(fig) return fig
def plot_session(session_spec, info_space, session_data): '''Plot the session graph, 2 panes: reward, loss & explore_var. Each aeb_df gets its own color''' aeb_count = len(session_data) if aeb_count <= 8: palette = cl.scales[str(max(3, aeb_count))]['qual']['Set2'] else: palette = util.interp(cl.scales['8']['qual']['Set2'], aeb_count) fig = viz.tools.make_subplots(rows=3, cols=1, shared_xaxes=True) for idx, (a, e, b) in enumerate(session_data): aeb_str = f'{a}{e}{b}' aeb_df = session_data[(a, e, b)] fig_1 = viz.plot_line(aeb_df, 'reward', 'epi', legend_name=aeb_str, draw=False, trace_kwargs={'legendgroup': aeb_str, 'line': {'color': palette[idx]}}) fig.append_trace(fig_1.data[0], 1, 1) fig_2 = viz.plot_line(aeb_df, ['loss'], 'epi', y2_col=['explore_var'], trace_kwargs={'legendgroup': aeb_str, 'showlegend': False, 'line': {'color': palette[idx]}}, draw=False) fig.append_trace(fig_2.data[0], 2, 1) fig.append_trace(fig_2.data[1], 3, 1) fig.layout['xaxis1'].update(title='epi', zerolinewidth=1) fig.layout['yaxis1'].update(fig_1.layout['yaxis']) fig.layout['yaxis1'].update(domain=[0.55, 1]) fig.layout['yaxis2'].update(fig_2.layout['yaxis']) fig.layout['yaxis2'].update(showgrid=False, domain=[0, 0.45]) fig.layout['yaxis3'].update(fig_2.layout['yaxis2']) fig.layout['yaxis3'].update(overlaying='y2', anchor='x2') fig.layout.update(ps.pick(fig_1.layout, ['legend'])) fig.layout.update(title=f'session graph: {session_spec["name"]} t{info_space.get("trial")} s{info_space.get("session")}', width=500, height=600) viz.plot(fig) return fig
def plot_experiment(experiment_spec, experiment_df): ''' Plot the variable specs vs fitness vector of an experiment, where each point is a trial. ref colors: https://plot.ly/python/heatmaps-contours-and-2dhistograms-tutorial/#plotlys-predefined-color-scales ''' y_cols = ['fitness'] + FITNESS_COLS x_cols = ps.difference(experiment_df.columns.tolist(), y_cols) fig = viz.tools.make_subplots(rows=len(y_cols), cols=len(x_cols), shared_xaxes=True, shared_yaxes=True) fitness_sr = experiment_df['fitness'] min_fitness = fitness_sr.values.min() max_fitness = fitness_sr.values.max() for row_idx, y in enumerate(y_cols): for col_idx, x in enumerate(x_cols): x_sr = experiment_df[x] guard_cat_x = x_sr.astype(str) if x_sr.dtype == 'object' else x_sr trace = viz.go.Scatter( y=experiment_df[y], yaxis=f'y{row_idx+1}', x=guard_cat_x, xaxis=f'x{col_idx+1}', showlegend=False, mode='markers', marker={ 'symbol': 'circle-open-dot', 'color': experiment_df['fitness'], 'opacity': 0.5, # dump first quarter of colorscale that is too bright 'cmin': min_fitness - 0.25 * (max_fitness - min_fitness), 'cmax': max_fitness, 'colorscale': 'YIGnBu', 'reversescale': True }, ) fig.append_trace(trace, row_idx + 1, col_idx + 1) fig.layout[f'xaxis{col_idx+1}'].update(title='<br>'.join(ps.chunk(x, 20)), zerolinewidth=1, categoryarray=sorted(guard_cat_x.unique())) fig.layout[f'yaxis{row_idx+1}'].update(title=y, rangemode='tozero') fig.layout.update(title=f'experiment graph: {experiment_spec["name"]}', width=max(600, len(x_cols) * 300), height=700) viz.plot(fig) return fig
def plot_session(session_spec, info_space, session_data): '''Plot the session graph, 2 panes: reward, loss & explore_var. Each aeb_df gets its own color''' graph_x = session_spec['meta'].get('graph_x', 'epi') aeb_count = len(session_data) palette = viz.get_palette(aeb_count) fig = viz.tools.make_subplots(rows=3, cols=1, shared_xaxes=True) for idx, (a, e, b) in enumerate(session_data): aeb_str = f'{a}{e}{b}' aeb_df = session_data[(a, e, b)] aeb_df.fillna(0, inplace=True) # for saving plot, cant have nan fig_1 = viz.plot_line(aeb_df, 'reward', graph_x, legend_name=aeb_str, draw=False, trace_kwargs={'legendgroup': aeb_str, 'line': {'color': palette[idx]}}) fig.append_trace(fig_1.data[0], 1, 1) fig_2 = viz.plot_line(aeb_df, ['loss'], graph_x, y2_col=['explore_var'], trace_kwargs={'legendgroup': aeb_str, 'showlegend': False, 'line': {'color': palette[idx]}}, draw=False) fig.append_trace(fig_2.data[0], 2, 1) fig.append_trace(fig_2.data[1], 3, 1) fig.layout['xaxis1'].update(title=graph_x, zerolinewidth=1) fig.layout['yaxis1'].update(fig_1.layout['yaxis']) fig.layout['yaxis1'].update(domain=[0.55, 1]) fig.layout['yaxis2'].update(fig_2.layout['yaxis']) fig.layout['yaxis2'].update(showgrid=False, domain=[0, 0.45]) fig.layout['yaxis3'].update(fig_2.layout['yaxis2']) fig.layout['yaxis3'].update(overlaying='y2', anchor='x2') fig.layout.update(ps.pick(fig_1.layout, ['legend'])) fig.layout.update(title=f'session graph: {session_spec["name"]} t{info_space.get("trial")} s{info_space.get("session")}', width=500, height=600) viz.plot(fig) return fig
def plot_trial(trial_spec, info_space): '''Plot the trial graph, 1 pane: mean and error envelope of reward graphs from all sessions. Each aeb_df gets its own color''' prepath = util.get_prepath(trial_spec, info_space) predir, _, _, _, _, _ = util.prepath_split(prepath) session_datas = session_datas_from_file(predir, trial_spec, info_space.get('trial')) rand_session_data = session_datas[list(session_datas.keys())[0]] max_tick_unit = ps.get(trial_spec, 'env.0.max_tick_unit') aeb_count = len(rand_session_data) palette = viz.get_palette(aeb_count) fig = None for idx, (a, e, b) in enumerate(rand_session_data): aeb = (a, e, b) aeb_str = f'{a}{e}{b}' color = palette[idx] aeb_rewards_df = gather_aeb_rewards_df(aeb, session_datas, max_tick_unit) aeb_fig = build_aeb_reward_fig(aeb_rewards_df, aeb_str, color, max_tick_unit) if fig is None: fig = aeb_fig else: fig.add_traces(aeb_fig.data) fig.layout.update( title= f'trial graph: {trial_spec["name"]} t{info_space.get("trial")}, {len(session_datas)} sessions', width=500, height=600) viz.plot(fig) return fig
def plot_experiment(experiment_spec, experiment_df): ''' Plot the variable specs vs fitness vector of an experiment, where each point is a trial. ref colors: https://plot.ly/python/heatmaps-contours-and-2dhistograms-tutorial/#plotlys-predefined-color-scales ''' y_cols = ['fitness'] + FITNESS_COLS x_cols = ps.difference(experiment_df.columns.tolist(), y_cols) fig = viz.tools.make_subplots(rows=len(y_cols), cols=len(x_cols), shared_xaxes=True, shared_yaxes=True) fitness_sr = experiment_df['fitness'] min_fitness = fitness_sr.values.min() max_fitness = fitness_sr.values.max() for row_idx, y in enumerate(y_cols): for col_idx, x in enumerate(x_cols): x_sr = experiment_df[x] guard_cat_x = x_sr.astype(str) if x_sr.dtype == 'object' else x_sr trace = viz.go.Scatter( y=experiment_df[y], yaxis=f'y{row_idx+1}', x=guard_cat_x, xaxis=f'x{col_idx+1}', showlegend=False, mode='markers', marker={ 'symbol': 'circle-open-dot', 'color': experiment_df['fitness'], 'opacity': 0.5, # dump first quarter of colorscale that is too bright 'cmin': min_fitness - 0.50 * (max_fitness - min_fitness), 'cmax': max_fitness, 'colorscale': 'YIGnBu', 'reversescale': True }, ) fig.append_trace(trace, row_idx + 1, col_idx + 1) fig.layout[f'xaxis{col_idx+1}'].update(title='<br>'.join(ps.chunk(x, 20)), zerolinewidth=1, categoryarray=sorted(guard_cat_x.unique())) fig.layout[f'yaxis{row_idx+1}'].update(title=y, rangemode='tozero') fig.layout.update(title=f'experiment graph: {experiment_spec["name"]}', width=max(600, len(x_cols) * 300), height=700) viz.plot(fig) return fig
def plot_session(session_spec, info_space, session_data): '''Plot the session graph, 2 panes: reward, loss & explore_var. Each aeb_df gets its own color''' aeb_count = len(session_data) palette = get_palette(aeb_count) fig = viz.tools.make_subplots(rows=3, cols=1, shared_xaxes=True) for idx, (a, e, b) in enumerate(session_data): aeb_str = f'{a}{e}{b}' aeb_df = session_data[(a, e, b)] aeb_df.fillna(0, inplace=True) # for saving plot, cant have nan fig_1 = viz.plot_line(aeb_df, 'reward', 'epi', legend_name=aeb_str, draw=False, trace_kwargs={'legendgroup': aeb_str, 'line': {'color': palette[idx]}}) fig.append_trace(fig_1.data[0], 1, 1) fig_2 = viz.plot_line(aeb_df, ['loss'], 'epi', y2_col=['explore_var'], trace_kwargs={'legendgroup': aeb_str, 'showlegend': False, 'line': {'color': palette[idx]}}, draw=False) fig.append_trace(fig_2.data[0], 2, 1) fig.append_trace(fig_2.data[1], 3, 1) fig.layout['xaxis1'].update(title='epi', zerolinewidth=1) fig.layout['yaxis1'].update(fig_1.layout['yaxis']) fig.layout['yaxis1'].update(domain=[0.55, 1]) fig.layout['yaxis2'].update(fig_2.layout['yaxis']) fig.layout['yaxis2'].update(showgrid=False, domain=[0, 0.45]) fig.layout['yaxis3'].update(fig_2.layout['yaxis2']) fig.layout['yaxis3'].update(overlaying='y2', anchor='x2') fig.layout.update(ps.pick(fig_1.layout, ['legend'])) fig.layout.update(title=f'session graph: {session_spec["name"]} t{info_space.get("trial")} s{info_space.get("session")}', width=500, height=600) viz.plot(fig) return fig
def plot_trial(trial_spec, info_space): '''Plot the trial graph, 1 pane: mean and error envelope of reward graphs from all sessions. Each aeb_df gets its own color''' prepath = util.get_prepath(trial_spec, info_space) predir = util.prepath_to_predir(prepath) session_datas = session_datas_from_file(predir, trial_spec, info_space.get('trial')) aeb_count = len(session_datas[0]) palette = get_palette(aeb_count) fig = None for idx, (a, e, b) in enumerate(session_datas[0]): aeb = (a, e, b) aeb_str = f'{a}{e}{b}' color = palette[idx] aeb_rewards_df = gather_aeb_rewards_df(aeb, session_datas) aeb_fig = build_aeb_reward_fig(aeb_rewards_df, aeb_str, color) if fig is None: fig = aeb_fig else: fig.data.extend(aeb_fig.data) fig.layout.update(title=f'trial graph: {trial_spec["name"]} t{info_space.get("trial")}', width=500, height=600) viz.plot(fig) return fig
# pull plots to make multiple subplots fig1 = viz.plot_area(df, ['a'], y2_col=['b'], draw=False) fig2 = viz.plot_area(df, ['b'], draw=False) fig = viz.tools.make_subplots(rows=3, cols=1, shared_xaxes=True) fig.append_trace(fig1.data[0], 1, 1) fig.append_trace(fig1.data[1], 2, 1) fig.append_trace(fig2.data[0], 3, 1) fig.layout['yaxis1'].update(fig1.layout['yaxis']) fig.layout['yaxis2'].update(fig1.layout['yaxis2']) fig.layout['yaxis1'].update(domain=[0.55, 1]) fig.layout['yaxis3'].update(fig2.layout['yaxis']) fig.layout['yaxis3'].update(domain=[0, 0.45]) fig.layout.update(_.pick(fig1.layout, ['legend'])) fig.layout.update(title='total_rewards vs time', width=500, height=400) viz.plot(fig) Latex(r'''\begin{eqnarray} \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ \nabla \cdot \vec{\mathbf{B}} & = 0 \end{eqnarray}''') Latex(r'''\begin{eqnarray} \text{A policy is a function } \pi: S \rightarrow A \\ \text{Find a policy } \pi^* \text{that max. the cum. discounted reward } \sum_{t \geq 0}\gamma^t r_t \\ \pi^* = arg\max\limits_{\pi} E\big[\sum_{t\geq0}\gamma^t r_t|\pi\big] \\ \text{with } s_0 \sim p(s_0), a_t \sim \pi(\cdot|s_t),s_{t+1} \sim p(s_t, a_t) \\