R 数值方法产生与平台相关的结果

R 数值方法产生与平台相关的结果,r,mathematical-optimization,multiplatform,testthat,R,Mathematical Optimization,Multiplatform,Testthat,我的小弟弟有一个相当复杂的问题。基本上,我正在使用rugarch包构建一个GARCH(1,1)模型,该包正是为此目的而设计的。它使用了一系列解算器(由Rsolnp和nloptr提供,通用非线性优化),运行良好。我正在用testthat来测试我的方法,方法是提供一个基准解决方案,该解决方案以前是通过在Windows下手动运行代码获得的(Windows是要在中使用的包的主要平台) 现在,当解决方案在几个连续运行中不一致时,我最初遇到了一些问题。差异在我为解算器指定的公差范围内(默认值solver='

我的小弟弟有一个相当复杂的问题。基本上,我正在使用
rugarch
包构建一个GARCH(1,1)模型,该包正是为此目的而设计的。它使用了一系列解算器(由
Rsolnp
nloptr
提供,通用非线性优化),运行良好。我正在用
testthat
来测试我的方法,方法是提供一个基准解决方案,该解决方案以前是通过在Windows下手动运行代码获得的(Windows是要在中使用的包的主要平台)

现在,当解决方案在几个连续运行中不一致时,我最初遇到了一些问题。差异在我为解算器指定的公差范围内(默认值
solver='hybrid'
,如文档所建议),因此我猜测它使用了某种随机化。所以我去掉了随机种子和并行(“合法的”原因),问题就解决了,每次在Windows下我都会得到相同的结果,所以我运行R CMD CHECK和
测试,测试是否成功

在那之后,我决定自动化一点,现在构建过程由。令我惊讶的是,Linux下的结果与我的基准测试不同

读取顺序(文件输出)不等于读取顺序(文件基准)
平均相对差:0.00000014688

多次重建会产生相同的结果,而差异总是相同的,这意味着在Linux下,解决方案也是一致的。作为临时修复,我将根据平台设置一个公差限制,测试通过(请参阅最新版本)

总而言之:

  • 数值过程分别在Windows和Linux平台上产生相同的输出
  • 然而,这些输出是不同的,不是由随机种子和/或并行引起的 我通常只关心Windows下的支持,不打算公开发布,所以这对我的软件包本身来说不是什么大问题。但我要提请大家注意,因为其中一个被广泛使用的解算器可能存在问题

    不,我并不是要求修改我的代码:依赖平台的容忍度相当丑陋,但到目前为止,它确实起到了作用。问题是:

  • 还有什么可以“合法”(或“自然”)导致所描述的差异
  • 是否需要低级数值例程在所有平台上生成相同的结果?我的期望太高了,这会发生吗
  • 我应该非常关心这件事吗?这是一种普遍的情况吗

  • 低级数值例程不能在所有平台上产生相同的结果,甚至不能在同一平台上的所有编译器上产生相同的结果。@BenBolker谢谢,这很有意义。有什么提示可以让我了解更多吗?除此之外,在我看来,你的评论似乎回答了我的问题,因此,如果你愿意,你可以发布它。我在一个自动测试场景中也面临着这个问题。是否有一种特殊模式,使R不使用cpu级别的函数?类似Java的“严格数学”吗?