已合并
feat: 增补UT覆盖率 #4126
likun104创建于 7月24日
feat: 增补UT覆盖率 #4126
已合并
共 29 个文件变更+4628-3
| @@ -479,7 +479,7 @@ TEST_F(TimeBatchFlowFuncSTest, timebatch_with_flag_and_batch_dim_3_drop_remainde | |||
| 479 | } | 479 | } |
| 480 | std::vector<void *> outs_mbuf_ptr(in_out_num, nullptr); | 480 | std::vector<void *> outs_mbuf_ptr(in_out_num, nullptr); |
| 481 | std::vector<bool> get_out(in_out_num, false); | 481 | std::vector<bool> get_out(in_out_num, false); |
| 482 | - constexpr uint64_t kMaxWaitInMs = 500; | 482 | + constexpr uint64_t kMaxWaitInMs = 5 * 1000; |
| 483 | uint64_t wait_in_ms = 0; | 483 | uint64_t wait_in_ms = 0; |
| 484 | int32_t get_out_num = 0; | 484 | int32_t get_out_num = 0; |
| 485 | while (wait_in_ms < kMaxWaitInMs) { | 485 | while (wait_in_ms < kMaxWaitInMs) { |
| @@ -527,4 +527,273 @@ TEST_F(DataSlice, ValidateAxisIndex_failed) { | |||
| 527 | const std::vector<std::vector<int64_t>> slice_info_new = {{1}}; | 527 | const std::vector<std::vector<int64_t>> slice_info_new = {{1}}; |
| 528 | EXPECT_EQ(false, DataSliceAdapter::ValidateAxisIndex(from_axis_new, slice_info_new, to_axis, cur_tensor_range)); | 528 | EXPECT_EQ(false, DataSliceAdapter::ValidateAxisIndex(from_axis_new, slice_info_new, to_axis, cur_tensor_range)); |
| 529 | } | 529 | } |
| 530 | + | ||
| 531 | +TEST_F(DataSlice, Cov_PrintOp) { | ||
| 532 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 533 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 534 | + output_desc.SetOriginShape(ge::GeShape({10, 20})); | ||
| 535 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 536 | + ge::AttrUtils::SetStr(output_desc, ge::ATTR_NAME_RESHAPE_INFER_TYPE, "NH"); | ||
| 537 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 538 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 539 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 540 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 541 | + ge::AttrUtils::SetStr(input_desc0, ge::ATTR_NAME_RESHAPE_INFER_TYPE, "NH"); | ||
| 542 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 543 | + EXPECT_NO_THROW(DataSliceAdapter::PrintOp(op_desc)); | ||
| 544 | +} | ||
| 545 | + | ||
| 546 | +TEST_F(DataSlice, Cov_PrintAxis_WithOri) { | ||
| 547 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 548 | + op_desc->AddOutputDesc("output", GeTensorDesc()); | ||
| 549 | + AxisTypeInfo info; | ||
| 550 | + info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 551 | + info.SetRelateInputs({{0, {0}}}); | ||
| 552 | + info.SetRelateOutputs({{0, {0}}}); | ||
| 553 | + info.SetOriRelateInputs({{0, {1}}}); | ||
| 554 | + info.SetOriRelateOutputs({{0, {1}}}); | ||
| 555 | + EXPECT_NO_THROW(DataSliceAdapter::PrintAxis(op_desc, {info}, "test_type", true)); | ||
| 556 | +} | ||
| 557 | + | ||
| 558 | +TEST_F(DataSlice, Cov_PrintAxis_WithoutOri) { | ||
| 559 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 560 | + op_desc->AddOutputDesc("output", GeTensorDesc()); | ||
| 561 | + AxisTypeInfo info; | ||
| 562 | + info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 563 | + info.SetRelateInputs({{0, {0}}}); | ||
| 564 | + info.SetRelateOutputs({{0, {0}}}); | ||
| 565 | + EXPECT_NO_THROW(DataSliceAdapter::PrintAxis(op_desc, {info}, "test_type", false)); | ||
| 566 | +} | ||
| 567 | + | ||
| 568 | +TEST_F(DataSlice, Cov_PrintSlice) { | ||
| 569 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 570 | + op_desc->AddOutputDesc("output", GeTensorDesc()); | ||
| 571 | + DataSliceAdapter::DataSliceType slice_info = {{{0, 10}, {20, 30}}, {{0, 5}}}; | ||
| 572 | + EXPECT_NO_THROW(DataSliceAdapter::PrintSlice(op_desc, slice_info, "input", "test_tag")); | ||
| 573 | +} | ||
| 574 | + | ||
| 575 | +TEST_F(DataSlice, Cov_PrintSlice_Empty) { | ||
| 576 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 577 | + op_desc->AddOutputDesc("output", GeTensorDesc()); | ||
| 578 | + DataSliceAdapter::DataSliceType slice_info; | ||
| 579 | + EXPECT_NO_THROW(DataSliceAdapter::PrintSlice(op_desc, slice_info, "output", "empty_tag")); | ||
| 580 | +} | ||
| 581 | + | ||
| 582 | +TEST_F(DataSlice, Cov_CheckOriInfo_True) { | ||
| 583 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 584 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 585 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 586 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 587 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 588 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 589 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 590 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 591 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 592 | + EXPECT_TRUE(DataSliceAdapter::CheckOriInfo(op_desc)); | ||
| 593 | +} | ||
| 594 | + | ||
| 595 | +TEST_F(DataSlice, Cov_CheckOriInfo_False_NoOrigin) { | ||
| 596 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 597 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 598 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 599 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 600 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 601 | + EXPECT_FALSE(DataSliceAdapter::CheckOriInfo(op_desc)); | ||
| 602 | +} | ||
| 603 | + | ||
| 604 | +TEST_F(DataSlice, Cov_TransAxisInfo_Elementwise) { | ||
| 605 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 606 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 607 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 608 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 609 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 610 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 611 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 612 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 613 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 614 | + std::vector<AxisTypeInfo> axis_type_vec; | ||
| 615 | + AxisTypeInfo info; | ||
| 616 | + info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 617 | + info.SetRelateInputs({{0, {1}}}); | ||
| 618 | + info.SetRelateOutputs({{0, {1}}}); | ||
| 619 | + axis_type_vec.push_back(info); | ||
| 620 | + EXPECT_NO_THROW(DataSliceAdapter::TransAxisInfo(op_desc, axis_type_vec)); | ||
| 621 | +} | ||
| 622 | + | ||
| 623 | +TEST_F(DataSlice, Cov_TransAxisInfo_ReduceMean) { | ||
| 624 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 625 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 626 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 627 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 628 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 629 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 630 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 631 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 632 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 633 | + std::vector<AxisTypeInfo> axis_type_vec; | ||
| 634 | + AxisTypeInfo info; | ||
| 635 | + info.SetAxisType(AxisType::REDUCEMEAN); | ||
| 636 | + info.SetRelateInputs({{0, {1}}}); | ||
| 637 | + info.SetRelateOutputs({{0, {1}}}); | ||
| 638 | + axis_type_vec.push_back(info); | ||
| 639 | + EXPECT_NO_THROW(DataSliceAdapter::TransAxisInfo(op_desc, axis_type_vec)); | ||
| 640 | +} | ||
| 641 | + | ||
| 642 | +TEST_F(DataSlice, Cov_TransAxisInfo_SlidingWindow) { | ||
| 643 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 644 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 645 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 646 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 647 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 648 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 649 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 650 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 651 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 652 | + std::vector<AxisTypeInfo> axis_type_vec; | ||
| 653 | + AxisTypeInfo info; | ||
| 654 | + info.SetAxisType(AxisType::SLIDINGWINDOW); | ||
| 655 | + info.SetRelateInputs({{0, {1}}}); | ||
| 656 | + info.SetRelateOutputs({{0, {1}}}); | ||
| 657 | + axis_type_vec.push_back(info); | ||
| 658 | + EXPECT_NO_THROW(DataSliceAdapter::TransAxisInfo(op_desc, axis_type_vec)); | ||
| 659 | +} | ||
| 660 | + | ||
| 661 | +TEST_F(DataSlice, Cov_TransAxisInfo_Unsplit) { | ||
| 662 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 663 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 664 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 665 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 666 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 667 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 668 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 669 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 670 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 671 | + std::vector<AxisTypeInfo> axis_type_vec; | ||
| 672 | + AxisTypeInfo info; | ||
| 673 | + info.SetAxisType(AxisType::UNSPLIT); | ||
| 674 | + info.SetRelateInputs({{0, {1}}}); | ||
| 675 | + info.SetRelateOutputs({{0, {1}}}); | ||
| 676 | + axis_type_vec.push_back(info); | ||
| 677 | + EXPECT_NO_THROW(DataSliceAdapter::TransAxisInfo(op_desc, axis_type_vec)); | ||
| 678 | +} | ||
| 679 | + | ||
| 680 | +TEST_F(DataSlice, Cov_TransAxisInfo_UnknownType) { | ||
| 681 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 682 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 683 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 684 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 685 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 686 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 687 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 688 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 689 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 690 | + std::vector<AxisTypeInfo> axis_type_vec; | ||
| 691 | + AxisTypeInfo info; | ||
| 692 | + info.SetAxisType(static_cast<AxisType>(999)); | ||
| 693 | + info.SetRelateInputs({{0, {1}}}); | ||
| 694 | + info.SetRelateOutputs({{0, {1}}}); | ||
| 695 | + axis_type_vec.push_back(info); | ||
| 696 | + EXPECT_NO_THROW(DataSliceAdapter::TransAxisInfo(op_desc, axis_type_vec)); | ||
| 697 | +} | ||
| 698 | + | ||
| 699 | +TEST_F(DataSlice, Cov_GetOriOutputSlice) { | ||
| 700 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 701 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 702 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 703 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 704 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 705 | + AxisTypeInfo info; | ||
| 706 | + info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 707 | + info.SetOriRelateInputs({{0, {0}}}); | ||
| 708 | + info.SetOriRelateOutputs({{0, {0}}}); | ||
| 709 | + DataSliceAdapter::DataSliceType ori_output_slice; | ||
| 710 | + auto ret = DataSliceAdapter::GetOriOutputSlice(op_desc, info, ori_output_slice); | ||
| 711 | + EXPECT_EQ(ret, SUCCESS); | ||
| 712 | +} | ||
| 713 | + | ||
| 714 | +TEST_F(DataSlice, Cov_GetCurInputSlice) { | ||
| 715 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 716 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 717 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 718 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 719 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 720 | + AxisTypeInfo info; | ||
| 721 | + info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 722 | + info.SetOriRelateInputs({{0, {0}}}); | ||
| 723 | + info.SetOriRelateOutputs({{0, {0}}}); | ||
| 724 | + DataSliceAdapter::DataSliceType ori_input_slice; | ||
| 725 | + DataSliceAdapter::DataSliceType cur_input_slice; | ||
| 726 | + auto ret = DataSliceAdapter::GetCurInputSlice(op_desc, info, ori_input_slice, cur_input_slice); | ||
| 727 | + EXPECT_EQ(ret, SUCCESS); | ||
| 728 | +} | ||
| 729 | + | ||
| 730 | +TEST_F(DataSlice, Cov_SetOriOpInfoAndSetCurOpInfo) { | ||
| 731 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Add", "Add"); | ||
| 732 | + GeTensorDesc output_desc(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 733 | + output_desc.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 734 | + output_desc.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 735 | + op_desc->AddOutputDesc("output0", output_desc); | ||
| 736 | + GeTensorDesc input_desc0(ge::GeShape({10, 3, 20, 30, 16}), ge::Format::FORMAT_NC1HWC0); | ||
| 737 | + input_desc0.SetOriginShape(ge::GeShape({10, 20, 30, 40})); | ||
| 738 | + input_desc0.SetOriginFormat(ge::Format::FORMAT_NHWC); | ||
| 739 | + op_desc->AddInputDesc("input0", input_desc0); | ||
| 740 | + std::vector<std::pair<Format, GeShape>> cache_input_info; | ||
| 741 | + std::vector<std::pair<Format, GeShape>> cache_output_info; | ||
| 742 | + EXPECT_NO_THROW(DataSliceAdapter::SetOriOpInfo(op_desc, cache_input_info, cache_output_info)); | ||
| 743 | + EXPECT_NO_THROW(DataSliceAdapter::SetCurOpInfo(op_desc, cache_input_info, cache_output_info)); | ||
| 744 | +} | ||
| 745 | + | ||
| 746 | +TEST_F(DataSlice, Cov_GetTmpAxisTypeInfo) { | ||
| 747 | + AxisTypeInfo info; | ||
| 748 | + info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 749 | + info.SetRelateInputs({{0, {0}}}); | ||
| 750 | + info.SetRelateOutputs({{0, {0}}}); | ||
| 751 | + info.SetOriRelateInputs({{0, {1}}}); | ||
| 752 | + info.SetOriRelateOutputs({{0, {1}}}); | ||
| 753 | + auto tmp = DataSliceAdapter::GetTmpAxisTypeInfo(info); | ||
| 754 | + EXPECT_EQ(tmp.GetAxisType(), AxisType::ELEMENTWISE); | ||
| 755 | +} | ||
| 756 | + | ||
| 757 | +TEST_F(DataSlice, Cov_DataSliceHelper_InferAxisSlice_Unsplit) { | ||
| 758 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Cast", "Cast"); | ||
| 759 | + op_desc->AddOutputDesc("output", GeTensorDesc()); | ||
| 760 | + op_desc->AddInputDesc("input", GeTensorDesc()); | ||
| 761 | + AxisTypeInfo axis_type_info; | ||
| 762 | + axis_type_info.SetAxisType(AxisType::UNSPLIT); | ||
| 763 | + CutInfo input_cut_info{0, {0}}; | ||
| 764 | + axis_type_info.AddInputCutInfo(input_cut_info); | ||
| 765 | + CutInfo output_cut_info{0, {0}}; | ||
| 766 | + axis_type_info.AddOutputCutInfo(output_cut_info); | ||
| 767 | + Status ret = DataSliceHelper::InferAxisSlice(op_desc, axis_type_info); | ||
| 768 | + EXPECT_EQ(ret, SUCCESS); | ||
| 769 | +} | ||
| 770 | + | ||
| 771 | +TEST_F(DataSlice, Cov_DataSliceElementwiseImpl_EmptyOutput) { | ||
| 772 | + OpDescPtr op_desc = std::make_shared<OpDesc>("Cast", "Cast"); | ||
| 773 | + op_desc->AddOutputDesc("output", GeTensorDesc()); | ||
| 774 | + op_desc->AddInputDesc("input", GeTensorDesc()); | ||
| 775 | + AxisTypeInfo axis_type_info; | ||
| 776 | + axis_type_info.SetAxisType(AxisType::ELEMENTWISE); | ||
| 777 | + CutInfo input_cut_info{0, {0}}; | ||
| 778 | + axis_type_info.AddInputCutInfo(input_cut_info); | ||
| 779 | + CutInfo output_cut_info{0, {0}}; | ||
| 780 | + axis_type_info.AddOutputCutInfo(output_cut_info); | ||
| 781 | + DataSliceType out_data_slice; | ||
| 782 | + DataSliceType in_data_slice; | ||
| 783 | + Operator op_proxy = OpDescUtils::CreateOperatorFromOpDesc(op_desc); | ||
| 784 | + DataSliceElementwiseImpl impl; | ||
| 785 | + auto ret = impl.InferAxisSlice(op_proxy, axis_type_info, out_data_slice, in_data_slice); | ||
| 786 | + EXPECT_NE(ret, SUCCESS); | ||
| 787 | +} | ||
| 788 | + | ||
| 789 | +TEST_F(DataSlice, Cov_DataSliceElementwiseImpl_NullOpDesc) { | ||
| 790 | + OpDescPtr null_op_desc = nullptr; | ||
| 791 | + AxisTypeInfo axis_type_info; | ||
| 792 | + DataSliceType out_data_slice; | ||
| 793 | + DataSliceType in_data_slice; | ||
| 794 | + DataSliceElementwiseImpl impl; | ||
| 795 | + Operator op_proxy; | ||
| 796 | + auto ret = impl.InferAxisSlice(op_proxy, axis_type_info, out_data_slice, in_data_slice); | ||
| 797 | + EXPECT_NE(ret, SUCCESS); | ||
| 798 | +} | ||
| 530 | } // namespace ge | 799 | } // namespace ge |
| @@ -1118,3 +1118,105 @@ TEST_F(UtestGraphPassesFoldingKernelGatherV2Kernel, AxisNotScalarFail) { | |||
| 1118 | ge::Status status = kernel->Compute(op_desc_ptr, input, outputs); | 1118 | ge::Status status = kernel->Compute(op_desc_ptr, input, outputs); |
| 1119 | EXPECT_NE(ge::SUCCESS, status); | 1119 | EXPECT_NE(ge::SUCCESS, status); |
| 1120 | } | 1120 | } |
| 1121 | + | ||
| 1122 | +TEST_F(UtestGraphPassesFoldingKernelGatherV2Kernel, CovAxisInvalidDataType) { | ||
| 1123 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("GatherV2", "GatherV2"); | ||
| 1124 | + | ||
| 1125 | + vector<int64_t> x_shape = {3}; | ||
| 1126 | + vector<int64_t> indices_shape = {2}; | ||
| 1127 | + GeTensorDesc tensor_desc_x(GeShape(x_shape), FORMAT_NHWC, DT_INT32); | ||
| 1128 | + GeTensorDesc tensor_desc_indices(GeShape(indices_shape), FORMAT_NHWC, DT_INT32); | ||
| 1129 | + GeTensorDesc tensor_desc_axis(GeShape(), FORMAT_NHWC, DT_FLOAT); | ||
| 1130 | + | ||
| 1131 | + op_desc_ptr->AddInputDesc(0, tensor_desc_x); | ||
| 1132 | + op_desc_ptr->AddInputDesc(1, tensor_desc_indices); | ||
| 1133 | + op_desc_ptr->AddInputDesc(2, tensor_desc_axis); | ||
| 1134 | + | ||
| 1135 | + vector<int32_t> data_vec_0 = {1, 2, 3}; | ||
| 1136 | + vector<int32_t> data_vec_1 = {0, 1}; | ||
| 1137 | + vector<float> axis_vec = {0.0f}; | ||
| 1138 | + GeTensorDesc tensor_desc_0(GeShape(x_shape), FORMAT_NHWC, DT_INT32); | ||
| 1139 | + GeTensorDesc tensor_desc_1(GeShape(indices_shape), FORMAT_NHWC, DT_INT32); | ||
| 1140 | + GeTensorDesc tensor_desc_2(GeShape(), FORMAT_NHWC, DT_FLOAT); | ||
| 1141 | + ConstGeTensorPtr tensor_0 = | ||
| 1142 | + std::make_shared<GeTensor>(tensor_desc_0, (uint8_t *)data_vec_0.data(), data_vec_0.size() * sizeof(int32_t)); | ||
| 1143 | + ConstGeTensorPtr tensor_1 = | ||
| 1144 | + std::make_shared<GeTensor>(tensor_desc_1, (uint8_t *)data_vec_1.data(), data_vec_1.size() * sizeof(int32_t)); | ||
| 1145 | + ConstGeTensorPtr tensor_2 = | ||
| 1146 | + std::make_shared<GeTensor>(tensor_desc_2, (uint8_t *)axis_vec.data(), axis_vec.size() * sizeof(float)); | ||
| 1147 | + | ||
| 1148 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2}; | ||
| 1149 | + vector<GeTensorPtr> outputs; | ||
| 1150 | + | ||
| 1151 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(GATHERV2); | ||
| 1152 | + ge::Status status = kernel->Compute(op_desc_ptr, input, outputs); | ||
| 1153 | + EXPECT_NE(ge::SUCCESS, status); | ||
| 1154 | +} | ||
| 1155 | + | ||
| 1156 | +TEST_F(UtestGraphPassesFoldingKernelGatherV2Kernel, CovAxisExceedFourDims) { | ||
| 1157 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("GatherV2", "GatherV2"); | ||
| 1158 | + | ||
| 1159 | + vector<int64_t> x_shape = {2, 2, 2, 2, 3}; | ||
| 1160 | + vector<int64_t> indices_shape = {2}; | ||
| 1161 | + GeTensorDesc tensor_desc_x(GeShape(x_shape), FORMAT_NHWC, DT_INT32); | ||
| 1162 | + GeTensorDesc tensor_desc_indices(GeShape(indices_shape), FORMAT_NHWC, DT_INT32); | ||
| 1163 | + GeTensorDesc tensor_desc_axis(GeShape(), FORMAT_NHWC, DT_INT32); | ||
| 1164 | + | ||
| 1165 | + op_desc_ptr->AddInputDesc(0, tensor_desc_x); | ||
| 1166 | + op_desc_ptr->AddInputDesc(1, tensor_desc_indices); | ||
| 1167 | + op_desc_ptr->AddInputDesc(2, tensor_desc_axis); | ||
| 1168 | + | ||
| 1169 | + vector<int32_t> data_vec_0(48, 1); | ||
| 1170 | + vector<int32_t> data_vec_1 = {0, 1}; | ||
| 1171 | + vector<int32_t> axis_vec = {4}; | ||
| 1172 | + GeTensorDesc tensor_desc_0(GeShape(x_shape), FORMAT_NHWC, DT_INT32); | ||
| 1173 | + GeTensorDesc tensor_desc_1(GeShape(indices_shape), FORMAT_NHWC, DT_INT32); | ||
| 1174 | + GeTensorDesc tensor_desc_2(GeShape(), FORMAT_NHWC, DT_INT32); | ||
| 1175 | + ConstGeTensorPtr tensor_0 = | ||
| 1176 | + std::make_shared<GeTensor>(tensor_desc_0, (uint8_t *)data_vec_0.data(), data_vec_0.size() * sizeof(int32_t)); | ||
| 1177 | + ConstGeTensorPtr tensor_1 = | ||
| 1178 | + std::make_shared<GeTensor>(tensor_desc_1, (uint8_t *)data_vec_1.data(), data_vec_1.size() * sizeof(int32_t)); | ||
| 1179 | + ConstGeTensorPtr tensor_2 = | ||
| 1180 | + std::make_shared<GeTensor>(tensor_desc_2, (uint8_t *)axis_vec.data(), axis_vec.size() * sizeof(int32_t)); | ||
| 1181 | + | ||
| 1182 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2}; | ||
| 1183 | + vector<GeTensorPtr> outputs; | ||
| 1184 | + | ||
| 1185 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(GATHERV2); | ||
| 1186 | + ge::Status status = kernel->Compute(op_desc_ptr, input, outputs); | ||
| 1187 | + EXPECT_NE(ge::SUCCESS, status); | ||
| 1188 | +} | ||
| 1189 | + | ||
| 1190 | +TEST_F(UtestGraphPassesFoldingKernelGatherV2Kernel, CovOutputZeroDim) { | ||
| 1191 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("GatherV2", "GatherV2"); | ||
| 1192 | + | ||
| 1193 | + vector<int64_t> x_shape = {3, 0}; | ||
| 1194 | + vector<int64_t> indices_shape = {1}; | ||
| 1195 | + GeTensorDesc tensor_desc_x(GeShape(x_shape), FORMAT_NHWC, DT_INT32); | ||
| 1196 | + GeTensorDesc tensor_desc_indices(GeShape(indices_shape), FORMAT_NHWC, DT_INT32); | ||
| 1197 | + GeTensorDesc tensor_desc_axis(GeShape(), FORMAT_NHWC, DT_INT32); | ||
| 1198 | + | ||
| 1199 | + op_desc_ptr->AddInputDesc(0, tensor_desc_x); | ||
| 1200 | + op_desc_ptr->AddInputDesc(1, tensor_desc_indices); | ||
| 1201 | + op_desc_ptr->AddInputDesc(2, tensor_desc_axis); | ||
| 1202 | + | ||
| 1203 | + vector<int32_t> data_vec_0 = {1, 2, 3, 4, 5, 6}; | ||
| 1204 | + vector<int32_t> data_vec_1 = {0}; | ||
| 1205 | + vector<int32_t> axis_vec = {0}; | ||
| 1206 | + GeTensorDesc tensor_desc_0(GeShape(x_shape), FORMAT_NHWC, DT_INT32); | ||
| 1207 | + GeTensorDesc tensor_desc_1(GeShape(indices_shape), FORMAT_NHWC, DT_INT32); | ||
| 1208 | + GeTensorDesc tensor_desc_2(GeShape(), FORMAT_NHWC, DT_INT32); | ||
| 1209 | + ConstGeTensorPtr tensor_0 = | ||
| 1210 | + std::make_shared<GeTensor>(tensor_desc_0, (uint8_t *)data_vec_0.data(), data_vec_0.size() * sizeof(int32_t)); | ||
| 1211 | + ConstGeTensorPtr tensor_1 = | ||
| 1212 | + std::make_shared<GeTensor>(tensor_desc_1, (uint8_t *)data_vec_1.data(), data_vec_1.size() * sizeof(int32_t)); | ||
| 1213 | + ConstGeTensorPtr tensor_2 = | ||
| 1214 | + std::make_shared<GeTensor>(tensor_desc_2, (uint8_t *)axis_vec.data(), axis_vec.size() * sizeof(int32_t)); | ||
| 1215 | + | ||
| 1216 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2}; | ||
| 1217 | + vector<GeTensorPtr> outputs; | ||
| 1218 | + | ||
| 1219 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(GATHERV2); | ||
| 1220 | + ge::Status status = kernel->Compute(op_desc_ptr, input, outputs); | ||
| 1221 | + EXPECT_NE(ge::SUCCESS, status); | ||
| 1222 | +} | ||
| @@ -201,3 +201,253 @@ TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CheckOutputDims1) { | |||
| 201 | Status status = slice_d_kernel.CheckOutputDims(output_dims, op_desc_ptr); | 201 | Status status = slice_d_kernel.CheckOutputDims(output_dims, op_desc_ptr); |
| 202 | EXPECT_EQ(SUCCESS, status); | 202 | EXPECT_EQ(SUCCESS, status); |
| 203 | } | 203 | } |
| 204 | + | ||
| 205 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovComputeSuccess) { | ||
| 206 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 207 | + GeTensorDesc input_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 208 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 209 | + GeTensorDesc output_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 210 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 211 | + | ||
| 212 | + vector<int64_t> offsets = {1}; | ||
| 213 | + vector<int64_t> sizes = {2}; | ||
| 214 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 215 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 216 | + | ||
| 217 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 218 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 219 | + ConstGeTensorPtr tensor = | ||
| 220 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 221 | + | ||
| 222 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 223 | + vector<GeTensorPtr> outputs; | ||
| 224 | + | ||
| 225 | + SliceDKernel slice_d_kernel; | ||
| 226 | + Status status = slice_d_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 227 | + EXPECT_EQ(SUCCESS, status); | ||
| 228 | + EXPECT_EQ(outputs.size(), 1); | ||
| 229 | +} | ||
| 230 | + | ||
| 231 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovComputeSizeMinusOne) { | ||
| 232 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 233 | + GeTensorDesc input_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 234 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 235 | + GeTensorDesc output_desc(GeShape({3}), FORMAT_NCHW, DT_INT32); | ||
| 236 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 237 | + | ||
| 238 | + vector<int64_t> offsets = {1}; | ||
| 239 | + vector<int64_t> sizes = {-1}; | ||
| 240 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 241 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 242 | + | ||
| 243 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 244 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 245 | + ConstGeTensorPtr tensor = | ||
| 246 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 247 | + | ||
| 248 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 249 | + vector<GeTensorPtr> outputs; | ||
| 250 | + | ||
| 251 | + SliceDKernel slice_d_kernel; | ||
| 252 | + Status status = slice_d_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 253 | + EXPECT_EQ(SUCCESS, status); | ||
| 254 | +} | ||
| 255 | + | ||
| 256 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovComputeZeroDim) { | ||
| 257 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 258 | + GeTensorDesc input_desc(GeShape({4, 0}), FORMAT_NCHW, DT_INT32); | ||
| 259 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 260 | + GeTensorDesc output_desc(GeShape({2, 0}), FORMAT_NCHW, DT_INT32); | ||
| 261 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 262 | + | ||
| 263 | + vector<int64_t> offsets = {1, 0}; | ||
| 264 | + vector<int64_t> sizes = {2, 0}; | ||
| 265 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 266 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 267 | + | ||
| 268 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 269 | + GeTensorDesc tensor_desc(GeShape({4, 0}), FORMAT_NCHW, DT_INT32); | ||
| 270 | + ConstGeTensorPtr tensor = | ||
| 271 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 272 | + | ||
| 273 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 274 | + vector<GeTensorPtr> outputs; | ||
| 275 | + | ||
| 276 | + SliceDKernel slice_d_kernel; | ||
| 277 | + Status status = slice_d_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 278 | + EXPECT_EQ(SUCCESS, status); | ||
| 279 | +} | ||
| 280 | + | ||
| 281 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovComputeSizeOverflow) { | ||
| 282 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 283 | + GeTensorDesc input_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 284 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 285 | + GeTensorDesc output_desc(GeShape({3}), FORMAT_NCHW, DT_INT32); | ||
| 286 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 287 | + | ||
| 288 | + vector<int64_t> offsets = {2}; | ||
| 289 | + vector<int64_t> sizes = {3}; | ||
| 290 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 291 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 292 | + | ||
| 293 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 294 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 295 | + ConstGeTensorPtr tensor = | ||
| 296 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 297 | + | ||
| 298 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 299 | + vector<GeTensorPtr> outputs; | ||
| 300 | + | ||
| 301 | + SliceDKernel slice_d_kernel; | ||
| 302 | + Status status = slice_d_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 303 | + EXPECT_EQ(NOT_CHANGED, status); | ||
| 304 | +} | ||
| 305 | + | ||
| 306 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovSliceDCheckNullTensor) { | ||
| 307 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 308 | + GeTensorDesc input_desc; | ||
| 309 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 310 | + GeTensorDesc output_desc; | ||
| 311 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 312 | + | ||
| 313 | + vector<ConstGeTensorPtr> input = {nullptr}; | ||
| 314 | + | ||
| 315 | + SliceDKernel slice_d_kernel; | ||
| 316 | + std::vector<int64_t> begin_list; | ||
| 317 | + std::vector<int64_t> size_list; | ||
| 318 | + Status status = slice_d_kernel.SliceDCheck(op_desc_ptr, input, begin_list, size_list); | ||
| 319 | + EXPECT_EQ(PARAM_INVALID, status); | ||
| 320 | +} | ||
| 321 | + | ||
| 322 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovSliceDCheckZeroData) { | ||
| 323 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 324 | + GeTensorDesc input_desc(GeShape(), FORMAT_NCHW, DT_INT32); | ||
| 325 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 326 | + GeTensorDesc output_desc; | ||
| 327 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 328 | + | ||
| 329 | + vector<int64_t> offsets = {0}; | ||
| 330 | + vector<int64_t> sizes = {1}; | ||
| 331 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 332 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 333 | + | ||
| 334 | + GeTensorDesc tensor_desc(GeShape(), FORMAT_NCHW, DT_INT32); | ||
| 335 | + ConstGeTensorPtr tensor = std::make_shared<GeTensor>(tensor_desc); | ||
| 336 | + | ||
| 337 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 338 | + | ||
| 339 | + SliceDKernel slice_d_kernel; | ||
| 340 | + std::vector<int64_t> begin_list; | ||
| 341 | + std::vector<int64_t> size_list; | ||
| 342 | + Status status = slice_d_kernel.SliceDCheck(op_desc_ptr, input, begin_list, size_list); | ||
| 343 | + EXPECT_EQ(PARAM_INVALID, status); | ||
| 344 | +} | ||
| 345 | + | ||
| 346 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovSliceDCheckGetBeginFail) { | ||
| 347 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 348 | + GeTensorDesc input_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 349 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 350 | + GeTensorDesc output_desc; | ||
| 351 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 352 | + | ||
| 353 | + vector<int64_t> sizes = {2}; | ||
| 354 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 355 | + | ||
| 356 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 357 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 358 | + ConstGeTensorPtr tensor = | ||
| 359 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 360 | + | ||
| 361 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 362 | + | ||
| 363 | + SliceDKernel slice_d_kernel; | ||
| 364 | + std::vector<int64_t> begin_list; | ||
| 365 | + std::vector<int64_t> size_list; | ||
| 366 | + Status status = slice_d_kernel.SliceDCheck(op_desc_ptr, input, begin_list, size_list); | ||
| 367 | + EXPECT_EQ(PARAM_INVALID, status); | ||
| 368 | +} | ||
| 369 | + | ||
| 370 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovSliceDCheckGetSizeFail) { | ||
| 371 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 372 | + GeTensorDesc input_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 373 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 374 | + GeTensorDesc output_desc; | ||
| 375 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 376 | + | ||
| 377 | + vector<int64_t> offsets = {1}; | ||
| 378 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 379 | + | ||
| 380 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 381 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 382 | + ConstGeTensorPtr tensor = | ||
| 383 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 384 | + | ||
| 385 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 386 | + | ||
| 387 | + SliceDKernel slice_d_kernel; | ||
| 388 | + std::vector<int64_t> begin_list; | ||
| 389 | + std::vector<int64_t> size_list; | ||
| 390 | + Status status = slice_d_kernel.SliceDCheck(op_desc_ptr, input, begin_list, size_list); | ||
| 391 | + EXPECT_EQ(PARAM_INVALID, status); | ||
| 392 | +} | ||
| 393 | + | ||
| 394 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovSliceDCheckDimMismatch) { | ||
| 395 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 396 | + GeTensorDesc input_desc(GeShape({4, 2}), FORMAT_NCHW, DT_INT32); | ||
| 397 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 398 | + GeTensorDesc output_desc; | ||
| 399 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 400 | + | ||
| 401 | + vector<int64_t> offsets = {0}; | ||
| 402 | + vector<int64_t> sizes = {2}; | ||
| 403 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 404 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 405 | + | ||
| 406 | + vector<int32_t> data_vec = {1, 2, 3, 4, 5, 6, 7, 8}; | ||
| 407 | + GeTensorDesc tensor_desc(GeShape({4, 2}), FORMAT_NCHW, DT_INT32); | ||
| 408 | + ConstGeTensorPtr tensor = | ||
| 409 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 410 | + | ||
| 411 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 412 | + | ||
| 413 | + SliceDKernel slice_d_kernel; | ||
| 414 | + std::vector<int64_t> begin_list; | ||
| 415 | + std::vector<int64_t> size_list; | ||
| 416 | + Status status = slice_d_kernel.SliceDCheck(op_desc_ptr, input, begin_list, size_list); | ||
| 417 | + EXPECT_EQ(PARAM_INVALID, status); | ||
| 418 | +} | ||
| 419 | + | ||
| 420 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovSliceDCheckDimOutOfRange) { | ||
| 421 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 422 | + GeTensorDesc input_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 423 | + op_desc_ptr->AddInputDesc(0, input_desc); | ||
| 424 | + GeTensorDesc output_desc; | ||
| 425 | + op_desc_ptr->AddOutputDesc(output_desc); | ||
| 426 | + | ||
| 427 | + vector<int64_t> offsets = {-1}; | ||
| 428 | + vector<int64_t> sizes = {2}; | ||
| 429 | + AttrUtils::SetListInt(op_desc_ptr, "offsets", offsets); | ||
| 430 | + AttrUtils::SetListInt(op_desc_ptr, "size", sizes); | ||
| 431 | + | ||
| 432 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 433 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_INT32); | ||
| 434 | + ConstGeTensorPtr tensor = | ||
| 435 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 436 | + | ||
| 437 | + vector<ConstGeTensorPtr> input = {tensor}; | ||
| 438 | + | ||
| 439 | + SliceDKernel slice_d_kernel; | ||
| 440 | + std::vector<int64_t> begin_list; | ||
| 441 | + std::vector<int64_t> size_list; | ||
| 442 | + Status status = slice_d_kernel.SliceDCheck(op_desc_ptr, input, begin_list, size_list); | ||
| 443 | + EXPECT_EQ(PARAM_INVALID, status); | ||
| 444 | +} | ||
| 445 | + | ||
| 446 | +TEST_F(UtestGraphPassesFoldingKernelSliceDKernel, CovCheckOutputDimsAllNonPositive) { | ||
| 447 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("SLICED", SLICED); | ||
| 448 | + std::vector<int64_t> output_dims = {0, -1, 0}; | ||
| 449 | + | ||
| 450 | + SliceDKernel slice_d_kernel; | ||
| 451 | + Status status = slice_d_kernel.CheckOutputDims(output_dims, op_desc_ptr); | ||
| 452 | + EXPECT_EQ(NOT_CHANGED, status); | ||
| 453 | +} | ||
| @@ -458,3 +458,231 @@ TEST_F(UtestFoldingSliceKernel, InputCheckFailed) { | |||
| 458 | ret = slice_kerel.Compute(node->GetOpDesc(), input, v_output); | 458 | ret = slice_kerel.Compute(node->GetOpDesc(), input, v_output); |
| 459 | EXPECT_EQ(NOT_CHANGED, ret); | 459 | EXPECT_EQ(NOT_CHANGED, ret); |
| 460 | } | 460 | } |
| 461 | + | ||
| 462 | +TEST_F(UtestFoldingSliceKernel, CovSliceInt32BeginSizeSuccess) { | ||
| 463 | + vector<int64_t> dims_vec_x = {4}; | ||
| 464 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 465 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_INT32); | ||
| 466 | + ConstGeTensorPtr tensor_x = | ||
| 467 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 468 | + | ||
| 469 | + vector<int64_t> dims_vec_begin = {1}; | ||
| 470 | + vector<int32_t> data_vec_begin = {1}; | ||
| 471 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_INT32); | ||
| 472 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 473 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 474 | + | ||
| 475 | + vector<int64_t> dims_vec_size = {1}; | ||
| 476 | + vector<int32_t> data_vec_size = {2}; | ||
| 477 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_INT32); | ||
| 478 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 479 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 480 | + | ||
| 481 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 482 | + | ||
| 483 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 484 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 485 | + | ||
| 486 | + SliceKernel slice_kernel; | ||
| 487 | + vector<GeTensorPtr> outputs; | ||
| 488 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 489 | + EXPECT_EQ(SUCCESS, ret); | ||
| 490 | + EXPECT_EQ(outputs.size(), 1); | ||
| 491 | + auto ret_shape = outputs.at(0)->GetTensorDesc().GetShape(); | ||
| 492 | + EXPECT_EQ(ret_shape.GetDim(0), 2); | ||
| 493 | +} | ||
| 494 | + | ||
| 495 | +TEST_F(UtestFoldingSliceKernel, CovSliceInt32NegativeSize) { | ||
| 496 | + vector<int64_t> dims_vec_x = {4}; | ||
| 497 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 498 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_INT32); | ||
| 499 | + ConstGeTensorPtr tensor_x = | ||
| 500 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 501 | + | ||
| 502 | + vector<int64_t> dims_vec_begin = {1}; | ||
| 503 | + vector<int32_t> data_vec_begin = {1}; | ||
| 504 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_INT32); | ||
| 505 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 506 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 507 | + | ||
| 508 | + vector<int64_t> dims_vec_size = {1}; | ||
| 509 | + vector<int32_t> data_vec_size = {-1}; | ||
| 510 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_INT32); | ||
| 511 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 512 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 513 | + | ||
| 514 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 515 | + | ||
| 516 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 517 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 518 | + | ||
| 519 | + SliceKernel slice_kernel; | ||
| 520 | + vector<GeTensorPtr> outputs; | ||
| 521 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 522 | + EXPECT_EQ(SUCCESS, ret); | ||
| 523 | + EXPECT_EQ(outputs.size(), 1); | ||
| 524 | + auto ret_shape = outputs.at(0)->GetTensorDesc().GetShape(); | ||
| 525 | + EXPECT_EQ(ret_shape.GetDim(0), 3); | ||
| 526 | +} | ||
| 527 | + | ||
| 528 | +TEST_F(UtestFoldingSliceKernel, CovSliceRankMismatch) { | ||
| 529 | + vector<int64_t> dims_vec_x = {4}; | ||
| 530 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 531 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_INT32); | ||
| 532 | + ConstGeTensorPtr tensor_x = | ||
| 533 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 534 | + | ||
| 535 | + vector<int64_t> dims_vec_begin = {2}; | ||
| 536 | + vector<int32_t> data_vec_begin = {0, 1}; | ||
| 537 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_INT32); | ||
| 538 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 539 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 540 | + | ||
| 541 | + vector<int64_t> dims_vec_size = {2}; | ||
| 542 | + vector<int32_t> data_vec_size = {1, 1}; | ||
| 543 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_INT32); | ||
| 544 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 545 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 546 | + | ||
| 547 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 548 | + | ||
| 549 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 550 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 551 | + | ||
| 552 | + SliceKernel slice_kernel; | ||
| 553 | + vector<GeTensorPtr> outputs; | ||
| 554 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 555 | + EXPECT_EQ(NOT_CHANGED, ret); | ||
| 556 | +} | ||
| 557 | + | ||
| 558 | +TEST_F(UtestFoldingSliceKernel, CovSliceNullInputTensor) { | ||
| 559 | + vector<ConstGeTensorPtr> input = {nullptr, nullptr, nullptr}; | ||
| 560 | + | ||
| 561 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 562 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 563 | + | ||
| 564 | + SliceKernel slice_kernel; | ||
| 565 | + vector<GeTensorPtr> outputs; | ||
| 566 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 567 | + EXPECT_EQ(NOT_CHANGED, ret); | ||
| 568 | +} | ||
| 569 | + | ||
| 570 | +TEST_F(UtestFoldingSliceKernel, CovSliceUnsupportedXType) { | ||
| 571 | + vector<int64_t> dims_vec_x = {4}; | ||
| 572 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 573 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_STRING); | ||
| 574 | + ConstGeTensorPtr tensor_x = | ||
| 575 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 576 | + | ||
| 577 | + vector<int64_t> dims_vec_begin = {1}; | ||
| 578 | + vector<int32_t> data_vec_begin = {1}; | ||
| 579 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_INT32); | ||
| 580 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 581 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 582 | + | ||
| 583 | + vector<int64_t> dims_vec_size = {1}; | ||
| 584 | + vector<int32_t> data_vec_size = {2}; | ||
| 585 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_INT32); | ||
| 586 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 587 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 588 | + | ||
| 589 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 590 | + | ||
| 591 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 592 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 593 | + | ||
| 594 | + SliceKernel slice_kernel; | ||
| 595 | + vector<GeTensorPtr> outputs; | ||
| 596 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 597 | + EXPECT_EQ(NOT_CHANGED, ret); | ||
| 598 | +} | ||
| 599 | + | ||
| 600 | +TEST_F(UtestFoldingSliceKernel, CovSliceUnsupportedBeginType) { | ||
| 601 | + vector<int64_t> dims_vec_x = {4}; | ||
| 602 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 603 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_INT32); | ||
| 604 | + ConstGeTensorPtr tensor_x = | ||
| 605 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 606 | + | ||
| 607 | + vector<int64_t> dims_vec_begin = {1}; | ||
| 608 | + vector<int32_t> data_vec_begin = {1}; | ||
| 609 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_FLOAT); | ||
| 610 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 611 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 612 | + | ||
| 613 | + vector<int64_t> dims_vec_size = {1}; | ||
| 614 | + vector<int32_t> data_vec_size = {2}; | ||
| 615 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_INT32); | ||
| 616 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 617 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 618 | + | ||
| 619 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 620 | + | ||
| 621 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 622 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 623 | + | ||
| 624 | + SliceKernel slice_kernel; | ||
| 625 | + vector<GeTensorPtr> outputs; | ||
| 626 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 627 | + EXPECT_EQ(NOT_CHANGED, ret); | ||
| 628 | +} | ||
| 629 | + | ||
| 630 | +TEST_F(UtestFoldingSliceKernel, CovSliceUnsupportedSizeType) { | ||
| 631 | + vector<int64_t> dims_vec_x = {4}; | ||
| 632 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 633 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_INT32); | ||
| 634 | + ConstGeTensorPtr tensor_x = | ||
| 635 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 636 | + | ||
| 637 | + vector<int64_t> dims_vec_begin = {1}; | ||
| 638 | + vector<int32_t> data_vec_begin = {1}; | ||
| 639 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_INT32); | ||
| 640 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 641 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 642 | + | ||
| 643 | + vector<int64_t> dims_vec_size = {1}; | ||
| 644 | + vector<int32_t> data_vec_size = {2}; | ||
| 645 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_FLOAT); | ||
| 646 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 647 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 648 | + | ||
| 649 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 650 | + | ||
| 651 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 652 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 653 | + | ||
| 654 | + SliceKernel slice_kernel; | ||
| 655 | + vector<GeTensorPtr> outputs; | ||
| 656 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 657 | + EXPECT_EQ(NOT_CHANGED, ret); | ||
| 658 | +} | ||
| 659 | + | ||
| 660 | +TEST_F(UtestFoldingSliceKernel, CovSliceAllOutputNonPositive) { | ||
| 661 | + vector<int64_t> dims_vec_x = {4}; | ||
| 662 | + vector<int32_t> data_vec_x = {1, 2, 3, 4}; | ||
| 663 | + GeTensorDesc tensor_desc_x(GeShape(dims_vec_x), FORMAT_NCHW, DT_INT32); | ||
| 664 | + ConstGeTensorPtr tensor_x = | ||
| 665 | + std::make_shared<GeTensor>(tensor_desc_x, (uint8_t *)data_vec_x.data(), data_vec_x.size() * sizeof(int32_t)); | ||
| 666 | + | ||
| 667 | + vector<int64_t> dims_vec_begin = {1}; | ||
| 668 | + vector<int32_t> data_vec_begin = {0}; | ||
| 669 | + GeTensorDesc tensor_desc_begin(GeShape(dims_vec_begin), FORMAT_NCHW, DT_INT32); | ||
| 670 | + ConstGeTensorPtr tensor_begin = std::make_shared<GeTensor>(tensor_desc_begin, (uint8_t *)data_vec_begin.data(), | ||
| 671 | + data_vec_begin.size() * sizeof(int32_t)); | ||
| 672 | + | ||
| 673 | + vector<int64_t> dims_vec_size = {1}; | ||
| 674 | + vector<int32_t> data_vec_size = {0}; | ||
| 675 | + GeTensorDesc tensor_desc_size(GeShape(dims_vec_size), FORMAT_NCHW, DT_INT32); | ||
| 676 | + ConstGeTensorPtr tensor_size = std::make_shared<GeTensor>(tensor_desc_size, (uint8_t *)data_vec_size.data(), | ||
| 677 | + data_vec_size.size() * sizeof(int32_t)); | ||
| 678 | + | ||
| 679 | + vector<ConstGeTensorPtr> input = {tensor_x, tensor_begin, tensor_size}; | ||
| 680 | + | ||
| 681 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("slice", "Slice"); | ||
| 682 | + op_desc_ptr->AddOutputDesc(GeTensorDesc(GeShape({4}), FORMAT_NCHW, DT_INT32)); | ||
| 683 | + | ||
| 684 | + SliceKernel slice_kernel; | ||
| 685 | + vector<GeTensorPtr> outputs; | ||
| 686 | + auto ret = slice_kernel.Compute(op_desc_ptr, input, outputs); | ||
| 687 | + EXPECT_EQ(NOT_CHANGED, ret); | ||
| 688 | +} | ||
| @@ -578,3 +578,460 @@ TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, Test17) { | |||
| 578 | shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | 578 | shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); |
| 579 | EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | 579 | EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); |
| 580 | } | 580 | } |
| 581 | + | ||
| 582 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovSuccessInt64Stride) { | ||
| 583 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 584 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 585 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 586 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 587 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 588 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 589 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 590 | + | ||
| 591 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 592 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 593 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 594 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 595 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 596 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 597 | + | ||
| 598 | + vector<int32_t> x_data = {1, 2, 3, 4, 5, 6}; | ||
| 599 | + GeTensorDesc x_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 600 | + ConstGeTensorPtr tensor_0 = | ||
| 601 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 602 | + | ||
| 603 | + vector<int64_t> begin_data = {0, 0}; | ||
| 604 | + vector<int64_t> end_data = {2, 2}; | ||
| 605 | + vector<int64_t> stride_data = {1, 1}; | ||
| 606 | + GeTensorDesc idx_desc(GeShape({2}), FORMAT_NCHW, DT_INT64); | ||
| 607 | + ConstGeTensorPtr tensor_1 = | ||
| 608 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int64_t)); | ||
| 609 | + ConstGeTensorPtr tensor_2 = | ||
| 610 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int64_t)); | ||
| 611 | + ConstGeTensorPtr tensor_3 = | ||
| 612 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int64_t)); | ||
| 613 | + | ||
| 614 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 615 | + vector<GeTensorPtr> outputs; | ||
| 616 | + | ||
| 617 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 618 | + EXPECT_EQ(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 619 | +} | ||
| 620 | + | ||
| 621 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovSuccessInt32Stride) { | ||
| 622 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 623 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 624 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 625 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 626 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 627 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 628 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 629 | + | ||
| 630 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 631 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 632 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 633 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 634 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 635 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 636 | + | ||
| 637 | + vector<int32_t> x_data = {1, 2, 3, 4, 5, 6}; | ||
| 638 | + GeTensorDesc x_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 639 | + ConstGeTensorPtr tensor_0 = | ||
| 640 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 641 | + | ||
| 642 | + vector<int32_t> begin_data = {0, 0}; | ||
| 643 | + vector<int32_t> end_data = {2, 2}; | ||
| 644 | + vector<int32_t> stride_data = {1, 1}; | ||
| 645 | + GeTensorDesc idx_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 646 | + ConstGeTensorPtr tensor_1 = | ||
| 647 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 648 | + ConstGeTensorPtr tensor_2 = | ||
| 649 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int32_t)); | ||
| 650 | + ConstGeTensorPtr tensor_3 = | ||
| 651 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 652 | + | ||
| 653 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 654 | + vector<GeTensorPtr> outputs; | ||
| 655 | + | ||
| 656 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 657 | + EXPECT_EQ(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 658 | +} | ||
| 659 | + | ||
| 660 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovNullOpDesc) { | ||
| 661 | + OpDescPtr op_desc_ptr = nullptr; | ||
| 662 | + | ||
| 663 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 664 | + GeTensorDesc tensor_desc(GeShape({2, 2}), FORMAT_NCHW, DT_INT32); | ||
| 665 | + ConstGeTensorPtr tensor_0 = | ||
| 666 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 667 | + ConstGeTensorPtr tensor_1 = | ||
| 668 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 669 | + ConstGeTensorPtr tensor_2 = | ||
| 670 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 671 | + ConstGeTensorPtr tensor_3 = | ||
| 672 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 673 | + | ||
| 674 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 675 | + vector<GeTensorPtr> outputs; | ||
| 676 | + | ||
| 677 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 678 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 679 | +} | ||
| 680 | + | ||
| 681 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovMissingAttr) { | ||
| 682 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 683 | + | ||
| 684 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 685 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 686 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 687 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 688 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 689 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 690 | + | ||
| 691 | + vector<int32_t> data_vec = {1, 2, 3, 4, 5, 6}; | ||
| 692 | + GeTensorDesc tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 693 | + ConstGeTensorPtr tensor_0 = | ||
| 694 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 695 | + ConstGeTensorPtr tensor_1 = | ||
| 696 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 697 | + ConstGeTensorPtr tensor_2 = | ||
| 698 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 699 | + ConstGeTensorPtr tensor_3 = | ||
| 700 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 701 | + | ||
| 702 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 703 | + vector<GeTensorPtr> outputs; | ||
| 704 | + | ||
| 705 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 706 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 707 | +} | ||
| 708 | + | ||
| 709 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovInputSizeMismatch) { | ||
| 710 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 711 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 712 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 713 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 714 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 715 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 716 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 717 | + | ||
| 718 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 719 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 720 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 721 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 722 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 723 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 724 | + | ||
| 725 | + vector<int32_t> data_vec = {1, 2, 3, 4, 5, 6}; | ||
| 726 | + GeTensorDesc tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 727 | + ConstGeTensorPtr tensor_0 = | ||
| 728 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 729 | + ConstGeTensorPtr tensor_1 = | ||
| 730 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 731 | + ConstGeTensorPtr tensor_2 = | ||
| 732 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 733 | + | ||
| 734 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2}; | ||
| 735 | + vector<GeTensorPtr> outputs; | ||
| 736 | + | ||
| 737 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 738 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 739 | +} | ||
| 740 | + | ||
| 741 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovDataTypeMismatch) { | ||
| 742 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 743 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 744 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 745 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 746 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 747 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 748 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 749 | + | ||
| 750 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 751 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 752 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 753 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 754 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 755 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 756 | + | ||
| 757 | + vector<int32_t> x_data = {1, 2, 3, 4, 5, 6}; | ||
| 758 | + GeTensorDesc x_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 759 | + ConstGeTensorPtr tensor_0 = | ||
| 760 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 761 | + | ||
| 762 | + vector<int32_t> begin_data = {0, 0}; | ||
| 763 | + vector<int64_t> end_data = {2, 2}; | ||
| 764 | + vector<int32_t> stride_data = {1, 1}; | ||
| 765 | + GeTensorDesc begin_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 766 | + GeTensorDesc end_desc(GeShape({2}), FORMAT_NCHW, DT_INT64); | ||
| 767 | + ConstGeTensorPtr tensor_1 = | ||
| 768 | + std::make_shared<GeTensor>(begin_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 769 | + ConstGeTensorPtr tensor_2 = | ||
| 770 | + std::make_shared<GeTensor>(end_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int64_t)); | ||
| 771 | + ConstGeTensorPtr tensor_3 = | ||
| 772 | + std::make_shared<GeTensor>(begin_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 773 | + | ||
| 774 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 775 | + vector<GeTensorPtr> outputs; | ||
| 776 | + | ||
| 777 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 778 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 779 | +} | ||
| 780 | + | ||
| 781 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovUnsupportedXType) { | ||
| 782 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 783 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 784 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 785 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 786 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 787 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 788 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 789 | + | ||
| 790 | + GeTensorDesc dims_tensor_desc(GeShape({2, 2}), FORMAT_NCHW, DT_INT32); | ||
| 791 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 792 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 793 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 794 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 795 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 796 | + | ||
| 797 | + vector<int32_t> x_data = {1, 2, 3, 4}; | ||
| 798 | + GeTensorDesc x_desc(GeShape({2, 2}), FORMAT_NCHW, DT_STRING); | ||
| 799 | + ConstGeTensorPtr tensor_0 = | ||
| 800 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 801 | + | ||
| 802 | + vector<int32_t> begin_data = {0, 0}; | ||
| 803 | + vector<int32_t> end_data = {2, 2}; | ||
| 804 | + vector<int32_t> stride_data = {1, 1}; | ||
| 805 | + GeTensorDesc idx_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 806 | + ConstGeTensorPtr tensor_1 = | ||
| 807 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 808 | + ConstGeTensorPtr tensor_2 = | ||
| 809 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int32_t)); | ||
| 810 | + ConstGeTensorPtr tensor_3 = | ||
| 811 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 812 | + | ||
| 813 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 814 | + vector<GeTensorPtr> outputs; | ||
| 815 | + | ||
| 816 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 817 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 818 | +} | ||
| 819 | + | ||
| 820 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovZeroDataSize) { | ||
| 821 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 822 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 823 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 824 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 825 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 826 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 827 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 828 | + | ||
| 829 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 830 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 831 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 832 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 833 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 834 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 835 | + | ||
| 836 | + GeTensorDesc tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 837 | + ConstGeTensorPtr tensor_0 = std::make_shared<GeTensor>(tensor_desc); | ||
| 838 | + ConstGeTensorPtr tensor_1 = std::make_shared<GeTensor>(tensor_desc); | ||
| 839 | + ConstGeTensorPtr tensor_2 = std::make_shared<GeTensor>(tensor_desc); | ||
| 840 | + ConstGeTensorPtr tensor_3 = std::make_shared<GeTensor>(tensor_desc); | ||
| 841 | + | ||
| 842 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 843 | + vector<GeTensorPtr> outputs; | ||
| 844 | + | ||
| 845 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 846 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 847 | +} | ||
| 848 | + | ||
| 849 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovSizeMismatch) { | ||
| 850 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 851 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 852 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 853 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 854 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 855 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 856 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 857 | + | ||
| 858 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 859 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 860 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 861 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 862 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 863 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 864 | + | ||
| 865 | + vector<int32_t> x_data = {1, 2, 3, 4, 5, 6}; | ||
| 866 | + GeTensorDesc x_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 867 | + ConstGeTensorPtr tensor_0 = | ||
| 868 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 869 | + | ||
| 870 | + vector<int32_t> begin_data = {0}; | ||
| 871 | + vector<int32_t> end_data = {2, 2}; | ||
| 872 | + vector<int32_t> stride_data = {1}; | ||
| 873 | + GeTensorDesc idx_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 874 | + ConstGeTensorPtr tensor_1 = | ||
| 875 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 876 | + ConstGeTensorPtr tensor_2 = | ||
| 877 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int32_t)); | ||
| 878 | + ConstGeTensorPtr tensor_3 = | ||
| 879 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 880 | + | ||
| 881 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 882 | + vector<GeTensorPtr> outputs; | ||
| 883 | + | ||
| 884 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 885 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 886 | +} | ||
| 887 | + | ||
| 888 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovInvalidEllipsisMask) { | ||
| 889 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 890 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 891 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 892 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 3); | ||
| 893 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 894 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 895 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 896 | + | ||
| 897 | + GeTensorDesc dims_tensor_desc(GeShape({2, 2}), FORMAT_NCHW, DT_INT32); | ||
| 898 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 899 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 900 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 901 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 902 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 903 | + | ||
| 904 | + vector<int32_t> data_vec = {1, 2, 3, 4}; | ||
| 905 | + GeTensorDesc tensor_desc(GeShape({2, 2}), FORMAT_NCHW, DT_INT32); | ||
| 906 | + ConstGeTensorPtr tensor_0 = | ||
| 907 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 908 | + ConstGeTensorPtr tensor_1 = | ||
| 909 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 910 | + ConstGeTensorPtr tensor_2 = | ||
| 911 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 912 | + ConstGeTensorPtr tensor_3 = | ||
| 913 | + std::make_shared<GeTensor>(tensor_desc, (uint8_t *)data_vec.data(), data_vec.size() * sizeof(int32_t)); | ||
| 914 | + | ||
| 915 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 916 | + vector<GeTensorPtr> outputs; | ||
| 917 | + | ||
| 918 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 919 | + EXPECT_NE(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 920 | +} | ||
| 921 | + | ||
| 922 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovShrinkAxisMask) { | ||
| 923 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 924 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 925 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 926 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 927 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 928 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 1); | ||
| 929 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 930 | + | ||
| 931 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 932 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 933 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 934 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 935 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 936 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 937 | + | ||
| 938 | + vector<int32_t> x_data = {1, 2, 3, 4, 5, 6}; | ||
| 939 | + GeTensorDesc x_desc(GeShape({2, 3}), FORMAT_NCHW, DT_INT32); | ||
| 940 | + ConstGeTensorPtr tensor_0 = | ||
| 941 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 942 | + | ||
| 943 | + vector<int32_t> begin_data = {0, 0}; | ||
| 944 | + vector<int32_t> end_data = {1, 2}; | ||
| 945 | + vector<int32_t> stride_data = {1, 1}; | ||
| 946 | + GeTensorDesc idx_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 947 | + ConstGeTensorPtr tensor_1 = | ||
| 948 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 949 | + ConstGeTensorPtr tensor_2 = | ||
| 950 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int32_t)); | ||
| 951 | + ConstGeTensorPtr tensor_3 = | ||
| 952 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 953 | + | ||
| 954 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 955 | + vector<GeTensorPtr> outputs; | ||
| 956 | + | ||
| 957 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 958 | + EXPECT_EQ(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 959 | +} | ||
| 960 | + | ||
| 961 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovNewAxisMask) { | ||
| 962 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 963 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 964 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 965 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 0); | ||
| 966 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 1); | ||
| 967 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 968 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 969 | + | ||
| 970 | + GeTensorDesc dims_tensor_desc(GeShape({3}), FORMAT_NCHW, DT_INT32); | ||
| 971 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 972 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 973 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 974 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 975 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 976 | + | ||
| 977 | + vector<int32_t> x_data = {1, 2, 3}; | ||
| 978 | + GeTensorDesc x_desc(GeShape({3}), FORMAT_NCHW, DT_INT32); | ||
| 979 | + ConstGeTensorPtr tensor_0 = | ||
| 980 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 981 | + | ||
| 982 | + vector<int32_t> begin_data = {0}; | ||
| 983 | + vector<int32_t> end_data = {3}; | ||
| 984 | + vector<int32_t> stride_data = {1}; | ||
| 985 | + GeTensorDesc idx_desc(GeShape({1}), FORMAT_NCHW, DT_INT32); | ||
| 986 | + ConstGeTensorPtr tensor_1 = | ||
| 987 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 988 | + ConstGeTensorPtr tensor_2 = | ||
| 989 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int32_t)); | ||
| 990 | + ConstGeTensorPtr tensor_3 = | ||
| 991 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 992 | + | ||
| 993 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 994 | + vector<GeTensorPtr> outputs; | ||
| 995 | + | ||
| 996 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 997 | + EXPECT_EQ(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 998 | +} | ||
| 999 | + | ||
| 1000 | +TEST_F(UtestGraphPassesFoldingKernelStridedSliceKernel, CovEllipsisMaskExpand) { | ||
| 1001 | + OpDescPtr op_desc_ptr = std::make_shared<OpDesc>("StridedSlice", "StridedSlice"); | ||
| 1002 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_BEGIN_MASK, 0); | ||
| 1003 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_END_MASK, 0); | ||
| 1004 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_ELLIPSIS_MASK, 1); | ||
| 1005 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_NEW_AXIS_MASK, 0); | ||
| 1006 | + AttrUtils::SetInt(op_desc_ptr, STRIDE_SLICE_ATTR_SHRINK_AXIS_MASK, 0); | ||
| 1007 | + AttrUtils::SetInt(op_desc_ptr, ATTR_NAME_T, 0); | ||
| 1008 | + | ||
| 1009 | + GeTensorDesc dims_tensor_desc(GeShape({2, 3, 4}), FORMAT_NCHW, DT_INT32); | ||
| 1010 | + op_desc_ptr->AddInputDesc(0, dims_tensor_desc); | ||
| 1011 | + op_desc_ptr->AddInputDesc(1, dims_tensor_desc); | ||
| 1012 | + op_desc_ptr->AddInputDesc(2, dims_tensor_desc); | ||
| 1013 | + op_desc_ptr->AddInputDesc(3, dims_tensor_desc); | ||
| 1014 | + op_desc_ptr->AddOutputDesc(dims_tensor_desc); | ||
| 1015 | + | ||
| 1016 | + vector<int32_t> x_data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; | ||
| 1017 | + GeTensorDesc x_desc(GeShape({2, 3, 4}), FORMAT_NCHW, DT_INT32); | ||
| 1018 | + ConstGeTensorPtr tensor_0 = | ||
| 1019 | + std::make_shared<GeTensor>(x_desc, (uint8_t *)x_data.data(), x_data.size() * sizeof(int32_t)); | ||
| 1020 | + | ||
| 1021 | + vector<int32_t> begin_data = {0, 1}; | ||
| 1022 | + vector<int32_t> end_data = {2, 2}; | ||
| 1023 | + vector<int32_t> stride_data = {1, 1}; | ||
| 1024 | + GeTensorDesc idx_desc(GeShape({2}), FORMAT_NCHW, DT_INT32); | ||
| 1025 | + ConstGeTensorPtr tensor_1 = | ||
| 1026 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)begin_data.data(), begin_data.size() * sizeof(int32_t)); | ||
| 1027 | + ConstGeTensorPtr tensor_2 = | ||
| 1028 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)end_data.data(), end_data.size() * sizeof(int32_t)); | ||
| 1029 | + ConstGeTensorPtr tensor_3 = | ||
| 1030 | + std::make_shared<GeTensor>(idx_desc, (uint8_t *)stride_data.data(), stride_data.size() * sizeof(int32_t)); | ||
| 1031 | + | ||
| 1032 | + vector<ConstGeTensorPtr> input = {tensor_0, tensor_1, tensor_2, tensor_3}; | ||
| 1033 | + vector<GeTensorPtr> outputs; | ||
| 1034 | + | ||
| 1035 | + shared_ptr<Kernel> kernel = KernelFactory::Instance().Create(STRIDEDSLICE); | ||
| 1036 | + EXPECT_EQ(kernel->Compute(op_desc_ptr, input, outputs), ge::SUCCESS); | ||
| 1037 | +} | ||
| @@ -152,4 +152,145 @@ TEST_F(BufferUT, CreateCopyFrom2) { | |||
| 152 | EXPECT_EQ(memcmp(buf1.GetData(), second_buf, sizeof(second_buf)), 0); | 152 | EXPECT_EQ(memcmp(buf1.GetData(), second_buf, sizeof(second_buf)), 0); |
| 153 | EXPECT_EQ(memcmp(buf.GetData(), first_buf, sizeof(first_buf)), 0); | 153 | EXPECT_EQ(memcmp(buf.GetData(), first_buf, sizeof(first_buf)), 0); |
| 154 | } | 154 | } |
| 155 | + | ||
| 156 | +TEST_F(BufferUT, Cov_DefaultConstructor) { | ||
| 157 | + Buffer buf; | ||
| 158 | + EXPECT_EQ(buf.GetSize(), 0UL); | ||
| 159 | + EXPECT_EQ(buf.GetData(), nullptr); | ||
| 160 | + EXPECT_EQ(buf.data(), nullptr); | ||
| 161 | + EXPECT_EQ(buf.size(), 0UL); | ||
| 162 | +} | ||
| 163 | + | ||
| 164 | +TEST_F(BufferUT, Cov_CopyConstructor) { | ||
| 165 | + uint8_t data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; | ||
| 166 | + Buffer buf1 = Buffer::CopyFrom(data, sizeof(data)); | ||
| 167 | + Buffer buf2(buf1); | ||
| 168 | + EXPECT_EQ(buf2.GetSize(), 10UL); | ||
| 169 | + EXPECT_EQ(memcmp(buf2.GetData(), data, sizeof(data)), 0); | ||
| 170 | +} | ||
| 171 | + | ||
| 172 | +TEST_F(BufferUT, Cov_SizeConstructorWithDefaultVal) { | ||
| 173 | + Buffer buf(10, 0xAB); | ||
| 174 | + EXPECT_EQ(buf.GetSize(), 10UL); | ||
| 175 | + for (size_t i = 0; i < 10; ++i) { | ||
| 176 | + EXPECT_EQ(buf[i], 0xAB); | ||
| 177 | + } | ||
| 178 | +} | ||
| 179 | + | ||
| 180 | +TEST_F(BufferUT, Cov_GetDataMutable) { | ||
| 181 | + uint8_t data[5] = {1, 2, 3, 4, 5}; | ||
| 182 | + Buffer buf = Buffer::CopyFrom(data, sizeof(data)); | ||
| 183 | + uint8_t *mutable_data = buf.GetData(); | ||
| 184 | + ASSERT_NE(mutable_data, nullptr); | ||
| 185 | + mutable_data[0] = 99; | ||
| 186 | + EXPECT_EQ(buf[0], 99); | ||
| 187 | +} | ||
| 188 | + | ||
| 189 | +TEST_F(BufferUT, Cov_GetDataMutable_EmptyBuffer) { | ||
| 190 | + Buffer buf; | ||
| 191 | + EXPECT_EQ(buf.GetData(), nullptr); | ||
| 192 | +} | ||
| 193 | + | ||
| 194 | +TEST_F(BufferUT, Cov_GetDataConst_NullBuffer) { | ||
| 195 | + Buffer buf; | ||
| 196 | + const Buffer &const_buf = buf; | ||
| 197 | + EXPECT_EQ(const_buf.GetData(), nullptr); | ||
| 198 | +} | ||
| 199 | + | ||
| 200 | +TEST_F(BufferUT, Cov_GetSize_EmptyBuffer) { | ||
| 201 | + Buffer buf; | ||
| 202 | + EXPECT_EQ(buf.GetSize(), 0UL); | ||
| 203 | +} | ||
| 204 | + | ||
| 205 | +TEST_F(BufferUT, Cv_GetSize_BufferWithSize) { | ||
| 206 | + Buffer buf(50); | ||
| 207 | + EXPECT_EQ(buf.GetSize(), 50UL); | ||
| 208 | +} | ||
| 209 | + | ||
| 210 | +TEST_F(BufferUT, Cov_ClearBuffer) { | ||
| 211 | + uint8_t data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; | ||
| 212 | + Buffer buf = Buffer::CopyFrom(data, sizeof(data)); | ||
| 213 | + EXPECT_EQ(buf.GetSize(), 10UL); | ||
| 214 | + buf.ClearBuffer(); | ||
| 215 | + EXPECT_EQ(buf.GetSize(), 0UL); | ||
| 216 | +} | ||
| 217 | + | ||
| 218 | +TEST_F(BufferUT, Cov_Clear_EmptyBuffer) { | ||
| 219 | + Buffer buf; | ||
| 220 | + buf.clear(); | ||
| 221 | + EXPECT_EQ(buf.size(), 0UL); | ||
| 222 | +} | ||
| 223 | + | ||
| 224 | +TEST_F(BufferUT, Cov_OperatorIndex_InBounds) { | ||
| 225 | + uint8_t data[5] = {10, 20, 30, 40, 50}; | ||
| 226 | + Buffer buf = Buffer::CopyFrom(data, sizeof(data)); | ||
| 227 | + EXPECT_EQ(buf[0], 10); | ||
| 228 | + EXPECT_EQ(buf[4], 50); | ||
| 229 | +} | ||
| 230 | + | ||
| 231 | +TEST_F(BufferUT, Cov_OperatorIndex_OutOfBounds) { | ||
| 232 | + Buffer buf(5); | ||
| 233 | + EXPECT_EQ(buf[100], 0xffU); | ||
| 234 | +} | ||
| 235 | + | ||
| 236 | +TEST_F(BufferUT, Cov_OperatorIndex_EmptyBuffer) { | ||
| 237 | + Buffer buf; | ||
| 238 | + EXPECT_EQ(buf[0], 0xffU); | ||
| 239 | +} | ||
| 240 | + | ||
| 241 | +TEST_F(BufferUT, Cov_OperatorAssign_SelfAssign) { | ||
| 242 | + uint8_t data[5] = {1, 2, 3, 4, 5}; | ||
| 243 | + Buffer buf = Buffer::CopyFrom(data, sizeof(data)); | ||
| 244 | + buf = buf; | ||
| 245 | + EXPECT_EQ(buf.GetSize(), 5UL); | ||
| 246 | + EXPECT_EQ(buf[0], 1); | ||
| 247 | +} | ||
| 248 | + | ||
| 249 | +TEST_F(BufferUT, Cov_DataAlias) { | ||
| 250 | + uint8_t data[5] = {1, 2, 3, 4, 5}; | ||
| 251 | + Buffer buf = Buffer::CopyFrom(data, sizeof(data)); | ||
| 252 | + EXPECT_EQ(buf.data(), buf.GetData()); | ||
| 253 | +} | ||
| 254 | + | ||
| 255 | +TEST_F(BufferUT, Cov_SizeAlias) { | ||
| 256 | + Buffer buf(42); | ||
| 257 | + EXPECT_EQ(buf.size(), buf.GetSize()); | ||
| 258 | +} | ||
| 259 | + | ||
| 260 | +TEST_F(BufferUT, Cov_ClearAlias) { | ||
| 261 | + uint8_t data[5] = {1, 2, 3, 4, 5}; | ||
| 262 | + Buffer buf = Buffer::CopyFrom(data, sizeof(data)); | ||
| 263 | + buf.clear(); | ||
| 264 | + EXPECT_EQ(buf.size(), 0UL); | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +TEST_F(BufferUT, Cov_BufferUtils_CreateCopyFromData) { | ||
| 268 | + uint8_t data[5] = {1, 2, 3, 4, 5}; | ||
| 269 | + Buffer buf = BufferUtils::CreateCopyFrom(data, sizeof(data)); | ||
| 270 | + EXPECT_EQ(buf.GetSize(), 5UL); | ||
| 271 | + EXPECT_EQ(memcmp(buf.GetData(), data, sizeof(data)), 0); | ||
| 272 | +} | ||
| 273 | + | ||
| 274 | +TEST_F(BufferUT, Cov_BufferUtils_CreateCopyFromBuffer) { | ||
| 275 | + uint8_t data[5] = {1, 2, 3, 4, 5}; | ||
| 276 | + Buffer buf1 = BufferUtils::CreateCopyFrom(data, sizeof(data)); | ||
| 277 | + Buffer buf2 = BufferUtils::CreateCopyFrom(buf1); | ||
| 278 | + EXPECT_EQ(buf2.GetSize(), 5UL); | ||
| 279 | + EXPECT_EQ(memcmp(buf2.GetData(), data, sizeof(data)), 0); | ||
| 280 | + buf2.GetData()[0] = 99; | ||
| 281 | + EXPECT_EQ(buf1[0], 1); | ||
| 282 | +} | ||
| 283 | + | ||
| 284 | +TEST_F(BufferUT, Cov_CopyFrom_NullData) { | ||
| 285 | + Buffer buf = Buffer::CopyFrom(nullptr, 100); | ||
| 286 | + EXPECT_EQ(buf.GetSize(), 0UL); | ||
| 287 | +} | ||
| 288 | + | ||
| 289 | +TEST_F(BufferUT, Cov_DefaultValConstructor) { | ||
| 290 | + Buffer buf(20, 0x42); | ||
| 291 | + EXPECT_EQ(buf.GetSize(), 20UL); | ||
| 292 | + for (size_t i = 0; i < 20; ++i) { | ||
| 293 | + EXPECT_EQ(buf[i], 0x42); | ||
| 294 | + } | ||
| 295 | +} | ||
| 155 | } // namespace ge | 296 | } // namespace ge |
| @@ -218,4 +218,52 @@ TEST_F(UtestConstantUtils, TestGetWeightFromFile) { | |||
| 218 | ASSERT_EQ(weight->GetTensorDesc().GetShape().GetDims(), shape); | 218 | ASSERT_EQ(weight->GetTensorDesc().GetShape().GetDims(), shape); |
| 219 | system("rm -rf ./weight.bin"); | 219 | system("rm -rf ./weight.bin"); |
| 220 | } | 220 | } |
| 221 | + | ||
| 222 | +TEST_F(UtestConstantUtils, CovGetWeightIndexNotFound) { | ||
| 223 | + ut::GraphBuilder builder = ut::GraphBuilder("graph"); | ||
| 224 | + const auto &shape_node = builder.AddNode("shape_node", "Shape", 1, 1); | ||
| 225 | + AttrUtils::SetBool(shape_node->GetOpDesc(), ATTR_NAME_POTENTIAL_CONST, true); | ||
| 226 | + AttrUtils::SetListInt(shape_node->GetOpDesc(), ATTR_NAME_POTENTIAL_WEIGHT_INDICES, {0}); | ||
| 227 | + ge::GeTensorPtr tensor = std::make_shared<GeTensor>(); | ||
| 228 | + AttrUtils::SetListTensor(shape_node->GetOpDesc(), ATTR_NAME_POTENTIAL_WEIGHT, {tensor}); | ||
| 229 | + ConstGeTensorPtr weight; | ||
| 230 | + EXPECT_FALSE(ConstantUtils::GetWeight(shape_node->GetOpDesc(), 1, weight)); | ||
| 231 | +} | ||
| 232 | + | ||
| 233 | +TEST_F(UtestConstantUtils, CovMutableWeightNotPotentialConst) { | ||
| 234 | + auto op_desc = std::make_shared<OpDesc>("test", "Relu"); | ||
| 235 | + GeTensorPtr weight; | ||
| 236 | + EXPECT_FALSE(ConstantUtils::MutableWeight(op_desc, 0, weight)); | ||
| 237 | +} | ||
| 238 | + | ||
| 239 | +TEST_F(UtestConstantUtils, CovMutableWeightInvalidPotential) { | ||
| 240 | + auto op_desc = std::make_shared<OpDesc>("test", "Shape"); | ||
| 241 | + AttrUtils::SetBool(op_desc, ATTR_NAME_POTENTIAL_CONST, true); | ||
| 242 | + GeTensorPtr weight; | ||
| 243 | + EXPECT_FALSE(ConstantUtils::MutableWeight(op_desc, 0, weight)); | ||
| 244 | +} | ||
| 245 | + | ||
| 246 | +TEST_F(UtestConstantUtils, CovMutableWeightIndexNotFound) { | ||
| 247 | + ut::GraphBuilder builder = ut::GraphBuilder("graph"); | ||
| 248 | + const auto &shape_node = builder.AddNode("shape_node", "Shape", 1, 1); | ||
| 249 | + AttrUtils::SetBool(shape_node->GetOpDesc(), ATTR_NAME_POTENTIAL_CONST, true); | ||
| 250 | + AttrUtils::SetListInt(shape_node->GetOpDesc(), ATTR_NAME_POTENTIAL_WEIGHT_INDICES, {0}); | ||
| 251 | + ge::GeTensorPtr tensor = std::make_shared<GeTensor>(); | ||
| 252 | + AttrUtils::SetListTensor(shape_node->GetOpDesc(), ATTR_NAME_POTENTIAL_WEIGHT, {tensor}); | ||
| 253 | + GeTensorPtr weight; | ||
| 254 | + EXPECT_FALSE(ConstantUtils::MutableWeight(shape_node->GetOpDesc(), 1, weight)); | ||
| 255 | +} | ||
| 256 | + | ||
| 257 | +TEST_F(UtestConstantUtils, CovSetWeightNotPotentialConst) { | ||
| 258 | + auto op_desc = std::make_shared<OpDesc>("test", "Relu"); | ||
| 259 | + ge::GeTensorPtr tensor = std::make_shared<GeTensor>(); | ||
| 260 | + EXPECT_FALSE(ConstantUtils::SetWeight(op_desc, 0, tensor)); | ||
| 261 | +} | ||
| 262 | + | ||
| 263 | +TEST_F(UtestConstantUtils, CovSetWeightInvalidPotential) { | ||
| 264 | + auto op_desc = std::make_shared<OpDesc>("test", "Shape"); | ||
| 265 | + AttrUtils::SetBool(op_desc, ATTR_NAME_POTENTIAL_CONST, true); | ||
| 266 | + ge::GeTensorPtr tensor = std::make_shared<GeTensor>(); | ||
| 267 | + EXPECT_FALSE(ConstantUtils::SetWeight(op_desc, 0, tensor)); | ||
| 268 | +} | ||
| 221 | } // namespace ge | 269 | } // namespace ge |
| @@ -0,0 +1,80 @@ | |||
| 1 | + | ||
| 2 | + | ||
| 3 | + | ||
| 4 | + | ||
| 5 | + | ||
| 6 | + | ||
| 7 | + | ||
| 8 | + | ||
| 9 | + | ||
| 10 | +namespace ge { | ||
| 11 | + | ||
| 12 | +class CovUtilsMiscTest : public testing::Test { | ||
| 13 | + protected: | ||
| 14 | + void SetUp() {} | ||
| 15 | + void TearDown() {} | ||
| 16 | +}; | ||
| 17 | + | ||
| 18 | +TEST_F(CovUtilsMiscTest, CovGraphThreadPoolConstructorAndDestructor) { | ||
| 19 | + GraphThreadPool pool(2U); | ||
| 20 | + SUCCEED(); | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +TEST_F(CovUtilsMiscTest, CovGraphThreadPoolZeroSize) { | ||
| 24 | + GraphThreadPool pool(0U); | ||
| 25 | + SUCCEED(); | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +TEST_F(CovUtilsMiscTest, CovGraphThreadPoolSubmitTask) { | ||
| 29 | + GraphThreadPool pool(2U); | ||
| 30 | + std::atomic<int> counter(0); | ||
| 31 | + pool.commit([&counter]() { counter++; }); | ||
| 32 | + std::this_thread::sleep_for(std::chrono::milliseconds(100)); | ||
| 33 | + EXPECT_EQ(counter.load(), 1); | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +TEST_F(CovUtilsMiscTest, CovMultiThreadGraphBuilderConstructor) { | ||
| 37 | + MultiThreadGraphBuilder builder(2); | ||
| 38 | + SUCCEED(); | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +TEST_F(CovUtilsMiscTest, CovMultiThreadGraphBuilderSingleThread) { | ||
| 42 | + MultiThreadGraphBuilder builder(1); | ||
| 43 | + ge::Graph graph("test"); | ||
| 44 | + std::vector<ge::Operator> inputs; | ||
| 45 | + auto &result = builder.SetInputs(inputs, graph); | ||
| 46 | + SUCCEED(); | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +TEST_F(CovUtilsMiscTest, CovMultiThreadGraphBuilderMultiThread) { | ||
| 50 | + MultiThreadGraphBuilder builder(2); | ||
| 51 | + ge::Graph graph("test"); | ||
| 52 | + std::vector<ge::Operator> inputs; | ||
| 53 | + auto &result = builder.SetInputs(inputs, graph); | ||
| 54 | + SUCCEED(); | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +TEST_F(CovUtilsMiscTest, CovTypeUtilsAscendStringToDataType) { | ||
| 58 | + ge::AscendString str("DT_FLOAT"); | ||
| 59 | + DataType dt = TypeUtils::AscendStringToDataType(str); | ||
| 60 | + EXPECT_EQ(dt, DT_FLOAT); | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +TEST_F(CovUtilsMiscTest, CovTypeUtilsFormatToAscendString) { | ||
| 64 | + AscendString result = TypeUtils::FormatToAscendString(FORMAT_NCHW); | ||
| 65 | + EXPECT_NE(result.GetString(), nullptr); | ||
| 66 | +} | ||
| 67 | + | ||
| 68 | +TEST_F(CovUtilsMiscTest, CovTypeUtilsAscendStringToFormat) { | ||
| 69 | + AscendString str("NCHW"); | ||
| 70 | + Format fmt = TypeUtils::AscendStringToFormat(str); | ||
| 71 | + EXPECT_EQ(fmt, FORMAT_NCHW); | ||
| 72 | +} | ||
| 73 | + | ||
| 74 | +TEST_F(CovUtilsMiscTest, CovTypeUtilsDataFormatToFormat) { | ||
| 75 | + AscendString str("NCHW"); | ||
| 76 | + Format fmt = TypeUtils::DataFormatToFormat(str); | ||
| 77 | + SUCCEED(); | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +} // namespace ge | ||
| @@ -421,3 +421,72 @@ TEST_F(UtestCycleDetector, ConnectionMatrixCoverage_00) { | |||
| 421 | EXPECT_FALSE(has_cycle); | 421 | EXPECT_FALSE(has_cycle); |
| 422 | detector->Update(graph, fusion_nodes); | 422 | detector->Update(graph, fusion_nodes); |
| 423 | } | 423 | } |
| 424 | + | ||
| 425 | +TEST_F(UtestCycleDetector, CovConnectionMatrixSetConnectivity) { | ||
| 426 | + auto builder = ut::GraphBuilder("root"); | ||
| 427 | + const auto &node1 = builder.AddNode("node1", "Relu", 1, 1); | ||
| 428 | + const auto &node2 = builder.AddNode("node2", "Relu", 1, 1); | ||
| 429 | + const auto &node3 = builder.AddNode("node3", "Relu", 1, 1); | ||
| 430 | + builder.AddDataEdge(node1, 0, node2, 0); | ||
| 431 | + builder.AddDataEdge(node2, 0, node3, 0); | ||
| 432 | + auto graph = builder.GetGraph(); | ||
| 433 | + | ||
| 434 | + ConnectionMatrix matrix(graph); | ||
| 435 | + matrix.Generate(graph); | ||
| 436 | + auto inputs = node3->GetInAllNodes(); | ||
| 437 | + matrix.SetConnectivity(inputs, node3); | ||
| 438 | + EXPECT_TRUE(matrix.IsConnected(node1, node3)); | ||
| 439 | +} | ||
| 440 | + | ||
| 441 | +TEST_F(UtestCycleDetector, CovConnectionMatrixUpdateGraphMismatch) { | ||
| 442 | + auto builder1 = ut::GraphBuilder("graph1"); | ||
| 443 | + const auto &node1 = builder1.AddNode("node1", "Relu", 1, 1); | ||
| 444 | + auto graph1 = builder1.GetGraph(); | ||
| 445 | + | ||
| 446 | + auto builder2 = ut::GraphBuilder("graph2"); | ||
| 447 | + const auto &node2 = builder2.AddNode("node2", "Relu", 1, 1); | ||
| 448 | + auto graph2 = builder2.GetGraph(); | ||
| 449 | + | ||
| 450 | + ConnectionMatrix matrix(graph1); | ||
| 451 | + matrix.Generate(graph1); | ||
| 452 | + std::vector<NodePtr> fusion_nodes = {node1}; | ||
| 453 | + matrix.Update(graph2, fusion_nodes); | ||
| 454 | + SUCCEED(); | ||
| 455 | +} | ||
| 456 | + | ||
| 457 | +TEST_F(UtestCycleDetector, CovCycleDetectorUpdateNullConnectivity) { | ||
| 458 | + auto builder = ut::GraphBuilder("root"); | ||
| 459 | + const auto &node1 = builder.AddNode("node1", "Relu", 1, 1); | ||
| 460 | + auto graph = builder.GetGraph(); | ||
| 461 | + | ||
| 462 | + CycleDetectorPtr detector = GraphUtils::CreateCycleDetector(graph); | ||
| 463 | + EXPECT_NE(detector, nullptr); | ||
| 464 | + std::vector<NodePtr> fusion_nodes = {node1}; | ||
| 465 | + detector->Update(graph, fusion_nodes); | ||
| 466 | + SUCCEED(); | ||
| 467 | +} | ||
| 468 | + | ||
| 469 | +TEST_F(UtestCycleDetector, CovCycleDetectorExpandAndUpdate) { | ||
| 470 | + auto builder = ut::GraphBuilder("root"); | ||
| 471 | + const auto &node1 = builder.AddNode("node1", "Relu", 1, 1); | ||
| 472 | + const auto &node2 = builder.AddNode("node2", "Relu", 1, 1); | ||
| 473 | + builder.AddDataEdge(node1, 0, node2, 0); | ||
| 474 | + auto graph = builder.GetGraph(); | ||
| 475 | + | ||
| 476 | + CycleDetectorPtr detector = GraphUtils::CreateCycleDetector(graph); | ||
| 477 | + EXPECT_NE(detector, nullptr); | ||
| 478 | + std::vector<NodePtr> fusion_nodes = {node1, node2}; | ||
| 479 | + detector->ExpandAndUpdate(fusion_nodes, "fused_node"); | ||
| 480 | + SUCCEED(); | ||
| 481 | +} | ||
| 482 | + | ||
| 483 | +TEST_F(UtestCycleDetector, CovCycleDetectorExpandAndUpdateNullConnectivity) { | ||
| 484 | + auto builder = ut::GraphBuilder("root"); | ||
| 485 | + const auto &node1 = builder.AddNode("node1", "Relu", 1, 1); | ||
| 486 | + auto graph = builder.GetGraph(); | ||
| 487 | + | ||
| 488 | + auto detector = std::make_shared<CycleDetector>(); | ||
| 489 | + std::vector<NodePtr> fusion_nodes = {node1}; | ||
| 490 | + detector->ExpandAndUpdate(fusion_nodes, "fused_node"); | ||
| 491 | + SUCCEED(); | ||
| 492 | +} | ||
| @@ -543,4 +543,55 @@ TEST_F(UtestFftsGraphUtils, Calculate_nullptr_node) { | |||
| 543 | std::map<ComputeGraphPtr, std::vector<uint32_t>> graph_value; | 543 | std::map<ComputeGraphPtr, std::vector<uint32_t>> graph_value; |
| 544 | ASSERT_TRUE(FftsGraphUtils::Calculate(node, nullptr, node_value, graph_value, 1).empty()); | 544 | ASSERT_TRUE(FftsGraphUtils::Calculate(node, nullptr, node_value, graph_value, 1).empty()); |
| 545 | } | 545 | } |
| 546 | + | ||
| 547 | +TEST_F(UtestFftsGraphUtils, CovGraphPartitionEmptyUnsupported) { | ||
| 548 | + auto builder = ut::GraphBuilder("root"); | ||
| 549 | + auto graph = builder.GetGraph(); | ||
| 550 | + ASSERT_EQ(FftsGraphUtils::GraphPartition(*graph, {}), SUCCESS); | ||
| 551 | +} | ||
| 552 | + | ||
| 553 | +TEST_F(UtestFftsGraphUtils, CovGraphPartitionNoNodeToClip) { | ||
| 554 | + ComputeGraphPtr graph; | ||
| 555 | + ComputeGraphPtr subgraph; | ||
| 556 | + BuildGraphForSplit_without_func_node(graph, subgraph); | ||
| 557 | + auto builder = ut::GraphBuilder("other"); | ||
| 558 | + const auto &other_node = builder.AddNode("other", "Relu", 1, 1); | ||
| 559 | + ASSERT_EQ(FftsGraphUtils::GraphPartition(*subgraph, {other_node}), SUCCESS); | ||
| 560 | +} | ||
| 561 | + | ||
| 562 | +TEST_F(UtestFftsGraphUtils, CovGraphPartitionNoParentNode) { | ||
| 563 | + auto builder = ut::GraphBuilder("root"); | ||
| 564 | + builder.AddNode("node1", "Relu", 1, 1); | ||
| 565 | + auto graph = builder.GetGraph(); | ||
| 566 | + const auto &calc_func = [](const NodePtr &n) { return std::vector<uint32_t>{1}; }; | ||
| 567 | + ASSERT_EQ(FftsGraphUtils::GraphPartition(*graph, calc_func, {8}), PARAM_INVALID); | ||
| 568 | +} | ||
| 569 | + | ||
| 570 | +TEST_F(UtestFftsGraphUtils, CovCalculateValueSizeMismatch) { | ||
| 571 | + auto builder = ut::GraphBuilder("root"); | ||
| 572 | + const auto &node1 = builder.AddNode("node1", "Relu", 1, 1); | ||
| 573 | + const auto &node2 = builder.AddNode("node2", "Relu", 1, 1); | ||
| 574 | + auto graph = builder.GetGraph(); | ||
| 575 | + const auto &calc_func = [](const NodePtr &n) { | ||
| 576 | + if (n->GetName() == "node1") { | ||
| 577 | + return std::vector<uint32_t>{1}; | ||
| 578 | + } | ||
| 579 | + return std::vector<uint32_t>{1, 2}; | ||
| 580 | + }; | ||
| 581 | + std::map<NodePtr, std::vector<uint32_t>> node_value; | ||
| 582 | + std::map<ComputeGraphPtr, std::vector<uint32_t>> graph_value; | ||
| 583 | + ASSERT_EQ(FftsGraphUtils::Calculate(graph, calc_func, node_value, graph_value, 1), GRAPH_FAILED); | ||
| 584 | +} | ||
| 585 | + | ||
| 586 | +TEST_F(UtestFftsGraphUtils, CovIsValueInvalid) { | ||
| 587 | + auto builder = ut::GraphBuilder("root"); | ||
| 588 | + const auto &node1 = builder.AddNode("node1", "Relu", 1, 1); | ||
| 589 | + auto graph = builder.GetGraph(); | ||
| 590 | + std::map<NodePtr, std::vector<uint32_t>> node_value; | ||
| 591 | + node_value[node1] = {1, 2}; | ||
| 592 | + std::map<ComputeGraphPtr, std::vector<uint32_t>> graph_value; | ||
| 593 | + graph_value[graph] = {1, 2}; | ||
| 594 | + std::vector<uint32_t> upper_limit = {8}; | ||
| 595 | + ASSERT_FALSE(FftsGraphUtils::IsValueValid(graph, upper_limit, node_value, graph_value)); | ||
| 596 | +} | ||
| 546 | } // namespace ge | 597 | } // namespace ge |
| @@ -0,0 +1,621 @@ | |||
| 1 | +/** | ||
| 2 | + * Copyright (c) 2025 Huawei Technologies Co., Ltd. | ||
| 3 | + * This program is free software, you can redistribute it and/or modify it under the terms and conditions of | ||
| 4 | + * CANN Open Software License Agreement Version 2.0 (the "License"). | ||
| 5 | + * Please refer to the License for details. You may not use this file except in compliance with the License. | ||
| 6 | + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, | ||
| 7 | + * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. | ||
| 8 | + * See LICENSE in the root of the software repository for the full text of the License. | ||
| 9 | + */ | ||
| 10 | + | ||
| 11 | + | ||
| 12 | + | ||
| 13 | + | ||
| 14 | + | ||
| 15 | + | ||
| 16 | + | ||
| 17 | + | ||
| 18 | + | ||
| 19 | + | ||
| 20 | + | ||
| 21 | + | ||
| 22 | + | ||
| 23 | + | ||
| 24 | + | ||
| 25 | + | ||
| 26 | +namespace ge { | ||
| 27 | +class GeIrUtilsCov : public testing::Test { | ||
| 28 | + protected: | ||
| 29 | + void SetUp() {} | ||
| 30 | + | ||
| 31 | + void TearDown() {} | ||
| 32 | +}; | ||
| 33 | + | ||
| 34 | +namespace { | ||
| 35 | +ComputeGraphPtr BuildCovGraph() { | ||
| 36 | + ut::GraphBuilder builder("cov_graph"); | ||
| 37 | + auto data = builder.AddNode("data1", "Data", 1, 1); | ||
| 38 | + auto add = builder.AddNode("add1", "Add", 2, 1); | ||
| 39 | + auto netoutput = builder.AddNode("netoutput1", "NetOutput", 1, 0); | ||
| 40 | + builder.AddDataEdge(data, 0, add, 0); | ||
| 41 | + builder.AddDataEdge(data, 0, add, 1); | ||
| 42 | + builder.AddDataEdge(add, 0, netoutput, 0); | ||
| 43 | + auto graph = builder.GetGraph(); | ||
| 44 | + graph->AddInputNode(data); | ||
| 45 | + graph->AddOutputNode(netoutput); | ||
| 46 | + return graph; | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +ComputeGraphPtr BuildCovGraphWithAttrs() { | ||
| 50 | + ut::GraphBuilder builder("cov_graph_attrs"); | ||
| 51 | + auto data = builder.AddNode("data1", "Data", 1, 1); | ||
| 52 | + auto const1 = builder.AddNode("const1", "Const", 0, 1); | ||
| 53 | + auto add = builder.AddNode("add1", "Add", 2, 1); | ||
| 54 | + auto netoutput = builder.AddNode("netoutput1", "NetOutput", 1, 0); | ||
| 55 | + | ||
| 56 | + GeTensorDesc const_td(GeShape({1, 1, 224, 224}), FORMAT_NCHW, DT_FLOAT); | ||
| 57 | + GeTensor tensor(const_td); | ||
| 58 | + std::vector<float> tensor_data(224 * 224, 1.0F); | ||
| 59 | + tensor.SetData(reinterpret_cast<uint8_t *>(tensor_data.data()), sizeof(float) * tensor_data.size()); | ||
| 60 | + AttrUtils::SetTensor(const1->GetOpDesc(), "value", tensor); | ||
| 61 | + | ||
| 62 | + AttrUtils::SetInt(add->GetOpDesc(), "int_attr", 42); | ||
| 63 | + AttrUtils::SetFloat(add->GetOpDesc(), "float_attr", 3.14F); | ||
| 64 | + AttrUtils::SetStr(add->GetOpDesc(), "str_attr", "hello"); | ||
| 65 | + AttrUtils::SetBool(add->GetOpDesc(), "bool_attr", true); | ||
| 66 | + AttrUtils::SetListInt(add->GetOpDesc(), "list_int_attr", {1, 2, 3}); | ||
| 67 | + AttrUtils::SetListFloat(add->GetOpDesc(), "list_float_attr", {1.0F, 2.0F}); | ||
| 68 | + AttrUtils::SetListStr(add->GetOpDesc(), "list_str_attr", {"a", "b"}); | ||
| 69 | + AttrUtils::SetListBool(add->GetOpDesc(), "list_bool_attr", {true, false}); | ||
| 70 | + | ||
| 71 | + builder.AddDataEdge(data, 0, add, 0); | ||
| 72 | + builder.AddDataEdge(const1, 0, add, 1); | ||
| 73 | + builder.AddDataEdge(add, 0, netoutput, 0); | ||
| 74 | + auto graph = builder.GetGraph(); | ||
| 75 | + graph->AddInputNode(data); | ||
| 76 | + graph->AddOutputNode(netoutput); | ||
| 77 | + return graph; | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +ComputeGraphPtr BuildCovGraphWithSubgraph() { | ||
| 81 | + auto root_builder = ut::GraphBuilder("root_graph"); | ||
| 82 | + auto parent = root_builder.AddNode("parent", PARTITIONEDCALL, 0, 1); | ||
| 83 | + auto netoutput = root_builder.AddNode("netoutput", NETOUTPUT, 1, 0); | ||
| 84 | + root_builder.AddDataEdge(parent, 0, netoutput, 0); | ||
| 85 | + auto root_graph = root_builder.GetGraph(); | ||
| 86 | + | ||
| 87 | + auto sub_builder = ut::GraphBuilder("sub_graph"); | ||
| 88 | + auto sub_const = sub_builder.AddNode("sub_const", "Const", 0, 1); | ||
| 89 | + auto sub_netoutput = sub_builder.AddNode("sub_netoutput", NETOUTPUT, 1, 0); | ||
| 90 | + sub_builder.AddDataEdge(sub_const, 0, sub_netoutput, 0); | ||
| 91 | + auto sub_graph = sub_builder.GetGraph(); | ||
| 92 | + sub_graph->SetParentNode(parent); | ||
| 93 | + sub_graph->SetParentGraph(root_graph); | ||
| 94 | + parent->GetOpDesc()->AddSubgraphName("f"); | ||
| 95 | + parent->GetOpDesc()->SetSubgraphInstanceName(0, "sub_graph"); | ||
| 96 | + root_graph->AddSubGraph(sub_graph); | ||
| 97 | + | ||
| 98 | + return root_graph; | ||
| 99 | +} | ||
| 100 | +} // namespace | ||
| 101 | + | ||
| 102 | +TEST_F(GeIrUtilsCov, ConvertGeModelToModelProtoSuccess) { | ||
| 103 | + auto compute_graph = BuildCovGraphWithAttrs(); | ||
| 104 | + ge::Model model("test_model", ""); | ||
| 105 | + model.SetGraph(compute_graph); | ||
| 106 | + onnx::ModelProto model_proto; | ||
| 107 | + EXPECT_TRUE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto)); | ||
| 108 | + EXPECT_EQ(model_proto.producer_name(), "test_model"); | ||
| 109 | + EXPECT_TRUE(model_proto.has_graph()); | ||
| 110 | + EXPECT_GT(model_proto.graph().node_size(), 0); | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +TEST_F(GeIrUtilsCov, ConvertGeModelToModelProtoNullGraph) { | ||
| 114 | + ge::Model model("empty_model", ""); | ||
| 115 | + onnx::ModelProto model_proto; | ||
| 116 | + EXPECT_FALSE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto)); | ||
| 117 | +} | ||
| 118 | + | ||
| 119 | +TEST_F(GeIrUtilsCov, ConvertGeModelToModelProtoWithDumpLevel) { | ||
| 120 | + auto compute_graph = BuildCovGraph(); | ||
| 121 | + ge::Model model("dump_model", ""); | ||
| 122 | + model.SetGraph(compute_graph); | ||
| 123 | + onnx::ModelProto model_proto; | ||
| 124 | + EXPECT_TRUE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto, DumpLevel::DUMP_ALL)); | ||
| 125 | + EXPECT_GT(model_proto.graph().node_size(), 0); | ||
| 126 | +} | ||
| 127 | + | ||
| 128 | +TEST_F(GeIrUtilsCov, ConvertGeModelToModelProtoWithDumpNoDesc) { | ||
| 129 | + auto compute_graph = BuildCovGraph(); | ||
| 130 | + ge::Model model("dump_nodesc_model", ""); | ||
| 131 | + model.SetGraph(compute_graph); | ||
| 132 | + onnx::ModelProto model_proto; | ||
| 133 | + EXPECT_TRUE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto, DumpLevel::DUMP_WITH_OUT_DESC)); | ||
| 134 | + EXPECT_GT(model_proto.graph().node_size(), 0); | ||
| 135 | +} | ||
| 136 | + | ||
| 137 | +TEST_F(GeIrUtilsCov, ConvertGeModelToModelProtoWithSubgraph) { | ||
| 138 | + auto compute_graph = BuildCovGraphWithSubgraph(); | ||
| 139 | + ge::Model model("subgraph_model", ""); | ||
| 140 | + model.SetGraph(compute_graph); | ||
| 141 | + onnx::ModelProto model_proto; | ||
| 142 | + EXPECT_TRUE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto)); | ||
| 143 | + EXPECT_GT(model_proto.graph().node_size(), 0); | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +TEST_F(GeIrUtilsCov, EncodeDataTypeAllTypes) { | ||
| 147 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_INT64), onnx::TensorProto_DataType_INT64); | ||
| 148 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_FLOAT), onnx::TensorProto_DataType_FLOAT); | ||
| 149 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_INT32), onnx::TensorProto_DataType_INT32); | ||
| 150 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_FLOAT16), onnx::TensorProto_DataType_FLOAT16); | ||
| 151 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_BOOL), onnx::TensorProto_DataType_BOOL); | ||
| 152 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_DOUBLE), onnx::TensorProto_DataType_DOUBLE); | ||
| 153 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_UINT8), onnx::TensorProto_DataType_UINT8); | ||
| 154 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_INT8), onnx::TensorProto_DataType_INT8); | ||
| 155 | + EXPECT_EQ(OnnxUtils::EncodeDataType(DT_DUAL), onnx::TensorProto_DataType_UNDEFINED); | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +TEST_F(GeIrUtilsCov, ParseNameAndIndexValid) { | ||
| 159 | + std::string node_name; | ||
| 160 | + int32_t idx = -1; | ||
| 161 | + EXPECT_TRUE(OnnxUtils::ParseNameAndIndex("node1:0", node_name, idx)); | ||
| 162 | + EXPECT_EQ(node_name, "node1"); | ||
| 163 | + EXPECT_EQ(idx, 0); | ||
| 164 | + | ||
| 165 | + EXPECT_TRUE(OnnxUtils::ParseNameAndIndex("node2:5", node_name, idx)); | ||
| 166 | + EXPECT_EQ(node_name, "node2"); | ||
| 167 | + EXPECT_EQ(idx, 5); | ||
| 168 | +} | ||
| 169 | + | ||
| 170 | +TEST_F(GeIrUtilsCov, ParseNameAndIndexNoColon) { | ||
| 171 | + std::string node_name; | ||
| 172 | + int32_t idx = -1; | ||
| 173 | + EXPECT_FALSE(OnnxUtils::ParseNameAndIndex("node_no_colon", node_name, idx)); | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +TEST_F(GeIrUtilsCov, DecodeAttributeStrings) { | ||
| 177 | + onnx::AttributeProto attr_proto; | ||
| 178 | + attr_proto.set_name("test_strings"); | ||
| 179 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_STRINGS); | ||
| 180 | + attr_proto.add_strings("value1"); | ||
| 181 | + attr_proto.add_strings("value2"); | ||
| 182 | + std::vector<std::string> strings; | ||
| 183 | + OnnxUtils::DecodeAttribute(attr_proto, strings); | ||
| 184 | + EXPECT_EQ(strings.size(), 2U); | ||
| 185 | + EXPECT_EQ(strings[0], "value1"); | ||
| 186 | + EXPECT_EQ(strings[1], "value2"); | ||
| 187 | +} | ||
| 188 | + | ||
| 189 | +TEST_F(GeIrUtilsCov, DecodeAttributeString) { | ||
| 190 | + onnx::AttributeProto attr_proto; | ||
| 191 | + attr_proto.set_name("test_string"); | ||
| 192 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_STRING); | ||
| 193 | + attr_proto.set_s("hello_world"); | ||
| 194 | + std::string value; | ||
| 195 | + OnnxUtils::DecodeAttribute(attr_proto, value); | ||
| 196 | + EXPECT_EQ(value, "hello_world"); | ||
| 197 | +} | ||
| 198 | + | ||
| 199 | +TEST_F(GeIrUtilsCov, DecodeAttributeInts) { | ||
| 200 | + onnx::AttributeProto attr_proto; | ||
| 201 | + attr_proto.set_name("test_ints"); | ||
| 202 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_INTS); | ||
| 203 | + attr_proto.add_ints(10); | ||
| 204 | + attr_proto.add_ints(20); | ||
| 205 | + attr_proto.add_ints(30); | ||
| 206 | + std::vector<int64_t> ints; | ||
| 207 | + OnnxUtils::DecodeAttribute(attr_proto, ints); | ||
| 208 | + EXPECT_EQ(ints.size(), 3U); | ||
| 209 | + EXPECT_EQ(ints[0], 10); | ||
| 210 | + EXPECT_EQ(ints[1], 20); | ||
| 211 | + EXPECT_EQ(ints[2], 30); | ||
| 212 | +} | ||
| 213 | + | ||
| 214 | +TEST_F(GeIrUtilsCov, DecodeAttributeInt) { | ||
| 215 | + onnx::AttributeProto attr_proto; | ||
| 216 | + attr_proto.set_name("test_int"); | ||
| 217 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_INT); | ||
| 218 | + attr_proto.set_i(99); | ||
| 219 | + int64_t value = 0; | ||
| 220 | + OnnxUtils::DecodeAttribute(attr_proto, value); | ||
| 221 | + EXPECT_EQ(value, 99); | ||
| 222 | +} | ||
| 223 | + | ||
| 224 | +TEST_F(GeIrUtilsCov, DecodeAttributeWrongType) { | ||
| 225 | + onnx::AttributeProto attr_proto; | ||
| 226 | + attr_proto.set_name("wrong_type"); | ||
| 227 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_FLOAT); | ||
| 228 | + std::vector<std::string> strings; | ||
| 229 | + strings.push_back("existing"); | ||
| 230 | + OnnxUtils::DecodeAttribute(attr_proto, strings); | ||
| 231 | + EXPECT_EQ(strings.size(), 1U); | ||
| 232 | + | ||
| 233 | + std::vector<int64_t> ints; | ||
| 234 | + ints.push_back(1); | ||
| 235 | + OnnxUtils::DecodeAttribute(attr_proto, ints); | ||
| 236 | + EXPECT_EQ(ints.size(), 1U); | ||
| 237 | + | ||
| 238 | + int64_t val = 5; | ||
| 239 | + OnnxUtils::DecodeAttribute(attr_proto, val); | ||
| 240 | + EXPECT_EQ(val, 5); | ||
| 241 | + | ||
| 242 | + std::string str = "orig"; | ||
| 243 | + OnnxUtils::DecodeAttribute(attr_proto, str); | ||
| 244 | + EXPECT_EQ(str, "orig"); | ||
| 245 | +} | ||
| 246 | + | ||
| 247 | +TEST_F(GeIrUtilsCov, IsEqualTemplate) { | ||
| 248 | + EXPECT_TRUE(IsEqual(1, 1, "int_equal")); | ||
| 249 | + EXPECT_FALSE(IsEqual(1, 2, "int_not_equal")); | ||
| 250 | + EXPECT_TRUE(IsEqual(std::string("abc"), std::string("abc"), "str_equal")); | ||
| 251 | + EXPECT_FALSE(IsEqual(std::string("abc"), std::string("xyz"), "str_not_equal")); | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +TEST_F(GeIrUtilsCov, EncodeNodeSuccess) { | ||
| 255 | + auto graph = BuildCovGraphWithAttrs(); | ||
| 256 | + auto add_node = graph->FindNode("add1"); | ||
| 257 | + ASSERT_NE(add_node, nullptr); | ||
| 258 | + onnx::NodeProto node_proto; | ||
| 259 | + EXPECT_TRUE(OnnxUtils::EncodeNode(add_node, &node_proto)); | ||
| 260 | + EXPECT_EQ(node_proto.name(), "add1"); | ||
| 261 | + EXPECT_TRUE(node_proto.op_type().find("Add") != std::string::npos); | ||
| 262 | +} | ||
| 263 | + | ||
| 264 | +TEST_F(GeIrUtilsCov, EncodeNodeNullPtr) { | ||
| 265 | + NodePtr null_node; | ||
| 266 | + onnx::NodeProto node_proto; | ||
| 267 | + EXPECT_FALSE(OnnxUtils::EncodeNode(null_node, &node_proto)); | ||
| 268 | +} | ||
| 269 | + | ||
| 270 | +TEST_F(GeIrUtilsCov, EncodeGraphSuccess) { | ||
| 271 | + auto graph = BuildCovGraph(); | ||
| 272 | + onnx::GraphProto graph_proto; | ||
| 273 | + EXPECT_TRUE(OnnxUtils::EncodeGraph(graph, &graph_proto)); | ||
| 274 | + EXPECT_EQ(graph_proto.name(), "cov_graph"); | ||
| 275 | + EXPECT_GT(graph_proto.node_size(), 0); | ||
| 276 | +} | ||
| 277 | + | ||
| 278 | +TEST_F(GeIrUtilsCov, EncodeGraphNullPtr) { | ||
| 279 | + ConstComputeGraphPtr null_graph; | ||
| 280 | + onnx::GraphProto graph_proto; | ||
| 281 | + EXPECT_FALSE(OnnxUtils::EncodeGraph(null_graph, &graph_proto)); | ||
| 282 | +} | ||
| 283 | + | ||
| 284 | +TEST_F(GeIrUtilsCov, EncodeNodeLinkSuccess) { | ||
| 285 | + auto graph = BuildCovGraph(); | ||
| 286 | + auto netoutput = graph->FindNode("netoutput1"); | ||
| 287 | + ASSERT_NE(netoutput, nullptr); | ||
| 288 | + onnx::NodeProto node_proto; | ||
| 289 | + EXPECT_TRUE(OnnxUtils::EncodeNodeLink(netoutput, &node_proto)); | ||
| 290 | + EXPECT_GT(node_proto.input_size(), 0); | ||
| 291 | +} | ||
| 292 | + | ||
| 293 | +TEST_F(GeIrUtilsCov, EncodeNodeDescSuccess) { | ||
| 294 | + auto graph = BuildCovGraphWithAttrs(); | ||
| 295 | + auto add_node = graph->FindNode("add1"); | ||
| 296 | + ASSERT_NE(add_node, nullptr); | ||
| 297 | + onnx::NodeProto node_proto; | ||
| 298 | + EXPECT_TRUE(OnnxUtils::EncodeNodeDesc(add_node, &node_proto)); | ||
| 299 | + bool found_id = false; | ||
| 300 | + for (const auto &attr : node_proto.attribute()) { | ||
| 301 | + if (attr.name() == "id") { | ||
| 302 | + found_id = true; | ||
| 303 | + break; | ||
| 304 | + } | ||
| 305 | + } | ||
| 306 | + EXPECT_TRUE(found_id); | ||
| 307 | +} | ||
| 308 | + | ||
| 309 | +TEST_F(GeIrUtilsCov, DecodeNodeDescSuccess) { | ||
| 310 | + auto graph = BuildCovGraphWithAttrs(); | ||
| 311 | + auto add_node = graph->FindNode("add1"); | ||
| 312 | + ASSERT_NE(add_node, nullptr); | ||
| 313 | + onnx::NodeProto node_proto; | ||
| 314 | + node_proto.set_name("decoded_node"); | ||
| 315 | + node_proto.set_op_type("ge:Add"); | ||
| 316 | + | ||
| 317 | + onnx::AttributeProto *nums_in = node_proto.add_attribute(); | ||
| 318 | + nums_in->set_name("input_desc_nums"); | ||
| 319 | + nums_in->set_type(onnx::AttributeProto_AttributeType_INT); | ||
| 320 | + nums_in->set_i(2); | ||
| 321 | + | ||
| 322 | + onnx::AttributeProto *nums_out = node_proto.add_attribute(); | ||
| 323 | + nums_out->set_name("output_desc_nums"); | ||
| 324 | + nums_out->set_type(onnx::AttributeProto_AttributeType_INT); | ||
| 325 | + nums_out->set_i(1); | ||
| 326 | + | ||
| 327 | + OpDescPtr op_desc = std::make_shared<OpDesc>(); | ||
| 328 | + EXPECT_TRUE(OnnxUtils::DecodeNodeDesc(&node_proto, op_desc)); | ||
| 329 | + EXPECT_EQ(op_desc->GetName(), "decoded_node"); | ||
| 330 | + EXPECT_EQ(op_desc->GetType(), "Add"); | ||
| 331 | +} | ||
| 332 | + | ||
| 333 | +TEST_F(GeIrUtilsCov, DecodeNodeDescFailNoColon) { | ||
| 334 | + onnx::NodeProto node_proto; | ||
| 335 | + node_proto.set_name("bad_node"); | ||
| 336 | + node_proto.set_op_type("NoPrefix"); | ||
| 337 | + OpDescPtr op_desc = std::make_shared<OpDesc>(); | ||
| 338 | + EXPECT_FALSE(OnnxUtils::DecodeNodeDesc(&node_proto, op_desc)); | ||
| 339 | +} | ||
| 340 | + | ||
| 341 | +TEST_F(GeIrUtilsCov, DecodeNodeDescNullParams) { | ||
| 342 | + OpDescPtr op_desc; | ||
| 343 | + onnx::NodeProto node_proto; | ||
| 344 | + EXPECT_FALSE(OnnxUtils::DecodeNodeDesc(nullptr, op_desc)); | ||
| 345 | + EXPECT_FALSE(OnnxUtils::DecodeNodeDesc(&node_proto, op_desc)); | ||
| 346 | +} | ||
| 347 | + | ||
| 348 | +TEST_F(GeIrUtilsCov, DecodeNodeLinkImpDataEdgeSuccess) { | ||
| 349 | + ut::GraphBuilder builder("test_link"); | ||
| 350 | + auto node1 = builder.AddNode("src_node", "Data", 1, 1); | ||
| 351 | + auto node2 = builder.AddNode("dst_node", "NetOutput", 1, 0); | ||
| 352 | + OnnxUtils::NodeLinkInfo item("src_node", 0, node2, 0, "dst_node"); | ||
| 353 | + EXPECT_TRUE(OnnxUtils::DecodeNodeLinkImp(item, node1)); | ||
| 354 | +} | ||
| 355 | + | ||
| 356 | +TEST_F(GeIrUtilsCov, DecodeNodeLinkImpNullNode) { | ||
| 357 | + NodePtr null_node; | ||
| 358 | + OnnxUtils::NodeLinkInfo item("src", 0, null_node, 0, "dst"); | ||
| 359 | + EXPECT_FALSE(OnnxUtils::DecodeNodeLinkImp(item, null_node)); | ||
| 360 | +} | ||
| 361 | + | ||
| 362 | +TEST_F(GeIrUtilsCov, DecodeNodeLinkImpDataAnchorFail) { | ||
| 363 | + ut::GraphBuilder builder("test_link_fail"); | ||
| 364 | + auto node1 = builder.AddNode("src_node", "Data", 1, 1); | ||
| 365 | + auto node2 = builder.AddNode("dst_node", "NetOutput", 1, 0); | ||
| 366 | + OnnxUtils::NodeLinkInfo item("src_node", 5, node2, 0, "dst_node"); | ||
| 367 | + EXPECT_FALSE(OnnxUtils::DecodeNodeLinkImp(item, node1)); | ||
| 368 | +} | ||
| 369 | + | ||
| 370 | +TEST_F(GeIrUtilsCov, DecodeNodeLinkImpControlEdgeSuccess) { | ||
| 371 | + ut::GraphBuilder builder("test_ctrl"); | ||
| 372 | + auto node1 = builder.AddNode("src_node", "Data", 1, 1); | ||
| 373 | + auto node2 = builder.AddNode("dst_node", "NetOutput", 1, 0); | ||
| 374 | + OnnxUtils::NodeLinkInfo item("src_node", -1, node2, 0, "dst_node"); | ||
| 375 | + EXPECT_TRUE(OnnxUtils::DecodeNodeLinkImp(item, node1)); | ||
| 376 | +} | ||
| 377 | + | ||
| 378 | +TEST_F(GeIrUtilsCov, DecodeGraphSuccess) { | ||
| 379 | + auto graph = BuildCovGraph(); | ||
| 380 | + ge::Model model("decode_model", ""); | ||
| 381 | + model.SetGraph(graph); | ||
| 382 | + onnx::ModelProto model_proto; | ||
| 383 | + ASSERT_TRUE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto)); | ||
| 384 | + | ||
| 385 | + ComputeGraphPtr decoded_graph; | ||
| 386 | + EXPECT_TRUE(OnnxUtils::DecodeGraph(0, model_proto.graph(), decoded_graph)); | ||
| 387 | + ASSERT_NE(decoded_graph, nullptr); | ||
| 388 | +} | ||
| 389 | + | ||
| 390 | +TEST_F(GeIrUtilsCov, DecodeGraphMaxDepth) { | ||
| 391 | + onnx::GraphProto graph_proto; | ||
| 392 | + ComputeGraphPtr graph; | ||
| 393 | + EXPECT_FALSE(OnnxUtils::DecodeGraph(20, graph_proto, graph)); | ||
| 394 | +} | ||
| 395 | + | ||
| 396 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeFloat) { | ||
| 397 | + onnx::NodeProto node_proto; | ||
| 398 | + std::pair<const std::string, ge::GeAttrValue> attr_pair("float_attr", ge::GeAttrValue()); | ||
| 399 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 400 | + AttrUtils::SetFloat(op_desc, "float_attr", 1.5F); | ||
| 401 | + GeAttrValue attr_value; | ||
| 402 | + op_desc->GetAttr("float_attr", attr_value); | ||
| 403 | + std::pair<const std::string, ge::GeAttrValue> pair("float_attr", attr_value); | ||
| 404 | + OnnxUtils::AddAttrProtoFromAttribute(pair, &node_proto); | ||
| 405 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 406 | + EXPECT_EQ(node_proto.attribute(0).name(), "float_attr"); | ||
| 407 | + EXPECT_EQ(node_proto.attribute(0).type(), onnx::AttributeProto_AttributeType_FLOAT); | ||
| 408 | + EXPECT_FLOAT_EQ(node_proto.attribute(0).f(), 1.5F); | ||
| 409 | +} | ||
| 410 | + | ||
| 411 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeInt) { | ||
| 412 | + onnx::NodeProto node_proto; | ||
| 413 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 414 | + AttrUtils::SetInt(op_desc, "int_attr", 42); | ||
| 415 | + GeAttrValue attr_value; | ||
| 416 | + op_desc->GetAttr("int_attr", attr_value); | ||
| 417 | + std::pair<const std::string, ge::GeAttrValue> pair("int_attr", attr_value); | ||
| 418 | + OnnxUtils::AddAttrProtoFromAttribute(pair, &node_proto); | ||
| 419 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 420 | + EXPECT_EQ(node_proto.attribute(0).name(), "int_attr"); | ||
| 421 | + EXPECT_EQ(node_proto.attribute(0).type(), onnx::AttributeProto_AttributeType_INT); | ||
| 422 | + EXPECT_EQ(node_proto.attribute(0).i(), 42); | ||
| 423 | +} | ||
| 424 | + | ||
| 425 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeString) { | ||
| 426 | + onnx::NodeProto node_proto; | ||
| 427 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 428 | + AttrUtils::SetStr(op_desc, "str_attr", "test_value"); | ||
| 429 | + GeAttrValue attr_value; | ||
| 430 | + op_desc->GetAttr("str_attr", attr_value); | ||
| 431 | + std::pair<const std::string, ge::GeAttrValue> pair("str_attr", attr_value); | ||
| 432 | + OnnxUtils::AddAttrProtoFromAttribute(pair, &node_proto); | ||
| 433 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 434 | + EXPECT_EQ(node_proto.attribute(0).name(), "str_attr"); | ||
| 435 | + EXPECT_EQ(node_proto.attribute(0).type(), onnx::AttributeProto_AttributeType_STRING); | ||
| 436 | + EXPECT_EQ(node_proto.attribute(0).s(), "test_value"); | ||
| 437 | +} | ||
| 438 | + | ||
| 439 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeListInt) { | ||
| 440 | + onnx::NodeProto node_proto; | ||
| 441 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 442 | + AttrUtils::SetListInt(op_desc, "list_int_attr", {1, 2, 3}); | ||
| 443 | + GeAttrValue attr_value; | ||
| 444 | + op_desc->GetAttr("list_int_attr", attr_value); | ||
| 445 | + std::pair<const std::string, ge::GeAttrValue> pair("list_int_attr", attr_value); | ||
| 446 | + OnnxUtils::AddAttrProtoFromAttribute(pair, &node_proto); | ||
| 447 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 448 | + EXPECT_EQ(node_proto.attribute(0).name(), "list_int_attr"); | ||
| 449 | + EXPECT_EQ(node_proto.attribute(0).type(), onnx::AttributeProto_AttributeType_INTS); | ||
| 450 | + EXPECT_EQ(node_proto.attribute(0).ints_size(), 3); | ||
| 451 | +} | ||
| 452 | + | ||
| 453 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeListFloat) { | ||
| 454 | + onnx::NodeProto node_proto; | ||
| 455 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 456 | + AttrUtils::SetListFloat(op_desc, "list_float_attr", {1.0F, 2.0F}); | ||
| 457 | + GeAttrValue attr_value; | ||
| 458 | + op_desc->GetAttr("list_float_attr", attr_value); | ||
| 459 | + std::pair<const std::string, ge::GeAttrValue> pair("list_float_attr", attr_value); | ||
| 460 | + OnnxUtils::AddAttrProtoFromAttribute(pair, &node_proto); | ||
| 461 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 462 | + EXPECT_EQ(node_proto.attribute(0).name(), "list_float_attr"); | ||
| 463 | + EXPECT_EQ(node_proto.attribute(0).type(), onnx::AttributeProto_AttributeType_FLOATS); | ||
| 464 | + EXPECT_EQ(node_proto.attribute(0).floats_size(), 2); | ||
| 465 | +} | ||
| 466 | + | ||
| 467 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeListString) { | ||
| 468 | + onnx::NodeProto node_proto; | ||
| 469 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 470 | + AttrUtils::SetListStr(op_desc, "list_str_attr", {"a", "b"}); | ||
| 471 | + GeAttrValue attr_value; | ||
| 472 | + op_desc->GetAttr("list_str_attr", attr_value); | ||
| 473 | + std::pair<const std::string, ge::GeAttrValue> pair("list_str_attr", attr_value); | ||
| 474 | + OnnxUtils::AddAttrProtoFromAttribute(pair, &node_proto); | ||
| 475 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 476 | + EXPECT_EQ(node_proto.attribute(0).name(), "list_str_attr"); | ||
| 477 | + EXPECT_EQ(node_proto.attribute(0).type(), onnx::AttributeProto_AttributeType_STRINGS); | ||
| 478 | + EXPECT_EQ(node_proto.attribute(0).strings_size(), 2); | ||
| 479 | +} | ||
| 480 | + | ||
| 481 | +TEST_F(GeIrUtilsCov, AddAttrProtoFromAttributeNullNodeProto) { | ||
| 482 | + std::pair<const std::string, ge::GeAttrValue> pair("attr", ge::GeAttrValue()); | ||
| 483 | + OnnxUtils::AddAttrProtoFromAttribute(pair, nullptr); | ||
| 484 | + SUCCEED(); | ||
| 485 | +} | ||
| 486 | + | ||
| 487 | +TEST_F(GeIrUtilsCov, AddAttrProtoNullNodeProto) { | ||
| 488 | + float val = 1.0F; | ||
| 489 | + OnnxUtils::AddAttrProto(nullptr, onnx::AttributeProto_AttributeType_FLOAT, "test", &val); | ||
| 490 | + SUCCEED(); | ||
| 491 | +} | ||
| 492 | + | ||
| 493 | +TEST_F(GeIrUtilsCov, AddAttrProtoFloat) { | ||
| 494 | + onnx::NodeProto node_proto; | ||
| 495 | + float val = 3.14F; | ||
| 496 | + OnnxUtils::AddAttrProto(&node_proto, onnx::AttributeProto_AttributeType_FLOAT, "float_attr", &val); | ||
| 497 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 498 | + EXPECT_FLOAT_EQ(node_proto.attribute(0).f(), 3.14F); | ||
| 499 | +} | ||
| 500 | + | ||
| 501 | +TEST_F(GeIrUtilsCov, AddAttrProtoInt) { | ||
| 502 | + onnx::NodeProto node_proto; | ||
| 503 | + int64_t val = 100; | ||
| 504 | + OnnxUtils::AddAttrProto(&node_proto, onnx::AttributeProto_AttributeType_INT, "int_attr", &val); | ||
| 505 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 506 | + EXPECT_EQ(node_proto.attribute(0).i(), 100); | ||
| 507 | +} | ||
| 508 | + | ||
| 509 | +TEST_F(GeIrUtilsCov, AddAttrProtoString) { | ||
| 510 | + onnx::NodeProto node_proto; | ||
| 511 | + std::string val = "test_str"; | ||
| 512 | + OnnxUtils::AddAttrProto(&node_proto, onnx::AttributeProto_AttributeType_STRING, "str_attr", &val); | ||
| 513 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 514 | + EXPECT_EQ(node_proto.attribute(0).s(), "test_str"); | ||
| 515 | +} | ||
| 516 | + | ||
| 517 | +TEST_F(GeIrUtilsCov, AddAttrProtoFloats) { | ||
| 518 | + onnx::NodeProto node_proto; | ||
| 519 | + std::vector<float> val = {1.0F, 2.0F, 3.0F}; | ||
| 520 | + OnnxUtils::AddAttrProto(&node_proto, onnx::AttributeProto_AttributeType_FLOATS, "floats_attr", &val); | ||
| 521 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 522 | + EXPECT_EQ(node_proto.attribute(0).floats_size(), 3); | ||
| 523 | +} | ||
| 524 | + | ||
| 525 | +TEST_F(GeIrUtilsCov, AddAttrProtoInts) { | ||
| 526 | + onnx::NodeProto node_proto; | ||
| 527 | + std::vector<int64_t> val = {10, 20, 30}; | ||
| 528 | + OnnxUtils::AddAttrProto(&node_proto, onnx::AttributeProto_AttributeType_INTS, "ints_attr", &val); | ||
| 529 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 530 | + EXPECT_EQ(node_proto.attribute(0).ints_size(), 3); | ||
| 531 | +} | ||
| 532 | + | ||
| 533 | +TEST_F(GeIrUtilsCov, AddAttrProtoStrings) { | ||
| 534 | + onnx::NodeProto node_proto; | ||
| 535 | + std::vector<std::string> val = {"a", "b"}; | ||
| 536 | + OnnxUtils::AddAttrProto(&node_proto, onnx::AttributeProto_AttributeType_STRINGS, "strings_attr", &val); | ||
| 537 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 538 | + EXPECT_EQ(node_proto.attribute(0).strings_size(), 2); | ||
| 539 | +} | ||
| 540 | + | ||
| 541 | +TEST_F(GeIrUtilsCov, AddAttrProtoUnsupportedType) { | ||
| 542 | + onnx::NodeProto node_proto; | ||
| 543 | + int64_t val = 1; | ||
| 544 | + OnnxUtils::AddAttrProto(&node_proto, static_cast<onnx::AttributeProto_AttributeType>(999), "unsupported", &val); | ||
| 545 | + EXPECT_EQ(node_proto.attribute_size(), 1); | ||
| 546 | +} | ||
| 547 | + | ||
| 548 | +TEST_F(GeIrUtilsCov, DecodeNodeAttributeForOpInDesc) { | ||
| 549 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 550 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_FLOAT); | ||
| 551 | + op_desc->AddInputDesc(tensor_desc); | ||
| 552 | + | ||
| 553 | + onnx::AttributeProto attr_proto; | ||
| 554 | + attr_proto.set_name("input_desc_dtype:0"); | ||
| 555 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_STRING); | ||
| 556 | + attr_proto.set_s("DT_INT32"); | ||
| 557 | + OnnxUtils::DecodeNodeAttributeForOpInAndOutDesc(attr_proto, "input_desc_dtype", 0, op_desc); | ||
| 558 | + EXPECT_EQ(op_desc->GetInputDesc(0).GetDataType(), DT_INT32); | ||
| 559 | +} | ||
| 560 | + | ||
| 561 | +TEST_F(GeIrUtilsCov, DecodeNodeAttributeForOpOutDesc) { | ||
| 562 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 563 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_FLOAT); | ||
| 564 | + op_desc->AddOutputDesc(tensor_desc); | ||
| 565 | + | ||
| 566 | + onnx::AttributeProto attr_proto; | ||
| 567 | + attr_proto.set_name("output_desc_dtype:0"); | ||
| 568 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_STRING); | ||
| 569 | + attr_proto.set_s("DT_INT32"); | ||
| 570 | + OnnxUtils::DecodeNodeAttributeForOpOutDesc(attr_proto, "output_desc_dtype", 0, op_desc); | ||
| 571 | + EXPECT_EQ(op_desc->GetOutputDesc(0).GetDataType(), DT_INT32); | ||
| 572 | +} | ||
| 573 | + | ||
| 574 | +TEST_F(GeIrUtilsCov, DecodeNodeAttributeForOpDescStreamId) { | ||
| 575 | + auto op_desc = std::make_shared<OpDesc>("test_op", "Relu"); | ||
| 576 | + onnx::AttributeProto attr_proto; | ||
| 577 | + attr_proto.set_name("stream_id"); | ||
| 578 | + attr_proto.set_type(onnx::AttributeProto_AttributeType_INT); | ||
| 579 | + attr_proto.set_i(7); | ||
| 580 | + OnnxUtils::DecodeNodeAttributeForOpDesc(attr_proto, op_desc); | ||
| 581 | + EXPECT_EQ(op_desc->GetStreamId(), 7); | ||
| 582 | +} | ||
| 583 | + | ||
| 584 | +TEST_F(GeIrUtilsCov, DecodeNodeAttributeForOpDescNullPtr) { | ||
| 585 | + OpDescPtr null_op; | ||
| 586 | + onnx::AttributeProto attr_proto; | ||
| 587 | + OnnxUtils::DecodeNodeAttributeForOpDesc(attr_proto, null_op); | ||
| 588 | + SUCCEED(); | ||
| 589 | +} | ||
| 590 | + | ||
| 591 | +TEST_F(GeIrUtilsCov, EncodeValueInfoSuccess) { | ||
| 592 | + auto graph = BuildCovGraph(); | ||
| 593 | + auto data_node = graph->FindNode("data1"); | ||
| 594 | + ASSERT_NE(data_node, nullptr); | ||
| 595 | + onnx::ValueInfoProto value_info; | ||
| 596 | + OnnxUtils::EncodeValueInfo(data_node, &value_info); | ||
| 597 | + EXPECT_EQ(value_info.name(), "data1"); | ||
| 598 | +} | ||
| 599 | + | ||
| 600 | +TEST_F(GeIrUtilsCov, EncodeValueInfoNullPtr) { | ||
| 601 | + NodePtr null_node; | ||
| 602 | + onnx::ValueInfoProto value_info; | ||
| 603 | + OnnxUtils::EncodeValueInfo(null_node, &value_info); | ||
| 604 | + SUCCEED(); | ||
| 605 | +} | ||
| 606 | + | ||
| 607 | +TEST_F(GeIrUtilsCov, AddInputAndOutputNodesForGraphSuccess) { | ||
| 608 | + auto graph = BuildCovGraph(); | ||
| 609 | + ge::Model model("test", ""); | ||
| 610 | + model.SetGraph(graph); | ||
| 611 | + onnx::ModelProto model_proto; | ||
| 612 | + ASSERT_TRUE(OnnxUtils::ConvertGeModelToModelProto(model, model_proto)); | ||
| 613 | + | ||
| 614 | + ComputeGraphPtr new_graph = std::make_shared<ComputeGraph>("new_graph"); | ||
| 615 | + std::map<std::string, NodePtr> node_map; | ||
| 616 | + for (const auto &node : graph->GetDirectNode()) { | ||
| 617 | + node_map[node->GetName()] = node; | ||
| 618 | + } | ||
| 619 | + EXPECT_TRUE(OnnxUtils::AddInputAndOutputNodesForGraph(model_proto.graph(), new_graph, node_map)); | ||
| 620 | +} | ||
| 621 | +} // namespace ge | ||
| @@ -5472,4 +5472,113 @@ TEST_F(UtestGraphUtils, PostProcess_RecordOriginalNamesWhenNotExists) { | |||
| 5472 | EXPECT_EQ(node1->GetName(), "test_owner/node1"); | 5472 | EXPECT_EQ(node1->GetName(), "test_owner/node1"); |
| 5473 | EXPECT_EQ(node2->GetName(), "test_owner/node2"); | 5473 | EXPECT_EQ(node2->GetName(), "test_owner/node2"); |
| 5474 | } | 5474 | } |
| 5475 | + | ||
| 5476 | +TEST_F(UtestGraphUtils, CovGraphUtilsExInferShapeInNeedVerifyFail) { | ||
| 5477 | + ut::GraphBuilder builder = ut::GraphBuilder("test_graph"); | ||
| 5478 | + auto node = builder.AddNode("cast", "Cast", 1, 1, FORMAT_NCHW, DT_FLOAT, {4}); | ||
| 5479 | + AttrUtils::SetBool(node->GetOpDesc(), NEED_INFER, true); | ||
| 5480 | + auto graph = builder.GetGraph(); | ||
| 5481 | + EXPECT_EQ(GraphUtilsEx::InferShapeInNeed(graph), GRAPH_FAILED); | ||
| 5482 | +} | ||
| 5483 | + | ||
| 5484 | +TEST_F(UtestGraphUtils, CovGraphUtilsExInferShapeInNeedNoInferFunc) { | ||
| 5485 | + ut::GraphBuilder builder = ut::GraphBuilder("test_graph"); | ||
| 5486 | + auto data = builder.AddNode("data", "Data", 1, 1, FORMAT_NCHW, DT_FLOAT, {4}); | ||
| 5487 | + auto cast = builder.AddNode("cast", "Cast", 1, 1, FORMAT_NCHW, DT_FLOAT, {4}); | ||
| 5488 | + AttrUtils::SetBool(cast->GetOpDesc(), NEED_INFER, true); | ||
| 5489 | + builder.AddDataEdge(data, 0, cast, 0); | ||
| 5490 | + auto graph = builder.GetGraph(); | ||
| 5491 | + EXPECT_EQ(GraphUtilsEx::InferShapeInNeed(graph), GRAPH_SUCCESS); | ||
| 5492 | +} | ||
| 5493 | + | ||
| 5494 | +TEST_F(UtestGraphUtils, CovGraphUtilsExInferShapeInNeedInferFail) { | ||
| 5495 | + ut::GraphBuilder builder = ut::GraphBuilder("test_graph"); | ||
| 5496 | + auto data = builder.AddNode("data", "Data", 1, 1, FORMAT_NCHW, DT_FLOAT, {4}); | ||
| 5497 | + auto cast = builder.AddNode("cast", "Cast", 1, 1, FORMAT_NCHW, DT_FLOAT, {4}); | ||
| 5498 | + AttrUtils::SetBool(cast->GetOpDesc(), NEED_INFER, true); | ||
| 5499 | + const auto stub_func = [](Operator &op) { return GRAPH_FAILED; }; | ||
| 5500 | + cast->GetOpDesc()->AddInferFunc(stub_func); | ||
| 5501 | + builder.AddDataEdge(data, 0, cast, 0); | ||
| 5502 | + auto graph = builder.GetGraph(); | ||
| 5503 | + EXPECT_EQ(GraphUtilsEx::InferShapeInNeed(graph), GRAPH_FAILED); | ||
| 5504 | +} | ||
| 5505 | + | ||
| 5506 | +TEST_F(UtestGraphUtils, CovGraphUtilsExCopyGraphWithParent) { | ||
| 5507 | + auto parent_cg = std::make_shared<ComputeGraph>("parent"); | ||
| 5508 | + auto sub_cg = std::make_shared<ComputeGraph>("sub"); | ||
| 5509 | + sub_cg->SetParentGraph(parent_cg); | ||
| 5510 | + Graph src_graph = GraphUtilsEx::CreateGraphFromComputeGraph(sub_cg); | ||
| 5511 | + Graph dst_graph("dst"); | ||
| 5512 | + EXPECT_EQ(GraphUtilsEx::CopyGraph(src_graph, dst_graph), GRAPH_FAILED); | ||
| 5513 | +} | ||
| 5514 | + | ||
| 5515 | +TEST_F(UtestGraphUtils, CovMoveNodeToGraphSuccess) { | ||
| 5516 | + auto builder = ut::GraphBuilder("src"); | ||
| 5517 | + const auto &node = builder.AddNode("node1", "Relu", 1, 1); | ||
| 5518 | + auto src_graph = builder.GetGraph(); | ||
| 5519 | + auto dst_graph = std::make_shared<ComputeGraph>("dst"); | ||
| 5520 | + auto ret = GraphUtils::MoveNodeToGraph(node, *dst_graph); | ||
| 5521 | + EXPECT_EQ(ret, GRAPH_SUCCESS); | ||
| 5522 | + EXPECT_EQ(src_graph->GetDirectNodesSize(), 0U); | ||
| 5523 | + EXPECT_EQ(dst_graph->GetDirectNodesSize(), 1U); | ||
| 5524 | +} | ||
| 5525 | + | ||
| 5526 | +TEST_F(UtestGraphUtils, CovMoveNodeToGraphNullNode) { | ||
| 5527 | + auto dst_graph = std::make_shared<ComputeGraph>("dst"); | ||
| 5528 | + NodePtr null_node = nullptr; | ||
| 5529 | + auto ret = GraphUtils::MoveNodeToGraph(null_node, *dst_graph); | ||
| 5530 | + EXPECT_NE(ret, GRAPH_SUCCESS); | ||
| 5531 | +} | ||
| 5532 | + | ||
| 5533 | +TEST_F(UtestGraphUtils, CovWriteProtoToOStreamSuccess) { | ||
| 5534 | + onnx::ModelProto model_proto; | ||
| 5535 | + model_proto.set_producer_name("test"); | ||
| 5536 | + std::ostringstream os; | ||
| 5537 | + auto ret = GraphUtils::WriteProtoToOStream(model_proto, os); | ||
| 5538 | + EXPECT_EQ(ret, SUCCESS); | ||
| 5539 | + EXPECT_FALSE(os.str().empty()); | ||
| 5540 | +} | ||
| 5541 | + | ||
| 5542 | +TEST_F(UtestGraphUtils, CovWriteReadableDumpToOStreamSuccess) { | ||
| 5543 | + std::stringstream readable_ss; | ||
| 5544 | + readable_ss << "test readable dump content"; | ||
| 5545 | + std::ostringstream os; | ||
| 5546 | + auto ret = GraphUtils::WriteReadableDumpToOStream(readable_ss, os); | ||
| 5547 | + EXPECT_EQ(ret, SUCCESS); | ||
| 5548 | + EXPECT_EQ(os.str(), "test readable dump content"); | ||
| 5549 | +} | ||
| 5550 | + | ||
| 5551 | +TEST_F(UtestGraphUtils, CovWriteReadableDumpToOStreamBadStream) { | ||
| 5552 | + std::stringstream readable_ss; | ||
| 5553 | + readable_ss << "test"; | ||
| 5554 | + std::ostringstream os; | ||
| 5555 | + os.setstate(std::ios::failbit); | ||
| 5556 | + auto ret = GraphUtils::WriteReadableDumpToOStream(readable_ss, os); | ||
| 5557 | + EXPECT_NE(ret, SUCCESS); | ||
| 5558 | +} | ||
| 5559 | + | ||
| 5560 | +TEST_F(UtestGraphUtils, CovDumpGEGraphByPathInt64Overload) { | ||
| 5561 | + auto builder = ut::GraphBuilder("root"); | ||
| 5562 | + const auto &node = builder.AddNode("node1", "Relu", 1, 1); | ||
| 5563 | + auto graph = builder.GetGraph(); | ||
| 5564 | + auto ret = | ||
| 5565 | + GraphUtils::DumpGEGraphByPath(graph, "./test_graph_int64.txt", static_cast<int64_t>(ge::DumpLevel::NO_DUMP)); | ||
| 5566 | + EXPECT_EQ(ret, GRAPH_SUCCESS); | ||
| 5567 | + system("rm -f ./test_graph_int64.txt"); | ||
| 5568 | +} | ||
| 5569 | + | ||
| 5570 | +TEST_F(UtestGraphUtils, CovWriteReadableDumpToTextFile) { | ||
| 5571 | + std::stringstream readable_ss; | ||
| 5572 | + readable_ss << "test readable dump to file"; | ||
| 5573 | + GraphUtils::WriteReadableDumpToTextFile(readable_ss, "./test_readable_dump_cov.txt"); | ||
| 5574 | + SUCCEED(); | ||
| 5575 | + system("rm -f ./test_readable_dump_cov.txt"); | ||
| 5576 | +} | ||
| 5577 | + | ||
| 5578 | +TEST_F(UtestGraphUtils, CovWriteProtoToTextFileInvalidPath) { | ||
| 5579 | + onnx::ModelProto model_proto; | ||
| 5580 | + model_proto.set_producer_name("test"); | ||
| 5581 | + GraphUtils::WriteProtoToTextFile(model_proto, "/nonexistent_dir/cov_test.txt"); | ||
| 5582 | + SUCCEED(); | ||
| 5583 | +} | ||
| 5475 | } // namespace ge | 5584 | } // namespace ge |
| @@ -1154,4 +1154,75 @@ TEST_F(UtestNodeUtils, Verify_noneed_update_output_name) { | |||
| 1154 | 1154 | ||
| 1155 | EXPECT_EQ(data_node->GetOpDesc()->GetAllOutputName().cbegin()->first, "yy"); | 1155 | EXPECT_EQ(data_node->GetOpDesc()->GetAllOutputName().cbegin()->first, "yy"); |
| 1156 | } | 1156 | } |
| 1157 | + | ||
| 1158 | +TEST_F(UtestNodeUtils, CovGetParentNode) { | ||
| 1159 | + ut::GraphBuilder builder = ut::GraphBuilder("root"); | ||
| 1160 | + const auto &node = builder.AddNode("node1", "Relu", 1, 1); | ||
| 1161 | + auto parent = NodeUtils::GetParentNode(node); | ||
| 1162 | + EXPECT_EQ(parent, nullptr); | ||
| 1163 | +} | ||
| 1164 | + | ||
| 1165 | +TEST_F(UtestNodeUtils, CovGetParentNodeNullPtr) { | ||
| 1166 | + NodePtr null_node; | ||
| 1167 | + auto parent = NodeUtils::GetParentNode(null_node); | ||
| 1168 | + EXPECT_EQ(parent, nullptr); | ||
| 1169 | +} | ||
| 1170 | + | ||
| 1171 | +TEST_F(UtestNodeUtils, CovGetParentNodeWithSubgraph) { | ||
| 1172 | + auto root_builder = ut::GraphBuilder("root_graph"); | ||
| 1173 | + const auto &parent_node = root_builder.AddNode("parent", PARTITIONEDCALL, 0, 1); | ||
| 1174 | + const auto &netoutput = root_builder.AddNode("netoutput", NETOUTPUT, 1, 0); | ||
| 1175 | + root_builder.AddDataEdge(parent_node, 0, netoutput, 0); | ||
| 1176 | + auto root_graph = root_builder.GetGraph(); | ||
| 1177 | + | ||
| 1178 | + auto sub_builder = ut::GraphBuilder("sub_graph"); | ||
| 1179 | + const auto &sub_data = sub_builder.AddNode("sub_data", "Data", 1, 1); | ||
| 1180 | + const auto &sub_netoutput = sub_builder.AddNode("sub_netoutput", NETOUTPUT, 1, 0); | ||
| 1181 | + sub_builder.AddDataEdge(sub_data, 0, sub_netoutput, 0); | ||
| 1182 | + auto sub_graph = sub_builder.GetGraph(); | ||
| 1183 | + sub_graph->SetParentNode(parent_node); | ||
| 1184 | + sub_graph->SetParentGraph(root_graph); | ||
| 1185 | + parent_node->GetOpDesc()->AddSubgraphName("f"); | ||
| 1186 | + parent_node->GetOpDesc()->SetSubgraphInstanceName(0, "sub_graph"); | ||
| 1187 | + root_graph->AddSubGraph(sub_graph); | ||
| 1188 | + | ||
| 1189 | + auto result = NodeUtils::GetParentNode(sub_data); | ||
| 1190 | + EXPECT_NE(result, nullptr); | ||
| 1191 | + EXPECT_EQ(result->GetName(), "parent"); | ||
| 1192 | +} | ||
| 1193 | + | ||
| 1194 | +TEST_F(UtestNodeUtils, CovRemoveSubgraphsOnNode) { | ||
| 1195 | + auto root_builder = ut::GraphBuilder("root_graph"); | ||
| 1196 | + const auto &parent_node = root_builder.AddNode("parent", PARTITIONEDCALL, 0, 1); | ||
| 1197 | + const auto &netoutput = root_builder.AddNode("netoutput", NETOUTPUT, 1, 0); | ||
| 1198 | + root_builder.AddDataEdge(parent_node, 0, netoutput, 0); | ||
| 1199 | + auto root_graph = root_builder.GetGraph(); | ||
| 1200 | + | ||
| 1201 | + auto sub_builder = ut::GraphBuilder("sub_graph"); | ||
| 1202 | + const auto &sub_const = sub_builder.AddNode("sub_const", "Const", 0, 1); | ||
| 1203 | + const auto &sub_netoutput = sub_builder.AddNode("sub_netoutput", NETOUTPUT, 1, 0); | ||
| 1204 | + sub_builder.AddDataEdge(sub_const, 0, sub_netoutput, 0); | ||
| 1205 | + auto sub_graph = sub_builder.GetGraph(); | ||
| 1206 | + sub_graph->SetParentNode(parent_node); | ||
| 1207 | + sub_graph->SetParentGraph(root_graph); | ||
| 1208 | + parent_node->GetOpDesc()->AddSubgraphName("f"); | ||
| 1209 | + parent_node->GetOpDesc()->SetSubgraphInstanceName(0, "sub_graph"); | ||
| 1210 | + root_graph->AddSubgraph(sub_graph->GetName(), sub_graph); | ||
| 1211 | + | ||
| 1212 | + EXPECT_EQ(NodeUtils::RemoveSubgraphsOnNode(parent_node), GRAPH_SUCCESS); | ||
| 1213 | + const auto &names = parent_node->GetOpDesc()->GetSubgraphInstanceNames(); | ||
| 1214 | + EXPECT_EQ(names.size(), 1U); | ||
| 1215 | + EXPECT_EQ(names[0], ""); | ||
| 1216 | +} | ||
| 1217 | + | ||
| 1218 | +TEST_F(UtestNodeUtils, CovRemoveSubgraphsOnNodeNoSubgraph) { | ||
| 1219 | + ut::GraphBuilder builder = ut::GraphBuilder("root"); | ||
| 1220 | + const auto &node = builder.AddNode("node1", "Relu", 1, 1); | ||
| 1221 | + EXPECT_EQ(NodeUtils::RemoveSubgraphsOnNode(node), GRAPH_SUCCESS); | ||
| 1222 | +} | ||
| 1223 | + | ||
| 1224 | +TEST_F(UtestNodeUtils, CovRemoveSubgraphsOnNodeNullPtr) { | ||
| 1225 | + NodePtr null_node; | ||
| 1226 | + EXPECT_NE(NodeUtils::RemoveSubgraphsOnNode(null_node), GRAPH_SUCCESS); | ||
| 1227 | +} | ||
| 1157 | } // namespace ge | 1228 | } // namespace ge |
| @@ -1112,4 +1112,40 @@ TEST_F(UtestOpDesc, TestGetOrderedSubgraphs) { | |||
| 1112 | EXPECT_EQ("static_graph", subgraph_pair[1].first); | 1112 | EXPECT_EQ("static_graph", subgraph_pair[1].first); |
| 1113 | EXPECT_EQ(kStatic, subgraph_pair[1].second); | 1113 | EXPECT_EQ(kStatic, subgraph_pair[1].second); |
| 1114 | } | 1114 | } |
| 1115 | + | ||
| 1116 | +TEST_F(UtestOpDesc, CovNodeShapeTransUtilsInputReshapeType) { | ||
| 1117 | + auto op_desc = std::make_shared<OpDesc>("test", "Relu"); | ||
| 1118 | + GeTensorDesc input_desc(GeShape({3, 224, 224}), FORMAT_NCHW, DT_FLOAT); | ||
| 1119 | + input_desc.SetOriginFormat(FORMAT_ND); | ||
| 1120 | + op_desc->AddInputDesc(input_desc); | ||
| 1121 | + AttrUtils::SetStr(op_desc->MutableInputDesc(0), ATTR_NAME_RESHAPE_INFER_TYPE, "C"); | ||
| 1122 | + NodeShapeTransUtils trans_utils(op_desc); | ||
| 1123 | + EXPECT_TRUE(trans_utils.Init()); | ||
| 1124 | + EXPECT_TRUE(trans_utils.CatchFormatAndShape()); | ||
| 1125 | + EXPECT_TRUE(trans_utils.UpdateFormatAndShape()); | ||
| 1126 | +} | ||
| 1127 | + | ||
| 1128 | +TEST_F(UtestOpDesc, CovNodeShapeTransUtilsOutputFormatMismatch) { | ||
| 1129 | + auto op_desc = std::make_shared<OpDesc>("test", "Relu"); | ||
| 1130 | + GeTensorDesc output_desc(GeShape({3, 224, 224}), FORMAT_NCHW, DT_FLOAT); | ||
| 1131 | + output_desc.SetOriginFormat(FORMAT_ND); | ||
| 1132 | + op_desc->AddOutputDesc(output_desc); | ||
| 1133 | + NodeShapeTransUtils trans_utils(op_desc); | ||
| 1134 | + EXPECT_TRUE(trans_utils.Init()); | ||
| 1135 | + EXPECT_TRUE(trans_utils.CatchFormatAndShape()); | ||
| 1136 | + op_desc->MutableOutputDesc(0)->SetFormat(FORMAT_HWCN); | ||
| 1137 | + EXPECT_FALSE(trans_utils.UpdateFormatAndShape()); | ||
| 1138 | +} | ||
| 1139 | + | ||
| 1140 | +TEST_F(UtestOpDesc, CovNodeShapeTransUtilsOutputReshapeType) { | ||
| 1141 | + auto op_desc = std::make_shared<OpDesc>("test", "Relu"); | ||
| 1142 | + GeTensorDesc output_desc(GeShape({3, 224, 224}), FORMAT_NCHW, DT_FLOAT); | ||
| 1143 | + output_desc.SetOriginFormat(FORMAT_ND); | ||
| 1144 | + op_desc->AddOutputDesc(output_desc); | ||
| 1145 | + AttrUtils::SetStr(op_desc->MutableOutputDesc(0), ATTR_NAME_RESHAPE_INFER_TYPE, "C"); | ||
| 1146 | + NodeShapeTransUtils trans_utils(op_desc); | ||
| 1147 | + EXPECT_TRUE(trans_utils.Init()); | ||
| 1148 | + EXPECT_TRUE(trans_utils.CatchFormatAndShape()); | ||
| 1149 | + EXPECT_TRUE(trans_utils.UpdateFormatAndShape()); | ||
| 1150 | +} | ||
| 1115 | } // namespace ge | 1151 | } // namespace ge |
| @@ -1497,4 +1497,129 @@ TEST_F(UtestOpDescUtils, CreateConstOpWithCopy) { | |||
| 1497 | EXPECT_TRUE(ConstantUtils::GetWeight(const_op_desc, 0UL, weight) == true); | 1497 | EXPECT_TRUE(ConstantUtils::GetWeight(const_op_desc, 0UL, weight) == true); |
| 1498 | EXPECT_TRUE(weight->GetData().GetData() != const_tensor_ptr->GetData().GetData()); | 1498 | EXPECT_TRUE(weight->GetData().GetData() != const_tensor_ptr->GetData().GetData()); |
| 1499 | } | 1499 | } |
| 1500 | + | ||
| 1501 | +TEST_F(UtestOpDescUtils, CovGetConstInputsEnterNode) { | ||
| 1502 | + ut::GraphBuilder builder = ut::GraphBuilder("cov_graph"); | ||
| 1503 | + auto const_node = builder.AddNode("const1", "Const", 0, 1); | ||
| 1504 | + auto enter_node = builder.AddNode("enter1", ENTER, 1, 1); | ||
| 1505 | + auto addn = builder.AddNode("addn", "AddN", 1, 1); | ||
| 1506 | + int32_t weight[1] = {1}; | ||
| 1507 | + GeTensorDesc weight_desc(GeShape({1}), FORMAT_NHWC, DT_INT32); | ||
| 1508 | + GeTensorPtr tensor0 = std::make_shared<GeTensor>(weight_desc, (uint8_t *)weight, sizeof(weight)); | ||
| 1509 | + OpDescUtils::SetWeights(const_node, {tensor0}); | ||
| 1510 | + AttrUtils::SetBool(enter_node->GetOpDesc(), ENTER_ATTR_CONSTANT_FLAG, true); | ||
| 1511 | + builder.AddDataEdge(const_node, 0, enter_node, 0); | ||
| 1512 | + builder.AddDataEdge(enter_node, 0, addn, 0); | ||
| 1513 | + auto graph = builder.GetGraph(); | ||
| 1514 | + auto const_input_nodes = OpDescUtils::GetConstInputNode(*addn); | ||
| 1515 | + EXPECT_TRUE((const_input_nodes.size() == 0U) || (const_input_nodes.size() == 1U)); | ||
| 1516 | + EXPECT_EQ(const_input_nodes[0]->GetName(), const_node->GetName()); | ||
| 1517 | + auto const_inputs = OpDescUtils::GetConstInputs(addn); | ||
| 1518 | + EXPECT_EQ(const_inputs.size(), 0U); | ||
| 1519 | +} | ||
| 1520 | + | ||
| 1521 | +TEST_F(UtestOpDescUtils, CovGetConstInputsNullNode) { | ||
| 1522 | + ge::ConstNodePtr null_node; | ||
| 1523 | + auto const_inputs = OpDescUtils::GetConstInputs(null_node); | ||
| 1524 | + EXPECT_EQ(const_inputs.size(), 0U); | ||
| 1525 | +} | ||
| 1526 | + | ||
| 1527 | +TEST_F(UtestOpDescUtils, CovIsNonConstInput) { | ||
| 1528 | + ut::GraphBuilder builder = ut::GraphBuilder("cov_graph"); | ||
| 1529 | + auto data = builder.AddNode("data", "Data", 1, 1); | ||
| 1530 | + auto addn = builder.AddNode("addn", "AddN", 1, 1); | ||
| 1531 | + builder.AddDataEdge(data, 0, addn, 0); | ||
| 1532 | + auto graph = builder.GetGraph(); | ||
| 1533 | + EXPECT_EQ(OpDescUtils::IsNonConstInput(addn, 0), true); | ||
| 1534 | + EXPECT_EQ(OpDescUtils::IsNonConstInput(addn, 5), false); | ||
| 1535 | + ge::ConstNodePtr null_node; | ||
| 1536 | + EXPECT_EQ(OpDescUtils::IsNonConstInput(null_node, 0), false); | ||
| 1537 | +} | ||
| 1538 | + | ||
| 1539 | +TEST_F(UtestOpDescUtils, CovGetNonConstInputTensorDesc) { | ||
| 1540 | + ut::GraphBuilder builder = ut::GraphBuilder("cov_graph"); | ||
| 1541 | + auto data = builder.AddNode("data", "Data", 1, 1); | ||
| 1542 | + auto const1 = builder.AddNode("const1", "Const", 0, 1); | ||
| 1543 | + auto addn = builder.AddNode("addn", "AddN", 2, 1); | ||
| 1544 | + int32_t weight[1] = {1}; | ||
| 1545 | + GeTensorDesc weight_desc(GeShape({1}), FORMAT_NHWC, DT_INT32); | ||
| 1546 | + GeTensorPtr tensor0 = std::make_shared<GeTensor>(weight_desc, (uint8_t *)weight, sizeof(weight)); | ||
| 1547 | + OpDescUtils::SetWeights(const1, {tensor0}); | ||
| 1548 | + builder.AddDataEdge(data, 0, addn, 0); | ||
| 1549 | + builder.AddDataEdge(const1, 0, addn, 1); | ||
| 1550 | + auto graph = builder.GetGraph(); | ||
| 1551 | + auto desc = OpDescUtils::GetNonConstInputTensorDesc(addn, 0); | ||
| 1552 | + EXPECT_EQ(desc.GetDataType(), DT_FLOAT); | ||
| 1553 | + size_t index = 999U; | ||
| 1554 | + EXPECT_TRUE(OpDescUtils::GetNonConstInputIndex(addn, 0, index)); | ||
| 1555 | + EXPECT_EQ(index, 0U); | ||
| 1556 | +} | ||
| 1557 | + | ||
| 1558 | +TEST_F(UtestOpDescUtils, CovGetWeightsEmpty) { | ||
| 1559 | + auto op_desc = std::make_shared<OpDesc>("test", "Relu"); | ||
| 1560 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_FLOAT); | ||
| 1561 | + op_desc->AddInputDesc(tensor_desc); | ||
| 1562 | + ut::GraphBuilder builder = ut::GraphBuilder("cov_graph"); | ||
| 1563 | + auto node = builder.AddNode("relu1", "Relu", 1, 1); | ||
| 1564 | + auto weights = OpDescUtils::GetWeights(node); | ||
| 1565 | + EXPECT_EQ(weights.size(), 0U); | ||
| 1566 | + ge::ConstNodePtr null_node; | ||
| 1567 | + auto weights2 = OpDescUtils::GetWeights(null_node); | ||
| 1568 | + EXPECT_EQ(weights2.size(), 0U); | ||
| 1569 | +} | ||
| 1570 | + | ||
| 1571 | +TEST_F(UtestOpDescUtils, CovCopyOpDesc) { | ||
| 1572 | + auto op_desc = std::make_shared<OpDesc>("test_copy", "Relu"); | ||
| 1573 | + GeTensorDesc tensor_desc(GeShape({4}), FORMAT_NCHW, DT_FLOAT); | ||
| 1574 | + op_desc->AddInputDesc(tensor_desc); | ||
| 1575 | + op_desc->AddOutputDesc(tensor_desc); | ||
| 1576 | + AttrUtils::SetInt(op_desc, "test_attr", 100); | ||
| 1577 | + auto copied = OpDescUtils::CopyOpDesc(op_desc); | ||
| 1578 | + EXPECT_NE(copied, nullptr); | ||
| 1579 | + EXPECT_EQ(copied->GetName(), "test_copy"); | ||
| 1580 | + EXPECT_EQ(copied->GetType(), "Relu"); | ||
| 1581 | + EXPECT_EQ(copied->GetInputsSize(), 1U); | ||
| 1582 | + EXPECT_EQ(copied->GetOutputsSize(), 1U); | ||
| 1583 | + int64_t val = 0; | ||
| 1584 | + AttrUtils::GetInt(copied, "test_attr", val); | ||
| 1585 | + EXPECT_EQ(val, 100); | ||
| 1586 | +} | ||
| 1587 | + | ||
| 1588 | +TEST_F(UtestOpDescUtils, CovGetNonConstInputsSize) { | ||
| 1589 | + ut::GraphBuilder builder = ut::GraphBuilder("cov_graph"); | ||
| 1590 | + auto data = builder.AddNode("data", "Data", 1, 1); | ||
| 1591 | + auto const1 = builder.AddNode("const1", "Const", 0, 1); | ||
| 1592 | + auto addn = builder.AddNode("addn", "AddN", 2, 1); | ||
| 1593 | + int32_t weight[1] = {1}; | ||
| 1594 | + GeTensorDesc weight_desc(GeShape({1}), FORMAT_NHWC, DT_INT32); | ||
| 1595 | + GeTensorPtr tensor0 = std::make_shared<GeTensor>(weight_desc, (uint8_t *)weight, sizeof(weight)); | ||
| 1596 | + OpDescUtils::SetWeights(const1, {tensor0}); | ||
| 1597 | + builder.AddDataEdge(data, 0, addn, 0); | ||
| 1598 | + builder.AddDataEdge(const1, 0, addn, 1); | ||
| 1599 | + auto graph = builder.GetGraph(); | ||
| 1600 | + auto size = OpDescUtils::GetNonConstInputsSize(addn); | ||
| 1601 | + EXPECT_EQ(size, 1U); | ||
| 1602 | + ge::ConstNodePtr null_node; | ||
| 1603 | + auto size2 = OpDescUtils::GetNonConstInputsSize(null_node); | ||
| 1604 | + EXPECT_EQ(size2, 0U); | ||
| 1605 | +} | ||
| 1606 | + | ||
| 1607 | +TEST_F(UtestOpDescUtils, CovGetNonConstTensorDesc) { | ||
| 1608 | + ut::GraphBuilder builder = ut::GraphBuilder("cov_graph"); | ||
| 1609 | + auto data = builder.AddNode("data", "Data", 1, 1); | ||
| 1610 | + auto const1 = builder.AddNode("const1", "Const", 0, 1); | ||
| 1611 | + auto addn = builder.AddNode("addn", "AddN", 2, 1); | ||
| 1612 | + int32_t weight[1] = {1}; | ||
| 1613 | + GeTensorDesc weight_desc(GeShape({1}), FORMAT_NHWC, DT_INT32); | ||
| 1614 | + GeTensorPtr tensor0 = std::make_shared<GeTensor>(weight_desc, (uint8_t *)weight, sizeof(weight)); | ||
| 1615 | + OpDescUtils::SetWeights(const1, {tensor0}); | ||
| 1616 | + builder.AddDataEdge(data, 0, addn, 0); | ||
| 1617 | + builder.AddDataEdge(const1, 0, addn, 1); | ||
| 1618 | + auto graph = builder.GetGraph(); | ||
| 1619 | + auto descs = OpDescUtils::GetNonConstTensorDesc(addn); | ||
| 1620 | + EXPECT_EQ(descs.size(), 1U); | ||
| 1621 | + ge::ConstNodePtr null_node; | ||
| 1622 | + auto descs2 = OpDescUtils::GetNonConstTensorDesc(null_node); | ||
| 1623 | + EXPECT_EQ(descs2.size(), 0U); | ||
| 1624 | +} | ||
| 1500 | } // namespace ge | 1625 | } // namespace ge |
| @@ -301,5 +301,39 @@ TEST_F(ProfilerUt, BeyondMaxRecordsNum) { | |||
| 301 | EXPECT_EQ(lines.size(), profiling::kMaxRecordNum + 3); | 301 | EXPECT_EQ(lines.size(), profiling::kMaxRecordNum + 3); |
| 302 | } | 302 | } |
| 303 | */ | 303 | */ |
| 304 | + | ||
| 305 | +TEST_F(ProfilerUt, CovUpdateHashByIndexBeyondMax) { | ||
| 306 | + auto p = Profiler::Create(); | ||
| 307 | + p->RegisterString(0, "Node1"); | ||
| 308 | + p->UpdateHashByIndex(kMaxStrIndex, 0x123); | ||
| 309 | + auto s = p->GetStringHashes(); | ||
| 310 | + EXPECT_EQ(s[0].hash == 0U, true); | ||
| 311 | +} | ||
| 312 | + | ||
| 313 | +TEST_F(ProfilerUt, CovRegisterStringHashBeyondMax) { | ||
| 314 | + auto p = Profiler::Create(); | ||
| 315 | + p->RegisterStringHash(kMaxStrIndex, 0x123, "TestNode"); | ||
| 316 | + SUCCEED(); | ||
| 317 | +} | ||
| 318 | + | ||
| 319 | +TEST_F(ProfilerUt, CovRecordBeyondMax) { | ||
| 320 | + auto p = Profiler::Create(); | ||
| 321 | + p->Record(0, 1, 2, EventType::kEventStart, std::chrono::system_clock::now()); | ||
| 322 | + for (int64_t i = 0; i < profiling::kMaxRecordNum + 10; ++i) { | ||
| 323 | + p->Record(0, 1, 2, EventType::kEventStart, std::chrono::system_clock::now()); | ||
| 324 | + } | ||
| 325 | + EXPECT_EQ(p->GetRecordNum(), profiling::kMaxRecordNum + 11); | ||
| 326 | + struct NullBuf : std::streambuf { | ||
| 327 | + int_type overflow(int_type c) override { | ||
| 328 | + return c; | ||
| 329 | + } | ||
| 330 | + std::streamsize xsputn(const char_type *, std::streamsize n) override { | ||
| 331 | + return n; | ||
| 332 | + } | ||
| 333 | + } null_buf; | ||
| 334 | + std::ostream os(&null_buf); | ||
| 335 | + p->Dump(os); | ||
| 336 | + SUCCEED(); | ||
| 337 | +} | ||
| 304 | } // namespace profiling | 338 | } // namespace profiling |
| 305 | } // namespace ge | 339 | } // namespace ge |
| @@ -0,0 +1,207 @@ | |||
| 1 | + | ||
| 2 | + | ||
| 3 | + | ||
| 4 | + | ||
| 5 | + | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +namespace ge { | ||
| 9 | + | ||
| 10 | +class TensorValueUtilsTest : public testing::Test { | ||
| 11 | + protected: | ||
| 12 | + void SetUp() {} | ||
| 13 | + void TearDown() {} | ||
| 14 | +}; | ||
| 15 | + | ||
| 16 | +TEST_F(TensorValueUtilsTest, CovConvertFloat) { | ||
| 17 | + std::vector<float> data = {1.0f, 2.0f, 3.0f}; | ||
| 18 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_FLOAT); | ||
| 19 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(float)); | ||
| 20 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", true); | ||
| 21 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +TEST_F(TensorValueUtilsTest, CovConvertInt32) { | ||
| 25 | + std::vector<int32_t> data = {10, 20, 30}; | ||
| 26 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_INT32); | ||
| 27 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(int32_t)); | ||
| 28 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_INT32, ",", true); | ||
| 29 | + EXPECT_NE(result.find("10"), std::string::npos); | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +TEST_F(TensorValueUtilsTest, CovConvertInt64) { | ||
| 33 | + std::vector<int64_t> data = {100, 200}; | ||
| 34 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_INT64); | ||
| 35 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(int64_t)); | ||
| 36 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_INT64, ",", true); | ||
| 37 | + EXPECT_NE(result.find("100"), std::string::npos); | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +TEST_F(TensorValueUtilsTest, CovConvertDouble) { | ||
| 41 | + std::vector<double> data = {1.5, 2.5}; | ||
| 42 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_DOUBLE); | ||
| 43 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(double)); | ||
| 44 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_DOUBLE, ",", true); | ||
| 45 | + EXPECT_NE(result.find("1.5"), std::string::npos); | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +TEST_F(TensorValueUtilsTest, CovConvertBool) { | ||
| 49 | + bool data[] = {true, false}; | ||
| 50 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_BOOL); | ||
| 51 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data), 2U * sizeof(bool)); | ||
| 52 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_BOOL, ",", true); | ||
| 53 | + EXPECT_NE(result.find("true"), std::string::npos); | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +TEST_F(TensorValueUtilsTest, CovConvertFp16) { | ||
| 57 | + uint16_t fp16_data[2] = {0x3C00, 0x4000}; | ||
| 58 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_FLOAT16); | ||
| 59 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(fp16_data), 2U * sizeof(uint16_t)); | ||
| 60 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT16, ",", true); | ||
| 61 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +TEST_F(TensorValueUtilsTest, CovConvertFp16NoSkip) { | ||
| 65 | + uint16_t fp16_data[3] = {0x3C00, 0x4000, 0x4200}; | ||
| 66 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_FLOAT16); | ||
| 67 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(fp16_data), 3U * sizeof(uint16_t)); | ||
| 68 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT16, ",", false); | ||
| 69 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +TEST_F(TensorValueUtilsTest, CovConvertFp16Infinity) { | ||
| 73 | + uint16_t fp16_data[2] = {0x7C00, 0xFC00}; | ||
| 74 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_FLOAT16); | ||
| 75 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(fp16_data), 2U * sizeof(uint16_t)); | ||
| 76 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT16, ",", true); | ||
| 77 | + EXPECT_NE(result.find("inf"), std::string::npos); | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +TEST_F(TensorValueUtilsTest, CovConvertFp16NaN) { | ||
| 81 | + uint16_t fp16_data[1] = {0x7E00}; | ||
| 82 | + TensorDesc desc(Shape({1}), FORMAT_NCHW, DT_FLOAT16); | ||
| 83 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(fp16_data), 1U * sizeof(uint16_t)); | ||
| 84 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT16, ",", true); | ||
| 85 | + EXPECT_NE(result.find("nan"), std::string::npos); | ||
| 86 | +} | ||
| 87 | + | ||
| 88 | +TEST_F(TensorValueUtilsTest, CovConvertFp16Denormalized) { | ||
| 89 | + uint16_t fp16_data[2] = {0x0001, 0x0200}; | ||
| 90 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_FLOAT16); | ||
| 91 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(fp16_data), 2U * sizeof(uint16_t)); | ||
| 92 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT16, ",", true); | ||
| 93 | + EXPECT_NE(result.find("["), std::string::npos); | ||
| 94 | +} | ||
| 95 | + | ||
| 96 | +TEST_F(TensorValueUtilsTest, CovConvertFp16Zero) { | ||
| 97 | + uint16_t fp16_data[2] = {0x0000, 0x8000}; | ||
| 98 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_FLOAT16); | ||
| 99 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(fp16_data), 2U * sizeof(uint16_t)); | ||
| 100 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT16, ",", true); | ||
| 101 | + EXPECT_NE(result.find("0"), std::string::npos); | ||
| 102 | +} | ||
| 103 | + | ||
| 104 | +TEST_F(TensorValueUtilsTest, CovConvertUnsupportedType) { | ||
| 105 | + TensorDesc desc(Shape({1}), FORMAT_NCHW, DT_STRING); | ||
| 106 | + Tensor tensor(desc); | ||
| 107 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_STRING, ",", true); | ||
| 108 | + EXPECT_EQ(result, "<not_supported>"); | ||
| 109 | +} | ||
| 110 | + | ||
| 111 | +TEST_F(TensorValueUtilsTest, CovConvertEmptyTensor) { | ||
| 112 | + TensorDesc desc(Shape({0}), FORMAT_NCHW, DT_FLOAT); | ||
| 113 | + Tensor tensor(desc); | ||
| 114 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", true); | ||
| 115 | + EXPECT_EQ(result, "<empty>"); | ||
| 116 | +} | ||
| 117 | + | ||
| 118 | +TEST_F(TensorValueUtilsTest, CovConvertNullData) { | ||
| 119 | + GeTensor ge_tensor(GeTensorDesc(GeShape({2}), FORMAT_NCHW, DT_FLOAT)); | ||
| 120 | + ge_tensor.SetData(std::shared_ptr<AlignedPtr>(), 10U); | ||
| 121 | + Tensor tensor = TensorAdapter::AsTensor(ge_tensor); | ||
| 122 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", true); | ||
| 123 | + EXPECT_EQ(result, "<invalid>"); | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | +TEST_F(TensorValueUtilsTest, CovConvertUnalignedData) { | ||
| 127 | + uint8_t data[3] = {1, 2, 3}; | ||
| 128 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_UINT8); | ||
| 129 | + Tensor tensor(desc, data, 3U); | ||
| 130 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", true); | ||
| 131 | + EXPECT_EQ(result, "<invalid>"); | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +TEST_F(TensorValueUtilsTest, CovConvertUint8) { | ||
| 135 | + std::vector<uint8_t> data = {1, 2, 3}; | ||
| 136 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_UINT8); | ||
| 137 | + Tensor tensor(desc, data.data(), data.size() * sizeof(uint8_t)); | ||
| 138 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_UINT8, ",", true); | ||
| 139 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +TEST_F(TensorValueUtilsTest, CovConvertInt8) { | ||
| 143 | + std::vector<int8_t> data = {1, 2, 3}; | ||
| 144 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_INT8); | ||
| 145 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(int8_t)); | ||
| 146 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_INT8, ",", true); | ||
| 147 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 148 | +} | ||
| 149 | + | ||
| 150 | +TEST_F(TensorValueUtilsTest, CovConvertInt16) { | ||
| 151 | + std::vector<int16_t> data = {1, 2}; | ||
| 152 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_INT16); | ||
| 153 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(int16_t)); | ||
| 154 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_INT16, ",", true); | ||
| 155 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +TEST_F(TensorValueUtilsTest, CovConvertUint16) { | ||
| 159 | + std::vector<uint16_t> data = {1, 2}; | ||
| 160 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_UINT16); | ||
| 161 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(uint16_t)); | ||
| 162 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_UINT16, ",", true); | ||
| 163 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 164 | +} | ||
| 165 | + | ||
| 166 | +TEST_F(TensorValueUtilsTest, CovConvertUint32) { | ||
| 167 | + std::vector<uint32_t> data = {1, 2}; | ||
| 168 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_UINT32); | ||
| 169 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(uint32_t)); | ||
| 170 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_UINT32, ",", true); | ||
| 171 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 172 | +} | ||
| 173 | + | ||
| 174 | +TEST_F(TensorValueUtilsTest, CovConvertUint64) { | ||
| 175 | + std::vector<uint64_t> data = {1, 2}; | ||
| 176 | + TensorDesc desc(Shape({2}), FORMAT_NCHW, DT_UINT64); | ||
| 177 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(uint64_t)); | ||
| 178 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_UINT64, ",", true); | ||
| 179 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 180 | +} | ||
| 181 | + | ||
| 182 | +TEST_F(TensorValueUtilsTest, CovConvertSingleElement) { | ||
| 183 | + std::vector<float> data = {42.0f}; | ||
| 184 | + TensorDesc desc(Shape({1}), FORMAT_NCHW, DT_FLOAT); | ||
| 185 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(float)); | ||
| 186 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", true); | ||
| 187 | + EXPECT_NE(result.find("42"), std::string::npos); | ||
| 188 | +} | ||
| 189 | + | ||
| 190 | +TEST_F(TensorValueUtilsTest, CovConvertManyElementsSkip) { | ||
| 191 | + std::vector<float> data = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f}; | ||
| 192 | + TensorDesc desc(Shape({8}), FORMAT_NCHW, DT_FLOAT); | ||
| 193 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(float)); | ||
| 194 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", true); | ||
| 195 | + EXPECT_NE(result.find("..."), std::string::npos); | ||
| 196 | +} | ||
| 197 | + | ||
| 198 | +TEST_F(TensorValueUtilsTest, CovConvertNoSkipFloat) { | ||
| 199 | + std::vector<float> data = {1.0f, 2.0f, 3.0f}; | ||
| 200 | + TensorDesc desc(Shape({3}), FORMAT_NCHW, DT_FLOAT); | ||
| 201 | + Tensor tensor(desc, reinterpret_cast<const uint8_t *>(data.data()), data.size() * sizeof(float)); | ||
| 202 | + std::string result = TensorValueUtils::ConvertTensorValue(tensor, DT_FLOAT, ",", false); | ||
| 203 | + EXPECT_NE(result.find("1"), std::string::npos); | ||
| 204 | + EXPECT_NE(result.find("3"), std::string::npos); | ||
| 205 | +} | ||
| 206 | + | ||
| 207 | +} // namespace ge | ||
| @@ -626,4 +626,93 @@ TEST_F(UtestTuningUtils, WeightExternalizationAndRecover) { | |||
| 626 | system("rm -rf ./aicore_subgraph_*"); | 626 | system("rm -rf ./aicore_subgraph_*"); |
| 627 | system("rm -rf ./subgraph_*"); | 627 | system("rm -rf ./subgraph_*"); |
| 628 | } | 628 | } |
| 629 | + | ||
| 630 | +TEST_F(UtestTuningUtils, CovGenerateFileConstPath) { | ||
| 631 | + auto builder = ut::GraphBuilder("root"); | ||
| 632 | + const auto &node = builder.AddNode("const0", CONSTANT, 0, 1); | ||
| 633 | + auto op_desc = node->GetOpDesc(); | ||
| 634 | + EXPECT_FALSE(TuningUtils::GenerateFileConstPath("", op_desc).empty()); | ||
| 635 | + EXPECT_FALSE(TuningUtils::GenerateFileConstPath("./", op_desc).empty()); | ||
| 636 | + AttrUtils::SetStr(op_desc, "_parentNodeName", "parent"); | ||
| 637 | + EXPECT_FALSE(TuningUtils::GenerateFileConstPath("", op_desc).empty()); | ||
| 638 | +} | ||
| 639 | + | ||
| 640 | +TEST_F(UtestTuningUtils, CovGetOrSaveReusableFileConst) { | ||
| 641 | + TuningUtils::reusable_weight_files_.clear(); | ||
| 642 | + TuningUtils::hash_to_files_.clear(); | ||
| 643 | + auto tensor = std::make_shared<GeTensor>(); | ||
| 644 | + std::vector<uint8_t> value{1, 2, 3}; | ||
| 645 | + std::vector<int64_t> shape{3}; | ||
| 646 | + tensor->MutableTensorDesc().SetShape(GeShape(shape)); | ||
| 647 | + tensor->SetData(value); | ||
| 648 | + tensor->MutableTensorDesc().SetDataType(DT_UINT8); | ||
| 649 | + std::string file_path = "./tmp_test_reusable.bin"; | ||
| 650 | + EXPECT_EQ(TuningUtils::GetOrSaveReusableFileConst(tensor, file_path), SUCCESS); | ||
| 651 | + std::string file_path2 = "./tmp_test_reusable2.bin"; | ||
| 652 | + EXPECT_EQ(TuningUtils::GetOrSaveReusableFileConst(tensor, file_path2), SUCCESS); | ||
| 653 | + system("rm -f ./tmp_test_reusable.bin ./tmp_test_reusable2.bin"); | ||
| 654 | +} | ||
| 655 | + | ||
| 656 | +TEST_F(UtestTuningUtils, CovCheckFilesSame) { | ||
| 657 | + std::string file_path = "./tmp_test_check_same.bin"; | ||
| 658 | + std::vector<uint8_t> data = {1, 2, 3, 4, 5}; | ||
| 659 | + std::ofstream ofs(file_path, std::ios::binary); | ||
| 660 | + ofs.write(reinterpret_cast<const char *>(data.data()), data.size()); | ||
| 661 | + ofs.close(); | ||
| 662 | + bool is_same = false; | ||
| 663 | + EXPECT_EQ(TuningUtils::CheckFilesSame(file_path, reinterpret_cast<const char *>(data.data()), data.size(), is_same), | ||
| 664 | + SUCCESS); | ||
| 665 | + EXPECT_TRUE(is_same); | ||
| 666 | + std::vector<uint8_t> diff_data = {1, 2, 3, 4, 6}; | ||
| 667 | + bool is_same2 = false; | ||
| 668 | + EXPECT_EQ(TuningUtils::CheckFilesSame(file_path, reinterpret_cast<const char *>(diff_data.data()), diff_data.size(), | ||
| 669 | + is_same2), | ||
| 670 | + SUCCESS); | ||
| 671 | + EXPECT_FALSE(is_same2); | ||
| 672 | + std::vector<uint8_t> short_data = {1, 2, 3}; | ||
| 673 | + bool is_same3 = false; | ||
| 674 | + EXPECT_EQ(TuningUtils::CheckFilesSame(file_path, reinterpret_cast<const char *>(short_data.data()), short_data.size(), | ||
| 675 | + is_same3), | ||
| 676 | + SUCCESS); | ||
| 677 | + EXPECT_FALSE(is_same3); | ||
| 678 | + system("rm -f ./tmp_test_check_same.bin"); | ||
| 679 | +} | ||
| 680 | + | ||
| 681 | +TEST_F(UtestTuningUtils, CovCreateDataNodeEmptyWeight) { | ||
| 682 | + ut::GraphBuilder builder = ut::GraphBuilder("graph"); | ||
| 683 | + auto pld = builder.AddNode("pld", PLACEHOLDER, 0, 1); | ||
| 684 | + auto empty_tensor = std::make_shared<GeTensor>(); | ||
| 685 | + empty_tensor->MutableTensorDesc().SetDataType(DT_UINT8); | ||
| 686 | + empty_tensor->MutableTensorDesc().SetShape(GeShape({0})); | ||
| 687 | + EXPECT_EQ(ge::AttrUtils::SetTensor(pld->GetOpDesc(), "value", empty_tensor), true); | ||
| 688 | + NodePtr data_node; | ||
| 689 | + EXPECT_EQ(TuningUtils::CreateDataNode(pld, "", data_node), SUCCESS); | ||
| 690 | +} | ||
| 691 | + | ||
| 692 | +TEST_F(UtestTuningUtils, CovHandleConst) { | ||
| 693 | + TuningUtils::reusable_weight_files_.clear(); | ||
| 694 | + TuningUtils::hash_to_files_.clear(); | ||
| 695 | + ut::GraphBuilder builder = ut::GraphBuilder("graph"); | ||
| 696 | + auto const_node = builder.AddNode("const0", CONSTANT, 0, 1); | ||
| 697 | + ge::GeTensorPtr tensor = std::make_shared<GeTensor>(); | ||
| 698 | + std::vector<uint8_t> value{1, 2, 3}; | ||
| 699 | + std::vector<int64_t> shape{3}; | ||
| 700 | + tensor->MutableTensorDesc().SetShape(GeShape(shape)); | ||
| 701 | + tensor->SetData(value); | ||
| 702 | + tensor->MutableTensorDesc().SetDataType(DT_UINT8); | ||
| 703 | + EXPECT_EQ(ge::OpDescUtils::SetWeights(const_node, {tensor}), 0); | ||
| 704 | + NodePtr node = const_node; | ||
| 705 | + EXPECT_EQ(TuningUtils::HandleConst(node, ""), SUCCESS); | ||
| 706 | + auto const_node2 = builder.AddNode("const1", CONSTANT, 0, 1); | ||
| 707 | + auto empty_tensor = std::make_shared<GeTensor>(); | ||
| 708 | + empty_tensor->MutableTensorDesc().SetDataType(DT_UINT8); | ||
| 709 | + empty_tensor->MutableTensorDesc().SetShape(GeShape({0})); | ||
| 710 | + EXPECT_EQ(ge::OpDescUtils::SetWeights(const_node2, {empty_tensor}), 0); | ||
| 711 | + NodePtr node2 = const_node2; | ||
| 712 | + EXPECT_EQ(TuningUtils::HandleConst(node2, ""), SUCCESS); | ||
| 713 | + auto relu_node = builder.AddNode("relu", "Relu", 1, 1); | ||
| 714 | + NodePtr node3 = relu_node; | ||
| 715 | + EXPECT_EQ(TuningUtils::HandleConst(node3, ""), SUCCESS); | ||
| 716 | + system("rm -rf ./tmp_weight_*"); | ||
| 717 | +} | ||
| 629 | } // namespace ge | 718 | } // namespace ge |
🔴 Critical
测试
CovGetConstInputsEnterNode中,第 1515 行的EXPECT_TRUE允许const_input_nodes.size()为 0 或 1,但第 1516 行无条件访问const_input_nodes[0]。当GetConstInputNode返回空 vector 时(size == 0),第 1515 行断言通过,但第 1516 行发生越界访问,导致未定义行为(可能 crash)。合约链:
OpDescUtils::GetConstInputNode(*addn)返回vector<NodePtr>→ 其 size 可能为 0(第 1515 行允许此情况)→const_input_nodes[0]在 size=0 时越界。修复方向:将索引访问
const_input_nodes[0]放入 size=1 的条件分支内,或使用ASSERT_EQ(const_input_nodes.size(), 1U)确保安全后再访问。建议:将
EXPECT_TRUE((... == 0U) || (... == 1U))替换为EXPECT_EQ(const_input_nodes.size(), 1U),然后使用ASSERT_EQ确保安全后再访问索引 0。如果 size=0 也是合理的返回值,则应将索引访问放入条件分支中。