optimization - F# 和 ILNumerics

标签 optimization f# numerical-analysis ilnumerics

我刚刚下载了最新版本的 ILNumerics,用于我的 F# 项目。是否可以在 F# 中利用这个库?我已经尝试过简单的计算,但它似乎非常麻烦(在 F# 中)。

我想设置一个有约束(甚至无约束)的优化问题。通常的 Rosenbrock 函数就可以了,然后我将使用我自己的函数。我什至很难定义一个数组。我可以定义的唯一一种数组是 RetArray,例如使用这段代码

let vector = ILMath.vector<float>(1.0, 2.0)

编译器表示 vector 是一个 RetArray;我认为这是因为它是从一个函数返回的(即:ILMath.vector)。如果我定义另一个类似的向量,我可以 - 例如 - 对向量求和,例如简单地写

let a = ILMath.vector<float>(1.0, 2.0)
let b = ILMath.vector<float>(3.2,2.2)
let c = a  + b 

我明白了

RetArray<float> = seq [4.2; 4.2]

但是如果我再次尝试检索 c 的值,例如在 FSI 中写入,

c;;

我明白了

Error: Object reference not set to an instance of an object.

在 F# 中使用 ILNumerics 的建议方法是什么?是否可以在 F# 中本地使用该库,或者我被迫从 C# 库调用我的 F# 代码以使用整个 ILNumerics 库?除了引用的问题,我在理解 ILNumerics 的基本逻辑时遇到了问题,当移植到 F# 中时。

例如,在示例代码中使用范围的 C# 的 F# 等价物是什么,如下所示:

using (ILScope.Enter(inData)) { ...

}

最佳答案

为了详细说明 brianberns 的回答,您可以做几件事来让自己更轻松。

我个人不会走定义自定义运算符的路线 - 尤其是 overrides an existing one .相反,也许您应该考虑使用 computation expression使用 ILMath 类型。这将使您能够隐藏很多丑陋的东西,这些丑陋的东西在使用非 F# 标准(例如隐式类型转换)的库中工作时会出现。

我无权访问 ILMath,因此我刚刚实现了这些虚拟替代方案,以便让我的代码能够编译。我怀疑您应该能够不复制它,其余代码将按预期工作

module ILMath =
    type RetArray<'t> = { Values: 't seq }

    and Array<'t> = { OtherValues: 't seq } with
        static member op_Implicit(x: RetArray<_>) = { OtherValues = x.Values }
        static member inline (+) (x1, x2) = { Values = (x1.OtherValues, x2.OtherValues) ||> Seq.map2 (+) }

type ILMath =
    static member vector<'t>([<ParamArray>] vs : 't []) = { ILMath.Values = vs }

如果您以前从未见过或实现过计算表达式,您应该查看我引用的文档。基本上,它以您决定的方式在一些丑陋的东西之上添加了一些漂亮的语法糖。我的示例实现只添加了 let! (脱糖为 Bind )和 return (脱糖到 Return,呃)关键词。

type ILMathBuilder() =
    member __.Bind(x: ILMath.RetArray<'t>, f) =
        f(ILMath.Array<'t>.op_Implicit(x))
    member __.Return(x: ILMath.RetArray<'t>) =
        ILMath.Array<'t>.op_Implicit(x)

let ilmath = ILMathBuilder()

这应该在顶层定义和实例化(ilmath 变量)。这允许你写

let c = ilmath {
    let! a = vector(1.0, 2.0)
    let! b = vector(3.2, 2.2)
    return a + b
}

当然,这个实现只增加了对极少数事情的支持,例如,需要一个 RetArray<'t> 类型的值。总是返回。扩展 ILMathBuilder根据文档输入是从这里开始的方法。

关于optimization - F# 和 ILNumerics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66556098/

相关文章:

ruby-on-rails - 如何清理我的 join_table 并删除重复的条目?

caching - L4缓存发生了什么?

F# 使用通用参数调用 .Net 函数 - 无法编译

F# 优先级队列

c# - 在与类相同的对象中分配数组

c++ - 构造函数和对象声明具体事项

f# - F# 中具有零复制语义的不安全强制转换

algorithm - 如何计算算法的确切复杂度?

python - 不动点迭代算法