1   /*
2    * Licensed under the Apache License, Version 2.0 (the "License");
3    * you may not use this file except in compliance with the License.
4    * You may obtain a copy of the License at
5    *
6    *     http://www.apache.org/licenses/LICENSE-2.0
7    *
8    * Unless required by applicable law or agreed to in writing, software
9    * distributed under the License is distributed on an
10   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11   * either express or implied. See the License for the specific language
12   * governing permissions and limitations under the License.
13   */
14  package fuzzy.mf;
15  
16  import static org.junit.Assert.assertEquals;
17  
18  import java.math.RoundingMode;
19  import java.text.NumberFormat;
20  import java.util.Locale;
21  import java.util.function.Function;
22  
23  import org.junit.After;
24  import org.junit.Before;
25  import org.junit.Test;
26  
27  /**
28   * Tests for Gaussian Membership Function.
29   *
30   * @since 0.1
31   * @see GaussianMembershipFunction
32   */
33  public class TestGaussianMembershipFunction extends BaseMembershipFunctionTest<Function<?, ?>> {
34  
35  	protected GaussianMembershipFunction mf;
36  
37  	private final double sigma = 2.0;
38  	private final double c = 5.0;
39  
40  	private final double[][] expected = new double[101][2];
41  
42  	@Override
43  	protected GaussianMembershipFunction makeMembershipFunction() {
44  		return new GaussianMembershipFunction(sigma, c);
45  	}
46  
47  	/**
48  	 * @throws java.lang.Exception
49  	 */
50  	@Before
51  	public void setUp() throws Exception {
52  		mf = makeMembershipFunction();
53  
54  		/*
55  		 * Results from Matlab gaussmf.
56  		 *
57  		 * x=0:0.1:10; y=gaussmf(x,[2 5]);
58  		 */
59  		expected[0] = new double[] { 0.0000, 0.0439 };
60  		expected[1] = new double[] { 0.1000, 0.0497 };
61  		expected[2] = new double[] { 0.2000, 0.0561 };
62  		expected[3] = new double[] { 0.3000, 0.0632 };
63  		expected[4] = new double[] { 0.4000, 0.0710 };
64  		expected[5] = new double[] { 0.5000, 0.0796 };
65  		expected[6] = new double[] { 0.6000, 0.0889 };
66  		expected[7] = new double[] { 0.7000, 0.0991 };
67  		expected[8] = new double[] { 0.8000, 0.1103 };
68  		expected[9] = new double[] { 0.9000, 0.1223 };
69  		expected[10] = new double[] { 1.0000, 0.1353 };
70  		expected[11] = new double[] { 1.1000, 0.1494 };
71  		expected[12] = new double[] { 1.2000, 0.1645 };
72  		expected[13] = new double[] { 1.3000, 0.1806 };
73  		expected[14] = new double[] { 1.4000, 0.1979 };
74  		expected[15] = new double[] { 1.5000, 0.2163 };
75  		expected[16] = new double[] { 1.6000, 0.2357 };
76  		expected[17] = new double[] { 1.7000, 0.2563 };
77  		expected[18] = new double[] { 1.8000, 0.2780 };
78  		expected[19] = new double[] { 1.9000, 0.3008 };
79  		expected[20] = new double[] { 2.0000, 0.3247 };
80  		expected[21] = new double[] { 2.1000, 0.3495 };
81  		expected[22] = new double[] { 2.2000, 0.3753 };
82  		expected[23] = new double[] { 2.3000, 0.4020 };
83  		expected[24] = new double[] { 2.4000, 0.4296 };
84  		expected[25] = new double[] { 2.5000, 0.4578 };
85  		expected[26] = new double[] { 2.6000, 0.4868 };
86  		expected[27] = new double[] { 2.7000, 0.5162 };
87  		expected[28] = new double[] { 2.8000, 0.5461 };
88  		expected[29] = new double[] { 2.9000, 0.5762 };
89  		expected[30] = new double[] { 3.0000, 0.6065 };
90  		expected[31] = new double[] { 3.1000, 0.6368 };
91  		expected[32] = new double[] { 3.2000, 0.6670 };
92  		expected[33] = new double[] { 3.3000, 0.6968 };
93  		expected[34] = new double[] { 3.4000, 0.7261 };
94  		expected[35] = new double[] { 3.5000, 0.7548 };
95  		expected[36] = new double[] { 3.6000, 0.7827 };
96  		expected[37] = new double[] { 3.7000, 0.8096 };
97  		expected[38] = new double[] { 3.8000, 0.8353 };
98  		expected[39] = new double[] { 3.9000, 0.8596 };
99  		expected[40] = new double[] { 4.0000, 0.8825 };
100 		expected[41] = new double[] { 4.1000, 0.9037 };
101 		expected[42] = new double[] { 4.2000, 0.9231 };
102 		expected[43] = new double[] { 4.3000, 0.9406 };
103 		expected[44] = new double[] { 4.4000, 0.9560 };
104 		expected[45] = new double[] { 4.5000, 0.9692 };
105 		expected[46] = new double[] { 4.6000, 0.9802 };
106 		expected[47] = new double[] { 4.7000, 0.9888 };
107 		expected[48] = new double[] { 4.8000, 0.9950 };
108 		expected[49] = new double[] { 4.9000, 0.9988 };
109 		expected[50] = new double[] { 5.0000, 1.0000 };
110 		expected[51] = new double[] { 5.1000, 0.9988 };
111 		expected[52] = new double[] { 5.2000, 0.9950 };
112 		expected[53] = new double[] { 5.3000, 0.9888 };
113 		expected[54] = new double[] { 5.4000, 0.9802 };
114 		expected[55] = new double[] { 5.5000, 0.9692 };
115 		expected[56] = new double[] { 5.6000, 0.9560 };
116 		expected[57] = new double[] { 5.7000, 0.9406 };
117 		expected[58] = new double[] { 5.8000, 0.9231 };
118 		expected[59] = new double[] { 5.9000, 0.9037 };
119 		expected[60] = new double[] { 6.0000, 0.8825 };
120 		expected[61] = new double[] { 6.1000, 0.8596 };
121 		expected[62] = new double[] { 6.2000, 0.8353 };
122 		expected[63] = new double[] { 6.3000, 0.8096 };
123 		expected[64] = new double[] { 6.4000, 0.7827 };
124 		expected[65] = new double[] { 6.5000, 0.7548 };
125 		expected[66] = new double[] { 6.6000, 0.7261 };
126 		expected[67] = new double[] { 6.7000, 0.6968 };
127 		expected[68] = new double[] { 6.8000, 0.6670 };
128 		expected[69] = new double[] { 6.9000, 0.6368 };
129 		expected[70] = new double[] { 7.0000, 0.6065 };
130 		expected[71] = new double[] { 7.1000, 0.5762 };
131 		expected[72] = new double[] { 7.2000, 0.5461 };
132 		expected[73] = new double[] { 7.3000, 0.5162 };
133 		expected[74] = new double[] { 7.4000, 0.4868 };
134 		expected[75] = new double[] { 7.5000, 0.4578 };
135 		expected[76] = new double[] { 7.6000, 0.4296 };
136 		expected[77] = new double[] { 7.7000, 0.4020 };
137 		expected[78] = new double[] { 7.8000, 0.3753 };
138 		expected[79] = new double[] { 7.9000, 0.3495 };
139 		expected[80] = new double[] { 8.0000, 0.3247 };
140 		expected[81] = new double[] { 8.1000, 0.3008 };
141 		expected[82] = new double[] { 8.2000, 0.2780 };
142 		expected[83] = new double[] { 8.3000, 0.2563 };
143 		expected[84] = new double[] { 8.4000, 0.2357 };
144 		expected[85] = new double[] { 8.5000, 0.2163 };
145 		expected[86] = new double[] { 8.6000, 0.1979 };
146 		expected[87] = new double[] { 8.7000, 0.1806 };
147 		expected[88] = new double[] { 8.8000, 0.1645 };
148 		expected[89] = new double[] { 8.9000, 0.1494 };
149 		expected[90] = new double[] { 9.0000, 0.1353 };
150 		expected[91] = new double[] { 9.1000, 0.1223 };
151 		expected[92] = new double[] { 9.2000, 0.1103 };
152 		expected[93] = new double[] { 9.3000, 0.0991 };
153 		expected[94] = new double[] { 9.4000, 0.0889 };
154 		expected[95] = new double[] { 9.5000, 0.0796 };
155 		expected[96] = new double[] { 9.6000, 0.0710 };
156 		expected[97] = new double[] { 9.7000, 0.0632 };
157 		expected[98] = new double[] { 9.8000, 0.0561 };
158 		expected[99] = new double[] { 9.9000, 0.0497 };
159 		expected[100] = new double[] { 10.0000, 0.0439 };
160 	}
161 
162 	/**
163 	 * @throws java.lang.Exception
164 	 */
165 	@After
166 	public void tearDown() throws Exception {
167 		mf = null;
168 	}
169 
170 	/**
171 	 * Test method for
172 	 * {@link fuzzy.mf.GaussianMembershipFunction#evaluate(java.lang.Double)}.
173 	 */
174 	@Test
175 	public void testEvaluate() {
176 		final NumberFormat nf = NumberFormat.getInstance(Locale.US);
177 		nf.setMaximumFractionDigits(4);
178 		nf.setRoundingMode(RoundingMode.HALF_UP);
179 		int i = 0;
180 		for (double x = 0.0; x <= 10.0; x += 0.1) {
181 			double y = Double.parseDouble(nf.format(mf.apply(x)));
182 			assertEquals(Double.valueOf(expected[i][1]), Double.valueOf(y));
183 			i++;
184 		}
185 	}
186 
187 }