static bool hasContiguousSubspace(TensorList tl) { // true if all the non-null tensors are adjacent auto isDefined = [](const Tensor & tensor){ return tensor.defined(); }; auto isNull = [](const Tensor & tensor){ return !tensor.defined(); }; auto start = std::find_if(tl.begin(), tl.end(), isDefined); auto stop = std::find_if(tl.rbegin(), tl.rend(), isDefined); auto it = std::find_if(start, stop.base(), isNull); return it == stop.base(); }
// ArrayRef is not covariant, which means there is no // implicit conversion between TensorList (aka ArrayRef<Tensor>) // and ArrayRef<Variable>. What we do instead is manually // construct a variable_list, which itself is implicitly convertible // into an ArrayRef<Variable> (but don't return an ArrayRef<Variable>; // ArrayRef is non-owning!) static variable_list cast_tensor_list(const TensorList& tensors) { // TODO: Eliminate the intermediate vector allocation return variable_list(tensors.begin(), tensors.end()); }