Как предотвратить AssertionError от остановки Python кода? - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу создать систему, использующую нечеткий контроллер Autorules, в котором я создаю правила для обработки реальных данных. Моя проблема в том, что когда я использую новые данные для имитации нечеткого контроллера с правилами, извлеченными из более старых данных, я получаю ошибку о четком выводе, который не может быть рассчитан, потому что не существует достаточно правил, что совершенно нормально, потому что моя нечеткая система нужно больше правил, и это моя точка зрения! Я хочу реализовать новую подпрограмму, которая анализирует четкий ввод / вывод и создает новые правила из этих данных, после чего я хочу go вернуться в свой код и снова смоделировать.

Есть ли функция, которая блокирует AssertionError от остановки кода и перенаправления на другую def или на ранее введенную строку кода?

Я попытался найти некоторую библиотеку lib с функцией, которая позволяет мне перенаправлять ошибку устойчиво, чтобы остановить код, но безуспешно. Я думаю, что мне придется изменить код определения skfuzzy defuzz, чтобы позволить его сделать.

Большое спасибо.

'' 'python

step = stp_ini
k = 0
delay = stp_ini
end = stp_fim - stp_ini
Tout_sim = pd.DataFrame(columns=['val'])
Vent_sim = pd.DataFrame(columns=['val'])

start = timeit.default_timer()

for step in range(end-k):
    clear_output(wait=True)
    simulation.input['PCA1'] = comp1n[step+delay]
    simulation.input['PCA2'] = comp2n[step+delay]
    simulation.input['PCA3'] = comp3n[step+delay]
    simulation.input['PCA4'] = comp4n[step+delay]
    simulation.input['Vent'] = dataoutf.NumVentOn[step+delay]
    simulation.compute()
    Tout_sim = Tout_sim.append({'val':simulation.output['Tout']},ignore_index=True)

    stop = timeit.default_timer()
    if ((step/(stp_fim-k-1))*100) < 5:
        expected_time = "Calculating..."
    else:
        time_perc = timeit.default_timer()
        expected_time = np.round( ( (time_perc-start)/(step/(end-k-1)) )/60,2)

'' '

