I would like to run these two parts of the code in parallel. Is this possible in python? How would i have to modify the code to accommodate this?
def smo(self, X, y):
    iterations = 0
    n_samples = X.shape[0]
    # Initial coefficients
    alpha = numpy.zeros(n_samples)
    # Initial gradient
    g = numpy.ones(n_samples)
    while True:
        yg = g * y
        # KKT Conditions
        y_pos_ind = (y == 1)
        y_neg_ind = (numpy.ones(n_samples) - y_pos_ind).astype(bool)
        alpha_pos_ind = (alpha >= self.C)
        alpha_neg_ind = (alpha <= 0)
        indices_violating_Bi_1 = y_pos_ind * alpha_pos_ind
        indices_violating_Bi_2 = y_neg_ind * alpha_neg_ind
        indices_violating_Bi = indices_violating_Bi_1 + indices_violating_Bi_2
        yg_i = yg.copy()
        yg_i[indices_violating_Bi] = float('-inf')
        # First of the maximum violating pair
        i = numpy.argmax(yg_i)
        Kik = self.kernel_matrix(X, i)
        indices_violating_Ai_1 = y_pos_ind * alpha_neg_ind
        indices_violating_Ai_2 = y_neg_ind * alpha_pos_ind
        indices_violating_Ai = indices_violating_Ai_1 + indices_violating_Ai_2
        yg_j = yg.copy()
        yg_j[indices_violating_Ai] = float('+inf')
        # Second of the maximum violating pair
        j = numpy.argmin(yg_j)
        Kjk = self.kernel_matrix(X, j)
        # Optimality criterion
        if(yg_i[i] - yg_j[j]) < self.tol or (iterations >= self.max_iter):
            break
        min_term_1 = (y[i] == 1) * self.C - y[i] * alpha[i]
        min_term_2 = y[j] * alpha[j] + (y[j] == -1) * self.C
        min_term_3 = (yg_i[i] - yg_j[j]) / (Kik[i] + Kjk[j] - 2 * Kik[j])
        # Direction search
        lamda = numpy.min([min_term_1, min_term_2, min_term_3])
        # Gradient update
        g += lamda * y * (Kjk - Kik)
        # Update coefficients
        alpha[i] = alpha[i] + y[i] * lamda
        alpha[j] = alpha[j] - y[j] * lamda
        iterations += 1
    print('{} iterations to arrive at the minimum'.format(iterations))
    return alpha
I would like to run this line
Kik = self.kernel_matrix(X, i)
and this line
Kjk = self.kernel_matrix(X, j)
in parallel. How do i change the code to accommodate this?
 
    