diff --git a/lang-trials/scala-benchmark/index.html b/lang-trials/scala-benchmark/index.html
index 8e1429a..f9eb11c 100644
--- a/lang-trials/scala-benchmark/index.html
+++ b/lang-trials/scala-benchmark/index.html
@@ -3,7 +3,7 @@
The circular law
-
+
diff --git a/lang-trials/scala-benchmark/src/main/scala/CircularLawApp.scala b/lang-trials/scala-benchmark/src/main/scala/CircularLawApp.scala
index 12a0a00..950e661 100644
--- a/lang-trials/scala-benchmark/src/main/scala/CircularLawApp.scala
+++ b/lang-trials/scala-benchmark/src/main/scala/CircularLawApp.scala
@@ -2,7 +2,6 @@ import com.raquo.laminar.api.L.{*, given}
import narr.*
import org.scalajs.dom
import org.scalajs.dom.document
-import scala.collection.mutable.ArrayBuffer
import scala.math.{cos, sin}
import slash.matrix.Matrix
import slash.matrix.decomposition.Eigen
@@ -39,45 +38,36 @@ object CircularLawApp:
)
ctx.fill()
- def complexEigenvalues[N <: Int](mat: Matrix[N, N])(using ValueOf[N]): (NArray[Double], NArray[Double]) =
- val eigen = Eigen(mat)
+ def eigvalsRotated[N <: Int](A: Matrix[N, N], time: Double)(using ValueOf[N]): (NArray[Double], NArray[Double]) =
+ // create transformation
+ val maxFreq = 4
+ val T = Matrix.identity[N, N]
+ val dim: Int = valueOf[N]
+ for n <- 0 to dim by 2 do
+ val a = cos(math.Pi * time * (n % maxFreq))
+ val b = sin(math.Pi * time * (n % maxFreq))
+ T(n, n) = a
+ T(n+1, n) = b
+ T(n, n+1) = -b
+ T(n+1, n+1) = a
+
+ // find eigenvalues
+ val eigen = Eigen(T*A)
(
eigen.realEigenvalues.asInstanceOf[NArray[Double]],
eigen.imaginaryEigenvalues.asInstanceOf[NArray[Double]]
)
- def randEigvalSeries[N <: Int]()(using ValueOf[N]): (ArrayBuffer[(NArray[Double], NArray[Double])], String) =
- // start timing
- val startTime = System.currentTimeMillis()
-
- // initialize the random matrix step
+ def randEigvalSeries[N <: Int]()(using ValueOf[N]): (List[(NArray[Double], NArray[Double])], String) =
+ val timeRes = 100
val dim: Int = valueOf[N]
- var randMat = new Matrix[N, N](
+ val startTime = System.currentTimeMillis()
+ val A = new Matrix[N, N](
NArray.tabulate(dim*dim)(k => (math.E*k*k) % 2 - 1)
).times(math.sqrt(3d / dim))
-
- // initialize the rotation step
- val timeRes = 100
- val maxFreq = 4
- val rotStep = Matrix.identity[N, N]
- for n <- 0 to dim by 2 do
- val ang = math.Pi * (n % maxFreq) / timeRes
- val cos_ang = cos(ang)
- val sin_ang = sin(ang)
- rotStep(n, n) = cos_ang
- rotStep(n+1, n) = sin_ang
- rotStep(n, n+1) = -sin_ang
- rotStep(n+1, n+1) = cos_ang
-
- // find the eigenvalues
- val eigvalSeries = ArrayBuffer(complexEigenvalues(randMat))
- for _ <- 1 to timeRes-1 do
- randMat = rotStep * randMat
- eigvalSeries += complexEigenvalues(randMat)
-
- // finish timing
+ val series = List.tabulate(timeRes)(t => eigvalsRotated(A, t.toDouble / timeRes))
val runTime = System.currentTimeMillis() - startTime
- (eigvalSeries, runTime.toString() + " ms")
+ (series, runTime.toString() + " ms")
def main(args: Array[String]): Unit =
ctx.fillStyle = "white"