(self, pub_obses, range_idxs)
return final
1. do list -> padded
        2. feed through pre-processing fc layers
        3. PackedSequence (sort, pack)
        4. rnn
        5. unpack (unpack re-sort)
        6. cut output to only last entry in sequence

        Args:
            pub_obses (list):                 list of np arrays of shape [np.arr([history_len, n_features]), ...)
            range_idxs (LongTensor):        range_idxs (one for each pub_obs) tensor([2, 421, 58, 912, ...])
1. do list -> padded
        2. feed through pre-processing fc layers
        3. PackedSequence (sort, pack)
        4. rnn
        5. unpack (unpack re-sort)
        6. cut output to only last entry in sequence
1 . do list - > padded 2 . feed through pre - processing fc layers 3 . PackedSequence ( sort pack ) 4 . rnn 5 . unpack ( unpack re - sort ) 6 . cut output to only last entry in sequence
def forward(self, pub_obses, range_idxs):
        """
        1. do list -> padded
        2. feed through pre-processing fc layers
        3. PackedSequence (sort, pack)
        4. rnn
        5. unpack (unpack re-sort)
        6. cut output to only last entry in sequence

        Args:
            pub_obses (list):                 list of np arrays of shape [np.arr([history_len, n_features]), ...)
            range_idxs (LongTensor):        range_idxs (one for each pub_obs) tensor([2, 421, 58, 912, ...])
        """

        # ____________________________________________ Packed Sequence _____________________________________________
        priv_obses = self.lut_range_idx_2_priv_o[range_idxs]

        if isinstance(pub_obses, list):
            pub_obses = torch.from_numpy(np.array(pub_obses)).to(self.device, torch.float32)

        if self.args.use_pre_layers:
            _board_obs = pub_obses[:, self.board_start:self.board_stop]
            _hist_and_state_obs = torch.cat([
                pub_obses[:, :self.board_start],
                pub_obses[:, self.board_stop:]
            ],
                dim=-1
            )
            y = self._feed_through_pre_layers(board_obs=_board_obs, priv_obs=priv_obses,
                                              hist_and_state_obs=_hist_and_state_obs)

        else:
            y = torch.cat((priv_obses, pub_obses,), dim=-1)

        final = self._relu(self.final_fc_1(y))
        final = self._relu(self.final_fc_2(final) + final)

        # Normalize last layer
        if self.args.normalize:
            final = final - final.mean(dim=-1).unsqueeze(-1)
            final = final / final.std(dim=-1).unsqueeze(-1)

        return final
def forward ( self , pub_obses , range_idxs ) : # ____________________________________________ Packed Sequence _____________________________________________ priv_obses = self . lut_range_idx_2_priv_o [ range_idxs ] if isinstance ( pub_obses , list ) : pub_obses = torch . from_numpy ( np . array ( pub_obses ) ) . to ( self . device , torch . float32 ) if self . args . use_pre_layers : _board_obs = pub_obses [ : , self . board_start : self . board_stop ] _hist_and_state_obs = torch . cat ( [ pub_obses [ : , : self . board_start ] , pub_obses [ : , self . board_stop : ] ] , dim = - 1 ) y = self . _feed_through_pre_layers ( board_obs = _board_obs , priv_obs = priv_obses , hist_and_state_obs = _hist_and_state_obs ) else : y = torch . cat ( ( priv_obses , pub_obses , ) , dim = - 1 ) final = self . _relu ( self . final_fc_1 ( y ) ) final = self . _relu ( self . final_fc_2 ( final ) + final ) # Normalize last layer if self . args . normalize : final = final - final . mean ( dim = - 1 ) . unsqueeze ( - 1 ) final = final / final . std ( dim = - 1 ) . unsqueeze ( - 1 ) return final