v2rmp 0.5.0

rmpca — Route Optimization TUI
Documentation
�

��j,6��V�SrSSKrSSKJr SSKJs Jr SSKJrJ	r	 "SS\R5r"SS\R5r"SS	\R5r
"S
S\R5r"SS
\R5r"SS\R5rSS\S\S\4Sjjrg)u	
CVRP Neural Solver — Traceable Attention Model for ONNX export.

This implements the exact same architecture as train_cvrp.py but with a
fully traceable decoder that uses no data-dependent Python control flow.
The traceable version is used for ONNX export only.
�N)�Tuple�Optionalc	�^�\rSrSrS\S\4U4SjjrSS\RS\RS\\RS\R4S	jjr	S
r
U=r$)�MultiHeadAttention��dim�	num_headsc�X>�[TU]5 X-S:XdeXlX lX-UlURS-Ul[R"XSS9Ul[R"XSS9Ul	[R"XSS9Ul
[R"XSS9Ulg)Nr��F��bias)�super�__init__rr	�head_dim�scale�nn�Linear�Wq�Wk�Wv�Wo��selfrr	�	__class__s   ��"/home/rmp/v2rmp/traceable_model.pyr�MultiHeadAttention.__init__s����
������!�#�#�#���"���(��
��]�]�d�*��
��)�)�C�5�1����)�)�C�5�1����)�)�C�5�1����)�)�C�5�1����q�kv�mask�returnc��URupEnURSnURU5RXEURUR5RSS5nUR
U5RXGURUR5RSS5n	URU5RXGURUR5RSS5n
[R"X�RSS55UR-nUb*URURS5[S55n[R"USS9n[R"X�5RSS5R!5RXEUR"5nUR%U5$)N�������������-inf�r)�shaper�viewr	r�	transposerr�torch�matmulr�masked_fill�	unsqueeze�float�F�softmax�
contiguousrr)
rrrr �B�N_q�_�N_kv�Q�K�V�attn�outs
             r�forward�MultiHeadAttention.forward"sJ���G�G�	����x�x��{���G�G�A�J�O�O�A�D�N�N�D�M�M�B�L�L�Q�PQ�R���G�G�B�K���Q�d�n�n�d�m�m�D�N�N�q�RS�T���G�G�B�K���Q�d�n�n�d�m�m�D�N�N�q�RS�T���|�|�A�{�{�2�r�2�3�d�j�j�@�����#�#�D�N�N�1�$5�u�V�}�E�D��y�y��2�&���l�l�4�#�-�-�a��3�>�>�@�E�E�a�d�h�h�W���w�w�s�|�r)rrrrrrr	r�N��__name__�
