diff --git a/src/ClassifyMin.py b/src/ClassifyMin.py
new file mode 100644
index 0000000000000000000000000000000000000000..87e9f935fb8773b2261ece1826eb6c727f4b6ce4
--- /dev/null
+++ b/src/ClassifyMin.py
@@ -0,0 +1,199 @@
+import numpy as np
+import matplotlib.pyplot as plt
+import sympy as sym
+import math
+import os
+import subprocess
+import fileinput
+import re
+import matlab.engine
+import sys
+# from subprocess import Popen, PIPE
+
+
+
+def harmonicMean(mu_1,beta,theta):
+    return mu_1*(beta/(theta+(1-theta)*beta))
+
+
+def arithmeticMean(mu_1,beta,theta):
+    return mu_1*((1-theta)+theta*beta)
+
+
+def prestrain_b1(rho_1,beta,alpha):
+    return (3.0*rho_1/2.0)*beta*(1-(theta*(1+alpha)));
+
+def prestrain_b2(rho_1,beta,alpha):
+    return (3.0*rho_1/(4.0*((1.0-theta)+ theta*beta)))*(1-theta*(1+beta*alpha));
+
+
+# define function to be minimized
+def f(a1,a2,q1,q2,q3,q12,b1,b2):
+    A = np.array([[q1, q3 + q12/2.0], [q3 + q12/2.0, q2]])
+    print(A)
+    B = np.array([-2.0*q1*b1-q12*b2, -2.0*q2*b2-q12*b1])
+    print(B)
+    a = np.array([a1, a2])
+    print(a)
+    tmp = np.dot(A,a)
+    print(tmp)
+    tmp2 = np.dot(a,tmp)
+    print(tmp2)
+    tmpB = np.dot(B,a)
+    print(tmpB)
+    # print(q1*(b1**2))
+    # print(q2*(b2**2))
+    # print(q12*b1*b2)
+    return tmp2 + tmpB + q1*(b1**2) + q2*(b2**2) + q12*b1*b2
+
+
+# Classify Type of minimizer  1 = (I) , 2 = (II) , 3 = (III) , 4 = (IV)
+def classifyMin(q1, q2, q3, q12,  b1, b2,  print_output = "True"):
+    print("Run ClassifyMin...")
+    CaseCount = 0
+    epsilon = sys.float_info.epsilon
+
+    #TEST
+    # A = np.array([[1, 2], [3, 4]])
+    # kappa = 1.0
+    # angle = 1.57
+    # type = 2
+
+    determinant = q1*q2 - (q3**2 + 2*q3*q12 + q12**2)
+    print("determinant:", determinant)
+
+
+    if abs(determinant) < epsilon:
+        print('parabolic case (determinant equal zero)')
+
+
+    if determinant >= epsilon:
+        print('elliptic case (determinant greater zero)')
+        a1_star = -(2*(b1*(q12**2) + 2*b1*q3*q12 - 4*b1*q1*q2 + 4*b2*q2*q3))/(4*(q3**2) + 4*q3*q12 + (q12**2) - 4*q1*q2)
+        a2_star = -(2*(b2*(q12**2) + 2*b2*q3*q12 + 4*b1*q1*q3 - 4*b2*q1*q2))/(4*(q3**2) + 4*q3*q12 + (q12**2) - 4*q1*q2)
+        prod = a1_star*a2_star
+
+        b1_star = (2.0*q1*b1 + b2*q12)/(2*q1)
+        b2_star = (2.0*q2*b2 + b1*q12)/(2*q2)
+
+        if prod >= epsilon:
+            print('(E1) - inside Lambda ')
+            a1 = a1_star
+            a2 = a2_star
+            type = 3  # non-axial Minimizer
+            CaseCount += 1
+        if abs(prod) < epsilon:
+            print('(E2) - on the boundary of Lambda ')
+            # if q2*b2**2 < q1*b1**2: # Needs to be updated to Mixed Term!!! just define f as a function and check value?!
+            #check
+            if f(b1_star,0,q1,q2,mu_gamma,q12,b1,b2) < f(0, b2_star, q1,q2,mu_gamma,q12,b1,b2):
+                a1 = b1_star
+                a2 = 0.0
+                type = 1
+                CaseCount += 1
+            if f(b1_star,0,q1,q2,mu_gamma,q12,b1,b2) > f(0, b2_star, q1,q2,mu_gamma,q12,b1,b2):
+                a1 = 0
+                a2 = b2_star
+                type = 2
+                CaseCount += 1
+            if f(b1_star,0,q1,q2,mu_gamma,q12,b1,b2) = f(0, b2_star, q1,q2,mu_gamma,q12,b1,b2):
+                # Two Minimizers pick one
+                a1 = b1_star
+                a2 = 0.0
+                type = 4
+                CaseCount += 1
+
+        if prod < -1.0*epsilon:
+            print('(E3) - Outside Lambda ')
+            if f(b1_star,0,q1,q2,mu_gamma,q12,b1,b2) < f(0, b2_star, q1,q2,mu_gamma,q12,b1,b2):
+                a1 = b1_star
+                a2 = 0.0
+                type = 1
+                CaseCount += 1
+            if f(b1_star,0,q1,q2,mu_gamma,q12,b1,b2) > f(0, b2_star, q1,q2,mu_gamma,q12,b1,b2):
+                a1 = 0
+                a2 = b2_star
+                type = 2
+                CaseCount += 1
+            #TODO ...does type4 happen here? 
+
+
+
+
+    return A, angle ,type ,kappa
+
+
+
+
+
+# ---------------------------------------------- Main ---------------------
+print('Running Python Code')
+
+
+# --- Input Parameters ----
+
+mu_1 = 1.0
+rho_1 = 1.0
+alpha = 14.0
+beta = 20.0
+theta = 1.0/4.0
+
+
+# define q1, q2 , mu_gamma, q12
+# 1. read from Cell-Output
+# 2. define values from analytic formulas (expect for mu_gamma)
+q1 = harmonicMean(mu_1,beta,theta)
+q2 = arithmeticMean(mu_1,beta,theta)
+q12 = 0.0  #  (analytical example)
+
+# set mu_gamma  to value or read from Cell-Output
+mu_gamma = q1   # TODO read from Cell-Output
+b1 =  prestrain_b1(rho_1,beta,alpha)
+b2 =  prestrain_b2(rho_1,beta,alpha)
+
+
+print("q1: ", q1)
+print("q2: ", q2)
+print("mu_gamma : ", mu_gamma)
+print("b1: ", b1)
+print("b2: ", b2)
+
+print("machine epsilon", sys.float_info.epsilon)
+
+## ------- options --------
+# print_output = false;
+
+
+
+
+
+
+
+A, angle, type, kappa = classifyMin(q1, q2, mu_gamma, q12,  b1, b2)
+
+print("Matrix A")
+print(A)
+print("angle",angle)
+print("type",type)
+print("kappa", kappa)
+
+
+Test = f(1,2 ,q1,q2,mu_gamma,q12,b1,b2)
+print("Test", Test)
+
+
+
+# Run several times / make Array :
+# Gamma_Values = np.linspace(0.01, 2.5, num=12)
+# print(Gamma_Values)
+
+
+# Make Plot
+# plt.figure()
+# plt.title(r'$\mu_\gamma(\gamma)$-Plot')  # USE MATHEMATICAL EXPRESSIONS IN TITLE
+# plt.plot(Gamma_Values, mu_gamma)
+# plt.scatter(Gamma_Values, mu_gamma)
+# plt.xlabel("$\gamma$")
+# plt.ylabel("$\mu_\gamma$")
+# plt.legend()
+# plt.show()