[ti-machine-learning/ti-machine-learning.git] / debian / ti-timl / usr / src / timl / src / common / cnn / timlCNNReadFromFile.c
diff --git a/debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNReadFromFile.c b/debian/ti-timl/usr/src/timl/src/common/cnn/timlCNNReadFromFile.c
--- /dev/null
@@ -0,0 +1,206 @@
+/******************************************************************************/\r
+/*!\r
+ * \file timlCNNReadFromFile.c\r
+ */\r
+/* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ *\r
+ * Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ *\r
+ * Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the\r
+ * distribution.\r
+ *\r
+ * Neither the name of Texas Instruments Incorporated nor the names of\r
+ * its contributors may be used to endorse or promote products derived\r
+ * from this software without specific prior written permission.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ ******************************************************************************/\r
+\r
+\r
+/*******************************************************************************\r
+ *\r
+ * INCLUDES\r
+ *\r
+ ******************************************************************************/\r
+\r
+#include "../api/timl.h"\r
+\r
+\r
+/*******************************************************************************/\r
+/*!\r
+ * \ingroup cnn\r
+ * \brief Read CNN from file(s)\r
+ * \param[in] fileName File name\r
+ * \param[in] deviceId Device Id\r
+ * \return CNN\r
+ */\r
+/*******************************************************************************/\r
+\r
+timlConvNeuralNetwork* timlCNNReadFromFile(const char *fileName, int deviceId)\r
+{\r
+ int l;\r
+ int layerNum;\r
+ int intBuffer;\r
+ int err;\r
+ int read;\r
+ timlCNNLayer *layer;\r
+ timlCNNLayerType layerType;\r
+ timlConvNeuralNetwork *cnn;\r
+ char str[TIML_UTIL_MAX_STR];\r
+ char str2[TIML_UTIL_MAX_STR];\r
+ FILE *fp1;\r
+ FILE *fp2;\r
+ FILE *fp3;\r
+ char *dirName;\r
+\r
+ err = 0;\r
+ fp1 = fopen(fileName, "rt");\r
+ if (fp1 == NULL) {\r
+ return NULL;\r
+ }\r
+ dirName = dirname(strdup(fileName));\r
+\r
+ // create cnn\r
+ cnn = timlCNNCreateConvNeuralNetwork(timlCNNTrainingParamsDefault(), deviceId);\r
+ if (cnn == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ // read params file\r
+ read = fscanf(fp1, "paramsBinaryFileName = '%[^']';\n", str);\r
+ sprintf(str2, "%s/%s", dirName, str);\r
+\r
+ fp2 = fopen(str2, "rb");\r
+\r
+ // read state file\r
+ read = fscanf(fp1, "stateBinaryFileName = '%[^']';\n", str);\r
+ sprintf(str2, "%s/%s", dirName, str);\r
+ fp3 = fopen(str2, "rb");\r
+\r
+ // read training parameters\r
+ err = timlCNNTrainingParamsReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+\r
+ // read layer number\r
+ read = fscanf(fp1, "layerNum = %d;\n", &layerNum);\r
+ if (read != 1) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+\r
+ // read each layer\r
+ for (l = 0; l < layerNum; l++) {\r
+ read = fscanf(fp1, "%[^.].layer(%d).id = %d;\n", (char*)&str, &intBuffer, &intBuffer);\r
+ read = fscanf(fp1, "%[^.].layer(%d).type = %d;\n", (char*)&str, &intBuffer, (int*)&layerType);\r
+ switch (layerType) {\r
+ case CNN_Dropout:\r
+ err = timlCNNDropoutReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ case CNN_Input:\r
+ err = timlCNNInputReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ case CNN_Conv:\r
+ err = timlCNNConvReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ case CNN_Linear:\r
+ err = timlCNNLinearReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ case CNN_Nonlinear:\r
+ err = timlCNNNonlinearReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ case CNN_Norm:\r
+ err = timlCNNNormReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ case CNN_Pooling:\r
+ err = timlCNNPoolingReadFromTextFile(fp1, cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ // allocate space\r
+ err = timlCNNInitialize(cnn);\r
+ if (err) {\r
+ timlCNNDelete(cnn);\r
+ return NULL;\r
+ }\r
+\r
+ // read binary file\r
+ layer = cnn->head;\r
+ while (layer != NULL) {\r
+ switch (layer->type) {\r
+ case CNN_Input:\r
+ timlCNNInputReadFromBinaryFile(fp2, fp3, layer);\r
+ break;\r
+ case CNN_Conv:\r
+ timlCNNConvReadFromBinaryFile(fp2, fp3, layer);\r
+ break;\r
+ case CNN_Linear:\r
+ timlCNNLinearReadFromBinaryFile(fp2, fp3, layer);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ layer = layer->next;\r
+ }\r
+\r
+ if (fp1 != NULL) {\r
+ fclose(fp1);\r
+ }\r
+ if (fp2 != NULL) {\r
+ fclose(fp2);\r
+ }\r
+ if (fp3 != NULL) {\r
+ fclose(fp3);\r
+ }\r
+\r
+ return cnn;\r
+}\r