使用 Scala-Breeze 的 SBT 编译器崩溃
SBT Compiler crash using Scala-Breeze
我正在编写代码来执行内核 K-Means(又名 https://en.wikipedia.org/wiki/K-means_clustering,但有一个技巧)。我需要生成数据,作为第一个简单的生成器,我尝试实现高斯混合模型。这是我的代码:
package p02kmeans
import breeze.linalg._
import breeze.stats.distributions._
/**
* First data generation is simple, gaussian mixture model.
*/
object Data {
class GaussianClassParam (
val mean: Double,
val sd: Double)
/**
* @param proportion marginal probability for each label
* @param param param[j][k] returns the GaussianClassParam for the k class of the j variable
* @param nObs number of observations to be generated
* @result DenseMatrix_ij where i is the observation index and j is the variable number
*/
def gaussianMixture(
proportion: DenseVector[Double],
param: Vector[Vector[GaussianClassParam]],
nObs: Int)
: DenseMatrix[Double] = {
val nVar = param.size
val multiSampler = Multinomial(proportion) // sampler for the latent class
val varSamplerVec = param.map(v => v.map(c => Gaussian(c.mean, c.sd)))
val zi = DenseVector.fill[Int](nObs)(multiSampler.sample)
val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => varSamplerVec(j)(zi(i)).sample)
return data
}
}
当我尝试编译我的代码时(我在 Windows 10 上使用 Scala-Ide 和 sbt eclipse)我得到 2 个错误:
Error in Scala compiler: assertion failed: List(method apply$mcI$sp, method apply$mcI$sp)
SBT builder crashed while compiling. The error message is 'assertion failed: List(method apply$mcI$sp, method apply$mcI$sp)'. Check Error Log for details.
错误由以下行触发:
val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => varSamplerVec(j)(zi(i)).sample)
然后消失:
val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => 12.0)
你能帮我调试一下吗?
我的 sbt 配置:
name := "Sernel"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze" % "0.13.1",
"org.scalanlp" %% "breeze-natives" % "0.13.1",
"org.scalanlp" %% "breeze-viz" % "0.13.1"
)
我的 OSX 设置也有同样的错误。
如果你想测试整个包(比如,如果你想重现错误),代码可以在 Github: https://github.com/vkubicki/sernel 上找到,我可以提供指导: ).
这似乎是一个编译器错误(我想在 scala macroses 中,因为 Breeze 正在使用它们)。您可以尝试在项目中执行完全清理(甚至可能包括 .ivy2
文件夹 - 这可能是您的 MacOS 和 Windows 设置之间的差异)并将您的 scala 更新到 2.11.11(或者甚至可能2.12.x)
然而,Scala 2.11.6 的类似问题(有些东西告诉我它在 Scala 的后续版本中继承)没有得到解决:https://issues.scala-lang.org/browse/SI-9284
因此,有时您可能不得不重复执行清理操作,或者尝试使用其他一些 NumPy 类似物,例如:scalala,Nd4j/Ndjs。
尝试另一个 IDE (IDEA/Atom) 或尝试使用 "bare" SBT 也可能有所帮助,因为 Eclipse 可能会通过调用 Scala 的编译器前端进行干扰。
我正在编写代码来执行内核 K-Means(又名 https://en.wikipedia.org/wiki/K-means_clustering,但有一个技巧)。我需要生成数据,作为第一个简单的生成器,我尝试实现高斯混合模型。这是我的代码:
package p02kmeans
import breeze.linalg._
import breeze.stats.distributions._
/**
* First data generation is simple, gaussian mixture model.
*/
object Data {
class GaussianClassParam (
val mean: Double,
val sd: Double)
/**
* @param proportion marginal probability for each label
* @param param param[j][k] returns the GaussianClassParam for the k class of the j variable
* @param nObs number of observations to be generated
* @result DenseMatrix_ij where i is the observation index and j is the variable number
*/
def gaussianMixture(
proportion: DenseVector[Double],
param: Vector[Vector[GaussianClassParam]],
nObs: Int)
: DenseMatrix[Double] = {
val nVar = param.size
val multiSampler = Multinomial(proportion) // sampler for the latent class
val varSamplerVec = param.map(v => v.map(c => Gaussian(c.mean, c.sd)))
val zi = DenseVector.fill[Int](nObs)(multiSampler.sample)
val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => varSamplerVec(j)(zi(i)).sample)
return data
}
}
当我尝试编译我的代码时(我在 Windows 10 上使用 Scala-Ide 和 sbt eclipse)我得到 2 个错误:
Error in Scala compiler: assertion failed: List(method apply$mcI$sp, method apply$mcI$sp)
SBT builder crashed while compiling. The error message is 'assertion failed: List(method apply$mcI$sp, method apply$mcI$sp)'. Check Error Log for details.
错误由以下行触发:
val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => varSamplerVec(j)(zi(i)).sample)
然后消失:
val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => 12.0)
你能帮我调试一下吗?
我的 sbt 配置:
name := "Sernel"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze" % "0.13.1",
"org.scalanlp" %% "breeze-natives" % "0.13.1",
"org.scalanlp" %% "breeze-viz" % "0.13.1"
)
我的 OSX 设置也有同样的错误。
如果你想测试整个包(比如,如果你想重现错误),代码可以在 Github: https://github.com/vkubicki/sernel 上找到,我可以提供指导: ).
这似乎是一个编译器错误(我想在 scala macroses 中,因为 Breeze 正在使用它们)。您可以尝试在项目中执行完全清理(甚至可能包括 .ivy2
文件夹 - 这可能是您的 MacOS 和 Windows 设置之间的差异)并将您的 scala 更新到 2.11.11(或者甚至可能2.12.x)
然而,Scala 2.11.6 的类似问题(有些东西告诉我它在 Scala 的后续版本中继承)没有得到解决:https://issues.scala-lang.org/browse/SI-9284
因此,有时您可能不得不重复执行清理操作,或者尝试使用其他一些 NumPy 类似物,例如:scalala,Nd4j/Ndjs。
尝试另一个 IDE (IDEA/Atom) 或尝试使用 "bare" SBT 也可能有所帮助,因为 Eclipse 可能会通过调用 Scala 的编译器前端进行干扰。