__module__�__qualname__�__firstlineno__�intrr,�Tensorrr=�__static_attributes__�
__classcell__�rs@rrrsX���2�C�2�C�2�04������5�<�<���u�|�|�,��8=����rrc�^�\rSrSrS\S\S\4U4SjjrSS\RS\\RS\R4S	jjr	S
r
U=r$)�TransformerEncoderLayer�5rr	�ff_dimc�^>�[TU]5 [X5Ul[R
"U5Ul[R"[R"X5[R"5[R"X155Ul
[R
"U5Ulgr?)rrr�mhar�	LayerNorm�norm1�
Sequentialr�ReLU�ff�norm2)rrr	rMrs    �rr� TransformerEncoderLayer.__init__6sm���
����%�c�5����\�\�#�&��
��-�-��I�I�c�"��G�G�I��I�I�f�"�
���
�\�\�#�&��
r�xr r!c��URXRXU5-5nURXRU5-5nU$r?)rQrOrUrT)rrWr s   rr=�TransformerEncoderLayer.forwardAs;���J�J�q�8�8�A�$�/�/�0���J�J�q�7�7�1�:�~�&���r)rTrOrQrUr?r@rIs@rrKrK5sM���	'�C�	'�C�	'��	'������X�e�l�l�-C��u�|�|��rrKc�^�\rSrSrS\S\S\S\4U4SjjrS\RS\RS	\\R\R44S
jr	Sr
U=r$)�	AMEncoder�Grr	�
num_layersrMc
��>�[TU]5 [R"SU5Ul[R
"[
U5Vs/sHn[XU5PM sn5Ulgs snf)N�)	rrrr�
input_proj�
ModuleList�rangerK�layers)rrr	r]rMr6rs      �rr�AMEncoder.__init__Hs\���
�����)�)�A�s�+����m�m��:�&�%
�&��
$�C�F�;�&�%
�����%
s�	A,�locs�demandsr!c��[R"X/SS9nURU5nURHnU"U5nM
 UR	SSS9nX54$)Nr&r(r#T)r�keepdim)r,�catr`rc�mean)rrerfrW�layer�graph_embeds      rr=�AMEncoder.forwardPsU���I�I�t�o�2�.���O�O�A����[�[�E��a��A�!��f�f��D�f�1���~�r)r`rc)rArBrCrDrErr,rFrr=rGrHrIs@rr[r[Gs`����C��C��S��#���E�L�L��5�<�<��E�%�,�,�X]�Xd�Xd�Jd�De��rr[c��^�\rSrSrSrS\S\4U4SjjrS\RS\RS\RS	\RS
\S\	\R\R44Sjr
S
rU=r$)�TraceableDecoder�_z�
Fully traceable autoregressive decoder.
Uses a fixed number of decoding steps (max_steps = 2*N) and tensor masking
instead of Python if/break. Compatible with torch.export and ONNX export.
rr	c�>�[TU]5 XlX-UlURS-UlSUl[R"US-U5Ul[R"XSS9Ul	[R"XSS9Ul
g)Nrg$@r_Fr)rrrrr�	tanh_cliprr�context_projrrrs   �rr�TraceableDecoder.__init__fso���
�������(��
��]�]�d�*��
�����I�I�c�A�g�s�3����)�)�C�5�1����)�)�C�5�1��r�node_embeddingsrlrf�capacity�	max_stepsr!c�6�URupgnURn	URU5n
USS2SS2SS24n/n/n
[R"Xg[R
U	S9nSUSS2S4'[R"U[RU	S9nUR5n[U5GH=nU[R"U5U4RS5n[R"X+U/SS9nURU5RS5nURU5nURS5U
-RSS9UR -nUR"[R$"UUR"-5-nUR'U[)S55nUU:�nUR'U[)S55n[*R,"USS9n[R."USS9n[R0"U[R"U5U4S	-5nUR3U5 U
R3U5 U[R"XyS
9RS5URS5:H-nUnUS:HRS5n[R4"UUU5nU[R"U5U4RS5nUU-
n[R4"UUUU-5nGM@ [R6"USS9n[R6"U
SS9nUU4$)z�
Args:
    node_embeddings: [B, N+1, dim]
    graph_embed:     [B, 1, dim]
    demands:         [B, N+1]
    capacity:        [B, 1]
    max_steps:       fixed number of decoding steps

Returns:
    actions: [B, max_steps]
    log_p:   [B, max_steps]
Nrr#)�dtype�deviceTr&r(r'g#B����;)rz)r)rzrr,�zeros�bool�long�clonerb�aranger/rirs�squeezer�sumrrr�tanhr.r0r1r2�argmax�log�append�where�stack)rrurlrfrvrwr4�Np1r6rz�keys�first_node_embed�actions_list�
log_p_list�visited�cur_loc�rem_cap�	cur_embed�ctx�context�query�compat�demand_exceeds�probs�action�log_prob�at_depot�consumed�actions�log_ps                              rr=�TraceableDecoder.forwardqs���"$�)�)�	��� �'�'���w�w��'��+�1�a��c�1�9�5�����
��+�+�a�E�J�J�v�F�����1��
��+�+�a�u�z�z�&�A���.�.�"���y�!�A�'����Q���(@�A�K�K�A�N�I��)�)�[�I�F�B�O�C��'�'��,�4�4�Q�7�G��G�G�G�$�E��o�o�a�(�4�/�4�4��4�<�t�z�z�I�F��^�^�e�j�j��$�.�.�1H�&I�I�F��'�'���v��?�F�%�w�.�N��'�'���f�
�F�F��I�I�f�"�-�E��\�\�%�R�0�F��y�y��u�|�|�A���'>�!?�%�!G�H�H�����'����h�'�����c�!A�!K�!K�A�!N�RX�Rb�Rb�cd�Re�!e�f�G��G��!��.�.�q�1�H��k�k�(�H�g�>�G��u�|�|�A���6�7�A�A�!�D�H���(�G��k�k�(�H�g��6H�I�G�a"�d�+�+�l��3�����J�B�/����~�r)rrrsrrrrr�
rArBrCrD�__doc__rErr,rFrr=rGrHrIs@rroro_s�����	2�C�	2�C�	2�b�u�|�|�b�"�\�\�b����b� �,�,�b��	b�$)����u�|�|�)C�#D�	b�brroc��^�\rSrSrSrSS\S\S\S\4U4SjjjrS\RS	\RS
\RS\S\	\R\R44
S
jr
SrU=r$)�TraceableCVRPModel��z�
CVRP solver with traceable decoder. Identical architecture to CVPRouteModel
but decoder uses tensor-only operations for ONNX compatibility.
�
embedding_dimr	�num_encoder_layers�
ff_hidden_dimc�d>�[TU]5 [XX45Ul[	X5Ulgr?)rrr[�encoderro�decoder)rr�r	r�r�rs     �rr�TraceableCVRPModel.__init__�s)���
���� ��;M�]���'�
�A��rrerfrvrwr!c�z�URS5nURX5upgURXgXSU5up�X�4$)z�
Args:
    locs:     [B, N+1, 2]
    demands:  [B, N+1, 1]
    capacity: [B, 1]
    max_steps: decoding steps

Returns:
    actions: [B, max_steps]
    log_p:   [B, max_steps]
r&)r�r�r�)
rrerfrvrw�demands_flat�node_emb�	graph_embr�r�s
          rr=�TraceableCVRPModel.forward�s@�����r�*��"�l�l�4�9������h�<�S\�]����~�r)r�r�)���ir�rIs@rr�r��s�����
