char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
890f1a27e
char/aliceai-t5-moe
1#include "../op_table.h" 2#include "../utils.h" 3 4#include <array> 5#include <cstdint> 6#include <openvino/op/constant.hpp> 7#include <openvino/op/gather.hpp> 8#include <openvino/op/pad.hpp> 9#include <openvino/op/reshape.hpp> 10#include <openvino/op/shape_of.hpp> 11#include <vector> 12 13namespace ov { 14namespace frontend { 15namespace ggml { 16namespace op { 17 18namespace { 19 20ov::Output < ov::Node > translate_circular_pad (ov::Output < ov::Node > input , 21const std::array < int32_t ,8 > & pads , 22const ov::Shape & input_shape ) { 23 ov::Output < ov::Node > result = input ; 24 25const std::array < int32_t ,4 > pads_begin = {pads [6 ],pads [4 ],pads [2 ],pads [0 ]}; 26const std::array < int32_t ,4 > pads_end = {pads [7 ],pads [5 ],pads [3 ],pads [1 ]}; 27 28for (size_t axis = 0 ;axis < input_shape .size ();++ axis ) { 29const int64_t input_dim = static_cast < int64_t > (input_shape [axis ]); 30const int64_t pad_begin = pads_begin [axis ]; 31const int64_t pad_end = pads_end [axis ]; 32 33if (pad_begin == 0 && pad_end == 0 ) { 34continue ; 35 } 36 37FRONT_END_CHECK_IMPLEMENTED (input_dim > 0 ,"Circular PAD requires static non-zero input dimensions" ); 38 39 std::vector < int64_t > indices (static_cast < size_t > (input_dim + pad_begin + pad_end )); 40for (int64_t index = 0 ;index < static_cast < int64_t > (indices .size ());++ index ) { 41int64_t wrapped = (index - pad_begin ) %input_dim ; 42if (wrapped < 0 ) { 43wrapped += input_dim ; 44 } 45indices [static_cast < size_t > (index )]= wrapped ; 46 } 47 48auto gather_indices = ov::op::v0::Constant ::create (ov::element::i64 , {indices .size ()},indices ); 49auto gather_axis = ov::op::v0::Constant ::create (ov::element::i64 , ov::Shape {}, {axis }); 50result = std::make_shared < ov::op::v8::Gather > (result ,gather_indices ,gather_axis ); 51 } 52 53return result ; 54} 55 56}// namespace 57 58OutputVector translate_pad (const NodeContext & context ) { 59num_inputs_check (context ,1 ,1 ); 60 61auto input = process_view_input_new (context ,0 ); 62if (context .get_input_shape (0 )== context .get_output_shape ()) { 63auto input_shape = std::make_shared < ov::op::v3::ShapeOf > (input ); 64auto res = std::make_shared < ov::op::v1::Reshape > (input ,input_shape , false); 65return rename_outputs_with_suffix ({res },context .get_name ()); 66 } 67 68const int32_t * op_params = context .get_output_op_params (); 69FRONT_END_CHECK_IMPLEMENTED (op_params != nullptr ,"PAD requires output op params" ); 70 71const std::array < int32_t ,8 > pads = {op_params [0 ],op_params [1 ],op_params [2 ],op_params [3 ], 72op_params [4 ],op_params [5 ],op_params [6 ],op_params [7 ]}; 73const bool circular = op_params [8 ]!= 0 ; 74 75if (circular ) { 76auto res = translate_circular_pad (input ,pads ,context .get_input_shape (0 ).to_shape ()); 77return rename_outputs_with_suffix ({res },context .get_name ()); 78 } 79 80const std::vector < int64_t > pads_begin = {pads [6 ],pads [4 ],pads [2 ],pads [0 ]}; 81const std::vector < int64_t > pads_end = {pads [7 ],pads [5 ],pads [3 ],pads [1 ]}; 82 83auto pads_begin_node = ov::op::v0::Constant ::create (ov::element::i64 , {pads_begin .size ()},pads_begin ); 84auto pads_end_node = ov::op::v0::Constant ::create (ov::element::i64 , {pads_end .size ()},pads_end ); 85auto pad_value = ov::op::v0::Constant ::create (context .get_input_type (0 ), ov::Shape {}, {0 }); 86auto res = 87 std::make_shared < ov::op::v1::Pad > (input ,pads_begin_node ,pads_end_node ,pad_value , ov::op::PadMode ::CONSTANT ); 88 89return rename_outputs_with_suffix ({res },context .get_name ()); 90} 91 92}// namespace op 93}// namespace ggml 94}// namespace frontend 95}// namespace ov