import%20marimo%0A%0A__generated_with%20%3D%20%220.23.11%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20from%20simulatingrisk.doc_utils%20import%20docs_header%0A%20%20%20%20from%20simulatingrisk.hawkdovemulti.batch_run%20import%20params%0A%0A%20%20%20%20docs_header()%0A%20%20%20%20return%20(params%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Percent%20of%20the%20time%20agents%20play%20Hawk%2C%20by%20risk%20attitude%0A%0A%20%20%20%20What%20%25%20of%20the%20time%20do%20risk-seeking%20(R%3D1)%20and%20risk-averse%20(R8)%20agents%20play%20Hawk%3F%0A%0A%20%20%20%20-%20Our%20guess%20from%20observation%20is%20is%20%3E90%25%20for%20R%3D1%2C%20%3C10%25%20for%20R8%2C%20but%20it%20would%20be%20helpful%20to%20have%20statistics%20for%20this%3A%20for%20X%20trials%2C%20how%20many%20of%20them%20does%20R1%20play%20Hawk%20more%20than%2090%25%20of%20the%20time%3F%0A%20%20%20%20-%20Also%20useful%20to%20have%20statistics%20e.g.%20R%3D2%20played%20Hawk%20between%2080-90%25%20of%20the%20time%2C%20or%20whatever%20the%20result%20is.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20import%20altair%20as%20alt%0A%0A%20%20%20%20%23%20shared%20notebook%20code%20in%20this%20folder%0A%20%20%20%20from%20utils%20import%20load_agent_data%0A%0A%20%20%20%20data_dir%20%3D%20Path(%22data%2Fno_adjustment%2F%22)%0A%20%20%20%20return%20alt%2C%20data_dir%2C%20load_agent_data%2C%20mo%2C%20pl%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(data_dir%2C%20load_agent_data%2C%20pl)%3A%0A%20%20%20%20%23%20load%20agent%20data%20combined%20with%20model%20parameters%0A%20%20%20%20model_agent_df%20%3D%20(%0A%20%20%20%20%20%20%20%20pl.concat(load_agent_data(data_dir))%0A%20%20%20%20%20%20%20%20.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20the%20hawk_count%20column%20reports%20how%20many%20times%20this%20agent%20played%20hawk%3B%20divide%20by%20run%20length%20(step%20count)%20for%20percent%0A%20%20%20%20%20%20%20%20%20%20%20%20pct_hawk_plays%3Dpl.col.hawk_count.truediv(pl.col.Step).mul(100)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.collect()%0A%20%20%20%20)%0A%20%20%20%20return%20(model_agent_df%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(model_agent_df%2C%20pl)%3A%0A%20%20%20%20%23%20group%20by%20risk%20attitude%20and%20get%20an%20average%20of%20the%20percents%20for%20each%20group%0A%20%20%20%20hawk_by_risk_attitude%20%3D%20model_agent_df.group_by(%22risk_attitude%22).agg(%0A%20%20%20%20%20%20%20%20avg_pct_hawk_plays%3Dpl.col.pct_hawk_plays.mean()%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20output%20results%20fields%20as%20nicely%20styled%20table%0A%20%20%20%20(%0A%20%20%20%20%20%20%20%20hawk_by_risk_attitude.select(%22risk_attitude%22%2C%20%22avg_pct_hawk_plays%22)%0A%20%20%20%20%20%20%20%20.sort(%22risk_attitude%22)%0A%20%20%20%20%20%20%20%20.rename(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22risk_attitude%22%3A%20%22Risk%20Attitude%22%2C%20%22avg_pct_hawk_plays%22%3A%20%22%25%20plays%20Hawk%22%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.style.tab_header(title%3D%22%25%20of%20time%20agents%20play%20Hawk%20by%20Risk%20Attitude%22)%0A%20%20%20%20%20%20%20%20.fmt_number(%22%25%20plays%20Hawk%22%2C%20decimals%3D1)%0A%20%20%20%20)%0A%20%20%20%20return%20(hawk_by_risk_attitude%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20We%20can%20output%20the%20same%20percentages%20as%20a%20bar%20chart%20or%20a%20heatmap%2C%20for%20comparison.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(alt%2C%20hawk_by_risk_attitude)%3A%0A%20%20%20%20alt.Chart(hawk_by_risk_attitude).mark_bar(width%3D10).encode(%0A%20%20%20%20%20%20%20%20x%3Dalt.X(%22risk_attitude%22%2C%20title%3D%22Risk%20Attitude%22).scale(domain%3D%5B0%2C%209%5D)%2C%0A%20%20%20%20%20%20%20%20y%3Dalt.Y(%22avg_pct_hawk_plays%22%2C%20title%3D%22%25%20time%20plays%20Hawk%22)%2C%0A%20%20%20%20).properties(title%3D%22%25%20of%20time%20agents%20play%20Hawk%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(alt%2C%20hawk_by_risk_attitude)%3A%0A%20%20%20%20alt.Chart(hawk_by_risk_attitude).mark_rule(strokeWidth%3D40).encode(%0A%20%20%20%20%20%20%20%20x%3Dalt.X(%22risk_attitude%22%2C%20title%3D%22Risk%20Attitude%22).scale(domain%3D%5B0%2C%209%5D)%2C%0A%20%20%20%20%20%20%20%20%23%20y%3Dalt.value(0)%2C%0A%20%20%20%20%20%20%20%20%23%20y2%3Dalt.value(15)%2C%0A%20%20%20%20%20%20%20%20color%3Dalt.Color(%22avg_pct_hawk_plays%3AQ%22%2C%20title%3D%22%25%20time%20plays%20Hawk%22)%0A%20%20%20%20%20%20%20%20.scale(scheme%3D%22spectral%22%2C%20domain%3D%5B100.0%2C%200.0%5D)%0A%20%20%20%20%20%20%20%20.legend(orient%3D%22bottom%22%2C%20gradientLength%3D350)%2C%0A%20%20%20%20).properties(title%3D%22Average%20%25%20of%20time%20agents%20play%20Hawk%20by%20Risk-Attitude%22%2C%20width%3D350)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(model_agent_df%2C%20params%2C%20pl)%3A%0A%20%20%20%20%23%20one%20row%20per%20run_id%20%E2%80%94%20mean%20scaled_points%20across%20all%20agents%20in%20that%20run%0A%0A%20%20%20%20%23%20parameters%20to%20test%20correlation%0A%20%20%20%20corr_variables%20%3D%20%5B%22pct_hawk_plays%22%5D%0A%0A%20%20%20%20param_variables%20%3D%20%5B%0A%20%20%20%20%20%20%20%20p%0A%20%20%20%20%20%20%20%20for%20p%20in%20params%5B%22no_adjustment%22%5D.keys()%0A%20%20%20%20%20%20%20%20if%20p%20not%20in%20%5B%22risk_distribution%22%2C%20%22risk_adjustment%22%5D%0A%20%20%20%20%5D%0A%0A%20%20%20%20%23%20risk%20distribution%20is%20categorical%3B%20treat%20to%20one-hot%200%2F1%20for%20each%0A%20%20%20%20_model_agent_riskdist_df%20%3D%20model_agent_df.to_dummies(%22risk_distribution%22)%0A%20%20%20%20%23%20print(_model_agent_riskdist_df.columns)%0A%20%20%20%20param_variables.extend(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20c%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20c%20in%20_model_agent_riskdist_df.columns%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20c.startswith(%22risk_distribution_%22)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20corr_sample_size%20%3D%20100_000%20%20%20%23%20completes%20in%2017.20s%0A%20%20%20%20corr_sample_size%20%3D%201_000_000%20%20%23%20completes%20in%2032.69s%0A%0A%20%20%20%20%23%20group%20by%20risk%20attitude%20and%20parameters%0A%20%20%20%20risk_attitude_percents%20%3D%20(%0A%20%20%20%20%20%20%20%20_model_agent_riskdist_df.sample(corr_sample_size)%0A%20%20%20%20%20%20%20%20.group_by(%22risk_attitude%22%2C%20*param_variables)%0A%20%20%20%20%20%20%20%20.agg(pct_hawk_plays%3Dpl.col.pct_hawk_plays.mean())%0A%20%20%20%20)%0A%0A%20%20%20%20_corr_cols%20%3D%20risk_attitude_percents.columns%0A%0A%20%20%20%20corr_df%20%3D%20(%0A%20%20%20%20%20%20%20%20risk_attitude_percents.corr()%0A%20%20%20%20%20%20%20%20.with_columns(pl.Series(%22var_x%22%2C%20_corr_cols))%0A%20%20%20%20%20%20%20%20.select(%22var_x%22%2C%20*_corr_cols)%0A%20%20%20%20)%0A%20%20%20%20%23%20corr_df%0A%20%20%20%20return%20corr_df%2C%20corr_sample_size%2C%20corr_variables%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(corr_df%2C%20corr_variables%2C%20pl)%3A%0A%20%20%20%20def%20param_group(param_name)%3A%0A%20%20%20%20%20%20%20%20%23%20add%20group%20names%20to%20parameters%20so%20they%20can%20be%20displayed%20in%20logical%20groups%0A%20%20%20%20%20%20%20%20if%20param_name.startswith(%22risk_distribution%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22risk%20distribution%22%0A%20%20%20%20%20%20%20%20if%20param_name.endswith(%22neighborhood%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22neighborhood%20size%22%0A%20%20%20%20%20%20%20%20if%20param_name.startswith(%22adjust_payoff%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22adjust%20payoff%22%0A%20%20%20%20%20%20%20%20return%20%22%22%0A%0A%20%20%20%20%23%20add%20columns%20as%20label%2C%20then%20unpivot%20to%20long%20form%20for%20charting%0A%20%20%20%20corr_matrix_long_df%20%3D%20(%0A%20%20%20%20%20%20%20%20corr_df.unpivot(%0A%20%20%20%20%20%20%20%20%20%20%20%20on%3Dcorr_df.columns%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20index%3D%22var_x%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20variable_name%3D%22var_y%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20value_name%3D%22correlation%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.filter(pl.col.var_y.is_in(corr_variables))%0A%20%20%20%20%20%20%20%20.filter(~pl.col.var_x.is_in(corr_variables))%0A%20%20%20%20%20%20%20%20.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20correlation%3Dpl.col.correlation.cast(pl.Float32)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20correlation_str%3Dpl.col.correlation.map_elements(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambda%20x%3A%20f%22%7Bfloat(x)%3A%2C.2f%7D%22%2C%20return_dtype%3Dpl.String%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20group%3Dpl.col.var_x.map_elements(param_group%2C%20return_dtype%3Dpl.String)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20adjust%20parameter%20names%20for%20readability%20and%20avoid%20redundancy%20with%20group%20names%0A%20%20%20%20%20%20%20%20%20%20%20%20var_x%3Dpl.col(%22var_x%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.str.replace_all(%22_neighborhood%22%2C%20%22%22%2C%20literal%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20.str.replace_all(%22risk_distribution_%22%2C%20%22%22%2C%20literal%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20.str.replace_all(%22adjust_payoff_%22%2C%20%22%22%2C%20literal%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20.str.replace_all(%22_%22%2C%20%22%20%22%2C%20literal%3DTrue)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%20%20%20%20%23%20corr_matrix_long_df%0A%20%20%20%20return%20(corr_matrix_long_df%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20We%20aggregate%20hawk-play%20percentages%20by%20risk%20attitude%20across%20unique%20parameter%20combinations%20to%20check%20for%20correlations%20with%20other%20parameters.%0A%0A%20%20%20%20The%20only%20signal%20is%20a%20strong%20negative%20correlation%20between%20risk-attitude%20and%20%25%20of%20time%20agents%20play%20hawk%2C%20which%20we%20expect%20(higher%20numeric%20risk-attitudes%20are%20increasing%20risk-averse%2C%20so%20they%20play%20hawk%20less%20frequently).%20%20The%20slight%20correlation%20with%20the%20skewed%20risk%20distributions%20are%20a%20reflection%20of%20the%20risk-attitudes%20present%20in%20the%20population.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(alt%2C%20corr_matrix_long_df%2C%20corr_sample_size)%3A%0A%0A%20%20%20%20_heatmap_corr_chart%20%3D%20(%0A%20%20%20%20%20%20%20%20alt.Chart(corr_matrix_long_df)%0A%20%20%20%20%20%20%20%20.mark_rect()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22var_x%3AO%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22var_y%3AO%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axis%3Dalt.Axis(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20orient%3D%22top%22%2C%20%20%23%20move%20axis%20to%20top%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20labelAngle%3D0%2C%20%20%23%20angle%20the%20labels%20(negative%20%3D%20counterclockwise)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20labelExpr%3D%22%7B'pct_hawk_plays'%3A%20'%25%20Hawk%20plays'%7D%5Bdatum.value%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20use%20spectral%20theme%20since%20we%20have%20both%20negative%20and%20positive%20correlations%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dalt.Color(%22correlation%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.scale(scheme%3D%22spectral%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.legend(orient%3D%22bottom%22%2C%20gradientLength%3D250)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20_text_corr_chart%20%3D%20_heatmap_corr_chart.mark_text().encode(%0A%20%20%20%20%20%20%20%20y%3D%22var_x%3AO%22%2C%0A%20%20%20%20%20%20%20%20x%3D%22var_y%3AO%22%2C%0A%20%20%20%20%20%20%20%20text%3D%22correlation_str%22%2C%0A%20%20%20%20%20%20%20%20%23%20for%20contrast%2C%20vary%20the%20color%20based%20on%20the%20intensity%20of%20the%20correlation%2C%20negative%20or%20positive%0A%20%20%20%20%20%20%20%20color%3Dalt.condition(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22abs(datum.correlation)%20%3E%200.3%22%2C%20alt.value(%22white%22)%2C%20alt.value(%22black%22)%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20(_heatmap_corr_chart%20%2B%20_text_corr_chart).properties(width%3D250).facet(%0A%20%20%20%20%20%20%20%20row%3Dalt.Row(%22group%3AN%22%2C%20title%3D%22%22)%2C%0A%20%20%20%20%20%20%20%20title%3Df%22Parameter%20correlation%20with%20%25%20of%20time%20agents%20play%20hawk%20(sample%20of%20%7Bcorr_sample_size%3A%2C%7D%20agents)%22%2C%0A%20%20%20%20).resolve_scale(y%3D%22independent%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
4fc291d7929b60cc3105a6fbdd4e5be5