同质化的功能可以编译成计算网络吗?

时间:2010-11-30 11:26:28

标签: python function chaining

在网络内部,信息​​(包)可以传递到不同的节点(主机),通过修改它可以带来不同含义的内容。最终的包依赖于通过它给定的网络路由输入的主机。

现在我想实现一个计算网络模型可以通过给出不同的计算路径来做小工作。

原型:

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通过检查函数和estmated结果来携带(确定)路径吗?

    例如,

    (1.1),如果在路线上有节点x()

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

    可以p以某种方式知道这条路径不好然后避免选择这条路径吗?

    (1.2)另一个混淆是如果p是一个自定义的类类型,这个类中的有效负载本质上是一个字符串,当它带有路径[a,c,d]时,可以{ {1}}知道p必须使用int类型然后避免选择此节点吗?'

  2. 与生成路径时的1.2相同,我可以避免这样的oops

    def a(p):return 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)#oops x,y对于inttype P会有麻烦,a,b会很难列出类型。 请考虑路径是否为lambda函数列表

  3. PS:因为整个模型在我看来并不是很明确,所以任何领导和指导都会受到赞赏。

    谢谢!

3 个答案:

答案 0 :(得分:1)

您可以先使用一组样本数据测试每个函数;任何返回一致不可用值的函数都可能被丢弃。

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

如果您对这些函数的作用一无所知,则必须进行全面的广度优先树搜索,并在每个节点上进行错误检查以丢弃不良结果。如果您有多个功能,这将非常快速地变得非常大。如果您可以保证某些功能的行为,您可能会大大减少搜索空间 - 但这将是特定于域的,需要更准确地了解问题。

如果您对每个结果与期望结果的距离有一个启发式测量,您可以进行定向搜索以更快地找到好的答案 - 但这种启发式方法取决于了解函数的整体形式(a乘法函数的距离启发式与加性函数的距离启发式非常不同,等等。

答案 1 :(得分:0)

我对你要做的事情感到有些困惑,但是:在它通过它们之前,p不能“了解”这些功能。根据设计,Python函数不指定它们操作的数据类型:例如无论a是字符串,列表,整数还是浮点数,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

答案 2 :(得分:0)

如果他们对收到的数据类型不满意,您的函数可以raise TypeError。然后,您可以捕获此异常并查看是否传递了适当的类型。您还可以捕获任何其他异常类型。但是尝试调用函数并捕获异常可能会非常缓慢。

您还可以根据参数类型将您的函数组织到不同的集合中。

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

...
x = choose_function(functions[type(p)])
p = x(p)