Абстрактный алгоритм в классе и неизвестное количество входных данных

#python #algorithm #class #parameter-passing

#python #алгоритм #класс #передача параметров

Вопрос:

Я пытаюсь закодировать класс абстрактного алгоритма, но я не знаю, как управлять множеством алгоритмов.

 class Algorithm:

    def __init__(self, x_init):
        self.x = x_init

    def run(self, n_it):
        for it in range(n_it):
             self.x = self.T(self.x)

    def T(self, x):
         pass
  

Он состоит в том, чтобы запускать мой алгоритм во время итераций n_it. Моя проблема в том, что некоторые алгоритмы имеют гиперпараметры, итак, как я могу их включить? Кроме того, некоторые алгоритмы используют шаг в прошлом x_{n-1}, и я бы

 self.x = self.T(self.x, self.x_past)
  

но это не работает с этой настройкой. Какое решение, по вашему мнению, является лучшим?

T может быть вне класса, но для меня логичнее быть внутри. Я использую Algorithm как абстрактный класс и создаю дочерний класс для каждого из моих алгоритмов, определяя T. Возможно, есть более эффективный способ.

Я, вероятно, могу использовать *args и *kwargs . Более того, поскольку я ввел x в качестве атрибута, я могу написать

 def T(self):
    pass
  

и изменять непосредственно в T, это, вероятно, более логично с точки зрения pythonic, но немного меньше с математической точки зрения. Есть ли у вас какие-либо предложения по улучшению моего кода и решению моей проблемы?

Ответ №1:

Вы пытаетесь использовать здесь технику функционального программирования. Использование OO-дизайна вокруг него создает код без реальной пользы. Ниже приведена более простая версия вашего кода:

 def run (x, n_it, t):
    for it in range(n_it)
         x = t(x)
    return x
  

И теперь, если кто-то хочет что-то делать с метапараметрами, они могут просто передать замыкание.

 def setup_t(parameters):
    prev_x = 0
    def t (x):
        answer = ... # do something with parameters and x
        nonlocal prev_x = x
        return answer
    return t
  

Таким образом, вызывающий может обрабатывать метапараметры в настройке и отслеживать предыдущее значение или три, если им нужно. Они лучше вас подготовлены к тому, с какими сложностями им приходится иметь дело, поэтому предоставьте это им.

Комментарии:

1. Я не уверен, что понимаю (но это кажется отличным). Предположим, что я хочу повторить следующее уравнение: x_{n 1} = alpha * x_n (1- alpha) *x_{n-1} Что я могу сделать с вашей настройкой? И другим примером может быть x_{n 1} = x_n 1/n **2

2. @NM36 Честно говоря, я бы потратил некоторое время на изучение wiki. python.org/moin/Generators и просто используйте функциональные методы. Поэтому вместо того, чтобы пытаться создать фреймворк для передачи алгоритма извне, передайте диапазон в алгоритм и верните генератор.