local LayerRepo = nerv.class("nerv.LayerRepo") function LayerRepo:__init(layer_spec, param_repo, global_conf) self.layers = {} self:add_layers(layer_spec, param_repo, global_conf) end function LayerRepo:add_layers(layer_spec, param_repo, global_conf) local layers = self.layers for ltype, llist in pairs(layer_spec) do local layer_type = nerv.get_type(ltype) if layer_type == nil then nerv.error('layer type `%s` not found', ltype) end for id, lconf in pairs(llist) do if type(lconf) ~= "table" then nerv.error("layer config table is need") end if lconf.pr == nil then lconf.pr = param_repo end if layers[id] ~= nil then nerv.error("a layer with id %s already exists", id) end nerv.info("create layer: %s", id) layers[id] = layer_type(id, global_conf, lconf) end end end function LayerRepo:rebind(param_repo) if self.__rebinding then return end self.__rebinding = true for _, layer in pairs(self.layers) do if not layer.__already_rebound then layer.__already_rebound = true layer.lconf.pr = param_repo layer:bind_params() end end for _, layer in pairs(self.layers) do layer.__already_rebound = false end self.__rebinding = false end function LayerRepo:get_layer(lid) local layer = self.layers[lid] if layer == nil then nerv.error("layer with id %s not found", lid) end return layer end