def gradients_XX(self, dL_dK, X, X2=None):
if X2 is None:<EOL><INDENT>X2 = X<EOL><DEDENT>return np.zeros((X.shape[<NUM_LIT:0>], X2.shape[<NUM_LIT:0>], X.shape[<NUM_LIT:1>], X.shape[<NUM_LIT:1>]))<EOL>
Given the derivative of the objective K(dL_dK), compute the second derivative of K wrt X and X2:

returns the full covariance matrix [QxQ] of the input dimensionfor each pair or vectors, thus
the returned array is of shape [NxNxQxQ].

..math:
    \frac{\partial^2 K}{\partial X2 ^2} = - \frac{\partial^2 K}{\partial X\partial X2}

..returns:
    dL2_dXdX2:  [NxMxQxQ] for X [NxQ] and X2[MxQ] (X2 is X if, X2 is None)
                Thus, we return the second derivative in X2.