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 Differential Sigmoidal Membership Function.
29   *
30   * @since 0.1
31   * @see DifferentialSigmoidalMembershipFunction
32   */
33  public class TestDifferentialSigmoidalMembershipFunction extends BaseMembershipFunctionTest<Function<?, ?>> {
34  
35  	protected DifferentialSigmoidalMembershipFunction mf;
36  
37  	private final double a1 = 5.0;
38  	private final double c1 = 2.0;
39  	private final double a2 = 5.0;
40  	private final double c2 = 7.0;
41  
42  	private final double[][] expected = new double[101][2];
43  
44  	@Override
45  	protected DifferentialSigmoidalMembershipFunction makeMembershipFunction() {
46  		return new DifferentialSigmoidalMembershipFunction(a1, c1, a2, c2);
47  	}
48  
49  	/**
50  	 * @throws java.lang.Exception
51  	 */
52  	@Before
53  	public void setUp() throws Exception {
54  		mf = makeMembershipFunction();
55  
56  		/*
57  		 * Results from Matlab dsigmf.
58  		 *
59  		 * x=0:0.1:10;
60  		 * y=dsigmf(x, [5 2 5 7]);
61  		 */
62  		expected[0] = new double[]{0.0000, 0.0000};
63  		expected[1] = new double[]{0.1000, 0.0001};
64  		expected[2] = new double[]{0.2000, 0.0001};
65  		expected[3] = new double[]{0.3000, 0.0002};
66  		expected[4] = new double[]{0.4000, 0.0003};
67  		expected[5] = new double[]{0.5000, 0.0006};
68  		expected[6] = new double[]{0.6000, 0.0009};
69  		expected[7] = new double[]{0.7000, 0.0015};
70  		expected[8] = new double[]{0.8000, 0.0025};
71  		expected[9] = new double[]{0.9000, 0.0041};
72  		expected[10] = new double[]{1.0000, 0.0067};
73  		expected[11] = new double[]{1.1000, 0.0110};
74  		expected[12] = new double[]{1.2000, 0.0180};
75  		expected[13] = new double[]{1.3000, 0.0293};
76  		expected[14] = new double[]{1.4000, 0.0474};
77  		expected[15] = new double[]{1.5000, 0.0759};
78  		expected[16] = new double[]{1.6000, 0.1192};
79  		expected[17] = new double[]{1.7000, 0.1824};
80  		expected[18] = new double[]{1.8000, 0.2689};
81  		expected[19] = new double[]{1.9000, 0.3775};
82  		expected[20] = new double[]{2.0000, 0.5000};
83  		expected[21] = new double[]{2.1000, 0.6225};
84  		expected[22] = new double[]{2.2000, 0.7311};
85  		expected[23] = new double[]{2.3000, 0.8176};
86  		expected[24] = new double[]{2.4000, 0.8808};
87  		expected[25] = new double[]{2.5000, 0.9241};
88  		expected[26] = new double[]{2.6000, 0.9526};
89  		expected[27] = new double[]{2.7000, 0.9707};
90  		expected[28] = new double[]{2.8000, 0.9820};
91  		expected[29] = new double[]{2.9000, 0.9890};
92  		expected[30] = new double[]{3.0000, 0.9933};
93  		expected[31] = new double[]{3.1000, 0.9959};
94  		expected[32] = new double[]{3.2000, 0.9975};
95  		expected[33] = new double[]{3.3000, 0.9985};
96  		expected[34] = new double[]{3.4000, 0.9991};
97  		expected[35] = new double[]{3.5000, 0.9994};
98  		expected[36] = new double[]{3.6000, 0.9997};
99  		expected[37] = new double[]{3.7000, 0.9998};
100 		expected[38] = new double[]{3.8000, 0.9999};
101 		expected[39] = new double[]{3.9000, 0.9999};
102 		expected[40] = new double[]{4.0000, 1.0000};
103 		expected[41] = new double[]{4.1000, 1.0000};
104 		expected[42] = new double[]{4.2000, 1.0000};
105 		expected[43] = new double[]{4.3000, 1.0000};
106 		expected[44] = new double[]{4.4000, 1.0000};
107 		expected[45] = new double[]{4.5000, 1.0000};
108 		expected[46] = new double[]{4.6000, 1.0000};
109 		expected[47] = new double[]{4.7000, 1.0000};
110 		expected[48] = new double[]{4.8000, 1.0000};
111 		expected[49] = new double[]{4.9000, 1.0000};
112 		expected[50] = new double[]{5.0000, 1.0000};
113 		expected[51] = new double[]{5.1000, 0.9999};
114 		expected[52] = new double[]{5.2000, 0.9999};
115 		expected[53] = new double[]{5.3000, 0.9998};
116 		expected[54] = new double[]{5.4000, 0.9997};
117 		expected[55] = new double[]{5.5000, 0.9994};
118 		expected[56] = new double[]{5.6000, 0.9991};
119 		expected[57] = new double[]{5.7000, 0.9985};
120 		expected[58] = new double[]{5.8000, 0.9975};
121 		expected[59] = new double[]{5.9000, 0.9959};
122 		expected[60] = new double[]{6.0000, 0.9933};
123 		expected[61] = new double[]{6.1000, 0.9890};
124 		expected[62] = new double[]{6.2000, 0.9820};
125 		expected[63] = new double[]{6.3000, 0.9707};
126 		expected[64] = new double[]{6.4000, 0.9526};
127 		expected[65] = new double[]{6.5000, 0.9241};
128 		expected[66] = new double[]{6.6000, 0.8808};
129 		expected[67] = new double[]{6.7000, 0.8176};
130 		expected[68] = new double[]{6.8000, 0.7311};
131 		expected[69] = new double[]{6.9000, 0.6225};
132 		expected[70] = new double[]{7.0000, 0.5000};
133 		expected[71] = new double[]{7.1000, 0.3775};
134 		expected[72] = new double[]{7.2000, 0.2689};
135 		expected[73] = new double[]{7.3000, 0.1824};
136 		expected[74] = new double[]{7.4000, 0.1192};
137 		expected[75] = new double[]{7.5000, 0.0759};
138 		expected[76] = new double[]{7.6000, 0.0474};
139 		expected[77] = new double[]{7.7000, 0.0293};
140 		expected[78] = new double[]{7.8000, 0.0180};
141 		expected[79] = new double[]{7.9000, 0.0110};
142 		expected[80] = new double[]{8.0000, 0.0067};
143 		expected[81] = new double[]{8.1000, 0.0041};
144 		expected[82] = new double[]{8.2000, 0.0025};
145 		expected[83] = new double[]{8.3000, 0.0015};
146 		expected[84] = new double[]{8.4000, 0.0009};
147 		expected[85] = new double[]{8.5000, 0.0006};
148 		expected[86] = new double[]{8.6000, 0.0003};
149 		expected[87] = new double[]{8.7000, 0.0002};
150 		expected[88] = new double[]{8.8000, 0.0001};
151 		expected[89] = new double[]{8.9000, 0.0001};
152 		expected[90] = new double[]{9.0000, 0.0000};
153 		expected[91] = new double[]{9.1000, 0.0000};
154 		expected[92] = new double[]{9.2000, 0.0000};
155 		expected[93] = new double[]{9.3000, 0.0000};
156 		expected[94] = new double[]{9.4000, 0.0000};
157 		expected[95] = new double[]{9.5000, 0.0000};
158 		expected[96] = new double[]{9.6000, 0.0000};
159 		expected[97] = new double[]{9.7000, 0.0000};
160 		expected[98] = new double[]{9.8000, 0.0000};
161 		expected[99] = new double[]{9.9000, 0.0000};
162 		expected[100] = new double[]{10.0000, 0.0000};
163 	}
164 
165 	/**
166 	 * @throws java.lang.Exception
167 	 */
168 	@After
169 	public void tearDown() throws Exception {
170 		mf = null;
171 	}
172 
173 	/**
174 	 * Test method for {@link fuzzy.mf.DifferentialSigmoidalMembershipFunction#evaluate(java.lang.Double)}.
175 	 */
176 	@Test
177 	public void testEvaluate() {
178 		final NumberFormat nf = NumberFormat.getInstance(Locale.US);
179 		nf.setMaximumFractionDigits(4);
180 		nf.setRoundingMode(RoundingMode.HALF_UP);
181 		int i = 0;
182 		for(double x = 0.0 ; x <= 10.0 ; x+=0.1) {
183 			double y = Double.parseDouble(nf.format(mf.apply(x)));
184 			assertEquals(Double.valueOf(expected[i][1]), Double.valueOf(y));
185 			i++;
186 		}
187 	}
188 
189 }