#include "../node_context.h"
#include "../op_table.h"
#include "../utils.h"
#include <memory>
#include <openvino/op/add.hpp>
#include <openvino/op/constant.hpp>
#include <openvino/op/divide.hpp>
#include <openvino/op/multiply.hpp>
#include <openvino/op/power.hpp>
#include <openvino/op/reduce_mean.hpp>
#include <openvino/op/sqrt.hpp>
#include <openvino/op/subtract.hpp>
namespace ov {
namespace frontend {
namespace ggml {
namespace op {
OutputVector translate_norm(const NodeContext & context) {
num_inputs_check(context, 1, 1);
auto input_node = process_view_input_new(context, 0);
auto mean = std::make_shared<ov::op::v1::ReduceMean>(
input_node, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{1}, {-1}), true);
auto centered = std::make_shared<ov::op::v1::Subtract>(input_node, mean);
auto squared = std::make_shared<ov::op::v1::Power>(
centered, ov::op::v0::Constant::create(ov::element::f32, ov::Shape{1}, {2.0f}));
auto variance = std::make_shared<ov::op::v1::ReduceMean>(
squared, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{1}, {-1}), true);
float eps;
memcpy(&eps, context.get_output_op_params(), sizeof(float));
auto std_dev = std::make_shared<ov::op::v0::Sqrt>(std::make_shared<ov::op::v1::Add>(
variance, ov::op::v0::Constant::create(ov::element::f32, ov::Shape{1}, {eps})));
auto res = std::make_shared<ov::op::v1::Divide>(centered, std_dev);
return rename_outputs_with_suffix({res}, context.get_name());
}
} } } }