§
    ð"Âj³$  ã                  ó@  — d Z ddlmZ ddlmZmZ ddlZddlZddlm	Z	m
Z
mZmZ  edd¬¦  «         G d„ d	¦  «        ¦   «         Z ed¬
¦  «         G d„ d¦  «        ¦   «         Z G d„ d¦  «        Z edd¬¦  «         G d„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )af  
High-Performance Distributed Swarm Simulation Load Harness for FreeExile.
Simulates partitioned distributed loads representing 1,000,000 CCU across
Kubernetes World Shard nodes, measuring Spatial Grid tick time, p99 latency,
and RAM consumption per node.

NOTE ON BENCHMARK NATURE (ANTI-HALLUCINATION ENFORCEMENT):
This harness performs IN-MEMORY ARITHMETIC EXTRAPOLATION of spatial partitioning
and gateway latency models. It validates cluster mathematics and memory budgets.
It does NOT substitute for real-world multi-host TCP/WebSocket network socket
load tests with OS socket descriptors and TLS handshakes.
é    )Úannotations)Ú	dataclassÚfieldN)ÚDictÚListÚSetÚTupleT)ÚslotsÚfrozenc                  óŠ   — e Zd ZU dZded<   dZded<   dZded<   d	Zded
<   dZded<   dZ	ded<   dZ
ded<   edd„¦   «         ZdS )ÚSwarmConfigi@B ÚintÚtotal_simulated_ccuéd   Úshards_countç      P@ÚfloatÚspatial_cell_sizeé   Útarget_tick_rate_hzg      9@Útarget_p99_latency_msg      @Úmax_ram_per_node_gbiÐ  Úsample_active_actorsÚreturnc                ó<   — | j         t          d| j        ¦  «        z  S )Né   )r   Úmaxr   ©Úselfs    ú8C:\Projects\FreeExile\server\world\swarm_load_harness.pyÚactors_per_shardzSwarmConfig.actors_per_shard    s   € àÔ'­3¨q°$Ô2CÑ+DÔ+DÑDÐDó    N)r   r   )Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   r   r   Úpropertyr!   © r"   r    r   r      s·   € € € € € € à(ÐÐ(Ð(Ð(Ñ(Ø€LÐÐÐÑØ#ÐÐ#Ð#Ð#Ñ#Ø!ÐÐ!Ð!Ð!Ñ!Ø#'ÐÐ'Ð'Ð'Ñ'Ø!$ÐÐ$Ð$Ð$Ñ$Ø %ÐÐ%Ð%Ð%Ñ%àðEð Eð Eñ „XðEð Eð Er"   r   )r
   c                  óz   — e Zd ZU ded<   ded<   ded<   ded<   ded<   dZded	<   dZded
<   dZded<   dZded<   dS )ÚVirtualActorr   Úactor_idr   ÚxÚyÚvxÚvyr   Úcell_xÚcell_yÚmovingÚstrÚstateÚpackets_sentN)r#   r$   r%   r&   r0   r1   r4   r5   r(   r"   r    r*   r*   %   s{   € € € € € € à€M€M�MØ€H€H�HØ€H€H�HØ€I€I�IØ€I€I�IØ€F€O€O€O�OØ€F€O€O€O�OØ€EÐÐÐÑØ€LÐÐÐÑÐÐr"   r*   c                  ó@   — e Zd ZdZddd
„Zdd„Zdd„Zddd„Zddd„ZdS ) ÚVirtualActorBatchz3Manages an actor partition on a cluster shard node.r   Úshard_idr   Úactor_countÚ	cell_sizer   r   ÚNonec                óL   — || _         || _        || _        g | _        i | _        d S ©N)r8   r9   r:   ÚactorsÚcells)r   r8   r9   r:   s       r    Ú__init__zVirtualActorBatch.__init__5   s*   € Ø ˆŒØ&ˆÔØ"ˆŒØ*,ˆŒØ68ˆŒ
ˆ
ˆ
r"   c           
     ó®  — | j                              ¦   «          | j                             ¦   «          t          dt	          t          j        | j        ¦  «        ¦  «        ¦  «        }t          | j        ¦  «        D �]X}||z  }||z  }t          |dz  |dz  dz  z   ¦  «        }t          |dz  |dz  dz  z   ¦  «        }|dz  dt
          j
        z  z  }d|dz  z   }t	          t          j        || j        z  ¦  «        ¦  «        }	t	          t          j        || j        z  ¦  «        ¦  «        }
