гомогенизации функции могут быть скомпилированы в расчет сети? - PullRequest
0 голосов
/ 30 ноября 2010

Внутри сети информация (пакет) может передаваться другому узлу (хостам), изменяя его содержимое, оно может иметь различное значение. Окончательный пакет зависит от ввода хостов по заданному маршруту сети.

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

Прототип:

def a(p): return p + 1
def b(p): return p + 2
def c(p): return p + 3
def d(p): return p + 4
def e(p): return p + 5


def link(p, r):
    p1 = p
    for x in r:
        p1 = x(p1)
    return p1

p = 100
route = [a,c,d]
result = link(p,result)
#========
target_result = 108
if result = target_result:
   # route is OK

Я думаю, наконец, мне нужно что-то вроде этого:

  p with [init_payload, expected_target, passed_path, actual_calculated_result]
  |
  \/
 [CHAOS of possible of functions networks]
  |
  \/
  px [a,a,b,c,e]  # ok this path is ok and match the target 

Вот мои вопросы, надеюсь, может получить вашу помощь:

  1. может p переносить (определять) маршрут (-ы) путем проверки функции и оценочного результата 101

    (1.1), например, если на маршруте есть узел x()

    def x(p): return x / 0 # I suppose it can pass the compile

    может p знать, почему этот путь не подходит, тогда избегайте выбора этого пути?

    (1.2) Еще одна путаница в том, что если p является самоопределяемым типом класса, то полезная нагрузка внутри этого класса по существу является строкой, когда она переносится с путем [a, c, d], может p знаете, a() должен иметь тип int, а затем избегать выбора этого узла? '

  2. То же, что 1,2 при генерации пути, могу ли я избежать таких упс?

    def a (p): вернуть p + 1

    def b (p): вернуть p + 2

    def x (p): вернуть p.append (1)

    def y (p): вернуть p.append (2)

    full_node_list = [a, b, x, y]

    path = random (2, full_node_list) # упс x, y будет проблемой для типа int, а a, b будет проблемой для типа списка. Просьба рассмотреть, является ли путь лямбда-списком функций

PS: поскольку вся модель не очень ясна, я буду признателен за любую ведущую и режиссерскую работу.

СПАСИБО!

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Вы можете сначала протестировать каждую функцию с набором данных выборки; любая функция, которая возвращает постоянно непригодные значения, может затем быть отброшена.

def isGoodFn(f):
    testData = [1,2,3,8,38,73,159]   # random test input
    goodEnough = 0.8 * len(testData)  # need 80% pass rate

    try:
        good = 0
        for i in testData:
            if type(f(i)) is int:
                good += 1
        return good >= goodEnough
    except:
        return False

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

Если бы у вас была эвристическая мера того, насколько далеко каждый результат от вашего желаемого результата, вы могли бы выполнить направленный поиск, чтобы найти хорошие ответы гораздо быстрее, но такая эвристика будет зависеть от знания общей формы функций ( эвристика расстояния для мультипликативных функций будет сильно отличаться от эвристики для аддитивных функций и т. д.)

0 голосов
/ 30 ноября 2010

Ваши функции могут raise TypeError, если они не удовлетворены типами данных, которые они получают.Затем вы можете поймать это исключение и посмотреть, передаете ли вы соответствующий тип.Вы также можете поймать любой другой тип исключения.Но попытка вызова функций и отлов исключений могут быть довольно медленными.

Вы также можете организовать свои функции в различные наборы в зависимости от типа аргумента.

functions = { list : [some functions taking a list], int : [some functions taking an int]}

...
x = choose_function(functions[type(p)])
p = x(p)
0 голосов
/ 30 ноября 2010

Я несколько сбит с толку относительно того, что вы пытаетесь сделать, но: p не может "знать" о функциях, пока они не будут выполнены через них. По своей конструкции функции Python не указывают, с каким типом данных они работают: например, a*5 допустимо, является ли строка, список, целое число или число с плавающей запятой.

Если есть некоторые функции, которые могут не работать на p, вы можете перехватывать исключения, например, в вашей функции ссылки:

def link(p, r):
    try:
        for x in r:
            p = x(p)
    except ZeroDivisionError, AttributeError: # List whatever errors you want to catch
        return None
    return p
...