Skip to content

Commit f6cdcb6

Browse files
committed
implement Mairca
1 parent 8b787b6 commit f6cdcb6

File tree

4 files changed

+101
-0
lines changed

4 files changed

+101
-0
lines changed

src/main/scala/mairca.scala

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.expr.mcdm
2+
3+
4+
5+
case class MaircaResult(
6+
T: Mat,
7+
A: Mat,
8+
S: Mat,
9+
scores: Vec,
10+
orderings: VecInt,
11+
bestIndex: Int,
12+
) extends MCDMResult
13+
14+
def mairca(
15+
decmat: Mat,
16+
weights: Vec,
17+
directions: Array[Direction],
18+
normalization: NormalizationFunction =
19+
Normalization.MaxMinRangeNormalization,
20+
options: Map[String, Any] = Map.empty
21+
): MaircaResult =
22+
23+
val (row, col) = Matrix.size(decmat)
24+
25+
var T = Matrix.zeros(row, col)
26+
27+
for (i <- 0 until col) {
28+
for (j <- 0 until row) {
29+
T(j)(i) = weights(i) * (1.0 / row)
30+
}
31+
}
32+
33+
val A = Matrix.elementwiseMultiply(normalization(decmat, weights, directions), T)
34+
35+
val S = Matrix.subtract(T, A)
36+
37+
val scores = S.map(row => row.sum)
38+
39+
val orderings = scores.zipWithIndex.sortBy(-_._1).map(_._2)
40+
41+
val bestIndex = orderings.last
42+
43+
MaircaResult(
44+
T = T,
45+
A = A,
46+
S = S,
47+
scores = scores,
48+
orderings = orderings,
49+
bestIndex = bestIndex,
50+
)

src/main/scala/matrix.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,9 @@ object Matrix:
153153

154154
def solve(A: Mat, b: Vec): Vec = mul(inverse(A), b)
155155

156+
def elementwiseMultiply(a: Mat, b: Mat): Mat =
157+
a.zip(b).map((rowa, rowb) => rowa.zip(rowb).map((x, y) => x * y))
158+
159+
160+
156161

src/test/scala/testmairca.scala

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import munit.Assertions as A
2+
3+
import org.expr.mcdm.mairca
4+
import org.expr.mcdm.Direction.{Maximize, Minimize}
5+
import org.expr.mcdm.Matrix
6+
7+
class TestMairca extends munit.FunSuite {
8+
test("Mairca Example - 1") {
9+
10+
val decmat = Array(
11+
Array(6.952, 8.000, 6.649, 7.268, 8.000, 7.652, 6.316),
12+
Array(7.319, 7.319, 6.604, 7.319, 8.000, 7.652, 5.313),
13+
Array(7.000, 7.319, 7.652, 6.952, 7.652, 6.952, 4.642),
14+
Array(7.319, 6.952, 6.649, 7.319, 7.652, 6.649, 5.000))
15+
16+
val weights = Array(0.172, 0.165, 0.159, 0.129, 0.112, 0.122, 0.140)
17+
18+
val fns = Array(Maximize, Maximize, Maximize, Maximize, Maximize, Maximize, Minimize)
19+
20+
val expected_scores = Array(0.1206454, 0.0806646, 0.1458627, 0.1454237)
21+
22+
val result = mairca(decmat, weights, fns)
23+
24+
A.assert(Matrix.elementwise_equal(result.scores, expected_scores, 0.001))
25+
26+
}
27+
}

src/test/scala/testmatrix.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,25 @@ class TestMatrix extends munit.FunSuite {
414414

415415
A.assert(Matrix.elementwise_equal(result, expected, 1e-5))
416416
}
417+
test("Elementwise matrix multiplication"){
418+
val Amat = Array(
419+
Array(1.0, 2.0, 3.0),
420+
Array(4.0, -5.0, 6.0),
421+
Array(7.0, 8.0, 9.0)
422+
)
423+
val Bmat = Array(
424+
Array(1.0, 2.0, 3.0),
425+
Array(4.0, -5.0, 6.0),
426+
Array(7.0, 8.0, 9.0)
427+
)
428+
val result = Matrix.elementwiseMultiply(Amat, Bmat)
429+
val expected = Array(
430+
Array(1.0, 4.0, 9.0),
431+
Array(16.0, 25.0, 36.0),
432+
Array(49.0, 64.0, 81.0)
433+
)
434+
A.assert(Matrix.elementwise_equal(result, expected, 1e-03))
435+
}
417436
test("Equation solve 1"){
418437
val Amat = Array(Array(2.0, 4.0), Array(6.0, 5.0))
419438
val bvec = Array(12.0, 60.0)

0 commit comments

Comments
 (0)