Skip to content

Commit 3acbb12

Browse files
committed
refactor copeland
1 parent 7e5c22c commit 3acbb12

File tree

2 files changed

+36
-34
lines changed

2 files changed

+36
-34
lines changed

src/main/scala/copeland.scala

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,31 @@ package org.expr.mcdm
33
import org.expr.mcdm.Direction.{Maximize, Minimize}
44

55
case class CopelandResult(
6-
ranks: Vec,
6+
ranks: Vec
77
)
88

9+
def level_of_dominance(v1: Array[Int], v2: Array[Int]): Int =
10+
var lod = 0
11+
val n = v1.length
12+
for (i <- 0 until n)
13+
if (v1(i) < v2(i))
14+
lod += 1
915

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+
lod
1617

17-
lod
18+
def dominance_scores(ordering_mat: Array[Array[Int]]): Array[Array[Int]] =
19+
val n = ordering_mat.length
20+
Array.tabulate(n, n)((i, j) =>
21+
level_of_dominance(ordering_mat(i), ordering_mat(j))
22+
)
1823

24+
def winloss_scores(dommat: Array[Array[Int]]): Array[Array[Int]] =
25+
val n = dommat.length
26+
Array.tabulate(n, n)((i, j) => (dommat(i)(j) - dommat(j)(i)).sign.toInt)
1927

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)))
28+
def copeland(rankmatrix: Array[Array[Int]]): CopelandResult =
2329

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)
30+
val winloses = winloss_scores(dominance_scores(rankmatrix))
31+
val scores = Array.tabulate(winloses.length)(i => winloses(i).sum)
32+
val ranks = ranksfromscores(scores.map(_.toDouble))
33+
CopelandResult(ranks)

src/test/scala/testcopeland.scala

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,31 @@ import org.expr.mcdm.rov
77

88
class TestCopeland extends munit.FunSuite {
99
test("Copeland Example - 1") {
10-
10+
1111
val mopa_rank = Array(1, 4, 2, 3).reverse
1212
val moosra_rank = Array(1, 2, 3, 4).reverse
1313
val copras_rank = Array(1, 3, 2, 4).reverse
1414
val saw_rank = Array(1, 3, 2, 4).reverse
1515
val wpm_rank = Array(1, 3, 2, 4).reverse
1616
val rov_rank = Array(4, 1, 2, 3).reverse
1717

18+
val mat = Array(
19+
mopa_rank,
20+
moosra_rank,
21+
copras_rank,
22+
saw_rank,
23+
wpm_rank,
24+
rov_rank
25+
).transpose
1826

19-
val mat = Array(mopa_rank, moosra_rank, copras_rank, saw_rank, wpm_rank, rov_rank).transpose
20-
21-
val result = copeland(mat)
27+
val result = copeland(mat)
2228

2329
val expected = Array(4.0, 2, 3, 1)
2430

25-
A.assert(Matrix.elementwise_equal(result.ranks, expected), s"Expected ${expected.mkString(",")} but got ${result.ranks.mkString(",")}")
31+
A.assert(
32+
Matrix.elementwise_equal(result.ranks, expected),
33+
s"Expected ${expected.mkString(",")} but got ${result.ranks.mkString(",")}"
34+
)
2635

2736
}
28-
}
37+
}

0 commit comments

Comments
 (0)