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

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

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

Прототип:

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 переносить (определять) маршрут (ы), проверяя функцию и оценивая результат?

    (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 будут проблемой для inttype P, а a, b будут проблемой для list type. Пожалуйста, подумайте, является ли путь лямбда-списком функций

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

БЛАГОДАРНОСТЬ!


person user478514    schedule 30.11.2010    source источник
comment
Как вы строите вычислительные функции? Может ли функция вернуть тип данных, отличный от того, который она получила?   -  person Krab    schedule 30.11.2010
comment
Также обратите внимание, что p.append (1) добавляет 1 к p на месте и не возвращает ничего полезного. Вы можете сделать return p + [1], чтобы получить список p с дополнительным элементом 1 в конце.   -  person Thomas K    schedule 30.11.2010
comment
на самом деле часть возврата смущает меня, если я ограничиваю тип ввода и возврата, можно легко связать функции, но сложно сделать их гибкими。   -  person user478514    schedule 30.11.2010


Ответы (3)


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

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

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

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

person Hugh Bothwell    schedule 30.11.2010
comment
Хамм, спасибо за подсказки, я думаю, что теперь проверка типа (f (p)) is type (f_next (p)) может потребоваться перед окончательным расчетом, здесь p обозначает краткую выборку общих данных. - person user478514; 01.12.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)
person Krab    schedule 30.11.2010
comment
спасибо, так что мне все же нужно ограничить параметр и тип возвращаемого значения при разработке функции (ей), я просто пытаюсь как-то избежать этого ... - person user478514; 30.11.2010

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

Если есть некоторые функции, которые могут не работать с 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
person Thomas K    schedule 30.11.2010
comment
спасибо за предложение, например, a * 5 действителен независимо от того, является ли a строкой, списком, целым числом или числом с плавающей запятой, это самая сложная часть, которую я стараюсь избегать. потому что предположим, что я хочу a = 5 и по ошибке возвращаю = [5], это приведет к тому, что вся цепочка пойдет в неправильном направлении. - person user478514; 30.11.2010