@@ -76,14 +76,8 @@ Net::Net(vlayer in, vlayer out):Net() {
7676 // Set input/outlayer
7777 // lin = in;
7878 // lout = out;
79- for (auto l : in) {
80- lin.push_back (l);
81- l->set_my_owner (this );
82- }
83- for (auto l : out) {
84- lout.push_back (l);
85- l->set_my_owner (this );
86- }
79+ for (auto l : in) lin.push_back (l);
80+ for (auto l : out) lout.push_back (l);
8781
8882 // Walk through the pointers of all layers, to get a plain
8983 // vector with all the layers
@@ -111,9 +105,11 @@ Net::Net(vlayer in, vlayer out):Net() {
111105 // It is important that layers vector keep the forward sort
112106 fts ();
113107 while (layers.size ()) layers.pop_back ();
114- for (auto l: vfts ) layers.push_back (l);
108+ for (auto l: vfts ) {
109+ l->increase_reference_counter ();
110+ layers.push_back (l);
111+ }
115112 while (vfts.size ()) vfts.pop_back ();
116-
117113}
118114
119115
@@ -160,7 +156,7 @@ Net::~Net(){
160156 }
161157 }
162158
163- if (snets[0 ] != this ){
159+ if (snets. size () == 0 || snets [0 ] != this ){
164160 if (this ->optimizer != nullptr && this ->do_optimizer_delete ){
165161 delete this ->optimizer ;
166162 }
@@ -176,24 +172,22 @@ Net::~Net(){
176172 for (int i=0 ;i<snets.size ();i++){
177173 for (int j=0 ;j<snets[i]->layers .size ();j++) {
178174 if (snets[i]->layers [j]!=nullptr ) {
179- // fprintf(stderr, "%s(%d) %d %d : %p %p %p %p\n", __FILE__, __LINE__, i, j, snets[i]->layers[j]->get_my_owner(), this, snets[i], rnet);
180- if (snets[i]->layers [j]->is_my_owner (this ) || snets[i]->layers [j]->is_my_owner (snets[i])) {
175+ if (snets[i]->layers [j]->decrease_and_get_reference_counter () == 0 ) {
181176 delete snets[i]->layers [j];
182- snets[i]->layers [j] = nullptr ;
183177 }
178+ snets[i]->layers [j] = nullptr ;
184179 }
185180 }
186181 }
187182
188183 // net running on device != CPU
189184 // clean also CPU mem
190- if (snets[0 ]!=this ){
185+ if (snets. size () == 0 || snets [0 ]!=this ){
191186 for (int j=0 ;j<layers.size ();j++) {
192- // fprintf(stderr, "%s(%d) %d : %p %p\n", __FILE__, __LINE__, j, layers[j]->get_my_owner(), this);
193- if (layers[j]->is_my_owner (this )) {
187+ if (layers[j]->decrease_and_get_reference_counter () == 0 ) {
194188 delete layers[j];
195- layers[j] = nullptr ;
196189 }
190+ layers[j] = nullptr ;
197191 }
198192 }
199193
@@ -237,7 +231,6 @@ void Net::walk(Layer *l,vlayer lout) {
237231 if (!inNetF (l)) {
238232 l->net =this ;
239233 layersf.push_back (l);
240- l->set_my_owner (this );
241234 }
242235 else return ;
243236
@@ -253,7 +246,6 @@ void Net::walk_back(Layer *l) {
253246
254247 if (!inNetB (l)) {
255248 layersb.push_back (l);
256- l->set_my_owner (this );
257249 l->net =this ;
258250 }
259251 else return ;
0 commit comments