num4normality 0.0.4-java → 0.0.6-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/num4normality/Normality.java +218 -149
- data/lib/num4normality.rb +3 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9803b3bcb0408424c204ebda20e538aa178a2f35573e280dd222add412987cff
|
4
|
+
data.tar.gz: 1258e8ad4f82177478d2f35d689f56b4d8d58d1177f7a6f45896f05ee6c50189
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16ad0542c142e6b74871df83ae43fa4ac62a9bd977e3bd466b9a520f849f0852460a1b71051b072c5de14b93a4b7530e2ef1821300b7b02303cfd1b307f0a43c
|
7
|
+
data.tar.gz: c49ca950c085da6760c1d0b171b7daad90354c7804e6521711e7469373a47aca58bec5d7fad47fb5d6c1a882c754ff389bdcae8e957fa93467cdc9db500ffa8a
|
@@ -4,6 +4,7 @@ import org.jfree.chart.ChartFactory;
|
|
4
4
|
import org.jfree.data.xy.XYSeriesCollection;
|
5
5
|
import org.jfree.data.xy.XYSeries;
|
6
6
|
|
7
|
+
import org.jfree.chart.plot.CombinedDomainXYPlot;
|
7
8
|
import org.jfree.chart.plot.XYPlot;
|
8
9
|
import org.jfree.chart.axis.NumberAxis;
|
9
10
|
import org.jfree.chart.axis.ValueAxis;
|
@@ -29,18 +30,24 @@ import java.text.DecimalFormat;
|
|
29
30
|
import org.apache.commons.math3.stat.inference.TestUtils;
|
30
31
|
public class Normality {
|
31
32
|
public static void qqplot(String dname, double[] xi) {
|
32
|
-
ChartPlot plot = new
|
33
|
-
JFreeChart chart = plot.createChart(dname, xi);
|
33
|
+
ChartPlot plot = new QQChartPlot();
|
34
|
+
JFreeChart chart = plot.createChart("正規Q-Qプロット", dname, xi);
|
34
35
|
|
35
36
|
plot.writeJPEG("qqplot.jpeg", chart, 800, 500);
|
36
37
|
}
|
37
38
|
public static void ksplot(String dname, double[] xi) {
|
38
|
-
ChartPlot plot = new
|
39
|
-
JFreeChart chart = plot.createChart(dname, xi);
|
39
|
+
ChartPlot plot = new KSChartPlot();
|
40
|
+
JFreeChart chart = plot.createChart("コルモゴルフ・スミルノフ検定", dname, xi);
|
40
41
|
|
41
42
|
plot.writeJPEG("ksplot.jpeg", chart, 800, 500);
|
42
43
|
|
43
44
|
}
|
45
|
+
public static void qqksplot(String dname, double[] xi) {
|
46
|
+
ChartPlot plot = new QQKSChartPlot();
|
47
|
+
JFreeChart chart = plot.createChart("Q-Q and コルモゴルフ・スミルノフ検定", dname, xi);
|
48
|
+
|
49
|
+
plot.writeJPEG("qqksplot.jpeg", chart, 1000, 800);
|
50
|
+
}
|
44
51
|
public static boolean kstest(double[] xi) {
|
45
52
|
KSTest ks = new KSTest();
|
46
53
|
|
@@ -65,13 +72,15 @@ public class Normality {
|
|
65
72
|
return daigo.test(x, 0.05);
|
66
73
|
}
|
67
74
|
|
68
|
-
|
75
|
+
/*********************************/
|
76
|
+
/* interface define */
|
77
|
+
/*********************************/
|
69
78
|
private interface ChartPlot {
|
70
79
|
/* フィールド */
|
71
80
|
static final double CLASS_MIN = -4.0;
|
72
81
|
static final double CLASS_MAX = 4.0;
|
73
82
|
/* メゾット */
|
74
|
-
JFreeChart createChart(String dname, double[] xi);
|
83
|
+
JFreeChart createChart(String title, String dname, double[] xi);
|
75
84
|
default void writeJPEG(String fname, JFreeChart chart, int width, int height) {
|
76
85
|
File file = new File(fname);
|
77
86
|
try {
|
@@ -81,43 +90,22 @@ public class Normality {
|
|
81
90
|
}
|
82
91
|
}
|
83
92
|
}
|
93
|
+
private interface CreatePlot {
|
94
|
+
XYPlot createPlot(String dname, double[] xi);
|
95
|
+
}
|
84
96
|
private interface DAgostinosTest {
|
85
97
|
double calcTestStatistic(double[] xi);
|
86
98
|
boolean test(double statistic, double a);
|
87
99
|
}
|
88
|
-
|
100
|
+
/*********************************/
|
101
|
+
/* Class define */
|
102
|
+
/*********************************/
|
89
103
|
// Q-Qplot
|
90
|
-
private static class
|
91
|
-
|
92
|
-
|
93
|
-
public QQPlot() {
|
94
|
-
stat = new DescriptiveStatistics();
|
95
|
-
ndist = new NormalDistribution(0, 1);
|
96
|
-
}
|
97
|
-
private double[][] createData(double[] xi) {
|
98
|
-
int n = xi.length;
|
99
|
-
Arrays.sort(xi);
|
100
|
-
Arrays.stream(xi).forEach(stat::addValue);
|
101
|
-
double sum = stat.getSum();
|
102
|
-
double[][] data = new double[n][2];
|
103
|
-
double p = 0.0;
|
104
|
-
|
105
|
-
for (int i = 0; i < n; i++) {
|
106
|
-
p += xi[i] / sum;
|
107
|
-
double x =
|
108
|
-
ndist.inverseCumulativeProbability(p * (i + 1.0) / (n + 1.0));
|
109
|
-
|
110
|
-
data[i][0] = x;
|
111
|
-
data[i][1] = xi[i];
|
112
|
-
}
|
113
|
-
return data;
|
114
|
-
}
|
115
|
-
public JFreeChart createChart(String dname, double[] xi) {
|
116
|
-
double[][] data = createData(xi);
|
117
|
-
|
118
|
-
XYPlot plot = createPlot(dname, data);
|
104
|
+
private static class QQChartPlot implements ChartPlot {
|
105
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
106
|
+
XYPlot plot = createPlot(dname, xi);
|
119
107
|
/*--- 横軸 ---*/
|
120
|
-
NumberAxis domainAxis = new NumberAxis("
|
108
|
+
NumberAxis domainAxis = new NumberAxis("期待値");
|
121
109
|
|
122
110
|
plot.setDomainAxis(domainAxis);
|
123
111
|
domainAxis.setLowerMargin(0.03);
|
@@ -126,150 +114,231 @@ public class Normality {
|
|
126
114
|
domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
|
127
115
|
|
128
116
|
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
129
|
-
return new JFreeChart(
|
117
|
+
return new JFreeChart(title, plot);
|
130
118
|
}
|
131
|
-
private XYPlot createPlot(String dname, double[]
|
132
|
-
|
133
|
-
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
134
|
-
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
135
|
-
|
136
|
-
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
137
|
-
renderer0.setURLGenerator(null);
|
138
|
-
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
139
|
-
renderer1.setURLGenerator(null);
|
140
|
-
|
141
|
-
XYPlot plot = new XYPlot();
|
142
|
-
plot.setOrientation(PlotOrientation.VERTICAL);
|
143
|
-
plot.mapDatasetToRangeAxis(0,0);
|
144
|
-
plot.mapDatasetToRangeAxis(1,0);
|
145
|
-
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
146
|
-
|
147
|
-
/*--- 縦軸 ---*/
|
148
|
-
NumberAxis valueAxis0 = new NumberAxis("観測値");
|
149
|
-
plot.setRangeAxis(valueAxis0);
|
150
|
-
|
151
|
-
plot.setRenderer(0, renderer0);
|
152
|
-
plot.setDataset(0, createDataset0(dname, data));
|
153
|
-
|
154
|
-
plot.setRenderer(1, renderer1);
|
155
|
-
plot.setDataset(1, createDataset1(data));
|
119
|
+
private XYPlot createPlot(String dname, double[] xi) {
|
120
|
+
CreatePlot plotImpl = new QQPlot();
|
156
121
|
|
157
|
-
return
|
122
|
+
return plotImpl.createPlot(dname, xi);
|
158
123
|
}
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
124
|
+
public static class QQPlot implements CreatePlot {
|
125
|
+
private DescriptiveStatistics stat = null;
|
126
|
+
private NormalDistribution ndist = null;
|
127
|
+
public QQPlot() {
|
128
|
+
stat = new DescriptiveStatistics();
|
129
|
+
ndist = new NormalDistribution(0, 1);
|
164
130
|
}
|
165
|
-
|
131
|
+
private double[][] createData(double[] xi) {
|
132
|
+
int n = xi.length;
|
133
|
+
Arrays.sort(xi);
|
134
|
+
Arrays.stream(xi).forEach(stat::addValue);
|
135
|
+
double sum = stat.getSum();
|
136
|
+
double[][] data = new double[n][2];
|
137
|
+
double p = 0.0;
|
138
|
+
|
139
|
+
for (int i = 0; i < n; i++) {
|
140
|
+
p += xi[i] / sum;
|
141
|
+
double x =
|
142
|
+
ndist.inverseCumulativeProbability(p * (i + 1.0) / (n + 1.0));
|
143
|
+
|
144
|
+
data[i][0] = x;
|
145
|
+
data[i][1] = xi[i];
|
146
|
+
}
|
147
|
+
return data;
|
148
|
+
}
|
149
|
+
public XYPlot createPlot(String dname, double[] xi) {
|
150
|
+
double[][] data = createData(xi);
|
151
|
+
XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
|
152
|
+
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
153
|
+
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
154
|
+
|
155
|
+
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
156
|
+
renderer0.setURLGenerator(null);
|
157
|
+
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
158
|
+
renderer1.setURLGenerator(null);
|
159
|
+
|
160
|
+
XYPlot plot = new XYPlot();
|
161
|
+
plot.setOrientation(PlotOrientation.VERTICAL);
|
162
|
+
plot.mapDatasetToRangeAxis(0,0);
|
163
|
+
plot.mapDatasetToRangeAxis(1,0);
|
164
|
+
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
165
|
+
|
166
|
+
/*--- 縦軸 ---*/
|
167
|
+
NumberAxis valueAxis0 = new NumberAxis("観測値");
|
168
|
+
plot.setRangeAxis(valueAxis0);
|
169
|
+
|
170
|
+
plot.setRenderer(0, renderer0);
|
171
|
+
plot.setDataset(0, createDataset0(dname, data));
|
172
|
+
|
173
|
+
plot.setRenderer(1, renderer1);
|
174
|
+
plot.setDataset(1, createDataset1(data));
|
175
|
+
|
176
|
+
return plot;
|
177
|
+
}
|
178
|
+
private XYSeriesCollection createDataset0(String dname, double[][] data) {
|
179
|
+
XYSeries cu = new XYSeries(dname);
|
180
|
+
|
181
|
+
for (int i = 0; i < data.length; i++) {
|
182
|
+
cu.add(data[i][0], data[i][1]);
|
183
|
+
}
|
184
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
166
185
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
186
|
+
series.addSeries(cu);
|
187
|
+
return series;
|
188
|
+
}
|
189
|
+
private XYSeriesCollection createDataset1(double[][] data) {
|
190
|
+
SimpleRegression simpleReg = new SimpleRegression(true);
|
191
|
+
XYSeries cu = new XYSeries("累積");
|
173
192
|
|
174
|
-
|
175
|
-
|
176
|
-
|
193
|
+
simpleReg.addData(data);
|
194
|
+
double a = simpleReg.getSlope();
|
195
|
+
double b = simpleReg.getIntercept();
|
177
196
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
197
|
+
for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
|
198
|
+
double y = a * x + b;
|
199
|
+
|
200
|
+
cu.add(x, y);
|
201
|
+
}
|
202
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
203
|
+
series.addSeries(cu);
|
204
|
+
return series;
|
182
205
|
}
|
183
|
-
XYSeriesCollection series = new XYSeriesCollection();
|
184
|
-
series.addSeries(cu);
|
185
|
-
return series;
|
186
206
|
}
|
187
207
|
}
|
188
208
|
// コルモゴルフ・スミルノフ検定
|
189
|
-
private static class
|
190
|
-
public JFreeChart createChart(String dname, double[] xi) {
|
191
|
-
|
209
|
+
private static class KSChartPlot implements ChartPlot {
|
210
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
211
|
+
/*--- 横軸 ---*/
|
212
|
+
NumberAxis domainAxis = new NumberAxis("期待値");
|
192
213
|
XYPlot plot = createPlot(dname, xi);
|
193
214
|
|
194
|
-
/*--- 横軸 ---*/
|
195
215
|
plot.setDomainAxis(domainAxis);
|
196
216
|
domainAxis.setLowerMargin(0.03);
|
197
217
|
domainAxis.setUpperMargin(0.03);
|
198
|
-
domainAxis.setLowerBound(
|
199
|
-
domainAxis.setUpperBound(
|
218
|
+
domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
|
219
|
+
domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
|
200
220
|
|
201
221
|
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
202
|
-
return new JFreeChart(
|
222
|
+
return new JFreeChart(title, plot);
|
203
223
|
}
|
204
224
|
private XYPlot createPlot(String dname, double[] xi) {
|
205
|
-
|
206
|
-
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
207
|
-
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
208
|
-
|
209
|
-
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
210
|
-
renderer0.setURLGenerator(null);
|
211
|
-
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
212
|
-
renderer1.setURLGenerator(null);
|
213
|
-
|
214
|
-
XYPlot plot = new XYPlot();
|
215
|
-
plot.setOrientation(PlotOrientation.VERTICAL);
|
216
|
-
plot.mapDatasetToRangeAxis(0,0);
|
217
|
-
plot.mapDatasetToRangeAxis(1,0);
|
218
|
-
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
219
|
-
|
220
|
-
/*--- 縦軸 ---*/
|
221
|
-
NumberAxis valueAxis0 = new NumberAxis("確率");
|
222
|
-
plot.setRangeAxis(valueAxis0);
|
223
|
-
valueAxis0.setLowerBound(0);
|
224
|
-
valueAxis0.setUpperBound(1);
|
225
|
-
valueAxis0.setTickUnit(new NumberTickUnit(0.1));
|
226
|
-
valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
227
|
-
|
228
|
-
plot.setRenderer(0, renderer0);
|
229
|
-
plot.setDataset(0, createDataset0(dname, xi));
|
230
|
-
|
231
|
-
plot.setRenderer(1, renderer1);
|
232
|
-
plot.setDataset(1, createDataset1());
|
225
|
+
CreatePlot plotImpl = new KSPlot();
|
233
226
|
|
234
|
-
return
|
227
|
+
return plotImpl.createPlot(dname, xi);
|
235
228
|
}
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
double
|
242
|
-
|
243
|
-
|
244
|
-
|
229
|
+
public static class KSPlot implements CreatePlot {
|
230
|
+
private DescriptiveStatistics stat = null;
|
231
|
+
public KSPlot() {
|
232
|
+
stat = new DescriptiveStatistics();
|
233
|
+
}
|
234
|
+
private double[][] createData(double[] xi) {
|
235
|
+
int n = xi.length;
|
236
|
+
Arrays.sort(xi);
|
237
|
+
Arrays.stream(xi).forEach(stat::addValue);
|
238
|
+
double m = stat.getMean(); // 平均
|
239
|
+
double sd = stat.getStandardDeviation();// 標準偏差
|
240
|
+
double sum = stat.getSum();
|
241
|
+
double[][] data = new double[n][2];
|
242
|
+
double p = 0.0;
|
243
|
+
|
244
|
+
for (int i = 0; i < n; i++) {
|
245
|
+
p += xi[i] / sum;
|
246
|
+
data[i][0] = (xi[i] - m) / sd;
|
247
|
+
data[i][1] = p;
|
248
|
+
}
|
249
|
+
return data;
|
250
|
+
}
|
251
|
+
public XYPlot createPlot(String dname, double[] xi) {
|
252
|
+
XYItemRenderer renderer0 = new XYLineAndShapeRenderer(false, true);
|
253
|
+
XYItemRenderer renderer1 = new XYLineAndShapeRenderer(true, false);
|
254
|
+
XYToolTipGenerator toolTipGenerator = new StandardXYToolTipGenerator();
|
255
|
+
|
256
|
+
renderer0.setDefaultToolTipGenerator(toolTipGenerator);
|
257
|
+
renderer0.setURLGenerator(null);
|
258
|
+
renderer1.setDefaultToolTipGenerator(toolTipGenerator);
|
259
|
+
renderer1.setURLGenerator(null);
|
260
|
+
|
261
|
+
XYPlot plot = new XYPlot();
|
262
|
+
plot.setOrientation(PlotOrientation.VERTICAL);
|
263
|
+
plot.mapDatasetToRangeAxis(0,0);
|
264
|
+
plot.mapDatasetToRangeAxis(1,0);
|
265
|
+
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
|
266
|
+
|
267
|
+
/*--- 縦軸 ---*/
|
268
|
+
NumberAxis valueAxis0 = new NumberAxis("確率");
|
269
|
+
plot.setRangeAxis(valueAxis0);
|
270
|
+
valueAxis0.setLowerBound(0);
|
271
|
+
valueAxis0.setUpperBound(1);
|
272
|
+
valueAxis0.setTickUnit(new NumberTickUnit(0.1));
|
273
|
+
valueAxis0.setNumberFormatOverride(new DecimalFormat("0.0#"));
|
274
|
+
|
275
|
+
plot.setRenderer(0, renderer0);
|
276
|
+
plot.setDataset(0, createDataset0(dname, createData(xi)));
|
277
|
+
|
278
|
+
plot.setRenderer(1, renderer1);
|
279
|
+
plot.setDataset(1, createDataset1());
|
280
|
+
|
281
|
+
return plot;
|
282
|
+
}
|
283
|
+
private XYSeriesCollection createDataset0(String dname, double[][] data) {
|
284
|
+
XYSeries cu = new XYSeries(dname);
|
245
285
|
|
246
|
-
|
247
|
-
|
248
|
-
|
286
|
+
for (int i = 0; i < data.length; i++) {
|
287
|
+
cu.add(data[i][0], data[i][1]);
|
288
|
+
}
|
289
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
249
290
|
|
250
|
-
|
251
|
-
|
291
|
+
series.addSeries(cu);
|
292
|
+
return series;
|
252
293
|
}
|
253
|
-
XYSeriesCollection
|
294
|
+
private XYSeriesCollection createDataset1() {
|
295
|
+
NormalDistribution ndist = new NormalDistribution(0, 1);
|
296
|
+
XYSeries cu = new XYSeries("累積p");
|
254
297
|
|
255
|
-
|
256
|
-
|
257
|
-
}
|
258
|
-
private XYSeriesCollection createDataset1() {
|
259
|
-
NormalDistribution ndist = new NormalDistribution(0, 1);
|
260
|
-
XYSeries cu = new XYSeries("累積p");
|
298
|
+
for (double x = ChartPlot.CLASS_MIN; x < ChartPlot.CLASS_MAX; x += 0.01) {
|
299
|
+
double y = ndist.cumulativeProbability(x);
|
261
300
|
|
262
|
-
|
263
|
-
|
301
|
+
cu.add(x, y);
|
302
|
+
}
|
303
|
+
XYSeriesCollection series = new XYSeriesCollection();
|
264
304
|
|
265
|
-
|
305
|
+
series.addSeries(cu);
|
306
|
+
return series;
|
266
307
|
}
|
267
|
-
|
308
|
+
}
|
309
|
+
}
|
310
|
+
// Q-QandKSplot
|
311
|
+
private static class QQKSChartPlot implements ChartPlot {
|
312
|
+
private CreatePlot plot0 = null;
|
313
|
+
private CreatePlot plot1 = null;
|
314
|
+
public QQKSChartPlot() {
|
315
|
+
plot0 = new QQChartPlot.QQPlot();
|
316
|
+
plot1 = new KSChartPlot.KSPlot();
|
317
|
+
}
|
318
|
+
public JFreeChart createChart(String title, String dname, double[] xi) {
|
319
|
+
XYPlot plot = createPlot(dname, xi);
|
320
|
+
|
321
|
+
/*--- 横軸 ---*/
|
322
|
+
NumberAxis domainAxis = (NumberAxis)plot.getDomainAxis();
|
323
|
+
domainAxis.setLabel("期待値");
|
324
|
+
domainAxis.setLowerMargin(0.03);
|
325
|
+
domainAxis.setUpperMargin(0.03);
|
326
|
+
domainAxis.setLowerBound(ChartPlot.CLASS_MIN);
|
327
|
+
domainAxis.setUpperBound(ChartPlot.CLASS_MAX);
|
268
328
|
|
269
|
-
|
270
|
-
return
|
329
|
+
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
|
330
|
+
return new JFreeChart(title, plot);
|
271
331
|
}
|
332
|
+
private XYPlot createPlot(String dname, double[] xi) {
|
333
|
+
CombinedDomainXYPlot plot = new CombinedDomainXYPlot();
|
334
|
+
|
335
|
+
plot.add(plot0.createPlot(dname, xi), 1);
|
336
|
+
plot.add(plot1.createPlot(dname, xi), 1);
|
337
|
+
return plot;
|
338
|
+
}
|
339
|
+
|
272
340
|
}
|
341
|
+
// KS検定
|
273
342
|
private static class KSTest {
|
274
343
|
public boolean test(double[] xi) {
|
275
344
|
double[] data = new double[xi.length];
|
data/lib/num4normality.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: num4normality
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- siranovel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|