Exemple #1
0
def error(R, D):
    # R: Rules
    # D: Data
    err = 0.
    myIT2FLS.rules = []
    for rule in R:
        myIT2FLS.add_rule([("x1", X1Sets[rule[0]]), ("x2", X2Sets[rule[1]])],
                          [("y1", Y1Sets[rule[2]]), ("y2", Y2Sets[rule[3]])])
    for i in range(D.shape[1]):
        tr = myIT2FLS.evaluate({"x1": D[0, i], "x2": D[1, i]})
        err += (crisp(tr["y1"]) - D[2, i])**2 + (crisp(tr["y2"]) - D[3, i])**2
    return err
    def inference(self, observation: Dict) -> Dict:
        """
			perform inference at the fuzzy system
		"""

        vel = observation['velocity'] * 3.6  #m/s -> Km/h
        acc = observation['acceleration']  #m/s^2
        dec = observation['deceleration']  #m/s^2
        ljk = observation['lateral_jerk']  #std (m/s^3)

        _in = {}
        _in['Velocity'] = vel
        _in['Acceleration'] = acc
        _in['Deceleration'] = dec
        _in['LateralJerk'] = ljk

        it2out, tr = self.fuzz_inf.evaluate(_in, min_t_norm, max_s_norm,
                                            np.linspace(0, 1, 1001))

        _c = crisp(tr['DrivingStyle'])

        y = []
        l = []

        y, l = self._fuzz_driving_style(value=_c)

        result = {}
        result['class'] = np.argmax([(m[0] + m[1]) / 2. for m in y])
        result['crisp'] = _c
        result['membership_values'] = np.asarray(y)
        result['set_labels'] = np.asarray(l)
        return result
Exemple #3
0
def IT2FL_v1_fun(y):
    # print("chenggong")
    domain = linspace(-1, 1., 100)

    NB = IT2FS_Gaussian_UncertStd(domain, [-1, 0.15, 0.1])
    NS = IT2FS_Gaussian_UncertStd(domain, [-0.5, 0.15, 0.1])
    MM = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    PS = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    PB = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    # IT2FS_plot(NB, NS, MM,PS,PB, legends=["NB", "NS", "NN","PS","PB"], filename="v1_input_$y")

    BB = IT2FS_Gaussian_UncertStd(domain, [-1, 0.15, 0.1])
    BS = IT2FS_Gaussian_UncertStd(domain, [-0.5, 0.15, 0.1])
    ZO = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    GS = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    GB = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    # IT2FS_plot(GB,GS,ZO,BS,BB, legends=["GB", "GS", "ZO","BS","BB"], filename="V1_output")

    #输入和输出都只有一个,输入为y方向的偏离值,输出为速度大小即前进或者后退的快慢
    myIT2FLS = IT2FLS()
    myIT2FLS.add_input_variable("x1")

    myIT2FLS.add_output_variable("y1")

    myIT2FLS.add_rule([("x1", NB)], [("y1", GB)])
    myIT2FLS.add_rule([("x1", NS)], [("y1", GS)])
    myIT2FLS.add_rule([("x1", MM)], [("y1", ZO)])
    myIT2FLS.add_rule([("x1", PS)], [("y1", BS)])
    myIT2FLS.add_rule([("x1", PB)], [("y1", BB)])

    it2out, tr = myIT2FLS.evaluate({"x1": y}, min_t_norm, max_s_norm, domain)
    # it2out["y1"].plot(filename="y1_out")
    # TR_plot(domain, tr["y1"], filename="y1_tr")
    print("v1_output:", crisp(tr["y1"]))
    if crisp(tr["y1"]) < 0:
        print("速度大小:后退", crisp(tr["y1"]) * 2)
    elif crisp(tr["y1"]) == 0:
        print("速度大小:0")
    else:
        print("速度大小:前进", crisp(tr["y1"]) * 2)
