Example #1
0
 /**
  * @brief Compute the volume of a slice; i.e., the product of dimensions
  *        among a range of axes.
  *
  * @param start_axis The first axis to include in the slice.
  *
  * @param end_axis The first axis to exclude from the slice.
  */
 inline int count(int start_axis, int end_axis) const {
   CHECK_LE(start_axis, end_axis);
   CHECK_GE(start_axis, 0);
   CHECK_GE(end_axis, 0);
   CHECK_LE(start_axis, num_axes());
   CHECK_LE(end_axis, num_axes());
   int count = 1;
   for (int i = start_axis; i < end_axis; ++i) {
     count *= shape(i);
   }
   return count;
 }
Example #2
0
File: blob.hpp Project: gnina/caffe
 /**
  * @brief Returns the 'canonical' version of a (usually) user-specified axis,
  *        allowing for negative indexing (e.g., -1 for the last axis).
  *
  * @param axis_index the axis index.
  *        If 0 <= index < num_axes(), return index.
  *        If -num_axes <= index <= -1, return (num_axes() - (-index)),
  *        e.g., the last axis index (num_axes() - 1) if index == -1,
  *        the second to last if index == -2, etc.
  *        Dies on out of range index.
  */
 inline int CanonicalAxisIndex(int axis_index) const {
   CHECK_GE(axis_index, -num_axes())
       << "axis " << axis_index << " out of range for " << num_axes()
       << "-D Blob with shape " << shape_string();
   CHECK_LT(axis_index, num_axes())
       << "axis " << axis_index << " out of range for " << num_axes()
       << "-D Blob with shape " << shape_string();
   if (axis_index < 0) {
     return axis_index + num_axes();
   }
   return axis_index;
 }
Example #3
0
 /**
  * @brief Compute the volume of a slice; i.e., the product of dimensions
  *        among a range of axes.
  *
  * @param start_axis The first axis to include in the slice.
  *
  * @param end_axis The first axis to exclude from the slice.
  */
 inline int count(int start_axis, int end_axis) const {
   ASSERT(start_axis <= end_axis, "");
   ASSERT(start_axis >= 0, "");
   ASSERT(end_axis >= 0, "");
   ASSERT(start_axis <= num_axes(), "");
   ASSERT(end_axis <= num_axes(), "");
   int count = 1;
   for (int i = start_axis; i < end_axis; ++i) {
     count *= shape(i);
   }
   return count;
 }
Example #4
0
 /**
  * @brief Returns the 'canonical' version of a (usually) user-specified axis,
  *        allowing for negative indexing (e.g., -1 for the last axis).
  *
  * @param index the axis index.
  *        If 0 <= index < num_axes(), return index.
  *        If -num_axes <= index <= -1, return (num_axes() - (-index)),
  *        e.g., the last axis index (num_axes() - 1) if index == -1,
  *        the second to last if index == -2, etc.
  *        Dies on out of range index.
  */
 inline int CanonicalAxisIndex(int axis_index) const {
   ASSERT(axis_index >= -num_axes(),
       "axis " << axis_index << " out of range for " << num_axes()
       << "-D Blob with shape " << shape_string());
   ASSERT(axis_index < num_axes(),
       "axis " << axis_index << " out of range for " << num_axes()
       << "-D Blob with shape " << shape_string());
   if (axis_index < 0) {
     return axis_index + num_axes();
   }
   return axis_index;
 }
Example #5
0
 inline int offset(const vector<int>& indices) const {
   CHECK_LE(indices.size(), num_axes());
   int offset = 0;
   for (int i = 0; i < num_axes(); ++i) {
     offset *= shape(i);
     if (indices.size() > i) {
       CHECK_GE(indices[i], 0);
       CHECK_LT(indices[i], shape(i));
       offset += indices[i];
     }
   }
   return offset;
 }
Example #6
0
 inline int LegacyShape(int index) const {
   CHECK_LE(num_axes(), 4)
   << "Cannot use legacy accessors on Blobs with > 4 axes.";
   CHECK_LT(index, 4);
   CHECK_GE(index, -4);
   if (index >= num_axes() || index < -num_axes()) {
     // Axis is out of range, but still in [0, 3] (or [-4, -1] for reverse
     // indexing) -- this special case simulates the one-padding used to fill
     // extraneous axes of legacy blobs.
     return 1;
   }
   return shape(index);
 }
Example #7
0
 inline int offset(const vector<int>& indices) const {
   ASSERT(indices.size() <= num_axes(), "");
   int offset = 0;
   for (int i = 0; i < num_axes(); ++i) {
     offset *= shape(i);
     if (indices.size() > i) {
       ASSERT(indices[i] >= 0, "");
       ASSERT(indices[i] < shape(i), "");
       offset += indices[i];
     }
   }
   return offset;
 }
Example #8
0
 /**
  * @brief Compute the volume of a slice spanning from a particular first
  *        axis to the final axis.
  *
  * @param start_axis The first axis to include in the slice.
  */
 inline int count(int start_axis) const {
   return count(start_axis, num_axes());
 }