template <class T> void calc_node_pad(T *node, const FixPadContext &ctx)
{
assert(node != nullptr);
- assert(ctx.output_height > 0);
- assert(ctx.output_width > 0);
- // calculate padding height, width
- int64_t i_height = (int64_t)(ctx.output_height - 1) * (int64_t)ctx.stride_height +
- (int64_t)ctx.effective_window_height - (int64_t)ctx.input_height;
- int64_t i_width = (int64_t)(ctx.output_width - 1) * (int64_t)ctx.stride_width +
- (int64_t)ctx.effective_window_width - (int64_t)ctx.input_width;
- uint32_t pad_height = i_height >= 0 ? (uint32_t)i_height : 0U;
- uint32_t pad_width = i_width >= 0 ? (uint32_t)i_width : 0U;
+ PadData pd = calc_paddata(ctx);
- // set padding values
- node->pad()->top(pad_height / 2);
- node->pad()->bottom(pad_height - node->pad()->top());
- node->pad()->left(pad_width / 2);
- node->pad()->right(pad_width - node->pad()->left());
+ *node->pad() = *pd.pad();
}
template <class T> void calc_annot_paddata(T *node, const FixPadContext &ctx)
{
assert(node != nullptr);
- assert(ctx.output_height > 0);
- assert(ctx.output_width > 0);
-
- // PadData should be null
- assert(node->template annot<PadData>() == nullptr);
- // calculate padding height, width
- int64_t i_height = (int64_t)(ctx.output_height - 1) * (int64_t)ctx.stride_height +
- (int64_t)ctx.effective_window_height - (int64_t)ctx.input_height;
- int64_t i_width = (int64_t)(ctx.output_width - 1) * (int64_t)ctx.stride_width +
- (int64_t)ctx.effective_window_width - (int64_t)ctx.input_width;
- uint32_t pad_height = i_height >= 0 ? (uint32_t)i_height : 0U;
- uint32_t pad_width = i_width >= 0 ? (uint32_t)i_width : 0U;
+ PadData pd = calc_paddata(ctx);
// annotation of pad data
- auto pad_data = stdex::make_unique<PadData>();
-
- pad_data->pad()->top(pad_height / 2);
- pad_data->pad()->bottom(pad_height - pad_data->pad()->top());
- pad_data->pad()->left(pad_width / 2);
- pad_data->pad()->right(pad_width - pad_data->pad()->left());
+ auto pad_data = stdex::make_unique<PadData>(pd);
node->annot(std::move(pad_data));