Questions tagged «automatic-differentiation»

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。

4
在计算科学中什么时候应该使用C ++表达式模板,什么时候不应该使用它们?
假设我正在使用C ++编写科学代码。在最近与一位同事的讨论中,有人争辩说表达模板可能是一件很糟糕的事情,有可能使软件只能在某些版本的gcc上编译。据推测,这个问题影响了一些科学规范,正如《堕落》这个模仿中的字幕所提到的那样。(这些是我所知道的唯一示例,因此是链接。) 但是,其他人则认为,表达模板很有用,因为它们可以避免将中间结果存储在临时变量中,从而可以提高性能(如SIAM Journal of Scientific Computing的论文)。 我对C ++中的模板元编程一无所知,但我知道这是自动微分和区间算术中使用的一种方法,这就是我讨论表达式模板的方式。考虑到性能方面的潜在优势和维护方面的潜在劣势(即使这是正确的话),我什么时候应该在计算科学中使用C ++表达式模板,什么时候应该避免使用它们?

1
有没有一种工具可以通过解析Fortran(或C)代码来生成Fortran(或C)函数的间隔扩展?
在我的博士学位论文中,案例研究要求我在CHEMKIN-II中有Fortran子例程的间隔扩展(对此表示歉意;这是我能从Sandia国家实验室不再分发的软件包中找到的最好的)。CHEMKIN-II是用于燃烧化学的化学软件包。因为它是燃烧中使用的标准包装,所以我不能(或者更愿意不使用)。 为了获得所需的间隔扩展,我一直使用内部开发的称为DAEPACK的工具。我以前使用的旧二进制文件能够生成我在32位OS(版本对应于gcc 2.95的libstdc版本)上所需的CHEMKIN-II子例程的所需间隔扩展,但是几年前就淘汰了的使用,这是一个巨大的考验(因为我必须找到我使用的所有其他软件的32位版本)。该软件包的源代码也是专有的,但是由于它最初是由MIT开发的,而我是在MIT工作的,因此我能够(经过大量的努力)获得DAEPACK的源代码。使用我拥有的源代码,我能够编译与64位版本的Linux兼容的DAEPACK版本以及与gcc 4.xx相对应的libstdc版本。但是,我怀疑此源代码已经过时,编译成无法成功生成我需要的区间扩展代码才能完成论文的可执行文件。我已与开发人员联系,以寻求他的修复源代码方面的帮助,但是从以前与开发人员的联系中,我知道如果他愿意的话,修复源代码将花费一些时间。 这是个大问题:我有6个月的时间才能毕业,因为我用光了资金。我不能依靠开发人员足够快地修复DAEPACK,而无法成功完成我的博士学位论文,而这正是你们的用武之地。 我需要执行以下操作的软件包: 生成间隔扩展,泰勒模型(使用间隔算法)以及几乎任意的Fortran 77代码的派生;我认为DAEPACK不能解析的唯一结构是DO循环和IF语句。由于我需要泰勒模型,因此代码还必须具有自动微分(AD)功能。 通过Fortran 77代码的源到源转换生成这些间隔扩展和Taylor模型(即,它像编译器一样解析源代码,以生成计算间隔扩展和Taylor模型的源代码)。 紧急情况下,我可以使用对C代码而不是Fortran 77代码执行上述两项操作的软件,然后将所有内容传递给f2c。我真的不喜欢这样,因为我不知道是否通过所有操作f2c都可以,但是我非常绝望。 你们可以帮助绝望的博士生吗? 在有时间限制的情况下,为了预料到一些可能的建议,以下是对我不起作用的方法: 努力使DAEPACK工作;相信我,我已经尝试过。而且我经常向开发人员投诉。 使用面向对象(或类似于对象的)方法计算区间扩展或泰勒模型的工具。我没有时间用新的类型重新编码CHEMKIN-II(或任何其他类似的大型库)。这个太大了。 使用除Fortran 77/90或C之外的任何其他语言。CHEMKIN-II代码位于Fortran中。我可以使用f2c,也可以根据需要使用CHEMKIN-II的基于Sandia的克隆TChem 将其转换为C。我以前的结果是使用CHEMKIN-II;我的新结果应该复制我的旧结果,并且我已经知道Cantera将不会根据案例研究和单元测试复制CHEMKIN-II的功能。此外,我之前的研究生对CHEMKIN-II源代码进行了一些不可思议的操作,以使区间运算特别有效。对于我来说,很难在其他任何软件包中复制它。

2
关于自动区分,源代码转换(STC)是否比运算符重载(OO)更有效?
我们正在研究一个时空过程的贝叶斯模型,并且正在使用一个No-U-Turn采样器(NUTS),该采样器需要一个对数概率模型以及相对于模型参数的梯度。更简洁地说,我们有相当复杂的对数概率函数,涉及统计分布,克罗内克乘积,指数,比率,if-else语句等,需要提供它以及它对NUTS的梯度。几个软件包(Stan和 Julia的MCMC)使用运算符重载(据我所知)自动获取渐变。f:Rn→Rf:Rn→Rf : \mathbb{R}^n \rightarrow \mathbb{R} 如果我们能够使用源代码转换自动差异工具来创建自己的梯度函数,那么我们是否会获得更好的性能,或者OO一样好还是更好?

2
自动分化何时便宜?
自动微分使我们能够对特定输入上的程序的派生进行数值评估。有一个定理,这种计算的成本不到运行原始程序的成本的五倍。这个五分之一是一个上限。 在什么情况下可以进一步降低成本?许多现场派生代码以接近原始程序的速度运行。如何获得这种加速? 可以利用原始程序的哪些特征来加快计算速度? 可以采用哪些软件工程技巧来加快计算速度?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.