Skip to content

Commit f04d086

Browse files
committed
implement sd method
1 parent 5fb0f0e commit f04d086

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

src/main/scala/sd.scala

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.expr.mcdm
2+
3+
case class SdResult(
4+
cmins: Vec,
5+
cmaxs: Vec,
6+
normalizedMat: Mat,
7+
sds: Vec,
8+
sumsds: Double,
9+
weights: Vec
10+
) extends MCDMResult
11+
12+
def sd(
13+
mat: Mat,
14+
directions: Array[Direction],
15+
normalization: NormalizationFunction =
16+
Normalization.MaxMinRangeNormalization,
17+
options: Map[String, Any] = Map.empty
18+
): SdResult =
19+
20+
val (n, p) = Matrix.size(mat)
21+
22+
val cmins = Matrix.colmins(mat)
23+
24+
val cmaxs = Matrix.colmaxs(mat)
25+
26+
val normalizedMat = normalization(mat, Array.emptyDoubleArray, directions)
27+
28+
val sds = normalizedMat.transpose.map(Statistics.std(_))
29+
30+
val sumsds = sds.sum
31+
32+
val weights = sds.map(_ / sumsds)
33+
34+
SdResult(
35+
cmins,
36+
cmaxs,
37+
normalizedMat,
38+
sds,
39+
sumsds,
40+
weights
41+
)

src/test/scala/testsd.scala

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import munit.Assertions as A
2+
3+
import org.expr.mcdm.Matrix
4+
import org.expr.mcdm.Direction._
5+
import org.expr.mcdm.critic
6+
import org.expr.mcdm.sd
7+
8+
class TestSd extends munit.FunSuite {
9+
10+
test("Sd Example - 1") {
11+
val mat = Array(
12+
Array(391152.0, 251165, 2063102, 912, 18784, 0.009, 0.049, 0.196),
13+
Array(181681.0, 118972, 1310114, 525, 12087, 0.009, 0.042, 0.157),
14+
Array(156478.0, 105801, 993245, 708, 12279, 0.01, 0.041, 0.177),
15+
Array(57145.0, 34707, 339417, 210, 3733, 0.013, 0.055, 0.268),
16+
Array(34947.0, 17568, 340159, 77, 2015, 0.014, 0.043, 0.204),
17+
Array(32667.0, 19308, 201372, 48, 1091, 0.008, 0.029, 0.217),
18+
Array(28945.0, 18033, 117762, 48, 886, 0.007, 0.021, 0.178),
19+
Array(18893.0, 13816, 139431, 35, 943, 0.01, 0.035, 0.213),
20+
Array(18191.0, 9088, 47664, 43, 731, 0.01, 0.021, 0.186),
21+
Array(12852.0, 4185, 64770, 3, 376, 0.011, 0.075, 0.285),
22+
Array(10878.0, 7107, 11200, 1, 78, 0.003, 0.033, 0.198),
23+
Array(4958.0, 1730, 4656, 7, 274, 0.017, 0.053, 0.215),
24+
Array(3901.0, 2318, 15598, 17, 357, 0.023, 0.001, 0.155),
25+
Array(2742.0, 1042, 52632, 1, 106, 0.022, 0.1, 0.384),
26+
Array(1734.0, 771, 1894, 1, 33, 0.011, 0.125, 0.709),
27+
Array(1677.0, 568, 1941, 1, 39, 0.011, 0.129, 0.633)
28+
)
29+
30+
val directions = Array(
31+
Maximize,
32+
Maximize,
33+
Maximize,
34+
Minimize,
35+
Minimize,
36+
Minimize,
37+
Maximize,
38+
Maximize
39+
)
40+
41+
val result = sd(mat, directions)
42+
43+
val expectedWeights =
44+
Array(0.1161, 0.1175, 0.1254, 0.1376, 0.1334, 0.1136, 0.1251, 0.1308)
45+
46+
A.assert(Matrix.elementwise_equal(result.weights, expectedWeights, 1e-03))
47+
}
48+
49+
}

0 commit comments

Comments
 (0)