docstr: Return a list of KeyedJaggedTensor, where each KeyedJaggedTensor
  represents one step's sparse data.
  
  Under the hood, we perform the following steps:
  1. Split state_id_list, state_id_score_list, action_id_list, and
  action_id_score_list by steps
  2. Treat state_id_list and action_id_list features as id_score_list
  features with weight=1
  3. Concatenate state_id_list, state_id_score_list, action_id_list, and
  action_id_score_list at each step
docstr_tok: ["Return","a","list","of","KeyedJaggedTensor",",","where","each","KeyedJaggedTensor","represents","one","step","'s","sparse","data",".","Under","the","hood",",","we","perform","the","following","steps",":","1",".","Split","state_id_list",",","state_id_score_list",",","action_id_list",",","and","action_id_score_list","by","steps","2",".","Treat","state_id_list","and","action_id_list","features","as","id_score_list","features","with","weight=1","3",".","Concatenate","state_id_list",",","state_id_score_list",",","action_id_list",",","and","action_id_score_list","at","each","step"]
code: def create_sparse_data_per_step(
      self,
      state_id_list: KeyedJaggedTensor,
      state_id_score_list: KeyedJaggedTensor,
      action_id_list: KeyedJaggedTensor,
      action_id_score_list: KeyedJaggedTensor,
      seq_len: int,
  ):
      """
      Return a list of KeyedJaggedTensor, where each KeyedJaggedTensor
      represents one step's sparse data.
  
      Under the hood, we perform the following steps:
      1. Split state_id_list, state_id_score_list, action_id_list, and
      action_id_score_list by steps
      2. Treat state_id_list and action_id_list features as id_score_list
      features with weight=1
      3. Concatenate state_id_list, state_id_score_list, action_id_list, and
      action_id_score_list at each step
      """
      # Convert id_list data as id score list data with weight = 1
      state_id_list._weights = torch.ones_like(state_id_list.values())
      action_id_list._weights = torch.ones_like(action_id_list.values())
  
      # For each step, we merge all sparse data into one KeyedJaggedTensor
      state_id_list_per_step = split_sequence_keyed_jagged_tensor(
          state_id_list, seq_len
      )
      state_id_score_list_per_step = split_sequence_keyed_jagged_tensor(
          state_id_score_list, seq_len
      )
      action_id_list_per_step = split_sequence_keyed_jagged_tensor(
          action_id_list, seq_len
      )
      action_id_score_list_per_step = (
          split_sequence_keyed_jagged_tensor(
              action_id_score_list, seq_len
          )
      )
      sparse_data_per_step = [
          KeyedJaggedTensor.concat(
              [
                  state_id_list_per_step[i],
                  action_id_list_per_step[i],
                  state_id_score_list_per_step[i],
                  action_id_score_list_per_step[i],
              ]
          )
          for i in range(seq_len)
      ]
      return sparse_data_per_step
  
imports: import logging
  from typing import List
  import torch
  import torch.nn
  from reagent.core import types
  from reagent.core.torch_utils import split_sequence_keyed_jagged_tensor
  from reagent.models.base import ModelBase
  from reagent.models.fully_connected_network import ACTIVATION_MAP
  from reagent.models.synthetic_reward import _gen_mask
  from torchrec import EmbeddingBagCollection
  from torchrec.models.dlrm import InteractionArch, SparseArch
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor
label_desc: Use image node_id 4 for calling the SingleStepSyntheticSparseArchRewardNet obj's underlying member method code with example usage: obj.create_sparse_data_per_step(state_id_list, state_id_score_list, action_id_list, action_id_score_list, seq_len) and returns: sparse_data_per_step