1 /******************************************************************************/\r
2 /*!\r
3 * \file timlCNNClone.c\r
4 */\r
5 /* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/\r
6 *\r
7 * Redistribution and use in source and binary forms, with or without\r
8 * modification, are permitted provided that the following conditions\r
9 * are met:\r
10 *\r
11 * Redistributions of source code must retain the above copyright\r
12 * notice, this list of conditions and the following disclaimer.\r
13 *\r
14 * Redistributions in binary form must reproduce the above copyright\r
15 * notice, this list of conditions and the following disclaimer in the\r
16 * documentation and/or other materials provided with the\r
17 * distribution.\r
18 *\r
19 * Neither the name of Texas Instruments Incorporated nor the names of\r
20 * its contributors may be used to endorse or promote products derived\r
21 * from this software without specific prior written permission.\r
22 *\r
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
34 *\r
35 ******************************************************************************/\r
36 \r
37 \r
38 /*******************************************************************************\r
39 *\r
40 * INCLUDES\r
41 *\r
42 ******************************************************************************/\r
43 \r
44 #include "../api/timl.h"\r
45 \r
46 \r
47 /******************************************************************************/\r
48 /**\r
49 * \ingroup cnn\r
50 * \brief Clone a cnn\r
51 * \param[in] cnn CNN to be cloned\r
52 * \return Cloned cnn\r
53 */\r
54 /******************************************************************************/\r
55 \r
56 timlConvNeuralNetwork *timlCNNClone(timlConvNeuralNetwork *cnn)\r
57 {\r
58 int err;\r
59 int dim;\r
60 timlConvNeuralNetwork *cnnCopy;\r
61 timlCNNLayer *layer;\r
62 timlCNNLayer *layerCopy;\r
63 int threadId;\r
64 int deviceId;\r
65 \r
66 // init\r
67 layer = cnn->head;\r
68 deviceId = cnn->deviceId;\r
69 threadId = cnn->threadId;\r
70 cnnCopy = timlCNNCreateConvNeuralNetwork(cnn->params);\r
71 if (cnnCopy == NULL) {\r
72 return NULL;\r
73 }\r
74 \r
75 cnnCopy->params = cnn->params;\r
76 \r
77 // deep copy\r
78 strcpy(cnnCopy->configFileName, cnn->configFileName);\r
79 strcpy(cnnCopy->paramsFileName, cnn->paramsFileName);\r
80 strcpy(cnnCopy->statesFileName, cnn->statesFileName);\r
81 \r
82 while (layer != NULL) {\r
83 switch (layer->type) {\r
84 case CNN_Input:\r
85 err = timlCNNAddInputLayer(cnnCopy, layer->row, layer->col, layer->channel, layer->inputParams);\r
86 if (err) {\r
87 timlCNNDelete(cnnCopy);\r
88 return NULL;\r
89 }\r
90 break;\r
91 case CNN_Conv:\r
92 err = timlCNNAddConvLayer(cnnCopy, layer->convParams.kernelRow, layer->convParams.kernelCol, layer->convParams.strideX, layer->convParams.strideY, layer->convParams.outputFeatureMapChannel, layer->convParams);\r
93 if (err) {\r
94 timlCNNDelete(cnnCopy);\r
95 return NULL;\r
96 }\r
97 break;\r
98 case CNN_Linear:\r
99 err = timlCNNAddLinearLayer(cnnCopy, layer->linearParams.dim, layer->linearParams);\r
100 if (err) {\r
101 timlCNNDelete(cnnCopy);\r
102 return NULL;\r
103 }\r
104 break;\r
105 case CNN_Norm:\r
106 err = timlCNNAddNormLayer(cnnCopy, layer->normParams);\r
107 if (err) {\r
108 timlCNNDelete(cnnCopy);\r
109 return NULL;\r
110 }\r
111 break;\r
112 case CNN_Pooling:\r
113 err = timlCNNAddPoolingLayer(cnnCopy, layer->poolingParams.scaleRow, layer->poolingParams.scaleCol, layer->poolingParams.strideX, layer->poolingParams.strideY, layer->poolingParams.type, layer->poolingParams);\r
114 if (err) {\r
115 timlCNNDelete(cnnCopy);\r
116 return NULL;\r
117 }\r
118 break;\r
119 case CNN_Nonlinear:\r
120 err = timlCNNAddNonlinearLayer(cnnCopy, layer->nonlinearParams.type);\r
121 if (err) {\r
122 timlCNNDelete(cnnCopy);\r
123 return NULL;\r
124 }\r
125 break;\r
126 case CNN_Dropout:\r
127 err = timlCNNAddDropoutLayer(cnnCopy, layer->dropoutParams.prob);\r
128 if (err) {\r
129 timlCNNDelete(cnnCopy);\r
130 return NULL;\r
131 }\r
132 break;\r
133 case CNN_Softmax:\r
134 err = timlCNNAddSoftmaxLayer(cnnCopy);\r
135 if (err) {\r
136 timlCNNDelete(cnnCopy);\r
137 return NULL;\r
138 }\r
139 break;\r
140 case CNN_SoftmaxCost:\r
141 err = timlCNNAddSoftmaxCostLayer(cnnCopy);\r
142 if (err) {\r
143 timlCNNDelete(cnnCopy);\r
144 return NULL;\r
145 }\r
146 break;\r
147 case CNN_Accuracy:\r
148 err = timlCNNAddAccuracyLayer(cnnCopy, layer->accuracyParams.top);\r
149 if (err) {\r
150 timlCNNDelete(cnnCopy);\r
151 return NULL;\r
152 }\r
153 break;\r
154 default:\r
155 break;\r
156 }\r
157 layer = layer->next;\r
158 }\r
159 return cnnCopy;\r
160 }\r