import numpy as np
import scipy.spatial.distance as dist

class Linear(object):
	def __call__(self, x, y):
		return np.dot(x, y.T)

	def __repr__(self):
		return ("Linear Kernel")

class Poly(object):
	def __init__(self, degree=2):
		self.degree = degree

	def __call__(self, x, y):
		return (np.dot(x,y.T) ** self.degree)

	def __repr__(self):
		return ("Poly Kernel")

class RBF(object):
	def __init__(self, gamma = 0.1):
		self.gamma = gamma

	def __call__(self, x, y)
		x = np.atleast_2d(x)
		y = np.atlease_2d(y)

		return (np.exp(-self.gamma * dist.cdist(x,y) ** 2).flatten())

	def __repr__(self):
		return ("RBF kernel")