Exemple #4
0
def IT2FL_fun(x, y):
    # print("chenggong")
    domain = linspace(0., 1., 100)
    # domain = linspace(-1., 1., 100)

    Small = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    Medium = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    Large = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    # IT2FS_plot(Small, Medium, Large, legends=["Small", "Medium", "large"], filename="asb(x1,x2)_ex_sets")

    S = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    M = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    L = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    # IT2FS_plot(S, M, L, legends=["S", "M", "L"], filename="y1_ex_sets")

    myIT2FLS = IT2FLS()
    myIT2FLS.add_input_variable("x1")
    myIT2FLS.add_input_variable("x2")
    myIT2FLS.add_output_variable("y1")
    #myIT2FLS.add_output_variable("y2")

    myIT2FLS.add_rule([("x1", Small), ("x2", Small)], [("y1", S)])
    myIT2FLS.add_rule([("x1", Small), ("x2", Medium)], [("y1", S)])
    myIT2FLS.add_rule([("x1", Small), ("x2", Large)], [("y1", M)])

    myIT2FLS.add_rule([("x1", Medium), ("x2", Small)], [("y1", S)])
    myIT2FLS.add_rule([("x1", Medium), ("x2", Medium)], [("y1", M)])
    myIT2FLS.add_rule([("x1", Medium), ("x2", Large)], [("y1", L)])

    myIT2FLS.add_rule([("x1", Large), ("x2", Small)], [("y1", M)])
    myIT2FLS.add_rule([("x1", Large), ("x2", Medium)], [("y1", L)])
    myIT2FLS.add_rule([("x1", Large), ("x2", Large)], [("y1", L)])

    # it2out, tr = myIT2FLS.evaluate({"x1":0.6, "x2":0.8}, min_t_norm, max_s_norm, domain)
    it2out, tr = myIT2FLS.evaluate({
        "x1": x,
        "x2": y
    }, min_t_norm, max_s_norm, domain)
    # it2out["y1"].plot(filename="y1_out")
    # TR_plot(domain, tr["y1"], filename="y1_tr")
    print("v1_output:", crisp(tr["y1"]))
Exemple #5
0
           Medium,
           Large,
           legends=["Small", "Medium", "large"],
           filename="simp_ex_sets")

myIT2FLS = IT2FLS()
myIT2FLS.add_input_variable("x1")
myIT2FLS.add_input_variable("x2")
myIT2FLS.add_output_variable("y1")
myIT2FLS.add_output_variable("y2")

myIT2FLS.add_rule([("x1", Small), ("x2", Small)], [("y1", Small),
                                                   ("y2", Large)])
myIT2FLS.add_rule([("x1", Medium), ("x2", Medium)], [("y1", Medium),
                                                     ("y2", Small)])
myIT2FLS.add_rule([("x1", Large), ("x2", Large)], [("y1", Large),
                                                   ("y2", Small)])

it2out, tr = myIT2FLS.evaluate({
    "x1": 0.9,
    "x2": 0.9
}, min_t_norm, max_s_norm, domain)

it2out["y1"].plot(filename="y1_out")
TR_plot(domain, tr["y1"], filename="y1_tr")
print(crisp(tr["y1"]))

it2out["y2"].plot(filename="y2_out")
TR_plot(domain, tr["y2"], filename="y2_tr")
print(crisp(tr["y2"]))
Exemple #6
0
myIT2FLS.add_rule([("x1", B), ("x2", S)], [("y1", A1)])
myIT2FLS.add_rule([("x1", B), ("x2", Z)], [("y1", A1)])
myIT2FLS.add_rule([("x1", B), ("x2", B)], [("y1", A1)])


myIT2FLS.add_rule([("x1", SS), ("x2", SS)], [("y2", B4)])
myIT2FLS.add_rule([("x1", SS), ("x2", ZZ)], [("y2", B5)])
myIT2FLS.add_rule([("x1", SS), ("x2", BB)], [("y2", B6)])

myIT2FLS.add_rule([("x1", ZZ), ("x2", SS)], [("y2", B3)])
myIT2FLS.add_rule([("x1", ZZ), ("x2", ZZ)], [("y2", B9)])
myIT2FLS.add_rule([("x1", ZZ), ("x2", BB)], [("y2", B7)])

myIT2FLS.add_rule([("x1", BB), ("x2", SS)], [("y2", B2)])
myIT2FLS.add_rule([("x1", BB), ("x2", ZZ)], [("y2", B1)])
myIT2FLS.add_rule([("x1", BB), ("x2", BB)], [("y2", B8)])


it2out1, tr1 = myIT2FLS.evaluate({"x1":0.9, "x2":0.9}, min_t_norm, max_s_norm, domain)
it2out2, tr2 = myIT2FLS.evaluate({"x1":-0.8, "x2":0.8}, min_t_norm, max_s_norm, domain)

it2out1["y1"].plot(filename="y1_out")
TR_plot(domain, tr1["y1"], filename="y1_tr")
print(crisp(tr1["y1"]))

it2out2["y2"].plot(filename="y2_out")
TR_plot(domain, tr2["y2"], filename="y2_tr")
print(crisp(tr2["y2"]))


Exemple #7
0
myIT2FLS.add_rule([("x1", Large1), ("x2", Small2)], [("y1", High1),
                                                     ("y2", Low2)])
