Skip to content

Commit 7e5c22c

Browse files
committed
implement copeland
1 parent a546d35 commit 7e5c22c

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

src/main/scala/copeland.scala

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.expr.mcdm
2+
3+
import org.expr.mcdm.Direction.{Maximize, Minimize}
4+
5+
case class CopelandResult(
6+
ranks: Vec,
7+
)
8+
9+
10+
def level_of_dominance(v1: Array[Int], v2: Array[Int]): Int =
11+
var lod = 0
12+
val n = v1.length
13+
for (i <- 0 until n)
14+
if (v1(i) < v2(i))
15+
lod += 1
16+
17+
lod
18+
19+
20+
def dominance_scores(ordering_mat: Array[Array[Int]]): Array[Array[Int]] =
21+
val n = ordering_mat.length
22+
Array.tabulate(n, n)((i, j) => level_of_dominance(ordering_mat(i), ordering_mat(j)))
23+
24+
25+
def winloss_scores(dommat: Array[Array[Int]]): Array[Array[Int]] =
26+
val n = dommat.length
27+
Array.tabulate(n, n)((i, j) => (dommat(i)(j) - dommat(j)(i)).sign.toInt)
28+
29+
def copeland(rankmatrix: Array[Array[Int]]): CopelandResult =
30+
31+
/*
32+
winlosses = ordering_mat |> dominance_scores |> winloss_scores
33+
n, _ = size(winlosses)
34+
scores = map(i -> Int(sum(winlosses[i, :])), 1:n)
35+
return scores
36+
*/
37+
val winloses = winloss_scores(dominance_scores(rankmatrix))
38+
val scores = Array.tabulate(winloses.length)(i => winloses(i).sum)
39+
val ranks = ranksfromscores(scores.map(_.toDouble))
40+
CopelandResult(ranks)

src/main/scala/matrix.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.expr.mcdm
22

33
import scala.math as math
4+
import scala.collection.AbstractSeq
45

56
object Matrix:
67

src/test/scala/testcopeland.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import munit.Assertions as A
2+
3+
import org.expr.mcdm.copeland
4+
import org.expr.mcdm.Direction.{Maximize, Minimize}
5+
import org.expr.mcdm.Matrix
6+
import org.expr.mcdm.rov
7+
8+
class TestCopeland extends munit.FunSuite {
9+
test("Copeland Example - 1") {
10+
11+
val mopa_rank = Array(1, 4, 2, 3).reverse
12+
val moosra_rank = Array(1, 2, 3, 4).reverse
13+
val copras_rank = Array(1, 3, 2, 4).reverse
14+
val saw_rank = Array(1, 3, 2, 4).reverse
15+
val wpm_rank = Array(1, 3, 2, 4).reverse
16+
val rov_rank = Array(4, 1, 2, 3).reverse
17+
18+
19+
val mat = Array(mopa_rank, moosra_rank, copras_rank, saw_rank, wpm_rank, rov_rank).transpose
20+
21+
val result = copeland(mat)
22+
23+
val expected = Array(4.0, 2, 3, 1)
24+
25+
A.assert(Matrix.elementwise_equal(result.ranks, expected), s"Expected ${expected.mkString(",")} but got ${result.ranks.mkString(",")}")
26+
27+
}
28+
}

0 commit comments

Comments
 (0)