def indicatorize_class(y):
  assert(mathutil.is_np_col_vector(y))
  y -= 1
  num_samples = np.size(y)
  y_classes = np.unique(y).reshape((-1))
  min_class_num = np.min(y_classes)
  max_class_num = np.max(y_classes)
  assert(min_class_num>=0)
  class_indicator_y = np.zeros((num_samples, max_class_num+1), dtype=np.float64)
  class_indicator_y[np.arange(0, num_samples), y[:,-1]] = 1.0
  return class_indicator_y
def train_one_vs_all_classifier(aug_x, y, num_labels, lagrange_lambda):
  n_samples, n_features = aug_x.shape
  all_theta = np.empty((num_labels, n_features), dtype=np.float64)
  assert(mathutil.is_np_col_vector(y))
  y_arr = np.reshape(y, -1)
  for label in range(0, num_labels):
    y_label_indicator = np.zeros_like(y_arr)
    assert(np.any(y==label))
    y_label_indicator[y_arr==label] = 1
    all_theta[label, :] = train_logistic_regression(aug_x, 
                                                    y_label_indicator.astype(np.float64),
                                                    lagrange_lambda)
  return all_theta