#include "op_plugin/AclOpsInterface.h"
#include "op_plugin/utils/OpAdapter.h"
namespace acl_op {
using npu_preparation = at_npu::native::OpPreparation;
using npu_utils = at_npu::native::NpuUtils;
namespace {
std::tuple<at::Tensor&, at::Tensor&> slogdet_out_nocheck(
at::Tensor& sign,
at::Tensor& result,
const at::Tensor& self) {
at_npu::native::OpCommand cmd;
cmd.Name("LogMatrixDeterminant")
.Input(self)
.Output(sign)
.Output(result)
.Run();
return std::tie(sign, result);
}
}
std::tuple<at::Tensor, at::Tensor> slogdet(const at::Tensor& self) {
TORCH_CHECK(self.dim() >= 2, "input must be at least 2 dimensions" + OPS_ERROR(ErrCode::PARAM));
auto output_size = op_infer::array_to_small_vector(self.sizes());
output_size.erase(output_size.end() - 2, output_size.end());
at::Tensor sign = npu_preparation::apply_tensor(self, output_size);
at::Tensor y = npu_preparation::apply_tensor(self, output_size);
slogdet_out_nocheck(sign, y, self);
return std::tie(sign, y);
}
}