首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"TypeError: compute_integral()获取参数‘限制’的多个值“,使用register_analytic_integral

"TypeError: compute_integral()获取参数‘限制’的多个值“,使用register_analytic_integral
EN

Stack Overflow用户
提问于 2022-06-05 12:43:30
回答 1查看 21关注 0票数 0

我使用以下内容定义了自己的ZFit pdf:

代码语言:javascript
复制
class AngularPDFWithAcceptance(zfit.pdf.BasePDF):
    def __init__(self, ctl_name, ctk_name, phi_name, params, name):
        from math import pi
        ctl = zfit.Space(ctl_name, limits=(-1.0, 1.0))
        ctk = zfit.Space(ctk_name, limits=(-1.0, 1.0))
        phi = zfit.Space(phi_name, limits=(-pi, pi))
        obs = ctl*ctk*phi
        super().__init__(obs=obs, params=params, name=name)
        integral_full_limits = zfit.Space(axes=self.axes, limits = self.space.limits)
        self.register_analytic_integral( self.compute_integral_full_limits, integral_full_limits )
    ...
     def compute_integral_full_limits(limits, params, model):
        # this is the integral over 8pi
        ...
        return normalization

在创建PDF时,我会得到一个错误

代码语言:javascript
复制
...
  File "/data/bfys/wouterh/miniconda3/envs/bd2ksteeEnv/lib/python3.8/site-packages/zfit/core/integration.py", line 606, in __call__
    return self.integrate(*args, **kwargs)
  File "/data/bfys/wouterh/miniconda3/envs/bd2ksteeEnv/lib/python3.8/site-packages/zfit/core/space.py", line 2777, in new_func
    return func(*args, **kwargs)
TypeError: compute_integral() got multiple values for argument 'limits'

有人能说出我做错了什么吗?提前谢谢..。

EN

回答 1

Stack Overflow用户

发布于 2022-06-06 11:49:30

问题

这里出现的问题是,积分注册是在实例的init中完成的,但它实际上是一个类方法,应该在类中注册,而不是在实例上注册(下面错误的技术细节)。

解决方案

因此,该示例应该如下所示:

代码语言:javascript
复制
class AngularPDFWithAcceptance(zfit.pdf.BasePDF):
    def __init__(self, ctl_name, ctk_name, phi_name, params, name):
        from math import pi
        ctl = zfit.Space(ctl_name, limits=(-1.0, 1.0))
        ctk = zfit.Space(ctk_name, limits=(-1.0, 1.0))
        phi = zfit.Space(phi_name, limits=(-pi, pi))
        obs = ctl*ctk*phi
        super().__init__(obs=obs, params=params, name=name)
    ...
 def compute_integral_full_limits(limits, params, model):
    # this is the integral over 8pi
    ...
    return normalization

# the following code is duplicated, one could refactor it, i.e. into a class method/attribute
from math import pi
ctl = zfit.Space(ctl_name, limits=(-1.0, 1.0))
ctk = zfit.Space(ctk_name, limits=(-1.0, 1.0))
phi = zfit.Space(phi_name, limits=(-pi, pi))
obs = ctl*ctk*phi
integral_full_limits = zfit.Space(axes=self.axes, limits = self.space.limits)  AngularPDFWithAcceptance.register_analytic_integral(compute_integral_full_limits, integral_full_limits)

解释

问题是compute_integral_full_limits是一个(实例)方法。因此,它将自动接受第一个(隐藏)参数self。然而,由于注册函数是一个类方法,它在某种程度上混淆了签名,即不自动提供自作为第一个参数。因此,最有可能的是,在某种程度上,限制被作为第一种和第二种观点来讨论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72507415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档