Buckets:
| import{s as wJ,n as yJ,o as cJ}from"../chunks/scheduler.2b22cead.js";import{S as uJ,i as UJ,e as d,s as n,c as i,h as jJ,a as m,d as t,b as a,f as gs,g as r,j as T,k as TJ,l as c,m as s,n as p,t as M,o as J,p as o}from"../chunks/index.1a0e8013.js";import{C as bJ,H as w,E as gJ}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.6482ae84.js";import{C as y}from"../chunks/CodeBlock.2f28dde2.js";function fJ(Bp){let U,vs,$s,Es,b,Zs,g,Bs,f,Ap=`Autonomous wildfire-control simulation for reinforcement-learning agents, built on the <a href="https://github.com/openenv" rel="nofollow">OpenEnv</a> framework. | |
| Agents must contain spreading fires using <strong>water</strong>, <strong>firebreaks</strong>, and <strong>timing strategies</strong> under changing <strong>wind</strong> and <strong>humidity</strong> conditions.`,As,h,kp='<a href="https://hub.docker.com/" rel="nofollow"><img src="https://img.shields.io/badge/docker-ready-blue" alt="Docker"/></a> <a href="https://www.python.org/" rel="nofollow"><img src="https://img.shields.io/badge/python-3.10+-green" alt="Python"/></a> <a href="https://fastapi.tiangolo.com/" rel="nofollow"><img src="https://img.shields.io/badge/backend-fastapi-teal" alt="FastAPI"/></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-lightgrey" alt="License"/></a>',ks,Gs,Rs,I,Qs,C,Gp='<li><a href="#-why-wildfire-simulation">Why Wildfire Simulation?</a></li> <li><a href="#-quick-start">Quick Start</a></li> <li><a href="#-environment-overview">Environment Overview</a></li> <li><a href="#-grid-format--encoding">Grid Format & Encoding</a></li> <li><a href="#-actions">Actions</a></li> <li><a href="#-observations">Observations</a></li> <li><a href="#-reward-structure">Reward Structure</a></li> <li><a href="#-fire-spread-mechanics">Fire Spread Mechanics</a></li> <li><a href="#-configuration">Configuration</a></li> <li><a href="#-installation--usage">Installation & Usage</a></li> <li><a href="#-api-reference">API Reference</a></li> <li><a href="#-examples">Examples</a></li> <li><a href="#-web-interface">Web Interface</a></li> <li><a href="#-troubleshooting">Troubleshooting</a></li> <li><a href="#-references">References</a></li>',Ns,Vs,Xs,$,Ys,W,Rp=`Wildland fires are intensifying globally due to climate change โ increasing the urgency for <strong>AI-assisted decision-making</strong>. | |
| This environment explores how intelligent systems can <strong>control</strong> fire spread in real time, under limited resources.`,Ss,v,xs,E,Qp="โ Based on real wildfire science inspired by:",_s,Z,Np="<li><strong>Rothermel Surface Fire Spread Model</strong> (USDA Forest Service)</li> <li><strong>MITRE Firelineโs SimFire</strong> โ physics-informed RL fire simulator</li> <li><strong>SimHarness</strong> โ RL evaluation for disaster response</li>",Ls,B,Hs,A,Vp="<thead><tr><th>Research Theme</th> <th>Role in This Environment</th></tr></thead> <tbody><tr><td>Resource-Constrained Planning</td> <td>Finite water + firebreak budgets</td></tr> <tr><td>Fire Spread + Containment Strategy</td> <td>Directional wind & moisture effects</td></tr> <tr><td>Disaster Response RL</td> <td>Safety-focused reward design</td></tr> <tr><td>LLM Agents for Control Tasks</td> <td>Text-based action decision making</td></tr></tbody>",Fs,k,Xp="This makes WildfireEnv a <strong>fast, controllable</strong>, and <strong>open benchmark</strong> for applied RL and LLM reasoning.",zs,Ds,qs,G,Ks,R,Ps,Q,Os,N,Yp="<strong>Note:</strong> The web interface can be enabled with <code>ENABLE_WEB_INTERFACE=true</code>. Access it at <code>http://localhost:8000/web</code> when enabled.",ln,V,en,X,tn,sn,nn,Y,an,S,Sp="This environment models <strong>forest-fire dynamics</strong> influenced by:",rn,x,xp="<li><strong>Wind direction</strong> (8 directions + calm) - accelerates fire spread in wind direction</li> <li><strong>Humidity</strong> (0.0-1.0) - suppresses ignition probability</li> <li><strong>Fuel type and spread rate</strong> - vegetation burns and spreads to neighbors</li> <li><strong>Limited resources</strong> (water units, break materials) - strategic resource management</li> <li><strong>Time pressure</strong> (each step costs small reward penalty)</li>",pn,_,_p="The goal is to <strong>minimize fire spread</strong> and <strong>total burned area</strong> while using resources efficiently.",Mn,L,Jn,H,Lp="An episode ends when:",on,F,Hp="<li><strong>All fires are extinguished</strong> (<code>burning_count == 0</code>) - <strong>Success!</strong></li> <li><strong>Maximum steps reached</strong> (<code>step_count >= max_steps</code>) - Time limit exceeded</li>",dn,mn,Tn,z,wn,D,yn,q,Fp="The grid is returned as a <strong>flat 1D array</strong> in the observation. To access cell at position <code>(x, y)</code>:",cn,K,un,P,zp="<strong>Example:</strong> For a 32ร32 grid, cell at (10, 15):",Un,O,jn,ll,bn,el,Dp="<thead><tr><th>Code</th> <th>Meaning</th> <th>Color (Visualization)</th> <th>Behavior</th></tr></thead> <tbody><tr><td><code>0</code></td> <td>Ash (burned)</td> <td>Black โซ</td> <td>Burned out, cannot reignite</td></tr> <tr><td><code>1</code></td> <td>Fuel</td> <td>Green ๐ฉ</td> <td>Healthy vegetation, can ignite</td></tr> <tr><td><code>2</code></td> <td>Burning</td> <td>Red ๐ฅ</td> <td>Currently on fire, spreads to neighbors</td></tr> <tr><td><code>3</code></td> <td>Firebreak</td> <td>Brown ๐ซ</td> <td>Barrier, fire cannot cross</td></tr> <tr><td><code>4</code></td> <td>Water/Damp</td> <td>Blue ๐ต</td> <td>Dampened, immune to ignition temporarily</td></tr></tbody>",gn,tl,fn,sl,hn,In,Cn,nl,$n,al,Wn,il,vn,rl,qp="<strong>Extinguishes burning cells and dampens fuel to prevent ignition.</strong>",En,pl,Zn,Ml,Kp="<strong>Effects:</strong>",Bn,Jl,Pp="<li><strong>Burning cell (2)</strong>: Extinguishes โ becomes Water/Damp (4), gives <strong>+0.25 reward</strong></li> <li><strong>Fuel cell (1)</strong>: Dampens โ becomes Water/Damp (4), gives <strong>-0.10 reward</strong> (preventive, slight penalty)</li> <li><strong>Water/Damp cell (4)</strong>: Redundant watering, gives <strong>-0.05 reward</strong></li> <li><strong>Ash/Break (0, 3)</strong>: Wasteful, gives <strong>-0.05 reward</strong></li>",An,ol,Op=`<strong>Resource Cost:</strong> 1 water unit per action | |
| <strong>Requires:</strong> <code>remaining_water > 0</code> and valid coordinates`,kn,dl,lM="<strong>Best Use:</strong> Extinguish active fires before they spread",Gn,Rn,Qn,ml,Nn,Tl,eM="<strong>Builds a fire-resistant barrier that stops fire spread.</strong>",Vn,wl,Xn,yl,tM="<strong>Effects:</strong>",Yn,cl,sM="<li><strong>Fuel/Water cell (1, 4)</strong>: Creates firebreak โ becomes Firebreak (3), gives <strong>+0.15 reward</strong></li> <li><strong>Burning cell (2)</strong>: Extinguishes โ becomes Firebreak (3), gives <strong>-0.02 reward</strong> (less effective than water)</li> <li><strong>Firebreak (3)</strong>: Redundant, gives <strong>-0.01 reward</strong></li> <li><strong>Ash (0)</strong>: Wasteful, gives <strong>-0.02 reward</strong></li>",Sn,ul,nM=`<strong>Resource Cost:</strong> 1 firebreak material per action | |
| <strong>Requires:</strong> <code>remaining_breaks > 0</code> and valid coordinates`,xn,Ul,aM="<strong>Best Use:</strong> Create barriers ahead of fire front to contain spread",_n,Ln,Hn,jl,Fn,bl,iM="<strong>Let natural fire dynamics occur (fire spreads).</strong>",zn,gl,Dn,fl,rM="<strong>Effects:</strong>",qn,hl,pM="<li>No resource cost</li> <li>No coordinate required</li> <li>Fire spreads naturally to neighboring cells</li> <li>Small time penalty (-0.01 reward per step)</li>",Kn,Il,MM="<strong>Best Use:</strong> When fire is contained, waiting for it to burn out",Pn,On,la,Cl,ea,$l,JM="Actions that fail (give <strong>-0.05 reward</strong>):",ta,Wl,oM="<li>Invalid coordinates (out of bounds)</li> <li>Using water when <code>remaining_water == 0</code></li> <li>Using break when <code>remaining_breaks == 0</code></li> <li>Missing required coordinates for water/break actions</li>",sa,na,aa,vl,ia,El,ra,Zl,dM="Returned after every <code>reset()</code> or <code>step()</code>:",pa,Bl,Ma,Al,Ja,kl,oa,da,ma,Gl,Ta,Rl,wa,Ql,mM="<thead><tr><th>Action</th> <th>Condition</th> <th>Reward</th></tr></thead> <tbody><tr><td><strong>Water burning cell</strong></td> <td>Extinguishes fire</td> <td><strong>+0.25</strong></td></tr> <tr><td><strong>Water fuel cell</strong></td> <td>Preventive dampening</td> <td><strong>-0.10</strong></td></tr> <tr><td><strong>Create firebreak</strong></td> <td>From fuel/water</td> <td><strong>+0.15</strong></td></tr> <tr><td><strong>Fire spreads</strong></td> <td>Each new burning cell</td> <td><strong>-0.15 per cell</strong></td></tr> <tr><td><strong>Fire shrinks</strong></td> <td>Each extinguished cell</td> <td><strong>+0.10 per cell</strong></td></tr> <tr><td><strong>New burned area</strong></td> <td>Each cell turns to ash</td> <td><strong>-0.05 per cell</strong></td></tr> <tr><td><strong>Time penalty</strong></td> <td>Every step</td> <td><strong>-0.01</strong></td></tr> <tr><td><strong>Invalid action</strong></td> <td>Out of bounds, no resources</td> <td><strong>-0.05</strong></td></tr> <tr><td><strong>Redundant action</strong></td> <td>Watering already damp cell</td> <td><strong>-0.05</strong></td></tr></tbody>",ya,Nl,ca,Vl,TM="When episode terminates (<code>done == True</code>):",ua,Xl,wM="<li><p><strong>Fire contained</strong> (<code>burning_count == 0</code>):</p> <ul><li><strong>+0.5</strong> base bonus</li> <li><strong>+0.5 ร saved_ratio</strong> bonus (proportion of cells not burned)</li></ul></li> <li><p><strong>Fallback reward</strong>:</p> <ul><li><strong>+0.2 ร (1.0 - burned_ratio)</strong> bonus</li></ul></li>",Ua,Yl,yM="<strong>Example:</strong> Perfect containment (no burned cells):",ja,Sl,ba,xl,ga,_l,cM="<li><strong>Positive rewards</strong>: Good containment actions, extinguishing fires</li> <li><strong>Negative rewards</strong>: Fire spread, resource waste, time penalty</li> <li><strong>Goal</strong>: Maximize cumulative reward = minimize fire damage</li>",fa,ha,Ia,Ll,Ca,Hl,$a,Fl,uM="Fire spreads using an <strong>8-directional neighbor model</strong>:",Wa,zl,UM=`<li><p><strong>Burning cells persist</strong> for <code>burn_lifetime = 3</code> ticks before turning to ash</p></li> <li><p>Each burning cell can ignite <strong>neighboring fuel cells</strong> (8 directions)</p></li> <li><p>Spread probability depends on:</p> <ul><li><strong>Base ignition probability</strong>: <code>0.30</code> (30% chance)</li> <li><strong>Humidity factor</strong>: <code>(1.0 - humidity)</code> - higher humidity = less spread</li> <li><strong>Wind multiplier</strong>: | |
| <ul><li><strong>+2.0x</strong> in wind direction</li> <li><strong>+0.5x</strong> against wind</li> <li><strong>+1.0x</strong> perpendicular</li></ul></li> <li><strong>Diagonal factor</strong>: <code>0.6x</code> for diagonal neighbors (slower spread)</li></ul></li> <li><p><strong>Water/Damp cells (4)</strong> are <strong>immune</strong> to ignition while damp</p></li> <li><p><strong>Firebreaks (3)</strong> <strong>cannot</strong> be crossed by fire</p></li> <li><p><strong>Ash cells (0)</strong> cannot reignite</p></li>`,va,Dl,Ea,ql,jM="<thead><tr><th>Wind Direction</th> <th>Effect on Fire Spread</th></tr></thead> <tbody><tr><td><strong>In wind direction</strong></td> <td>2ร faster ignition probability</td></tr> <tr><td><strong>Against wind</strong></td> <td>0.5ร slower ignition probability</td></tr> <tr><td><strong>Perpendicular</strong></td> <td>Normal (1ร) ignition probability</td></tr> <tr><td><strong>CALM</strong></td> <td>No directional bias</td></tr></tbody>",Za,Kl,Ba,Pl,bM="Watered cells (4) remain damp for <strong>6 ticks</strong> before reverting to fuel (1).",Aa,Ol,ka,le,Ga,Ra,Qa,ee,Na,te,Va,se,gM="Set these <strong>before starting the server</strong>:",Xa,ne,fM="<thead><tr><th>Variable</th> <th>Description</th> <th>Default</th> <th>Range</th></tr></thead> <tbody><tr><td><code>WILDFIRE_WIDTH</code></td> <td>Grid width in cells</td> <td><code>32</code></td> <td>8-128</td></tr> <tr><td><code>WILDFIRE_HEIGHT</code></td> <td>Grid height in cells</td> <td><code>32</code></td> <td>8-128</td></tr> <tr><td><code>WILDFIRE_HUMIDITY</code></td> <td>Initial humidity level</td> <td><code>0.25</code></td> <td>0.0-1.0</td></tr> <tr><td><code>WILDFIRE_WIND</code></td> <td>Wind direction (fixed)</td> <td>Random</td> <td><code>N</code>, <code>NE</code>, <code>E</code>, <code>SE</code>, <code>S</code>, <code>SW</code>, <code>W</code>, <code>NW</code>, <code>CALM</code></td></tr> <tr><td><code>WILDFIRE_SEED</code></td> <td>Random seed</td> <td><code>3407</code></td> <td>Any integer</td></tr> <tr><td><code>WILDFIRE_MAX_STEPS</code></td> <td>Max steps per episode</td> <td><code>128</code></td> <td>10-1000</td></tr> <tr><td><code>WILDFIRE_WATER_CAPACITY</code></td> <td>Initial water units</td> <td><code>8</code></td> <td>1-100</td></tr> <tr><td><code>WILDFIRE_BREAK_CAPACITY</code></td> <td>Initial firebreak materials</td> <td><code>50</code></td> <td>1-200</td></tr></tbody>",Ya,ae,Sa,ie,xa,re,_a,pe,La,Me,Ha,Je,Fa,za,Da,oe,qa,de,Ka,me,hM="<strong>Manual setup:</strong>",Pa,Te,Oa,we,IM="This approach:",li,ye,CM="<li>Builds the base image if needed</li> <li>Rebuilds the wildfire image</li> <li>Starts the container</li> <li>Shows logs in real-time</li>",ei,ce,$M="<strong>Alternative: Using build_docker.sh script:</strong>",ti,ue,si,Ue,ni,je,WM="<strong>Requirements:</strong>",ai,be,ii,ge,vM="<strong>Run server:</strong>",ri,fe,pi,he,EM="<strong>Or with environment variables:</strong>",Mi,Ie,Ji,oi,di,Ce,mi,$e,Ti,We,wi,ve,yi,Ee,ci,Ze,ZM="Resets the environment to initial state.",ui,Be,Ui,Ae,ji,ke,BM="Takes an action and returns new observation.",bi,Ge,gi,Re,fi,Qe,AM="Access current environment state.",hi,Ne,Ii,Ve,Ci,Xe,kM="Closes the connection (for HTTP clients, this is a no-op but good practice).",$i,Ye,Wi,Se,vi,xe,Ei,_e,Zi,Le,GM="<strong>Examples:</strong>",Bi,He,Ai,Fe,ki,ze,RM='See <a href="#-observations">Observations</a> section for full details.',Gi,De,Ri,qe,Qi,Ni,Vi,Ke,Xi,Pe,Yi,Oe,Si,lt,xi,et,_i,tt,Li,st,Hi,nt,Fi,at,zi,Di,qi,it,Ki,rt,QM="The Wildfire Environment includes a <strong>custom web interface</strong> with visual grid display and wildfire-specific features.",Pi,pt,Oi,Mt,lr,Jt,er,ot,NM="Then open: <code>http://localhost:8000/web</code>",tr,dt,sr,mt,nr,Tt,ar,wt,ir,yt,VM="<li><strong>Wildfire-specific action form</strong> <ul><li>Action dropdown: Water (Extinguish Fire), Break (Create Firebreak), Wait (Do Nothing)</li> <li>Coordinate inputs (X, Y) - auto-populated when clicking grid cells</li> <li>Coordinates show/hide based on action type</li></ul></li> <li><strong>Environment stats display</strong> <ul><li>Step count</li> <li>Water remaining</li> <li>Breaks remaining</li> <li>Burning cells count</li></ul></li> <li><strong>Current state display</strong> <ul><li>Status (Reset/Running)</li> <li>Episode ID</li> <li>Wind direction</li> <li>Humidity</li></ul></li> <li><strong>Control buttons</strong> <ul><li>Reset Environment</li> <li>Get State</li></ul></li>",rr,ct,pr,ut,XM=`<li><strong>Visual 2D Grid Display</strong> ๐ฅ | |
| <ul><li>16ร16 grid rendered as color-coded cells</li> <li><strong>Color coding:</strong> <ul><li>๐ฉ <strong>Green</strong> = Fuel (safe, value 1)</li> <li>๐ฅ <strong>Orange/Red</strong> = Burning (fire, value 2)</li> <li>โฌ <strong>Dark Gray</strong> = Ash (burned, value 0)</li> <li>๐ซ <strong>Brown</strong> = Firebreak (value 3)</li> <li>๐ฆ <strong>Blue</strong> = Watered/Damp (value 4)</li></ul></li> <li><strong>Interactive:</strong> Click cells to set coordinates for water/break actions</li> <li><strong>Auto-updates:</strong> Grid refreshes automatically via WebSocket</li></ul></li> <li><strong>Legend</strong> <ul><li>Color-coded legend explaining all cell types</li></ul></li> <li><strong>Action history</strong> <ul><li>Log of all actions with timestamps</li> <li>Shows action, observation, reward, and done status</li></ul></li>`,Mr,Ut,Jr,jt,YM="<li><strong>WebSocket connection</strong> - Real-time state updates without page refresh</li> <li><strong>Instructions panel</strong> - Collapsible environment documentation</li> <li><strong>Grid status indicator</strong> - Shows grid dimensions and cell count</li>",or,bt,dr,gt,SM="<li><strong>Start the server</strong> (see above)</li> <li><strong>Open browser</strong> to: <code>http://localhost:8000/web</code></li> <li><strong>Click โReset Environmentโ</strong> to initialize and display the grid</li> <li><strong>Interact with the grid:</strong> <ul><li>Click on a cell to set coordinates for water/break actions</li> <li>Or manually enter X, Y coordinates</li></ul></li> <li><strong>Select action:</strong> <ul><li>Choose <code>water</code>, <code>break</code>, or <code>wait</code> from the dropdown</li></ul></li> <li><strong>Click โExecute Actionโ</strong></li> <li><strong>Watch the grid update in real-time:</strong> <ul><li>Fire spreads automatically</li> <li>Cells change color based on state</li> <li>Stats update automatically</li></ul></li> <li><strong>Monitor resources</strong> in the stats panel (water, breaks, burning count)</li>",mr,Tr,wr,ft,yr,ht,cr,It,ur,Ct,xM="<strong>Problem:</strong> <code>ConnectionRefusedError</code> or <code>Cannot connect to server</code>",Ur,$t,_M="<strong>Solutions:</strong>",jr,Wt,LM="<li>Verify server is running: <code>curl http://localhost:8000/health</code></li> <li>Check Docker container: <code>docker ps | grep wildfire</code></li> <li>Ensure port 8000 is not in use: <code>lsof -i :8000</code></li>",br,vt,gr,Et,HM="<strong>Problem:</strong> <code>IndexError: list index out of range</code>",fr,Zt,FM="<strong>Solution:</strong> Ensure coordinates are within bounds:",hr,Bt,Ir,At,Cr,kt,zM="<strong>Problem:</strong> Actions returning -0.05 reward repeatedly",$r,Gt,DM="<strong>Solutions:</strong>",Wr,Rt,qM="<li>Check <code>remaining_water</code> and <code>remaining_breaks</code> before using resources</li> <li>Verify coordinates are integers and within grid bounds</li> <li>Use <code>action="wait"</code> when resources are exhausted</li>",vr,Qt,Er,Nt,KM="<strong>Problem:</strong> How to access grid cells?",Zr,Vt,PM="<strong>Solution:</strong>",Br,Xt,Ar,Yt,kr,St,OM="<strong>Problem:</strong> <code>failed to solve: openenv-base:latest</code>",Gr,xt,lJ="<strong>Solution:</strong>",Rr,_t,Qr,Lt,Nr,u,Ht,fs,eJ="<strong>Enable verbose logging:</strong>",Ip,Ft,Cp,zt,hs,tJ="<strong>Check environment state:</strong>",$p,Dt,Wp,qt,Is,sJ="<strong>Validate actions:</strong>",vp,Kt,Ep,Pt,Cs,nJ="<strong>Monitor grid changes:</strong>",Zp,Ot,Vr,Xr,Yr,ls,Sr,es,xr,ts,aJ="<li><strong>Small grids (16ร16)</strong>: Fast, good for quick testing</li> <li><strong>Medium grids (32ร32)</strong>: Default, balanced performance</li> <li><strong>Large grids (64ร64+)</strong>: Slower, more realistic but requires more compute</li>",_r,ss,Lr,ns,iJ="<li><strong>Low water (4-8)</strong>: Forces strategic decisions</li> <li><strong>High water (20+)</strong>: More forgiving, easier to succeed</li> <li><strong>Low breaks (25)</strong>: Emphasizes firebreak placement strategy</li> <li><strong>High breaks (100+)</strong>: More freedom, less constraint</li>",Hr,as,Fr,is,rJ="<li><strong>Short episodes (50 steps)</strong>: Fast iteration, good for debugging</li> <li><strong>Medium episodes (128 steps)</strong>: Default, balanced</li> <li><strong>Long episodes (200+ steps)</strong>: Better for complex strategies</li>",zr,Dr,qr,rs,Kr,ps,Pr,Ms,pJ='<li><strong>Rothermel Model</strong>: <a href="https://www.fs.fed.us/rm/pubs_series/rmrs/gtr/rmrs_gtr371.pdf" rel="nofollow">USDA Forest Service - Surface Fire Spread Model</a></li> <li><strong>SimFire</strong>: <a href="https://github.com/mitrefireline/simfire" rel="nofollow">MITRE Fireline Project</a></li> <li><strong>RL for Wildfires</strong>: <a href="https://arxiv.org/abs/2311.15925" rel="nofollow">arXiv:2311.15925</a></li>',Or,Js,lp,os,MJ='<li><strong>Main Repository</strong>: <a href="https://github.com/openenv" rel="nofollow">OpenEnv GitHub</a></li> <li><strong>Documentation</strong>: See <code>rfcs/</code> directory for design documents</li> <li><strong>Other Environments</strong>: See <code>src/envs/</code> for more environment examples</li>',ep,ds,tp,ms,JJ='<li><strong>FastAPI</strong>: <a href="https://fastapi.tiangolo.com/" rel="nofollow">FastAPI Documentation</a></li> <li><strong>Reinforcement Learning</strong>: <a href="https://spinningup.openai.com/" rel="nofollow">Spinning Up in Deep RL</a></li> <li><strong>Docker</strong>: <a href="https://docs.docker.com/" rel="nofollow">Docker Documentation</a></li>',sp,np,ap,Ts,ip,ws,oJ="This environment is part of the OpenEnv project. See the main LICENSE file for details.",rp,pp,Mp,ys,Jp,cs,dJ="Contributions welcome! Please see <code>CONTRIBUTING.md</code> in the main OpenEnv repository.",op,dp,mp,us,Tp,Us,wp,yp,cp,js,mJ="<strong>Happy firefighting! ๐ฅ๐</strong>",up,bs,Up,Ws,jp;return b=new bJ({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),g=new w({props:{title:"๐ฒ Wildfire Environment",local:"-wildfire-environment",headingTag:"h1"}}),I=new w({props:{title:"๐ Table of Contents",local:"-table-of-contents",headingTag:"h2"}}),$=new w({props:{title:"๐ฅ Why Wildfire Simulation?",local:"-why-wildfire-simulation",headingTag:"h2"}}),v=new w({props:{title:"Research Motivation",local:"research-motivation",headingTag:"h3"}}),B=new w({props:{title:"Application Goals",local:"application-goals",headingTag:"h3"}}),G=new w({props:{title:"๐ Quick Start",local:"-quick-start",headingTag:"h2"}}),R=new w({props:{title:"Using Docker (Recommended)",local:"using-docker-recommended",headingTag:"h3"}}),Q=new y({props:{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjAoZmlyc3QlMjB0aW1lJTIwb25seSklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbmVudi1iYXNlJTNBbGF0ZXN0JTIwLWYlMjBzcmMlMkZvcGVuZW52JTJGY29yZSUyRmNvbnRhaW5lcnMlMkZpbWFnZXMlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMEJ1aWxkJTIwd2lsZGZpcmUlMjBlbnZpcm9ubWVudCUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjB3aWxkZmlyZS1lbnYlM0FsYXRlc3QlMjAtZiUyMGVudnMlMkZ3aWxkZmlyZV9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMFJ1biUyMGNvbnRhaW5lciUwQWRvY2tlciUyMHJ1biUyMC1wJTIwODAwMCUzQTgwMDAlMjAtZSUyMEVOQUJMRV9XRUJfSU5URVJGQUNFJTNEdHJ1ZSUyMHdpbGRmaXJlLWVudiUzQWxhdGVzdA==",highlighted:`<span class="hljs-comment"># Build base image (first time only)</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Build wildfire environment</span> | |
| docker build -t wildfire-env:latest -f envs/wildfire_env/server/Dockerfile . | |
| <span class="hljs-comment"># Run container</span> | |
| docker run -p 8000:8000 -e ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> wildfire-env:latest`,lang:"bash",wrap:!1}}),V=new w({props:{title:"Basic Python Client",local:"basic-python-client",headingTag:"h3"}}),X=new y({props:{code:"ZnJvbSUyMGVudnMud2lsZGZpcmVfZW52JTIwaW1wb3J0JTIwV2lsZGZpcmVFbnYlMkMlMjBXaWxkZmlyZUFjdGlvbiUwQSUwQSUyMyUyMENvbm5lY3QlMjB0byUyMHJ1bm5pbmclMjBzZXJ2ZXIlMEFlbnYlMjAlM0QlMjBXaWxkZmlyZUVudihiYXNlX3VybCUzRCUyMmh0dHAlM0ElMkYlMkZsb2NhbGhvc3QlM0E4MDAwJTIyKSUwQSUwQSUyMyUyMFJlc2V0JTIwZW52aXJvbm1lbnQlMEFyZXN1bHQlMjAlM0QlMjBlbnYucmVzZXQoKSUwQW9icyUyMCUzRCUyMHJlc3VsdC5vYnNlcnZhdGlvbiUwQXByaW50KGYlMjJHcmlkJTNBJTIwJTdCb2JzLndpZHRoJTdEeCU3Qm9icy5oZWlnaHQlN0QlMkMlMjBGaXJlcyUzQSUyMCU3Qm9icy5idXJuaW5nX2NvdW50JTdEJTJDJTIwV2F0ZXIlM0ElMjAlN0JvYnMucmVtYWluaW5nX3dhdGVyJTdEJTIyKSUwQSUwQSUyMyUyMFRha2UlMjBhY3Rpb24lMjAod2F0ZXIlMjBhJTIwYnVybmluZyUyMGNlbGwpJTBBcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMjB4JTNEMTAlMkMlMjB5JTNEMTUpKSUwQXByaW50KGYlMjJSZXdhcmQlM0ElMjAlN0JyZXN1bHQucmV3YXJkJTNBLjJmJTdEJTJDJTIwQnVybmluZyUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5idXJuaW5nX2NvdW50JTdEJTIyKSUwQSUwQSUyMyUyMENyZWF0ZSUyMGZpcmVicmVhayUwQXJlc3VsdCUyMCUzRCUyMGVudi5zdGVwKFdpbGRmaXJlQWN0aW9uKGFjdGlvbiUzRCUyMmJyZWFrJTIyJTJDJTIweCUzRDEyJTJDJTIweSUzRDE1KSklMEElMEElMjMlMjBXYWl0JTIwKGZpcmUlMjBzcHJlYWRzKSUwQXJlc3VsdCUyMCUzRCUyMGVudi5zdGVwKFdpbGRmaXJlQWN0aW9uKGFjdGlvbiUzRCUyMndhaXQlMjIpKSUwQSUwQWVudi5jbG9zZSgp",highlighted:`<span class="hljs-keyword">from</span> envs.wildfire_env <span class="hljs-keyword">import</span> WildfireEnv, WildfireAction | |
| <span class="hljs-comment"># Connect to running server</span> | |
| env = WildfireEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| <span class="hljs-comment"># Reset environment</span> | |
| result = env.reset() | |
| obs = result.observation | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Grid: <span class="hljs-subst">{obs.width}</span>x<span class="hljs-subst">{obs.height}</span>, Fires: <span class="hljs-subst">{obs.burning_count}</span>, Water: <span class="hljs-subst">{obs.remaining_water}</span>"</span>) | |
| <span class="hljs-comment"># Take action (water a burning cell)</span> | |
| result = env.step(WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-number">10</span>, y=<span class="hljs-number">15</span>)) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Reward: <span class="hljs-subst">{result.reward:<span class="hljs-number">.2</span>f}</span>, Burning: <span class="hljs-subst">{result.observation.burning_count}</span>"</span>) | |
| <span class="hljs-comment"># Create firebreak</span> | |
| result = env.step(WildfireAction(action=<span class="hljs-string">"break"</span>, x=<span class="hljs-number">12</span>, y=<span class="hljs-number">15</span>)) | |
| <span class="hljs-comment"># Wait (fire spreads)</span> | |
| result = env.step(WildfireAction(action=<span class="hljs-string">"wait"</span>)) | |
| env.close()`,lang:"python",wrap:!1}}),Y=new w({props:{title:"๐ฅ Environment Overview",local:"-environment-overview",headingTag:"h2"}}),L=new w({props:{title:"Episode Termination",local:"episode-termination",headingTag:"h3"}}),z=new w({props:{title:"๐งฑ Grid Format & Encoding",local:"-grid-format--encoding",headingTag:"h2"}}),D=new w({props:{title:"Grid Structure",local:"grid-structure",headingTag:"h3"}}),K=new y({props:{code:"aW5kZXglMjAlM0QlMjB5JTIwKiUyMHdpZHRoJTIwJTJCJTIweCUwQWNlbGxfdmFsdWUlMjAlM0QlMjBvYnNlcnZhdGlvbi5ncmlkJTVCaW5kZXglNUQ=",highlighted:`index = y * width + x | |
| cell_value = observation.grid[index]`,lang:"python",wrap:!1}}),O=new y({props:{code:"aW5kZXglMjAlM0QlMjAxNSUyMColMjAzMiUyMCUyQiUyMDEwJTIwJTIwJTIzJTIwJTNEJTIwNDkwJTBBY2VsbF92YWx1ZSUyMCUzRCUyMG9ic2VydmF0aW9uLmdyaWQlNUI0OTAlNUQ=",highlighted:`index = <span class="hljs-number">15</span> * <span class="hljs-number">32</span> + <span class="hljs-number">10</span> <span class="hljs-comment"># = 490</span> | |
| cell_value = observation.grid[<span class="hljs-number">490</span>]`,lang:"python",wrap:!1}}),ll=new w({props:{title:"Cell Encoding",local:"cell-encoding",headingTag:"h3"}}),tl=new w({props:{title:"Grid Visualization Example",local:"grid-visualization-example",headingTag:"h3"}}),sl=new y({props:{code:"aW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBb2JzJTIwJTNEJTIwZW52LnJlc2V0KCkub2JzZXJ2YXRpb24lMEFncmlkXzJkJTIwJTNEJTIwbnAuYXJyYXkob2JzLmdyaWQpLnJlc2hhcGUob2JzLmhlaWdodCUyQyUyMG9icy53aWR0aCklMEElMEElMjMlMjBOb3clMjBncmlkXzJkJTVCeSU1RCU1QnglNUQlMjBnaXZlcyUyMHRoZSUyMGNlbGwlMjB2YWx1ZSUyMGF0JTIwcG9zaXRpb24lMjAoeCUyQyUyMHkpJTBBcHJpbnQoZ3JpZF8yZCU1QjE1JTVEJTVCMTAlNUQpJTIwJTIwJTIzJTIwQ2VsbCUyMGF0JTIweCUzRDEwJTJDJTIweSUzRDE1",highlighted:`<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| obs = env.reset().observation | |
| grid_2d = np.array(obs.grid).reshape(obs.height, obs.width) | |
| <span class="hljs-comment"># Now grid_2d[y][x] gives the cell value at position (x, y)</span> | |
| <span class="hljs-built_in">print</span>(grid_2d[<span class="hljs-number">15</span>][<span class="hljs-number">10</span>]) <span class="hljs-comment"># Cell at x=10, y=15</span>`,lang:"python",wrap:!1}}),nl=new w({props:{title:"๐ฎ Actions",local:"-actions",headingTag:"h2"}}),al=new w({props:{title:"Action Types",local:"action-types",headingTag:"h3"}}),il=new w({props:{title:"1. water - Apply Water",local:"1-water---apply-water",headingTag:"h4"}}),pl=new y({props:{code:"V2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMjB4JTNEMTAlMkMlMjB5JTNEMTUp",highlighted:'WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-number">10</span>, y=<span class="hljs-number">15</span>)',lang:"python",wrap:!1}}),ml=new w({props:{title:"2. break - Create Firebreak",local:"2-break---create-firebreak",headingTag:"h4"}}),wl=new y({props:{code:"V2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyYnJlYWslMjIlMkMlMjB4JTNEMTIlMkMlMjB5JTNEMTUp",highlighted:'WildfireAction(action=<span class="hljs-string">"break"</span>, x=<span class="hljs-number">12</span>, y=<span class="hljs-number">15</span>)',lang:"python",wrap:!1}}),jl=new w({props:{title:"3. wait - Do Nothing",local:"3-wait---do-nothing",headingTag:"h4"}}),gl=new y({props:{code:"V2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2FpdCUyMik=",highlighted:'WildfireAction(action=<span class="hljs-string">"wait"</span>)',lang:"python",wrap:!1}}),Cl=new w({props:{title:"Invalid Actions",local:"invalid-actions",headingTag:"h3"}}),vl=new w({props:{title:"๐๏ธ Observations",local:"-observations",headingTag:"h2"}}),El=new w({props:{title:"WildfireObservation",local:"wildfireobservation",headingTag:"h3"}}),Bl=new y({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBXaWxkZmlyZU9ic2VydmF0aW9uKE9ic2VydmF0aW9uKSUzQSUwQSUyMCUyMCUyMCUyMGdyaWQlM0ElMjBMaXN0JTVCaW50JTVEJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwRmxhdCUyMGFycmF5JTNBJTIwJTVCMSUyQzElMkMyJTJDMSUyQy4uLiU1RCUyMGxlbmd0aCUyMCUzRCUyMHdpZHRoJTIwJUMzJTk3JTIwaGVpZ2h0JTBBJTIwJTIwJTIwJTIwd2lkdGglM0ElMjBpbnQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBHcmlkJTIwd2lkdGglMjAoZGVmYXVsdCUzQSUyMDMyKSUwQSUyMCUyMCUyMCUyMGhlaWdodCUzQSUyMGludCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdyaWQlMjBoZWlnaHQlMjAoZGVmYXVsdCUzQSUyMDMyKSUwQSUyMCUyMCUyMCUyMHN0ZXAlM0ElMjBpbnQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBDdXJyZW50JTIwc3RlcCUyMG51bWJlciUyMCgwJTIwYXQlMjByZXNldCklMEElMjAlMjAlMjAlMjB3aW5kX2RpciUzQSUyMHN0ciUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMCUyMk4lMjIlMkMlMjAlMjJORSUyMiUyQyUyMCUyMkUlMjIlMkMlMjAlMjJTRSUyMiUyQyUyMCUyMlMlMjIlMkMlMjAlMjJTVyUyMiUyQyUyMCUyMlclMjIlMkMlMjAlMjJOVyUyMiUyQyUyMCUyMkNBTE0lMjIlMEElMjAlMjAlMjAlMjBodW1pZGl0eSUzQSUyMGZsb2F0JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJTVCMC4wJTJDJTIwMS4wJTVEJTIwLSUyMGhpZ2hlciUyMCUzRCUyMGxlc3MlMjBmaXJlJTIwc3ByZWFkJTBBJTIwJTIwJTIwJTIwYnVybmluZ19jb3VudCUzQSUyMGludCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME51bWJlciUyMG9mJTIwY2VsbHMlMjBjdXJyZW50bHklMjBvbiUyMGZpcmUlMEElMjAlMjAlMjAlMjBidXJuZWRfY291bnQlM0ElMjBpbnQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBUb3RhbCUyMG51bWJlciUyMG9mJTIwYXNoJTIwY2VsbHMlMjAoY3VtdWxhdGl2ZSklMEElMjAlMjAlMjAlMjByZW1haW5pbmdfd2F0ZXIlM0ElMjBpbnQlMjAlMjAlMjAlMjAlMjAlMjMlMjBXYXRlciUyMHVuaXRzJTIwbGVmdCUwQSUyMCUyMCUyMCUyMHJlbWFpbmluZ19icmVha3MlM0ElMjBpbnQlMjAlMjAlMjAlMjAlMjMlMjBGaXJlYnJlYWslMjBtYXRlcmlhbHMlMjBsZWZ0JTBBJTIwJTIwJTIwJTIwcmV3YXJkX2hpbnQlM0ElMjBmbG9hdCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNoYXBpbmclMjByZXdhcmQlMjAoZm9yJTIwZGVidWdnaW5nKSUwQSUyMCUyMCUyMCUyMGRvbmUlM0ElMjBib29sJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwRXBpc29kZSUyMGVuZGVkJTNGJTBBJTIwJTIwJTIwJTIwcmV3YXJkJTNBJTIwZmxvYXQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTdGVwJTIwcmV3YXJk",highlighted:`<span class="hljs-meta">@dataclass</span> | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">WildfireObservation</span>(<span class="hljs-title class_ inherited__">Observation</span>): | |
| grid: <span class="hljs-type">List</span>[<span class="hljs-built_in">int</span>] <span class="hljs-comment"># Flat array: [1,1,2,1,...] length = width ร height</span> | |
| width: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Grid width (default: 32)</span> | |
| height: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Grid height (default: 32)</span> | |
| step: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Current step number (0 at reset)</span> | |
| wind_dir: <span class="hljs-built_in">str</span> <span class="hljs-comment"># "N", "NE", "E", "SE", "S", "SW", "W", "NW", "CALM"</span> | |
| humidity: <span class="hljs-built_in">float</span> <span class="hljs-comment"># [0.0, 1.0] - higher = less fire spread</span> | |
| burning_count: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Number of cells currently on fire</span> | |
| burned_count: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Total number of ash cells (cumulative)</span> | |
| remaining_water: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Water units left</span> | |
| remaining_breaks: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Firebreak materials left</span> | |
| reward_hint: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Shaping reward (for debugging)</span> | |
| done: <span class="hljs-built_in">bool</span> <span class="hljs-comment"># Episode ended?</span> | |
| reward: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Step reward</span>`,lang:"python",wrap:!1}}),Al=new w({props:{title:"Example Observation",local:"example-observation",headingTag:"h3"}}),kl=new y({props:{code:"cmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMEFwcmludChmJTIyU3RlcCUzQSUyMCU3Qm9icy5zdGVwJTdEJTIyKSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMDAlMEFwcmludChmJTIyR3JpZCUyMHNpemUlM0ElMjAlN0JvYnMud2lkdGglN0R4JTdCb2JzLmhlaWdodCU3RCUyMiklMjAlMjMlMjAzMngzMiUwQXByaW50KGYlMjJHcmlkJTIwY2VsbHMlM0ElMjAlN0JsZW4ob2JzLmdyaWQpJTdEJTIyKSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMDEwMjQlMEFwcmludChmJTIyQWN0aXZlJTIwZmlyZXMlM0ElMjAlN0JvYnMuYnVybmluZ19jb3VudCU3RCUyMiklMjAlMjAlMjAlMjMlMjAyJTBBcHJpbnQoZiUyMldpbmQlM0ElMjAlN0JvYnMud2luZF9kaXIlN0QlMjIpJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJTIyTkUlMjIlMEFwcmludChmJTIySHVtaWRpdHklM0ElMjAlN0JvYnMuaHVtaWRpdHklM0EuMmYlN0QlMjIpJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwMC4yNCUwQXByaW50KGYlMjJXYXRlciUyMGxlZnQlM0ElMjAlN0JvYnMucmVtYWluaW5nX3dhdGVyJTdEJTIyKSUyMCUyMCUyMCUyMyUyMDglMEFwcmludChmJTIyQnJlYWtzJTIwbGVmdCUzQSUyMCU3Qm9icy5yZW1haW5pbmdfYnJlYWtzJTdEJTIyKSUyMCUyMyUyMDUw",highlighted:`result = env.reset() | |
| obs = result.observation | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Step: <span class="hljs-subst">{obs.step}</span>"</span>) <span class="hljs-comment"># 0</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Grid size: <span class="hljs-subst">{obs.width}</span>x<span class="hljs-subst">{obs.height}</span>"</span>) <span class="hljs-comment"># 32x32</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Grid cells: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(obs.grid)}</span>"</span>) <span class="hljs-comment"># 1024</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Active fires: <span class="hljs-subst">{obs.burning_count}</span>"</span>) <span class="hljs-comment"># 2</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Wind: <span class="hljs-subst">{obs.wind_dir}</span>"</span>) <span class="hljs-comment"># "NE"</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Humidity: <span class="hljs-subst">{obs.humidity:<span class="hljs-number">.2</span>f}</span>"</span>) <span class="hljs-comment"># 0.24</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Water left: <span class="hljs-subst">{obs.remaining_water}</span>"</span>) <span class="hljs-comment"># 8</span> | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Breaks left: <span class="hljs-subst">{obs.remaining_breaks}</span>"</span>) <span class="hljs-comment"># 50</span>`,lang:"python",wrap:!1}}),Gl=new w({props:{title:"๐ฐ Reward Structure",local:"-reward-structure",headingTag:"h2"}}),Rl=new w({props:{title:"Step Rewards",local:"step-rewards",headingTag:"h3"}}),Nl=new w({props:{title:"Episode End Bonuses",local:"episode-end-bonuses",headingTag:"h3"}}),Sl=new y({props:{code:"UmV3YXJkJTIwJTNEJTIwJTJCMC41JTIwJTJCJTIwMC41JTIwJUMzJTk3JTIwMS4wJTIwJTNEJTIwJTJCMS4w",highlighted:"Reward = +0.5 + 0.5 ร 1.0 = +1.0",lang:"text",wrap:!1}}),xl=new w({props:{title:"Reward Interpretation",local:"reward-interpretation",headingTag:"h3"}}),Ll=new w({props:{title:"๐ช๏ธ Fire Spread Mechanics",local:"-fire-spread-mechanics",headingTag:"h2"}}),Hl=new w({props:{title:"Spread Model",local:"spread-model",headingTag:"h3"}}),Dl=new w({props:{title:"Wind Effects",local:"wind-effects",headingTag:"h3"}}),Kl=new w({props:{title:"Water Dampening Duration",local:"water-dampening-duration",headingTag:"h3"}}),Ol=new w({props:{title:"Example Fire Spread",local:"example-fire-spread",headingTag:"h3"}}),le=new y({props:{code:"U3RlcCUyMDAlM0ElMjAlMjAlMjAlMjAlMjBTdGVwJTIwMSUzQSUyMCUyMCUyMCUyMCUyMFN0ZXAlMjAyJTNBJTBBJUYwJTlGJTlGJUE5JUYwJTlGJTlGJUE5JUYwJTlGJTlGJUE5JTIwJTIwJTIwJTIwJTIwJTIwJUYwJTlGJTlGJUE5JUYwJTlGJTlGJUE1JUYwJTlGJTlGJUE5JTIwJTIwJTIwJTIwJTIwJTIwJUYwJTlGJTlGJUFCJUYwJTlGJTlGJUE1JUYwJTlGJTlGJUFCJTBBJUYwJTlGJTlGJUE5JUYwJTlGJTlGJUE1JUYwJTlGJTlGJUE5JTIwJTIwJUUyJTg2JTkyJTIwJTIwJTIwJUYwJTlGJTlGJUE1JUYwJTlGJTlGJUE1JUYwJTlGJTlGJUE1JTIwJTIwJUUyJTg2JTkyJTIwJTIwJTIwJUYwJTlGJTlGJUE1JUYwJTlGJTlGJUE1JUYwJTlGJTlGJUE1JTIwJTIwKFdpbmQlM0ElMjBFJTJDJTIwc3ByZWFkaW5nJTIwZWFzdCklMEElRjAlOUYlOUYlQTklRjAlOUYlOUYlQTklRjAlOUYlOUYlQTklMjAlMjAlMjAlMjAlMjAlMjAlRjAlOUYlOUYlQTklRjAlOUYlOUYlQTUlRjAlOUYlOUYlQTklMjAlMjAlMjAlMjAlMjAlMjAlRjAlOUYlOUYlQUIlRjAlOUYlOUYlQTUlRjAlOUYlOUYlQUI=",highlighted:`<span class="hljs-keyword">Step</span> <span class="hljs-number">0</span>: <span class="hljs-keyword">Step</span> <span class="hljs-number">1</span>: <span class="hljs-keyword">Step</span> <span class="hljs-number">2</span>: | |
| ๐ฉ๐ฉ๐ฉ ๐ฉ๐ฅ๐ฉ ๐ซ๐ฅ๐ซ | |
| ๐ฉ๐ฅ๐ฉ โ ๐ฅ๐ฅ๐ฅ โ ๐ฅ๐ฅ๐ฅ (<span class="hljs-built_in">Wind</span>: E, spreading <span class="hljs-literal">east</span>) | |
| ๐ฉ๐ฉ๐ฉ ๐ฉ๐ฅ๐ฉ ๐ซ๐ฅ๐ซ`,lang:"",wrap:!1}}),ee=new w({props:{title:"โ๏ธ Configuration",local:"-configuration",headingTag:"h2"}}),te=new w({props:{title:"Environment Variables",local:"environment-variables",headingTag:"h3"}}),ae=new w({props:{title:"Python API Configuration",local:"python-api-configuration",headingTag:"h3"}}),ie=new y({props:{code:"ZnJvbSUyMGVudnMud2lsZGZpcmVfZW52LnNlcnZlci53aWxkZmlyZV9lbnZpcm9ubWVudCUyMGltcG9ydCUyMFdpbGRmaXJlRW52aXJvbm1lbnQlMEElMEFlbnYlMjAlM0QlMjBXaWxkZmlyZUVudmlyb25tZW50KCUwQSUyMCUyMCUyMCUyMHdpZHRoJTNENjQlMkMlMEElMjAlMjAlMjAlMjBoZWlnaHQlM0Q2NCUyQyUwQSUyMCUyMCUyMCUyMGh1bWlkaXR5JTNEMC4zJTJDJTBBJTIwJTIwJTIwJTIwaW5pdF9zb3VyY2VzJTNEMyUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyME51bWJlciUyMG9mJTIwaW5pdGlhbCUyMGZpcmVzJTBBJTIwJTIwJTIwJTIwbWF4X3N0ZXBzJTNEMjAwJTJDJTBBJTIwJTIwJTIwJTIwd2F0ZXJfY2FwYWNpdHklM0QxMCUyQyUwQSUyMCUyMCUyMCUyMGJyZWFrX2NhcGFjaXR5JTNENzUlMkMlMEElMjAlMjAlMjAlMjBzZWVkJTNENDIlMEEp",highlighted:`<span class="hljs-keyword">from</span> envs.wildfire_env.server.wildfire_environment <span class="hljs-keyword">import</span> WildfireEnvironment | |
| env = WildfireEnvironment( | |
| width=<span class="hljs-number">64</span>, | |
| height=<span class="hljs-number">64</span>, | |
| humidity=<span class="hljs-number">0.3</span>, | |
| init_sources=<span class="hljs-number">3</span>, <span class="hljs-comment"># Number of initial fires</span> | |
| max_steps=<span class="hljs-number">200</span>, | |
| water_capacity=<span class="hljs-number">10</span>, | |
| break_capacity=<span class="hljs-number">75</span>, | |
| seed=<span class="hljs-number">42</span> | |
| )`,lang:"python",wrap:!1}}),re=new w({props:{title:"Docker Configuration",local:"docker-configuration",headingTag:"h3"}}),pe=new y({props:{code:"ZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC1lJTIwV0lMREZJUkVfV0lEVEglM0Q2NCUyMCU1QyUwQSUyMCUyMC1lJTIwV0lMREZJUkVfSEVJR0hUJTNENjQlMjAlNUMlMEElMjAlMjAtZSUyMFdJTERGSVJFX0hVTUlESVRZJTNEMC40JTIwJTVDJTBBJTIwJTIwLWUlMjBXSUxERklSRV9XSU5EJTNETiUyMCU1QyUwQSUyMCUyMC1lJTIwV0lMREZJUkVfV0FURVJfQ0FQQUNJVFklM0QxMiUyMCU1QyUwQSUyMCUyMHdpbGRmaXJlLWVudiUzQWxhdGVzdA==",highlighted:`docker run -p 8000:8000 \\ | |
| -e WILDFIRE_WIDTH=64 \\ | |
| -e WILDFIRE_HEIGHT=64 \\ | |
| -e WILDFIRE_HUMIDITY=0.4 \\ | |
| -e WILDFIRE_WIND=N \\ | |
| -e WILDFIRE_WATER_CAPACITY=12 \\ | |
| wildfire-env:latest`,lang:"bash",wrap:!1}}),Me=new w({props:{title:"Custom Configuration",local:"custom-configuration",headingTag:"h3"}}),Je=new y({props:{code:"JTIzJTIwQnVpbGQlMjBhbmQlMjBydW4lMjB3aXRoJTIwY3VzdG9tJTIwY29uZmlndXJhdGlvbiUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjBvcGVuZW52LWJhc2UlM0FsYXRlc3QlMjAtZiUyMHNyYyUyRm9wZW5lbnYlMkZjb3JlJTJGY29udGFpbmVycyUyRmltYWdlcyUyRkRvY2tlcmZpbGUlMjAuJTBBZG9ja2VyJTIwYnVpbGQlMjAtdCUyMHdpbGRmaXJlLWVudiUzQWxhdGVzdCUyMC1mJTIwZW52cyUyRndpbGRmaXJlX2VudiUyRnNlcnZlciUyRkRvY2tlcmZpbGUlMjAuJTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC1lJTIwRU5BQkxFX1dFQl9JTlRFUkZBQ0UlM0R0cnVlJTIwJTVDJTBBJTIwJTIwLWUlMjBXSUxERklSRV9XSURUSCUzRDY0JTIwJTVDJTBBJTIwJTIwLWUlMjBXSUxERklSRV9IRUlHSFQlM0Q2NCUyMCU1QyUwQSUyMCUyMC1lJTIwV0lMREZJUkVfSFVNSURJVFklM0QwLjUlMjAlNUMlMEElMjAlMjB3aWxkZmlyZS1lbnYlM0FsYXRlc3Q=",highlighted:`<span class="hljs-comment"># Build and run with custom configuration</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| docker build -t wildfire-env:latest -f envs/wildfire_env/server/Dockerfile . | |
| docker run -p 8000:8000 \\ | |
| -e ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> \\ | |
| -e WILDFIRE_WIDTH=64 \\ | |
| -e WILDFIRE_HEIGHT=64 \\ | |
| -e WILDFIRE_HUMIDITY=0.5 \\ | |
| wildfire-env:latest`,lang:"bash",wrap:!1}}),oe=new w({props:{title:"๐ Installation & Usage",local:"-installation--usage",headingTag:"h2"}}),de=new w({props:{title:"Option 1: Docker (Recommended)",local:"option-1-docker-recommended",headingTag:"h3"}}),Te=new y({props:{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjAoZmlyc3QlMjB0aW1lJTIwb25seSklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbmVudi1iYXNlJTNBbGF0ZXN0JTIwLWYlMjBzcmMlMkZvcGVuZW52JTJGY29yZSUyRmNvbnRhaW5lcnMlMkZpbWFnZXMlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMEJ1aWxkJTIwd2lsZGZpcmUlMjBlbnZpcm9ubWVudCUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjB3aWxkZmlyZS1lbnYlM0FsYXRlc3QlMjAtZiUyMGVudnMlMkZ3aWxkZmlyZV9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMFJ1biUyMGNvbnRhaW5lciUwQWRvY2tlciUyMHJ1biUyMC1wJTIwODAwMCUzQTgwMDAlMjAtZSUyMEVOQUJMRV9XRUJfSU5URVJGQUNFJTNEdHJ1ZSUyMHdpbGRmaXJlLWVudiUzQWxhdGVzdA==",highlighted:`<span class="hljs-comment"># Build base image (first time only)</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Build wildfire environment</span> | |
| docker build -t wildfire-env:latest -f envs/wildfire_env/server/Dockerfile . | |
| <span class="hljs-comment"># Run container</span> | |
| docker run -p 8000:8000 -e ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> wildfire-env:latest`,lang:"bash",wrap:!1}}),ue=new y({props:{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjAoZmlyc3QlMjB0aW1lJTIwb25seSklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbmVudi1iYXNlJTNBbGF0ZXN0JTIwLWYlMjBzcmMlMkZvcGVuZW52JTJGY29yZSUyRmNvbnRhaW5lcnMlMkZpbWFnZXMlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMEJ1aWxkJTIwd2lsZGZpcmUlMjBlbnZpcm9ubWVudCUyMHVzaW5nJTIwdGhlJTIwc2NyaXB0JTBBY2QlMjBzcmMlMkZlbnZzJTJGd2lsZGZpcmVfZW52JTJGc2VydmVyJTBBLiUyRmJ1aWxkX2RvY2tlci5zaCUwQSUwQSUyMyUyMFJ1biUyMGNvbnRhaW5lciUwQWRvY2tlciUyMHJ1biUyMC1kJTIwLXAlMjA4MDAwJTNBODAwMCUyMC0tbmFtZSUyMHdpbGRmaXJlLWVudi1jb250YWluZXIlMjB3aWxkZmlyZS1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBWaWV3JTIwbG9ncyUwQWRvY2tlciUyMGxvZ3MlMjAtZiUyMHdpbGRmaXJlLWVudi1jb250YWluZXIlMEElMEElMjMlMjBTdG9wJTIwY29udGFpbmVyJTBBZG9ja2VyJTIwc3RvcCUyMHdpbGRmaXJlLWVudi1jb250YWluZXIlMEElMEElMjMlMjBSZW1vdmUlMjBjb250YWluZXIlMEFkb2NrZXIlMjBybSUyMHdpbGRmaXJlLWVudi1jb250YWluZXI=",highlighted:`<span class="hljs-comment"># Build base image (first time only)</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Build wildfire environment using the script</span> | |
| <span class="hljs-built_in">cd</span> src/envs/wildfire_env/server | |
| ./build_docker.sh | |
| <span class="hljs-comment"># Run container</span> | |
| docker run -d -p 8000:8000 --name wildfire-env-container wildfire-env:latest | |
| <span class="hljs-comment"># View logs</span> | |
| docker logs -f wildfire-env-container | |
| <span class="hljs-comment"># Stop container</span> | |
| docker stop wildfire-env-container | |
| <span class="hljs-comment"># Remove container</span> | |
| docker <span class="hljs-built_in">rm</span> wildfire-env-container`,lang:"bash",wrap:!1}}),Ue=new w({props:{title:"Option 2: Local Development (No Docker)",local:"option-2-local-development-no-docker",headingTag:"h3"}}),be=new y({props:{code:"cGlwJTIwaW5zdGFsbCUyMGZhc3RhcGklMjB1dmljb3JuJTIwbnVtcHklMjBtYXRwbG90bGliJTIwcmVxdWVzdHM=",highlighted:"pip install fastapi uvicorn numpy matplotlib requests",lang:"bash",wrap:!1}}),fe=new y({props:{code:"JTIzJTIwRnJvbSUyME9wZW5FbnYlMjByb290JTIwZGlyZWN0b3J5JTBBcHl0aG9uJTIwLW0lMjBlbnZzLndpbGRmaXJlX2Vudi5zZXJ2ZXIuYXBw",highlighted:`<span class="hljs-comment"># From OpenEnv root directory</span> | |
| python -m envs.wildfire_env.server.app`,lang:"bash",wrap:!1}}),Ie=new y({props:{code:"V0lMREZJUkVfV0lEVEglM0Q2NCUyMFdJTERGSVJFX0hVTUlESVRZJTNEMC4zJTIwcHl0aG9uJTIwLW0lMjBlbnZzLndpbGRmaXJlX2Vudi5zZXJ2ZXIuYXBw",highlighted:"WILDFIRE_WIDTH=64 WILDFIRE_HUMIDITY=0.3 python -m envs.wildfire_env.server.app",lang:"bash",wrap:!1}}),Ce=new w({props:{title:"๐ API Reference",local:"-api-reference",headingTag:"h2"}}),$e=new w({props:{title:"Client Class",local:"client-class",headingTag:"h3"}}),We=new y({props:{code:"ZnJvbSUyMGVudnMud2lsZGZpcmVfZW52JTIwaW1wb3J0JTIwV2lsZGZpcmVFbnYlMEElMEElMjMlMjBDb25uZWN0JTIwdG8lMjBleGlzdGluZyUyMHNlcnZlciUwQWVudiUyMCUzRCUyMFdpbGRmaXJlRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTBBJTBBJTIzJTIwT3IlMjBjcmVhdGUlMjBmcm9tJTIwRG9ja2VyJTIwaW1hZ2UlMEFlbnYlMjAlM0QlMjBXaWxkZmlyZUVudi5mcm9tX2RvY2tlcl9pbWFnZSglMjJ3aWxkZmlyZS1lbnYlM0FsYXRlc3QlMjIp",highlighted:`<span class="hljs-keyword">from</span> envs.wildfire_env <span class="hljs-keyword">import</span> WildfireEnv | |
| <span class="hljs-comment"># Connect to existing server</span> | |
| env = WildfireEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| <span class="hljs-comment"># Or create from Docker image</span> | |
| env = WildfireEnv.from_docker_image(<span class="hljs-string">"wildfire-env:latest"</span>)`,lang:"python",wrap:!1}}),ve=new w({props:{title:"Methods",local:"methods",headingTag:"h3"}}),Ee=new w({props:{title:"reset() -> StepResult[WildfireObservation]",local:"reset--gt-stepresultwildfireobservation",headingTag:"h4"}}),Be=new y({props:{code:"cmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEFwcmludChmJTIyTmV3JTIwZXBpc29kZSUzQSUyMCU3Qm9icy5zdGVwJTIwJTNEJTNEJTIwMCU3RCUyMik=",highlighted:`result = env.reset() | |
| obs = result.observation | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"New episode: <span class="hljs-subst">{obs.step == <span class="hljs-number">0</span>}</span>"</span>)`,lang:"python",wrap:!1}}),Ae=new w({props:{title:"step(action: WildfireAction) -> StepResult[WildfireObservation]",local:"stepaction-wildfireaction--gt-stepresultwildfireobservation",headingTag:"h4"}}),Ge=new y({props:{code:"YWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMjB4JTNEMTAlMkMlMjB5JTNEMTUpJTBBcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoYWN0aW9uKSUwQXByaW50KGYlMjJSZXdhcmQlM0ElMjAlN0JyZXN1bHQucmV3YXJkJTdEJTJDJTIwRG9uZSUzQSUyMCU3QnJlc3VsdC5kb25lJTdEJTIyKQ==",highlighted:`action = WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-number">10</span>, y=<span class="hljs-number">15</span>) | |
| result = env.step(action) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Reward: <span class="hljs-subst">{result.reward}</span>, Done: <span class="hljs-subst">{result.done}</span>"</span>)`,lang:"python",wrap:!1}}),Re=new w({props:{title:"state -> WildfireState",local:"state--gt-wildfirestate",headingTag:"h4"}}),Ne=new y({props:{code:"c3RhdGUlMjAlM0QlMjBlbnYuc3RhdGUlMEFwcmludChmJTIyRXBpc29kZSUyMElEJTNBJTIwJTdCc3RhdGUuZXBpc29kZV9pZCU3RCUyMiklMEFwcmludChmJTIyVG90YWwlMjBidXJuZWQlM0ElMjAlN0JzdGF0ZS50b3RhbF9idXJuZWQlN0QlMjIpJTBBcHJpbnQoZiUyMlRvdGFsJTIwZXh0aW5ndWlzaGVkJTNBJTIwJTdCc3RhdGUudG90YWxfZXh0aW5ndWlzaGVkJTdEJTIyKQ==",highlighted:`state = env.state | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Episode ID: <span class="hljs-subst">{state.episode_id}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Total burned: <span class="hljs-subst">{state.total_burned}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Total extinguished: <span class="hljs-subst">{state.total_extinguished}</span>"</span>)`,lang:"python",wrap:!1}}),Ve=new w({props:{title:"close()",local:"close",headingTag:"h4"}}),Ye=new y({props:{code:"ZW52LmNsb3NlKCk=",highlighted:"env.close()",lang:"python",wrap:!1}}),Se=new w({props:{title:"Data Classes",local:"data-classes",headingTag:"h3"}}),xe=new w({props:{title:"WildfireAction",local:"wildfireaction",headingTag:"h4"}}),_e=new y({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBXaWxkZmlyZUFjdGlvbihBY3Rpb24pJTNBJTBBJTIwJTIwJTIwJTIwYWN0aW9uJTNBJTIwc3RyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwJTIyd2F0ZXIlMjIlMjAlN0MlMjAlMjJicmVhayUyMiUyMCU3QyUyMCUyMndhaXQlMjIlMEElMjAlMjAlMjAlMjB4JTNBJTIwT3B0aW9uYWwlNUJpbnQlNUQlMjAlM0QlMjBOb25lJTIwJTIwJTIzJTIwVGFyZ2V0JTIwWCUyMGNvb3JkaW5hdGUlMjAocmVxdWlyZWQlMjBmb3IlMjB3YXRlciUyRmJyZWFrKSUwQSUyMCUyMCUyMCUyMHklM0ElMjBPcHRpb25hbCU1QmludCU1RCUyMCUzRCUyME5vbmUlMjAlMjAlMjMlMjBUYXJnZXQlMjBZJTIwY29vcmRpbmF0ZSUyMChyZXF1aXJlZCUyMGZvciUyMHdhdGVyJTJGYnJlYWsp",highlighted:`<span class="hljs-meta">@dataclass</span> | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">WildfireAction</span>(<span class="hljs-title class_ inherited__">Action</span>): | |
| action: <span class="hljs-built_in">str</span> <span class="hljs-comment"># "water" | "break" | "wait"</span> | |
| x: <span class="hljs-type">Optional</span>[<span class="hljs-built_in">int</span>] = <span class="hljs-literal">None</span> <span class="hljs-comment"># Target X coordinate (required for water/break)</span> | |
| y: <span class="hljs-type">Optional</span>[<span class="hljs-built_in">int</span>] = <span class="hljs-literal">None</span> <span class="hljs-comment"># Target Y coordinate (required for water/break)</span>`,lang:"python",wrap:!1}}),He=new y({props:{code:"V2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMjB4JTNEMTAlMkMlMjB5JTNEMTUpJTBBV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyYnJlYWslMjIlMkMlMjB4JTNEMTIlMkMlMjB5JTNEMTUpJTBBV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2FpdCUyMiklMjAlMjAlMjMlMjB4JTJDJTIweSUyMG5vdCUyMG5lZWRlZA==",highlighted:`WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-number">10</span>, y=<span class="hljs-number">15</span>) | |
| WildfireAction(action=<span class="hljs-string">"break"</span>, x=<span class="hljs-number">12</span>, y=<span class="hljs-number">15</span>) | |
| WildfireAction(action=<span class="hljs-string">"wait"</span>) <span class="hljs-comment"># x, y not needed</span>`,lang:"python",wrap:!1}}),Fe=new w({props:{title:"WildfireObservation",local:"wildfireobservation",headingTag:"h4"}}),De=new w({props:{title:"WildfireState",local:"wildfirestate",headingTag:"h4"}}),qe=new y({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBXaWxkZmlyZVN0YXRlKFN0YXRlKSUzQSUwQSUyMCUyMCUyMCUyMGVwaXNvZGVfaWQlM0ElMjBzdHIlMEElMjAlMjAlMjAlMjBzdGVwX2NvdW50JTNBJTIwaW50JTBBJTIwJTIwJTIwJTIwdG90YWxfYnVybmVkJTNBJTIwaW50JTBBJTIwJTIwJTIwJTIwdG90YWxfZXh0aW5ndWlzaGVkJTNBJTIwaW50JTBBJTIwJTIwJTIwJTIwbGFzdF9hY3Rpb24lM0ElMjBzdHIlMEElMjAlMjAlMjAlMjB3aWR0aCUzQSUyMGludCUwQSUyMCUyMCUyMCUyMGhlaWdodCUzQSUyMGludCUwQSUyMCUyMCUyMCUyMHdpbmRfZGlyJTNBJTIwc3RyJTBBJTIwJTIwJTIwJTIwaHVtaWRpdHklM0ElMjBmbG9hdCUwQSUyMCUyMCUyMCUyMHJlbWFpbmluZ193YXRlciUzQSUyMGludCUwQSUyMCUyMCUyMCUyMHJlbWFpbmluZ19icmVha3MlM0ElMjBpbnQlMEElMjAlMjAlMjAlMjBncmlkJTNBJTIwTGlzdCU1QmludCU1RCUwQSUyMCUyMCUyMCUyMGJ1cm5fdGltZXJzJTNBJTIwTGlzdCU1QmludCU1RA==",highlighted:`<span class="hljs-meta">@dataclass</span> | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">WildfireState</span>(<span class="hljs-title class_ inherited__">State</span>): | |
| episode_id: <span class="hljs-built_in">str</span> | |
| step_count: <span class="hljs-built_in">int</span> | |
| total_burned: <span class="hljs-built_in">int</span> | |
| total_extinguished: <span class="hljs-built_in">int</span> | |
| last_action: <span class="hljs-built_in">str</span> | |
| width: <span class="hljs-built_in">int</span> | |
| height: <span class="hljs-built_in">int</span> | |
| wind_dir: <span class="hljs-built_in">str</span> | |
| humidity: <span class="hljs-built_in">float</span> | |
| remaining_water: <span class="hljs-built_in">int</span> | |
| remaining_breaks: <span class="hljs-built_in">int</span> | |
| grid: <span class="hljs-type">List</span>[<span class="hljs-built_in">int</span>] | |
| burn_timers: <span class="hljs-type">List</span>[<span class="hljs-built_in">int</span>]`,lang:"python",wrap:!1}}),Ke=new w({props:{title:"๐ Examples",local:"-examples",headingTag:"h2"}}),Pe=new w({props:{title:"Example 1: Simple Containment Strategy",local:"example-1-simple-containment-strategy",headingTag:"h3"}}),Oe=new y({props:{code:"ZnJvbSUyMGVudnMud2lsZGZpcmVfZW52JTIwaW1wb3J0JTIwV2lsZGZpcmVFbnYlMkMlMjBXaWxkZmlyZUFjdGlvbiUwQWltcG9ydCUyMG51bXB5JTIwYXMlMjBucCUwQSUwQWVudiUyMCUzRCUyMFdpbGRmaXJlRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTBBcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMEFncmlkXzJkJTIwJTNEJTIwbnAuYXJyYXkob2JzLmdyaWQpLnJlc2hhcGUob2JzLmhlaWdodCUyQyUyMG9icy53aWR0aCklMEF0b3RhbF9yZXdhcmQlMjAlM0QlMjAwJTBBJTBBd2hpbGUlMjBub3QlMjByZXN1bHQuZG9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMEZpbmQlMjBidXJuaW5nJTIwY2VsbHMlMEElMjAlMjAlMjAlMjBidXJuaW5nX2luZGljZXMlMjAlM0QlMjBucC53aGVyZShncmlkXzJkJTIwJTNEJTNEJTIwMiklMEElMEElMjAlMjAlMjAlMjBpZiUyMGxlbihidXJuaW5nX2luZGljZXMlNUIwJTVEKSUyMCUzRSUyMDAlMjBhbmQlMjBvYnMucmVtYWluaW5nX3dhdGVyJTIwJTNFJTIwMCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFdhdGVyJTIwdGhlJTIwZmlyc3QlMjBidXJuaW5nJTIwY2VsbCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHklMkMlMjB4JTIwJTNEJTIwYnVybmluZ19pbmRpY2VzJTVCMCU1RCU1QjAlNUQlMkMlMjBidXJuaW5nX2luZGljZXMlNUIxJTVEJTVCMCU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGFjdGlvbiUyMCUzRCUyMFdpbGRmaXJlQWN0aW9uKGFjdGlvbiUzRCUyMndhdGVyJTIyJTJDJTIweCUzRGludCh4KSUyQyUyMHklM0RpbnQoeSkpJTBBJTIwJTIwJTIwJTIwZWxzZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFdhaXQlMjBpZiUyMG5vJTIwd2F0ZXIlMjBvciUyMG5vJTIwZmlyZXMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY3Rpb24lMjAlM0QlMjBXaWxkZmlyZUFjdGlvbihhY3Rpb24lM0QlMjJ3YWl0JTIyKSUwQSUwQSUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMGVudi5zdGVwKGFjdGlvbiklMEElMjAlMjAlMjAlMjBvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMjAlMjAlMjAlMjB0b3RhbF9yZXdhcmQlMjAlMkIlM0QlMjByZXN1bHQucmV3YXJkJTIwb3IlMjAwJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwVXBkYXRlJTIwZ3JpZCUwQSUyMCUyMCUyMCUyMGdyaWRfMmQlMjAlM0QlMjBucC5hcnJheShvYnMuZ3JpZCkucmVzaGFwZShvYnMuaGVpZ2h0JTJDJTIwb2JzLndpZHRoKSUwQSUwQSUyMCUyMCUyMCUyMHByaW50KGYlMjJTdGVwJTIwJTdCb2JzLnN0ZXAlN0QlM0ElMjBCdXJuaW5nJTNEJTdCb2JzLmJ1cm5pbmdfY291bnQlN0QlMkMlMjBSZXdhcmQlM0QlN0JyZXN1bHQucmV3YXJkJTNBLjNmJTdEJTIyKSUwQSUwQXByaW50KGYlMjIlNUNuRXBpc29kZSUyMGVuZGVkLiUyMFRvdGFsJTIwcmV3YXJkJTNBJTIwJTdCdG90YWxfcmV3YXJkJTNBLjJmJTdEJTIyKSUwQXByaW50KGYlMjJGaW5hbCUyMHN0YXRzJTNBJTIwQnVybmVkJTNEJTdCb2JzLmJ1cm5lZF9jb3VudCU3RCUyQyUyMEV4dGluZ3Vpc2hlZCUzRCU3QmVudi5zdGF0ZS50b3RhbF9leHRpbmd1aXNoZWQlN0QlMjIpJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.wildfire_env <span class="hljs-keyword">import</span> WildfireEnv, WildfireAction | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| env = WildfireEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| result = env.reset() | |
| obs = result.observation | |
| grid_2d = np.array(obs.grid).reshape(obs.height, obs.width) | |
| total_reward = <span class="hljs-number">0</span> | |
| <span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> result.done: | |
| <span class="hljs-comment"># Find burning cells</span> | |
| burning_indices = np.where(grid_2d == <span class="hljs-number">2</span>) | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(burning_indices[<span class="hljs-number">0</span>]) > <span class="hljs-number">0</span> <span class="hljs-keyword">and</span> obs.remaining_water > <span class="hljs-number">0</span>: | |
| <span class="hljs-comment"># Water the first burning cell</span> | |
| y, x = burning_indices[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>], burning_indices[<span class="hljs-number">1</span>][<span class="hljs-number">0</span>] | |
| action = WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-built_in">int</span>(x), y=<span class="hljs-built_in">int</span>(y)) | |
| <span class="hljs-keyword">else</span>: | |
| <span class="hljs-comment"># Wait if no water or no fires</span> | |
| action = WildfireAction(action=<span class="hljs-string">"wait"</span>) | |
| result = env.step(action) | |
| obs = result.observation | |
| total_reward += result.reward <span class="hljs-keyword">or</span> <span class="hljs-number">0</span> | |
| <span class="hljs-comment"># Update grid</span> | |
| grid_2d = np.array(obs.grid).reshape(obs.height, obs.width) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Step <span class="hljs-subst">{obs.step}</span>: Burning=<span class="hljs-subst">{obs.burning_count}</span>, Reward=<span class="hljs-subst">{result.reward:<span class="hljs-number">.3</span>f}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"\\nEpisode ended. Total reward: <span class="hljs-subst">{total_reward:<span class="hljs-number">.2</span>f}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Final stats: Burned=<span class="hljs-subst">{obs.burned_count}</span>, Extinguished=<span class="hljs-subst">{env.state.total_extinguished}</span>"</span>) | |
| env.close()`,lang:"python",wrap:!1}}),lt=new w({props:{title:"Example 2: Firebreak Strategy",local:"example-2-firebreak-strategy",headingTag:"h3"}}),et=new y({props:{code:"ZnJvbSUyMGVudnMud2lsZGZpcmVfZW52JTIwaW1wb3J0JTIwV2lsZGZpcmVFbnYlMkMlMjBXaWxkZmlyZUFjdGlvbiUwQWltcG9ydCUyMG51bXB5JTIwYXMlMjBucCUwQSUwQWVudiUyMCUzRCUyMFdpbGRmaXJlRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTBBcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMEFkZWYlMjBjcmVhdGVfZmlyZWJyZWFrX2JhcnJpZXIob2JzJTJDJTIwZW52KSUzQSUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMkNyZWF0ZSUyMGZpcmVicmVhayUyMGFoZWFkJTIwb2YlMjBmaXJlJTIwZnJvbnQlMjBiYXNlZCUyMG9uJTIwd2luZCUyMGRpcmVjdGlvbi4lMjIlMjIlMjIlMEElMjAlMjAlMjAlMjBncmlkXzJkJTIwJTNEJTIwbnAuYXJyYXkob2JzLmdyaWQpLnJlc2hhcGUob2JzLmhlaWdodCUyQyUyMG9icy53aWR0aCklMEElMjAlMjAlMjAlMjB3aW5kJTIwJTNEJTIwb2JzLndpbmRfZGlyJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwRmluZCUyMGJ1cm5pbmclMjBjZWxscyUwQSUyMCUyMCUyMCUyMGJ1cm5pbmdfeSUyQyUyMGJ1cm5pbmdfeCUyMCUzRCUyMG5wLndoZXJlKGdyaWRfMmQlMjAlM0QlM0QlMjAyKSUwQSUwQSUyMCUyMCUyMCUyMGlmJTIwbGVuKGJ1cm5pbmdfeCklMjAlM0QlM0QlMjAwJTIwb3IlMjBvYnMucmVtYWluaW5nX2JyZWFrcyUyMCUzRCUzRCUyMDAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjBXaWxkZmlyZUFjdGlvbihhY3Rpb24lM0QlMjJ3YWl0JTIyKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMENhbGN1bGF0ZSUyMGZpcmUlMjBmcm9udCUyMHBvc2l0aW9uJTBBJTIwJTIwJTIwJTIwaWYlMjB3aW5kJTIwJTNEJTNEJTIwJTIyRSUyMiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRhcmdldF94JTIwJTNEJTIwaW50KG5wLm1heChidXJuaW5nX3gpKSUyMCUyQiUyMDIlMjAlMjAlMjMlMjBBaGVhZCUyMG9mJTIwZWFzdGVybm1vc3QlMjBmaXJlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGFyZ2V0X3klMjAlM0QlMjBpbnQobnAubWVhbihidXJuaW5nX3kpKSUwQSUyMCUyMCUyMCUyMGVsaWYlMjB3aW5kJTIwJTNEJTNEJTIwJTIyVyUyMiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRhcmdldF94JTIwJTNEJTIwaW50KG5wLm1pbihidXJuaW5nX3gpKSUyMC0lMjAyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGFyZ2V0X3klMjAlM0QlMjBpbnQobnAubWVhbihidXJuaW5nX3kpKSUwQSUyMCUyMCUyMCUyMGVsaWYlMjB3aW5kJTIwJTNEJTNEJTIwJTIyTiUyMiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRhcmdldF94JTIwJTNEJTIwaW50KG5wLm1lYW4oYnVybmluZ194KSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0YXJnZXRfeSUyMCUzRCUyMGludChucC5taW4oYnVybmluZ195KSklMjAtJTIwMiUwQSUyMCUyMCUyMCUyMGVsaWYlMjB3aW5kJTIwJTNEJTNEJTIwJTIyUyUyMiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRhcmdldF94JTIwJTNEJTIwaW50KG5wLm1lYW4oYnVybmluZ194KSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0YXJnZXRfeSUyMCUzRCUyMGludChucC5tYXgoYnVybmluZ195KSklMjAlMkIlMjAyJTBBJTIwJTIwJTIwJTIwZWxzZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEZhbGxiYWNrJTNBJTIwd2F0ZXIlMjBuZWFyZXN0JTIwYnVybmluZyUyMGNlbGwlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjBXaWxkZmlyZUFjdGlvbihhY3Rpb24lM0QlMjJ3YXRlciUyMiUyQyUyMHglM0RpbnQoYnVybmluZ194JTVCMCU1RCklMkMlMjB5JTNEaW50KGJ1cm5pbmdfeSU1QjAlNUQpKSUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMEVuc3VyZSUyMHdpdGhpbiUyMGJvdW5kcyUwQSUyMCUyMCUyMCUyMHRhcmdldF94JTIwJTNEJTIwbWF4KDAlMkMlMjBtaW4ob2JzLndpZHRoJTIwLSUyMDElMkMlMjB0YXJnZXRfeCkpJTBBJTIwJTIwJTIwJTIwdGFyZ2V0X3klMjAlM0QlMjBtYXgoMCUyQyUyMG1pbihvYnMuaGVpZ2h0JTIwLSUyMDElMkMlMjB0YXJnZXRfeSkpJTBBJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyYnJlYWslMjIlMkMlMjB4JTNEdGFyZ2V0X3glMkMlMjB5JTNEdGFyZ2V0X3kpJTBBJTBBdG90YWxfcmV3YXJkJTIwJTNEJTIwMCUwQXdoaWxlJTIwbm90JTIwcmVzdWx0LmRvbmUlM0ElMEElMjAlMjAlMjAlMjBhY3Rpb24lMjAlM0QlMjBjcmVhdGVfZmlyZWJyZWFrX2JhcnJpZXIob2JzJTJDJTIwZW52KSUwQSUyMCUyMCUyMCUyMHJlc3VsdCUyMCUzRCUyMGVudi5zdGVwKGFjdGlvbiklMEElMjAlMjAlMjAlMjBvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMjAlMjAlMjAlMjB0b3RhbF9yZXdhcmQlMjAlMkIlM0QlMjByZXN1bHQucmV3YXJkJTIwb3IlMjAwJTBBJTBBJTIwJTIwJTIwJTIwaWYlMjBvYnMuc3RlcCUyMCUyNSUyMDEwJTIwJTNEJTNEJTIwMCUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KGYlMjJTdGVwJTIwJTdCb2JzLnN0ZXAlN0QlM0ElMjBGaXJlcyUzRCU3Qm9icy5idXJuaW5nX2NvdW50JTdEJTJDJTIwV2F0ZXIlM0QlN0JvYnMucmVtYWluaW5nX3dhdGVyJTdEJTJDJTIwQnJlYWtzJTNEJTdCb2JzLnJlbWFpbmluZ19icmVha3MlN0QlMjIpJTBBJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.wildfire_env <span class="hljs-keyword">import</span> WildfireEnv, WildfireAction | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| env = WildfireEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| result = env.reset() | |
| obs = result.observation | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">create_firebreak_barrier</span>(<span class="hljs-params">obs, env</span>): | |
| <span class="hljs-string">"""Create firebreak ahead of fire front based on wind direction."""</span> | |
| grid_2d = np.array(obs.grid).reshape(obs.height, obs.width) | |
| wind = obs.wind_dir | |
| <span class="hljs-comment"># Find burning cells</span> | |
| burning_y, burning_x = np.where(grid_2d == <span class="hljs-number">2</span>) | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(burning_x) == <span class="hljs-number">0</span> <span class="hljs-keyword">or</span> obs.remaining_breaks == <span class="hljs-number">0</span>: | |
| <span class="hljs-keyword">return</span> WildfireAction(action=<span class="hljs-string">"wait"</span>) | |
| <span class="hljs-comment"># Calculate fire front position</span> | |
| <span class="hljs-keyword">if</span> wind == <span class="hljs-string">"E"</span>: | |
| target_x = <span class="hljs-built_in">int</span>(np.<span class="hljs-built_in">max</span>(burning_x)) + <span class="hljs-number">2</span> <span class="hljs-comment"># Ahead of easternmost fire</span> | |
| target_y = <span class="hljs-built_in">int</span>(np.mean(burning_y)) | |
| <span class="hljs-keyword">elif</span> wind == <span class="hljs-string">"W"</span>: | |
| target_x = <span class="hljs-built_in">int</span>(np.<span class="hljs-built_in">min</span>(burning_x)) - <span class="hljs-number">2</span> | |
| target_y = <span class="hljs-built_in">int</span>(np.mean(burning_y)) | |
| <span class="hljs-keyword">elif</span> wind == <span class="hljs-string">"N"</span>: | |
| target_x = <span class="hljs-built_in">int</span>(np.mean(burning_x)) | |
| target_y = <span class="hljs-built_in">int</span>(np.<span class="hljs-built_in">min</span>(burning_y)) - <span class="hljs-number">2</span> | |
| <span class="hljs-keyword">elif</span> wind == <span class="hljs-string">"S"</span>: | |
| target_x = <span class="hljs-built_in">int</span>(np.mean(burning_x)) | |
| target_y = <span class="hljs-built_in">int</span>(np.<span class="hljs-built_in">max</span>(burning_y)) + <span class="hljs-number">2</span> | |
| <span class="hljs-keyword">else</span>: | |
| <span class="hljs-comment"># Fallback: water nearest burning cell</span> | |
| <span class="hljs-keyword">return</span> WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-built_in">int</span>(burning_x[<span class="hljs-number">0</span>]), y=<span class="hljs-built_in">int</span>(burning_y[<span class="hljs-number">0</span>])) | |
| <span class="hljs-comment"># Ensure within bounds</span> | |
| target_x = <span class="hljs-built_in">max</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">min</span>(obs.width - <span class="hljs-number">1</span>, target_x)) | |
| target_y = <span class="hljs-built_in">max</span>(<span class="hljs-number">0</span>, <span class="hljs-built_in">min</span>(obs.height - <span class="hljs-number">1</span>, target_y)) | |
| <span class="hljs-keyword">return</span> WildfireAction(action=<span class="hljs-string">"break"</span>, x=target_x, y=target_y) | |
| total_reward = <span class="hljs-number">0</span> | |
| <span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> result.done: | |
| action = create_firebreak_barrier(obs, env) | |
| result = env.step(action) | |
| obs = result.observation | |
| total_reward += result.reward <span class="hljs-keyword">or</span> <span class="hljs-number">0</span> | |
| <span class="hljs-keyword">if</span> obs.step % <span class="hljs-number">10</span> == <span class="hljs-number">0</span>: | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Step <span class="hljs-subst">{obs.step}</span>: Fires=<span class="hljs-subst">{obs.burning_count}</span>, Water=<span class="hljs-subst">{obs.remaining_water}</span>, Breaks=<span class="hljs-subst">{obs.remaining_breaks}</span>"</span>) | |
| env.close()`,lang:"python",wrap:!1}}),tt=new w({props:{title:"Example 3: Visualization with Matplotlib",local:"example-3-visualization-with-matplotlib",headingTag:"h3"}}),st=new y({props:{code:"aW1wb3J0JTIwbWF0cGxvdGxpYi5weXBsb3QlMjBhcyUyMHBsdCUwQWltcG9ydCUyMG51bXB5JTIwYXMlMjBucCUwQWltcG9ydCUyMG1hdHBsb3RsaWIuY29sb3JzJTIwYXMlMjBtY29sb3JzJTBBZnJvbSUyMGVudnMud2lsZGZpcmVfZW52JTIwaW1wb3J0JTIwV2lsZGZpcmVFbnYlMkMlMjBXaWxkZmlyZUFjdGlvbiUwQSUwQWVudiUyMCUzRCUyMFdpbGRmaXJlRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTBBcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMEElMjMlMjBTZXR1cCUyMGNvbG9ybWFwJTBBY21hcCUyMCUzRCUyMG1jb2xvcnMuTGlzdGVkQ29sb3JtYXAoJTVCJTBBJTIwJTIwJTIwJTIwJTIyYmxhY2slMjIlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAwJTIwJTNEJTIwYXNoJTBBJTIwJTIwJTIwJTIwJTIyZ3JlZW4lMjIlMkMlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjAxJTIwJTNEJTIwZnVlbCUwQSUyMCUyMCUyMCUyMCUyMnJlZCUyMiUyQyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMDIlMjAlM0QlMjBidXJuaW5nJTBBJTIwJTIwJTIwJTIwJTIyc2FkZGxlYnJvd24lMjIlMkMlMjAlMjAlMjAlMjMlMjAzJTIwJTNEJTIwZmlyZWJyZWFrJTBBJTIwJTIwJTIwJTIwJTIyYmx1ZSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMDQlMjAlM0QlMjB3YXRlciUwQSU1RCklMEFub3JtJTIwJTNEJTIwbWNvbG9ycy5Cb3VuZGFyeU5vcm0oJTVCMCUyQyUyMDElMkMlMjAyJTJDJTIwMyUyQyUyMDQlMkMlMjA1JTVEJTJDJTIwY21hcC5OKSUwQSUwQWZpZyUyQyUyMGF4JTIwJTNEJTIwcGx0LnN1YnBsb3RzKGZpZ3NpemUlM0QoOCUyQyUyMDgpKSUwQXBsdC5pb24oKSUwQSUwQWZvciUyMHN0ZXAlMjBpbiUyMHJhbmdlKDUwKSUzQSUwQSUyMCUyMCUyMCUyMGlmJTIwcmVzdWx0LmRvbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBicmVhayUwQSUwQSUyMCUyMCUyMCUyMCUyMyUyMFJlbmRlciUyMGdyaWQlMEElMjAlMjAlMjAlMjBncmlkXzJkJTIwJTNEJTIwbnAuYXJyYXkob2JzLmdyaWQpLnJlc2hhcGUob2JzLmhlaWdodCUyQyUyMG9icy53aWR0aCklMEElMjAlMjAlMjAlMjBheC5jbGVhcigpJTBBJTIwJTIwJTIwJTIwYXguaW1zaG93KGdyaWRfMmQlMkMlMjBjbWFwJTNEY21hcCUyQyUyMG5vcm0lM0Rub3JtJTJDJTIwaW50ZXJwb2xhdGlvbiUzRCduZWFyZXN0JyklMEElMjAlMjAlMjAlMjBheC5zZXRfdGl0bGUoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZiUyMlN0ZXAlMjAlN0JvYnMuc3RlcCU3RCUyMCU3QyUyMEZpcmVzJTNBJTIwJTdCb2JzLmJ1cm5pbmdfY291bnQlN0QlMjAlN0MlMjBCdXJuZWQlM0ElMjAlN0JvYnMuYnVybmVkX2NvdW50JTdEJTVDbiUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjJXaW5kJTNBJTIwJTdCb2JzLndpbmRfZGlyJTdEJTIwJTdDJTIwSHVtaWRpdHklM0ElMjAlN0JvYnMuaHVtaWRpdHklM0EuMmYlN0QlMjAlN0MlMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyV2F0ZXIlM0ElMjAlN0JvYnMucmVtYWluaW5nX3dhdGVyJTdEJTIwJTdDJTIwQnJlYWtzJTNBJTIwJTdCb2JzLnJlbWFpbmluZ19icmVha3MlN0QlMjIlMEElMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwcGx0LnBhdXNlKDAuMSklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBUYWtlJTIwYWN0aW9uJTIwKHNpbXBsZSUzQSUyMHdhdGVyJTIwZmlyc3QlMjBidXJuaW5nJTIwY2VsbCklMEElMjAlMjAlMjAlMjBpZiUyMG9icy5idXJuaW5nX2NvdW50JTIwJTNFJTIwMCUyMGFuZCUyMG9icy5yZW1haW5pbmdfd2F0ZXIlMjAlM0UlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnVybmluZ19pbmRpY2VzJTIwJTNEJTIwbnAud2hlcmUoZ3JpZF8yZCUyMCUzRCUzRCUyMDIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBsZW4oYnVybmluZ19pbmRpY2VzJTVCMCU1RCklMjAlM0UlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIweSUyQyUyMHglMjAlM0QlMjBidXJuaW5nX2luZGljZXMlNUIwJTVEJTVCMCU1RCUyQyUyMGJ1cm5pbmdfaW5kaWNlcyU1QjElNUQlNUIwJTVEJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMjB4JTNEaW50KHgpJTJDJTIweSUzRGludCh5KSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2FpdCUyMiklMEElMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2FpdCUyMiklMEElMEElMjAlMjAlMjAlMjByZXN1bHQlMjAlM0QlMjBlbnYuc3RlcChhY3Rpb24pJTBBJTIwJTIwJTIwJTIwb2JzJTIwJTNEJTIwcmVzdWx0Lm9ic2VydmF0aW9uJTBBJTBBcGx0LmlvZmYoKSUwQXBsdC5zaG93KCklMEFlbnYuY2xvc2UoKQ==",highlighted:`<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">import</span> matplotlib.colors <span class="hljs-keyword">as</span> mcolors | |
| <span class="hljs-keyword">from</span> envs.wildfire_env <span class="hljs-keyword">import</span> WildfireEnv, WildfireAction | |
| env = WildfireEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| result = env.reset() | |
| obs = result.observation | |
| <span class="hljs-comment"># Setup colormap</span> | |
| cmap = mcolors.ListedColormap([ | |
| <span class="hljs-string">"black"</span>, <span class="hljs-comment"># 0 = ash</span> | |
| <span class="hljs-string">"green"</span>, <span class="hljs-comment"># 1 = fuel</span> | |
| <span class="hljs-string">"red"</span>, <span class="hljs-comment"># 2 = burning</span> | |
| <span class="hljs-string">"saddlebrown"</span>, <span class="hljs-comment"># 3 = firebreak</span> | |
| <span class="hljs-string">"blue"</span> <span class="hljs-comment"># 4 = water</span> | |
| ]) | |
| norm = mcolors.BoundaryNorm([<span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>], cmap.N) | |
| fig, ax = plt.subplots(figsize=(<span class="hljs-number">8</span>, <span class="hljs-number">8</span>)) | |
| plt.ion() | |
| <span class="hljs-keyword">for</span> step <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">50</span>): | |
| <span class="hljs-keyword">if</span> result.done: | |
| <span class="hljs-keyword">break</span> | |
| <span class="hljs-comment"># Render grid</span> | |
| grid_2d = np.array(obs.grid).reshape(obs.height, obs.width) | |
| ax.clear() | |
| ax.imshow(grid_2d, cmap=cmap, norm=norm, interpolation=<span class="hljs-string">'nearest'</span>) | |
| ax.set_title( | |
| <span class="hljs-string">f"Step <span class="hljs-subst">{obs.step}</span> | Fires: <span class="hljs-subst">{obs.burning_count}</span> | Burned: <span class="hljs-subst">{obs.burned_count}</span>\\n"</span> | |
| <span class="hljs-string">f"Wind: <span class="hljs-subst">{obs.wind_dir}</span> | Humidity: <span class="hljs-subst">{obs.humidity:<span class="hljs-number">.2</span>f}</span> | "</span> | |
| <span class="hljs-string">f"Water: <span class="hljs-subst">{obs.remaining_water}</span> | Breaks: <span class="hljs-subst">{obs.remaining_breaks}</span>"</span> | |
| ) | |
| plt.pause(<span class="hljs-number">0.1</span>) | |
| <span class="hljs-comment"># Take action (simple: water first burning cell)</span> | |
| <span class="hljs-keyword">if</span> obs.burning_count > <span class="hljs-number">0</span> <span class="hljs-keyword">and</span> obs.remaining_water > <span class="hljs-number">0</span>: | |
| burning_indices = np.where(grid_2d == <span class="hljs-number">2</span>) | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(burning_indices[<span class="hljs-number">0</span>]) > <span class="hljs-number">0</span>: | |
| y, x = burning_indices[<span class="hljs-number">0</span>][<span class="hljs-number">0</span>], burning_indices[<span class="hljs-number">1</span>][<span class="hljs-number">0</span>] | |
| action = WildfireAction(action=<span class="hljs-string">"water"</span>, x=<span class="hljs-built_in">int</span>(x), y=<span class="hljs-built_in">int</span>(y)) | |
| <span class="hljs-keyword">else</span>: | |
| action = WildfireAction(action=<span class="hljs-string">"wait"</span>) | |
| <span class="hljs-keyword">else</span>: | |
| action = WildfireAction(action=<span class="hljs-string">"wait"</span>) | |
| result = env.step(action) | |
| obs = result.observation | |
| plt.ioff() | |
| plt.show() | |
| env.close()`,lang:"python",wrap:!1}}),nt=new w({props:{title:"Example 4: Training Loop for RL",local:"example-4-training-loop-for-rl",headingTag:"h3"}}),at=new y({props:{code:"ZnJvbSUyMGVudnMud2lsZGZpcmVfZW52JTIwaW1wb3J0JTIwV2lsZGZpcmVFbnYlMkMlMjBXaWxkZmlyZUFjdGlvbiUwQWltcG9ydCUyMHJhbmRvbSUwQSUwQWVudiUyMCUzRCUyMFdpbGRmaXJlRW52KGJhc2VfdXJsJTNEJTIyaHR0cCUzQSUyRiUyRmxvY2FsaG9zdCUzQTgwMDAlMjIpJTBBJTBBbnVtX2VwaXNvZGVzJTIwJTNEJTIwMTAlMEFlcGlzb2RlX3Jld2FyZHMlMjAlM0QlMjAlNUIlNUQlMEElMEFmb3IlMjBlcGlzb2RlJTIwaW4lMjByYW5nZShudW1fZXBpc29kZXMpJTNBJTBBJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEElMjAlMjAlMjAlMjBvYnMlMjAlM0QlMjByZXN1bHQub2JzZXJ2YXRpb24lMEElMjAlMjAlMjAlMjBlcGlzb2RlX3Jld2FyZCUyMCUzRCUyMDAlMEElMjAlMjAlMjAlMjBlcGlzb2RlX3N0ZXBzJTIwJTNEJTIwMCUwQSUwQSUyMCUyMCUyMCUyMHdoaWxlJTIwbm90JTIwcmVzdWx0LmRvbmUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBSYW5kb20lMjBwb2xpY3klMjAocmVwbGFjZSUyMHdpdGglMjB5b3VyJTIwUkwlMjBhZ2VudCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHJhbmRvbS5yYW5kb20oKSUyMCUzQyUyMDAuNCUyMGFuZCUyMG9icy5yZW1haW5pbmdfd2F0ZXIlMjAlM0UlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB4JTNEcmFuZG9tLnJhbmRpbnQoMCUyQyUyMG9icy53aWR0aCUyMC0lMjAxKSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHklM0RyYW5kb20ucmFuZGludCgwJTJDJTIwb2JzLmhlaWdodCUyMC0lMjAxKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBlbGlmJTIwcmFuZG9tLnJhbmRvbSgpJTIwJTNDJTIwMC4zJTIwYW5kJTIwb2JzLnJlbWFpbmluZ19icmVha3MlMjAlM0UlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTNEJTIyYnJlYWslMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB4JTNEcmFuZG9tLnJhbmRpbnQoMCUyQyUyMG9icy53aWR0aCUyMC0lMjAxKSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHklM0RyYW5kb20ucmFuZGludCgwJTJDJTIwb2JzLmhlaWdodCUyMC0lMjAxKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2FpdCUyMiklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXN1bHQlMjAlM0QlMjBlbnYuc3RlcChhY3Rpb24pJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwb2JzJTIwJTNEJTIwcmVzdWx0Lm9ic2VydmF0aW9uJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXBpc29kZV9yZXdhcmQlMjAlMkIlM0QlMjByZXN1bHQucmV3YXJkJTIwb3IlMjAwJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZXBpc29kZV9zdGVwcyUyMCUyQiUzRCUyMDElMEElMEElMjAlMjAlMjAlMjBlcGlzb2RlX3Jld2FyZHMuYXBwZW5kKGVwaXNvZGVfcmV3YXJkKSUwQSUyMCUyMCUyMCUyMHN0YXRlJTIwJTNEJTIwZW52LnN0YXRlJTBBJTIwJTIwJTIwJTIwcHJpbnQoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZiUyMkVwaXNvZGUlMjAlN0JlcGlzb2RlJTIwJTJCJTIwMSU3RCUzQSUyMCUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjJSZXdhcmQlM0QlN0JlcGlzb2RlX3Jld2FyZCUzQS4yZiU3RCUyQyUyMCUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjJTdGVwcyUzRCU3QmVwaXNvZGVfc3RlcHMlN0QlMkMlMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIyQnVybmVkJTNEJTdCc3RhdGUudG90YWxfYnVybmVkJTdEJTJDJTIwJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZiUyMkV4dGluZ3Vpc2hlZCUzRCU3QnN0YXRlLnRvdGFsX2V4dGluZ3Vpc2hlZCU3RCUyMiUwQSUyMCUyMCUyMCUyMCklMEElMEFwcmludChmJTIyJTVDbkF2ZXJhZ2UlMjByZXdhcmQlM0ElMjAlN0JzdW0oZXBpc29kZV9yZXdhcmRzKSUyMCUyRiUyMGxlbihlcGlzb2RlX3Jld2FyZHMpJTNBLjJmJTdEJTIyKSUwQWVudi5jbG9zZSgp",highlighted:`<span class="hljs-keyword">from</span> envs.wildfire_env <span class="hljs-keyword">import</span> WildfireEnv, WildfireAction | |
| <span class="hljs-keyword">import</span> random | |
| env = WildfireEnv(base_url=<span class="hljs-string">"http://localhost:8000"</span>) | |
| num_episodes = <span class="hljs-number">10</span> | |
| episode_rewards = [] | |
| <span class="hljs-keyword">for</span> episode <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(num_episodes): | |
| result = env.reset() | |
| obs = result.observation | |
| episode_reward = <span class="hljs-number">0</span> | |
| episode_steps = <span class="hljs-number">0</span> | |
| <span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> result.done: | |
| <span class="hljs-comment"># Random policy (replace with your RL agent)</span> | |
| <span class="hljs-keyword">if</span> random.random() < <span class="hljs-number">0.4</span> <span class="hljs-keyword">and</span> obs.remaining_water > <span class="hljs-number">0</span>: | |
| action = WildfireAction( | |
| action=<span class="hljs-string">"water"</span>, | |
| x=random.randint(<span class="hljs-number">0</span>, obs.width - <span class="hljs-number">1</span>), | |
| y=random.randint(<span class="hljs-number">0</span>, obs.height - <span class="hljs-number">1</span>) | |
| ) | |
| <span class="hljs-keyword">elif</span> random.random() < <span class="hljs-number">0.3</span> <span class="hljs-keyword">and</span> obs.remaining_breaks > <span class="hljs-number">0</span>: | |
| action = WildfireAction( | |
| action=<span class="hljs-string">"break"</span>, | |
| x=random.randint(<span class="hljs-number">0</span>, obs.width - <span class="hljs-number">1</span>), | |
| y=random.randint(<span class="hljs-number">0</span>, obs.height - <span class="hljs-number">1</span>) | |
| ) | |
| <span class="hljs-keyword">else</span>: | |
| action = WildfireAction(action=<span class="hljs-string">"wait"</span>) | |
| result = env.step(action) | |
| obs = result.observation | |
| episode_reward += result.reward <span class="hljs-keyword">or</span> <span class="hljs-number">0</span> | |
| episode_steps += <span class="hljs-number">1</span> | |
| episode_rewards.append(episode_reward) | |
| state = env.state | |
| <span class="hljs-built_in">print</span>( | |
| <span class="hljs-string">f"Episode <span class="hljs-subst">{episode + <span class="hljs-number">1</span>}</span>: "</span> | |
| <span class="hljs-string">f"Reward=<span class="hljs-subst">{episode_reward:<span class="hljs-number">.2</span>f}</span>, "</span> | |
| <span class="hljs-string">f"Steps=<span class="hljs-subst">{episode_steps}</span>, "</span> | |
| <span class="hljs-string">f"Burned=<span class="hljs-subst">{state.total_burned}</span>, "</span> | |
| <span class="hljs-string">f"Extinguished=<span class="hljs-subst">{state.total_extinguished}</span>"</span> | |
| ) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"\\nAverage reward: <span class="hljs-subst">{<span class="hljs-built_in">sum</span>(episode_rewards) / <span class="hljs-built_in">len</span>(episode_rewards):<span class="hljs-number">.2</span>f}</span>"</span>) | |
| env.close()`,lang:"python",wrap:!1}}),it=new w({props:{title:"๐ Web Interface",local:"-web-interface",headingTag:"h2"}}),pt=new w({props:{title:"Accessing the Web Interface",local:"accessing-the-web-interface",headingTag:"h3"}}),Mt=new w({props:{title:"Using Docker",local:"using-docker",headingTag:"h4"}}),Jt=new y({props:{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjAoZmlyc3QlMjB0aW1lJTIwb25seSklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwb3BlbmVudi1iYXNlJTNBbGF0ZXN0JTIwLWYlMjBzcmMlMkZvcGVuZW52JTJGY29yZSUyRmNvbnRhaW5lcnMlMkZpbWFnZXMlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMEJ1aWxkJTIwd2lsZGZpcmUlMjBlbnZpcm9ubWVudCUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjB3aWxkZmlyZS1lbnYlM0FsYXRlc3QlMjAtZiUyMGVudnMlMkZ3aWxkZmlyZV9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLiUwQSUwQSUyMyUyMFJ1biUyMGNvbnRhaW5lciUwQWRvY2tlciUyMHJ1biUyMC1wJTIwODAwMCUzQTgwMDAlMjAtZSUyMEVOQUJMRV9XRUJfSU5URVJGQUNFJTNEdHJ1ZSUyMHdpbGRmaXJlLWVudiUzQWxhdGVzdA==",highlighted:`<span class="hljs-comment"># Build base image (first time only)</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Build wildfire environment</span> | |
| docker build -t wildfire-env:latest -f envs/wildfire_env/server/Dockerfile . | |
| <span class="hljs-comment"># Run container</span> | |
| docker run -p 8000:8000 -e ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> wildfire-env:latest`,lang:"bash",wrap:!1}}),dt=new w({props:{title:"Local Testing (No Docker)",local:"local-testing-no-docker",headingTag:"h4"}}),mt=new y({props:{code:"JTIzJTIwRW5hYmxlJTIwd2ViJTIwaW50ZXJmYWNlJTIwd2l0aCUyMGZsYWclMEFFTkFCTEVfV0VCX0lOVEVSRkFDRSUzRHRydWUlMjBQWVRIT05QQVRIJTNEc3JjJTIwdXZpY29ybiUyMHNyYy5lbnZzLndpbGRmaXJlX2Vudi5zZXJ2ZXIuYXBwJTNBYXBwJTIwLS1yZWxvYWQlMjAtLWhvc3QlMjAwLjAuMC4wJTIwLS1wb3J0JTIwODAwMA==",highlighted:`<span class="hljs-comment"># Enable web interface with flag</span> | |
| ENABLE_WEB_INTERFACE=<span class="hljs-literal">true</span> PYTHONPATH=src uvicorn src.envs.wildfire_env.server.app:app --reload --host 0.0.0.0 --port 8000`,lang:"bash",wrap:!1}}),Tt=new w({props:{title:"Web Interface Features",local:"web-interface-features",headingTag:"h3"}}),wt=new w({props:{title:"Left Pane: Action Interface",local:"left-pane-action-interface",headingTag:"h4"}}),ct=new w({props:{title:"Right Pane: Visual Grid & Logs",local:"right-pane-visual-grid--logs",headingTag:"h4"}}),Ut=new w({props:{title:"Additional Features",local:"additional-features",headingTag:"h4"}}),bt=new w({props:{title:"Using the Web Interface",local:"using-the-web-interface",headingTag:"h3"}}),ft=new w({props:{title:"๐ง Troubleshooting",local:"-troubleshooting",headingTag:"h2"}}),ht=new w({props:{title:"Common Issues",local:"common-issues",headingTag:"h3"}}),It=new w({props:{title:"1. Connection Errors",local:"1-connection-errors",headingTag:"h4"}}),vt=new w({props:{title:"2. Index Errors",local:"2-index-errors",headingTag:"h4"}}),Bt=new y({props:{code:"JTIzJTIwQWx3YXlzJTIwY2hlY2slMjBib3VuZHMlMjBiZWZvcmUlMjBhY2Nlc3NpbmclMEFpZiUyMDAlMjAlM0MlM0QlMjB4JTIwJTNDJTIwb2JzLndpZHRoJTIwYW5kJTIwMCUyMCUzQyUzRCUyMHklMjAlM0MlMjBvYnMuaGVpZ2h0JTNBJTBBJTIwJTIwJTIwJTIwYWN0aW9uJTIwJTNEJTIwV2lsZGZpcmVBY3Rpb24oYWN0aW9uJTNEJTIyd2F0ZXIlMjIlMkMlMjB4JTNEeCUyQyUyMHklM0R5KQ==",highlighted:`<span class="hljs-comment"># Always check bounds before accessing</span> | |
| <span class="hljs-keyword">if</span> <span class="hljs-number">0</span> <= x < obs.width <span class="hljs-keyword">and</span> <span class="hljs-number">0</span> <= y < obs.height: | |
| action = WildfireAction(action=<span class="hljs-string">"water"</span>, x=x, y=y)`,lang:"python",wrap:!1}}),At=new w({props:{title:"3. Invalid Action Warnings",local:"3-invalid-action-warnings",headingTag:"h4"}}),Qt=new w({props:{title:"4. Grid Format Confusion",local:"4-grid-format-confusion",headingTag:"h4"}}),Xt=new y({props:{code:"JTIzJTIwQ29udmVydCUyMGZsYXQlMjBhcnJheSUyMHRvJTIwMkQlMEFncmlkXzJkJTIwJTNEJTIwbnAuYXJyYXkob2JzLmdyaWQpLnJlc2hhcGUob2JzLmhlaWdodCUyQyUyMG9icy53aWR0aCklMEElMEElMjMlMjBBY2Nlc3MlMjBjZWxsJTIwYXQlMjAoeCUyQyUyMHkpJTBBY2VsbF92YWx1ZSUyMCUzRCUyMGdyaWRfMmQlNUJ5JTVEJTVCeCU1RCUwQSUwQSUyMyUyME9yJTIwdXNlJTIwZmxhdCUyMGluZGV4JTBBaW5kZXglMjAlM0QlMjB5JTIwKiUyMG9icy53aWR0aCUyMCUyQiUyMHglMEFjZWxsX3ZhbHVlJTIwJTNEJTIwb2JzLmdyaWQlNUJpbmRleCU1RA==",highlighted:`<span class="hljs-comment"># Convert flat array to 2D</span> | |
| grid_2d = np.array(obs.grid).reshape(obs.height, obs.width) | |
| <span class="hljs-comment"># Access cell at (x, y)</span> | |
| cell_value = grid_2d[y][x] | |
| <span class="hljs-comment"># Or use flat index</span> | |
| index = y * obs.width + x | |
| cell_value = obs.grid[index]`,lang:"python",wrap:!1}}),Yt=new w({props:{title:"5. Docker Build Failures",local:"5-docker-build-failures",headingTag:"h4"}}),_t=new y({props:{code:"JTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjBmaXJzdCUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjBvcGVuZW52LWJhc2UlM0FsYXRlc3QlMjAtZiUyMHNyYyUyRm9wZW5lbnYlMkZjb3JlJTJGY29udGFpbmVycyUyRmltYWdlcyUyRkRvY2tlcmZpbGUlMjAuJTBBJTBBJTIzJTIwVGhlbiUyMGJ1aWxkJTIwd2lsZGZpcmUlMjBpbWFnZSUwQWRvY2tlciUyMGJ1aWxkJTIwLXQlMjB3aWxkZmlyZS1lbnYlM0FsYXRlc3QlMjAtZiUyMGVudnMlMkZ3aWxkZmlyZV9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLg==",highlighted:`<span class="hljs-comment"># Build base image first</span> | |
| docker build -t openenv-base:latest -f src/openenv/core/containers/images/Dockerfile . | |
| <span class="hljs-comment"># Then build wildfire image</span> | |
| docker build -t wildfire-env:latest -f envs/wildfire_env/server/Dockerfile .`,lang:"bash",wrap:!1}}),Lt=new w({props:{title:"Debugging Tips",local:"debugging-tips",headingTag:"h3"}}),Ft=new y({props:{code:"ZG9ja2VyJTIwbG9ncyUyMC1mJTIwd2lsZGZpcmUtZW52LWNvbnRhaW5lcg==",highlighted:"docker logs -f wildfire-env-container",lang:"bash",wrap:!1}}),Dt=new y({props:{code:"c3RhdGUlMjAlM0QlMjBlbnYuc3RhdGUlMEFwcmludChmJTIyU3RhdGUlM0ElMjAlN0JzdGF0ZSU3RCUyMik=",highlighted:`state = env.state | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"State: <span class="hljs-subst">{state}</span>"</span>)`,lang:"python",wrap:!1}}),Kt=new y({props:{code:"b2JzJTIwJTNEJTIwZW52LnJlc2V0KCkub2JzZXJ2YXRpb24lMEFwcmludChmJTIyQm91bmRzJTNBJTIwMCUyMCUzQyUzRCUyMHglMjAlM0MlMjAlN0JvYnMud2lkdGglN0QlMkMlMjAwJTIwJTNDJTNEJTIweSUyMCUzQyUyMCU3Qm9icy5oZWlnaHQlN0QlMjIpJTBBcHJpbnQoZiUyMlJlc291cmNlcyUzQSUyMFdhdGVyJTNEJTdCb2JzLnJlbWFpbmluZ193YXRlciU3RCUyQyUyMEJyZWFrcyUzRCU3Qm9icy5yZW1haW5pbmdfYnJlYWtzJTdEJTIyKQ==",highlighted:`obs = env.reset().observation | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Bounds: 0 <= x < <span class="hljs-subst">{obs.width}</span>, 0 <= y < <span class="hljs-subst">{obs.height}</span>"</span>) | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Resources: Water=<span class="hljs-subst">{obs.remaining_water}</span>, Breaks=<span class="hljs-subst">{obs.remaining_breaks}</span>"</span>)`,lang:"python",wrap:!1}}),Ot=new y({props:{code:"cHJldl9ncmlkJTIwJTNEJTIwb2JzLmdyaWQuY29weSgpJTBBcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoYWN0aW9uKSUwQW5ld19ncmlkJTIwJTNEJTIwcmVzdWx0Lm9ic2VydmF0aW9uLmdyaWQlMEFjaGFuZ2VzJTIwJTNEJTIwJTVCaSUyMGZvciUyMGklMkMlMjAoYSUyQyUyMGIpJTIwaW4lMjBlbnVtZXJhdGUoemlwKHByZXZfZ3JpZCUyQyUyMG5ld19ncmlkKSklMjBpZiUyMGElMjAhJTNEJTIwYiU1RCUwQXByaW50KGYlMjJDaGFuZ2VkJTIwY2VsbHMlM0ElMjAlN0JsZW4oY2hhbmdlcyklN0QlMjIp",highlighted:`prev_grid = obs.grid.copy() | |
| result = env.step(action) | |
| new_grid = result.observation.grid | |
| changes = [i <span class="hljs-keyword">for</span> i, (a, b) <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(<span class="hljs-built_in">zip</span>(prev_grid, new_grid)) <span class="hljs-keyword">if</span> a != b] | |
| <span class="hljs-built_in">print</span>(<span class="hljs-string">f"Changed cells: <span class="hljs-subst">{<span class="hljs-built_in">len</span>(changes)}</span>"</span>)`,lang:"python",wrap:!1}}),ls=new w({props:{title:"๐ Performance Considerations",local:"-performance-considerations",headingTag:"h2"}}),es=new w({props:{title:"Grid Size Impact",local:"grid-size-impact",headingTag:"h3"}}),ss=new w({props:{title:"Resource Limits",local:"resource-limits",headingTag:"h3"}}),as=new w({props:{title:"Episode Length",local:"episode-length",headingTag:"h3"}}),rs=new w({props:{title:"๐งญ References",local:"-references",headingTag:"h2"}}),ps=new w({props:{title:"Papers & Research",local:"papers--research",headingTag:"h3"}}),Js=new w({props:{title:"OpenEnv Framework",local:"openenv-framework",headingTag:"h3"}}),ds=new w({props:{title:"Related Tools",local:"related-tools",headingTag:"h3"}}),Ts=new w({props:{title:"๐ License",local:"-license",headingTag:"h2"}}),ys=new w({props:{title:"๐ค Contributing",local:"-contributing",headingTag:"h2"}}),us=new w({props:{title:"๐ Citations",local:"-citations",headingTag:"h2"}}),Us=new y({props:{code:"JTQwdGVjaHJlcG9ydCU3QnJvdGhlcm1lbDIwMjJzdXJmYWNlJTJDJTBBJTIwJTIwdGl0bGUlMjAlMjAlMjAlMjAlMjAlM0QlMjAlN0JUaGUlMjBSb3RoZXJtZWwlMjBTdXJmYWNlJTIwRmlyZSUyMFNwcmVhZCUyME1vZGVsJTIwYW5kJTIwQXNzb2NpYXRlZCUyMERldmVsb3BtZW50cyU3RCUyQyUwQSUyMCUyMGF1dGhvciUyMCUyMCUyMCUyMCUzRCUyMCU3QkFuZHJld3MlMkMlMjBQYXRyaWNpYSUyMEwuJTIwYW5kJTIwUm90aGVybWVsJTJDJTIwUmljaGFyZCUyMEMuJTdEJTJDJTBBJTIwJTIweWVhciUyMCUyMCUyMCUyMCUyMCUyMCUzRCUyMCU3QjIwMjIlN0QlMkMlMEElMjAlMjBpbnN0aXR1dGlvbiUyMCUzRCUyMCU3QlVTREElMjBGb3Jlc3QlMjBTZXJ2aWNlJTdEJTJDJTBBJTIwJTIwbnVtYmVyJTIwJTIwJTIwJTIwJTNEJTIwJTdCUk1SUy1HVFItMzcxJTdEJTJDJTBBJTIwJTIwdXJsJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNEJTIwJTdCaHR0cHMlM0ElMkYlMkZ3d3cuZnMudXNkYS5nb3YlMkZybSUyRnB1YnNfc2VyaWVzJTJGcm1ycyUyRmd0ciUyRnJtcnNfZ3RyMzcxLnBkZiU3RCUwQSU3RCUwQSUwQSU0MGFydGljbGUlN0J0YXBsZXkyMDIzcmVpbmZvcmNlbWVudCUyQyUwQSUyMCUyMHRpdGxlJTIwJTIwJTIwJTNEJTIwJTdCUmVpbmZvcmNlbWVudCUyMExlYXJuaW5nJTIwZm9yJTIwV2lsZGZpcmUlMjBNaXRpZ2F0aW9uJTIwaW4lMjBTaW11bGF0ZWQlMjBEaXNhc3RlciUyMEVudmlyb25tZW50cyU3RCUyQyUwQSUyMCUyMGF1dGhvciUyMCUyMCUzRCUyMCU3QlRhcGxleSUyQyUyMEEuJTIwYW5kJTIwRG90dGVyJTJDJTIwTS4lMjBhbmQlMjBEb3lsZSUyQyUyME0uJTIwYW5kJTIwb3RoZXJzJTdEJTJDJTBBJTIwJTIwam91cm5hbCUyMCUzRCUyMCU3QmFyWGl2JTIwcHJlcHJpbnQlMjBhclhpdiUzQTIzMTEuMTU5MjUlN0QlMkMlMEElMjAlMjB5ZWFyJTIwJTIwJTIwJTIwJTNEJTIwJTdCMjAyMyU3RCUyQyUwQSUyMCUyMHVybCUyMCUyMCUyMCUyMCUyMCUzRCUyMCU3Qmh0dHBzJTNBJTJGJTJGYXJ4aXYub3JnJTJGYWJzJTJGMjMxMS4xNTkyNSU3RCUwQSU3RCUwQSUwQSU0MG1pc2MlN0JtaXRyZWZpcmVsaW5lMjAyM3NpbWZpcmUlMkMlMEElMjAlMjBhdXRob3IlMjAlM0QlMjAlN0IlN0JNSVRSRSUyMEZpcmVsaW5lJTIwUHJvamVjdCU3RCU3RCUyQyUwQSUyMCUyMHRpdGxlJTIwJTIwJTNEJTIwJTdCU2ltRmlyZSUzQSUyMFdpbGRmaXJlJTIwU2ltdWxhdG9yJTIwZm9yJTIwRGVjaXNpb24tU3VwcG9ydCUyMGFuZCUyMEFJJTIwUmVzZWFyY2glN0QlMkMlMEElMjAlMjB5ZWFyJTIwJTIwJTIwJTNEJTIwJTdCMjAyMyU3RCUyQyUwQSUyMCUyMGhvd3B1Ymxpc2hlZCUyMCUzRCUyMCU3QiU1Q3VybCU3Qmh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRm1pdHJlZmlyZWxpbmUlMkZzaW1maXJlJTdEJTdEJTBBJTdEJTBBJTBBJTQwbWlzYyU3QndpbGRmaXJlLW9wZW5lbnYtMjAyNSUyQyUwQSUyMCUyMHRpdGxlJTIwJTIwJTNEJTIwJTdCV2lsZGZpcmUlMjBFbnZpcm9ubWVudCUyMGZvciUyME9wZW5FbnYlM0ElMjBDb250YWlubWVudC1Gb2N1c2VkJTIwUkwlMjBTaW11bGF0aW9uJTdEJTJDJTBBJTIwJTIwYXV0aG9yJTIwJTNEJTIwJTdCT3BlbkVudiUyMENvbnRyaWJ1dG9ycyU3RCUyQyUwQSUyMCUyMHllYXIlMjAlMjAlMjAlM0QlMjAlN0IyMDI1JTdEJTJDJTBBJTIwJTIwdXJsJTIwJTIwJTIwJTIwJTNEJTIwJTdCaHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGb3BlbmVudiUyRm9wZW5lbnYlN0QlMEElN0Q=",highlighted:`<span class="language-xml">@techreport</span><span class="hljs-template-variable">{rothermel2022surface, | |
| title = {The Rothermel Surface Fire Spread Model and Associated Developments}</span><span class="language-xml">, | |
| author = </span><span class="hljs-template-variable">{Andrews, Patricia L. and Rothermel, Richard C.}</span><span class="language-xml">, | |
| year = </span><span class="hljs-template-variable">{2022}</span><span class="language-xml">, | |
| institution = </span><span class="hljs-template-variable">{USDA Forest Service}</span><span class="language-xml">, | |
| number = </span><span class="hljs-template-variable">{RMRS-GTR-371}</span><span class="language-xml">, | |
| url = </span><span class="hljs-template-variable">{https://www.fs.usda.gov/rm/pubs_series/rmrs/gtr/rmrs_gtr371.pdf}</span><span class="language-xml"> | |
| } | |
| @article</span><span class="hljs-template-variable">{tapley2023reinforcement, | |
| title = {Reinforcement Learning for Wildfire Mitigation in Simulated Disaster Environments}</span><span class="language-xml">, | |
| author = </span><span class="hljs-template-variable">{Tapley, A. and Dotter, M. and Doyle, M. and others}</span><span class="language-xml">, | |
| journal = </span><span class="hljs-template-variable">{arXiv preprint arXiv:2311.15925}</span><span class="language-xml">, | |
| year = </span><span class="hljs-template-variable">{2023}</span><span class="language-xml">, | |
| url = </span><span class="hljs-template-variable">{https://arxiv.org/abs/2311.15925}</span><span class="language-xml"> | |
| } | |
| @misc</span><span class="hljs-template-variable">{mitrefireline2023simfire, | |
| author = {{MITRE Fireline Project}</span><span class="language-xml">}, | |
| title = </span><span class="hljs-template-variable">{SimFire: Wildfire Simulator for Decision-Support and AI Research}</span><span class="language-xml">, | |
| year = </span><span class="hljs-template-variable">{2023}</span><span class="language-xml">, | |
| howpublished = </span><span class="hljs-template-variable">{\\url{https://github.com/mitrefireline/simfire}</span><span class="language-xml">} | |
| } | |
| @misc</span><span class="hljs-template-variable">{wildfire-openenv-2025, | |
| title = {Wildfire Environment for OpenEnv: Containment-Focused RL Simulation}</span><span class="language-xml">, | |
| author = </span><span class="hljs-template-variable">{OpenEnv Contributors}</span><span class="language-xml">, | |
| year = </span><span class="hljs-template-variable">{2025}</span><span class="language-xml">, | |
| url = </span><span class="hljs-template-variable">{https://github.com/openenv/openenv}</span><span class="language-xml"> | |
| }</span>`,lang:"bibtex",wrap:!1}}),bs=new gJ({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/wildfire.md"}}),{c(){U=d("meta"),vs=n(),$s=d("p"),Es=n(),i(b.$$.fragment),Zs=n(),i(g.$$.fragment),Bs=n(),f=d("p"),f.innerHTML=Ap,As=n(),h=d("p"),h.innerHTML=kp,ks=n(),Gs=d("hr"),Rs=n(),i(I.$$.fragment),Qs=n(),C=d("ol"),C.innerHTML=Gp,Ns=n(),Vs=d("hr"),Xs=n(),i($.$$.fragment),Ys=n(),W=d("p"),W.innerHTML=Rp,Ss=n(),i(v.$$.fragment),xs=n(),E=d("p"),E.textContent=Qp,_s=n(),Z=d("ul"),Z.innerHTML=Np,Ls=n(),i(B.$$.fragment),Hs=n(),A=d("table"),A.innerHTML=Vp,Fs=n(),k=d("p"),k.innerHTML=Xp,zs=n(),Ds=d("hr"),qs=n(),i(G.$$.fragment),Ks=n(),i(R.$$.fragment),Ps=n(),i(Q.$$.fragment),Os=n(),N=d("p"),N.innerHTML=Yp,ln=n(),i(V.$$.fragment),en=n(),i(X.$$.fragment),tn=n(),sn=d("hr"),nn=n(),i(Y.$$.fragment),an=n(),S=d("p"),S.innerHTML=Sp,rn=n(),x=d("ul"),x.innerHTML=xp,pn=n(),_=d("p"),_.innerHTML=_p,Mn=n(),i(L.$$.fragment),Jn=n(),H=d("p"),H.textContent=Lp,on=n(),F=d("ul"),F.innerHTML=Hp,dn=n(),mn=d("hr"),Tn=n(),i(z.$$.fragment),wn=n(),i(D.$$.fragment),yn=n(),q=d("p"),q.innerHTML=Fp,cn=n(),i(K.$$.fragment),un=n(),P=d("p"),P.innerHTML=zp,Un=n(),i(O.$$.fragment),jn=n(),i(ll.$$.fragment),bn=n(),el=d("table"),el.innerHTML=Dp,gn=n(),i(tl.$$.fragment),fn=n(),i(sl.$$.fragment),hn=n(),In=d("hr"),Cn=n(),i(nl.$$.fragment),$n=n(),i(al.$$.fragment),Wn=n(),i(il.$$.fragment),vn=n(),rl=d("p"),rl.innerHTML=qp,En=n(),i(pl.$$.fragment),Zn=n(),Ml=d("p"),Ml.innerHTML=Kp,Bn=n(),Jl=d("ul"),Jl.innerHTML=Pp,An=n(),ol=d("p"),ol.innerHTML=Op,kn=n(),dl=d("p"),dl.innerHTML=lM,Gn=n(),Rn=d("hr"),Qn=n(),i(ml.$$.fragment),Nn=n(),Tl=d("p"),Tl.innerHTML=eM,Vn=n(),i(wl.$$.fragment),Xn=n(),yl=d("p"),yl.innerHTML=tM,Yn=n(),cl=d("ul"),cl.innerHTML=sM,Sn=n(),ul=d("p"),ul.innerHTML=nM,xn=n(),Ul=d("p"),Ul.innerHTML=aM,_n=n(),Ln=d("hr"),Hn=n(),i(jl.$$.fragment),Fn=n(),bl=d("p"),bl.innerHTML=iM,zn=n(),i(gl.$$.fragment),Dn=n(),fl=d("p"),fl.innerHTML=rM,qn=n(),hl=d("ul"),hl.innerHTML=pM,Kn=n(),Il=d("p"),Il.innerHTML=MM,Pn=n(),On=d("hr"),la=n(),i(Cl.$$.fragment),ea=n(),$l=d("p"),$l.innerHTML=JM,ta=n(),Wl=d("ul"),Wl.innerHTML=oM,sa=n(),na=d("hr"),aa=n(),i(vl.$$.fragment),ia=n(),i(El.$$.fragment),ra=n(),Zl=d("p"),Zl.innerHTML=dM,pa=n(),i(Bl.$$.fragment),Ma=n(),i(Al.$$.fragment),Ja=n(),i(kl.$$.fragment),oa=n(),da=d("hr"),ma=n(),i(Gl.$$.fragment),Ta=n(),i(Rl.$$.fragment),wa=n(),Ql=d("table"),Ql.innerHTML=mM,ya=n(),i(Nl.$$.fragment),ca=n(),Vl=d("p"),Vl.innerHTML=TM,ua=n(),Xl=d("ul"),Xl.innerHTML=wM,Ua=n(),Yl=d("p"),Yl.innerHTML=yM,ja=n(),i(Sl.$$.fragment),ba=n(),i(xl.$$.fragment),ga=n(),_l=d("ul"),_l.innerHTML=cM,fa=n(),ha=d("hr"),Ia=n(),i(Ll.$$.fragment),Ca=n(),i(Hl.$$.fragment),$a=n(),Fl=d("p"),Fl.innerHTML=uM,Wa=n(),zl=d("ol"),zl.innerHTML=UM,va=n(),i(Dl.$$.fragment),Ea=n(),ql=d("table"),ql.innerHTML=jM,Za=n(),i(Kl.$$.fragment),Ba=n(),Pl=d("p"),Pl.innerHTML=bM,Aa=n(),i(Ol.$$.fragment),ka=n(),i(le.$$.fragment),Ga=n(),Ra=d("hr"),Qa=n(),i(ee.$$.fragment),Na=n(),i(te.$$.fragment),Va=n(),se=d("p"),se.innerHTML=gM,Xa=n(),ne=d("table"),ne.innerHTML=fM,Ya=n(),i(ae.$$.fragment),Sa=n(),i(ie.$$.fragment),xa=n(),i(re.$$.fragment),_a=n(),i(pe.$$.fragment),La=n(),i(Me.$$.fragment),Ha=n(),i(Je.$$.fragment),Fa=n(),za=d("hr"),Da=n(),i(oe.$$.fragment),qa=n(),i(de.$$.fragment),Ka=n(),me=d("p"),me.innerHTML=hM,Pa=n(),i(Te.$$.fragment),Oa=n(),we=d("p"),we.textContent=IM,li=n(),ye=d("ul"),ye.innerHTML=CM,ei=n(),ce=d("p"),ce.innerHTML=$M,ti=n(),i(ue.$$.fragment),si=n(),i(Ue.$$.fragment),ni=n(),je=d("p"),je.innerHTML=WM,ai=n(),i(be.$$.fragment),ii=n(),ge=d("p"),ge.innerHTML=vM,ri=n(),i(fe.$$.fragment),pi=n(),he=d("p"),he.innerHTML=EM,Mi=n(),i(Ie.$$.fragment),Ji=n(),oi=d("hr"),di=n(),i(Ce.$$.fragment),mi=n(),i($e.$$.fragment),Ti=n(),i(We.$$.fragment),wi=n(),i(ve.$$.fragment),yi=n(),i(Ee.$$.fragment),ci=n(),Ze=d("p"),Ze.textContent=ZM,ui=n(),i(Be.$$.fragment),Ui=n(),i(Ae.$$.fragment),ji=n(),ke=d("p"),ke.textContent=BM,bi=n(),i(Ge.$$.fragment),gi=n(),i(Re.$$.fragment),fi=n(),Qe=d("p"),Qe.textContent=AM,hi=n(),i(Ne.$$.fragment),Ii=n(),i(Ve.$$.fragment),Ci=n(),Xe=d("p"),Xe.textContent=kM,$i=n(),i(Ye.$$.fragment),Wi=n(),i(Se.$$.fragment),vi=n(),i(xe.$$.fragment),Ei=n(),i(_e.$$.fragment),Zi=n(),Le=d("p"),Le.innerHTML=GM,Bi=n(),i(He.$$.fragment),Ai=n(),i(Fe.$$.fragment),ki=n(),ze=d("p"),ze.innerHTML=RM,Gi=n(),i(De.$$.fragment),Ri=n(),i(qe.$$.fragment),Qi=n(),Ni=d("hr"),Vi=n(),i(Ke.$$.fragment),Xi=n(),i(Pe.$$.fragment),Yi=n(),i(Oe.$$.fragment),Si=n(),i(lt.$$.fragment),xi=n(),i(et.$$.fragment),_i=n(),i(tt.$$.fragment),Li=n(),i(st.$$.fragment),Hi=n(),i(nt.$$.fragment),Fi=n(),i(at.$$.fragment),zi=n(),Di=d("hr"),qi=n(),i(it.$$.fragment),Ki=n(),rt=d("p"),rt.innerHTML=QM,Pi=n(),i(pt.$$.fragment),Oi=n(),i(Mt.$$.fragment),lr=n(),i(Jt.$$.fragment),er=n(),ot=d("p"),ot.innerHTML=NM,tr=n(),i(dt.$$.fragment),sr=n(),i(mt.$$.fragment),nr=n(),i(Tt.$$.fragment),ar=n(),i(wt.$$.fragment),ir=n(),yt=d("ul"),yt.innerHTML=VM,rr=n(),i(ct.$$.fragment),pr=n(),ut=d("ul"),ut.innerHTML=XM,Mr=n(),i(Ut.$$.fragment),Jr=n(),jt=d("ul"),jt.innerHTML=YM,or=n(),i(bt.$$.fragment),dr=n(),gt=d("ol"),gt.innerHTML=SM,mr=n(),Tr=d("hr"),wr=n(),i(ft.$$.fragment),yr=n(),i(ht.$$.fragment),cr=n(),i(It.$$.fragment),ur=n(),Ct=d("p"),Ct.innerHTML=xM,Ur=n(),$t=d("p"),$t.innerHTML=_M,jr=n(),Wt=d("ul"),Wt.innerHTML=LM,br=n(),i(vt.$$.fragment),gr=n(),Et=d("p"),Et.innerHTML=HM,fr=n(),Zt=d("p"),Zt.innerHTML=FM,hr=n(),i(Bt.$$.fragment),Ir=n(),i(At.$$.fragment),Cr=n(),kt=d("p"),kt.innerHTML=zM,$r=n(),Gt=d("p"),Gt.innerHTML=DM,Wr=n(),Rt=d("ul"),Rt.innerHTML=qM,vr=n(),i(Qt.$$.fragment),Er=n(),Nt=d("p"),Nt.innerHTML=KM,Zr=n(),Vt=d("p"),Vt.innerHTML=PM,Br=n(),i(Xt.$$.fragment),Ar=n(),i(Yt.$$.fragment),kr=n(),St=d("p"),St.innerHTML=OM,Gr=n(),xt=d("p"),xt.innerHTML=lJ,Rr=n(),i(_t.$$.fragment),Qr=n(),i(Lt.$$.fragment),Nr=n(),u=d("ol"),Ht=d("li"),fs=d("p"),fs.innerHTML=eJ,Ip=n(),i(Ft.$$.fragment),Cp=n(),zt=d("li"),hs=d("p"),hs.innerHTML=tJ,$p=n(),i(Dt.$$.fragment),Wp=n(),qt=d("li"),Is=d("p"),Is.innerHTML=sJ,vp=n(),i(Kt.$$.fragment),Ep=n(),Pt=d("li"),Cs=d("p"),Cs.innerHTML=nJ,Zp=n(),i(Ot.$$.fragment),Vr=n(),Xr=d("hr"),Yr=n(),i(ls.$$.fragment),Sr=n(),i(es.$$.fragment),xr=n(),ts=d("ul"),ts.innerHTML=aJ,_r=n(),i(ss.$$.fragment),Lr=n(),ns=d("ul"),ns.innerHTML=iJ,Hr=n(),i(as.$$.fragment),Fr=n(),is=d("ul"),is.innerHTML=rJ,zr=n(),Dr=d("hr"),qr=n(),i(rs.$$.fragment),Kr=n(),i(ps.$$.fragment),Pr=n(),Ms=d("ul"),Ms.innerHTML=pJ,Or=n(),i(Js.$$.fragment),lp=n(),os=d("ul"),os.innerHTML=MJ,ep=n(),i(ds.$$.fragment),tp=n(),ms=d("ul"),ms.innerHTML=JJ,sp=n(),np=d("hr"),ap=n(),i(Ts.$$.fragment),ip=n(),ws=d("p"),ws.textContent=oJ,rp=n(),pp=d("hr"),Mp=n(),i(ys.$$.fragment),Jp=n(),cs=d("p"),cs.innerHTML=dJ,op=n(),dp=d("hr"),mp=n(),i(us.$$.fragment),Tp=n(),i(Us.$$.fragment),wp=n(),yp=d("hr"),cp=n(),js=d("p"),js.innerHTML=mJ,up=n(),i(bs.$$.fragment),Up=n(),Ws=d("p"),this.h()},l(l){const e=jJ("svelte-u9bgzb",document.head);U=m(e,"META",{name:!0,content:!0}),e.forEach(t),vs=a(l),$s=m(l,"P",{}),gs($s).forEach(t),Es=a(l),r(b.$$.fragment,l),Zs=a(l),r(g.$$.fragment,l),Bs=a(l),f=m(l,"P",{"data-svelte-h":!0}),T(f)!=="svelte-1hlyeff"&&(f.innerHTML=Ap),As=a(l),h=m(l,"P",{"data-svelte-h":!0}),T(h)!=="svelte-vlpx44"&&(h.innerHTML=kp),ks=a(l),Gs=m(l,"HR",{}),Rs=a(l),r(I.$$.fragment,l),Qs=a(l),C=m(l,"OL",{"data-svelte-h":!0}),T(C)!=="svelte-1xzv4j"&&(C.innerHTML=Gp),Ns=a(l),Vs=m(l,"HR",{}),Xs=a(l),r($.$$.fragment,l),Ys=a(l),W=m(l,"P",{"data-svelte-h":!0}),T(W)!=="svelte-1g77887"&&(W.innerHTML=Rp),Ss=a(l),r(v.$$.fragment,l),xs=a(l),E=m(l,"P",{"data-svelte-h":!0}),T(E)!=="svelte-13aoomy"&&(E.textContent=Qp),_s=a(l),Z=m(l,"UL",{"data-svelte-h":!0}),T(Z)!=="svelte-r4sup3"&&(Z.innerHTML=Np),Ls=a(l),r(B.$$.fragment,l),Hs=a(l),A=m(l,"TABLE",{"data-svelte-h":!0}),T(A)!=="svelte-1x69v2o"&&(A.innerHTML=Vp),Fs=a(l),k=m(l,"P",{"data-svelte-h":!0}),T(k)!=="svelte-1nop1ta"&&(k.innerHTML=Xp),zs=a(l),Ds=m(l,"HR",{}),qs=a(l),r(G.$$.fragment,l),Ks=a(l),r(R.$$.fragment,l),Ps=a(l),r(Q.$$.fragment,l),Os=a(l),N=m(l,"P",{"data-svelte-h":!0}),T(N)!=="svelte-p21mtn"&&(N.innerHTML=Yp),ln=a(l),r(V.$$.fragment,l),en=a(l),r(X.$$.fragment,l),tn=a(l),sn=m(l,"HR",{}),nn=a(l),r(Y.$$.fragment,l),an=a(l),S=m(l,"P",{"data-svelte-h":!0}),T(S)!=="svelte-62mlye"&&(S.innerHTML=Sp),rn=a(l),x=m(l,"UL",{"data-svelte-h":!0}),T(x)!=="svelte-18gmaem"&&(x.innerHTML=xp),pn=a(l),_=m(l,"P",{"data-svelte-h":!0}),T(_)!=="svelte-53syuy"&&(_.innerHTML=_p),Mn=a(l),r(L.$$.fragment,l),Jn=a(l),H=m(l,"P",{"data-svelte-h":!0}),T(H)!=="svelte-11yluwi"&&(H.textContent=Lp),on=a(l),F=m(l,"UL",{"data-svelte-h":!0}),T(F)!=="svelte-1i8gbtu"&&(F.innerHTML=Hp),dn=a(l),mn=m(l,"HR",{}),Tn=a(l),r(z.$$.fragment,l),wn=a(l),r(D.$$.fragment,l),yn=a(l),q=m(l,"P",{"data-svelte-h":!0}),T(q)!=="svelte-1u45qo3"&&(q.innerHTML=Fp),cn=a(l),r(K.$$.fragment,l),un=a(l),P=m(l,"P",{"data-svelte-h":!0}),T(P)!=="svelte-25eu1r"&&(P.innerHTML=zp),Un=a(l),r(O.$$.fragment,l),jn=a(l),r(ll.$$.fragment,l),bn=a(l),el=m(l,"TABLE",{"data-svelte-h":!0}),T(el)!=="svelte-1q324k7"&&(el.innerHTML=Dp),gn=a(l),r(tl.$$.fragment,l),fn=a(l),r(sl.$$.fragment,l),hn=a(l),In=m(l,"HR",{}),Cn=a(l),r(nl.$$.fragment,l),$n=a(l),r(al.$$.fragment,l),Wn=a(l),r(il.$$.fragment,l),vn=a(l),rl=m(l,"P",{"data-svelte-h":!0}),T(rl)!=="svelte-1t3cle2"&&(rl.innerHTML=qp),En=a(l),r(pl.$$.fragment,l),Zn=a(l),Ml=m(l,"P",{"data-svelte-h":!0}),T(Ml)!=="svelte-1i31xqp"&&(Ml.innerHTML=Kp),Bn=a(l),Jl=m(l,"UL",{"data-svelte-h":!0}),T(Jl)!=="svelte-151tjwt"&&(Jl.innerHTML=Pp),An=a(l),ol=m(l,"P",{"data-svelte-h":!0}),T(ol)!=="svelte-18u9ko3"&&(ol.innerHTML=Op),kn=a(l),dl=m(l,"P",{"data-svelte-h":!0}),T(dl)!=="svelte-19jp5ur"&&(dl.innerHTML=lM),Gn=a(l),Rn=m(l,"HR",{}),Qn=a(l),r(ml.$$.fragment,l),Nn=a(l),Tl=m(l,"P",{"data-svelte-h":!0}),T(Tl)!=="svelte-d8txy5"&&(Tl.innerHTML=eM),Vn=a(l),r(wl.$$.fragment,l),Xn=a(l),yl=m(l,"P",{"data-svelte-h":!0}),T(yl)!=="svelte-1i31xqp"&&(yl.innerHTML=tM),Yn=a(l),cl=m(l,"UL",{"data-svelte-h":!0}),T(cl)!=="svelte-1utg15y"&&(cl.innerHTML=sM),Sn=a(l),ul=m(l,"P",{"data-svelte-h":!0}),T(ul)!=="svelte-1q1xosf"&&(ul.innerHTML=nM),xn=a(l),Ul=m(l,"P",{"data-svelte-h":!0}),T(Ul)!=="svelte-1a52atz"&&(Ul.innerHTML=aM),_n=a(l),Ln=m(l,"HR",{}),Hn=a(l),r(jl.$$.fragment,l),Fn=a(l),bl=m(l,"P",{"data-svelte-h":!0}),T(bl)!=="svelte-1on30yo"&&(bl.innerHTML=iM),zn=a(l),r(gl.$$.fragment,l),Dn=a(l),fl=m(l,"P",{"data-svelte-h":!0}),T(fl)!=="svelte-1i31xqp"&&(fl.innerHTML=rM),qn=a(l),hl=m(l,"UL",{"data-svelte-h":!0}),T(hl)!=="svelte-8zp27w"&&(hl.innerHTML=pM),Kn=a(l),Il=m(l,"P",{"data-svelte-h":!0}),T(Il)!=="svelte-1ch290u"&&(Il.innerHTML=MM),Pn=a(l),On=m(l,"HR",{}),la=a(l),r(Cl.$$.fragment,l),ea=a(l),$l=m(l,"P",{"data-svelte-h":!0}),T($l)!=="svelte-dayyjg"&&($l.innerHTML=JM),ta=a(l),Wl=m(l,"UL",{"data-svelte-h":!0}),T(Wl)!=="svelte-1l0pyyx"&&(Wl.innerHTML=oM),sa=a(l),na=m(l,"HR",{}),aa=a(l),r(vl.$$.fragment,l),ia=a(l),r(El.$$.fragment,l),ra=a(l),Zl=m(l,"P",{"data-svelte-h":!0}),T(Zl)!=="svelte-6tmlwi"&&(Zl.innerHTML=dM),pa=a(l),r(Bl.$$.fragment,l),Ma=a(l),r(Al.$$.fragment,l),Ja=a(l),r(kl.$$.fragment,l),oa=a(l),da=m(l,"HR",{}),ma=a(l),r(Gl.$$.fragment,l),Ta=a(l),r(Rl.$$.fragment,l),wa=a(l),Ql=m(l,"TABLE",{"data-svelte-h":!0}),T(Ql)!=="svelte-1y63gbv"&&(Ql.innerHTML=mM),ya=a(l),r(Nl.$$.fragment,l),ca=a(l),Vl=m(l,"P",{"data-svelte-h":!0}),T(Vl)!=="svelte-pk8aeb"&&(Vl.innerHTML=TM),ua=a(l),Xl=m(l,"UL",{"data-svelte-h":!0}),T(Xl)!=="svelte-1beka8w"&&(Xl.innerHTML=wM),Ua=a(l),Yl=m(l,"P",{"data-svelte-h":!0}),T(Yl)!=="svelte-jei7lx"&&(Yl.innerHTML=yM),ja=a(l),r(Sl.$$.fragment,l),ba=a(l),r(xl.$$.fragment,l),ga=a(l),_l=m(l,"UL",{"data-svelte-h":!0}),T(_l)!=="svelte-1il8qnv"&&(_l.innerHTML=cM),fa=a(l),ha=m(l,"HR",{}),Ia=a(l),r(Ll.$$.fragment,l),Ca=a(l),r(Hl.$$.fragment,l),$a=a(l),Fl=m(l,"P",{"data-svelte-h":!0}),T(Fl)!=="svelte-395i10"&&(Fl.innerHTML=uM),Wa=a(l),zl=m(l,"OL",{"data-svelte-h":!0}),T(zl)!=="svelte-1c5w2nr"&&(zl.innerHTML=UM),va=a(l),r(Dl.$$.fragment,l),Ea=a(l),ql=m(l,"TABLE",{"data-svelte-h":!0}),T(ql)!=="svelte-1wyvjyb"&&(ql.innerHTML=jM),Za=a(l),r(Kl.$$.fragment,l),Ba=a(l),Pl=m(l,"P",{"data-svelte-h":!0}),T(Pl)!=="svelte-1ihv51i"&&(Pl.innerHTML=bM),Aa=a(l),r(Ol.$$.fragment,l),ka=a(l),r(le.$$.fragment,l),Ga=a(l),Ra=m(l,"HR",{}),Qa=a(l),r(ee.$$.fragment,l),Na=a(l),r(te.$$.fragment,l),Va=a(l),se=m(l,"P",{"data-svelte-h":!0}),T(se)!=="svelte-1i2fdzj"&&(se.innerHTML=gM),Xa=a(l),ne=m(l,"TABLE",{"data-svelte-h":!0}),T(ne)!=="svelte-ggqs76"&&(ne.innerHTML=fM),Ya=a(l),r(ae.$$.fragment,l),Sa=a(l),r(ie.$$.fragment,l),xa=a(l),r(re.$$.fragment,l),_a=a(l),r(pe.$$.fragment,l),La=a(l),r(Me.$$.fragment,l),Ha=a(l),r(Je.$$.fragment,l),Fa=a(l),za=m(l,"HR",{}),Da=a(l),r(oe.$$.fragment,l),qa=a(l),r(de.$$.fragment,l),Ka=a(l),me=m(l,"P",{"data-svelte-h":!0}),T(me)!=="svelte-1d4d8dy"&&(me.innerHTML=hM),Pa=a(l),r(Te.$$.fragment,l),Oa=a(l),we=m(l,"P",{"data-svelte-h":!0}),T(we)!=="svelte-1nyw8x2"&&(we.textContent=IM),li=a(l),ye=m(l,"UL",{"data-svelte-h":!0}),T(ye)!=="svelte-a68ff3"&&(ye.innerHTML=CM),ei=a(l),ce=m(l,"P",{"data-svelte-h":!0}),T(ce)!=="svelte-bwwiq7"&&(ce.innerHTML=$M),ti=a(l),r(ue.$$.fragment,l),si=a(l),r(Ue.$$.fragment,l),ni=a(l),je=m(l,"P",{"data-svelte-h":!0}),T(je)!=="svelte-11lzvnb"&&(je.innerHTML=WM),ai=a(l),r(be.$$.fragment,l),ii=a(l),ge=m(l,"P",{"data-svelte-h":!0}),T(ge)!=="svelte-hnp2q3"&&(ge.innerHTML=vM),ri=a(l),r(fe.$$.fragment,l),pi=a(l),he=m(l,"P",{"data-svelte-h":!0}),T(he)!=="svelte-15un75k"&&(he.innerHTML=EM),Mi=a(l),r(Ie.$$.fragment,l),Ji=a(l),oi=m(l,"HR",{}),di=a(l),r(Ce.$$.fragment,l),mi=a(l),r($e.$$.fragment,l),Ti=a(l),r(We.$$.fragment,l),wi=a(l),r(ve.$$.fragment,l),yi=a(l),r(Ee.$$.fragment,l),ci=a(l),Ze=m(l,"P",{"data-svelte-h":!0}),T(Ze)!=="svelte-piprhw"&&(Ze.textContent=ZM),ui=a(l),r(Be.$$.fragment,l),Ui=a(l),r(Ae.$$.fragment,l),ji=a(l),ke=m(l,"P",{"data-svelte-h":!0}),T(ke)!=="svelte-1eklf63"&&(ke.textContent=BM),bi=a(l),r(Ge.$$.fragment,l),gi=a(l),r(Re.$$.fragment,l),fi=a(l),Qe=m(l,"P",{"data-svelte-h":!0}),T(Qe)!=="svelte-1r0kcjj"&&(Qe.textContent=AM),hi=a(l),r(Ne.$$.fragment,l),Ii=a(l),r(Ve.$$.fragment,l),Ci=a(l),Xe=m(l,"P",{"data-svelte-h":!0}),T(Xe)!=="svelte-1xutmkf"&&(Xe.textContent=kM),$i=a(l),r(Ye.$$.fragment,l),Wi=a(l),r(Se.$$.fragment,l),vi=a(l),r(xe.$$.fragment,l),Ei=a(l),r(_e.$$.fragment,l),Zi=a(l),Le=m(l,"P",{"data-svelte-h":!0}),T(Le)!=="svelte-1r5zqy"&&(Le.innerHTML=GM),Bi=a(l),r(He.$$.fragment,l),Ai=a(l),r(Fe.$$.fragment,l),ki=a(l),ze=m(l,"P",{"data-svelte-h":!0}),T(ze)!=="svelte-1gcqghd"&&(ze.innerHTML=RM),Gi=a(l),r(De.$$.fragment,l),Ri=a(l),r(qe.$$.fragment,l),Qi=a(l),Ni=m(l,"HR",{}),Vi=a(l),r(Ke.$$.fragment,l),Xi=a(l),r(Pe.$$.fragment,l),Yi=a(l),r(Oe.$$.fragment,l),Si=a(l),r(lt.$$.fragment,l),xi=a(l),r(et.$$.fragment,l),_i=a(l),r(tt.$$.fragment,l),Li=a(l),r(st.$$.fragment,l),Hi=a(l),r(nt.$$.fragment,l),Fi=a(l),r(at.$$.fragment,l),zi=a(l),Di=m(l,"HR",{}),qi=a(l),r(it.$$.fragment,l),Ki=a(l),rt=m(l,"P",{"data-svelte-h":!0}),T(rt)!=="svelte-1v4y4i0"&&(rt.innerHTML=QM),Pi=a(l),r(pt.$$.fragment,l),Oi=a(l),r(Mt.$$.fragment,l),lr=a(l),r(Jt.$$.fragment,l),er=a(l),ot=m(l,"P",{"data-svelte-h":!0}),T(ot)!=="svelte-1vb5qgw"&&(ot.innerHTML=NM),tr=a(l),r(dt.$$.fragment,l),sr=a(l),r(mt.$$.fragment,l),nr=a(l),r(Tt.$$.fragment,l),ar=a(l),r(wt.$$.fragment,l),ir=a(l),yt=m(l,"UL",{"data-svelte-h":!0}),T(yt)!=="svelte-1y6rahy"&&(yt.innerHTML=VM),rr=a(l),r(ct.$$.fragment,l),pr=a(l),ut=m(l,"UL",{"data-svelte-h":!0}),T(ut)!=="svelte-1c5sn9p"&&(ut.innerHTML=XM),Mr=a(l),r(Ut.$$.fragment,l),Jr=a(l),jt=m(l,"UL",{"data-svelte-h":!0}),T(jt)!=="svelte-7wes8n"&&(jt.innerHTML=YM),or=a(l),r(bt.$$.fragment,l),dr=a(l),gt=m(l,"OL",{"data-svelte-h":!0}),T(gt)!=="svelte-gu5fe9"&&(gt.innerHTML=SM),mr=a(l),Tr=m(l,"HR",{}),wr=a(l),r(ft.$$.fragment,l),yr=a(l),r(ht.$$.fragment,l),cr=a(l),r(It.$$.fragment,l),ur=a(l),Ct=m(l,"P",{"data-svelte-h":!0}),T(Ct)!=="svelte-1dw4drm"&&(Ct.innerHTML=xM),Ur=a(l),$t=m(l,"P",{"data-svelte-h":!0}),T($t)!=="svelte-1h4rprr"&&($t.innerHTML=_M),jr=a(l),Wt=m(l,"UL",{"data-svelte-h":!0}),T(Wt)!=="svelte-9qsvqz"&&(Wt.innerHTML=LM),br=a(l),r(vt.$$.fragment,l),gr=a(l),Et=m(l,"P",{"data-svelte-h":!0}),T(Et)!=="svelte-1a7imgp"&&(Et.innerHTML=HM),fr=a(l),Zt=m(l,"P",{"data-svelte-h":!0}),T(Zt)!=="svelte-1upttbv"&&(Zt.innerHTML=FM),hr=a(l),r(Bt.$$.fragment,l),Ir=a(l),r(At.$$.fragment,l),Cr=a(l),kt=m(l,"P",{"data-svelte-h":!0}),T(kt)!=="svelte-1jjx9nb"&&(kt.innerHTML=zM),$r=a(l),Gt=m(l,"P",{"data-svelte-h":!0}),T(Gt)!=="svelte-1h4rprr"&&(Gt.innerHTML=DM),Wr=a(l),Rt=m(l,"UL",{"data-svelte-h":!0}),T(Rt)!=="svelte-1d9g5wx"&&(Rt.innerHTML=qM),vr=a(l),r(Qt.$$.fragment,l),Er=a(l),Nt=m(l,"P",{"data-svelte-h":!0}),T(Nt)!=="svelte-1hky62d"&&(Nt.innerHTML=KM),Zr=a(l),Vt=m(l,"P",{"data-svelte-h":!0}),T(Vt)!=="svelte-lx7lp6"&&(Vt.innerHTML=PM),Br=a(l),r(Xt.$$.fragment,l),Ar=a(l),r(Yt.$$.fragment,l),kr=a(l),St=m(l,"P",{"data-svelte-h":!0}),T(St)!=="svelte-z6a5ii"&&(St.innerHTML=OM),Gr=a(l),xt=m(l,"P",{"data-svelte-h":!0}),T(xt)!=="svelte-lx7lp6"&&(xt.innerHTML=lJ),Rr=a(l),r(_t.$$.fragment,l),Qr=a(l),r(Lt.$$.fragment,l),Nr=a(l),u=m(l,"OL",{});var j=gs(u);Ht=m(j,"LI",{});var bp=gs(Ht);fs=m(bp,"P",{"data-svelte-h":!0}),T(fs)!=="svelte-mau4zr"&&(fs.innerHTML=eJ),Ip=a(bp),r(Ft.$$.fragment,bp),bp.forEach(t),Cp=a(j),zt=m(j,"LI",{});var gp=gs(zt);hs=m(gp,"P",{"data-svelte-h":!0}),T(hs)!=="svelte-1ekf01n"&&(hs.innerHTML=tJ),$p=a(gp),r(Dt.$$.fragment,gp),gp.forEach(t),Wp=a(j),qt=m(j,"LI",{});var fp=gs(qt);Is=m(fp,"P",{"data-svelte-h":!0}),T(Is)!=="svelte-1dvbni8"&&(Is.innerHTML=sJ),vp=a(fp),r(Kt.$$.fragment,fp),fp.forEach(t),Ep=a(j),Pt=m(j,"LI",{});var hp=gs(Pt);Cs=m(hp,"P",{"data-svelte-h":!0}),T(Cs)!=="svelte-iijviu"&&(Cs.innerHTML=nJ),Zp=a(hp),r(Ot.$$.fragment,hp),hp.forEach(t),j.forEach(t),Vr=a(l),Xr=m(l,"HR",{}),Yr=a(l),r(ls.$$.fragment,l),Sr=a(l),r(es.$$.fragment,l),xr=a(l),ts=m(l,"UL",{"data-svelte-h":!0}),T(ts)!=="svelte-dqfdcf"&&(ts.innerHTML=aJ),_r=a(l),r(ss.$$.fragment,l),Lr=a(l),ns=m(l,"UL",{"data-svelte-h":!0}),T(ns)!=="svelte-18p8yuj"&&(ns.innerHTML=iJ),Hr=a(l),r(as.$$.fragment,l),Fr=a(l),is=m(l,"UL",{"data-svelte-h":!0}),T(is)!=="svelte-1r5djvc"&&(is.innerHTML=rJ),zr=a(l),Dr=m(l,"HR",{}),qr=a(l),r(rs.$$.fragment,l),Kr=a(l),r(ps.$$.fragment,l),Pr=a(l),Ms=m(l,"UL",{"data-svelte-h":!0}),T(Ms)!=="svelte-1ei7t8i"&&(Ms.innerHTML=pJ),Or=a(l),r(Js.$$.fragment,l),lp=a(l),os=m(l,"UL",{"data-svelte-h":!0}),T(os)!=="svelte-1aqsiwe"&&(os.innerHTML=MJ),ep=a(l),r(ds.$$.fragment,l),tp=a(l),ms=m(l,"UL",{"data-svelte-h":!0}),T(ms)!=="svelte-12wa78s"&&(ms.innerHTML=JJ),sp=a(l),np=m(l,"HR",{}),ap=a(l),r(Ts.$$.fragment,l),ip=a(l),ws=m(l,"P",{"data-svelte-h":!0}),T(ws)!=="svelte-1hgrjg7"&&(ws.textContent=oJ),rp=a(l),pp=m(l,"HR",{}),Mp=a(l),r(ys.$$.fragment,l),Jp=a(l),cs=m(l,"P",{"data-svelte-h":!0}),T(cs)!=="svelte-9qzdol"&&(cs.innerHTML=dJ),op=a(l),dp=m(l,"HR",{}),mp=a(l),r(us.$$.fragment,l),Tp=a(l),r(Us.$$.fragment,l),wp=a(l),yp=m(l,"HR",{}),cp=a(l),js=m(l,"P",{"data-svelte-h":!0}),T(js)!=="svelte-7u32wl"&&(js.innerHTML=mJ),up=a(l),r(bs.$$.fragment,l),Up=a(l),Ws=m(l,"P",{}),gs(Ws).forEach(t),this.h()},h(){TJ(U,"name","hf:doc:metadata"),TJ(U,"content",hJ)},m(l,e){c(document.head,U),s(l,vs,e),s(l,$s,e),s(l,Es,e),p(b,l,e),s(l,Zs,e),p(g,l,e),s(l,Bs,e),s(l,f,e),s(l,As,e),s(l,h,e),s(l,ks,e),s(l,Gs,e),s(l,Rs,e),p(I,l,e),s(l,Qs,e),s(l,C,e),s(l,Ns,e),s(l,Vs,e),s(l,Xs,e),p($,l,e),s(l,Ys,e),s(l,W,e),s(l,Ss,e),p(v,l,e),s(l,xs,e),s(l,E,e),s(l,_s,e),s(l,Z,e),s(l,Ls,e),p(B,l,e),s(l,Hs,e),s(l,A,e),s(l,Fs,e),s(l,k,e),s(l,zs,e),s(l,Ds,e),s(l,qs,e),p(G,l,e),s(l,Ks,e),p(R,l,e),s(l,Ps,e),p(Q,l,e),s(l,Os,e),s(l,N,e),s(l,ln,e),p(V,l,e),s(l,en,e),p(X,l,e),s(l,tn,e),s(l,sn,e),s(l,nn,e),p(Y,l,e),s(l,an,e),s(l,S,e),s(l,rn,e),s(l,x,e),s(l,pn,e),s(l,_,e),s(l,Mn,e),p(L,l,e),s(l,Jn,e),s(l,H,e),s(l,on,e),s(l,F,e),s(l,dn,e),s(l,mn,e),s(l,Tn,e),p(z,l,e),s(l,wn,e),p(D,l,e),s(l,yn,e),s(l,q,e),s(l,cn,e),p(K,l,e),s(l,un,e),s(l,P,e),s(l,Un,e),p(O,l,e),s(l,jn,e),p(ll,l,e),s(l,bn,e),s(l,el,e),s(l,gn,e),p(tl,l,e),s(l,fn,e),p(sl,l,e),s(l,hn,e),s(l,In,e),s(l,Cn,e),p(nl,l,e),s(l,$n,e),p(al,l,e),s(l,Wn,e),p(il,l,e),s(l,vn,e),s(l,rl,e),s(l,En,e),p(pl,l,e),s(l,Zn,e),s(l,Ml,e),s(l,Bn,e),s(l,Jl,e),s(l,An,e),s(l,ol,e),s(l,kn,e),s(l,dl,e),s(l,Gn,e),s(l,Rn,e),s(l,Qn,e),p(ml,l,e),s(l,Nn,e),s(l,Tl,e),s(l,Vn,e),p(wl,l,e),s(l,Xn,e),s(l,yl,e),s(l,Yn,e),s(l,cl,e),s(l,Sn,e),s(l,ul,e),s(l,xn,e),s(l,Ul,e),s(l,_n,e),s(l,Ln,e),s(l,Hn,e),p(jl,l,e),s(l,Fn,e),s(l,bl,e),s(l,zn,e),p(gl,l,e),s(l,Dn,e),s(l,fl,e),s(l,qn,e),s(l,hl,e),s(l,Kn,e),s(l,Il,e),s(l,Pn,e),s(l,On,e),s(l,la,e),p(Cl,l,e),s(l,ea,e),s(l,$l,e),s(l,ta,e),s(l,Wl,e),s(l,sa,e),s(l,na,e),s(l,aa,e),p(vl,l,e),s(l,ia,e),p(El,l,e),s(l,ra,e),s(l,Zl,e),s(l,pa,e),p(Bl,l,e),s(l,Ma,e),p(Al,l,e),s(l,Ja,e),p(kl,l,e),s(l,oa,e),s(l,da,e),s(l,ma,e),p(Gl,l,e),s(l,Ta,e),p(Rl,l,e),s(l,wa,e),s(l,Ql,e),s(l,ya,e),p(Nl,l,e),s(l,ca,e),s(l,Vl,e),s(l,ua,e),s(l,Xl,e),s(l,Ua,e),s(l,Yl,e),s(l,ja,e),p(Sl,l,e),s(l,ba,e),p(xl,l,e),s(l,ga,e),s(l,_l,e),s(l,fa,e),s(l,ha,e),s(l,Ia,e),p(Ll,l,e),s(l,Ca,e),p(Hl,l,e),s(l,$a,e),s(l,Fl,e),s(l,Wa,e),s(l,zl,e),s(l,va,e),p(Dl,l,e),s(l,Ea,e),s(l,ql,e),s(l,Za,e),p(Kl,l,e),s(l,Ba,e),s(l,Pl,e),s(l,Aa,e),p(Ol,l,e),s(l,ka,e),p(le,l,e),s(l,Ga,e),s(l,Ra,e),s(l,Qa,e),p(ee,l,e),s(l,Na,e),p(te,l,e),s(l,Va,e),s(l,se,e),s(l,Xa,e),s(l,ne,e),s(l,Ya,e),p(ae,l,e),s(l,Sa,e),p(ie,l,e),s(l,xa,e),p(re,l,e),s(l,_a,e),p(pe,l,e),s(l,La,e),p(Me,l,e),s(l,Ha,e),p(Je,l,e),s(l,Fa,e),s(l,za,e),s(l,Da,e),p(oe,l,e),s(l,qa,e),p(de,l,e),s(l,Ka,e),s(l,me,e),s(l,Pa,e),p(Te,l,e),s(l,Oa,e),s(l,we,e),s(l,li,e),s(l,ye,e),s(l,ei,e),s(l,ce,e),s(l,ti,e),p(ue,l,e),s(l,si,e),p(Ue,l,e),s(l,ni,e),s(l,je,e),s(l,ai,e),p(be,l,e),s(l,ii,e),s(l,ge,e),s(l,ri,e),p(fe,l,e),s(l,pi,e),s(l,he,e),s(l,Mi,e),p(Ie,l,e),s(l,Ji,e),s(l,oi,e),s(l,di,e),p(Ce,l,e),s(l,mi,e),p($e,l,e),s(l,Ti,e),p(We,l,e),s(l,wi,e),p(ve,l,e),s(l,yi,e),p(Ee,l,e),s(l,ci,e),s(l,Ze,e),s(l,ui,e),p(Be,l,e),s(l,Ui,e),p(Ae,l,e),s(l,ji,e),s(l,ke,e),s(l,bi,e),p(Ge,l,e),s(l,gi,e),p(Re,l,e),s(l,fi,e),s(l,Qe,e),s(l,hi,e),p(Ne,l,e),s(l,Ii,e),p(Ve,l,e),s(l,Ci,e),s(l,Xe,e),s(l,$i,e),p(Ye,l,e),s(l,Wi,e),p(Se,l,e),s(l,vi,e),p(xe,l,e),s(l,Ei,e),p(_e,l,e),s(l,Zi,e),s(l,Le,e),s(l,Bi,e),p(He,l,e),s(l,Ai,e),p(Fe,l,e),s(l,ki,e),s(l,ze,e),s(l,Gi,e),p(De,l,e),s(l,Ri,e),p(qe,l,e),s(l,Qi,e),s(l,Ni,e),s(l,Vi,e),p(Ke,l,e),s(l,Xi,e),p(Pe,l,e),s(l,Yi,e),p(Oe,l,e),s(l,Si,e),p(lt,l,e),s(l,xi,e),p(et,l,e),s(l,_i,e),p(tt,l,e),s(l,Li,e),p(st,l,e),s(l,Hi,e),p(nt,l,e),s(l,Fi,e),p(at,l,e),s(l,zi,e),s(l,Di,e),s(l,qi,e),p(it,l,e),s(l,Ki,e),s(l,rt,e),s(l,Pi,e),p(pt,l,e),s(l,Oi,e),p(Mt,l,e),s(l,lr,e),p(Jt,l,e),s(l,er,e),s(l,ot,e),s(l,tr,e),p(dt,l,e),s(l,sr,e),p(mt,l,e),s(l,nr,e),p(Tt,l,e),s(l,ar,e),p(wt,l,e),s(l,ir,e),s(l,yt,e),s(l,rr,e),p(ct,l,e),s(l,pr,e),s(l,ut,e),s(l,Mr,e),p(Ut,l,e),s(l,Jr,e),s(l,jt,e),s(l,or,e),p(bt,l,e),s(l,dr,e),s(l,gt,e),s(l,mr,e),s(l,Tr,e),s(l,wr,e),p(ft,l,e),s(l,yr,e),p(ht,l,e),s(l,cr,e),p(It,l,e),s(l,ur,e),s(l,Ct,e),s(l,Ur,e),s(l,$t,e),s(l,jr,e),s(l,Wt,e),s(l,br,e),p(vt,l,e),s(l,gr,e),s(l,Et,e),s(l,fr,e),s(l,Zt,e),s(l,hr,e),p(Bt,l,e),s(l,Ir,e),p(At,l,e),s(l,Cr,e),s(l,kt,e),s(l,$r,e),s(l,Gt,e),s(l,Wr,e),s(l,Rt,e),s(l,vr,e),p(Qt,l,e),s(l,Er,e),s(l,Nt,e),s(l,Zr,e),s(l,Vt,e),s(l,Br,e),p(Xt,l,e),s(l,Ar,e),p(Yt,l,e),s(l,kr,e),s(l,St,e),s(l,Gr,e),s(l,xt,e),s(l,Rr,e),p(_t,l,e),s(l,Qr,e),p(Lt,l,e),s(l,Nr,e),s(l,u,e),c(u,Ht),c(Ht,fs),c(Ht,Ip),p(Ft,Ht,null),c(u,Cp),c(u,zt),c(zt,hs),c(zt,$p),p(Dt,zt,null),c(u,Wp),c(u,qt),c(qt,Is),c(qt,vp),p(Kt,qt,null),c(u,Ep),c(u,Pt),c(Pt,Cs),c(Pt,Zp),p(Ot,Pt,null),s(l,Vr,e),s(l,Xr,e),s(l,Yr,e),p(ls,l,e),s(l,Sr,e),p(es,l,e),s(l,xr,e),s(l,ts,e),s(l,_r,e),p(ss,l,e),s(l,Lr,e),s(l,ns,e),s(l,Hr,e),p(as,l,e),s(l,Fr,e),s(l,is,e),s(l,zr,e),s(l,Dr,e),s(l,qr,e),p(rs,l,e),s(l,Kr,e),p(ps,l,e),s(l,Pr,e),s(l,Ms,e),s(l,Or,e),p(Js,l,e),s(l,lp,e),s(l,os,e),s(l,ep,e),p(ds,l,e),s(l,tp,e),s(l,ms,e),s(l,sp,e),s(l,np,e),s(l,ap,e),p(Ts,l,e),s(l,ip,e),s(l,ws,e),s(l,rp,e),s(l,pp,e),s(l,Mp,e),p(ys,l,e),s(l,Jp,e),s(l,cs,e),s(l,op,e),s(l,dp,e),s(l,mp,e),p(us,l,e),s(l,Tp,e),p(Us,l,e),s(l,wp,e),s(l,yp,e),s(l,cp,e),s(l,js,e),s(l,up,e),p(bs,l,e),s(l,Up,e),s(l,Ws,e),jp=!0},p:yJ,i(l){jp||(M(b.$$.fragment,l),M(g.$$.fragment,l),M(I.$$.fragment,l),M($.$$.fragment,l),M(v.$$.fragment,l),M(B.$$.fragment,l),M(G.$$.fragment,l),M(R.$$.fragment,l),M(Q.$$.fragment,l),M(V.$$.fragment,l),M(X.$$.fragment,l),M(Y.$$.fragment,l),M(L.$$.fragment,l),M(z.$$.fragment,l),M(D.$$.fragment,l),M(K.$$.fragment,l),M(O.$$.fragment,l),M(ll.$$.fragment,l),M(tl.$$.fragment,l),M(sl.$$.fragment,l),M(nl.$$.fragment,l),M(al.$$.fragment,l),M(il.$$.fragment,l),M(pl.$$.fragment,l),M(ml.$$.fragment,l),M(wl.$$.fragment,l),M(jl.$$.fragment,l),M(gl.$$.fragment,l),M(Cl.$$.fragment,l),M(vl.$$.fragment,l),M(El.$$.fragment,l),M(Bl.$$.fragment,l),M(Al.$$.fragment,l),M(kl.$$.fragment,l),M(Gl.$$.fragment,l),M(Rl.$$.fragment,l),M(Nl.$$.fragment,l),M(Sl.$$.fragment,l),M(xl.$$.fragment,l),M(Ll.$$.fragment,l),M(Hl.$$.fragment,l),M(Dl.$$.fragment,l),M(Kl.$$.fragment,l),M(Ol.$$.fragment,l),M(le.$$.fragment,l),M(ee.$$.fragment,l),M(te.$$.fragment,l),M(ae.$$.fragment,l),M(ie.$$.fragment,l),M(re.$$.fragment,l),M(pe.$$.fragment,l),M(Me.$$.fragment,l),M(Je.$$.fragment,l),M(oe.$$.fragment,l),M(de.$$.fragment,l),M(Te.$$.fragment,l),M(ue.$$.fragment,l),M(Ue.$$.fragment,l),M(be.$$.fragment,l),M(fe.$$.fragment,l),M(Ie.$$.fragment,l),M(Ce.$$.fragment,l),M($e.$$.fragment,l),M(We.$$.fragment,l),M(ve.$$.fragment,l),M(Ee.$$.fragment,l),M(Be.$$.fragment,l),M(Ae.$$.fragment,l),M(Ge.$$.fragment,l),M(Re.$$.fragment,l),M(Ne.$$.fragment,l),M(Ve.$$.fragment,l),M(Ye.$$.fragment,l),M(Se.$$.fragment,l),M(xe.$$.fragment,l),M(_e.$$.fragment,l),M(He.$$.fragment,l),M(Fe.$$.fragment,l),M(De.$$.fragment,l),M(qe.$$.fragment,l),M(Ke.$$.fragment,l),M(Pe.$$.fragment,l),M(Oe.$$.fragment,l),M(lt.$$.fragment,l),M(et.$$.fragment,l),M(tt.$$.fragment,l),M(st.$$.fragment,l),M(nt.$$.fragment,l),M(at.$$.fragment,l),M(it.$$.fragment,l),M(pt.$$.fragment,l),M(Mt.$$.fragment,l),M(Jt.$$.fragment,l),M(dt.$$.fragment,l),M(mt.$$.fragment,l),M(Tt.$$.fragment,l),M(wt.$$.fragment,l),M(ct.$$.fragment,l),M(Ut.$$.fragment,l),M(bt.$$.fragment,l),M(ft.$$.fragment,l),M(ht.$$.fragment,l),M(It.$$.fragment,l),M(vt.$$.fragment,l),M(Bt.$$.fragment,l),M(At.$$.fragment,l),M(Qt.$$.fragment,l),M(Xt.$$.fragment,l),M(Yt.$$.fragment,l),M(_t.$$.fragment,l),M(Lt.$$.fragment,l),M(Ft.$$.fragment,l),M(Dt.$$.fragment,l),M(Kt.$$.fragment,l),M(Ot.$$.fragment,l),M(ls.$$.fragment,l),M(es.$$.fragment,l),M(ss.$$.fragment,l),M(as.$$.fragment,l),M(rs.$$.fragment,l),M(ps.$$.fragment,l),M(Js.$$.fragment,l),M(ds.$$.fragment,l),M(Ts.$$.fragment,l),M(ys.$$.fragment,l),M(us.$$.fragment,l),M(Us.$$.fragment,l),M(bs.$$.fragment,l),jp=!0)},o(l){J(b.$$.fragment,l),J(g.$$.fragment,l),J(I.$$.fragment,l),J($.$$.fragment,l),J(v.$$.fragment,l),J(B.$$.fragment,l),J(G.$$.fragment,l),J(R.$$.fragment,l),J(Q.$$.fragment,l),J(V.$$.fragment,l),J(X.$$.fragment,l),J(Y.$$.fragment,l),J(L.$$.fragment,l),J(z.$$.fragment,l),J(D.$$.fragment,l),J(K.$$.fragment,l),J(O.$$.fragment,l),J(ll.$$.fragment,l),J(tl.$$.fragment,l),J(sl.$$.fragment,l),J(nl.$$.fragment,l),J(al.$$.fragment,l),J(il.$$.fragment,l),J(pl.$$.fragment,l),J(ml.$$.fragment,l),J(wl.$$.fragment,l),J(jl.$$.fragment,l),J(gl.$$.fragment,l),J(Cl.$$.fragment,l),J(vl.$$.fragment,l),J(El.$$.fragment,l),J(Bl.$$.fragment,l),J(Al.$$.fragment,l),J(kl.$$.fragment,l),J(Gl.$$.fragment,l),J(Rl.$$.fragment,l),J(Nl.$$.fragment,l),J(Sl.$$.fragment,l),J(xl.$$.fragment,l),J(Ll.$$.fragment,l),J(Hl.$$.fragment,l),J(Dl.$$.fragment,l),J(Kl.$$.fragment,l),J(Ol.$$.fragment,l),J(le.$$.fragment,l),J(ee.$$.fragment,l),J(te.$$.fragment,l),J(ae.$$.fragment,l),J(ie.$$.fragment,l),J(re.$$.fragment,l),J(pe.$$.fragment,l),J(Me.$$.fragment,l),J(Je.$$.fragment,l),J(oe.$$.fragment,l),J(de.$$.fragment,l),J(Te.$$.fragment,l),J(ue.$$.fragment,l),J(Ue.$$.fragment,l),J(be.$$.fragment,l),J(fe.$$.fragment,l),J(Ie.$$.fragment,l),J(Ce.$$.fragment,l),J($e.$$.fragment,l),J(We.$$.fragment,l),J(ve.$$.fragment,l),J(Ee.$$.fragment,l),J(Be.$$.fragment,l),J(Ae.$$.fragment,l),J(Ge.$$.fragment,l),J(Re.$$.fragment,l),J(Ne.$$.fragment,l),J(Ve.$$.fragment,l),J(Ye.$$.fragment,l),J(Se.$$.fragment,l),J(xe.$$.fragment,l),J(_e.$$.fragment,l),J(He.$$.fragment,l),J(Fe.$$.fragment,l),J(De.$$.fragment,l),J(qe.$$.fragment,l),J(Ke.$$.fragment,l),J(Pe.$$.fragment,l),J(Oe.$$.fragment,l),J(lt.$$.fragment,l),J(et.$$.fragment,l),J(tt.$$.fragment,l),J(st.$$.fragment,l),J(nt.$$.fragment,l),J(at.$$.fragment,l),J(it.$$.fragment,l),J(pt.$$.fragment,l),J(Mt.$$.fragment,l),J(Jt.$$.fragment,l),J(dt.$$.fragment,l),J(mt.$$.fragment,l),J(Tt.$$.fragment,l),J(wt.$$.fragment,l),J(ct.$$.fragment,l),J(Ut.$$.fragment,l),J(bt.$$.fragment,l),J(ft.$$.fragment,l),J(ht.$$.fragment,l),J(It.$$.fragment,l),J(vt.$$.fragment,l),J(Bt.$$.fragment,l),J(At.$$.fragment,l),J(Qt.$$.fragment,l),J(Xt.$$.fragment,l),J(Yt.$$.fragment,l),J(_t.$$.fragment,l),J(Lt.$$.fragment,l),J(Ft.$$.fragment,l),J(Dt.$$.fragment,l),J(Kt.$$.fragment,l),J(Ot.$$.fragment,l),J(ls.$$.fragment,l),J(es.$$.fragment,l),J(ss.$$.fragment,l),J(as.$$.fragment,l),J(rs.$$.fragment,l),J(ps.$$.fragment,l),J(Js.$$.fragment,l),J(ds.$$.fragment,l),J(Ts.$$.fragment,l),J(ys.$$.fragment,l),J(us.$$.fragment,l),J(Us.$$.fragment,l),J(bs.$$.fragment,l),jp=!1},d(l){l&&(t(vs),t($s),t(Es),t(Zs),t(Bs),t(f),t(As),t(h),t(ks),t(Gs),t(Rs),t(Qs),t(C),t(Ns),t(Vs),t(Xs),t(Ys),t(W),t(Ss),t(xs),t(E),t(_s),t(Z),t(Ls),t(Hs),t(A),t(Fs),t(k),t(zs),t(Ds),t(qs),t(Ks),t(Ps),t(Os),t(N),t(ln),t(en),t(tn),t(sn),t(nn),t(an),t(S),t(rn),t(x),t(pn),t(_),t(Mn),t(Jn),t(H),t(on),t(F),t(dn),t(mn),t(Tn),t(wn),t(yn),t(q),t(cn),t(un),t(P),t(Un),t(jn),t(bn),t(el),t(gn),t(fn),t(hn),t(In),t(Cn),t($n),t(Wn),t(vn),t(rl),t(En),t(Zn),t(Ml),t(Bn),t(Jl),t(An),t(ol),t(kn),t(dl),t(Gn),t(Rn),t(Qn),t(Nn),t(Tl),t(Vn),t(Xn),t(yl),t(Yn),t(cl),t(Sn),t(ul),t(xn),t(Ul),t(_n),t(Ln),t(Hn),t(Fn),t(bl),t(zn),t(Dn),t(fl),t(qn),t(hl),t(Kn),t(Il),t(Pn),t(On),t(la),t(ea),t($l),t(ta),t(Wl),t(sa),t(na),t(aa),t(ia),t(ra),t(Zl),t(pa),t(Ma),t(Ja),t(oa),t(da),t(ma),t(Ta),t(wa),t(Ql),t(ya),t(ca),t(Vl),t(ua),t(Xl),t(Ua),t(Yl),t(ja),t(ba),t(ga),t(_l),t(fa),t(ha),t(Ia),t(Ca),t($a),t(Fl),t(Wa),t(zl),t(va),t(Ea),t(ql),t(Za),t(Ba),t(Pl),t(Aa),t(ka),t(Ga),t(Ra),t(Qa),t(Na),t(Va),t(se),t(Xa),t(ne),t(Ya),t(Sa),t(xa),t(_a),t(La),t(Ha),t(Fa),t(za),t(Da),t(qa),t(Ka),t(me),t(Pa),t(Oa),t(we),t(li),t(ye),t(ei),t(ce),t(ti),t(si),t(ni),t(je),t(ai),t(ii),t(ge),t(ri),t(pi),t(he),t(Mi),t(Ji),t(oi),t(di),t(mi),t(Ti),t(wi),t(yi),t(ci),t(Ze),t(ui),t(Ui),t(ji),t(ke),t(bi),t(gi),t(fi),t(Qe),t(hi),t(Ii),t(Ci),t(Xe),t($i),t(Wi),t(vi),t(Ei),t(Zi),t(Le),t(Bi),t(Ai),t(ki),t(ze),t(Gi),t(Ri),t(Qi),t(Ni),t(Vi),t(Xi),t(Yi),t(Si),t(xi),t(_i),t(Li),t(Hi),t(Fi),t(zi),t(Di),t(qi),t(Ki),t(rt),t(Pi),t(Oi),t(lr),t(er),t(ot),t(tr),t(sr),t(nr),t(ar),t(ir),t(yt),t(rr),t(pr),t(ut),t(Mr),t(Jr),t(jt),t(or),t(dr),t(gt),t(mr),t(Tr),t(wr),t(yr),t(cr),t(ur),t(Ct),t(Ur),t($t),t(jr),t(Wt),t(br),t(gr),t(Et),t(fr),t(Zt),t(hr),t(Ir),t(Cr),t(kt),t($r),t(Gt),t(Wr),t(Rt),t(vr),t(Er),t(Nt),t(Zr),t(Vt),t(Br),t(Ar),t(kr),t(St),t(Gr),t(xt),t(Rr),t(Qr),t(Nr),t(u),t(Vr),t(Xr),t(Yr),t(Sr),t(xr),t(ts),t(_r),t(Lr),t(ns),t(Hr),t(Fr),t(is),t(zr),t(Dr),t(qr),t(Kr),t(Pr),t(Ms),t(Or),t(lp),t(os),t(ep),t(tp),t(ms),t(sp),t(np),t(ap),t(ip),t(ws),t(rp),t(pp),t(Mp),t(Jp),t(cs),t(op),t(dp),t(mp),t(Tp),t(wp),t(yp),t(cp),t(js),t(up),t(Up),t(Ws)),t(U),o(b,l),o(g,l),o(I,l),o($,l),o(v,l),o(B,l),o(G,l),o(R,l),o(Q,l),o(V,l),o(X,l),o(Y,l),o(L,l),o(z,l),o(D,l),o(K,l),o(O,l),o(ll,l),o(tl,l),o(sl,l),o(nl,l),o(al,l),o(il,l),o(pl,l),o(ml,l),o(wl,l),o(jl,l),o(gl,l),o(Cl,l),o(vl,l),o(El,l),o(Bl,l),o(Al,l),o(kl,l),o(Gl,l),o(Rl,l),o(Nl,l),o(Sl,l),o(xl,l),o(Ll,l),o(Hl,l),o(Dl,l),o(Kl,l),o(Ol,l),o(le,l),o(ee,l),o(te,l),o(ae,l),o(ie,l),o(re,l),o(pe,l),o(Me,l),o(Je,l),o(oe,l),o(de,l),o(Te,l),o(ue,l),o(Ue,l),o(be,l),o(fe,l),o(Ie,l),o(Ce,l),o($e,l),o(We,l),o(ve,l),o(Ee,l),o(Be,l),o(Ae,l),o(Ge,l),o(Re,l),o(Ne,l),o(Ve,l),o(Ye,l),o(Se,l),o(xe,l),o(_e,l),o(He,l),o(Fe,l),o(De,l),o(qe,l),o(Ke,l),o(Pe,l),o(Oe,l),o(lt,l),o(et,l),o(tt,l),o(st,l),o(nt,l),o(at,l),o(it,l),o(pt,l),o(Mt,l),o(Jt,l),o(dt,l),o(mt,l),o(Tt,l),o(wt,l),o(ct,l),o(Ut,l),o(bt,l),o(ft,l),o(ht,l),o(It,l),o(vt,l),o(Bt,l),o(At,l),o(Qt,l),o(Xt,l),o(Yt,l),o(_t,l),o(Lt,l),o(Ft),o(Dt),o(Kt),o(Ot),o(ls,l),o(es,l),o(ss,l),o(as,l),o(rs,l),o(ps,l),o(Js,l),o(ds,l),o(Ts,l),o(ys,l),o(us,l),o(Us,l),o(bs,l)}}}const hJ='{"title":"๐ฒ Wildfire Environment","local":"-wildfire-environment","sections":[{"title":"๐ Table of Contents","local":"-table-of-contents","sections":[],"depth":2},{"title":"๐ฅ Why Wildfire Simulation?","local":"-why-wildfire-simulation","sections":[{"title":"Research Motivation","local":"research-motivation","sections":[],"depth":3},{"title":"Application Goals","local":"application-goals","sections":[],"depth":3}],"depth":2},{"title":"๐ Quick Start","local":"-quick-start","sections":[{"title":"Using Docker (Recommended)","local":"using-docker-recommended","sections":[],"depth":3},{"title":"Basic Python Client","local":"basic-python-client","sections":[],"depth":3}],"depth":2},{"title":"๐ฅ Environment Overview","local":"-environment-overview","sections":[{"title":"Episode Termination","local":"episode-termination","sections":[],"depth":3}],"depth":2},{"title":"๐งฑ Grid Format & Encoding","local":"-grid-format--encoding","sections":[{"title":"Grid Structure","local":"grid-structure","sections":[],"depth":3},{"title":"Cell Encoding","local":"cell-encoding","sections":[],"depth":3},{"title":"Grid Visualization Example","local":"grid-visualization-example","sections":[],"depth":3}],"depth":2},{"title":"๐ฎ Actions","local":"-actions","sections":[{"title":"Action Types","local":"action-types","sections":[{"title":"1. water - Apply Water","local":"1-water---apply-water","sections":[],"depth":4},{"title":"2. break - Create Firebreak","local":"2-break---create-firebreak","sections":[],"depth":4},{"title":"3. wait - Do Nothing","local":"3-wait---do-nothing","sections":[],"depth":4}],"depth":3},{"title":"Invalid Actions","local":"invalid-actions","sections":[],"depth":3}],"depth":2},{"title":"๐๏ธ Observations","local":"-observations","sections":[{"title":"WildfireObservation","local":"wildfireobservation","sections":[],"depth":3},{"title":"Example Observation","local":"example-observation","sections":[],"depth":3}],"depth":2},{"title":"๐ฐ Reward Structure","local":"-reward-structure","sections":[{"title":"Step Rewards","local":"step-rewards","sections":[],"depth":3},{"title":"Episode End Bonuses","local":"episode-end-bonuses","sections":[],"depth":3},{"title":"Reward Interpretation","local":"reward-interpretation","sections":[],"depth":3}],"depth":2},{"title":"๐ช๏ธ Fire Spread Mechanics","local":"-fire-spread-mechanics","sections":[{"title":"Spread Model","local":"spread-model","sections":[],"depth":3},{"title":"Wind Effects","local":"wind-effects","sections":[],"depth":3},{"title":"Water Dampening Duration","local":"water-dampening-duration","sections":[],"depth":3},{"title":"Example Fire Spread","local":"example-fire-spread","sections":[],"depth":3}],"depth":2},{"title":"โ๏ธ Configuration","local":"-configuration","sections":[{"title":"Environment Variables","local":"environment-variables","sections":[],"depth":3},{"title":"Python API Configuration","local":"python-api-configuration","sections":[],"depth":3},{"title":"Docker Configuration","local":"docker-configuration","sections":[],"depth":3},{"title":"Custom Configuration","local":"custom-configuration","sections":[],"depth":3}],"depth":2},{"title":"๐ Installation & Usage","local":"-installation--usage","sections":[{"title":"Option 1: Docker (Recommended)","local":"option-1-docker-recommended","sections":[],"depth":3},{"title":"Option 2: Local Development (No Docker)","local":"option-2-local-development-no-docker","sections":[],"depth":3}],"depth":2},{"title":"๐ API Reference","local":"-api-reference","sections":[{"title":"Client Class","local":"client-class","sections":[],"depth":3},{"title":"Methods","local":"methods","sections":[{"title":"reset() -> StepResult[WildfireObservation]","local":"reset--gt-stepresultwildfireobservation","sections":[],"depth":4},{"title":"step(action: WildfireAction) -> StepResult[WildfireObservation]","local":"stepaction-wildfireaction--gt-stepresultwildfireobservation","sections":[],"depth":4},{"title":"state -> WildfireState","local":"state--gt-wildfirestate","sections":[],"depth":4},{"title":"close()","local":"close","sections":[],"depth":4}],"depth":3},{"title":"Data Classes","local":"data-classes","sections":[{"title":"WildfireAction","local":"wildfireaction","sections":[],"depth":4},{"title":"WildfireObservation","local":"wildfireobservation","sections":[],"depth":4},{"title":"WildfireState","local":"wildfirestate","sections":[],"depth":4}],"depth":3}],"depth":2},{"title":"๐ Examples","local":"-examples","sections":[{"title":"Example 1: Simple Containment Strategy","local":"example-1-simple-containment-strategy","sections":[],"depth":3},{"title":"Example 2: Firebreak Strategy","local":"example-2-firebreak-strategy","sections":[],"depth":3},{"title":"Example 3: Visualization with Matplotlib","local":"example-3-visualization-with-matplotlib","sections":[],"depth":3},{"title":"Example 4: Training Loop for RL","local":"example-4-training-loop-for-rl","sections":[],"depth":3}],"depth":2},{"title":"๐ Web Interface","local":"-web-interface","sections":[{"title":"Accessing the Web Interface","local":"accessing-the-web-interface","sections":[{"title":"Using Docker","local":"using-docker","sections":[],"depth":4},{"title":"Local Testing (No Docker)","local":"local-testing-no-docker","sections":[],"depth":4}],"depth":3},{"title":"Web Interface Features","local":"web-interface-features","sections":[{"title":"Left Pane: Action Interface","local":"left-pane-action-interface","sections":[],"depth":4},{"title":"Right Pane: Visual Grid & Logs","local":"right-pane-visual-grid--logs","sections":[],"depth":4},{"title":"Additional Features","local":"additional-features","sections":[],"depth":4}],"depth":3},{"title":"Using the Web Interface","local":"using-the-web-interface","sections":[],"depth":3}],"depth":2},{"title":"๐ง Troubleshooting","local":"-troubleshooting","sections":[{"title":"Common Issues","local":"common-issues","sections":[{"title":"1. Connection Errors","local":"1-connection-errors","sections":[],"depth":4},{"title":"2. Index Errors","local":"2-index-errors","sections":[],"depth":4},{"title":"3. Invalid Action Warnings","local":"3-invalid-action-warnings","sections":[],"depth":4},{"title":"4. Grid Format Confusion","local":"4-grid-format-confusion","sections":[],"depth":4},{"title":"5. Docker Build Failures","local":"5-docker-build-failures","sections":[],"depth":4}],"depth":3},{"title":"Debugging Tips","local":"debugging-tips","sections":[],"depth":3}],"depth":2},{"title":"๐ Performance Considerations","local":"-performance-considerations","sections":[{"title":"Grid Size Impact","local":"grid-size-impact","sections":[],"depth":3},{"title":"Resource Limits","local":"resource-limits","sections":[],"depth":3},{"title":"Episode Length","local":"episode-length","sections":[],"depth":3}],"depth":2},{"title":"๐งญ References","local":"-references","sections":[{"title":"Papers & Research","local":"papers--research","sections":[],"depth":3},{"title":"OpenEnv Framework","local":"openenv-framework","sections":[],"depth":3},{"title":"Related Tools","local":"related-tools","sections":[],"depth":3}],"depth":2},{"title":"๐ License","local":"-license","sections":[],"depth":2},{"title":"๐ค Contributing","local":"-contributing","sections":[],"depth":2},{"title":"๐ Citations","local":"-citations","sections":[],"depth":2}],"depth":1}';function IJ(Bp){return cJ(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class EJ extends uJ{constructor(U){super(),UJ(this,U,IJ,fJ,wJ,{})}}export{EJ as component}; | |
Xet Storage Details
- Size:
- 136 kB
- Xet hash:
- 02da85046d13de0933d077ea8e43baf2dd886e27b08f0ba0a5658d809e24e5d6
ยท
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.