Как использовать форматированные строки в функции numba.jit? - PullRequest
0 голосов
/ 26 мая 2020

Привет, товарищи-программисты!

Я хочу войти в numba, чтобы ускорить мою программу python, поэтому я пытаюсь заставить свой код работать с функцией jit. К сожалению, функция print() не работает с отформатированными строками внутри. Эта часть функции выдает ошибку (последняя строка кода показывает функцию print()):

@jit()
def calculate_total_node_THD_func_real_data_with_topo_enhanced(self):

    smallest_harmonic = len(self.list_of_machines[0].harmonic_list_VH_v)
    list_for_longest_measurement = []
    for counter, machine in enumerate(self.list_of_machines):
        list_for_longest_measurement.append(len(machine.harmonic_list_VH_v[0][self.next_state[counter][0]]))  # for checking only needs to check one harmonic, we take the first [0]
    longest_measurement = np.max(list_for_longest_measurement)
    THD_phases = []
    THD_phases_with_topo = []
    harmonics_state_all_phases = []

    for phase in range(0, 3):
        total_THD_for_all_timesteps = []
        total_THD_for_all_timesteps_with_topo = []
        harmonics_state_phase = []

        for time_ in range(0, longest_measurement):
            time1 = time.perf_counter()
            if self.consider_topology == True:
                # power für alle maschinen für den Zeitpunkt [p_m1, ...., p_m5]
                # harmonischen 2...40 für den zeitpunkt time_ [h_m1_2-40, ..., h_m5_2-40]
                p_soll = np.zeros(shape=len(self.list_of_machines) + 1)
                i_harm_amp = np.zeros(shape=(len(self.list_of_machines) + 1, self.list_of_machines[0].smallest_harmonic - 1))
                i_harm_angle = np.zeros(shape=(len(self.list_of_machines) + 1, self.list_of_machines[0].smallest_harmonic - 1))
                # fill the matrices
                for counter, machine in enumerate(self.list_of_machines):
                    if len(machine.harmonic_list_VH_v[0][self.next_state[counter][0]]) <= time_:
                        p_soll[machine.position_in_grid] = machine.power[self.next_state[counter][0]] * 10 ** -3  # power already sampled down, do not use standardized power, power in W -> kW
                        i_harm_amp[machine.position_in_grid, :] = [machine.harmonic_list_CH_v[x][self.next_state[counter][0]][-1][phase] * math.sqrt(2) for x in range(0, machine.smallest_harmonic - 1)]
                        i_harm_angle[machine.position_in_grid, :] = [machine.harmonic_list_CH_p[x][self.next_state[counter][0]][-1][phase] for x in range(0, machine.smallest_harmonic - 1)]
                    else:
                        p_soll[machine.position_in_grid] = machine.power[self.next_state[counter][0]] * 10 ** -3  # power already sampled down, do not use standardized power, power in W -> kW
                        i_harm_amp[machine.position_in_grid, :] = [machine.harmonic_list_CH_v[x][self.next_state[counter][0]][time_][phase] * math.sqrt(2) for x in range(0, machine.smallest_harmonic - 1)]  # *sqrt(2) for converting RMS to amplitude
                        i_harm_angle[machine.position_in_grid, :] = [machine.harmonic_list_CH_p[x][self.next_state[counter][0]][time_][phase] for x in range(0, machine.smallest_harmonic - 1)]
                THD_fake_slack_node = self.grid_topo.harmonic_load_flow_calc(p_soll, i_harm_amp, i_harm_angle)

                total_THD_for_all_timesteps_with_topo.append(THD_fake_slack_node)

                print(f'{5}')

Вывод:

Traceback (most recent call last):
  File "C:/Users/Artur/Desktop/RL_framework/train.py", line 87, in <module>
    main()
  File "C:/Users/Artur/Desktop/RL_framework/train.py", line 77, in main
    duration = cf.training(episodes, env, agent, filename, topology=topology, enhanced_processing=enhanced_processing, CPUs_used=CPUs_used)
  File "C:\Users\Artur\Desktop\RL_framework\help_functions\custom_functions.py", line 163, in training
    save_interval = enhanced_training(episodes=range(episodes), env=env, agent=agent, log_data_qvalues=log_data_qvalues, log_data=log_data, filename=filename, CPUs_used=CPUs_used)
  File "C:\Users\Artur\Desktop\RL_framework\help_functions\custom_functions.py", line 111, in enhanced_training
    next_state, reward = env.step_enhanced(action, state)
  File "C:\Users\Artur\Desktop\RL_framework\help_functions\environment_machines.py", line 152, in step_enhanced
    self.calculate_total_node_THD_func_real_data_with_topo_enhanced()                                                # THD_plant calculation with considering grid topo
  File "C:\Users\Artur\Anaconda\lib\site-packages\numba\core\dispatcher.py", line 404, in _compile_for_args
    error_rewrite(e, 'unsupported_error')
  File "C:\Users\Artur\Anaconda\lib\site-packages\numba\core\dispatcher.py", line 344, in error_rewrite
    reraise(type(e), e, None)
  File "C:\Users\Artur\Anaconda\lib\site-packages\numba\core\utils.py", line 80, in reraise
    raise value.with_traceback(tb)
numba.core.errors.UnsupportedError: Failed in object mode pipeline (step: analyzing bytecode)
Use of unsupported opcode (FORMAT_VALUE) found

File "help_functions\environment_machines.py", line 572:
    def calculate_total_node_THD_func_real_data_with_topo_enhanced(self):
        <source elided>

                    print(f'{5}')
                    ^


Process finished with exit code 1

Когда я использую обычные строки -> print(5) работает, но не с форматированными строками. Есть ли способ использовать форматирование строк?

Заранее спасибо.

1 Ответ

1 голос
/ 27 мая 2020

Кажется, что f-строки не работают, но форматированные строки работают:

print('{val}'.format(val))

...