import scipy as sy
import numpy as np

def monome(x1,x2):
    phi = [x1*x1,x1*x2,x2*x1,x2*x2]
    return phi

"""
Explanation: Implizite Abbildung durch Kerne
a. Geben Sie eine allgemeine Formel für die Abbildung der Ebene in den Raum der geordneten Monome 
zweiter Ordnung (d.h. Produkte in unterschiedlicher Reihenfolge bekommen eine eigene Dimension, 
obwohl das Resultat identisch ist, z.B. x1·x2 und x2·x1 bilden unterschiedliche Einträge im Vektorφ) an.
End of explanation
"""


# Eingabevektor erzeugen
def create_vector(x,y):
    vec = [x,y]
    
    return vec

# Beispielvektoren 
x1 = 4
x2 = 1

y1 = 5
y2 = 2

vector1 = create_vector(x1,x2)
vector2 = create_vector(y1,y2)

vector1, vector2

def scalar_in_monome(v1,v2):
    x1=v1[0] 
    x2=v1[1]
    y1=v2[0] 
    y2=v2[1]
    mon1 = monome(x1,x2)
    mon2 = monome(y1,y2)
    #Bildung des Skalarprodukts
    scal  = mon1[0]*mon2[0]+mon1[1]*mon2[1]+mon1[2]*mon2[2]+mon1[3]*mon2[3]
    return scal

res = scalar_in_monome(vector1,vector2)
res

"""
Explanation: $$ 
\begin{equation}
 \begin{aligned}
\Phi_1 :R^2->R^3 : \Phi_1(x) &= (x_1^2, \sqrt2 x_1 x_2, x_2^2) \
\
 \Phi_2 :R^2->R^4 : \Phi_2(x) &= (x_1^2, x_1 x_2, x_2 x_1, x_2^2) \
  \end{aligned}
\end{equation}
$$
b. Berechnen Sie das komponentenweise Standard-Skalarprodukt im Raum der Monome zweiter 
Ordnung zwischen zwei unterschiedlichen zweidimensionalen Eingabevektoren (x1,x2) und (y1,y2).
$$ x = (x_1,x_2), y = (y_1,y_2): $$
$$ f(x)=(x_1^2,x_1x_2,x_2x_1,x_2^2)$$ 
$$f(y)=(y_1^2,y_1y_2,y_2y_1,y_2^2) $$
$$ \ 
\begin{equation}
 \begin{aligned}
\langle\Phi(x), \Phi(y)\rangle  &=  x_1^2 y_1^2 + 2x_1 x_2 y_1 y_2 + x_2^2 y_2^2 \ 
%% &= (x_1 y_1 + x_2 y_2)^2 \
%% &= \langle x, y\rangle^2
 \end{aligned}
\end{equation}
\ $$
End of explanation
"""


def polynom(v1,v2):    
    poly = np.dot(v1,v2)**2
    return poly
    
    

res = polynom(vector1,vector2)
res

"""
Explanation: c. Berechnen Sie den homogenen Polynomkern zweiter Ordnung
$$ k_\Phi(x,y) = \langle x * y \rangle^2 \$$
$$ k_\Phi(x,y) = \langle f(x),f(y) \rangle \
          = \langle(x_1^2, 2x_1x_2, x_2^2), (y_1^2, 2y_1y_2, y_2^2) \rangle \
          = x_1^2y_1^2 + 2((x_1x_2) * (y_1y_2)) + x_2^2y_2^2 $$
Daraus folgt:
$$ k_\Phi(x,y) = x_1^2y_1^2 + 2 ((x_1x_2) * (y_1y_2)) + x_2^2y_2^2 \
          = (x_1y_1 + x_2y_2)^2 \
          = \langle x,y \rangle^2 $$
End of explanation
"""


