/// feed or clear label
for (unsigned int idx = 0; idx < names.size(); idx++) {
if (data.empty())
- tensor_manager->setExternalTensor(names[idx], Tensor());
+ tensor_manager->fillPlaceholder(names[idx], Tensor());
else if (data.size() == 1)
- tensor_manager->setExternalTensor(names[idx], data[0]);
+ tensor_manager->fillPlaceholder(names[idx], data[0]);
else
- tensor_manager->setExternalTensor(names[idx], data[idx]);
+ tensor_manager->fillPlaceholder(names[idx], data[idx]);
}
}
setExternalTensors(inputs, input_list);
setExternalTensors(labels, label_list);
- tensor_manager->updateExternalTensors();
}
void NetworkGraph::setInputsLabels(sharedConstTensors &inputs,
void setOptimizations(bool val) { enable_optimizations = val; }
/**
- * @brief Update the dependency on external tensors
- */
- void updateExternalTensors() {
- weight_pool.updateExternalTensors();
- tensor_pool.updateExternalTensors();
- }
-
- /**
* @brief Update externally dependent tensors
*
* @param name Name of the tensor
* @param t External tensor
*/
- void setExternalTensor(const std::string &name, const Tensor &t) {
- tensor_pool.setExternalTensor(name, t);
+ void fillPlaceholder(const std::string &name, const Tensor &t) {
+ tensor_pool.fillPlaceholder(name, t);
}
/**
}
void TensorPool::syncDependents(const RequestSpec &spec) {
+ /// @note syncing dependents of dependents is invalid and will throw.
auto &dependents = std::get<SourceDetails>(spec.details).dependents;
for (auto &dep : dependents) {
auto &dep_spec = pool.at(dep);
return *rs;
}
-void TensorPool::setExternalTensor(const std::string &name, const Tensor &t) {
+void TensorPool::fillPlaceholder(const std::string &name, const Tensor &t) {
auto &spec = getSourceSpec(name);
auto &details = std::get<SourceDetails>(spec.details);
NNTR_THROW_IF(details.lifespan != TensorLifespan::UNMANAGED,
NNTR_THROW_IF(t.size() != 0 && t.size() < spec.tensor->size(),
std::invalid_argument)
- << "Error: setting external tensor of smaller size for " << name;
+ << "Error: setting external tensor of smaller size for "
+ << spec.tensor->getName() << "(maybe view of " << name << ")";
spec.tensor->setData(t.getData());
-}
-
-void TensorPool::updateExternalTensors() {
- for (auto &spec : pool) {
- if (std::holds_alternative<SourceDetails>(spec.details)) {
- syncDependents(spec);
- }
- }
+ syncDependents(spec);
}
Tensor *TensorPool::placeholder(const std::string &name, const TensorDim &dim) {
*
* @note Update externally dependent tensors data ptrs from their parents
*/
- void setExternalTensor(const std::string &name, const Tensor &t);
-
- /**
- * @brief Update externally dependent tensors
- *
- * @note Update externally dependent tensors data ptrs from their parents
- */
- void updateExternalTensors();
+ void fillPlaceholder(const std::string &name, const Tensor &t);
/**
* @brief request placeholder which will be not managed by this tensor pool
/// t3 : 2 3
nntrainer::Tensor t_original(t1->getDim());
t_original.apply_i([i = 0u](float _) mutable { return ++i; });
- pool.setExternalTensor("t1", t_original);
- pool.updateExternalTensors();
+ pool.fillPlaceholder("t1", t_original);
testSubset(t1, &t_original);
testSubset(t1, t2);