myIT2FLS.add_rule([("x1", Large1), ("x2", Medium2)], [("y1", High1),
                                                      ("y2", High2)])
myIT2FLS.add_rule([("x1", Large1), ("x2", Large2)], [("y1", High1),
                                                     ("y2", High2)])

# Evaluating the outputs of the myIT2FLS for the points in the input domain,
# and plotting the output surfaces.
X1, X2 = meshgrid(domain1, domain2)
Z1 = zeros(shape=(len(domain1), len(domain2)))
Z2 = zeros(shape=(len(domain1), len(domain2)))
for i, x1 in zip(range(len(domain1)), domain1):
    for j, x2 in zip(range(len(domain2)), domain2):
        it2out, tr = myIT2FLS.evaluate({"x1": x1, "x2": x2})
        Z1[i, j], Z2[i, j] = crisp(tr["y1"]), crisp(tr["y2"])

fig = plt.figure()
ax = fig.gca(projection="3d")
surf = ax.plot_surface(X1,
                       X2,
                       Z1,
                       cmap=cm.coolwarm,
                       linewidth=0,
                       antialiased=False)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

fig = plt.figure()
def calculate_FLS(cough_inp, fever_inp, breath_inp, age, env_inp,
                  hypertension_inp, diabetes_inp, cardiovascular_inp,
                  respiratory_inp, immune_inp):
    severity = linspace(0.0, 10.0, 100)

    # For IT2FS_Gaussian_UncertMean, the parameters define:
    # 1 - The tip of the center point of the curve
    # 2 - The width of the lower curve (higher value = lower width)
    # 3 - The height of the lower curve (higher value = higher tip)
    # 4 - The height of the center point of the outer curve.

    Cough_neg = IT2FS(severity, trapezoid_mf, [0., 0.001, 3, 7, 1.0], tri_mf,
                      [0, 0.001, 2, 0.5])
    Cough_pos = IT2FS(severity, trapezoid_mf, [5, 8, 9.999, 10, 1.0], tri_mf,
                      [8.5, 9.999, 10, 0.5])

    Fever_low = IT2FS_Gaussian_UncertMean(severity, [0, 2.65, 1, 1.0])
    Fever_mod = IT2FS_Gaussian_UncertMean(severity, [5, 2.65, 1, 1.0])
    Fever_high = IT2FS_Gaussian_UncertMean(severity, [10, 2.65, 1, 1.0])

    BreathDiff_low = IT2FS_Gaussian_UncertMean(severity, [0, 1.75, 1, 1.0])
    BreathDiff_mod = IT2FS_Gaussian_UncertMean(severity, [5, 2.5, 1, 1.0])
    BreathDiff_extr = IT2FS_Gaussian_UncertMean(severity, [10, 1.75, 1, 1.0])

    Add_low = IT2FS_Gaussian_UncertMean(severity, [0, 5, 2, 1.0])
    Add_high = IT2FS_Gaussian_UncertMean(severity, [10, 5, 2, 1.0])

    Risk_low = IT2FS_Gaussian_UncertMean(severity, [0, 3, 1, 1.0])
    Risk_high = IT2FS_Gaussian_UncertMean(severity, [6.5, 2, 1, 1.0])
    Risk_veryhigh = IT2FS_Gaussian_UncertMean(severity, [10.7, 1, 1, 1.0])

    def plot_cough_mf():
        IT2FS_plot(
            Cough_neg,
            Cough_pos,
            title="Cough",
            legends=["Negative", "Positive"],
        )

    def plot_fever_mf():
        IT2FS_plot(
            Fever_low,
            Fever_mod,
            Fever_high,
            title="Fever",
            legends=["Low", "Moderate", "High"],
        )

    def plot_additional_mf():
        IT2FS_plot(
            Add_low,
            Add_high,
            title="Additional Risks",
            legends=["Low", "High"],
        )

    def plot_breathdiff_mf():
        IT2FS_plot(
            BreathDiff_low,
            BreathDiff_mod,
            BreathDiff_extr,
            title="Breathing Difficulty",
            legends=["Low", "Moderate", "High"],
        )

    def plot_risk_mf():
        IT2FS_plot(
            Risk_low,
            Risk_high,
            Risk_veryhigh,
            title="Overall Risk",
            legends=["Unlikely", "Likely", "Extremely Likely"],
        )

    plot_fever_mf()
    plot_cough_mf()
    plot_breathdiff_mf()
    plot_additional_mf()

    plot_risk_mf()

    myIT2FLS = IT2FLS()

    myIT2FLS.add_input_variable("cough")
    myIT2FLS.add_input_variable("fever")
    myIT2FLS.add_input_variable("breath")
    myIT2FLS.add_input_variable("add")
    myIT2FLS.add_output_variable("risk")

    myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_low),
                       ("breath", BreathDiff_low), ("add", Add_low)],
                      [("risk", Risk_low)])
    myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_mod),
                       ("breath", BreathDiff_low), ("add", Add_low)],
                      [("risk", Risk_low)])
    myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_high),
                       ("breath", BreathDiff_low), ("add", Add_low)],
                      [("risk", Risk_low)])
    myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_high),
                       ("breath", BreathDiff_low), ("add", Add_high)],
                      [("risk", Risk_low)])
    myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_low),
                       ("breath", BreathDiff_extr), ("add", Add_low)],
                      [("risk", Risk_high)])
    myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_high),
                       ("breath", BreathDiff_mod), ("add", Add_low)],
                      [("risk", Risk_high)])
    myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_mod),
                       ("breath", BreathDiff_mod), ("add", Add_high)],
                      [("risk", Risk_veryhigh)])
    myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_low),
                       ("breath", BreathDiff_extr), ("add", Add_high)],
                      [("risk", Risk_veryhigh)])
    myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_mod),
                       ("breath", BreathDiff_mod), ("add", Add_high)],
                      [("risk", Risk_veryhigh)])
    myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_high),
                       ("breath", BreathDiff_extr), ("add", Add_high)],
                      [("risk", Risk_veryhigh)])

    # cough_inp = float(input("Enter severity of coughing, between 0 and 10: "))
    # fever_inp = float(input("Enter severity of fever, between 0 and 10: "))
    # breath_inp = float(input("Enter severity of breathing difficulty, between 0 and 10: "))
    # print("Input age and other additional risk factors.")
    add_inp = calc_additional_risks(age, env_inp, hypertension_inp,
                                    diabetes_inp, cardiovascular_inp,
                                    respiratory_inp, immune_inp)

    it2out, tr = myIT2FLS.evaluate(
        {
            "cough": cough_inp,
            "fever": fever_inp,
            "breath": breath_inp,
            "add": add_inp
        },
        min_t_norm,
        max_s_norm,
        severity,
        method="Centroid",
        algorithm="EKM")
    print(tr)
    print(it2out)

    it2out["risk"].plot(title="Type-2 output MF converted to Type-1")
    TR_plot(severity, tr["risk"])
    print("Chance of C19 Infection: ", int((crisp(tr["risk"])) * 10), "%")

    return int((crisp(tr["risk"])) * 10)
