Commit fa2497ae authored by Chetan Sharma's avatar Chetan Sharma
Browse files

Saving progress

parent 61bc7546
......@@ -9,37 +9,24 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.003175\n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f9bf7983e50>]"
"ename": "AttributeError",
"evalue": "Can't get attribute 'RawDataPacket' on <module '__main__'>",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m~/anaconda3/envs/ampd/lib/python3.8/shelve.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 111\u001b[0;31m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcache\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 112\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: '6'",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-2-aae045e25021>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mshelve\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'results'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mdb\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtest_name\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mTEST_NAMES\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mdb\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mtest_name\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mdata_points\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecompose_packet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/anaconda3/envs/ampd/lib/python3.8/shelve.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mBytesIO\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeyencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUnpickler\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 115\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwriteback\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcache\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mAttributeError\u001b[0m: Can't get attribute 'RawDataPacket' on <module '__main__'>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
......@@ -48,7 +35,7 @@
"import shelve\n",
"import logging\n",
"import queue\n",
"from collect_data import DataPoint, RawDataPacket\n",
"# from collect_data import DataPoint, RawDataPacket\n",
"from matplotlib import pyplot as plt\n",
"from scipy.signal import medfilt\n",
"\n",
......
from ml import LinearModel
from fake_cut import Fake_Cut
from objects import EndMill, Conditions
PARAMS = [858494934.9591976, -696.3150933941946, 858494934.9591976, -696.3150933941946]
# ERROR = [0.01, 0.01]
# NOISE = [0.1, 0.1]
ERROR = [0, 0]
NOISE = [0, 0]
CONDITIONS = Conditions(1e-3, 3.175e-3, 5e-3, 5000, EndMill(3, 3.175e-3, 3.175e-3, 10e-3, 10e-3))
model = LinearModel()
cut = Fake_Cut(PARAMS, ERROR, NOISE)
data = cut.cut(CONDITIONS)
model.ingest_datum(data)
print("{0:.20f}".format(model.params[1]))
\ No newline at end of file
......@@ -62,10 +62,11 @@ class Cut:
self._logger.info("Layer prepared for clearing")
def cut(self, W, f_r, w):
def cut(self, conditions):
"""
Performs a stroke of facing. Returns a data blob.
"""
_, W, f_r, w, _ = conditions.unpack()
X_START = x_cut - self.endmill.r_c + W
if X_START > self.X_END:
raise MachineCrash("Cutting too far in X direction: X = " + str(X_START))
......
from models import T_lin, F_lin
from objects import Conditions, Data
import numpy as np
class Fake_Cut:
def __init__(self, params, error, noise):
"""
Args:
params: list of format [K_tc, K_te, K_rc, K_re]
error: list of standard deviations of format [o_T, o_Fy]. Simulates the sensor being "wrong" sometimes.
error: list of standard deviations of format [o_T, o_Fy]. Simulates the sensor being noisy.
"""
self.params = params
self.error = error
self.noise = noise
def cut(self, conditions : Conditions):
# use prediction as output
T = T_lin(conditions, *self.params[:2])
_, Fy = F_lin(conditions, *self.params)
# add sensor error
T_error = np.random.normal(T, self.error[0])
Fy_error = np.random.normal(Fy, self.error[1])
# add sensor noise
T_noisy = np.random.normal(T_error, self.noise[0], (100))
Fy_noisy = np.random.normal(Fy_error, self.noise[1], (100))
# generate fake times
t = np.linspace(0, 1, 100)
# return fake reading
return Data(*conditions.unpack(), np.array([t, T_noisy]), np.stack([t, Fy_noisy]))
\ No newline at end of file
......@@ -5,7 +5,7 @@ from sklearn import linear_model
from matplotlib import pyplot as plt
from models import T_lin, F_lin, T_x_vector, Fy_x_vector
from objects import Data, Reading, EndMill, Prediction
from objects import Data, Conditions, EndMill, Prediction
class Model(abc.ABC):
"""
......@@ -40,19 +40,21 @@ class LinearModel(Model):
self.training_T_y = list()
self.training_Fy_x = list()
self.training_Fy_y = list()
self.regressor_T = linear_model.Lasso(fit_intercept = False, warm_start=True)
self.regressor_Fy = linear_model.Lasso(fit_intercept = False, warm_start=True)
self.regressor_T = linear_model.LinearRegression(fit_intercept = False)
self.regressor_Fy = linear_model.LinearRegression(fit_intercept = False)
self.params = np.array([0,0,0,0])
def ingest_datum(self, datum):
# decompose
D, W, f_r, w, endmill, Ts, Fys = datum.D, datum.W, datum.f_r, datum.w, datum.endmill, datum.Ts, datum.Fys
R, N = endmill.R, endmill, N
T, Fy = np.median(Ts[:, 1]), np.median(Fys[:, 1])
_, _, _, _, _, Ts, Fys = datum.unpack()
T, Fy = np.median(Ts[1, :]), np.median(Fys[1, :])
# get linear coefficients
T_x = T_x_vector(D, N, R, W, f_r, w)
Fy_x = Fy_x_vector(D, N, R, W, f_r, w)
T_x = T_x_vector(datum.conditions())
Fy_x = Fy_x_vector(datum.conditions())
print("T", T)
print("coef times real K_tc", T_x[1] * 858494934.9591976)
# add to training set
self.training_T_x.append(T_x)
......@@ -68,24 +70,25 @@ class LinearModel(Model):
# calculate best fit from data
self.regressor_T.fit(self.training_T_x, self.training_T_y)
K_tc, K_te = self.regressor.coef_
K_tc, K_te = self.regressor_T.coef_
print(K_tc, K_te)
self.params[0], self.params[1] = K_tc, K_te
# transform Fy into a smaller linear problem and fit
intercepts = training_Fy_x @ np.array([K_tc, K_te, 0, 0])[np.newaxis].T
training_Fy_y_no_intercepts = training_Fy_y - intercepts
self.regressor_Fy.fit(training_Fy_x[:, 2:], training_Fy_y_no_intercepts)
K_rc, K_re = self.regressor_Fy.coef_
self.params[0], self.params[1] = K_rc, K_re
def predict_one(self, conditions):
# decompose
D, W, f_r, w, endmill = conditions.D, conditions.W, conditions.f_r, conditions.w, conditions.endmill
R, N = endmill.R, endmill, N
# evaluate
T = T_lin(D, N, R, W, f_r, w, self.params[0], self.params[1])
F = F_lin(D, N, R, W, f_r, w, *self.params)
T = T_lin(conditions, *self.params[:2])
F = F_lin(conditions, *self.params)
# repack and return
return Prediction(D, W, f_r, w, endmill, T, F)
return Prediction(conditions, T, F)
import numpy as np
def calc_h_a(R, W, f_t):
from objects import Conditions, Data, Prediction, MachineChar
def calc_f_t(conditions : Conditions):
D, W, f_r, w, endmill = conditions.unpack()
N = endmill.N
return (2 * np.pi * f_r) / (N * w)
def calc_h_a(conditions : Conditions):
D, W, f_r, w, endmill = conditions.unpack()
R = endmill.r_c
f_t = calc_f_t(conditions)
phi_st = np.pi - np.arccos(1 - W / R)
phi_ex = np.pi
return -f_t * (np.cos(phi_ex) - np.cos(phi_st)) / (phi_ex - phi_st)
def calc_f_t(N, f_r, w):
return (2 * np.pi * f_r) / (N * w)
# exponential models, account for strange decrease in cutting forces as chip thickness increases.
def T_exp_lin(D, N, R, W, f_r, w, K_TC, K_te, p):
f_t = calc_f_t(N, f_r, w)
h_a = calc_h_a(R, W, f_t)
def T_exp_lin(conditions : Conditions, K_TC, K_te, p):
D, W, f_r, w, endmill = conditions.unpack()
N, R, _, _, _ = endmill.unpack()
f_t = calc_f_t(conditions)
h_a = calc_h_a(conditions)
K_tc = K_TC * h_a ** -p
return ((D * N) * (K_te * R * np.arccos(1 - W/R) + K_tc * W * f_t)) / (2 * np.pi)
def F_exp_lin(D, N, R, W, f_r, w, K_TC, K_te, K_RC, K_re, p, q):
f_t = calc_f_t(N, f_r, w)
h_a = calc_h_a(R, W, f_t)
def F_exp_lin(conditions : Conditions, K_TC, K_te, K_RC, K_re, p, q):
D, W, f_r, w, endmill = conditions.unpack()
N, R, _, _, _ = endmill.unpack()
f_t = calc_f_t(conditions)
h_a = calc_h_a(conditions)
K_tc = K_TC * h_a ** -p
K_rc = K_RC * h_a ** -q
Fx = - ((D*N*(K_tc*W**2*f_t + K_rc*W**(3/2)*f_t*(2*R - W)**(1/2)))/4 - (D*N*R*(2*K_tc*W*f_t - 2*K_re*W + 2*K_te*W**(1/2)*(2*R - W)**(1/2) + K_rc*W**(1/2)*f_t*(2*R - W)**(1/2)))/4)/(R**2*np.pi) - (D*K_rc*N*f_t*np.arccos((R - W)/R))/(4*np.pi)
......@@ -26,36 +38,42 @@ def F_exp_lin(D, N, R, W, f_r, w, K_TC, K_te, K_RC, K_re, p, q):
# linear models, easier to fit and more simple
def T_lin(D, N, R, W, f_r, w, K_tc, K_te):
f_t = calc_f_t(N, f_r, w)
def T_lin(conditions, K_tc, K_te):
D, W, f_r, w, endmill = conditions.unpack()
N, R, _, _, _ = endmill.unpack()
f_t = calc_f_t(conditions)
return ((D * N) * (K_te * R * np.arccos(1 - W/R) + K_tc * W * f_t)) / (2 * np.pi)
def F_lin(D, N, R, W, f_r, w, K_tc, K_te, K_rc, K_re):
f_t = calc_f_t(N, f_r, w)
def F_lin(conditions, K_tc, K_te, K_rc, K_re):
D, W, f_r, w, endmill = conditions.unpack()
N, R, _, _, _ = endmill.unpack()
f_t = calc_f_t(conditions)
Fx = - ((D*N*(K_tc*W**2*f_t + K_rc*W**(3/2)*f_t*(2*R - W)**(1/2)))/4 - (D*N*R*(2*K_tc*W*f_t - 2*K_re*W + 2*K_te*W**(1/2)*(2*R - W)**(1/2) + K_rc*W**(1/2)*f_t*(2*R - W)**(1/2)))/4)/(R**2*np.pi) - (D*K_rc*N*f_t*np.arccos((R - W)/R))/(4*np.pi)
Fy = (D*K_tc*N*f_t*np.arccos((R - W)/R))/(4*np.pi) - ((D*N*(K_rc*W**2*f_t - K_tc*W**(3/2)*f_t*(2*R - W)**(1/2)))/4 - (D*N*R*(2*K_te*W + 2*K_rc*W*f_t + 2*K_re*W**(1/2)*(2*R - W)**(1/2) - K_tc*W**(1/2)*f_t*(2*R - W)**(1/2)))/4)/(R**2*np.pi)
return np.array([Fx, Fy])
# coefficient calculators for linear regression
def T_x_vector(D, N, R, W, f_r, w):
def T_x_vector(conditions : Conditions):
"""
Outputs vector that corresponds to coefficients in order:
K_tc, K_te
"""
f_t = calc_f_t(N, f_r, w)
K_tc_C = (D * N * W * f_t) / (2 * np.pi)
K_te_C = (D * N * R * np.arccos(1 - (W / R))) / (2 * np.pi)
D, W, f_r, w, endmill = conditions.unpack()
N, R, _, _, _ = endmill.unpack()
f_t = calc_f_t(conditions)
return [K_tc_C, K_te_C]
return[(D * N * W * f_t) / (2 * np.pi), (D * N * R * np.arccos(1 - (W / R))) / (2 * np.pi)]
def Fy_x_vector(D, N, R, W, f_r, w):
f_t = calc_f_t(N, f_r, w)
def Fy_x_vector(conditions : Conditions):
D, W, f_r, w, endmill = conditions.unpack()
N, R, _, _, _ = endmill.unpack()
f_t = calc_f_t(conditions)
return [(D*N*f_t*(W**(3/2)*(2*R - W)**(1/2) + R**2*np.arccos((R - W)/R) - R*W**(1/2)*(2*R - W)**(1/2)))/(4*R**2*np.pi), (D*N*W)/(2*R*np.pi), (D*N*W*f_t*(2*R - W))/(4*R**2*np.pi), (D*N*W**(1/2)*(2*R - W)**(1/2))/(2*R*np.pi)]
def deflection_load(D_a, F, endmill, E_e = 650e9):
def deflection_load(D_a, prediction : Prediction, E_e = 650e9):
"""
Calculates ratio of tool deflection to allowed deflection.
Uses FEA model described in doi:10.1016/j.ijmachtools.2005.09.009.
......@@ -67,11 +85,10 @@ def deflection_load(D_a, F, endmill, E_e = 650e9):
Returns:
Ratio of tool deflection to allowed deflection
"""
r_c = endmill.r_c
r_s = endmill.r_s
l_c = endmill.l_c
l_s = endmill.l_s
N = endmill.N
D, W, f_r, w, endmill, T, F = prediction.unpack()
F = np.norm(F)
N, r_c, r_s, l_c, l_s = endmill.unpack()
# prepare variables, this must be done since the FEA model has arbitrary constants defined for certain units
d_1 = r_c * 2 * 1e3 # convert to diameter in mm
d_2 = r_s * 2 * 1e3
......@@ -98,7 +115,7 @@ def deflection_load(D_a, F, endmill, E_e = 650e9):
D_m = C * (F / E) * ((l_1 ** 3 / d_1 ** 4) + ((l_2 ** 3 - l_1 ** 3) / d_2 ** 4)) ** G * 1e-3
return D_m / D_a
def failure_prob_milling(F, T, endmill, D, roughing = False, m = 4, o = 1500e6, a_c = 0.8):
def failure_prob_milling(prediction : Prediction, roughing = False, m = 4, o = 1500e6, a_c = 0.8):
"""
Calculates failure probability according to Weibull distribution. Method adapted from https://doi.org/10.1016/S0007-8506(07)62072-1
Args:
......@@ -113,11 +130,10 @@ def failure_prob_milling(F, T, endmill, D, roughing = False, m = 4, o = 1500e6,
Returns:
Probability of failure
"""
# establish base variables
r_c = endmill.r_c
r_s = endmill.r_s
l_c = endmill.l_c
l_s = endmill.l_s
D, W, f_r, w, endmill, T, F = prediction.unpack()
F = np.norm(F)
N, r_c, r_s, l_c, l_s = endmill.unpack() # establish base variables
r_ceq = r_c * a_c # equivalent cutter radius
I_ceq = np.pi / 4 * r_ceq ** 4 # equivalent cutter 2nd inertia
I_s = np.pi / 4 * r_s ** 4 # shank 2nd inertia
......@@ -137,7 +153,7 @@ def failure_prob_milling(F, T, endmill, D, roughing = False, m = 4, o = 1500e6,
return failure_prob
def motor_torque_load(T_m, w, K_T, R_w, V_max, I_max):
def motor_torque_load(prediction : Prediction, machinechar : MachineChar):
"""
Calculates ratio of current motor torque to max motor torque.
Args:
......@@ -150,12 +166,16 @@ def motor_torque_load(T_m, w, K_T, R_w, V_max, I_max):
Returns:
Ratio of current motor torque to max achievable torque
"""
_, _, _, w, _, T, _ = prediction.unpack()
r_e, K_T, R_w, V_max, I_max, T_nom, _ = machinechar.unpack()
w_m = w * r_e
T_m = (T + T_nom) / r_e
# store K_V for convenience
K_V = 1 / K_T
# max torque is either determined by max current that can be supplied or max current achievable given winding resistance and whatnot
return T_m / min(K_T * I_max, (V_max - K_V * w) / R_w)
return T_m / min(K_T * I_max, (V_max - K_V * w_m) / R_w)
def motor_speed_load(T_m, w, K_T, R_w, V_max):
def motor_speed_load(prediction : Prediction, machinechar : MachineChar):
"""
Calculates ratio of
Args:
......@@ -167,11 +187,16 @@ def motor_speed_load(T_m, w, K_T, R_w, V_max):
Returns:
Ratio of current motor speed to max achievable speed
"""
_, _, _, w, _, T, _ = prediction.unpack()
r_e, K_T, R_w, V_max, I_max, T_nom, _ = machinechar.unpack()
w_m = w * r_e
T_m = (T + T_nom) / r_e
# store K_V for convenience
K_V = 1 / K_T
# max speed is affected by winding resistive voltage drop along with backemf
return w / (K_V * (V_max - T_m * R_w / K_T))
return w_m / (K_V * (V_max - T_m * R_w / K_T))
def optimality(D, W, f_r):
def optimality(conditions : Conditions):
D, W, f_r, _, _ = conditions.unpack()
# returns MMR in units of m^3 / s
return D * W * f_r
......@@ -2,13 +2,34 @@ import numpy as np
class EndMill:
def __init__(self, N, r_c, r_s, l_c, l_s):
self.R = R
self.N = N
self.r_c = r_c
self.r_s = r_s
self.l_c = l_c
self.l_s = l_s
def unpack(self):
return [self.N, self.r_c, self.r_s, self.l_c, self.l_s]
def __str__(self):
return str(self.unpack())
class MachineChar:
def __init__(self, r_e, K_T, R_w, V_max, I_max, T_nom, f_r_max):
self.r_e = r_e
self.K_T = K_T
self.R_w = R_w
self.V_max = V_max
self.I_max = I_max
self.T_nom = T_nom
self.f_r_max = f_r_max
def unpack(self):
return [self.r_e, self.K_T, self.R_w, self.V_max, self.I_max, self.T_nom]
def __str__(self):
return str(self.unpack())
class Conditions:
def __init__(self, D : float, W : float, f_r : float, w : float, endmill : EndMill):
self.D = D
......@@ -17,14 +38,32 @@ class Conditions:
self.w = w
self.endmill = endmill
def unpack(self):
return [self.D, self.W, self.f_r, self.w, self.endmill]
def __str__(self):
return str(self.unpack())
class Data(Conditions):
def __init__(self, D : float, W : float, f_r : float, w : float, endmill : EndMill, Ts : np.ndarray, Fys : np.ndarray):
super(Data, self).__init__(D, W, f_r, w, endmill)
self.Ts = Ts
self.Fys = Fys
def unpack(self):
return super(Data, self).unpack() + [self.Ts, self.Fys]
def conditions(self):
return Conditions(*super(Data, self).unpack())
class Prediction(Conditions):
def __init__(self, D : float, W : float, f_r : float, w : float, endmill : EndMill, T : float, F : float):
def __init__(self, D : float, W : float, f_r : float, w : float, endmill : EndMill, T : float, F : np.ndarray):
super(Data, self).__init__(D, W, f_r, w, endmill)
self.T = T
self.F = F
def unpack(self):
return super(Prediction, self).unpack() + [self.T, self.F]
def conditions(self):
return Conditions(*super(Data, self).unpack())
\ No newline at end of file
import numpy as np
import pyswarms
from models import optimality
from scipy.optimize import minimize
from functools import reduce
from models import (
optimality,
deflection_load,
failure_prob_milling,
motor_torque_load,
motor_speed_load
)
from objects import MachineChar, Prediction, Conditions
from ml import Model
def inv_logistic(x, center, scale):
return 1 - (1 / 1 + np.exp(-scale * (x - center)))
class Optimizer:
def __init__(self, model : Model, machinechar : MachineChar, D_a, fixed_conditions : Conditions):
"""
Initializes optimizer with constraints.
Args:
model : A Model representing the current milling process.
spindlechar : A SpindleChar representing the machine being used.
"""
self.model = model
self.spindlechar = spindlechar
self.D_a = D_a
self.fixed_conditions = fixed_conditions
def optimize(self):
x0 = [self.fixed_conditions.W, self.fixed_conditions.f_r]
bounds = ((0, self.fixed_conditions.endmill.R * 2), (0, self.machinechar.f_r_max))
minimum = minimize(self.optimize_func, x0, bounds = bounds)
W, f_r = minimum.x
D, _, _, w, endmill = self.fixed_conditions.unpack()
return Conditions(D, W, f_r, w, endmill)
def optimize_func(self, X):
W, f_r = X
D, _, _, w, endmill = self.fixed_conditions.unpack()
conditions = Conditions(D, W, f_r, w, endmill)
prediction = model.predict_one(conditions)
return loss(prediction)
def loss(self, prediction : Prediction):
"""
Find the "loss" for this problem.
Loss is defined as the inverse of (optimality * failure metric).
"""
return - (optimality(prediction) * self.failure(prediction))
def inv_logistic(self, x):
return 1 - (1 / 1 + np.exp(-30 * (x - 0.9)))
def failure(self, prediction : Prediction):
"""
Failure metric. Slightly arbitrary.
"""
# pull out all of these
failures = [deflection_load(self.D_a, prediction),
failure_prob_milling(prediction) + 0.80, # lol oops
motor_torque_load(prediction, self.spindlechar),
motor_speed_load(prediction, self.spindlechar)
]
failure_logistic = reduce(lambda x,y:x*y, map(self.inv_logistic, failures))
return failure
def loss(self, prediction):
D = prediction.D
W = prediction.W
opt = optimality(D, W, f_r)
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment