def _extract_t_indices(self, X, X2=None, dL_dK=None):
<EOL>self._t = X[:, <NUM_LIT:0>]<EOL>if not X.shape[<NUM_LIT:1>] == <NUM_LIT:2>:<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>self._index = np.asarray(X[:, <NUM_LIT:1>],dtype=np.int)<EOL>self._order = self._index.argsort()<EOL>self._index = self._index[self._order]<EOL>self._t = self._t[self._order]<EOL>self._rorder = self._order.argsort() <EOL>if X2 is None:<EOL><INDENT>self._t2 = None<EOL>self._index2 = None<EOL>self._order2 = self._order<EOL>self._rorder2 = self._rorder<EOL><DEDENT>else:<EOL><INDENT>if not X2.shape[<NUM_LIT:1>] == <NUM_LIT:2>:<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>self._t2 = X2[:, <NUM_LIT:0>]<EOL>self._index2 = np.asarray(X2[:, <NUM_LIT:1>],dtype=np.int)<EOL>self._order2 = self._index2.argsort()<EOL>self._index2 = self._index2[self._order2]<EOL>self._t2 = self._t2[self._order2]<EOL>self._rorder2 = self._order2.argsort() <EOL><DEDENT>if dL_dK is not None:<EOL><INDENT>self._dL_dK = dL_dK[self._order, :]<EOL>self._dL_dK = self._dL_dK[:, self._order2]<EOL><DEDENT>
Extract times and output indices from the input matrix X. Times are ordered according to their index for convenience of computation, this ordering is stored in self._order and self.order2. These orderings are then mapped back to the original ordering (in X) using self._rorder and self._rorder2.