Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

261 lines
8.9 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
/**
* @file PointwiseAttributes.hpp
* @brief Attributes for element-wise (pointwise) operations
*
* This file defines the PointwiseAttributes class for configuring pointwise
* operations including activation functions, arithmetic, and other element-wise ops.
*/
#pragma once
#include "Attributes.hpp"
#include "TensorAttributes.hpp"
#include <hipdnn_frontend/Types.hpp>
#include <memory>
#include <optional>
#include <unordered_map>
namespace hipdnn_frontend::graph
{
/**
* @class PointwiseAttributes
* @brief Configuration for element-wise (pointwise) operations
*
* PointwiseAttributes specifies the parameters for pointwise operations that
* operate element-wise on tensors. This includes:
* - Activation functions: RELU, SIGMOID, TANH, GELU, ELU, SWISH, etc.
* - Arithmetic operations: ADD, MUL, SUB, DIV, etc.
* - Comparison operations: CMP_EQ, CMP_GT, etc.
* - Other supported pointwise operations as defined in PointwiseMode
*
* @code{.cpp}
* // ReLU activation
* auto y = graph.pointwise(x, PointwiseAttributes()
* .set_mode(PointwiseMode::RELU));
*
* // Leaky ReLU with negative slope
* auto y = graph.pointwise(x, PointwiseAttributes()
* .set_mode(PointwiseMode::RELU_FWD)
* .set_relu_lower_clip_slope(0.01f));
*
* // Element-wise addition
* auto c = graph.pointwise(a, b, PointwiseAttributes()
* .set_mode(PointwiseMode::ADD));
* @endcode
*
* **Tensor Shapes:**
* Pointwise operations are dimension-agnostic — input tensors can have any shape.
* For binary and ternary operations, inputs are broadcast using NumPy-style rules
* (dimensions compared right-to-left; compatible if equal or 1).
*
* @see Graph::pointwise(), PointwiseMode
*/
class PointwiseAttributes : public Attributes<PointwiseAttributes>
{
public:
PointwiseAttributes() = default;
/// @brief Get the pointwise operation mode
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseMode get_mode() const
{
return mode;
}
/// @brief Get ReLU lower clipping bound
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<float> get_relu_lower_clip() const
{
return relu_lower_clip;
}
/// @brief Get ReLU upper clipping bound
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<float> get_relu_upper_clip() const
{
return relu_upper_clip;
}
/// @brief Get slope for Leaky ReLU (negative region)
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<float> get_relu_lower_clip_slope() const
{
return relu_lower_clip_slope;
}
/// @brief Get Swish activation beta parameter
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<float> get_swish_beta() const
{
return swish_beta;
}
/// @brief Get ELU activation alpha parameter
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<float> get_elu_alpha() const
{
return elu_alpha;
}
/// @brief Get Softplus activation beta parameter
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<float> get_softplus_beta() const
{
return softplus_beta;
}
/// @brief Get axis for operations like softmax
// NOLINTNEXTLINE(readability-identifier-naming)
std::optional<int64_t> get_axis() const
{
return axis;
}
/// @brief Get the first input tensor
// NOLINTNEXTLINE(readability-identifier-naming)
std::shared_ptr<TensorAttributes> get_input_0() const
{
return getInput(InputNames::IN_0);
}
/// @brief Get the second input tensor (for binary ops)
// NOLINTNEXTLINE(readability-identifier-naming)
std::shared_ptr<TensorAttributes> get_input_1() const
{
return getInput(InputNames::IN_1);
}
/// @brief Get the third input tensor (for ternary ops)
// NOLINTNEXTLINE(readability-identifier-naming)
std::shared_ptr<TensorAttributes> get_input_2() const
{
return getInput(InputNames::IN_2);
}
/// @brief Get the output tensor
// NOLINTNEXTLINE(readability-identifier-naming)
std::shared_ptr<TensorAttributes> get_output_0() const
{
return getOutput(OutputNames::OUT_0);
}
/**
* @brief Set the pointwise operation mode
* @param value The operation to perform (see PointwiseMode enum)
* @return Reference to this for method chaining
*/
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_mode(PointwiseMode value)
{
mode = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_relu_lower_clip(float value)
{
relu_lower_clip = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_relu_upper_clip(float value)
{
relu_upper_clip = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_relu_lower_clip_slope(float value)
{
relu_lower_clip_slope = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_swish_beta(float value)
{
swish_beta = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_elu_alpha(float value)
{
elu_alpha = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_softplus_beta(float value)
{
softplus_beta = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_axis(int64_t value)
{
axis = value;
return *this;
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_input_0(const std::shared_ptr<TensorAttributes>& input0)
{
return setInput(InputNames::IN_0, input0);
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_input_0(std::shared_ptr<TensorAttributes>&& input0)
{
return setInput(InputNames::IN_0, std::move(input0));
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_input_1(const std::shared_ptr<TensorAttributes>& input1)
{
return setInput(InputNames::IN_1, input1);
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_input_1(std::shared_ptr<TensorAttributes>&& input1)
{
return setInput(InputNames::IN_1, std::move(input1));
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_input_2(const std::shared_ptr<TensorAttributes>& input2)
{
return setInput(InputNames::IN_2, input2);
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_input_2(std::shared_ptr<TensorAttributes>&& input2)
{
return setInput(InputNames::IN_2, std::move(input2));
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_output_0(const std::shared_ptr<TensorAttributes>& output0)
{
return setOutput(OutputNames::OUT_0, output0);
}
// NOLINTNEXTLINE(readability-identifier-naming)
PointwiseAttributes& set_output_0(std::shared_ptr<TensorAttributes>&& output0)
{
return setOutput(OutputNames::OUT_0, std::move(output0));
}
/// Input tensor identifiers
enum class InputNames
{
IN_0 = 0, ///< First input tensor (required)
IN_1 = 1, ///< Second input tensor (for binary ops)
IN_2 = 2, ///< Third input tensor (for ternary ops)
};
typedef InputNames input_names; ///< @brief Type alias for InputNames
/// Output tensor identifiers
enum class OutputNames
{
OUT_0 = 0, ///< Output tensor
};
typedef OutputNames output_names; ///< @brief Type alias for OutputNames
std::unordered_map<InputNames, std::shared_ptr<TensorAttributes>> inputs; ///< Input tensors
std::unordered_map<OutputNames, std::shared_ptr<TensorAttributes>> outputs; ///< Output tensors
// NOLINTBEGIN(readability-identifier-naming)
PointwiseMode mode = PointwiseMode::NOT_SET; ///< The operation mode
std::optional<float> relu_lower_clip = std::nullopt; ///< ReLU lower clip bound
std::optional<float> relu_upper_clip = std::nullopt; ///< ReLU upper clip bound
std::optional<float> relu_lower_clip_slope = std::nullopt; ///< Leaky ReLU slope
std::optional<int64_t> axis = std::nullopt; ///< Axis for reductions
std::optional<float> swish_beta = std::nullopt; ///< Swish beta parameter
std::optional<float> elu_alpha = std::nullopt; ///< ELU alpha parameter
std::optional<float> softplus_beta = std::nullopt; ///< Softplus beta parameter
// NOLINTEND(readability-identifier-naming)
};
typedef PointwiseAttributes Pointwise_attributes; ///< @brief Compatibility alias
} // namespace hipdnn_frontend::graph