/* * Copyright [2012-2014] PayPal Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ml.shifu.shifu; import ml.shifu.shifu.container.obj.RawSourceData.SourceType; import ml.shifu.shifu.fs.ShifuFileUtils; import ml.shifu.shifu.util.CommonUtils; import ml.shifu.shifu.util.Constants; import ml.shifu.shifu.util.Environment; import org.apache.commons.io.FileUtils; import org.easymock.EasyMock; import org.powermock.api.easymock.PowerMock; import org.powermock.modules.testng.PowerMockObjectFactory; import org.testng.Assert; import org.testng.IObjectFactory; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.ObjectFactory; import org.testng.annotations.Test; import java.io.*; import java.util.Arrays; /** * ManagerTest class */ public class ShifuCLITest { @ObjectFactory public IObjectFactory setObjectFactory() { return new PowerMockObjectFactory(); } @BeforeClass public void setUp() { Environment.setProperty(Environment.SHIFU_HOME, "."); } // @Test public void testInitializeModelOld() throws Exception { File modelConfigFile = new File("src/test/resources/data/ModelStore/ModelSet1/ModelConfig.json"); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(modelConfigFile), Constants.DEFAULT_CHARSET)); File variableStoreFile = new File("src/test/resources/common/VariableStore.json"); BufferedReader reader2 = new BufferedReader(new InputStreamReader(new FileInputStream(variableStoreFile), Constants.DEFAULT_CHARSET)); String[] headers = "id|diagnosis|column_3|column_4|column_5|column_6|column_7|column_8|column_9|column_10|column_11|column_12|column_13|column_14|column_15|column_16|column_17|column_18|column_19|column_20|column_21|column_22|column_23|column_24|column_25|column_26|column_27|column_28|column_29|column_30|column_31|column_32|result" .split("\\|"); PowerMock.mockStaticPartial(CommonUtils.class, "getReader", "getHeaders"); EasyMock.expect(ShifuFileUtils.getReader("./ModelConfig.json", SourceType.LOCAL)).andReturn(reader).anyTimes(); EasyMock.expect(ShifuFileUtils.getReader("common/VariableStore.json", SourceType.LOCAL)).andReturn(reader2) .anyTimes(); EasyMock.expect( CommonUtils.getHeaders("./src/test/resources/data/DataStore/DataSet1/.pig_header", "|", SourceType.LOCAL)).andReturn(headers).anyTimes(); PowerMock.replayAll(CommonUtils.class); ShifuCLI.initializeModel(); File columnConfig = new File("./ColumnConfig.json"); File tmp = new File("tmp"); Assert.assertTrue(columnConfig.exists()); Assert.assertTrue(tmp.exists()); columnConfig.deleteOnExit(); FileUtils.deleteDirectory(tmp); reader.close(); reader2.close(); } @Test public void testCreateModel() throws Exception { Environment.setProperty(Environment.SHIFU_HOME, "src/test/resources"); ShifuCLI.createNewModel("TestModel", null, "It's a model for Unittest"); File file = new File("TestModel"); Assert.assertTrue(file.exists()); FileUtils.deleteDirectory(file); } @Test public void testInitializeModel() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); FileUtils.copyFile(originModel, tmpModel); ShifuCLI.initializeModel(); File file = new File("ColumnConfig.json"); Assert.assertTrue(file.exists()); FileUtils.deleteQuietly(file); FileUtils.deleteQuietly(tmpModel); } @Test public void testCalculateModelStats() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); long timestamp = tmpColumn.lastModified(); ShifuCLI.initializeModel(); ShifuCLI.calModelStats(false); Assert.assertTrue(tmpColumn.lastModified() > timestamp); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); } // @Test // comment out because of no normalized data public void testSelectModelVar() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); long timestamp = tmpColumn.lastModified(); ShifuCLI.selectModelVar(false, false); Assert.assertTrue(tmpColumn.lastModified() > timestamp); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); } @Test public void testNormalizeData() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); ShifuCLI.initializeModel(); ShifuCLI.calModelStats(false); ShifuCLI.normalizeTrainData(); File normalizedData = new File("tmp/NormalizedData"); File selectedData = new File("tmp/SelectedRawData"); Assert.assertTrue(normalizedData.exists()); Assert.assertTrue(selectedData.exists()); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); FileUtils.deleteDirectory(new File("tmp")); } @Test public void testTrainModel() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); // run normalization ShifuCLI.normalizeTrainData(); // run train ShifuCLI.trainModel(false, false, false); File modelFile = new File("models/model0.nn"); Assert.assertTrue(modelFile.exists()); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); FileUtils.deleteDirectory(new File("tmp")); FileUtils.deleteDirectory(new File("models")); } // @Test public void testPostTrainModel() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); File modelsDir = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/models"); File tmpModelsDir = new File("models"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); FileUtils.copyDirectory(modelsDir, tmpModelsDir); long timestamp = tmpColumn.lastModified(); // run post-train ShifuCLI.initializeModel(); ShifuCLI.calModelStats(false); ShifuCLI.normalizeTrainData(); ShifuCLI.selectModelVar(false, false); ShifuCLI.postTrainModel(); Assert.assertTrue(tmpColumn.lastModified() > timestamp); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); FileUtils.deleteDirectory(new File("tmp")); FileUtils.deleteDirectory(new File("models")); } @Test public void testRunEvalAll() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); File modelsDir = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/models"); File tmpModelsDir = new File("models"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); FileUtils.copyDirectory(modelsDir, tmpModelsDir); // run evaluation set ShifuCLI.runEvalSet(false); File evalScore = new File("evals/EvalA/EvalScore"); Assert.assertTrue(evalScore.exists()); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); FileUtils.deleteQuietly(new File("evals/EvalA/EvalConfusionMatrix")); FileUtils.deleteQuietly(new File("evals/EvalB/EvalConfusionMatrix")); } @Test public void testCreateEvalSet() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); long timestamp = tmpModel.lastModified(); // run create evaluation set ShifuCLI.createNewEvalSet("EvalC"); Assert.assertTrue(tmpModel.lastModified() > timestamp); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(new File("EvalC" + Constants.DEFAULT_EVALSCORE_META_COLUMN_FILE)); } @Test public void testRunExport() throws Exception { File originModel = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ModelConfig.json"); File tmpModel = new File("ModelConfig.json"); File originColumn = new File( "src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/ColumnConfig.json"); File tmpColumn = new File("ColumnConfig.json"); File modelsDir = new File("src/test/resources/example/cancer-judgement/ModelStore/ModelSet1/models"); File tmpModelsDir = new File("models"); FileUtils.copyFile(originModel, tmpModel); FileUtils.copyFile(originColumn, tmpColumn); FileUtils.copyDirectory(modelsDir, tmpModelsDir); // run evaluation set ShifuCLI.exportModel(null, null); File pmml = new File("./pmmls/cancer-judgement0.pmml"); Assert.assertTrue(pmml.exists()); FileUtils.deleteQuietly(tmpModel); FileUtils.deleteQuietly(tmpColumn); FileUtils.deleteQuietly(new File("./pmmls")); FileUtils.deleteDirectory(tmpModelsDir); } @AfterTest public void delete() throws IOException { FileUtils.deleteDirectory(new File("evals")); } @Test public void testSplit() { System.out.println(Arrays.asList("01Jun2015^0.3456".split("\\^"))); } }