#include "../node_context.h" #include "../op_table.h" #include "../utils.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ov { namespace frontend { namespace ggml { namespace op { OutputVector translate_scale(const NodeContext & context) { num_inputs_check(context, 1, 1); float scale; float bias; memcpy(&scale, (float *) context.get_output_op_params() + 0, sizeof(float)); memcpy(&bias, (float *) context.get_output_op_params() + 1, sizeof(float)); auto scale_node = std::make_shared(ov::element::f32, ov::Shape{}, std::vector{scale}); if (context.get_op_case() == 1 && context.has_input("cache_rs_reset_len")) { auto cache_rs_reset_idx = context.get_input("cache_rs_reset_idx"); auto cache_rs_reset_len = context.get_input("cache_rs_reset_len"); auto cache_rs = context.get_input(0); auto cache_shape = std::make_shared(cache_rs, ov::element::i64); auto n_slots_1d = std::make_shared( cache_shape, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{1}, {2}), ov::op::v0::Constant::create(ov::element::i64, ov::Shape{}, {0})); auto n_slots = std::make_shared(n_slots_1d); auto iota = std::make_shared( ov::op::v0::Constant::create(ov::element::i64, ov::Shape{}, {0}), n_slots, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{}, {1}), ov::element::i64); auto idx_plus_len = std::make_shared(cache_rs_reset_idx, cache_rs_reset_len); auto less_than_idx = std::make_shared(iota, cache_rs_reset_idx); auto greater_equal_idx_plus_len = std::make_shared(iota, idx_plus_len); auto keep_mask = std::make_shared(less_than_idx, greater_equal_idx_plus_len); auto keep_mask_f32 = std::make_shared(keep_mask, ov::element::f32); auto keep_mask_reshape = std::make_shared( keep_mask_f32, ov::op::v0::Constant::create(ov::element::i64, ov::Shape{1}, {1})); auto cleared_cache_rs = std::make_shared(cache_rs, keep_mask_reshape); return rename_outputs_with_suffix({cleared_cache_rs}, context.get_name()); } auto scaled = std::make_shared(context.get_input(0), scale_node); std::shared_ptr res; if (bias != 0.0f) { auto bias_node = std::make_shared(ov::element::f32, ov::Shape{}, std::vector{bias}); res = std::make_shared(scaled, bias_node); } else { res = scaled; } return rename_outputs_with_suffix({res}, context.get_name()); } } // namespace op } // namespace ggml } // namespace frontend } // namespace ov