~ \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site-packages \ skfuzzy \ control \ controlsystem.py в defuzz (self) 587 self.var.defuzzify_method) 588 кроме AssertionError: - > 589 повысить ValueError («Невозможно рассчитать четкое выходное значение, скорее всего,« 590 », поскольку система слишком разрежена. Проверьте« 591 », убедитесь, что этот набор входных значений будет«

ValueError: Невозможно рассчитать четкое выходное значение » вероятно, потому что система слишком разреженная. Убедитесь, что этот набор входных значений активирует хотя бы один подключенный термин в каждом антецеденте с помощью текущего набора правил.

edit: я пытаюсь обернуть код строки ValueError при попытке, но ValueError еще активирован

def defuzz(self):
    """Derive crisp value based on membership of adjective(s)."""
    if not self.sim._array_inputs:
        ups_universe, output_mf, cut_mfs = self.find_memberships()

        if len(cut_mfs) == 0:
            raise ValueError("No terms have memberships.  Make sure you "
                             "have at least one rule connected to this "
                             "variable and have run the rules calculation.")

        try:
            return defuzz(ups_universe, output_mf,
                          self.var.defuzzify_method)
        except AssertionError:
            try:
                new_c1 = []
                new_c2 = []
                new_c3 = []
                new_c4 = []
                new_vent = []
                new_tout = []
                newcondition1 = []
                newcondition2 = []
                newcondition3 = []
                newcondition4 = []
                newcondition5 = []
                newcondition6 = []

                #input
                n = 0
                for n in range(len(namespca)):
                    new_c1.append(fuzz.interp_membership(PCA1.universe, PCA1[namespcapd.name.loc[n]].mf, comp1n[step]))
                    new_c2.append(fuzz.interp_membership(PCA2.universe, PCA2[namespcapd.name.loc[n]].mf, comp2n[step]))
                    new_c3.append(fuzz.interp_membership(PCA3.universe, PCA3[namespcapd.name.loc[n]].mf, comp3n[step]))
                    new_c4.append(fuzz.interp_membership(PCA4.universe, PCA4[namespcapd.name.loc[n]].mf, comp4n[step]))

                n = 0
                for n in range(len(namesvent)):    
                    new_vent.append(fuzz.interp_membership(Vent.universe, Vent[namesventpd.name.loc[n]].mf, dataoutf.NumVentOn[step]))

                #output
                n = 0
                for n in range(len(namestemp)):
                    new_tout.append(fuzz.interp_membership(Tout.universe, Tout[namestemppd.name.loc[n]].mf, dataoutf.TsaidaHT[step]))

                #new_c1 = np.transpose(new_c1)
                new_c1_conv = pd.DataFrame(new_c1)
                #new_c2 = np.transpose(new_c2)
                new_c2_conv = pd.DataFrame(new_c2)
                #new_c3 = np.transpose(new_c3)
                new_c3_conv = pd.DataFrame(new_c3)
                #new_c4 = np.transpose(new_c4)
                new_c4_conv = pd.DataFrame(new_c4)
                #new_vent = np.transpose(new_vent)
                new_vent_conv = pd.DataFrame(new_vent)
                #new_tout = np.transpose(new_tout)
                new_tout_conv = pd.DataFrame(new_tout)

                i=0
                for i in range(pcamf):
                    newcondition1.append([new_c1_conv.idxmax(axis=0) == i])
                    newcondition2.append([new_c2_conv.idxmax(axis=0) == i])
                    newcondition3.append([new_c3_conv.idxmax(axis=0) == i])
                    newcondition4.append([new_c4_conv.idxmax(axis=0) == i])

                i=0
                for i in range(ventmf):
                    newcondition5.append([new_vent_conv.idxmax(axis=0) == i])

                i=0
                for i in range(tempmf):
                    newcondition6.append([new_tout_conv.idxmax(axis=0) == i])

                choicelistpca = namespca
                choicelistvent = namesvent
                choicelisttout = namestemp

                new_c1_rules = np.select(newcondition1, choicelistpca)
                new_c2_rules = np.select(newcondition2, choicelistpca)
                new_c3_rules = np.select(newcondition3, choicelistpca)
                new_c4_rules = np.select(newcondition4, choicelistpca)
                new_vent_rules = np.select(newcondition5, choicelistvent)
                new_tout_rules = np.select(newcondition6, choicelisttout)

                new_rules = np.vstack([new_c1_rules,new_c2_rules,new_c3_rules,new_c4_rules,new_vent_rules,new_tout_rules])
                new_rules = new_rules.T

                new_rulespd = pd.DataFrame(new_rules,columns=['PCA1','PCA2','PCA3','PCA4','Vent','Tout'])

                #Checar se a nova regra está dentro do conjunto de regras fuzzy atual
                if pd.merge(new_rulespd,AutoRules, on=['PCA1','PCA2','PCA3','PCA4','Vent','Tout'],how='inner').empty:
                    print('Nova regra não encontrada no conjunto atual de regras fuzzy!')
                else:
                    pd.merge(new_rulespd,AutoRules, on=['PCA1','PCA2','PCA3','PCA4','Vent','Tout'],how='inner')

        """except AssertionError:
            raise ValueError("Crisp output cannot be calculated, likely "
                             "because the system is too sparse. Check to "
                             "make sure this set of input values will "
                             "activate at least one connected Term in each "
                             "Antecedent via the current set of Rules.")"""
    else:
        # Calculate using array-aware version, one cut at a time.
        output = np.zeros(self.sim._array_shape, dtype=np.float64)

        it = np.nditer(output, ['multi_index'], [['writeonly', 'allocate']])

        for out in it:
            universe, mf = self.find_memberships_nd(it.multi_index)
            out[...] = defuzz(universe, mf, self.var.defuzzify_method)

        return output

1 Ответ

1 голос
/ 05 февраля 2020

Оберните строку кода, которая поднимает ValueError в try. И решите, что делать в его предложении except ValueError:. Возможно, continue переход на следующую итерацию может быть разумным.

...