t          | j        d	z  |z   ||t          j        |¦  «        |z  t          j        |¦  «        |z  |	|
¬
¦  «        }| j                              |¦  «         | j                             |	|
ft'          ¦   «         ¦  «                             |j        ¦  «         �ŒZdS )z?Initializes virtual actors distributed across 2D spatial cells.r   g      .@é   g       @é   ç      Ð?g      @é   i † )r+   r,   r-   r.   r/   r0   r1   N)r>   Úclearr?   r   r   ÚmathÚisqrtr9   Úranger   ÚpiÚfloorr:   r*   r8   ÚcosÚsinÚappendÚ
setdefaultÚsetÚaddr+   )r   Ú
grid_widthÚiÚrowÚcolr,   r-   ÚangleÚspeedÚcxÚcyÚactors               r    Úinitialize_actorsz#VirtualActorBatch.initialize_actors<   s»  € àŒ×ÒÑÔÐØŒ
×ÒÑÔÐÝ˜�C¥¤
¨4Ô+;Ñ <Ô <Ñ=Ô=Ñ>Ô>ˆ
å�tÔ'Ñ(Ô(ð 	Gñ 	GˆAØ�z‘/ˆCØ�j‘.ˆCÝ�c˜D‘j A¨¡E¨S¡=Ñ0Ñ1Ô1ˆAÝ�c˜D‘j A¨¡E¨S¡=Ñ0Ñ1Ô1ˆAØ˜‘X #­¬¡-Ñ0ˆEØ˜1˜q™5‘MˆEå•T”Z  D¤NÑ 2Ñ3Ô3Ñ4Ô4ˆBÝ•T”Z  D¤NÑ 2Ñ3Ô3Ñ4Ô4ˆBÝ Øœ¨Ñ0°1Ñ4ØØÝ”8˜E‘?”? UÑ*Ý”8˜E‘?”? UÑ*ØØðñ ô ˆEð ŒK×Ò˜uÑ%Ô%Ð%ØŒJ×!Ò! 2 r (­C©E¬EÑ2Ô2×6Ò6°u´~ÑFÔFÐFÑFð)	Gð 	Gr"   úDict[Tuple[int, int], int]c                óH   — d„ | j                              ¦   «         D ¦   «         S )Nc                ó4   — i | ]\  }}|t          |¦  «        “ŒS r(   )Úlen)Ú.0ÚcoordsÚidss      r    ú
<dictcomp>z;VirtualActorBatch.get_cell_distribution.<locals>.<dictcomp>Y   s$   € ÐGÐGÐG¡[ V¨S��˜C™œÐGÐGÐGr"   )r?   Úitemsr   s    r    Úget_cell_distributionz'VirtualActorBatch.get_cell_distributionX   s$   € ØGÐG°D´J×4DÒ4DÑ4FÔ4FÐGÑGÔGÐGr"   çL7‰A`å ?Údtc                ó  — t          j        ¦   «         }| j        D �]U}|xj        |j        |z  z  c_        |xj        |j        |z  z  c_        |xj        dz  c_        t          t          j
        |j        | j        z  ¦  «        ¦  «        }t          t          j
        |j        | j        z  ¦  «        ¦  «        }||j        k    s||j        k    r |j        |j        f}|| j        v r:| j        |                              |j        ¦  «         | j        |         s| j        |= ||_        ||_        | j                             ||ft%          ¦   «         ¦  «                             |j        ¦  «         �ŒWt          j        ¦   «         }||z
  dz  S )zJExecutes one simulation step over all actors and measures tick time in ms.r   ç     @�@)ÚtimeÚperf_counterr>   r,   r.   r-   r/   r5   r   rG   rK   r:   r0   r1   r?   Údiscardr+   rO   rP   rQ   )r   rg   Út_startrZ   Únew_cxÚnew_cyÚold_cellÚt_ends           r    Ústep_simulation_tickz&VirtualActorBatch.step_simulation_tick[   sj  € åÔ#Ñ%Ô%ˆØ”[ð 	Sñ 	SˆEØˆGŒG�u”x "‘}Ñ$ˆGŒGØˆGŒG�u”x "‘}Ñ$ˆGŒGØÐÔ !Ñ#ÐÔå�œ E¤G¨d¬nÑ$<Ñ=Ô=Ñ>Ô>ˆFÝ�œ E¤G¨d¬nÑ$<Ñ=Ô=Ñ>Ô>ˆFà˜œÒ%Ð%¨°5´<Ò)?Ð)?Ø!œL¨%¬,Ð7�Ø˜tœzÐ)Ð)Ø”J˜xÔ(×0Ò0°´Ñ@Ô@Ð@Øœ: hÔ/ð 1Ø œJ xÐ0Ø%�”Ø%�”Ø”
×%Ò% v¨vÐ&6½¹¼Ñ>Ô>×BÒBÀ5Ä>ÑRÔRÐRùåÔ!Ñ#Ô#ˆØ˜‘ 6Ñ)Ð)r"   r   rX   rY   Úradius_cellsúSet[int]c                óä   — t          ¦   «         }t          | |dz   ¦  «        D ]L}t          | |dz   ¦  «        D ]5}||z   ||z   f}|| j        v r |                     | j        |         ¦  «         Œ6ŒM|S )z8Queries actors within adjacent spatial grid cells (AOI).r   )rP   rI   r?   Úupdate)r   rX   rY   rs   ÚnearbyÚdxÚdyÚcell_keys           r    Úget_nearby_actorsz#VirtualActorBatch.get_nearby_actorss   s�   € å™5œ5ˆÝ˜˜ |°aÑ'7Ñ8Ô8ð 	8ð 	8ˆBÝ˜\˜M¨<¸!Ñ+;Ñ<Ô<ð 8ð 8�Ø ™G R¨"¡WÐ-�Ø˜tœzÐ)Ð)Ø—M’M $¤*¨XÔ"6Ñ7Ô7Ð7øð8ð ˆr"   N)r   )r8   r   r9   r   r:   r   r   r;   )r   r;   )r   r\   )rf   )rg   r   r   r   )r   )rX   r   rY   r   rs   r   r   rt   )	r#   r$   r%   Ú__doc__r@   r[   re   rr   r{   r(   r"   r    r7   r7   2   s•   € € € € € Ø=Ð=ð9ð 9ð 9ð 9ð 9ðGð Gð Gð Gð8Hð Hð Hð Hð*ð *ð *ð *ð *ð0ð ð ð ð ð ð r"   r7   c                  ó²   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   dZded<   dZded<   dZded<   dS )ÚSwarmBenchmarkResultr   Úsimulated_ccuÚactive_shardsr!   r   Úspatial_grid_tick_msÚp50_latency_msÚp95_latency_msÚp99_latency_msÚram_per_node_gbÚtotal_packets_processedÚthroughput_packets_per_secÚpacket_loss_rateÚboolÚ
is_passingÚ"IN_MEMORY_ARITHMETIC_EXTRAPOLATIONr3   Úbenchmark_typeFÚis_network_socket_load_testedz~Validates in-memory spatial partitioning arithmetic. Real multi-host TCP/WebSocket socket testing requires cluster deployment.Ú
disclaimerN)r#   r$   r%   r&   rŒ   r�   rŽ   r(   r"   r    r~   r~   ~   sè   € € € € € € àÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ Ð Ð Ñ Ø%Ð%Ð%Ñ%ØÐÐÑØÐÐÑØ>€NÐ>Ð>Ð>Ñ>Ø*/Ð!Ð/Ð/Ð/Ñ/ð	Tð ð ð ð ñ ð ð r"   r~   c                  óD   — e Zd ZdZdd„Zdd
„Zdd„Zdd„Zdd„Zddd„Z	dS )ÚSwarmSimulationHarnesszJOrchestrates 1,000,000 CCU load simulation across distributed shard nodes.Úconfigr   r   r;   c                ó   — || _         d S r=   )r‘   )r   r‘   s     r    r@   zSwarmSimulationHarness.__init__—   s   € ØˆŒˆˆr"   Úactors_countr   r   c                ó„   — t          d|¦  «        }d}d}d}t          d|dz  ¦  «        }d}||||z   z  z   ||z  z   }|dz  S )	zKCalculates estimated node RAM usage for spatial hash, sockets, and buffers.r   i  i    i   r   é
   i  €g      ÐA)r   )r   r“   Úbytes_per_actorÚbytes_per_socket_bufferÚbytes_per_spatial_cellÚestimated_cellsÚbase_engine_overheadÚtotal_bytess           r    Úestimate_shard_ram_gbz,SwarmSimulationHarness.estimate_shard_ram_gbš   sv   € å˜1˜lÑ+Ô+ˆØˆØ"'ÐØ!%ÐÝ˜c <°2Ñ#5Ñ6Ô6ˆØ0Ðð !Ø˜Ð1HÑHÑIñKàÐ!7Ñ7ñ9ð 	ð
 Ð6Ñ7Ð7r"   Ú
packet_idxc                óv   — d|dz  dz  z   }t          j        |dz  ¦  «        dz  }|dz  dk    rdnd	}||z   |z   S )
z;Generates synthetic roundtrip gateway network latency (ms).gÍÌÌÌÌÌü?rC   rD   gÃõ(\�ÂÅ?g333333ã?éx   r   g      !@ç        )rG   rM   )r   r�   Úbase_msÚ	jitter_msÚspike_mss        r    Ú _simulate_gateway_latency_samplez7SwarmSimulationHarness._simulate_gateway_latency_sampleª   sV   € à˜ a™¨4Ñ/Ñ/ˆÝ”H˜Z¨$Ñ.Ñ/Ô/°#Ñ5ˆ	Ø%¨Ñ+¨qÒ0Ð0�3�3°sˆØ˜Ñ" XÑ-Ð-r"   Úram_per_noder~   c                ót   — t          | j        j        | j        j        | j        j        dddd|dddd¬¦  «        S )zLReturns baseline non-passing result when 0 sample ticks or actors requested.r    r   F©r   r€   r!   r�   r‚   rƒ   r„   r…   r†   r‡   rˆ   rŠ   )r~   r‘   r   r   r!   )r   r¥   s     r    Ú_compute_empty_resultz,SwarmSimulationHarness._compute_empty_result±   sL   € å#Øœ+Ô9Øœ+Ô2Ø!œ[Ô9Ø!$ØØØØ(Ø$%Ø'*Ø Øð
ñ 
ô 
ð 	
r"   Útotal_packetsúTuple[float, float, float]c                ó*  ‡ — ˆ fd„t          t          d|¦  «        ¦  «        D ¦   «         }|                     ¦   «          t          |¦  «        }|t	          |dz  ¦  «                 |t	          |dz  ¦  «                 |t	          |dz  ¦  «                 fS )zLCalculates p50, p95, and p99 gateway network latencies from sampled packets.c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r(   )r¤   )r`   Úpr   s     €r    ú
<listcomp>z<SwarmSimulationHarness._sample_latencies.<locals>.<listcomp>Ä   s'   ø€ ÐgÐgÐgÀ!�T×:Ò:¸1Ñ=Ô=ÐgÐgÐgr"   iˆ  g      à?gffffffî?g®Gáz®ï?)rI   ÚminÚsortr_   r   )r   r©   Ú	latenciesÚns   `   r    Ú_sample_latenciesz(SwarmSimulationHarness._sample_latenciesÂ   sˆ   ø€ àgÐgÐgÐgÅuÍSÐQUÐWdÑMeÔMeÑGfÔGfÐgÑgÔgˆ	Ø�ŠÑÔÐÝ�	‰NŒNˆØ�˜Q ™X™œÔ'¨µ3°q¸4±x±=´=Ô)AÀ9ÍSÐQRÐUYÑQYÉ]Ì]ÔC[Ð[Ð[r"   r•   Úsample_ticksc                óø  ‡ ‡— ‰                       ‰ j        j        ¦  «        }|dk    s‰ j        j        dk    r‰                      |¦  «        S t          d‰ j        j        ‰ j        j        ¬¦  «        Š‰                     ¦   «          ˆˆ fd„t          |¦  «        D ¦   «         }t          |¦  «        t          |¦  «        z  }‰ j        j        |z  }‰                      |¦  «        \  }}}t          ‰ j        j        ‰ j        j        z  ¦  «        }	|d‰ j        j        z  k     o|‰ j        j        k     o|‰ j        j        k     }
t#          ‰ j        j        ‰ j        j        ‰ j        j        |||||||	d|
¬¦  «        S )z?Executes distributed swarm simulation and computes SLA metrics.r   r   )r8   r9   r:   c                óV   •— g | ]%}‰                      d ‰j        j        z  ¬¦  «        ‘Œ&S )g      ð?)rg   )rr   r‘   r   )r`   Ú_Úsample_batchr   s     €€r    r®   z8SwarmSimulationHarness.run_benchmark.<locals>.<listcomp>Ö   sD   ø€ ð 
ð 
ð 
àð ×-Ò-°°t´{Ô7VÑ1VÐ-ÑWÔWð
ð 
ð 
r"   ri   r    r§   )rœ   r‘   r!   r   r¨   r7   r   r[   rI   Úsumr_   r³   r   r   r   r   r   r~   r   )r   r´   r¥   Útick_durationsÚavg_tick_msr©   Úp50Úp95Úp99Ú
throughputrŠ   r¸   s   `          @r    Úrun_benchmarkz$SwarmSimulationHarness.run_benchmarkÉ   s¡  øø€ à×1Ò1°$´+Ô2NÑOÔOˆØ˜1ÒÐ ¤Ô @ÀAÒ EÐ EØ×-Ò-¨lÑ;Ô;Ð;å(ØØœÔ8Ø”kÔ3ð
ñ 
ô 
ˆð
 	×&Ò&Ñ(Ô(Ð(ð
ð 
ð 
ð 
ð 
å˜<Ñ(Ô(ð
ñ 
ô 
ˆõ ˜.Ñ)Ô)­C°Ñ,?Ô,?Ñ?ˆàœÔ8¸<ÑGˆØ×.Ò.¨}Ñ=Ô=‰ˆˆS�#å˜4œ;Ô:¸T¼[Ô=\Ñ\Ñ]Ô]ˆ
à˜6 D¤KÔ$CÑCÒDð ?Ø�d”kÔ7Ò7ð?à˜tœ{Ô>Ò>ð 	õ $Øœ+Ô9Øœ+Ô2Ø!œ[Ô9Ø!,ØØØØ(Ø$1Ø'1Ø Ø!ð
ñ 
ô 
ð 	
r"   N)r‘   r   r   r;   )r“   r   r   r   )r�   r   r   r   )r¥   r   r   r~   )r©   r   r   rª   )r•   )r´   r   r   r~   )
r#   r$   r%   r|   r@   rœ   r¤   r¨   r³   rÀ   r(   r"   r    r�   r�   ”   s›   € € € € € ØTÐTðð ð ð ð8ð 8ð 8ð 8ð .ð .ð .ð .ð
ð 
ð 
ð 
ð"\ð \ð \ð \ð*
ð *
ð *
ð *
ð *
ð *
ð *
r"   r�   )r|   Ú
__future__r   Údataclassesr   r   rG   rj   Útypingr   r   r   r	   r   r*   r7   r~   r�   r(   r"   r    ú<module>rÄ      s°  ððð ð #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø €€€Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )ð €�˜dÐ#Ñ#Ô#ðEð Eð Eð Eð Eñ Eô Eñ $Ô#ðEð €�ÐÑÔð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ Ôð	ðIð Ið Ið Ið Iñ Iô Ið IðX €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð*_
ð _
ð _
ð _
ð _
ñ _
ô _
ð _
ð _
ð _
r"   