CD�CF�B�c�B�C�B�%(�B�=@�B�B��E�L�L��5�<�<���,�,��36��;@����u�|�|�A[�;\��rr�c
�^�\rSrSrSrS\4U4SjjrS\RS\RS\RS\	\R\R44S	jr
S
rU=r$)�ONNXExportWrapper��u�
Wraps the traceable model to match the exact I/O the v2rmp MCP server expects:

Inputs:
  locs:     [1, N, 2]   — customer locations only (no depot)
  demand:   [1, N, 1]   — customer demands
  capacity: [1, 1]      — vehicle capacity

Outputs:
  actions: [1, max_steps] — visit sequence (includes depot returns as 0)
  log_p:   [1, max_steps] — log probabilities

The depot is implicitly at (0.5, 0.5) with demand 0, automatically prepended.
�modelc�.>�[TU]5 Xlgr?)rrr�)rr�rs  �rr�ONNXExportWrapper.__init__
s���
�����
rre�demandrvr!c��URSnURSnUS-n[R"USS4SURURS9n[R
"Xq/SS9n[R"USSURURS9n	[R
"X�/SS9n
URX�X65up�X�4$)Nrr#r_r$g�?)rzryr()r)r,�fullrzryrir{r�)
rrer�rvr4�Nrw�	depot_loc�	full_locs�depot_demand�full_demandsr�r�s
             rr=�ONNXExportWrapper.forwards����J�J�q�M���J�J�q�M����E�	��J�J��1�a�y�#�d�k�k����T�	��I�I�y�/�Q�7�	��{�{�1�a��6�=�=����U���y�y�,�!7�Q�?�����I�X�Q����~�r)r�)
rArBrCrDr�r�rr,rFrr=rGrHrIs@rr�r��s[���
��0���E�L�L��%�,�,���,�,��+0����u�|�|�1K�+L��rr��checkpoint_path�	onnx_path�onnx_problem_sizec��SSKnSSKJnJn [R
"USSS9nUSn[
URURURURS9nU"U5n	U	RUS	5 URRU	RR55 URRRU	RRR55 URR RU	RR R55 URR"RU	RR"R55 UR%5 ['U5n
U
R%5 [R("S
US5n[R*"S
US
5n[R,"S//5n
[/S
USUS35 [R0R3U
X�U
4USSS/SQSS/S9 SSKnURU5nUR4R7U5 SSKnSSKnUR=U5nUR?SUR;5RAURB5UR;5RAURB5U
R;5RAURB5S.5n[/SU35 [/SUSRDSUS
RD35 [/SUSSSS2435 U$)zV
Load a PyTorch checkpoint from train_cvrp.py, build traceable model, export to ONNX.
rN)�
CVPRouteModel�
CVRPConfig�cpuF)�map_location�weights_only�config)r�r	r�r��model_state_dictr#r$g�?zExporting ONNX model to z (problem_size=z)...T�)rer�rvr�r�)�
export_params�
opset_version�do_constant_folding�input_names�output_namesu'✅ ONNX model exported and validated: z   actions shape: z, log_p shape: z   First 15 actions: �)#�os�
train_cvrpr�r�r,�loadr�r�r	r�r��load_state_dictr��
state_dictr�rrrs�evalr��randn�ones�tensor�print�onnx�export�checker�check_model�onnxruntime�numpy�InferenceSession�run�astype�float32r))r�r�r�r�r�r��ckpt�train_configr��
trained_model�wrapper�
dummy_locs�dummy_demand�dummy_capacityr��
onnx_model�ort�np�sess�results                    r�export_trained_to_onnxr�"s���
�4��:�:�o�E��N�D���>�L�
�"�0�0��(�(�'�:�:�"�0�0�	
�E�"�,�/�M��!�!�$�'9�":�;�
�M�M�!�!�-�"7�"7�"B�"B�"D�E�	�M�M���$�$�]�%:�%:�%=�%=�%H�%H�%J�K�	�M�M���$�$�]�%:�%:�%=�%=�%H�%H�%J�K�	�M�M���.�.�}�/D�/D�/Q�/Q�/\�/\�/^�_�	�J�J�L���&�G��L�L�N����Q� 1�1�5�J��:�:�a�!2�A�6�L��\�\�C�5�'�*�N�	�$�Y�K��?P�>Q�QU�
V�W�
�J�J����	�>�2���� �2���)��	�����9�%�J��L�L���Z�(������	�*�D�
�X�X�d�� � �"�)�)�"�*�*�5��$�$�&�-�-�b�j�j�9�"�(�(�*�1�1�"�*�*�=���F�
�3�I�;�
?�@�	��v�a�y���/��v�a�y���>O�
P�Q�	�!�&��)�A�s��s�F�"3�!4�
5�6��r)�2)r�r,�torch.nnr�torch.nn.functional�
functionalr1�typingrr�ModulerrKr[ror�r��strrEr��rr�<module>r�s����
����"������B�b�i�i��$��	�	��0t�r�y�y�t�v�����F"��	�	�"�L57�I�C�I�C�I�.1�Ir