Exemple #9
0
def IT2FL_v2(x,y):
    #domain = linspace(0., 1., 100)
    domain = linspace(-1., 1., 100)
    '''
    Small = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    Medium = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    Large = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    IT2FS_plot(Small, Medium, Large, legends=["Small", "Medium", "large"], filename="asb(x1,x2)_ex_sets")

    S = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    M = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    L = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    IT2FS_plot(S, M, L, legends=["S", "M", "L"], filename="y1_ex_sets")

    myIT2FLS = IT2FLS()
    myIT2FLS.add_input_variable("x1")
    myIT2FLS.add_input_variable("x2")
    myIT2FLS.add_output_variable("y1")
    #myIT2FLS.add_output_variable("y2")

    myIT2FLS.add_rule([("x1", Small), ("x2", Small)], [("y1", S)])
    myIT2FLS.add_rule([("x1", Small), ("x2", Medium)], [("y1", S)])
    myIT2FLS.add_rule([("x1", Small), ("x2", Large)], [("y1", M)])

    myIT2FLS.add_rule([("x1", Medium), ("x2", Small)], [("y1", S)])
    myIT2FLS.add_rule([("x1", Medium), ("x2", Medium)], [("y1", M)])
    myIT2FLS.add_rule([("x1", Medium), ("x2", Large)], [("y1", L)])

    myIT2FLS.add_rule([("x1", Large), ("x2", Small)], [("y1", M)])
    myIT2FLS.add_rule([("x1", Large), ("x2", Medium)], [("y1", L)])
    myIT2FLS.add_rule([("x1", Large), ("x2", Large)], [("y1", L)])

    it2out, tr = myIT2FLS.evaluate({"x1":0.8, "x2":0.4}, min_t_norm, max_s_norm, domain)

    it2out["y1"].plot(filename="y1_out")
    TR_plot(domain, tr["y1"], filename="y1_tr")
    print(crisp(tr["y1"]))
    '''
    NB = IT2FS_Gaussian_UncertStd(domain, [-1, 0.15, 0.1])
    NS = IT2FS_Gaussian_UncertStd(domain, [-0.5, 0.15, 0.1])
    ZO= IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    PS = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1])
    PB = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1])
    # IT2FS_plot(NB, NS, ZO,PS,PB, legends=["NB", "NS", "ZO","PS","PB"], filename="asb(x1,x2)_ex_sets")

    LVB = IT2FS_Gaussian_UncertStd(domain, [-0.875, 0.15, 0.1])
    LB = IT2FS_Gaussian_UncertStd(domain, [-0.625, 0.15, 0.1])
    LS= IT2FS_Gaussian_UncertStd(domain, [-0.375, 0.15, 0.1])
    LVS = IT2FS_Gaussian_UncertStd(domain, [-0.125, 0.15, 0.1])
    Z = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1])
    RVS = IT2FS_Gaussian_UncertStd(domain, [0.125, 0.15, 0.1])
    RS = IT2FS_Gaussian_UncertStd(domain, [0.375, 0.15, 0.1])
    RB= IT2FS_Gaussian_UncertStd(domain, [0.625, 0.15, 0.1])
    RVB = IT2FS_Gaussian_UncertStd(domain, [0.875, 0.15, 0.1])
    # IT2FS_plot(LVB, LB, LS,LVS,Z,RVS,RS,RB,RVB, legends=["LVB", "LB", "LS","LVS","Z","RVS","RS","RB","RVB"], filename="y2_ex_sets")

    myIT2FLS = IT2FLS()
    myIT2FLS.add_input_variable("x1")
    myIT2FLS.add_input_variable("x2")
    #myIT2FLS.add_output_variable("y1")
    myIT2FLS.add_output_variable("y2")

    myIT2FLS.add_rule([("x1", NB), ("x2", NB)], [("y2", LS)])
    myIT2FLS.add_rule([("x1", NB), ("x2", NS)], [("y2", LS)])
    myIT2FLS.add_rule([("x1", NB), ("x2", ZO)], [("y2", LS)])
    myIT2FLS.add_rule([("x1", NB), ("x2", PS)], [("y2", LB)])
    myIT2FLS.add_rule([("x1", NB), ("x2", PB)], [("y2", LVB)])

    myIT2FLS.add_rule([("x1", NS), ("x2", NB)], [("y2", LVS)])
    myIT2FLS.add_rule([("x1", NS), ("x2", NS)], [("y2", LS)])
    myIT2FLS.add_rule([("x1", NS), ("x2", ZO)], [("y2", LS)])
    myIT2FLS.add_rule([("x1", NS), ("x2", PS)], [("y2", LVB)])
    myIT2FLS.add_rule([("x1", NS), ("x2", PB)], [("y2", LVB)])

    myIT2FLS.add_rule([("x1", ZO), ("x2", NB)], [("y2", Z)])
    myIT2FLS.add_rule([("x1", ZO), ("x2", NS)], [("y2", Z)])
    myIT2FLS.add_rule([("x1", ZO), ("x2", ZO)], [("y2", Z)])
    myIT2FLS.add_rule([("x1", ZO), ("x2", PS)], [("y2", LVB)])
    myIT2FLS.add_rule([("x1", ZO), ("x2", PB)], [("y2", LVB)])

    myIT2FLS.add_rule([("x1", PS), ("x2", NB)], [("y2", RVS)])
    myIT2FLS.add_rule([("x1", PS), ("x2", NS)], [("y2", RS)])
    myIT2FLS.add_rule([("x1", PS), ("x2", ZO)], [("y2", RB)])
    myIT2FLS.add_rule([("x1", PS), ("x2", PS)], [("y2", RVB)])
    myIT2FLS.add_rule([("x1", PS), ("x2", PB)], [("y2", RVB)])

    myIT2FLS.add_rule([("x1", PB), ("x2", NB)], [("y2", RS)])
    myIT2FLS.add_rule([("x1", PB), ("x2", NS)], [("y2", RS)])
    myIT2FLS.add_rule([("x1", PB), ("x2", ZO)], [("y2", RB)])
    myIT2FLS.add_rule([("x1", PB), ("x2", PS)], [("y2", RB)])
    myIT2FLS.add_rule([("x1", PB), ("x2", PB)], [("y2", RVB)])

    it2out, tr = myIT2FLS.evaluate({"x1":x, "x2":y}, min_t_norm, max_s_norm, domain)
    print("v2_output:",crisp(tr["y2"]))
Exemple #10
0
 def __call__(self, att1, att2, att3):
     o, tr = self.DM.evaluate({"ATT1": att1, "ATT2": att2, "ATT3": att3})
     return crisp(tr["DECI"])