我从我的生产项目中提取了以下最小示例。我的机器学习项目由线性代数库、深度学习库和应用程序组成。
线性代数库包含一个基于可存储向量的矩阵模块:
module Matrix where
import Data.Vector.Storable hiding (sum)
data Matrix a = Matrix { rows :: Int, cols :: Int, items :: Vector a } deriving (Eq, Show, Read)
item :: Storable a => Int -> Int -> Matrix a -> a
item i j m = unsafeIndex (items m) $ i * cols m + j
multiply :: Storable a => Num a => Matrix a -> Matrix a -> Matrix a
multiply a b = Matrix (rows …Run Code Online (Sandbox Code Playgroud) 我想为列表monad提供我自己的实例.不幸的是,以下内容在编译时会导致重复的实例声明错误.
myReturn :: a -> [a]
myBind :: [a] -> (a -> [b]) -> [b]
instance Monad [] where
return = myReturn
(>>=) = myBind
Run Code Online (Sandbox Code Playgroud)
从文档来看,似乎不可能在导入时隐藏实例声明,并且由于列表monad实例已经在前奏中声明,我想我也无法摆脱导入本身.
我想也许我至少可以重新绑定(>>=),return以便我可以使用自己的实现来使用do块,因为块应该只是(>>=)和的应用程序的语法糖(>>).
let
return = myReturn
(>>=) = myBind
in
do
item1 <- list1
item2 <- list2
return (item1, item2)
Run Code Online (Sandbox Code Playgroud)
不幸的是,似乎块(>>=)从其他地方获取它们,因为它仍然使用(>>=)默认列表monad实例.
有没有办法让我的实现(>>=)和returnlist monad的实例,或者至少是一种方法来使用do块?
我想使用 SCIP 解决具有 267 个变量 [1] 的混合整数二次规划问题。
CPLEX 可以在大约 30 秒内解决该问题,并且在不到一秒的时间内就已经找到了非常接近最优解的解决方案 [2, 3]。
不幸的是,SCIP 确实在解决这个问题上遇到了困难,即使运行了 20 多分钟也无法找到接近最佳的解决方案 [4]。
为什么是这样?CPLEX 在 MIQP 方面真的比SCIP 好得多吗?我是否没有正确配置 SCIP?如何使用 SCIP 解决这个问题?
在我看来,SCIP 找到的解决方案与松弛的解决方案相去甚远。我的印象是 SCIP 首先解决松弛问题,然后尝试在此基础上找到整数解。这不正确吗?如果是的话,为什么解决方案还那么遥远?