import numpy as np
from sklearn.neighbors import NearestNeighbors


def undersample(X, y, majority_class, k = 10, knn_algorithm = 'auto', knn_metric = 'euclidean'):
  n, _ = X.shape
  verdict = np.ones(n, dtype=bool)

  # Step - 1: Find k nearest neighbors of all the data points 
  nearest_neighbors = NearestNeighbors(n_neighbors = k, algorithm = knn_algorithm, metric = knn_metric).fit(X)
  _, nearest_neighbors_idx = nearest_neighbors.kneighbors(X)

  # Step - 2: Delete elements from Majority Class
  for i in range(n):
    if(y[i] == majority_class):
      tmp = 0
      for j in nearest_neighbors_idx[i]:
        tmp += y[j]
      tmp/=3
      if(tmp<0.3):
        verdict[i] = False
    else:
      tmp = 0
      for j in nearest_neighbors_idx[i]:
        tmp += y[j]
      tmp/=3
      if(tmp>0.3):    
        for j in nearest_neighbors_idx[i]:
          if(y[j] == majority_class):
            verdict[j] == False

  return verdict            
import numpy as np
from sklearn.neighbors import NearestNeighbors


def undersample(X, y, majority_class, k = 10, knn_algorithm = 'auto', knn_metric = 'euclidean'):
  n, _ = X.shape
  verdict = np.ones(n, dtype=bool)

  # Step - 1: Find k nearest neighbors of all the data points 
  nearest_neighbors = NearestNeighbors(n_neighbors = k, algorithm = knn_algorithm, metric = knn_metric).fit(X)
  _, nearest_neighbors_idx = nearest_neighbors.kneighbors(X)

  # Step - 2: Delete elements from Majority Class
  for i in range(n):
    if(y[i] == majority_class):
      tmp = 0
      for j in nearest_neighbors_idx[i]:
        tmp += y[j]
      tmp/=3
      if(tmp<0.3):
        verdict[i] = False
    else:
      tmp = 0
      for j in nearest_neighbors_idx[i]:
        tmp += y[j]
      tmp/=3
      if(tmp>0.3):    
        for j in nearest_neighbors_idx[i]:
          if(y[j] == majority_class):
            verdict[j] == False

  return verdict            
# Step - 1: Find k nearest neighbors of all the data points # Step - 2: Delete elements from Majority Class