Buckets:

download
raw
47.5 kB
import{s as Yt,n as Ht,o as qt}from"../chunks/scheduler.2b22cead.js";import{S as Pt,i as Kt,e as r,s as n,c as i,h as ls,a as o,d as t,b as a,f as zt,g as M,j as m,k as Lt,l as es,m as s,n as T,t as p,o as U,p as J}from"../chunks/index.1a0e8013.js";import{C as ts,H as w,E as ss}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.bc7b309e.js";import{C as y}from"../chunks/CodeBlock.6c8835fe.js";function ns(wt){let j,Gl,Zl,Fl,c,Xl,u,xl,d,yt="Integration of traffic signal control with the OpenEnv framework via SUMO (Simulation of Urban MObility) and SUMO-RL.",zl,I,Ll,g,jt="This environment enables reinforcement learning for <strong>traffic signal control</strong> using SUMO, a microscopic traffic simulation package. Train RL agents to optimize traffic light timing and minimize vehicle delays.",Yl,f,ct="<strong>Key Features</strong>:",Hl,h,ut="<li><strong>Realistic traffic simulation</strong> via SUMO</li> <li><strong>Single-agent mode</strong> for single intersection control</li> <li><strong>Configurable rewards</strong> (waiting time, queue, pressure, speed)</li> <li><strong>Multiple networks</strong> supported (custom .net.xml and .rou.xml files)</li> <li><strong>Docker-ready</strong> with pre-bundled example network</li>",ql,C,Pl,A,Kl,b,le,$,ee,O,te,R,se,v,ne,k,ae,Q,dt="The observation is a vector containing:",ie,B,It="<li><strong>Phase one-hot</strong>: Current active green phase (one-hot encoded)</li> <li><strong>Min green flag</strong>: Binary indicator if minimum green time has passed</li> <li><strong>Lane densities</strong>: Number of vehicles / lane capacity for each incoming lane</li> <li><strong>Lane queues</strong>: Number of queued vehicles / lane capacity for each incoming lane</li>",Me,E,gt="Observation size varies by network topology (depends on number of phases and lanes).",Te,N,ft="<strong>Default (single-intersection)</strong>:",pe,S,ht="<li>4 green phases</li> <li>8 incoming lanes</li> <li>Observation size: ~21 elements</li>",Ue,V,Je,W,Ct="The action space is discrete and represents selecting the next green phase to activate.",re,_,At="<li><strong>Action type</strong>: Discrete</li> <li><strong>Action range</strong>: <code>[0, num_green_phases - 1]</code></li> <li><strong>Default (single-intersection)</strong>: 4 actions (one per green phase)</li>",oe,Z,bt="When a phase change is requested, SUMO automatically inserts a yellow phase before switching.",me,D,we,G,$t="Default reward function is <strong>change in cumulative waiting time</strong>:",ye,F,je,X,Ot="Positive rewards indicate waiting time decreased (good).",ce,x,ue,z,Rt="Set via <code>SUMO_REWARD_FN</code> environment variable:",de,L,vt="<li><strong><code>diff-waiting-time</code></strong> (default): Change in cumulative waiting time</li> <li><strong><code>average-speed</code></strong>: Average speed of all vehicles</li> <li><strong><code>queue</code></strong>: Negative total queue length</li> <li><strong><code>pressure</code></strong>: Pressure metric (incoming - outgoing vehicles)</li>",Ie,Y,ge,H,fe,q,kt="<thead><tr><th>Variable</th> <th>Default</th> <th>Description</th></tr></thead> <tbody><tr><td><code>SUMO_NET_FILE</code></td> <td><code>/app/nets/single-intersection.net.xml</code></td> <td>Network topology file</td></tr> <tr><td><code>SUMO_ROUTE_FILE</code></td> <td><code>/app/nets/single-intersection.rou.xml</code></td> <td>Vehicle routes file</td></tr> <tr><td><code>SUMO_NUM_SECONDS</code></td> <td><code>20000</code></td> <td>Simulation duration (seconds)</td></tr> <tr><td><code>SUMO_DELTA_TIME</code></td> <td><code>5</code></td> <td>Seconds between agent actions</td></tr> <tr><td><code>SUMO_YELLOW_TIME</code></td> <td><code>2</code></td> <td>Yellow phase duration (seconds)</td></tr> <tr><td><code>SUMO_MIN_GREEN</code></td> <td><code>5</code></td> <td>Minimum green time (seconds)</td></tr> <tr><td><code>SUMO_MAX_GREEN</code></td> <td><code>50</code></td> <td>Maximum green time (seconds)</td></tr> <tr><td><code>SUMO_REWARD_FN</code></td> <td><code>diff-waiting-time</code></td> <td>Reward function name</td></tr> <tr><td><code>SUMO_SEED</code></td> <td><code>42</code></td> <td>Random seed (use for reproducibility)</td></tr></tbody>",he,P,Ce,K,Qt="To use your own SUMO network:",Ae,ll,be,el,Bt="Your network directory should contain:",$e,tl,Et="<li><code>.net.xml</code> - Network topology (roads, junctions, traffic lights)</li> <li><code>.rou.xml</code> - Vehicle routes (trip definitions, flow rates)</li>",Oe,sl,Re,nl,ve,al,ke,il,Qe,Ml,Be,Tl,Ee,pl,Ne,Ul,Se,Jl,Ve,rl,We,ol,_e,ml,Nt="<li><strong>Reset time</strong>: 1-5 seconds (starts new SUMO simulation)</li> <li><strong>Step time</strong>: ~50-200ms per step (depends on network size)</li> <li><strong>Episode duration</strong>: Minutes (20,000 sim seconds with delta_time=5 → ~4,000 steps)</li>",Ze,wl,De,yl,St="For faster simulation:",Ge,jl,Vt="<li>Reduce <code>SUMO_NUM_SECONDS</code> for shorter episodes</li> <li>Increase <code>SUMO_DELTA_TIME</code> for fewer decisions</li> <li>Use simpler networks with fewer vehicles</li>",Fe,cl,Xe,ul,xe,dl,ze,Il,Wt="The default <code>single-intersection</code> network is a simple 4-way intersection with:",Le,gl,_t="<li><strong>4 incoming roads</strong> (North, South, East, West)</li> <li><strong>4 green phases</strong> (NS straight, NS left, EW straight, EW left)</li> <li><strong>Vehicle flow</strong>: Continuous stream with varying rates</li>",Ye,fl,He,hl,Zt="<li><strong>No GUI in Docker</strong>: SUMO GUI requires X server (not available in containers)</li> <li><strong>Single-agent only</strong>: Multi-agent (multiple intersections) coming in future version</li> <li><strong>Fixed network per container</strong>: Each container uses one network topology</li> <li><strong>Memory usage</strong>: ~500MB for small networks, 2-4GB for large city networks</li>",qe,Cl,Pe,Al,Ke,bl,lt,$l,et,Ol,Dt="This should be automatic in Docker. If running locally:",tt,Rl,st,vl,nt,kl,Gt="<li>Reduce simulation duration: <code>SUMO_NUM_SECONDS=5000</code></li> <li>Increase action interval: <code>SUMO_DELTA_TIME=10</code></li> <li>Use smaller networks with fewer vehicles</li>",at,Ql,it,Bl,Ft='<li><a href="https://sumo.dlr.de/docs/" rel="nofollow">SUMO Documentation</a></li> <li><a href="https://github.com/LucasAlegre/sumo-rl" rel="nofollow">SUMO-RL GitHub</a></li> <li><a href="https://peerj.com/articles/cs-575/" rel="nofollow">SUMO-RL Paper</a></li> <li><a href="https://github.com/jault/RESCO" rel="nofollow">RESCO Benchmarks</a></li>',Mt,El,Tt,Nl,Xt="If you use SUMO-RL in your research, please cite:",pt,Sl,Ut,Vl,Jt,Wl,xt="This integration is licensed under the BSD-style license. SUMO-RL and SUMO have their own licenses.",rt,_l,ot,Dl,mt;return c=new ts({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),u=new w({props:{title:"SUMO-RL Environment",local:"sumo-rl-environment",headingTag:"h1"}}),I=new w({props:{title:"Overview",local:"overview",headingTag:"h2"}}),C=new w({props:{title:"Quick Start",local:"quick-start",headingTag:"h2"}}),A=new w({props:{title:"Using Docker (Recommended)",local:"using-docker-recommended",headingTag:"h3"}}),b=new y({props:{code:"ZnJvbSUyMGVudnMuc3Vtb19ybF9lbnYlMjBpbXBvcnQlMjBTdW1vUkxFbnYlMkMlMjBTdW1vQWN0aW9uJTBBJTBBJTIzJTIwQXV0b21hdGljYWxseSUyMHN0YXJ0cyUyMGNvbnRhaW5lciUwQWVudiUyMCUzRCUyMFN1bW9STEVudi5mcm9tX2RvY2tlcl9pbWFnZSglMjJzdW1vLXJsLWVudiUzQWxhdGVzdCUyMiklMEElMEElMjMlMjBSZXNldCUyMGVudmlyb25tZW50JTBBcmVzdWx0JTIwJTNEJTIwZW52LnJlc2V0KCklMEFwcmludChmJTIyT2JzZXJ2YXRpb24lMjBzaGFwZSUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5vYnNlcnZhdGlvbl9zaGFwZSU3RCUyMiklMEFwcmludChmJTIyQXZhaWxhYmxlJTIwYWN0aW9ucyUzQSUyMCU3QnJlc3VsdC5vYnNlcnZhdGlvbi5hY3Rpb25fbWFzayU3RCUyMiklMEElMEElMjMlMjBUYWtlJTIwYWN0aW9uJTIwKHNlbGVjdCUyMG5leHQlMjBncmVlbiUyMHBoYXNlKSUwQXJlc3VsdCUyMCUzRCUyMGVudi5zdGVwKFN1bW9BY3Rpb24ocGhhc2VfaWQlM0QxKSklMEFwcmludChmJTIyUmV3YXJkJTNBJTIwJTdCcmVzdWx0LnJld2FyZCU3RCUyQyUyMERvbmUlM0ElMjAlN0JyZXN1bHQuZG9uZSU3RCUyMiklMEElMEElMjMlMjBHZXQlMjBzdGF0ZSUwQXN0YXRlJTIwJTNEJTIwZW52LnN0YXRlKCklMEFwcmludChmJTIyU2ltdWxhdGlvbiUyMHRpbWUlM0ElMjAlN0JzdGF0ZS5zaW1fdGltZSU3RCUyMiklMEFwcmludChmJTIyVG90YWwlMjB2ZWhpY2xlcyUzQSUyMCU3QnN0YXRlLnRvdGFsX3ZlaGljbGVzJTdEJTIyKSUwQXByaW50KGYlMjJNZWFuJTIwd2FpdGluZyUyMHRpbWUlM0ElMjAlN0JzdGF0ZS5tZWFuX3dhaXRpbmdfdGltZSU3RCUyMiklMEElMEElMjMlMjBDbGVhbnVwJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.sumo_rl_env <span class="hljs-keyword">import</span> SumoRLEnv, SumoAction
<span class="hljs-comment"># Automatically starts container</span>
env = SumoRLEnv.from_docker_image(<span class="hljs-string">&quot;sumo-rl-env:latest&quot;</span>)
<span class="hljs-comment"># Reset environment</span>
result = env.reset()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Observation shape: <span class="hljs-subst">{result.observation.observation_shape}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Available actions: <span class="hljs-subst">{result.observation.action_mask}</span>&quot;</span>)
<span class="hljs-comment"># Take action (select next green phase)</span>
result = env.step(SumoAction(phase_id=<span class="hljs-number">1</span>))
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Reward: <span class="hljs-subst">{result.reward}</span>, Done: <span class="hljs-subst">{result.done}</span>&quot;</span>)
<span class="hljs-comment"># Get state</span>
state = env.state()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Simulation time: <span class="hljs-subst">{state.sim_time}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Total vehicles: <span class="hljs-subst">{state.total_vehicles}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Mean waiting time: <span class="hljs-subst">{state.mean_waiting_time}</span>&quot;</span>)
<span class="hljs-comment"># Cleanup</span>
env.close()`,lang:"python",wrap:!1}}),$=new w({props:{title:"Building the Docker Image",local:"building-the-docker-image",headingTag:"h3"}}),O=new y({props:{code:"Y2QlMjBPcGVuRW52JTBBJTBBJTIzJTIwQnVpbGQlMjBiYXNlJTIwaW1hZ2UlMjBmaXJzdCUyMChpZiUyMG5vdCUyMGFscmVhZHklMjBidWlsdCklMEFkb2NrZXIlMjBidWlsZCUyMC10JTIwZW52dG9yY2gtYmFzZSUzQWxhdGVzdCUyMC1mJTIwc3JjJTJGb3BlbmVudiUyRmNvcmUlMkZjb250YWluZXJzJTJGaW1hZ2VzJTJGRG9ja2VyZmlsZSUyMC4lMEElMEElMjMlMjBCdWlsZCUyMFNVTU8tUkwlMjBlbnZpcm9ubWVudCUwQWRvY2tlciUyMGJ1aWxkJTIwLWYlMjBlbnZzJTJGc3Vtb19ybF9lbnYlMkZzZXJ2ZXIlMkZEb2NrZXJmaWxlJTIwLXQlMjBzdW1vLXJsLWVudiUzQWxhdGVzdCUyMC4=",highlighted:`<span class="hljs-built_in">cd</span> OpenEnv
<span class="hljs-comment"># Build base image first (if not already built)</span>
docker build -t envtorch-base:latest -f src/openenv/core/containers/images/Dockerfile .
<span class="hljs-comment"># Build SUMO-RL environment</span>
docker build -f envs/sumo_rl_env/server/Dockerfile -t sumo-rl-env:latest .`,lang:"bash",wrap:!1}}),R=new w({props:{title:"Running with Different Configurations",local:"running-with-different-configurations",headingTag:"h3"}}),v=new y({props:{code:"JTIzJTIwRGVmYXVsdCUzQSUyMHNpbmdsZS1pbnRlcnNlY3Rpb24lMEFkb2NrZXIlMjBydW4lMjAtcCUyMDgwMDAlM0E4MDAwJTIwc3Vtby1ybC1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBMb25nZXIlMjBzaW11bGF0aW9uJTBBZG9ja2VyJTIwcnVuJTIwLXAlMjA4MDAwJTNBODAwMCUyMCU1QyUwQSUyMCUyMC1lJTIwU1VNT19OVU1fU0VDT05EUyUzRDUwMDAwJTIwJTVDJTBBJTIwJTIwc3Vtby1ybC1lbnYlM0FsYXRlc3QlMEElMEElMjMlMjBEaWZmZXJlbnQlMjByZXdhcmQlMjBmdW5jdGlvbiUwQWRvY2tlciUyMHJ1biUyMC1wJTIwODAwMCUzQTgwMDAlMjAlNUMlMEElMjAlMjAtZSUyMFNVTU9fUkVXQVJEX0ZOJTNEcXVldWUlMjAlNUMlMEElMjAlMjBzdW1vLXJsLWVudiUzQWxhdGVzdCUwQSUwQSUyMyUyMEN1c3RvbSUyMHNlZWQlMjBmb3IlMjByZXByb2R1Y2liaWxpdHklMEFkb2NrZXIlMjBydW4lMjAtcCUyMDgwMDAlM0E4MDAwJTIwJTVDJTBBJTIwJTIwLWUlMjBTVU1PX1NFRUQlM0QxMjMlMjAlNUMlMEElMjAlMjBzdW1vLXJsLWVudiUzQWxhdGVzdA==",highlighted:`<span class="hljs-comment"># Default: single-intersection</span>
docker run -p 8000:8000 sumo-rl-env:latest
<span class="hljs-comment"># Longer simulation</span>
docker run -p 8000:8000 \\
-e SUMO_NUM_SECONDS=50000 \\
sumo-rl-env:latest
<span class="hljs-comment"># Different reward function</span>
docker run -p 8000:8000 \\
-e SUMO_REWARD_FN=queue \\
sumo-rl-env:latest
<span class="hljs-comment"># Custom seed for reproducibility</span>
docker run -p 8000:8000 \\
-e SUMO_SEED=123 \\
sumo-rl-env:latest`,lang:"bash",wrap:!1}}),k=new w({props:{title:"Observation",local:"observation",headingTag:"h2"}}),V=new w({props:{title:"Action Space",local:"action-space",headingTag:"h2"}}),D=new w({props:{title:"Rewards",local:"rewards",headingTag:"h2"}}),F=new y({props:{code:"cmV3YXJkJTIwJTNEJTIwLSh0b3RhbF93YWl0aW5nX3RpbWVfbm93JTIwLSUyMHRvdGFsX3dhaXRpbmdfdGltZV9wcmV2aW91cyk=",highlighted:'<span class="hljs-attribute">reward</span> <span class="hljs-operator">=</span> -(total_waiting_time_now - total_waiting_time_previous)',lang:"",wrap:!1}}),x=new w({props:{title:"Available Reward Functions",local:"available-reward-functions",headingTag:"h3"}}),Y=new w({props:{title:"Configuration",local:"configuration",headingTag:"h2"}}),H=new w({props:{title:"Environment Variables",local:"environment-variables",headingTag:"h3"}}),P=new w({props:{title:"Using Custom Networks",local:"using-custom-networks",headingTag:"h3"}}),ll=new y({props:{code:"ZnJvbSUyMGVudnMuc3Vtb19ybF9lbnYlMjBpbXBvcnQlMjBTdW1vUkxFbnYlMEElMEFlbnYlMjAlM0QlMjBTdW1vUkxFbnYuZnJvbV9kb2NrZXJfaW1hZ2UoJTBBJTIwJTIwJTIwJTIwJTIyc3Vtby1ybC1lbnYlM0FsYXRlc3QlMjIlMkMlMEElMjAlMjAlMjAlMjB2b2x1bWVzJTNEJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyJTJGcGF0aCUyRnRvJTJGeW91ciUyRm5ldHMlMjIlM0ElMjAlN0IlMjJiaW5kJTIyJTNBJTIwJTIyJTJGbmV0cyUyMiUyQyUyMCUyMm1vZGUlMjIlM0ElMjAlMjJybyUyMiU3RCUwQSUyMCUyMCUyMCUyMCU3RCUyQyUwQSUyMCUyMCUyMCUyMGVudmlyb25tZW50JTNEJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyU1VNT19ORVRfRklMRSUyMiUzQSUyMCUyMiUyRm5ldHMlMkZteS1uZXR3b3JrLm5ldC54bWwlMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJTVU1PX1JPVVRFX0ZJTEUlMjIlM0ElMjAlMjIlMkZuZXRzJTJGbXktcm91dGVzLnJvdS54bWwlMjIlMkMlMEElMjAlMjAlMjAlMjAlN0QlMEEp",highlighted:`<span class="hljs-keyword">from</span> envs.sumo_rl_env <span class="hljs-keyword">import</span> SumoRLEnv
env = SumoRLEnv.from_docker_image(
<span class="hljs-string">&quot;sumo-rl-env:latest&quot;</span>,
volumes={
<span class="hljs-string">&quot;/path/to/your/nets&quot;</span>: {<span class="hljs-string">&quot;bind&quot;</span>: <span class="hljs-string">&quot;/nets&quot;</span>, <span class="hljs-string">&quot;mode&quot;</span>: <span class="hljs-string">&quot;ro&quot;</span>}
},
environment={
<span class="hljs-string">&quot;SUMO_NET_FILE&quot;</span>: <span class="hljs-string">&quot;/nets/my-network.net.xml&quot;</span>,
<span class="hljs-string">&quot;SUMO_ROUTE_FILE&quot;</span>: <span class="hljs-string">&quot;/nets/my-routes.rou.xml&quot;</span>,
}
)`,lang:"python",wrap:!1}}),sl=new w({props:{title:"API Reference",local:"api-reference",headingTag:"h2"}}),nl=new w({props:{title:"SumoAction",local:"sumoaction",headingTag:"h3"}}),al=new y({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBTdW1vQWN0aW9uKEFjdGlvbiklM0ElMEElMjAlMjAlMjAlMjBwaGFzZV9pZCUzQSUyMGludCUyMCUyMCUyMyUyMEdyZWVuJTIwcGhhc2UlMjB0byUyMGFjdGl2YXRlJTIwKDAlMjB0byUyMG51bV9waGFzZXMtMSklMEElMjAlMjAlMjAlMjB0c19pZCUzQSUyMHN0ciUyMCUzRCUyMCUyMjAlMjIlMjAlMjAlMjMlMjBUcmFmZmljJTIwc2lnbmFsJTIwSUQlMjAoZm9yJTIwbXVsdGktYWdlbnQp",highlighted:`<span class="hljs-meta">@dataclass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">SumoAction</span>(<span class="hljs-title class_ inherited__">Action</span>):
phase_id: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Green phase to activate (0 to num_phases-1)</span>
ts_id: <span class="hljs-built_in">str</span> = <span class="hljs-string">&quot;0&quot;</span> <span class="hljs-comment"># Traffic signal ID (for multi-agent)</span>`,lang:"python",wrap:!1}}),il=new w({props:{title:"SumoObservation",local:"sumoobservation",headingTag:"h3"}}),Ml=new y({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBTdW1vT2JzZXJ2YXRpb24oT2JzZXJ2YXRpb24pJTNBJTBBJTIwJTIwJTIwJTIwb2JzZXJ2YXRpb24lM0ElMjBMaXN0JTVCZmxvYXQlNUQlMjAlMjAlMjMlMjBPYnNlcnZhdGlvbiUyMHZlY3RvciUwQSUyMCUyMCUyMCUyMG9ic2VydmF0aW9uX3NoYXBlJTNBJTIwTGlzdCU1QmludCU1RCUyMCUyMCUyMyUyMFNoYXBlJTIwZm9yJTIwcmVzaGFwaW5nJTBBJTIwJTIwJTIwJTIwYWN0aW9uX21hc2slM0ElMjBMaXN0JTVCaW50JTVEJTIwJTIwJTIzJTIwVmFsaWQlMjBhY3Rpb24lMjBpbmRpY2VzJTBBJTIwJTIwJTIwJTIwc2ltX3RpbWUlM0ElMjBmbG9hdCUyMCUyMCUyMyUyMEN1cnJlbnQlMjBzaW11bGF0aW9uJTIwdGltZSUwQSUyMCUyMCUyMCUyMGRvbmUlM0ElMjBib29sJTIwJTIwJTIzJTIwRXBpc29kZSUyMGZpbmlzaGVkJTBBJTIwJTIwJTIwJTIwcmV3YXJkJTNBJTIwT3B0aW9uYWwlNUJmbG9hdCU1RCUyMCUyMCUyMyUyMFJld2FyZCUyMGZyb20lMjBsYXN0JTIwYWN0aW9uJTBBJTIwJTIwJTIwJTIwbWV0YWRhdGElM0ElMjBEaWN0JTIwJTIwJTIzJTIwU3lzdGVtJTIwbWV0cmljcw==",highlighted:`<span class="hljs-meta">@dataclass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">SumoObservation</span>(<span class="hljs-title class_ inherited__">Observation</span>):
observation: <span class="hljs-type">List</span>[<span class="hljs-built_in">float</span>] <span class="hljs-comment"># Observation vector</span>
observation_shape: <span class="hljs-type">List</span>[<span class="hljs-built_in">int</span>] <span class="hljs-comment"># Shape for reshaping</span>
action_mask: <span class="hljs-type">List</span>[<span class="hljs-built_in">int</span>] <span class="hljs-comment"># Valid action indices</span>
sim_time: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Current simulation time</span>
done: <span class="hljs-built_in">bool</span> <span class="hljs-comment"># Episode finished</span>
reward: <span class="hljs-type">Optional</span>[<span class="hljs-built_in">float</span>] <span class="hljs-comment"># Reward from last action</span>
metadata: <span class="hljs-type">Dict</span> <span class="hljs-comment"># System metrics</span>`,lang:"python",wrap:!1}}),Tl=new w({props:{title:"SumoState",local:"sumostate",headingTag:"h3"}}),pl=new y({props:{code:"JTQwZGF0YWNsYXNzJTBBY2xhc3MlMjBTdW1vU3RhdGUoU3RhdGUpJTNBJTBBJTIwJTIwJTIwJTIwZXBpc29kZV9pZCUzQSUyMHN0ciUyMCUyMCUyMyUyMFVuaXF1ZSUyMGVwaXNvZGUlMjBJRCUwQSUyMCUyMCUyMCUyMHN0ZXBfY291bnQlM0ElMjBpbnQlMjAlMjAlMjMlMjBTdGVwcyUyMHRha2VuJTBBJTIwJTIwJTIwJTIwbmV0X2ZpbGUlM0ElMjBzdHIlMjAlMjAlMjMlMjBOZXR3b3JrJTIwZmlsZSUyMHBhdGglMEElMjAlMjAlMjAlMjByb3V0ZV9maWxlJTNBJTIwc3RyJTIwJTIwJTIzJTIwUm91dGUlMjBmaWxlJTIwcGF0aCUwQSUyMCUyMCUyMCUyMHNpbV90aW1lJTNBJTIwZmxvYXQlMjAlMjAlMjMlMjBDdXJyZW50JTIwc2ltdWxhdGlvbiUyMHRpbWUlMEElMjAlMjAlMjAlMjB0b3RhbF92ZWhpY2xlcyUzQSUyMGludCUyMCUyMCUyMyUyMFRvdGFsJTIwdmVoaWNsZXMlMjBpbiUyMHNpbXVsYXRpb24lMEElMjAlMjAlMjAlMjB0b3RhbF93YWl0aW5nX3RpbWUlM0ElMjBmbG9hdCUyMCUyMCUyMyUyMEN1bXVsYXRpdmUlMjB3YWl0aW5nJTIwdGltZSUwQSUyMCUyMCUyMCUyMG1lYW5fd2FpdGluZ190aW1lJTNBJTIwZmxvYXQlMjAlMjAlMjMlMjBNZWFuJTIwd2FpdGluZyUyMHRpbWUlMEElMjAlMjAlMjAlMjBtZWFuX3NwZWVkJTNBJTIwZmxvYXQlMjAlMjAlMjMlMjBNZWFuJTIwdmVoaWNsZSUyMHNwZWVkJTBBJTIwJTIwJTIwJTIwJTIzJTIwLi4uJTIwY29uZmlndXJhdGlvbiUyMHBhcmFtZXRlcnM=",highlighted:`<span class="hljs-meta">@dataclass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">SumoState</span>(<span class="hljs-title class_ inherited__">State</span>):
episode_id: <span class="hljs-built_in">str</span> <span class="hljs-comment"># Unique episode ID</span>
step_count: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Steps taken</span>
net_file: <span class="hljs-built_in">str</span> <span class="hljs-comment"># Network file path</span>
route_file: <span class="hljs-built_in">str</span> <span class="hljs-comment"># Route file path</span>
sim_time: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Current simulation time</span>
total_vehicles: <span class="hljs-built_in">int</span> <span class="hljs-comment"># Total vehicles in simulation</span>
total_waiting_time: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Cumulative waiting time</span>
mean_waiting_time: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Mean waiting time</span>
mean_speed: <span class="hljs-built_in">float</span> <span class="hljs-comment"># Mean vehicle speed</span>
<span class="hljs-comment"># ... configuration parameters</span>`,lang:"python",wrap:!1}}),Ul=new w({props:{title:"Example Training Loop",local:"example-training-loop",headingTag:"h2"}}),Jl=new y({props:{code:"ZnJvbSUyMGVudnMuc3Vtb19ybF9lbnYlMjBpbXBvcnQlMjBTdW1vUkxFbnYlMkMlMjBTdW1vQWN0aW9uJTBBaW1wb3J0JTIwbnVtcHklMjBhcyUyMG5wJTBBJTBBJTIzJTIwU3RhcnQlMjBlbnZpcm9ubWVudCUwQWVudiUyMCUzRCUyMFN1bW9STEVudi5mcm9tX2RvY2tlcl9pbWFnZSglMjJzdW1vLXJsLWVudiUzQWxhdGVzdCUyMiklMEElMEElMjMlMjBUcmFpbmluZyUyMGxvb3AlMEFmb3IlMjBlcGlzb2RlJTIwaW4lMjByYW5nZSgxMCklM0ElMEElMjAlMjAlMjAlMjByZXN1bHQlMjAlM0QlMjBlbnYucmVzZXQoKSUwQSUyMCUyMCUyMCUyMGVwaXNvZGVfcmV3YXJkJTIwJTNEJTIwMCUwQSUyMCUyMCUyMCUyMHN0ZXBzJTIwJTNEJTIwMCUwQSUwQSUyMCUyMCUyMCUyMHdoaWxlJTIwbm90JTIwcmVzdWx0LmRvbmUlMjBhbmQlMjBzdGVwcyUyMCUzQyUyMDEwMDAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBSYW5kb20lMjBwb2xpY3klMjAocmVwbGFjZSUyMHdpdGglMjB5b3VyJTIwUkwlMjBhZ2VudCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhY3Rpb25faWQlMjAlM0QlMjBucC5yYW5kb20uY2hvaWNlKHJlc3VsdC5vYnNlcnZhdGlvbi5hY3Rpb25fbWFzayklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBUYWtlJTIwYWN0aW9uJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzdWx0JTIwJTNEJTIwZW52LnN0ZXAoU3Vtb0FjdGlvbihwaGFzZV9pZCUzRGludChhY3Rpb25faWQpKSklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBlcGlzb2RlX3Jld2FyZCUyMCUyQiUzRCUyMHJlc3VsdC5yZXdhcmQlMjBvciUyMDAlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdGVwcyUyMCUyQiUzRCUyMDElMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBQcmludCUyMHByb2dyZXNzJTIwZXZlcnklMjAxMDAlMjBzdGVwcyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwc3RlcHMlMjAlMjUlMjAxMDAlMjAlM0QlM0QlMjAwJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3RhdGUlMjAlM0QlMjBlbnYuc3RhdGUoKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50KGYlMjJTdGVwJTIwJTdCc3RlcHMlN0QlM0ElMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmJTIycmV3YXJkJTNEJTdCcmVzdWx0LnJld2FyZCUzQS4yZiU3RCUyQyUyMCUyMiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGYlMjJ2ZWhpY2xlcyUzRCU3QnN0YXRlLnRvdGFsX3ZlaGljbGVzJTdEJTJDJTIwJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZiUyMndhaXRpbmclM0QlN0JzdGF0ZS5tZWFuX3dhaXRpbmdfdGltZSUzQS4yZiU3RCUyMiklMEElMEElMjAlMjAlMjAlMjBwcmludChmJTIyRXBpc29kZSUyMCU3QmVwaXNvZGUlN0QlM0ElMjB0b3RhbF9yZXdhcmQlM0QlN0JlcGlzb2RlX3Jld2FyZCUzQS4yZiU3RCUyQyUyMHN0ZXBzJTNEJTdCc3RlcHMlN0QlMjIpJTBBJTBBZW52LmNsb3NlKCk=",highlighted:`<span class="hljs-keyword">from</span> envs.sumo_rl_env <span class="hljs-keyword">import</span> SumoRLEnv, SumoAction
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-comment"># Start environment</span>
env = SumoRLEnv.from_docker_image(<span class="hljs-string">&quot;sumo-rl-env:latest&quot;</span>)
<span class="hljs-comment"># Training loop</span>
<span class="hljs-keyword">for</span> episode <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">10</span>):
result = env.reset()
episode_reward = <span class="hljs-number">0</span>
steps = <span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> result.done <span class="hljs-keyword">and</span> steps &lt; <span class="hljs-number">1000</span>:
<span class="hljs-comment"># Random policy (replace with your RL agent)</span>
action_id = np.random.choice(result.observation.action_mask)
<span class="hljs-comment"># Take action</span>
result = env.step(SumoAction(phase_id=<span class="hljs-built_in">int</span>(action_id)))
episode_reward += result.reward <span class="hljs-keyword">or</span> <span class="hljs-number">0</span>
steps += <span class="hljs-number">1</span>
<span class="hljs-comment"># Print progress every 100 steps</span>
<span class="hljs-keyword">if</span> steps % <span class="hljs-number">100</span> == <span class="hljs-number">0</span>:
state = env.state()
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Step <span class="hljs-subst">{steps}</span>: &quot;</span>
<span class="hljs-string">f&quot;reward=<span class="hljs-subst">{result.reward:<span class="hljs-number">.2</span>f}</span>, &quot;</span>
<span class="hljs-string">f&quot;vehicles=<span class="hljs-subst">{state.total_vehicles}</span>, &quot;</span>
<span class="hljs-string">f&quot;waiting=<span class="hljs-subst">{state.mean_waiting_time:<span class="hljs-number">.2</span>f}</span>&quot;</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Episode <span class="hljs-subst">{episode}</span>: total_reward=<span class="hljs-subst">{episode_reward:<span class="hljs-number">.2</span>f}</span>, steps=<span class="hljs-subst">{steps}</span>&quot;</span>)
env.close()`,lang:"python",wrap:!1}}),rl=new w({props:{title:"Performance Notes",local:"performance-notes",headingTag:"h2"}}),ol=new w({props:{title:"Simulation Speed",local:"simulation-speed",headingTag:"h3"}}),wl=new w({props:{title:"Optimization",local:"optimization",headingTag:"h3"}}),cl=new w({props:{title:"Architecture",local:"architecture",headingTag:"h2"}}),ul=new y({props:{code:"JUUyJTk0JThDJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTkwJTBBJUUyJTk0JTgyJTIwQ2xpZW50JTNBJTIwU3Vtb1JMRW52JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwLnN0ZXAocGhhc2VfaWQlM0QxKSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUwQSVFMiU5NCU5NCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCVBQyVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU4MCVFMiU5NCU5OCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCVFMiU5NCU4MiUyMEhUVFAlMEElRTIlOTQlOEMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTYlQkMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlOTAlMEElRTIlOTQlODIlMjBGYXN0QVBJJTIwU2VydmVyJTIwKERvY2tlciklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElRTIlOTQlODIlMjAlMjAlMjBTdW1vRW52aXJvbm1lbnQlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElRTIlOTQlODIlMjAlMjAlMjAlMjAlMjAlRTIlOTQlOUMlRTIlOTQlODAlMjBXcmFwcyUyMHN1bW9fcmwlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElRTIlOTQlODIlMjAlMjAlMjAlMjAlMjAlRTIlOTQlOUMlRTIlOTQlODAlMjBTaW5nbGUtYWdlbnQlMjBtb2RlJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTk0JUUyJTk0JTgwJTIwTm8lMjBHVUklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElRTIlOTQlOTQlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlQUMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlOTglMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElRTIlOTQlOEMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTYlQkMlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlODAlRTIlOTQlOTAlMEElRTIlOTQlODIlMjBTVU1PJTIwU2ltdWxhdG9yJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwLSUyMFJlYWRzJTIwLm5ldC54bWwlMjAobmV0d29yayklMjAlMjAlMjAlMjAlMjAlRTIlOTQlODIlMEElRTIlOTQlODIlMjAlMjAtJTIwUmVhZHMlMjAucm91LnhtbCUyMChyb3V0ZXMpJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwLSUyMFNpbXVsYXRlcyUyMHRyYWZmaWMlMjBmbG93JTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTgyJTIwJTIwLSUyMFByb3ZpZGVzJTIwb2JzZXJ2YXRpb25zJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJUUyJTk0JTgyJTBBJUUyJTk0JTk0JUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTgwJUUyJTk0JTk4",highlighted:`┌─────────────────────────────────┐
│ Client: SumoRLEnv │
│ .step(<span class="hljs-attr">phase_id=</span><span class="hljs-number">1</span>) │
└──────────────┬──────────────────┘
│ HTTP
┌──────────────▼──────────────────┐
│ FastAPI Server (Docker) │
│ SumoEnvironment │
│ ├─ Wraps sumo_rl │
│ ├─ Single-agent mode │
│ └─ No GUI │
└──────────────┬──────────────────┘
┌──────────────▼──────────────────┐
│ SUMO Simulator │
│ - Reads .net.<span class="hljs-keyword">xml</span> <span class="hljs-title">(network</span>) │
│ - Reads .rou.<span class="hljs-keyword">xml</span> <span class="hljs-title">(routes</span>) │
│ - Simulates traffic flow │
│ - Provides observations │
└─────────────────────────────────┘`,lang:"",wrap:!1}}),dl=new w({props:{title:"Bundled Network",local:"bundled-network",headingTag:"h2"}}),fl=new w({props:{title:"Limitations",local:"limitations",headingTag:"h2"}}),Cl=new w({props:{title:"Troubleshooting",local:"troubleshooting",headingTag:"h2"}}),Al=new w({props:{title:"Container won’t start",local:"container-wont-start",headingTag:"h3"}}),bl=new y({props:{code:"JTIzJTIwQ2hlY2slMjBsb2dzJTBBZG9ja2VyJTIwbG9ncyUyMCUzQ2NvbnRhaW5lci1pZCUzRSUwQSUwQSUyMyUyMFZlcmlmeSUyMG5ldHdvcmslMjBmaWxlcyUyMGV4aXN0JTBBZG9ja2VyJTIwcnVuJTIwc3Vtby1ybC1lbnYlM0FsYXRlc3QlMjBscyUyMC1sYSUyMCUyRmFwcCUyRm5ldHMlMkY=",highlighted:`<span class="hljs-comment"># Check logs</span>
docker logs &lt;container-id&gt;
<span class="hljs-comment"># Verify network files exist</span>
docker run sumo-rl-env:latest <span class="hljs-built_in">ls</span> -la /app/nets/`,lang:"bash",wrap:!1}}),$l=new w({props:{title:"“SUMO_HOME not set” error",local:"sumohome-not-set-error",headingTag:"h3"}}),Rl=new y({props:{code:"ZXhwb3J0JTIwU1VNT19IT01FJTNEJTJGdXNyJTJGc2hhcmUlMkZzdW1v",highlighted:'<span class="hljs-built_in">export</span> SUMO_HOME=/usr/share/sumo',lang:"bash",wrap:!1}}),vl=new w({props:{title:"Slow performance",local:"slow-performance",headingTag:"h3"}}),Ql=new w({props:{title:"References",local:"references",headingTag:"h2"}}),El=new w({props:{title:"Citation",local:"citation",headingTag:"h2"}}),Sl=new y({props:{code:"JTQwbWlzYyU3QnN1bW9ybCUyQyUwQSUyMCUyMCUyMCUyMGF1dGhvciUyMCUzRCUyMCU3Qkx1Y2FzJTIwTi4lMjBBbGVncmUlN0QlMkMlMEElMjAlMjAlMjAlMjB0aXRsZSUyMCUzRCUyMCU3QiU3QlNVTU8tUkwlN0QlN0QlMkMlMEElMjAlMjAlMjAlMjB5ZWFyJTIwJTNEJTIwJTdCMjAxOSU3RCUyQyUwQSUyMCUyMCUyMCUyMHB1Ymxpc2hlciUyMCUzRCUyMCU3QkdpdEh1YiU3RCUyQyUwQSUyMCUyMCUyMCUyMGpvdXJuYWwlMjAlM0QlMjAlN0JHaXRIdWIlMjByZXBvc2l0b3J5JTdEJTJDJTBBJTIwJTIwJTIwJTIwaG93cHVibGlzaGVkJTIwJTNEJTIwJTdCJTVDdXJsJTdCaHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGTHVjYXNBbGVncmUlMkZzdW1vLXJsJTdEJTdEJTJDJTBBJTdE",highlighted:`<span class="language-xml">@misc</span><span class="hljs-template-variable">{sumorl,
author = {Lucas N. Alegre}</span><span class="language-xml">,
title = </span><span class="hljs-template-variable">{{SUMO-RL}</span><span class="language-xml">},
year = </span><span class="hljs-template-variable">{2019}</span><span class="language-xml">,
publisher = </span><span class="hljs-template-variable">{GitHub}</span><span class="language-xml">,
journal = </span><span class="hljs-template-variable">{GitHub repository}</span><span class="language-xml">,
howpublished = </span><span class="hljs-template-variable">{\\url{https://github.com/LucasAlegre/sumo-rl}</span><span class="language-xml">},
}</span>`,lang:"bibtex",wrap:!1}}),Vl=new w({props:{title:"License",local:"license",headingTag:"h2"}}),_l=new ss({props:{source:"https://github.com/huggingface/openenv/blob/main/docs/source/environments/sumo.md"}}),{c(){j=r("meta"),Gl=n(),Zl=r("p"),Fl=n(),i(c.$$.fragment),Xl=n(),i(u.$$.fragment),xl=n(),d=r("p"),d.textContent=yt,zl=n(),i(I.$$.fragment),Ll=n(),g=r("p"),g.innerHTML=jt,Yl=n(),f=r("p"),f.innerHTML=ct,Hl=n(),h=r("ul"),h.innerHTML=ut,ql=n(),i(C.$$.fragment),Pl=n(),i(A.$$.fragment),Kl=n(),i(b.$$.fragment),le=n(),i($.$$.fragment),ee=n(),i(O.$$.fragment),te=n(),i(R.$$.fragment),se=n(),i(v.$$.fragment),ne=n(),i(k.$$.fragment),ae=n(),Q=r("p"),Q.textContent=dt,ie=n(),B=r("ul"),B.innerHTML=It,Me=n(),E=r("p"),E.textContent=gt,Te=n(),N=r("p"),N.innerHTML=ft,pe=n(),S=r("ul"),S.innerHTML=ht,Ue=n(),i(V.$$.fragment),Je=n(),W=r("p"),W.textContent=Ct,re=n(),_=r("ul"),_.innerHTML=At,oe=n(),Z=r("p"),Z.textContent=bt,me=n(),i(D.$$.fragment),we=n(),G=r("p"),G.innerHTML=$t,ye=n(),i(F.$$.fragment),je=n(),X=r("p"),X.textContent=Ot,ce=n(),i(x.$$.fragment),ue=n(),z=r("p"),z.innerHTML=Rt,de=n(),L=r("ul"),L.innerHTML=vt,Ie=n(),i(Y.$$.fragment),ge=n(),i(H.$$.fragment),fe=n(),q=r("table"),q.innerHTML=kt,he=n(),i(P.$$.fragment),Ce=n(),K=r("p"),K.textContent=Qt,Ae=n(),i(ll.$$.fragment),be=n(),el=r("p"),el.textContent=Bt,$e=n(),tl=r("ul"),tl.innerHTML=Et,Oe=n(),i(sl.$$.fragment),Re=n(),i(nl.$$.fragment),ve=n(),i(al.$$.fragment),ke=n(),i(il.$$.fragment),Qe=n(),i(Ml.$$.fragment),Be=n(),i(Tl.$$.fragment),Ee=n(),i(pl.$$.fragment),Ne=n(),i(Ul.$$.fragment),Se=n(),i(Jl.$$.fragment),Ve=n(),i(rl.$$.fragment),We=n(),i(ol.$$.fragment),_e=n(),ml=r("ul"),ml.innerHTML=Nt,Ze=n(),i(wl.$$.fragment),De=n(),yl=r("p"),yl.textContent=St,Ge=n(),jl=r("ol"),jl.innerHTML=Vt,Fe=n(),i(cl.$$.fragment),Xe=n(),i(ul.$$.fragment),xe=n(),i(dl.$$.fragment),ze=n(),Il=r("p"),Il.innerHTML=Wt,Le=n(),gl=r("ul"),gl.innerHTML=_t,Ye=n(),i(fl.$$.fragment),He=n(),hl=r("ul"),hl.innerHTML=Zt,qe=n(),i(Cl.$$.fragment),Pe=n(),i(Al.$$.fragment),Ke=n(),i(bl.$$.fragment),lt=n(),i($l.$$.fragment),et=n(),Ol=r("p"),Ol.textContent=Dt,tt=n(),i(Rl.$$.fragment),st=n(),i(vl.$$.fragment),nt=n(),kl=r("ul"),kl.innerHTML=Gt,at=n(),i(Ql.$$.fragment),it=n(),Bl=r("ul"),Bl.innerHTML=Ft,Mt=n(),i(El.$$.fragment),Tt=n(),Nl=r("p"),Nl.textContent=Xt,pt=n(),i(Sl.$$.fragment),Ut=n(),i(Vl.$$.fragment),Jt=n(),Wl=r("p"),Wl.textContent=xt,rt=n(),i(_l.$$.fragment),ot=n(),Dl=r("p"),this.h()},l(l){const e=ls("svelte-u9bgzb",document.head);j=o(e,"META",{name:!0,content:!0}),e.forEach(t),Gl=a(l),Zl=o(l,"P",{}),zt(Zl).forEach(t),Fl=a(l),M(c.$$.fragment,l),Xl=a(l),M(u.$$.fragment,l),xl=a(l),d=o(l,"P",{"data-svelte-h":!0}),m(d)!=="svelte-kpxn4p"&&(d.textContent=yt),zl=a(l),M(I.$$.fragment,l),Ll=a(l),g=o(l,"P",{"data-svelte-h":!0}),m(g)!=="svelte-114lr4a"&&(g.innerHTML=jt),Yl=a(l),f=o(l,"P",{"data-svelte-h":!0}),m(f)!=="svelte-3cm7ih"&&(f.innerHTML=ct),Hl=a(l),h=o(l,"UL",{"data-svelte-h":!0}),m(h)!=="svelte-tkihsh"&&(h.innerHTML=ut),ql=a(l),M(C.$$.fragment,l),Pl=a(l),M(A.$$.fragment,l),Kl=a(l),M(b.$$.fragment,l),le=a(l),M($.$$.fragment,l),ee=a(l),M(O.$$.fragment,l),te=a(l),M(R.$$.fragment,l),se=a(l),M(v.$$.fragment,l),ne=a(l),M(k.$$.fragment,l),ae=a(l),Q=o(l,"P",{"data-svelte-h":!0}),m(Q)!=="svelte-10qu7ph"&&(Q.textContent=dt),ie=a(l),B=o(l,"UL",{"data-svelte-h":!0}),m(B)!=="svelte-19tde38"&&(B.innerHTML=It),Me=a(l),E=o(l,"P",{"data-svelte-h":!0}),m(E)!=="svelte-k4aqjc"&&(E.textContent=gt),Te=a(l),N=o(l,"P",{"data-svelte-h":!0}),m(N)!=="svelte-xtw3vz"&&(N.innerHTML=ft),pe=a(l),S=o(l,"UL",{"data-svelte-h":!0}),m(S)!=="svelte-1w6a87a"&&(S.innerHTML=ht),Ue=a(l),M(V.$$.fragment,l),Je=a(l),W=o(l,"P",{"data-svelte-h":!0}),m(W)!=="svelte-liv73s"&&(W.textContent=Ct),re=a(l),_=o(l,"UL",{"data-svelte-h":!0}),m(_)!=="svelte-1cs8l8p"&&(_.innerHTML=At),oe=a(l),Z=o(l,"P",{"data-svelte-h":!0}),m(Z)!=="svelte-fh8qx8"&&(Z.textContent=bt),me=a(l),M(D.$$.fragment,l),we=a(l),G=o(l,"P",{"data-svelte-h":!0}),m(G)!=="svelte-1iblpkn"&&(G.innerHTML=$t),ye=a(l),M(F.$$.fragment,l),je=a(l),X=o(l,"P",{"data-svelte-h":!0}),m(X)!=="svelte-1jbfdcw"&&(X.textContent=Ot),ce=a(l),M(x.$$.fragment,l),ue=a(l),z=o(l,"P",{"data-svelte-h":!0}),m(z)!=="svelte-1ap87d7"&&(z.innerHTML=Rt),de=a(l),L=o(l,"UL",{"data-svelte-h":!0}),m(L)!=="svelte-1u4ds4z"&&(L.innerHTML=vt),Ie=a(l),M(Y.$$.fragment,l),ge=a(l),M(H.$$.fragment,l),fe=a(l),q=o(l,"TABLE",{"data-svelte-h":!0}),m(q)!=="svelte-1iz18th"&&(q.innerHTML=kt),he=a(l),M(P.$$.fragment,l),Ce=a(l),K=o(l,"P",{"data-svelte-h":!0}),m(K)!=="svelte-lbkhal"&&(K.textContent=Qt),Ae=a(l),M(ll.$$.fragment,l),be=a(l),el=o(l,"P",{"data-svelte-h":!0}),m(el)!=="svelte-qbrglv"&&(el.textContent=Bt),$e=a(l),tl=o(l,"UL",{"data-svelte-h":!0}),m(tl)!=="svelte-1yotvd2"&&(tl.innerHTML=Et),Oe=a(l),M(sl.$$.fragment,l),Re=a(l),M(nl.$$.fragment,l),ve=a(l),M(al.$$.fragment,l),ke=a(l),M(il.$$.fragment,l),Qe=a(l),M(Ml.$$.fragment,l),Be=a(l),M(Tl.$$.fragment,l),Ee=a(l),M(pl.$$.fragment,l),Ne=a(l),M(Ul.$$.fragment,l),Se=a(l),M(Jl.$$.fragment,l),Ve=a(l),M(rl.$$.fragment,l),We=a(l),M(ol.$$.fragment,l),_e=a(l),ml=o(l,"UL",{"data-svelte-h":!0}),m(ml)!=="svelte-y3ry2l"&&(ml.innerHTML=Nt),Ze=a(l),M(wl.$$.fragment,l),De=a(l),yl=o(l,"P",{"data-svelte-h":!0}),m(yl)!=="svelte-11r2f81"&&(yl.textContent=St),Ge=a(l),jl=o(l,"OL",{"data-svelte-h":!0}),m(jl)!=="svelte-10jm7dw"&&(jl.innerHTML=Vt),Fe=a(l),M(cl.$$.fragment,l),Xe=a(l),M(ul.$$.fragment,l),xe=a(l),M(dl.$$.fragment,l),ze=a(l),Il=o(l,"P",{"data-svelte-h":!0}),m(Il)!=="svelte-1kewbdb"&&(Il.innerHTML=Wt),Le=a(l),gl=o(l,"UL",{"data-svelte-h":!0}),m(gl)!=="svelte-xmebtg"&&(gl.innerHTML=_t),Ye=a(l),M(fl.$$.fragment,l),He=a(l),hl=o(l,"UL",{"data-svelte-h":!0}),m(hl)!=="svelte-1hyk0mo"&&(hl.innerHTML=Zt),qe=a(l),M(Cl.$$.fragment,l),Pe=a(l),M(Al.$$.fragment,l),Ke=a(l),M(bl.$$.fragment,l),lt=a(l),M($l.$$.fragment,l),et=a(l),Ol=o(l,"P",{"data-svelte-h":!0}),m(Ol)!=="svelte-1pbyzg6"&&(Ol.textContent=Dt),tt=a(l),M(Rl.$$.fragment,l),st=a(l),M(vl.$$.fragment,l),nt=a(l),kl=o(l,"UL",{"data-svelte-h":!0}),m(kl)!=="svelte-1myb7t3"&&(kl.innerHTML=Gt),at=a(l),M(Ql.$$.fragment,l),it=a(l),Bl=o(l,"UL",{"data-svelte-h":!0}),m(Bl)!=="svelte-skog23"&&(Bl.innerHTML=Ft),Mt=a(l),M(El.$$.fragment,l),Tt=a(l),Nl=o(l,"P",{"data-svelte-h":!0}),m(Nl)!=="svelte-1vz79co"&&(Nl.textContent=Xt),pt=a(l),M(Sl.$$.fragment,l),Ut=a(l),M(Vl.$$.fragment,l),Jt=a(l),Wl=o(l,"P",{"data-svelte-h":!0}),m(Wl)!=="svelte-127pk1y"&&(Wl.textContent=xt),rt=a(l),M(_l.$$.fragment,l),ot=a(l),Dl=o(l,"P",{}),zt(Dl).forEach(t),this.h()},h(){Lt(j,"name","hf:doc:metadata"),Lt(j,"content",as)},m(l,e){es(document.head,j),s(l,Gl,e),s(l,Zl,e),s(l,Fl,e),T(c,l,e),s(l,Xl,e),T(u,l,e),s(l,xl,e),s(l,d,e),s(l,zl,e),T(I,l,e),s(l,Ll,e),s(l,g,e),s(l,Yl,e),s(l,f,e),s(l,Hl,e),s(l,h,e),s(l,ql,e),T(C,l,e),s(l,Pl,e),T(A,l,e),s(l,Kl,e),T(b,l,e),s(l,le,e),T($,l,e),s(l,ee,e),T(O,l,e),s(l,te,e),T(R,l,e),s(l,se,e),T(v,l,e),s(l,ne,e),T(k,l,e),s(l,ae,e),s(l,Q,e),s(l,ie,e),s(l,B,e),s(l,Me,e),s(l,E,e),s(l,Te,e),s(l,N,e),s(l,pe,e),s(l,S,e),s(l,Ue,e),T(V,l,e),s(l,Je,e),s(l,W,e),s(l,re,e),s(l,_,e),s(l,oe,e),s(l,Z,e),s(l,me,e),T(D,l,e),s(l,we,e),s(l,G,e),s(l,ye,e),T(F,l,e),s(l,je,e),s(l,X,e),s(l,ce,e),T(x,l,e),s(l,ue,e),s(l,z,e),s(l,de,e),s(l,L,e),s(l,Ie,e),T(Y,l,e),s(l,ge,e),T(H,l,e),s(l,fe,e),s(l,q,e),s(l,he,e),T(P,l,e),s(l,Ce,e),s(l,K,e),s(l,Ae,e),T(ll,l,e),s(l,be,e),s(l,el,e),s(l,$e,e),s(l,tl,e),s(l,Oe,e),T(sl,l,e),s(l,Re,e),T(nl,l,e),s(l,ve,e),T(al,l,e),s(l,ke,e),T(il,l,e),s(l,Qe,e),T(Ml,l,e),s(l,Be,e),T(Tl,l,e),s(l,Ee,e),T(pl,l,e),s(l,Ne,e),T(Ul,l,e),s(l,Se,e),T(Jl,l,e),s(l,Ve,e),T(rl,l,e),s(l,We,e),T(ol,l,e),s(l,_e,e),s(l,ml,e),s(l,Ze,e),T(wl,l,e),s(l,De,e),s(l,yl,e),s(l,Ge,e),s(l,jl,e),s(l,Fe,e),T(cl,l,e),s(l,Xe,e),T(ul,l,e),s(l,xe,e),T(dl,l,e),s(l,ze,e),s(l,Il,e),s(l,Le,e),s(l,gl,e),s(l,Ye,e),T(fl,l,e),s(l,He,e),s(l,hl,e),s(l,qe,e),T(Cl,l,e),s(l,Pe,e),T(Al,l,e),s(l,Ke,e),T(bl,l,e),s(l,lt,e),T($l,l,e),s(l,et,e),s(l,Ol,e),s(l,tt,e),T(Rl,l,e),s(l,st,e),T(vl,l,e),s(l,nt,e),s(l,kl,e),s(l,at,e),T(Ql,l,e),s(l,it,e),s(l,Bl,e),s(l,Mt,e),T(El,l,e),s(l,Tt,e),s(l,Nl,e),s(l,pt,e),T(Sl,l,e),s(l,Ut,e),T(Vl,l,e),s(l,Jt,e),s(l,Wl,e),s(l,rt,e),T(_l,l,e),s(l,ot,e),s(l,Dl,e),mt=!0},p:Ht,i(l){mt||(p(c.$$.fragment,l),p(u.$$.fragment,l),p(I.$$.fragment,l),p(C.$$.fragment,l),p(A.$$.fragment,l),p(b.$$.fragment,l),p($.$$.fragment,l),p(O.$$.fragment,l),p(R.$$.fragment,l),p(v.$$.fragment,l),p(k.$$.fragment,l),p(V.$$.fragment,l),p(D.$$.fragment,l),p(F.$$.fragment,l),p(x.$$.fragment,l),p(Y.$$.fragment,l),p(H.$$.fragment,l),p(P.$$.fragment,l),p(ll.$$.fragment,l),p(sl.$$.fragment,l),p(nl.$$.fragment,l),p(al.$$.fragment,l),p(il.$$.fragment,l),p(Ml.$$.fragment,l),p(Tl.$$.fragment,l),p(pl.$$.fragment,l),p(Ul.$$.fragment,l),p(Jl.$$.fragment,l),p(rl.$$.fragment,l),p(ol.$$.fragment,l),p(wl.$$.fragment,l),p(cl.$$.fragment,l),p(ul.$$.fragment,l),p(dl.$$.fragment,l),p(fl.$$.fragment,l),p(Cl.$$.fragment,l),p(Al.$$.fragment,l),p(bl.$$.fragment,l),p($l.$$.fragment,l),p(Rl.$$.fragment,l),p(vl.$$.fragment,l),p(Ql.$$.fragment,l),p(El.$$.fragment,l),p(Sl.$$.fragment,l),p(Vl.$$.fragment,l),p(_l.$$.fragment,l),mt=!0)},o(l){U(c.$$.fragment,l),U(u.$$.fragment,l),U(I.$$.fragment,l),U(C.$$.fragment,l),U(A.$$.fragment,l),U(b.$$.fragment,l),U($.$$.fragment,l),U(O.$$.fragment,l),U(R.$$.fragment,l),U(v.$$.fragment,l),U(k.$$.fragment,l),U(V.$$.fragment,l),U(D.$$.fragment,l),U(F.$$.fragment,l),U(x.$$.fragment,l),U(Y.$$.fragment,l),U(H.$$.fragment,l),U(P.$$.fragment,l),U(ll.$$.fragment,l),U(sl.$$.fragment,l),U(nl.$$.fragment,l),U(al.$$.fragment,l),U(il.$$.fragment,l),U(Ml.$$.fragment,l),U(Tl.$$.fragment,l),U(pl.$$.fragment,l),U(Ul.$$.fragment,l),U(Jl.$$.fragment,l),U(rl.$$.fragment,l),U(ol.$$.fragment,l),U(wl.$$.fragment,l),U(cl.$$.fragment,l),U(ul.$$.fragment,l),U(dl.$$.fragment,l),U(fl.$$.fragment,l),U(Cl.$$.fragment,l),U(Al.$$.fragment,l),U(bl.$$.fragment,l),U($l.$$.fragment,l),U(Rl.$$.fragment,l),U(vl.$$.fragment,l),U(Ql.$$.fragment,l),U(El.$$.fragment,l),U(Sl.$$.fragment,l),U(Vl.$$.fragment,l),U(_l.$$.fragment,l),mt=!1},d(l){l&&(t(Gl),t(Zl),t(Fl),t(Xl),t(xl),t(d),t(zl),t(Ll),t(g),t(Yl),t(f),t(Hl),t(h),t(ql),t(Pl),t(Kl),t(le),t(ee),t(te),t(se),t(ne),t(ae),t(Q),t(ie),t(B),t(Me),t(E),t(Te),t(N),t(pe),t(S),t(Ue),t(Je),t(W),t(re),t(_),t(oe),t(Z),t(me),t(we),t(G),t(ye),t(je),t(X),t(ce),t(ue),t(z),t(de),t(L),t(Ie),t(ge),t(fe),t(q),t(he),t(Ce),t(K),t(Ae),t(be),t(el),t($e),t(tl),t(Oe),t(Re),t(ve),t(ke),t(Qe),t(Be),t(Ee),t(Ne),t(Se),t(Ve),t(We),t(_e),t(ml),t(Ze),t(De),t(yl),t(Ge),t(jl),t(Fe),t(Xe),t(xe),t(ze),t(Il),t(Le),t(gl),t(Ye),t(He),t(hl),t(qe),t(Pe),t(Ke),t(lt),t(et),t(Ol),t(tt),t(st),t(nt),t(kl),t(at),t(it),t(Bl),t(Mt),t(Tt),t(Nl),t(pt),t(Ut),t(Jt),t(Wl),t(rt),t(ot),t(Dl)),t(j),J(c,l),J(u,l),J(I,l),J(C,l),J(A,l),J(b,l),J($,l),J(O,l),J(R,l),J(v,l),J(k,l),J(V,l),J(D,l),J(F,l),J(x,l),J(Y,l),J(H,l),J(P,l),J(ll,l),J(sl,l),J(nl,l),J(al,l),J(il,l),J(Ml,l),J(Tl,l),J(pl,l),J(Ul,l),J(Jl,l),J(rl,l),J(ol,l),J(wl,l),J(cl,l),J(ul,l),J(dl,l),J(fl,l),J(Cl,l),J(Al,l),J(bl,l),J($l,l),J(Rl,l),J(vl,l),J(Ql,l),J(El,l),J(Sl,l),J(Vl,l),J(_l,l)}}}const as='{"title":"SUMO-RL Environment","local":"sumo-rl-environment","sections":[{"title":"Overview","local":"overview","sections":[],"depth":2},{"title":"Quick Start","local":"quick-start","sections":[{"title":"Using Docker (Recommended)","local":"using-docker-recommended","sections":[],"depth":3},{"title":"Building the Docker Image","local":"building-the-docker-image","sections":[],"depth":3},{"title":"Running with Different Configurations","local":"running-with-different-configurations","sections":[],"depth":3}],"depth":2},{"title":"Observation","local":"observation","sections":[],"depth":2},{"title":"Action Space","local":"action-space","sections":[],"depth":2},{"title":"Rewards","local":"rewards","sections":[{"title":"Available Reward Functions","local":"available-reward-functions","sections":[],"depth":3}],"depth":2},{"title":"Configuration","local":"configuration","sections":[{"title":"Environment Variables","local":"environment-variables","sections":[],"depth":3},{"title":"Using Custom Networks","local":"using-custom-networks","sections":[],"depth":3}],"depth":2},{"title":"API Reference","local":"api-reference","sections":[{"title":"SumoAction","local":"sumoaction","sections":[],"depth":3},{"title":"SumoObservation","local":"sumoobservation","sections":[],"depth":3},{"title":"SumoState","local":"sumostate","sections":[],"depth":3}],"depth":2},{"title":"Example Training Loop","local":"example-training-loop","sections":[],"depth":2},{"title":"Performance Notes","local":"performance-notes","sections":[{"title":"Simulation Speed","local":"simulation-speed","sections":[],"depth":3},{"title":"Optimization","local":"optimization","sections":[],"depth":3}],"depth":2},{"title":"Architecture","local":"architecture","sections":[],"depth":2},{"title":"Bundled Network","local":"bundled-network","sections":[],"depth":2},{"title":"Limitations","local":"limitations","sections":[],"depth":2},{"title":"Troubleshooting","local":"troubleshooting","sections":[{"title":"Container won’t start","local":"container-wont-start","sections":[],"depth":3},{"title":"“SUMO_HOME not set” error","local":"sumohome-not-set-error","sections":[],"depth":3},{"title":"Slow performance","local":"slow-performance","sections":[],"depth":3}],"depth":2},{"title":"References","local":"references","sections":[],"depth":2},{"title":"Citation","local":"citation","sections":[],"depth":2},{"title":"License","local":"license","sections":[],"depth":2}],"depth":1}';function is(wt){return qt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class Js extends Pt{constructor(j){super(),Kt(this,j,is,ns,Yt,{})}}export{Js as component};

Xet Storage Details

Size:
47.5 kB
·
Xet hash:
23e2ba267e21c9b66e670fe984a21ddfa6ee9dcd1344e171e90998c480297c57

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.