diff --git a/.ci/azure/linux.yml b/.ci/azure/linux.yml index 3bbdb183c5d..aac8a2da42e 100644 --- a/.ci/azure/linux.yml +++ b/.ci/azure/linux.yml @@ -408,8 +408,8 @@ jobs: displayName: 'GNA UT' enabled: 'false' # TODO: fix - - script: $(RUN_PREFIX) $(INSTALL_TEST_DIR)/ieMultiPluginUnitTests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ieMultiPluginUnitTests.xml - displayName: 'MULTI UT' + - script: $(RUN_PREFIX) $(INSTALL_TEST_DIR)/ov_auto_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ov_auto_unit_tests.xml + displayName: 'AUTO UT' - script: $(RUN_PREFIX) $(INSTALL_TEST_DIR)/ov_auto_batch_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ov_auto_batch_unit_tests.xml displayName: 'AutoBatch UT' @@ -430,7 +430,6 @@ jobs: # Skip test_onnx/test_zoo_models and test_onnx/test_backend due to long execution time - script: | - export LD_LIBRARY_PATH=$(REPO_DIR)/temp/gna_03.05.00.2116/linux/x64:$(LD_LIBRARY_PATH) python3 -m pytest -s $(INSTALL_TEST_DIR)/pyngraph $(PYTHON_STATIC_ARGS) \ --junitxml=$(INSTALL_TEST_DIR)/TEST-Pyngraph.xml \ --ignore=$(INSTALL_TEST_DIR)/pyngraph/tests/test_onnx/test_zoo_models.py \ @@ -439,8 +438,6 @@ jobs: # Skip test_onnx/test_zoo_models and test_onnx/test_backend due to long execution time - script: | - # For python imports to import pybind_mock_frontend - export LD_LIBRARY_PATH=$(REPO_DIR)/temp/gna_03.05.00.2116/linux/x64:$(LD_LIBRARY_PATH) python3 -m pytest -sv $(INSTALL_TEST_DIR)/pyopenvino $(PYTHON_STATIC_ARGS) \ --junitxml=$(INSTALL_TEST_DIR)/TEST-Pyngraph.xml \ --ignore=$(INSTALL_TEST_DIR)/pyopenvino/tests/test_utils/test_utils.py \ @@ -449,7 +446,6 @@ jobs: displayName: 'Python API 2.0 Tests' - script: | - export LD_LIBRARY_PATH=$(REPO_DIR)/temp/gna_03.05.00.2116/linux/x64:$(LD_LIBRARY_PATH) python3 -m pytest -s $(INSTALL_TEST_DIR)/mo/unit_tests --junitxml=$(INSTALL_TEST_DIR)/TEST-ModelOptimizer.xml displayName: 'Model Optimizer UT' diff --git a/.ci/azure/linux_debian.yml b/.ci/azure/linux_debian.yml index a3be74fbb97..faa2827c629 100644 --- a/.ci/azure/linux_debian.yml +++ b/.ci/azure/linux_debian.yml @@ -306,8 +306,8 @@ jobs: - script: $(INSTALL_TEST_DIR)/ov_cpu_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ov_cpu_unit_tests.xml displayName: 'Intel CPU Unit Tests' - - script: $(INSTALL_TEST_DIR)/ieMultiPluginUnitTests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ieMultiPluginUnitTests.xml - displayName: 'MULTI UT' + - script: $(INSTALL_TEST_DIR)/ov_auto_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ov_auto_unit_tests.xml + displayName: 'AUTO UT' - script: $(INSTALL_TEST_DIR)/ov_template_func_tests --gtest_filter=*smoke* --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-templateFuncTests.xml env: diff --git a/.ci/azure/mac.yml b/.ci/azure/mac.yml index e41824080a3..1ddebf0c522 100644 --- a/.ci/azure/mac.yml +++ b/.ci/azure/mac.yml @@ -196,8 +196,8 @@ jobs: displayName: 'Intel CPU Unit Tests' enabled: 'false' - - script: . $(SETUPVARS) && $(INSTALL_TEST_DIR)/ieMultiPluginUnitTests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ieMultiPluginUnitTests.xml - displayName: 'MULTI UT' + - script: . $(SETUPVARS) && $(INSTALL_TEST_DIR)/ov_auto_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ov_auto_unit_tests.xml + displayName: 'AUTO UT' enabled: 'false' - script: . $(SETUPVARS) && $(INSTALL_TEST_DIR)/ov_cpu_func_tests --gtest_filter=*smoke* --gtest_print_time=1 --gtest_output=xml:$(INSTALL_TEST_DIR)/TEST-ov_cpu_func_tests.xml diff --git a/.ci/azure/windows.yml b/.ci/azure/windows.yml index ee20bc4b100..fe67b1045d2 100644 --- a/.ci/azure/windows.yml +++ b/.ci/azure/windows.yml @@ -306,8 +306,8 @@ jobs: - script: call $(SETUPVARS) && $(INSTALL_TEST_DIR)\ov_gna_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)\TEST-ov_gna_unit_tests.xml displayName: 'GNA UT' - - script: call $(SETUPVARS) && $(INSTALL_TEST_DIR)\ieMultiPluginUnitTests --gtest_output=xml:$(INSTALL_TEST_DIR)\TEST-ieMultiPluginUnitTests.xml - displayName: 'MULTI UT' + - script: call $(SETUPVARS) && $(INSTALL_TEST_DIR)\ov_auto_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)\TEST-ov_auto_unit_tests.xml + displayName: 'AUTO UT' - script: call $(SETUPVARS) && $(INSTALL_TEST_DIR)\ov_auto_batch_unit_tests --gtest_output=xml:$(INSTALL_TEST_DIR)\TEST-ov_auto_batch_unit_tests.xml displayName: 'AutoBatch UT' diff --git a/.github/labeler.yml b/.github/labeler.yml index c4512c375e7..a32a730b3c2 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -41,6 +41,7 @@ 'category: dependency_changes': - '**/requirement*.txt' +- '**/constraints*.txt' - 'scripts/**/*' - '.gitmodules' - '**/setup.py' diff --git a/cmake/features.cmake b/cmake/features.cmake index fc7a07252e6..546fc721938 100644 --- a/cmake/features.cmake +++ b/cmake/features.cmake @@ -126,7 +126,7 @@ ie_option(ENABLE_OV_IR_FRONTEND "Enable IR FrontEnd" ON) ie_option(ENABLE_OV_TF_FRONTEND "Enable TensorFlow FrontEnd" ON) ie_option(ENABLE_OV_TF_LITE_FRONTEND "Enable TensorFlow Lite FrontEnd" ON) ie_dependent_option(ENABLE_SNAPPY_COMPRESSION "Enables compression support for TF FE" ON - "ENABLE_OV_TF_FRONTEND" ON) + "ENABLE_OV_TF_FRONTEND" OFF) if(CMAKE_HOST_LINUX AND LINUX) # Debian packages are enabled on Ubuntu systems diff --git a/docs/OV_Runtime_UG/deployment/deployment_intro.md b/docs/OV_Runtime_UG/deployment/deployment_intro.md index 020981978b2..6b7c925942a 100644 --- a/docs/OV_Runtime_UG/deployment/deployment_intro.md +++ b/docs/OV_Runtime_UG/deployment/deployment_intro.md @@ -22,7 +22,7 @@ Local Deployment Options - using Debian / RPM packages - a recommended way for Linux operating systems; - using PIP package manager on PyPI - the default approach for Python-based applications; - - using Docker images - if the application should be deployed as a Docker image, use a pre-built OpenVINO™ Runtime Docker image as a base image in the Dockerfile for the application container image. For more information about OpenVINO Docker images, refer to :doc:`Installing OpenVINO on Linux from Docker ` and :doc:`Installing OpenVINO on Windows from Docker `. + - using Docker images - if the application should be deployed as a Docker image, use a pre-built OpenVINO™ Runtime Docker image as a base image in the Dockerfile for the application container image. For more information about OpenVINO Docker images, refer to :doc:`Installing OpenVINO on Linux from Docker ` Furthermore, to customize your OpenVINO Docker image, use the `Docker CI Framework ` to generate a Dockerfile and built the image. @@ -44,7 +44,7 @@ The table below shows which distribution type can be used for what target operat * - RMP packages - Red Hat Enterprise Linux 8, 64-bit * - Docker images - - Ubuntu 18.04 long-term support (LTS), 64-bit; Ubuntu 20.04 long-term support (LTS), 64-bit; Red Hat Enterprise Linux 8, 64-bit; Windows Server Core base LTSC 2019, 64-bit; Windows 10, version 20H2, 64-bit + - Ubuntu 22.04 long-term support (LTS), 64-bit; Ubuntu 20.04 long-term support (LTS), 64-bit; Red Hat Enterprise Linux 8, 64-bit * - PyPI (PIP package manager) - See https://pypi.org/project/openvino * - :doc:`OpenVINO Deployment Manager ` diff --git a/docs/_static/images/DeviceDriverVersion.PNG b/docs/_static/images/DeviceDriverVersion.PNG deleted file mode 100644 index 01f92aea833..00000000000 --- a/docs/_static/images/DeviceDriverVersion.PNG +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2f144de249eddf1c159cbc1a27a06ad40f57442efcf75f2f49cc02626fc6875 -size 13168 diff --git a/docs/_static/images/DeviceDriverVersion.svg b/docs/_static/images/DeviceDriverVersion.svg new file mode 100644 index 00000000000..b6769365817 --- /dev/null +++ b/docs/_static/images/DeviceDriverVersion.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3a47af0e18856603b93a15d9415ddddd4ae06058cdfa0e18597e9eb861bf589 +size 51390 diff --git a/docs/_static/selector-tool/assets/icons-regular-7c563649.woff2 b/docs/_static/selector-tool/assets/icons-regular-7c563649.woff2 new file mode 100644 index 00000000000..d3aa0cf0294 Binary files /dev/null and b/docs/_static/selector-tool/assets/icons-regular-7c563649.woff2 differ diff --git a/docs/_static/selector-tool/assets/index-89e3365b.js b/docs/_static/selector-tool/assets/index-89e3365b.js new file mode 100644 index 00000000000..5975202d92e --- /dev/null +++ b/docs/_static/selector-tool/assets/index-89e3365b.js @@ -0,0 +1 @@ +const e=document.getElementById("selector");if(!e)throw new Error("cannot find selector document");window.addEventListener("message",i=>{e.style.height=i.data.height+"px"});var o,n;const t=(n=(o=e.contentDocument)==null?void 0:o.body)==null?void 0:n.offsetHeight;t&&(e.style.height=`${t}px`); diff --git a/docs/_static/selector-tool/assets/intelone-bodytext-font-family-medium-a08af450.woff2 b/docs/_static/selector-tool/assets/intelone-bodytext-font-family-medium-a08af450.woff2 new file mode 100644 index 00000000000..03bd1adc196 Binary files /dev/null and b/docs/_static/selector-tool/assets/intelone-bodytext-font-family-medium-a08af450.woff2 differ diff --git a/docs/_static/selector-tool/assets/intelone-bodytext-font-family-regular-8fde65a1.woff2 b/docs/_static/selector-tool/assets/intelone-bodytext-font-family-regular-8fde65a1.woff2 new file mode 100644 index 00000000000..5d38aa7f93b Binary files /dev/null and b/docs/_static/selector-tool/assets/intelone-bodytext-font-family-regular-8fde65a1.woff2 differ diff --git a/docs/_static/selector-tool/assets/selector-363359f4.js b/docs/_static/selector-tool/assets/selector-363359f4.js new file mode 100644 index 00000000000..f05c2f4242d --- /dev/null +++ b/docs/_static/selector-tool/assets/selector-363359f4.js @@ -0,0 +1,54 @@ +var pf=Object.defineProperty;var ff=(e,t,n)=>t in e?pf(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ht=(e,t,n)=>(ff(e,typeof t!="symbol"?t+"":t,n),n);function mf(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Hr={},hf={get exports(){return Hr},set exports(e){Hr=e}},Vi={},U={},gf={get exports(){return U},set exports(e){U=e}},j={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ao=Symbol.for("react.element"),vf=Symbol.for("react.portal"),yf=Symbol.for("react.fragment"),_f=Symbol.for("react.strict_mode"),kf=Symbol.for("react.profiler"),wf=Symbol.for("react.provider"),Sf=Symbol.for("react.context"),Of=Symbol.for("react.forward_ref"),Ef=Symbol.for("react.suspense"),Nf=Symbol.for("react.memo"),Pf=Symbol.for("react.lazy"),Ya=Symbol.iterator;function Rf(e){return e===null||typeof e!="object"?null:(e=Ya&&e[Ya]||e["@@iterator"],typeof e=="function"?e:null)}var Ic={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},bc=Object.assign,Vc={};function ur(e,t,n){this.props=e,this.context=t,this.refs=Vc,this.updater=n||Ic}ur.prototype.isReactComponent={};ur.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};ur.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Dc(){}Dc.prototype=ur.prototype;function Bl(e,t,n){this.props=e,this.context=t,this.refs=Vc,this.updater=n||Ic}var Hl=Bl.prototype=new Dc;Hl.constructor=Bl;bc(Hl,ur.prototype);Hl.isPureReactComponent=!0;var qa=Array.isArray,Fc=Object.prototype.hasOwnProperty,Kl={current:null},Uc={key:!0,ref:!0,__self:!0,__source:!0};function jc(e,t,n){var r,o={},i=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(i=""+t.key),t)Fc.call(t,r)&&!Uc.hasOwnProperty(r)&&(o[r]=t[r]);var l=arguments.length-2;if(l===1)o.children=n;else if(1{const e={type:"size",height:document.body.offsetHeight};window.parent.postMessage(e)};new ResizeObserver(Mf).observe(document.body);function ve(e){return ve=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ve(e)}function ct(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Af(e,t){if(ve(e)!=="object"||e===null)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||"default");if(ve(r)!=="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ac(e){var t=Af(e,"string");return ve(t)==="symbol"?t:String(t)}function Qa(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&arguments[1]!==void 0?arguments[1]:{};ct(this,e),this.init(t,n)}return dt(e,[{key:"init",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=r.prefix||"i18next:",this.logger=n||Bf,this.options=r,this.debug=r.debug}},{key:"setDebug",value:function(n){this.debug=n}},{key:"log",value:function(){for(var n=arguments.length,r=new Array(n),o=0;o1?r-1:0),i=1;i-1?l.replace(/###/g,"."):l}function o(){return!e||typeof e=="string"}for(var i=typeof t!="string"?[].concat(t):t.split(".");i.length>1;){if(o())return{};var s=r(i.shift());!e[s]&&n&&(e[s]=new n),Object.prototype.hasOwnProperty.call(e,s)?e=e[s]:e={}}return o()?{}:{obj:e,k:r(i.shift())}}function tu(e,t,n){var r=Yl(e,t,Object),o=r.obj,i=r.k;o[i]=n}function Wf(e,t,n,r){var o=Yl(e,t,Object),i=o.obj,s=o.k;i[s]=i[s]||[],r&&(i[s]=i[s].concat(n)),r||i[s].push(n)}function li(e,t){var n=Yl(e,t),r=n.obj,o=n.k;if(r)return r[o]}function nu(e,t,n){var r=li(e,n);return r!==void 0?r:li(t,n)}function Hc(e,t,n){for(var r in t)r!=="__proto__"&&r!=="constructor"&&(r in e?typeof e[r]=="string"||e[r]instanceof String||typeof t[r]=="string"||t[r]instanceof String?n&&(e[r]=t[r]):Hc(e[r],t[r],n):e[r]=t[r]);return e}function Ln(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var Yf={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function qf(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,function(t){return Yf[t]}):e}var Fi=typeof window<"u"&&window.navigator&&typeof window.navigator.userAgentData>"u"&&window.navigator.userAgent&&window.navigator.userAgent.indexOf("MSIE")>-1,Gf=[" ",",","?","!",";"];function Qf(e,t,n){t=t||"",n=n||"";var r=Gf.filter(function(l){return t.indexOf(l)<0&&n.indexOf(l)<0});if(r.length===0)return!0;var o=new RegExp("(".concat(r.map(function(l){return l==="?"?"\\?":l}).join("|"),")")),i=!o.test(e);if(!i){var s=e.indexOf(n);s>0&&!o.test(e.substring(0,s))&&(i=!0)}return i}function ru(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function vo(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Kc(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(e){if(e[t])return e[t];for(var r=t.split(n),o=e,i=0;ii+s;)s++,l=r.slice(i,i+s).join(n),a=o[l];if(a===void 0)return;if(a===null)return null;if(t.endsWith(l)){if(typeof a=="string")return a;if(l&&typeof a[l]=="string")return a[l]}var u=r.slice(i+s).join(n);return u?Kc(a,u,n):void 0}o=o[r[i]]}return o}}var Zf=function(e){Di(n,e);var t=Xf(n);function n(r){var o,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};return ct(this,n),o=t.call(this),Fi&&on.call(Gt(o)),o.data=r||{},o.options=i,o.options.keySeparator===void 0&&(o.options.keySeparator="."),o.options.ignoreJSONStructure===void 0&&(o.options.ignoreJSONStructure=!0),o}return dt(n,[{key:"addNamespaces",value:function(o){this.options.ns.indexOf(o)<0&&this.options.ns.push(o)}},{key:"removeNamespaces",value:function(o){var i=this.options.ns.indexOf(o);i>-1&&this.options.ns.splice(i,1)}},{key:"getResource",value:function(o,i,s){var l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},a=l.keySeparator!==void 0?l.keySeparator:this.options.keySeparator,u=l.ignoreJSONStructure!==void 0?l.ignoreJSONStructure:this.options.ignoreJSONStructure,f=[o,i];s&&typeof s!="string"&&(f=f.concat(s)),s&&typeof s=="string"&&(f=f.concat(a?s.split(a):s)),o.indexOf(".")>-1&&(f=o.split("."));var d=li(this.data,f);return d||!u||typeof s!="string"?d:Kc(this.data&&this.data[o]&&this.data[o][i],s,a)}},{key:"addResource",value:function(o,i,s,l){var a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1},u=this.options.keySeparator;u===void 0&&(u=".");var f=[o,i];s&&(f=f.concat(u?s.split(u):s)),o.indexOf(".")>-1&&(f=o.split("."),l=i,i=f[1]),this.addNamespaces(i),tu(this.data,f,l),a.silent||this.emit("added",o,i,s,l)}},{key:"addResources",value:function(o,i,s){var l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(var a in s)(typeof s[a]=="string"||Object.prototype.toString.apply(s[a])==="[object Array]")&&this.addResource(o,i,a,s[a],{silent:!0});l.silent||this.emit("added",o,i,s)}},{key:"addResourceBundle",value:function(o,i,s,l,a){var u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1},f=[o,i];o.indexOf(".")>-1&&(f=o.split("."),l=s,s=i,i=f[1]),this.addNamespaces(i);var d=li(this.data,f)||{};l?Hc(d,s,a):d=vo(vo({},d),s),tu(this.data,f,d),u.silent||this.emit("added",o,i,s)}},{key:"removeResourceBundle",value:function(o,i){this.hasResourceBundle(o,i)&&delete this.data[o][i],this.removeNamespaces(i),this.emit("removed",o,i)}},{key:"hasResourceBundle",value:function(o,i){return this.getResource(o,i)!==void 0}},{key:"getResourceBundle",value:function(o,i){return i||(i=this.options.defaultNS),this.options.compatibilityAPI==="v1"?vo(vo({},{}),this.getResource(o,i)):this.getResource(o,i)}},{key:"getDataByLanguage",value:function(o){return this.data[o]}},{key:"hasLanguageSomeTranslations",value:function(o){var i=this.getDataByLanguage(o),s=i&&Object.keys(i)||[];return!!s.find(function(l){return i[l]&&Object.keys(i[l]).length>0})}},{key:"toJSON",value:function(){return this.data}}]),n}(on),Wc={processors:{},addPostProcessor:function(t){this.processors[t.name]=t},handle:function(t,n,r,o,i){var s=this;return t.forEach(function(l){s.processors[l]&&(n=s.processors[l].process(n,r,o,i))}),n}};function ou(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function Ne(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var iu={},su=function(e){Di(n,e);var t=em(n);function n(r){var o,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return ct(this,n),o=t.call(this),Fi&&on.call(Gt(o)),Kf(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],r,Gt(o)),o.options=i,o.options.keySeparator===void 0&&(o.options.keySeparator="."),o.logger=kt.create("translator"),o}return dt(n,[{key:"changeLanguage",value:function(o){o&&(this.language=o)}},{key:"exists",value:function(o){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(o==null)return!1;var s=this.resolve(o,i);return s&&s.res!==void 0}},{key:"extractFromKey",value:function(o,i){var s=i.nsSeparator!==void 0?i.nsSeparator:this.options.nsSeparator;s===void 0&&(s=":");var l=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,a=i.ns||this.options.defaultNS||[],u=s&&o.indexOf(s)>-1,f=!this.options.userDefinedKeySeparator&&!i.keySeparator&&!this.options.userDefinedNsSeparator&&!i.nsSeparator&&!Qf(o,s,l);if(u&&!f){var d=o.match(this.interpolator.nestingRegexp);if(d&&d.length>0)return{key:o,namespaces:a};var m=o.split(s);(s!==l||s===l&&this.options.ns.indexOf(m[0])>-1)&&(a=m.shift()),o=m.join(l)}return typeof a=="string"&&(a=[a]),{key:o,namespaces:a}}},{key:"translate",value:function(o,i,s){var l=this;if(ve(i)!=="object"&&this.options.overloadTranslationOptionHandler&&(i=this.options.overloadTranslationOptionHandler(arguments)),i||(i={}),o==null)return"";Array.isArray(o)||(o=[String(o)]);var a=i.returnDetails!==void 0?i.returnDetails:this.options.returnDetails,u=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,f=this.extractFromKey(o[o.length-1],i),d=f.key,m=f.namespaces,g=m[m.length-1],v=i.lng||this.language,k=i.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(v&&v.toLowerCase()==="cimode"){if(k){var O=i.nsSeparator||this.options.nsSeparator;return a?{res:"".concat(g).concat(O).concat(d),usedKey:d,exactUsedKey:d,usedLng:v,usedNS:g}:"".concat(g).concat(O).concat(d)}return a?{res:d,usedKey:d,exactUsedKey:d,usedLng:v,usedNS:g}:d}var p=this.resolve(o,i),c=p&&p.res,h=p&&p.usedKey||d,y=p&&p.exactUsedKey||d,S=Object.prototype.toString.apply(c),w=["[object Number]","[object Function]","[object RegExp]"],P=i.joinArrays!==void 0?i.joinArrays:this.options.joinArrays,R=!this.i18nFormat||this.i18nFormat.handleAsObject,D=typeof c!="string"&&typeof c!="boolean"&&typeof c!="number";if(R&&c&&D&&w.indexOf(S)<0&&!(typeof P=="string"&&S==="[object Array]")){if(!i.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");var x=this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,c,Ne(Ne({},i),{},{ns:m})):"key '".concat(d," (").concat(this.language,")' returned an object instead of string.");return a?(p.res=x,p):x}if(u){var K=S==="[object Array]",Te=K?[]:{},Rt=K?y:h;for(var et in c)if(Object.prototype.hasOwnProperty.call(c,et)){var xn="".concat(Rt).concat(u).concat(et);Te[et]=this.translate(xn,Ne(Ne({},i),{joinArrays:!1,ns:m})),Te[et]===xn&&(Te[et]=c[et])}c=Te}}else if(R&&typeof P=="string"&&S==="[object Array]")c=c.join(P),c&&(c=this.extendTranslation(c,o,i,s));else{var mt=!1,tt=!1,C=i.count!==void 0&&typeof i.count!="string",V=n.hasDefaultValue(i),F=C?this.pluralResolver.getSuffix(v,i.count,i):"",A=i["defaultValue".concat(F)]||i.defaultValue;!this.isValidLookup(c)&&V&&(mt=!0,c=A),this.isValidLookup(c)||(tt=!0,c=d);var X=i.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey,xt=X&&tt?void 0:c,je=V&&A!==c&&this.options.updateMissing;if(tt||mt||je){if(this.logger.log(je?"updateKey":"missingKey",v,g,d,je?A:c),u){var Cn=this.resolve(d,Ne(Ne({},i),{},{keySeparator:!1}));Cn&&Cn.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}var Me=[],Ct=this.languageUtils.getFallbackCodes(this.options.fallbackLng,i.lng||this.language);if(this.options.saveMissingTo==="fallback"&&Ct&&Ct[0])for(var Ji=0;Ji1&&arguments[1]!==void 0?arguments[1]:{},l,a,u,f,d;return typeof o=="string"&&(o=[o]),o.forEach(function(m){if(!i.isValidLookup(l)){var g=i.extractFromKey(m,s),v=g.key;a=v;var k=g.namespaces;i.options.fallbackNS&&(k=k.concat(i.options.fallbackNS));var O=s.count!==void 0&&typeof s.count!="string",p=O&&!s.ordinal&&s.count===0&&i.pluralResolver.shouldUseIntlApi(),c=s.context!==void 0&&(typeof s.context=="string"||typeof s.context=="number")&&s.context!=="",h=s.lngs?s.lngs:i.languageUtils.toResolveHierarchy(s.lng||i.language,s.fallbackLng);k.forEach(function(y){i.isValidLookup(l)||(d=y,!iu["".concat(h[0],"-").concat(y)]&&i.utils&&i.utils.hasLoadedNamespace&&!i.utils.hasLoadedNamespace(d)&&(iu["".concat(h[0],"-").concat(y)]=!0,i.logger.warn('key "'.concat(a,'" for languages "').concat(h.join(", "),`" won't get resolved as namespace "`).concat(d,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),h.forEach(function(S){if(!i.isValidLookup(l)){f=S;var w=[v];if(i.i18nFormat&&i.i18nFormat.addLookupKeys)i.i18nFormat.addLookupKeys(w,v,S,y,s);else{var P;O&&(P=i.pluralResolver.getSuffix(S,s.count,s));var R="".concat(i.options.pluralSeparator,"zero");if(O&&(w.push(v+P),p&&w.push(v+R)),c){var D="".concat(v).concat(i.options.contextSeparator).concat(s.context);w.push(D),O&&(w.push(D+P),p&&w.push(D+R))}}for(var x;x=w.pop();)i.isValidLookup(l)||(u=x,l=i.getResource(S,y,x,s))}}))})}}),{res:l,usedKey:a,exactUsedKey:u,usedLng:f,usedNS:d}}},{key:"isValidLookup",value:function(o){return o!==void 0&&!(!this.options.returnNull&&o===null)&&!(!this.options.returnEmptyString&&o==="")}},{key:"getResource",value:function(o,i,s){var l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(o,i,s,l):this.resourceStore.getResource(o,i,s,l)}}],[{key:"hasDefaultValue",value:function(o){var i="defaultValue";for(var s in o)if(Object.prototype.hasOwnProperty.call(o,s)&&i===s.substring(0,i.length)&&o[s]!==void 0)return!0;return!1}}]),n}(on);function ns(e){return e.charAt(0).toUpperCase()+e.slice(1)}var lu=function(){function e(t){ct(this,e),this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=kt.create("languageUtils")}return dt(e,[{key:"getScriptPartFromCode",value:function(n){if(!n||n.indexOf("-")<0)return null;var r=n.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}},{key:"getLanguagePartFromCode",value:function(n){if(!n||n.indexOf("-")<0)return n;var r=n.split("-");return this.formatLanguageCode(r[0])}},{key:"formatLanguageCode",value:function(n){if(typeof n=="string"&&n.indexOf("-")>-1){var r=["hans","hant","latn","cyrl","cans","mong","arab"],o=n.split("-");return this.options.lowerCaseLng?o=o.map(function(i){return i.toLowerCase()}):o.length===2?(o[0]=o[0].toLowerCase(),o[1]=o[1].toUpperCase(),r.indexOf(o[1].toLowerCase())>-1&&(o[1]=ns(o[1].toLowerCase()))):o.length===3&&(o[0]=o[0].toLowerCase(),o[1].length===2&&(o[1]=o[1].toUpperCase()),o[0]!=="sgn"&&o[2].length===2&&(o[2]=o[2].toUpperCase()),r.indexOf(o[1].toLowerCase())>-1&&(o[1]=ns(o[1].toLowerCase())),r.indexOf(o[2].toLowerCase())>-1&&(o[2]=ns(o[2].toLowerCase()))),o.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?n.toLowerCase():n}},{key:"isSupportedCode",value:function(n){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(n=this.getLanguagePartFromCode(n)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(n)>-1}},{key:"getBestMatchFromCodes",value:function(n){var r=this;if(!n)return null;var o;return n.forEach(function(i){if(!o){var s=r.formatLanguageCode(i);(!r.options.supportedLngs||r.isSupportedCode(s))&&(o=s)}}),!o&&this.options.supportedLngs&&n.forEach(function(i){if(!o){var s=r.getLanguagePartFromCode(i);if(r.isSupportedCode(s))return o=s;o=r.options.supportedLngs.find(function(l){if(l.indexOf(s)===0)return l})}}),o||(o=this.getFallbackCodes(this.options.fallbackLng)[0]),o}},{key:"getFallbackCodes",value:function(n,r){if(!n)return[];if(typeof n=="function"&&(n=n(r)),typeof n=="string"&&(n=[n]),Object.prototype.toString.apply(n)==="[object Array]")return n;if(!r)return n.default||[];var o=n[r];return o||(o=n[this.getScriptPartFromCode(r)]),o||(o=n[this.formatLanguageCode(r)]),o||(o=n[this.getLanguagePartFromCode(r)]),o||(o=n.default),o||[]}},{key:"toResolveHierarchy",value:function(n,r){var o=this,i=this.getFallbackCodes(r||this.options.fallbackLng||[],n),s=[],l=function(u){u&&(o.isSupportedCode(u)?s.push(u):o.logger.warn("rejecting language code not found in supportedLngs: ".concat(u)))};return typeof n=="string"&&n.indexOf("-")>-1?(this.options.load!=="languageOnly"&&l(this.formatLanguageCode(n)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&l(this.getScriptPartFromCode(n)),this.options.load!=="currentOnly"&&l(this.getLanguagePartFromCode(n))):typeof n=="string"&&l(this.formatLanguageCode(n)),i.forEach(function(a){s.indexOf(a)<0&&l(o.formatLanguageCode(a))}),s}}]),e}(),nm=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],rm={1:function(t){return+(t>1)},2:function(t){return+(t!=1)},3:function(t){return 0},4:function(t){return t%10==1&&t%100!=11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2},5:function(t){return t==0?0:t==1?1:t==2?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},6:function(t){return t==1?0:t>=2&&t<=4?1:2},7:function(t){return t==1?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2},8:function(t){return t==1?0:t==2?1:t!=8&&t!=11?2:3},9:function(t){return+(t>=2)},10:function(t){return t==1?0:t==2?1:t<7?2:t<11?3:4},11:function(t){return t==1||t==11?0:t==2||t==12?1:t>2&&t<20?2:3},12:function(t){return+(t%10!=1||t%100==11)},13:function(t){return+(t!==0)},14:function(t){return t==1?0:t==2?1:t==3?2:3},15:function(t){return t%10==1&&t%100!=11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2},16:function(t){return t%10==1&&t%100!=11?0:t!==0?1:2},17:function(t){return t==1||t%10==1&&t%100!=11?0:1},18:function(t){return t==0?0:t==1?1:2},19:function(t){return t==1?0:t==0||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3},20:function(t){return t==1?0:t==0||t%100>0&&t%100<20?1:2},21:function(t){return t%100==1?1:t%100==2?2:t%100==3||t%100==4?3:0},22:function(t){return t==1?0:t==2?1:(t<0||t>10)&&t%10==0?2:3}},om=["v1","v2","v3"],au={zero:0,one:1,two:2,few:3,many:4,other:5};function im(){var e={};return nm.forEach(function(t){t.lngs.forEach(function(n){e[n]={numbers:t.nr,plurals:rm[t.fc]}})}),e}var sm=function(){function e(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};ct(this,e),this.languageUtils=t,this.options=n,this.logger=kt.create("pluralResolver"),(!this.options.compatibilityJSON||this.options.compatibilityJSON==="v4")&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=im()}return dt(e,[{key:"addRule",value:function(n,r){this.rules[n]=r}},{key:"getRule",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(n,{type:r.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[n]||this.rules[this.languageUtils.getLanguagePartFromCode(n)]}},{key:"needsPlural",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=this.getRule(n,r);return this.shouldUseIntlApi()?o&&o.resolvedOptions().pluralCategories.length>1:o&&o.numbers.length>1}},{key:"getPluralFormsOfKey",value:function(n,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(n,o).map(function(i){return"".concat(r).concat(i)})}},{key:"getSuffixes",value:function(n){var r=this,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=this.getRule(n,o);return i?this.shouldUseIntlApi()?i.resolvedOptions().pluralCategories.sort(function(s,l){return au[s]-au[l]}).map(function(s){return"".concat(r.options.prepend).concat(s)}):i.numbers.map(function(s){return r.getSuffix(n,s,o)}):[]}},{key:"getSuffix",value:function(n,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=this.getRule(n,o);return i?this.shouldUseIntlApi()?"".concat(this.options.prepend).concat(i.select(r)):this.getSuffixRetroCompatible(i,r):(this.logger.warn("no plural rule found for: ".concat(n)),"")}},{key:"getSuffixRetroCompatible",value:function(n,r){var o=this,i=n.noAbs?n.plurals(r):n.plurals(Math.abs(r)),s=n.numbers[i];this.options.simplifyPluralSuffix&&n.numbers.length===2&&n.numbers[0]===1&&(s===2?s="plural":s===1&&(s=""));var l=function(){return o.options.prepend&&s.toString()?o.options.prepend+s.toString():s.toString()};return this.options.compatibilityJSON==="v1"?s===1?"":typeof s=="number"?"_plural_".concat(s.toString()):l():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&n.numbers.length===2&&n.numbers[0]===1?l():this.options.prepend&&i.toString()?this.options.prepend+i.toString():i.toString()}},{key:"shouldUseIntlApi",value:function(){return!om.includes(this.options.compatibilityJSON)}}]),e}();function uu(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function nt(e){for(var t=1;t0&&arguments[0]!==void 0?arguments[0]:{};ct(this,e),this.logger=kt.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||function(n){return n},this.init(t)}return dt(e,[{key:"init",value:function(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};n.interpolation||(n.interpolation={escapeValue:!0});var r=n.interpolation;this.escape=r.escape!==void 0?r.escape:qf,this.escapeValue=r.escapeValue!==void 0?r.escapeValue:!0,this.useRawValueToEscape=r.useRawValueToEscape!==void 0?r.useRawValueToEscape:!1,this.prefix=r.prefix?Ln(r.prefix):r.prefixEscaped||"{{",this.suffix=r.suffix?Ln(r.suffix):r.suffixEscaped||"}}",this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||",",this.unescapePrefix=r.unescapeSuffix?"":r.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":r.unescapeSuffix||"",this.nestingPrefix=r.nestingPrefix?Ln(r.nestingPrefix):r.nestingPrefixEscaped||Ln("$t("),this.nestingSuffix=r.nestingSuffix?Ln(r.nestingSuffix):r.nestingSuffixEscaped||Ln(")"),this.nestingOptionsSeparator=r.nestingOptionsSeparator?r.nestingOptionsSeparator:r.nestingOptionsSeparator||",",this.maxReplaces=r.maxReplaces?r.maxReplaces:1e3,this.alwaysFormat=r.alwaysFormat!==void 0?r.alwaysFormat:!1,this.resetRegExp()}},{key:"reset",value:function(){this.options&&this.init(this.options)}},{key:"resetRegExp",value:function(){var n="".concat(this.prefix,"(.+?)").concat(this.suffix);this.regexp=new RegExp(n,"g");var r="".concat(this.prefix).concat(this.unescapePrefix,"(.+?)").concat(this.unescapeSuffix).concat(this.suffix);this.regexpUnescape=new RegExp(r,"g");var o="".concat(this.nestingPrefix,"(.+?)").concat(this.nestingSuffix);this.nestingRegexp=new RegExp(o,"g")}},{key:"interpolate",value:function(n,r,o,i){var s=this,l,a,u,f=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function d(O){return O.replace(/\$/g,"$$$$")}var m=function(p){if(p.indexOf(s.formatSeparator)<0){var c=nu(r,f,p);return s.alwaysFormat?s.format(c,void 0,o,nt(nt(nt({},i),r),{},{interpolationkey:p})):c}var h=p.split(s.formatSeparator),y=h.shift().trim(),S=h.join(s.formatSeparator).trim();return s.format(nu(r,f,y),S,o,nt(nt(nt({},i),r),{},{interpolationkey:y}))};this.resetRegExp();var g=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,v=i&&i.interpolation&&i.interpolation.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables,k=[{regex:this.regexpUnescape,safeValue:function(p){return d(p)}},{regex:this.regexp,safeValue:function(p){return s.escapeValue?d(s.escape(p)):d(p)}}];return k.forEach(function(O){for(u=0;l=O.regex.exec(n);){var p=l[1].trim();if(a=m(p),a===void 0)if(typeof g=="function"){var c=g(n,l,i);a=typeof c=="string"?c:""}else if(i&&Object.prototype.hasOwnProperty.call(i,p))a="";else if(v){a=l[0];continue}else s.logger.warn("missed to pass in variable ".concat(p," for interpolating ").concat(n)),a="";else typeof a!="string"&&!s.useRawValueToEscape&&(a=eu(a));var h=O.safeValue(a);if(n=n.replace(l[0],h),v?(O.regex.lastIndex+=a.length,O.regex.lastIndex-=l[0].length):O.regex.lastIndex=0,u++,u>=s.maxReplaces)break}}),n}},{key:"nest",value:function(n,r){var o=this,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s,l,a;function u(g,v){var k=this.nestingOptionsSeparator;if(g.indexOf(k)<0)return g;var O=g.split(new RegExp("".concat(k,"[ ]*{"))),p="{".concat(O[1]);g=O[0],p=this.interpolate(p,a);var c=p.match(/'/g),h=p.match(/"/g);(c&&c.length%2===0&&!h||h.length%2!==0)&&(p=p.replace(/'/g,'"'));try{a=JSON.parse(p),v&&(a=nt(nt({},v),a))}catch(y){return this.logger.warn("failed parsing options string in nesting for key ".concat(g),y),"".concat(g).concat(k).concat(p)}return delete a.defaultValue,g}for(;s=this.nestingRegexp.exec(n);){var f=[];a=nt({},i),a=a.replace&&typeof a.replace!="string"?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;var d=!1;if(s[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(s[1])){var m=s[1].split(this.formatSeparator).map(function(g){return g.trim()});s[1]=m.shift(),f=m,d=!0}if(l=r(u.call(this,s[1].trim(),a),a),l&&s[0]===n&&typeof l!="string")return l;typeof l!="string"&&(l=eu(l)),l||(this.logger.warn("missed to resolve ".concat(s[1]," for nesting ").concat(n)),l=""),d&&(l=f.reduce(function(g,v){return o.format(g,v,i.lng,nt(nt({},i),{},{interpolationkey:s[1].trim()}))},l.trim())),n=n.replace(s[0],l),this.regexp.lastIndex=0}return n}}]),e}();function cu(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function Tt(e){for(var t=1;t-1){var r=e.split("(");t=r[0].toLowerCase().trim();var o=r[1].substring(0,r[1].length-1);if(t==="currency"&&o.indexOf(":")<0)n.currency||(n.currency=o.trim());else if(t==="relativetime"&&o.indexOf(":")<0)n.range||(n.range=o.trim());else{var i=o.split(";");i.forEach(function(s){if(s){var l=s.split(":"),a=zf(l),u=a[0],f=a.slice(1),d=f.join(":").trim().replace(/^'+|'+$/g,"");n[u.trim()]||(n[u.trim()]=d),d==="false"&&(n[u.trim()]=!1),d==="true"&&(n[u.trim()]=!0),isNaN(d)||(n[u.trim()]=parseInt(d,10))}})}}return{formatName:t,formatOptions:n}}function In(e){var t={};return function(r,o,i){var s=o+JSON.stringify(i),l=t[s];return l||(l=e(o,i),t[s]=l),l(r)}}var um=function(){function e(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};ct(this,e),this.logger=kt.create("formatter"),this.options=t,this.formats={number:In(function(n,r){var o=new Intl.NumberFormat(n,Tt({},r));return function(i){return o.format(i)}}),currency:In(function(n,r){var o=new Intl.NumberFormat(n,Tt(Tt({},r),{},{style:"currency"}));return function(i){return o.format(i)}}),datetime:In(function(n,r){var o=new Intl.DateTimeFormat(n,Tt({},r));return function(i){return o.format(i)}}),relativetime:In(function(n,r){var o=new Intl.RelativeTimeFormat(n,Tt({},r));return function(i){return o.format(i,r.range||"day")}}),list:In(function(n,r){var o=new Intl.ListFormat(n,Tt({},r));return function(i){return o.format(i)}})},this.init(t)}return dt(e,[{key:"init",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}},o=r.interpolation;this.formatSeparator=o.formatSeparator?o.formatSeparator:o.formatSeparator||","}},{key:"add",value:function(n,r){this.formats[n.toLowerCase().trim()]=r}},{key:"addCached",value:function(n,r){this.formats[n.toLowerCase().trim()]=In(r)}},{key:"format",value:function(n,r,o){var i=this,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{},l=r.split(this.formatSeparator),a=l.reduce(function(u,f){var d=am(f),m=d.formatName,g=d.formatOptions;if(i.formats[m]){var v=u;try{var k=s&&s.formatParams&&s.formatParams[s.interpolationkey]||{},O=k.locale||k.lng||s.locale||s.lng||o;v=i.formats[m](u,O,Tt(Tt(Tt({},g),s),k))}catch(p){i.logger.warn(p)}return v}else i.logger.warn("there was no format function for ".concat(m));return u},n);return a}}]),e}();function du(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function pu(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function pm(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}var fm=function(e){Di(n,e);var t=cm(n);function n(r,o,i){var s,l=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return ct(this,n),s=t.call(this),Fi&&on.call(Gt(s)),s.backend=r,s.store=o,s.services=i,s.languageUtils=i.languageUtils,s.options=l,s.logger=kt.create("backendConnector"),s.waitingReads=[],s.maxParallelReads=l.maxParallelReads||10,s.readingCalls=0,s.maxRetries=l.maxRetries>=0?l.maxRetries:5,s.retryTimeout=l.retryTimeout>=1?l.retryTimeout:350,s.state={},s.queue=[],s.backend&&s.backend.init&&s.backend.init(i,l.backend,l),s}return dt(n,[{key:"queueLoad",value:function(o,i,s,l){var a=this,u={},f={},d={},m={};return o.forEach(function(g){var v=!0;i.forEach(function(k){var O="".concat(g,"|").concat(k);!s.reload&&a.store.hasResourceBundle(g,k)?a.state[O]=2:a.state[O]<0||(a.state[O]===1?f[O]===void 0&&(f[O]=!0):(a.state[O]=1,v=!1,f[O]===void 0&&(f[O]=!0),u[O]===void 0&&(u[O]=!0),m[k]===void 0&&(m[k]=!0)))}),v||(d[g]=!0)}),(Object.keys(u).length||Object.keys(f).length)&&this.queue.push({pending:f,pendingCount:Object.keys(f).length,loaded:{},errors:[],callback:l}),{toLoad:Object.keys(u),pending:Object.keys(f),toLoadLanguages:Object.keys(d),toLoadNamespaces:Object.keys(m)}}},{key:"loaded",value:function(o,i,s){var l=o.split("|"),a=l[0],u=l[1];i&&this.emit("failedLoading",a,u,i),s&&this.store.addResourceBundle(a,u,s),this.state[o]=i?-1:2;var f={};this.queue.forEach(function(d){Wf(d.loaded,[a],u),pm(d,o),i&&d.errors.push(i),d.pendingCount===0&&!d.done&&(Object.keys(d.loaded).forEach(function(m){f[m]||(f[m]={});var g=d.loaded[m];g.length&&g.forEach(function(v){f[m][v]===void 0&&(f[m][v]=!0)})}),d.done=!0,d.errors.length?d.callback(d.errors):d.callback())}),this.emit("loaded",f),this.queue=this.queue.filter(function(d){return!d.done})}},{key:"read",value:function(o,i,s){var l=this,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,u=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,f=arguments.length>5?arguments[5]:void 0;if(!o.length)return f(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:o,ns:i,fcName:s,tried:a,wait:u,callback:f});return}this.readingCalls++;var d=function(k,O){if(l.readingCalls--,l.waitingReads.length>0){var p=l.waitingReads.shift();l.read(p.lng,p.ns,p.fcName,p.tried,p.wait,p.callback)}if(k&&O&&a2&&arguments[2]!==void 0?arguments[2]:{},a=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),a&&a();typeof o=="string"&&(o=this.languageUtils.toResolveHierarchy(o)),typeof i=="string"&&(i=[i]);var u=this.queueLoad(o,i,l,a);if(!u.toLoad.length)return u.pending.length||a(),null;u.toLoad.forEach(function(f){s.loadOne(f)})}},{key:"load",value:function(o,i,s){this.prepareLoading(o,i,{},s)}},{key:"reload",value:function(o,i,s){this.prepareLoading(o,i,{reload:!0},s)}},{key:"loadOne",value:function(o){var i=this,s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"",l=o.split("|"),a=l[0],u=l[1];this.read(a,u,"read",void 0,void 0,function(f,d){f&&i.logger.warn("".concat(s,"loading namespace ").concat(u," for language ").concat(a," failed"),f),!f&&d&&i.logger.log("".concat(s,"loaded namespace ").concat(u," for language ").concat(a),d),i.loaded(o,f,d)})}},{key:"saveMissing",value:function(o,i,s,l,a){var u=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{},f=arguments.length>6&&arguments[6]!==void 0?arguments[6]:function(){};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(i)){this.logger.warn('did not save key "'.concat(s,'" as the namespace "').concat(i,'" was not yet loaded'),"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(s==null||s==="")){if(this.backend&&this.backend.create){var d=pu(pu({},u),{},{isUpdate:a}),m=this.backend.create.bind(this.backend);if(m.length<6)try{var g;m.length===5?g=m(o,i,s,l,d):g=m(o,i,s,l),g&&typeof g.then=="function"?g.then(function(v){return f(null,v)}).catch(f):f(null,g)}catch(v){f(v)}else m(o,i,s,l,f,d)}!o||!o[0]||this.store.addResource(o[0],i,s,l)}}}]),n}(on);function fu(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!0,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){var n={};if(ve(t[1])==="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),ve(t[2])==="object"||ve(t[3])==="object"){var r=t[3]||t[2];Object.keys(r).forEach(function(o){n[o]=r[o]})}return n},interpolation:{escapeValue:!0,format:function(t,n,r,o){return t},prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function mu(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function hu(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function gt(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function yo(){}function gm(e){var t=Object.getOwnPropertyNames(Object.getPrototypeOf(e));t.forEach(function(n){typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}var ai=function(e){Di(n,e);var t=mm(n);function n(){var r,o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},i=arguments.length>1?arguments[1]:void 0;if(ct(this,n),r=t.call(this),Fi&&on.call(Gt(r)),r.options=mu(o),r.services={},r.logger=kt,r.modules={external:[]},gm(Gt(r)),i&&!r.isInitialized&&!o.isClone){if(!r.options.initImmediate)return r.init(o,i),uo(r,Gt(r));setTimeout(function(){r.init(o,i)},0)}return r}return dt(n,[{key:"init",value:function(){var o=this,i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},s=arguments.length>1?arguments[1]:void 0;typeof i=="function"&&(s=i,i={}),!i.defaultNS&&i.defaultNS!==!1&&i.ns&&(typeof i.ns=="string"?i.defaultNS=i.ns:i.ns.indexOf("translation")<0&&(i.defaultNS=i.ns[0]));var l=fu();this.options=gt(gt(gt({},l),this.options),mu(i)),this.options.compatibilityAPI!=="v1"&&(this.options.interpolation=gt(gt({},l.interpolation),this.options.interpolation)),i.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=i.keySeparator),i.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=i.nsSeparator);function a(p){return p?typeof p=="function"?new p:p:null}if(!this.options.isClone){this.modules.logger?kt.init(a(this.modules.logger),this.options):kt.init(null,this.options);var u;this.modules.formatter?u=this.modules.formatter:typeof Intl<"u"&&(u=um);var f=new lu(this.options);this.store=new Zf(this.options.resources,this.options);var d=this.services;d.logger=kt,d.resourceStore=this.store,d.languageUtils=f,d.pluralResolver=new sm(f,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),u&&(!this.options.interpolation.format||this.options.interpolation.format===l.interpolation.format)&&(d.formatter=a(u),d.formatter.init(d,this.options),this.options.interpolation.format=d.formatter.format.bind(d.formatter)),d.interpolator=new lm(this.options),d.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},d.backendConnector=new fm(a(this.modules.backend),d.resourceStore,d,this.options),d.backendConnector.on("*",function(p){for(var c=arguments.length,h=new Array(c>1?c-1:0),y=1;y1?c-1:0),y=1;y0&&m[0]!=="dev"&&(this.options.lng=m[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined");var g=["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"];g.forEach(function(p){o[p]=function(){var c;return(c=o.store)[p].apply(c,arguments)}});var v=["addResource","addResources","addResourceBundle","removeResourceBundle"];v.forEach(function(p){o[p]=function(){var c;return(c=o.store)[p].apply(c,arguments),o}});var k=vr(),O=function(){var c=function(y,S){o.isInitialized&&!o.initializedStoreOnce&&o.logger.warn("init: i18next is already initialized. You should call init just once!"),o.isInitialized=!0,o.options.isClone||o.logger.log("initialized",o.options),o.emit("initialized",o.options),k.resolve(S),s(y,S)};if(o.languages&&o.options.compatibilityAPI!=="v1"&&!o.isInitialized)return c(null,o.t.bind(o));o.changeLanguage(o.options.lng,c)};return this.options.resources||!this.options.initImmediate?O():setTimeout(O,0),k}},{key:"loadResources",value:function(o){var i=this,s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:yo,l=s,a=typeof o=="string"?o:this.language;if(typeof o=="function"&&(l=o),!this.options.resources||this.options.partialBundledLanguages){if(a&&a.toLowerCase()==="cimode")return l();var u=[],f=function(g){if(g){var v=i.services.languageUtils.toResolveHierarchy(g);v.forEach(function(k){u.indexOf(k)<0&&u.push(k)})}};if(a)f(a);else{var d=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);d.forEach(function(m){return f(m)})}this.options.preload&&this.options.preload.forEach(function(m){return f(m)}),this.services.backendConnector.load(u,this.options.ns,function(m){!m&&!i.resolvedLanguage&&i.language&&i.setResolvedLanguage(i.language),l(m)})}else l(null)}},{key:"reloadResources",value:function(o,i,s){var l=vr();return o||(o=this.languages),i||(i=this.options.ns),s||(s=yo),this.services.backendConnector.reload(o,i,function(a){l.resolve(),s(a)}),l}},{key:"use",value:function(o){if(!o)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!o.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return o.type==="backend"&&(this.modules.backend=o),(o.type==="logger"||o.log&&o.warn&&o.error)&&(this.modules.logger=o),o.type==="languageDetector"&&(this.modules.languageDetector=o),o.type==="i18nFormat"&&(this.modules.i18nFormat=o),o.type==="postProcessor"&&Wc.addPostProcessor(o),o.type==="formatter"&&(this.modules.formatter=o),o.type==="3rdParty"&&this.modules.external.push(o),this}},{key:"setResolvedLanguage",value:function(o){if(!(!o||!this.languages)&&!(["cimode","dev"].indexOf(o)>-1))for(var i=0;i-1)&&this.store.hasLanguageSomeTranslations(s)){this.resolvedLanguage=s;break}}}},{key:"changeLanguage",value:function(o,i){var s=this;this.isLanguageChangingTo=o;var l=vr();this.emit("languageChanging",o);var a=function(m){s.language=m,s.languages=s.services.languageUtils.toResolveHierarchy(m),s.resolvedLanguage=void 0,s.setResolvedLanguage(m)},u=function(m,g){g?(a(g),s.translator.changeLanguage(g),s.isLanguageChangingTo=void 0,s.emit("languageChanged",g),s.logger.log("languageChanged",g)):s.isLanguageChangingTo=void 0,l.resolve(function(){return s.t.apply(s,arguments)}),i&&i(m,function(){return s.t.apply(s,arguments)})},f=function(m){!o&&!m&&s.services.languageDetector&&(m=[]);var g=typeof m=="string"?m:s.services.languageUtils.getBestMatchFromCodes(m);g&&(s.language||a(g),s.translator.language||s.translator.changeLanguage(g),s.services.languageDetector&&s.services.languageDetector.cacheUserLanguage&&s.services.languageDetector.cacheUserLanguage(g)),s.loadResources(g,function(v){u(v,g)})};return!o&&this.services.languageDetector&&!this.services.languageDetector.async?f(this.services.languageDetector.detect()):!o&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(f):this.services.languageDetector.detect(f):f(o),l}},{key:"getFixedT",value:function(o,i,s){var l=this,a=function u(f,d){var m;if(ve(d)!=="object"){for(var g=arguments.length,v=new Array(g>2?g-2:0),k=2;k1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;var l=this.resolvedLanguage||this.languages[0],a=this.options?this.options.fallbackLng:!1,u=this.languages[this.languages.length-1];if(l.toLowerCase()==="cimode")return!0;var f=function(g,v){var k=i.services.backendConnector.state["".concat(g,"|").concat(v)];return k===-1||k===2};if(s.precheck){var d=s.precheck(this,f);if(d!==void 0)return d}return!!(this.hasResourceBundle(l,o)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||f(l,o)&&(!a||f(u,o)))}},{key:"loadNamespaces",value:function(o,i){var s=this,l=vr();return this.options.ns?(typeof o=="string"&&(o=[o]),o.forEach(function(a){s.options.ns.indexOf(a)<0&&s.options.ns.push(a)}),this.loadResources(function(a){l.resolve(),i&&i(a)}),l):(i&&i(),Promise.resolve())}},{key:"loadLanguages",value:function(o,i){var s=vr();typeof o=="string"&&(o=[o]);var l=this.options.preload||[],a=o.filter(function(u){return l.indexOf(u)<0});return a.length?(this.options.preload=l.concat(a),this.loadResources(function(u){s.resolve(),i&&i(u)}),s):(i&&i(),Promise.resolve())}},{key:"dir",value:function(o){if(o||(o=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!o)return"rtl";var i=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],s=this.services&&this.services.languageUtils||new lu(fu());return i.indexOf(s.getLanguagePartFromCode(o))>-1||o.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}},{key:"cloneInstance",value:function(){var o=this,i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:yo,l=gt(gt(gt({},this.options),i),{isClone:!0}),a=new n(l);(i.debug!==void 0||i.prefix!==void 0)&&(a.logger=a.logger.clone(i));var u=["store","services","language"];return u.forEach(function(f){a[f]=o[f]}),a.services=gt({},this.services),a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a.translator=new su(a.services,a.options),a.translator.on("*",function(f){for(var d=arguments.length,m=new Array(d>1?d-1:0),g=1;g0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;return new ai(e,t)});var fe=ai.createInstance();fe.createInstance=ai.createInstance;fe.createInstance;fe.dir;fe.init;fe.loadResources;fe.reloadResources;fe.use;fe.changeLanguage;fe.getFixedT;fe.t;fe.exists;fe.setDefaultNamespace;fe.hasLoadedNamespace;fe.loadNamespaces;fe.loadLanguages;function vm(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,i;for(i=0;i=0)&&(n[o]=e[o]);return n}function ql(e,t){if(e==null)return{};var n=vm(e,t),r,o;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var ym={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},_m=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;function gu(e){var t={type:"tag",name:"",voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(ym[n[1]]||e.charAt(e.length-2)==="/")&&(t.voidElement=!0),t.name.startsWith("!--"))){var r=e.indexOf("-->");return{type:"comment",comment:r!==-1?e.slice(4,r):""}}for(var o=new RegExp(_m),i=null;(i=o.exec(e))!==null;)if(i[0].trim())if(i[1]){var s=i[1].trim(),l=[s,""];s.indexOf("=")>-1&&(l=s.split("=")),t.attrs[l[0]]=l[1],o.lastIndex--}else i[2]&&(t.attrs[i[2]]=i[3].trim().substring(1,i[3].length-1));return t}var km=/<[a-zA-Z0-9\-\!\/](?:"[^"]*"|'[^']*'|[^'">])*>/g,wm=/^\s*$/,Sm=Object.create(null);function Yc(e,t){switch(t.type){case"text":return e+t.content;case"tag":return e+="<"+t.name+(t.attrs?function(n){var r=[];for(var o in n)r.push(o+'="'+n[o]+'"');return r.length?" "+r.join(" "):""}(t.attrs):"")+(t.voidElement?"/>":">"),t.voidElement?e:e+t.children.reduce(Yc,"")+"";case"comment":return e+""}}var Om={parse:function(e,t){t||(t={}),t.components||(t.components=Sm);var n,r=[],o=[],i=-1,s=!1;if(e.indexOf("<")!==0){var l=e.indexOf("<");r.push({type:"text",content:l===-1?e:e.substring(0,l)})}return e.replace(km,function(a,u){if(s){if(a!=="")return;s=!1}var f,d=a.charAt(1)!=="/",m=a.startsWith("| offsets[f] |<--| - // |_____data____| - // <------------> - // reference size - // - // In-place crop - // crop output buffer - // |_low_pad_|__data_size__|___|<-upper pad - - // feature num of pad should be accumulated if dep has been optimized out. + // Regular crop + // crop input buffer + // |___________data____________| + // + // crop output buffer + // |-------->| offsets[f] |<--| + // |_____data____| + // <------------> + // reference size + // + // In-place crop + // crop output buffer + // |_low_pad_|__data_size__|___|<-upper pad + if (can_crop_be_optimized_along_feature(node)) { + auto crop_prim = node.get_primitive(); + auto opt_lower_pad = crop_prim->offsets.feature[0]; + auto opt_upper_pad = input_layout.feature() - crop_prim->offsets.feature[0] - crop_size.feature[0]; auto& dep = node.get_dependency(0); + // feature num of pad should be accumulated if dep has been optimized out. if (dep.is_type() && dep.can_be_optimized()) { auto dep_pad = dep.get_output_layout().data_padding; OPENVINO_ASSERT( @@ -454,18 +503,36 @@ void prepare_buffer_fusing::run(program& p) { opt_upper_pad += dep_pad.upper_size().feature[0]; } + // set padding node.set_output_padding( - padding({out_padd.lower_size().batch[0], - opt_lower_pad, - out_padd.lower_size().spatial[0], - out_padd.lower_size().spatial[1]}, - {out_padd.upper_size().batch[0], - opt_upper_pad, - out_padd.upper_size().spatial[0], - out_padd.upper_size().spatial[1]})); - node.can_be_optimized(true); - propagate_padding_to_opt_out_users(node, node.get_output_layout().data_padding); + padding({out_pad.lower_size().batch[0], + opt_lower_pad, + out_pad.lower_size().spatial[0], + out_pad.lower_size().spatial[1]}, + {out_pad.upper_size().batch[0], + opt_upper_pad, + out_pad.upper_size().spatial[0], + out_pad.upper_size().spatial[1]})); + } else if (can_crop_be_optimized_along_batch(node)) { + auto crop_prim = node.get_primitive(); + auto opt_lower_pad = crop_prim->offsets.batch[0]; + auto opt_upper_pad = input_layout.batch() - crop_prim->offsets.batch[0] - crop_size.batch[0]; + + auto new_padding = padding({opt_lower_pad, + out_pad.lower_size().feature[0], + out_pad.lower_size().spatial[0], + out_pad.lower_size().spatial[1]}, + {opt_upper_pad, + out_pad.upper_size().feature[0], + out_pad.upper_size().spatial[0], + out_pad.upper_size().spatial[1]}); + node.set_output_padding(new_padding); + } else { + return; } + + node.can_be_optimized(true); + propagate_padding_to_opt_out_users(node, node.get_output_layout().data_padding); } }); } diff --git a/src/plugins/intel_gpu/src/graph/impls/ocl/primitive_base.hpp b/src/plugins/intel_gpu/src/graph/impls/ocl/primitive_base.hpp index 4fd85f6b183..717cde4bb25 100644 --- a/src/plugins/intel_gpu/src/graph/impls/ocl/primitive_base.hpp +++ b/src/plugins/intel_gpu/src/graph/impls/ocl/primitive_base.hpp @@ -194,7 +194,7 @@ protected: OPENVINO_ASSERT(_kernels.size() == _kernel_data.kernels.size(), "[GPU] Mismatch between compiled kernels count and expected kernels data\n", "[GPU] Compiled kernels count: ", _kernels.size(), "\n", "[GPU] KernelData count: ", _kernel_data.kernels.size(), "\n", - "[GPU] Likely some issue with empty tensors hanlding happened"); + "[GPU] Likely some issue with empty tensor handling happened"); stream& stream = instance.get_network().get_stream(); for (size_t kd_idx = 0; kd_idx < _kernel_data.kernels.size(); ++kd_idx) { @@ -255,7 +255,7 @@ protected: OPENVINO_ASSERT(_kernels.size() == _kernel_data.kernels.size(), "[GPU] Mismatch between compiled kernels count and expected kernels data\n", "[GPU] Compiled kernels count: ", _kernels.size(), "\n", "[GPU] KernelData count: ", _kernel_data.kernels.size(), "\n", - "[GPU] Likely some issue with empty tensors hanlding happened"); + "[GPU] Likely some issue with empty tensor handling happened"); for (size_t kd_idx = 0; kd_idx < _kernel_data.kernels.size(); ++kd_idx) { if (_kernel_data.kernels[kd_idx].skip_execution) continue; diff --git a/src/plugins/intel_gpu/src/graph/include/assign_inst.h b/src/plugins/intel_gpu/src/graph/include/assign_inst.h index 727c9b9a7c0..a912ca8c713 100644 --- a/src/plugins/intel_gpu/src/graph/include/assign_inst.h +++ b/src/plugins/intel_gpu/src/graph/include/assign_inst.h @@ -30,6 +30,11 @@ class typed_primitive_inst : public typed_primitive_inst_base, p using parent = typed_primitive_inst_base; public: + template + static std::vector calc_output_layouts(assign_node const& /*node*/, const kernel_impl_params& impl_param) { + return forward_input0_shape(impl_param); + } + static layout calc_output_layout(const assign_node& node, kernel_impl_params const& impl_param); static std::string to_string(const assign_node& node); diff --git a/src/plugins/intel_gpu/src/graph/include/read_value_inst.h b/src/plugins/intel_gpu/src/graph/include/read_value_inst.h index 9e5c426d4a6..00a6e5b2ba1 100644 --- a/src/plugins/intel_gpu/src/graph/include/read_value_inst.h +++ b/src/plugins/intel_gpu/src/graph/include/read_value_inst.h @@ -17,6 +17,11 @@ class typed_primitive_inst : public typed_primitive_inst_base; public: + template + static std::vector calc_output_layouts(read_value_node const& /*node*/, const kernel_impl_params& impl_param) { + return forward_input0_shape(impl_param); + } + static layout calc_output_layout(const read_value_node& node, kernel_impl_params const& impl_param); static std::string to_string(const read_value_node& node); diff --git a/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp b/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp index 2680623efce..5af1228e012 100644 --- a/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp +++ b/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp @@ -1688,7 +1688,8 @@ format layout_optimizer::get_preferred_format(program_node& node) { } else if (node.is_type()) { // if the resample is in the last part of the network and there are no users using blocked format, // it is better to reorder to bfyx before resample is done. - if (all_users_simple_format_until_output(node, node, 0, 10)) { + // Skip all user format check when node is dynamic. It could cause endless recursive call in get_preferred_foramt() + if (!node.is_dynamic() && all_users_simple_format_until_output(node, node, 0, 10)) { const auto& dim = format::dimension(node.get_output_layout().format); expected = format::get_default_format(dim, false, false); } else { diff --git a/src/plugins/intel_gpu/src/graph/network.cpp b/src/plugins/intel_gpu/src/graph/network.cpp index b003ce51c4a..aa927c61bd6 100644 --- a/src/plugins/intel_gpu/src/graph/network.cpp +++ b/src/plugins/intel_gpu/src/graph/network.cpp @@ -1449,8 +1449,16 @@ void network::allocate_primitive_instance(program_node const& node) { if (node.is_type()) _data_outputs.push_back(inst); } - if (std::dynamic_pointer_cast(inst) || std::dynamic_pointer_cast(inst)) + if (node.is_type() || node.is_type()) { + if (node.is_type()) { + auto assign_prim = node.as().get_primitive(); + set_variables_state_info(assign_prim->variable_id, assign_prim->output_layout); + } else { + auto read_value_prim = node.as().get_primitive(); + set_variables_state_info(read_value_prim->variable_id, read_value_prim->output_layout); + } _variable_state_primitives.push_back(inst); + } if (node.is_constant()) transfer_memory_to_device(inst, node); } @@ -1508,4 +1516,53 @@ void network::assign_variables_memories(variables_states_map &&variables_memorie } } +void network::assign_variables_memories() { + for (auto primitive : _variable_state_primitives) { + if (const auto& memory_state_primitive = std::dynamic_pointer_cast(primitive)) { + auto it = _variables_states.find(memory_state_primitive->variable_id()); + if (it != _variables_states.end()) { + primitive->set_output_memory(it->second->memory, false); + } + } + } +} + +void network::update_variable_memory(const std::string& variable_id, const cldnn::layout& layout) { + auto it = _variables_states.find(variable_id); + if (it == _variables_states.end()) { + cldnn::network::VariableState::Ptr variable_state = std::make_shared(get_engine().allocate_memory(layout, false)); + _variables_states.insert({variable_id, variable_state}); + } else { + bool can_reuse = it->second->memory && layout.count() <= it->second->memory->get_layout().count(); + if (can_reuse) + it->second->set_memory(get_engine().reinterpret_buffer(*it->second->memory, layout)); + else + it->second->set_memory(get_engine().allocate_memory(layout, false)); + } + for (auto primitive : _variable_state_primitives) { + if (const auto& memory_state_primitive = std::dynamic_pointer_cast(primitive)) { + if (!variable_id.compare(memory_state_primitive->variable_id())) { + auto& variable_state = get_variable_memory(variable_id); + primitive->set_output_memory(variable_state.memory, false); + } + } + } +} + +void network::allocate_variables_memories() { + for (const auto& info : _variables_state_info) { + auto variable_layout = info.second; + if (variable_layout.is_static()) { + _variables_states.insert({info.first, std::make_shared(get_engine().allocate_memory(variable_layout, false))}); + } + } +} + +void network::set_variables_state_info(const std::string& variable_id, const cldnn::layout& layout) { + auto it = _variables_state_info.find(variable_id); + if (it == _variables_state_info.end()) { + _variables_state_info.insert({variable_id, layout}); + } +} + } // namespace cldnn diff --git a/src/plugins/intel_gpu/src/graph/primitive_inst.cpp b/src/plugins/intel_gpu/src/graph/primitive_inst.cpp index 53e1cafbd01..19a0950cb5c 100644 --- a/src/plugins/intel_gpu/src/graph/primitive_inst.cpp +++ b/src/plugins/intel_gpu/src/graph/primitive_inst.cpp @@ -19,6 +19,8 @@ #include "deconvolution_inst.h" #include "shape_of_inst.h" #include "gemm_inst.h" +#include "assign_inst.h" +#include "read_value_inst.h" #include "experimental_detectron_roi_feature_extractor_inst.hpp" #include "compilation_context.hpp" #include "implementation_map.hpp" @@ -346,6 +348,16 @@ event::ptr primitive_inst::realloc_if_needed() { if (_node->is_type()) return ev; + if (_node->is_type() || _node->is_type()) { + std::string variable_id = ""; + if (_node->is_type()) + variable_id = _node->as().get_primitive()->variable_id; + else + variable_id = _node->as().get_primitive()->variable_id; + get_network().update_variable_memory(variable_id, actual_layout); + return ev; + } + bool can_reuse_buffer = _outputs[0] && actual_layout.count() <= max_output_layout_size; if (can_reuse_buffer) { @@ -530,6 +542,7 @@ bool primitive_inst::update_impl() { } } else { _impl = _node->type()->choose_impl(*_node, updated_params_no_dyn_pad); + _impl->set_node_params(*_node); if (!can_be_optimized()) { auto& kernels_cache = get_network().get_program()->get_kernels_cache(); auto kernels = kernels_cache.compile(updated_params_no_dyn_pad, _impl->get_kernels_source()); diff --git a/src/plugins/intel_gpu/src/plugin/infer_request.cpp b/src/plugins/intel_gpu/src/plugin/infer_request.cpp index a93eeecafbb..b90fd45ff2d 100644 --- a/src/plugins/intel_gpu/src/plugin/infer_request.cpp +++ b/src/plugins/intel_gpu/src/plugin/infer_request.cpp @@ -372,7 +372,7 @@ void InferRequest::SetGraph(std::shared_ptr graph) { allocate_inputs(); allocate_outputs(); - variables_states_ = m_graph->AllocateVariablesMemories(); + m_graph->GetNetwork()->allocate_variables_memories(); } InferRequest::InferRequest(InputsDataMap networkInputs, OutputsDataMap networkOutputs, @@ -463,13 +463,8 @@ void InferRequest::enqueue() { prepare_input(inputName, inputBlob, dependencies); } - cldnn::network::variables_states_map variables_states; - for (auto &variable_state_pair : variables_states_) - variables_states.insert({ variable_state_pair.first, variable_state_pair.second[0] }); - auto networkPtr = m_graph->GetNetwork(); - - networkPtr->assign_variables_memories(std::move(variables_states)); + networkPtr->assign_variables_memories(); for (auto& item : _outputs) { std::string outputName = item.first; @@ -1051,9 +1046,11 @@ InferenceEngine::Blob::Ptr InferRequest::create_device_blob(const InferenceEngin std::vector> InferRequest::QueryState() { std::vector> ret{}; - ret.reserve(variables_states_.size()); - for (const auto& pair : variables_states_) - ret.push_back(std::make_shared(pair.first, pair.second, m_graph->get_engine(), -1)); + const auto& variable_states = m_graph->GetNetwork()->get_variable_memories(); + for (const auto& pair : variable_states) { + std::vector states { pair.second }; + ret.push_back(std::make_shared(pair.first, states, m_graph->get_engine(), -1)); + } return ret; } diff --git a/src/plugins/intel_gpu/src/plugin/ops/gather.cpp b/src/plugins/intel_gpu/src/plugin/ops/gather.cpp index 16dc84eac3b..fe43a793ee5 100644 --- a/src/plugins/intel_gpu/src/plugin/ops/gather.cpp +++ b/src/plugins/intel_gpu/src/plugin/ops/gather.cpp @@ -4,12 +4,14 @@ #include "intel_gpu/plugin/program.hpp" #include "intel_gpu/plugin/common_utils.hpp" +#include "transformations/utils/utils.hpp" #include "ngraph/op/gather.hpp" #include "intel_gpu/primitives/gather.hpp" #include "intel_gpu/primitives/reorder.hpp" #include "intel_gpu/primitives/reshape.hpp" +#include "intel_gpu/primitives/crop.hpp" using namespace InferenceEngine; namespace ov { @@ -44,12 +46,13 @@ void CreateGatherOpBase(Program& p, const std::shared_ptr& op, const int64_t } // Dynamic path will do shape infer internally, so no need to pass valid out shape for that case - ov::Shape out_shape = op->get_output_partial_shape(0).is_static() ? op->get_output_shape(0) : ov::Shape{}; + bool is_static = op->get_output_partial_shape(0).is_static(); + ov::Shape out_shape = is_static ? op->get_output_shape(0) : ov::Shape{}; // Update output_shape in case of scalar indice bool need_reshape = false; auto out_shape_original = out_shape; - if (!p.use_new_shape_infer() && op->get_output_partial_shape(0).is_static()) { + if (!p.use_new_shape_infer() && is_static) { auto input1_shape = op->get_input_shape(1); if (input1_shape.size() == 0 && batch_dim == 0) { need_reshape = true; @@ -77,21 +80,50 @@ void CreateGatherOpBase(Program& p, const std::shared_ptr& op, const int64_t } } - // gather + // Set layer name for Gather auto reshapeName = layerName + ""; if (need_reshape) { layerName = layerName + "_reshape_output"; } - auto gatherPrim = cldnn::gather(layerName, - reordered_inputs[0], - reordered_inputs[1], - axis, - out_shape, - batch_dim, - support_neg_ind); + // Check if Gather could be converted to other primitive + const auto input_shape = op->get_input_partial_shape(0); + const auto input_rank = input_shape.rank().get_length(); + const auto& indices = op->input_value(1); + if (is_static && axis == 0 && input_rank > 1 && indices.get_partial_shape().rank().get_length() == 0 && + std::equal(input_shape.begin()+1, input_shape.end(), out_shape.begin()+1)) { + // Gather -> Crop + // this Gather simply divides an input tensor along Batch axis + auto get_crop_layer_name = [&](std::string name, size_t idx)->std::string { + return (name + "/crop_" + std::to_string(idx)); + }; - p.add_primitive(*op, gatherPrim); + // Get indices info to calculate offset + const auto& indices_node = indices.get_node_shared_ptr(); + auto indices_constant = std::dynamic_pointer_cast(indices_node); + float result = 0.f; + ov::op::util::get_single_value(indices_constant, result); + + // Set tensors for crop shape and offset + InferenceEngine::SizeVector start_offset(input_shape.size()); + start_offset[0] = static_cast(result); + auto offsetTensor = tensor_from_dims(start_offset, 0); + auto outTensor = tensor_from_dims(out_shape, 1); + + // Create Crop + layerName = get_crop_layer_name(layerName, static_cast(result)); + auto cropPrim = cldnn::crop(layerName, reordered_inputs[0], outTensor, offsetTensor); + p.add_primitive(*op, cropPrim); + } else { + auto gatherPrim = cldnn::gather(layerName, + reordered_inputs[0], + reordered_inputs[1], + axis, + out_shape, + batch_dim, + support_neg_ind); + p.add_primitive(*op, gatherPrim); + } // Add reorder and reshape for scalar indice if (need_reshape) { diff --git a/src/plugins/intel_gpu/src/plugin/ops/variable.cpp b/src/plugins/intel_gpu/src/plugin/ops/variable.cpp index fac9efbc900..06b0804317d 100644 --- a/src/plugins/intel_gpu/src/plugin/ops/variable.cpp +++ b/src/plugins/intel_gpu/src/plugin/ops/variable.cpp @@ -19,17 +19,15 @@ void CreateVariableAccessPrimitive(Program &p, const std::shared_ptrget_output_element_type(0)); - const auto op_output_shape = op->get_output_shape(0); - const auto output_format = cldnn::format::get_default_format(op_output_shape.size()); - const auto output_shape = tensor_from_dims(op_output_shape); + const auto output_pshape = op->get_output_partial_shape(0); + const auto output_dtype = cldnn::element_type_to_data_type(op->get_output_element_type(0)); + const auto output_format = cldnn::format::get_default_format(output_pshape.size()); - const auto variable_layout = cldnn::layout{output_data_type, - output_format, - output_shape}; + const auto variable_layout = cldnn::layout{ output_pshape, output_dtype, output_format }; auto inputs = p.GetInputInfo(op); - p.AddVariableStateInfo(variable_id, variable_layout); + if (!p.use_new_shape_infer()) + p.AddVariableStateInfo(variable_id, variable_layout); const auto prim = T_PRIMITIVE{layer_type_name_ID(op), inputs, variable_id, diff --git a/src/plugins/intel_gpu/src/plugin/plugin.cpp b/src/plugins/intel_gpu/src/plugin/plugin.cpp index 8336f752115..fd0d94dd816 100644 --- a/src/plugins/intel_gpu/src/plugin/plugin.cpp +++ b/src/plugins/intel_gpu/src/plugin/plugin.cpp @@ -255,9 +255,10 @@ InferenceEngine::RemoteContext::Ptr Plugin::CreateContext(const AnyMap& params) } RemoteCLContext::Ptr Plugin::get_default_context(const std::string& device_id) const { - OPENVINO_ASSERT(get_default_contexts().find(device_id) != get_default_contexts().end(), "[GPU] Context was not initialized for ", device_id, " device"); + auto contexts = get_default_contexts(); + OPENVINO_ASSERT(contexts.find(device_id) != contexts.end(), "[GPU] Context was not initialized for ", device_id, " device"); - return get_default_contexts().at(device_id);; + return contexts.at(device_id);; } InferenceEngine::RemoteContext::Ptr Plugin::GetDefaultContext(const AnyMap& params) { diff --git a/src/plugins/intel_gpu/src/runtime/kernels_cache.cpp b/src/plugins/intel_gpu/src/runtime/kernels_cache.cpp index a6769887163..ef2f46bc31a 100644 --- a/src/plugins/intel_gpu/src/runtime/kernels_cache.cpp +++ b/src/plugins/intel_gpu/src/runtime/kernels_cache.cpp @@ -15,6 +15,13 @@ #include "intel_gpu/runtime/itt.hpp" #include "openvino/util/file_util.hpp" +#ifdef WIN32 +#include +#ifdef NTDDI_WIN10_RS5 +#include +#endif +#endif + #include #include #include @@ -407,7 +414,17 @@ void kernels_cache::build_all() { get_program_source(_kernels_code, &batches); } - if (_task_executor) { + // build_batch crashes randomly when threaded while running from a Microsoft Store app + // it seems to be a bug in Intel's graphics driver, disabling threading is a work around + auto use_threads{true}; +#if defined(WIN32) && defined(NTDDI_WIN10_RS5) + UINT32 length{0}; + auto error_code{GetCurrentPackageFullName(&length, nullptr)}; + // If we get this error, it means we're a regular desktop application, and we can use threads + use_threads = error_code == APPMODEL_ERROR_NO_PACKAGE; +#endif + + if (_task_executor && use_threads) { std::exception_ptr exception; std::vector tasks; for (size_t idx = 0; idx < batches.size(); idx++) { @@ -415,7 +432,7 @@ void kernels_cache::build_all() { tasks.push_back([this, &_build_engine, &batch, &exception] { try { build_batch(_build_engine, batch, _kernels); - } catch(...) { + } catch (...) { exception = std::current_exception(); } }); diff --git a/src/plugins/intel_gpu/tests/functional/shared_tests_instances/single_layer_tests/gather.cpp b/src/plugins/intel_gpu/tests/functional/shared_tests_instances/single_layer_tests/gather.cpp index a7993fa9e2c..ac4a3eca063 100644 --- a/src/plugins/intel_gpu/tests/functional/shared_tests_instances/single_layer_tests/gather.cpp +++ b/src/plugins/intel_gpu/tests/functional/shared_tests_instances/single_layer_tests/gather.cpp @@ -559,4 +559,23 @@ INSTANTIATE_TEST_SUITE_P( GatherLayerTest::getTestCaseName ); +const auto GatherAxes0Optimized = []() { + return testing::Combine(testing::ValuesIn({std::vector{4, 8, 2, 2}}), + testing::ValuesIn({std::vector{}}), + testing::ValuesIn({std::tuple{0, 0}}), + testing::ValuesIn(netPrecisionsFP32), + testing::Values(InferenceEngine::Precision::UNSPECIFIED), + testing::Values(InferenceEngine::Precision::UNSPECIFIED), + testing::Values(InferenceEngine::Layout::ANY), + testing::Values(InferenceEngine::Layout::ANY), + testing::Values(CommonTestUtils::DEVICE_GPU)); +}; + +INSTANTIATE_TEST_SUITE_P( + smoke_Gather7Axes0Optimized, + Gather8IndiceScalarLayerTest, + GatherAxes0Optimized(), + Gather8IndiceScalarLayerTest::getTestCaseName +); + } // namespace diff --git a/src/plugins/intel_gpu/tests/functional/shared_tests_instances/skip_tests_config.cpp b/src/plugins/intel_gpu/tests/functional/shared_tests_instances/skip_tests_config.cpp index 1978e4de49a..89843c8cf09 100644 --- a/src/plugins/intel_gpu/tests/functional/shared_tests_instances/skip_tests_config.cpp +++ b/src/plugins/intel_gpu/tests/functional/shared_tests_instances/skip_tests_config.cpp @@ -126,6 +126,14 @@ std::vector disabledTestPatterns() { R"(.*smoke_GroupDeconv_2D_Dynamic_.*FP32/GroupDeconvolutionLayerGPUTest.CompareWithRefs.*)", // Issue: 111440 R"(.*smoke_set1/GatherElementsGPUTest.CompareWithRefs.*)", + // New plugin API doesn't support changes of pre-processing + R"(.*(Auto|Multi).*InferRequestPreprocessTest.*SetPreProcessToInputInfo.*)", + R"(.*(Auto|Multi).*InferRequestPreprocessTest.*SetPreProcessToInferRequest.*)", + // New plugin work with tensors, so it means that blob in old API can have different pointers + R"(.*(Auto|Multi).*InferRequestIOBBlobTest.*secondCallGetInputDoNotReAllocateData.*)", + R"(.*(Auto|Multi).*InferRequestIOBBlobTest.*secondCallGetOutputDoNotReAllocateData.*)", + R"(.*(Auto|Multi).*InferRequestIOBBlobTest.*secondCallGetInputAfterInferSync.*)", + R"(.*(Auto|Multi).*InferRequestIOBBlobTest.*secondCallGetOutputAfterInferSync.*)", // For some strange reason (bug?) output format cannot have a rank greater than 4 for dynamic shape case, // because it crashes in some random places during "reorder_inputs" pass. R"(.*UniqueLayerDynamicGPUTest.*\(\d*\.\d*\.\d*\.\d*\.\d*\).*axis.*)", diff --git a/src/plugins/intel_gpu/tests/functional/subgraph_tests/dynamic/read_value_assign.cpp b/src/plugins/intel_gpu/tests/functional/subgraph_tests/dynamic/read_value_assign.cpp new file mode 100644 index 00000000000..7a885c8ec91 --- /dev/null +++ b/src/plugins/intel_gpu/tests/functional/subgraph_tests/dynamic/read_value_assign.cpp @@ -0,0 +1,93 @@ +// Copyright (C) 2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include + +#include "ngraph_functions/builders.hpp" +#include "ngraph_functions/utils/ngraph_helpers.hpp" +#include "shared_test_classes/base/layer_test_utils.hpp" +#include "shared_test_classes/base/ov_subgraph.hpp" + +using namespace ngraph; +using namespace ov::test; +using namespace InferenceEngine; + +namespace GPULayerTestsDefinitions { + +using ReadValueAssignParams = std::tuple< + InputShape, // input shapes + ElementType // input precision +>; + +class ReadValueAssignGPUTest : virtual public SubgraphBaseTest, public testing::WithParamInterface { +public: + static std::string getTestCaseName(const testing::TestParamInfo& obj) { + InputShape input_shapes; + ElementType input_precision; + std::tie(input_shapes, input_precision) = obj.param; + + std::ostringstream result; + result << "IS=" << CommonTestUtils::partialShape2str({input_shapes.first}) << "_"; + result << "TS="; + for (const auto& shape : input_shapes.second) { + result << CommonTestUtils::partialShape2str({shape}) << "_"; + } + result << "Precision=" << input_precision; + return result.str(); + } + +protected: + void SetUp() override { + InputShape input_shapes; + ElementType input_precision; + std::tie(input_shapes, input_precision) = GetParam(); + targetDevice = CommonTestUtils::DEVICE_GPU; + + init_input_shapes({input_shapes}); + + auto params = ngraph::builder::makeDynamicParams(input_precision, inputDynamicShapes); + const VariableInfo variable_info { inputDynamicShapes[0], input_precision, "v0" }; + auto variable = std::make_shared(variable_info); + auto read_value = std::make_shared(params.at(0), variable); + auto add = std::make_shared(read_value, params.at(0)); + auto assign = std::make_shared(add, variable); + auto res = std::make_shared(add); + function = std::make_shared(ResultVector { res }, SinkVector { assign }, params); + } + + void generate_inputs(const std::vector& targetInputStaticShapes) override { + inputs.clear(); + const auto& funcInputs = function->inputs(); + auto data_tensor = ov::Tensor{funcInputs[0].get_element_type(), targetInputStaticShapes[0]}; + auto data = data_tensor.data::value_type>(); + auto len = ov::shape_size(targetInputStaticShapes[0]); + for (size_t i = 0; i < len; i++) { + data[i] = static_cast(i); + } + inputs.insert({funcInputs[0].get_node_shared_ptr(), data_tensor}); + } +}; + +TEST_P(ReadValueAssignGPUTest, CompareWithRefs) { + SKIP_IF_CURRENT_TEST_IS_DISABLED() + run(); +} + +namespace { +const std::vector input_shapes_dyn = { + {{-1, -1, -1, -1}, {{7, 4, 20, 20}, {19, 4, 20, 20}}} +}; + +INSTANTIATE_TEST_SUITE_P(smoke_ReadValueAssign_Static, ReadValueAssignGPUTest, + ::testing::Combine(::testing::ValuesIn(static_shapes_to_test_representation({{7, 4, 20, 20}})), + ::testing::Values(ov::element::i32)), + ReadValueAssignGPUTest::getTestCaseName); + +INSTANTIATE_TEST_SUITE_P(smoke_ReadValueAssign_Dynamic, ReadValueAssignGPUTest, + ::testing::Combine(::testing::ValuesIn(input_shapes_dyn), + ::testing::Values(ov::element::i32)), + ReadValueAssignGPUTest::getTestCaseName); +} // namespace +} // namespace GPULayerTestsDefinitions diff --git a/src/plugins/intel_gpu/tests/unit/passes/kernels_cache_test.cpp b/src/plugins/intel_gpu/tests/unit/passes/kernels_cache_test.cpp index 2e63cc630c2..547b3ac5984 100644 --- a/src/plugins/intel_gpu/tests/unit/passes/kernels_cache_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/passes/kernels_cache_test.cpp @@ -60,7 +60,7 @@ TEST(kernels_cache, reuse_kernel_for_static_model_01) { eltwise("sum", {input_info("concat1"), input_info("concat2")}, eltwise_mode::sum), reorder("output", input_info("sum"), {{3, 2}, data_types::f16, format::bfyx})); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); auto prog = program::build_program(engine, topology, config, false, false); auto& cache = prog->get_kernels_cache(); diff --git a/src/plugins/intel_gpu/tests/unit/passes/prepare_buffer_fusing_test.cpp b/src/plugins/intel_gpu/tests/unit/passes/prepare_buffer_fusing_test.cpp index 6ffa6250ad4..0c86c29ef8a 100644 --- a/src/plugins/intel_gpu/tests/unit/passes/prepare_buffer_fusing_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/passes/prepare_buffer_fusing_test.cpp @@ -8,6 +8,7 @@ #include "intel_gpu/graph/program.hpp" #include "data_inst.h" +#include "crop_inst.h" #include "reshape_inst.h" #include "fully_connected_inst.h" #include "permute_inst.h" @@ -165,7 +166,7 @@ TEST(prepare_buffer_fusing, in_place_concat_static) { topology.add(concatenation("concat", { input_info("permute1"), input_info("permute2") }, 2)); topology.add(permute("output", input_info("concat"), {0, 2, 3, 1})); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::optimize_data(true)); auto prog = program::build_program(engine, topology, config, false, false); ASSERT_NE(prog, nullptr); @@ -218,7 +219,7 @@ TEST(prepare_buffer_fusing, in_place_concat_dynamic) { topology.add(concatenation("concat", { input_info("permute1"), input_info("permute2") }, 2)); topology.add(permute("output", input_info("concat"), {0, 2, 3, 1})); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::optimize_data(true)); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); auto prog = program::build_program(engine, topology, config, false, false); @@ -273,7 +274,7 @@ TEST(prepare_buffer_fusing, in_place_concat_dynamic__static_dim_dyn_pad) { topology.add(concatenation("concat", { input_info("permute1"), input_info("permute2") }, 2)); topology.add(permute("output", input_info("concat"), {0, 2, 3, 1})); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::optimize_data(true)); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); auto prog = program::build_program(engine, topology, config, false, false); @@ -311,3 +312,54 @@ TEST(prepare_buffer_fusing, in_place_concat_dynamic__static_dim_dyn_pad) { ASSERT_EQ(ref_output[x], output_ptr[x]); } } + +TEST(prepare_buffer_fusing, crop_b_axis) { + auto& engine = get_test_engine(); + + auto input1 = engine.allocate_memory({ data_types::f32, format::bfyx, tensor{ 3, 2, 2, 2 } }); + + set_values(input1, { + 1.f, 2.f, 3.f, 4.f, 1.f, 2.f, 3.f, 4.f, + 5.f, 6.f, 7.f, 8.f, 5.f, 6.f, 7.f, 11.f, + 9.f, 10.f, 11.f, 12.f, 9.f, 10.f, 11.f, 12.f + }); + + topology topology; + topology.add(input_layout("Input", input1->get_layout())); + topology.add(crop("crop", input_info("Input"), tensor{1, 2, 2, 2}, tensor(1, 0, 0, 0))); + topology.add(reorder("reorder", input_info("crop"), format::bfyx, data_types::i8)); + + ExecutionConfig config = get_test_default_config(engine); + config.set_property(ov::intel_gpu::optimize_data(true)); + network network(engine, topology, config); + + network.set_input_data("Input", input1); + + auto outputs = network.execute(); + + auto crop_prim = network.get_primitive("crop"); + ASSERT_EQ(crop_prim->can_be_optimized(), true); + + auto output = outputs.at("reorder").get_memory(); + cldnn::mem_lock output_ptr(output, get_test_stream()); + + std::vector expected_results = { + 5, 6, 7, 8, 5, 6, 7, 11 + }; + + int crop_batch_num = 1; + int crop_feature_num = 2; + int crop_y_size = 2; + int crop_x_size = 2; + for (int b = 0; b < crop_batch_num; ++b) { + for (int f = 0; f < crop_feature_num; ++f) { + for (int y = 0; y < crop_y_size; ++y) { + for (int x = 0; x < crop_x_size; ++x) { + int linear_id = x + 2 * (y + 2 * f); + int output_linear_id = x + crop_x_size * (y + crop_y_size * (f + crop_feature_num * b)); + ASSERT_EQ(output_ptr[output_linear_id], expected_results[linear_id]); + } + } + } + } +} diff --git a/src/plugins/intel_gpu/tests/unit/shape_infer/assign_si_test.cpp b/src/plugins/intel_gpu/tests/unit/shape_infer/assign_si_test.cpp new file mode 100644 index 00000000000..ddec1060e2a --- /dev/null +++ b/src/plugins/intel_gpu/tests/unit/shape_infer/assign_si_test.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "test_utils.h" + +#include +#include + +#include "assign_inst.h" + +#include "program_wrapper.h" + +#include +#include + +using namespace cldnn; +using namespace ::tests; + +namespace shape_infer_tests { + +struct assign_test_params { + layout input_layout; + std::string variable_id; + layout expected_layout; +}; + +class assign_test : public testing::TestWithParam { }; + +TEST_P(assign_test, shape_infer) { + auto p = GetParam(); + + auto& engine = get_test_engine(); + + const auto variable_layout = p.input_layout; + + auto input_layout_prim = std::make_shared("input", p.input_layout); + auto inputs = std::vector{ input_info("input") }; + auto assign_prim = std::make_shared("assign", inputs, p.variable_id, variable_layout); + + cldnn::program prog(engine); + + auto& input_layout_node = prog.get_or_create(input_layout_prim); + auto& assign_node = prog.get_or_create(assign_prim); + program_wrapper::add_connection(prog, input_layout_node, assign_node); + + auto res = assign_inst::calc_output_layouts(assign_node, *assign_node.get_kernel_impl_params()); + ASSERT_EQ(res.size(), 1); + ASSERT_EQ(res[0], p.expected_layout); +} + +INSTANTIATE_TEST_SUITE_P(smoke, assign_test, + testing::ValuesIn(std::vector{ + { + layout{ov::PartialShape{1, 2, 3}, data_types::f32, format::bfyx}, + "v0", + layout{ov::PartialShape{1, 2, 3}, data_types::f32, format::bfyx} + }, + { + layout{ov::PartialShape::dynamic(4), data_types::f32, format::bfyx}, + "v0", + layout{ov::PartialShape::dynamic(4), data_types::f32, format::bfyx} + } + })); + + +} // shape_infer_tests diff --git a/src/plugins/intel_gpu/tests/unit/shape_infer/gather_si_test.cpp b/src/plugins/intel_gpu/tests/unit/shape_infer/gather_si_test.cpp index 26ac1a60015..aedcfb9d4dc 100644 --- a/src/plugins/intel_gpu/tests/unit/shape_infer/gather_si_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/shape_infer/gather_si_test.cpp @@ -61,4 +61,13 @@ INSTANTIATE_TEST_SUITE_P(smoke, gather_test, }, })); +INSTANTIATE_TEST_SUITE_P(optimized, gather_test, + testing::ValuesIn(std::vector{ + { + layout{ov::PartialShape{3, 4, 2, 2}, data_types::f32, format::bfyx}, layout{ov::PartialShape{1}, data_types::f32, format::bfyx}, + 0, 0, + layout{ov::PartialShape{1, 4, 2, 2}, data_types::f32, format::bfyx} + }, + })); + } // shape_infer_tests diff --git a/src/plugins/intel_gpu/tests/unit/shape_infer/read_value_si_test.cpp b/src/plugins/intel_gpu/tests/unit/shape_infer/read_value_si_test.cpp new file mode 100644 index 00000000000..194bc0244f8 --- /dev/null +++ b/src/plugins/intel_gpu/tests/unit/shape_infer/read_value_si_test.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "test_utils.h" + +#include +#include + +#include "read_value_inst.h" + +#include "program_wrapper.h" + +#include +#include + +using namespace cldnn; +using namespace ::tests; + +namespace shape_infer_tests { + +struct read_value_test_params { + layout input_layout; + std::string variable_id; + layout expected_layout; +}; + +class read_value_test : public testing::TestWithParam { }; + +TEST_P(read_value_test, shape_infer) { + auto p = GetParam(); + + auto& engine = get_test_engine(); + + const auto variable_layout = p.input_layout; + + auto input_layout_prim = std::make_shared("input", p.input_layout); + auto inputs = std::vector{ input_info("input") }; + auto read_value_prim = std::make_shared("read_value", inputs, p.variable_id, variable_layout); + + cldnn::program prog(engine); + + auto& input_layout_node = prog.get_or_create(input_layout_prim); + auto& read_value_node = prog.get_or_create(read_value_prim); + program_wrapper::add_connection(prog, input_layout_node, read_value_node); + + auto res = read_value_inst::calc_output_layouts(read_value_node, *read_value_node.get_kernel_impl_params()); + ASSERT_EQ(res.size(), 1); + ASSERT_EQ(res[0], p.expected_layout); +} + +INSTANTIATE_TEST_SUITE_P(smoke, read_value_test, + testing::ValuesIn(std::vector{ + { + layout{ov::PartialShape{1, 2, 3}, data_types::f32, format::bfyx}, + "v0", + layout{ov::PartialShape{1, 2, 3}, data_types::f32, format::bfyx} + }, + { + layout{ov::PartialShape::dynamic(4), data_types::f32, format::bfyx}, + "v0", + layout{ov::PartialShape::dynamic(4), data_types::f32, format::bfyx} + } + })); + + +} // shape_infer_tests diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/arg_max_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/arg_max_gpu_test.cpp index 1bf43241c15..0b5d5db256b 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/arg_max_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/arg_max_gpu_test.cpp @@ -898,7 +898,7 @@ TEST(arg_max_min_gpu, dynamic) { set_values(input, input_vec); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); network network(engine, topology, config); network.set_input_data("input", input); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp index 91ea17c4a66..93ad9cfc18c 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp @@ -110,7 +110,7 @@ void start_concat_test_dynamic(impl_types impl_type) { padding{ { 0,0,0,0 }, 0 }) ); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::optimize_data(true)); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); if (impl_type != impl_types::any) { diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp index 2fe73506993..bbafada74a4 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp @@ -1576,3 +1576,54 @@ TEST(crop_gpu, optimized_out_crop) { ASSERT_TRUE(all_primitives["crop1"] == "_optimized_"); ASSERT_TRUE(all_primitives["crop2"] == "_optimized_"); } + +TEST(crop_single_axis, simple_Baxis) { + auto& engine = get_test_engine(); + + auto input1 = engine.allocate_memory({ data_types::f32, format::bfyx, tensor{ 3, 2, 1, 2 } }); + + set_values(input1, { + 1.f, 2.f, 3.f, 4.f, + 5.f, 6.f, 7.f, 8.f, + 9.f, 10.f, 11.f, 12.f + }); + + topology topology; + topology.add(input_layout("Input", input1->get_layout())); + topology.add(crop("crop", input_info("Input"), tensor{1, 2, 1, 2}, tensor(1, 0, 0, 0))); + topology.add(reorder("reorder", input_info("crop"), format::bfyx, data_types::i8)); + + ExecutionConfig config = get_test_default_config(engine); + config.set_property(ov::intel_gpu::optimize_data(true)); + network network(engine, topology, config); + + network.set_input_data("Input", input1); + + + auto outputs = network.execute(); + auto output = outputs.at("reorder").get_memory(); + cldnn::mem_lock output_ptr(output, get_test_stream()); + + std::vector expected_results = { + 5, 6, 7, 8 + }; + + int crop_batch_num = 1; + int crop_feature_num = 2; + int crop_y_size = 2; + int crop_x_size = 1; + for (int b = 0; b < crop_batch_num; ++b) { + for (int f = 0; f < crop_feature_num; ++f) { + for (int y = 0; y < crop_y_size; ++y) { + for (int x = 0; x < crop_x_size; ++x) { + int linear_id = x + y + 2 * f; + int output_linear_id = x + crop_x_size * (y + crop_y_size * (f + crop_feature_num * b)); + ASSERT_EQ(output_ptr[output_linear_id], expected_results[linear_id]); + } + } + } + } + + auto crop_prim = network.get_primitive("crop"); + ASSERT_EQ(crop_prim->can_be_optimized(), true); +} diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/deconvolution_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/deconvolution_gpu_test.cpp index 1f47df76231..16a07f20cac 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/deconvolution_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/deconvolution_gpu_test.cpp @@ -303,7 +303,7 @@ TYPED_TEST(deconvolution_basic, no_bias_basic_wsiz2x2_in2x2x1x1_nopad_exclude_fu reorder("plane_output", input_info("elt_scale"), format::bfyx, data_types::f32) ); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); config.set_property(ov::intel_gpu::optimize_data(true)); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/eltwise_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/eltwise_gpu_test.cpp index 3a2edaabeaf..84f43d5eabc 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/eltwise_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/eltwise_gpu_test.cpp @@ -1382,7 +1382,7 @@ TEST(eltwise_gpu_f32, dynamic_kernel_broadcast_mixed_ranks_3d_2d) { set_values(input2, { 0.5f, -0.5f, 1.0f, -1.0f, 2.f }); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); network network(engine, topology, config); network.set_input_data("input1", input1); @@ -1441,7 +1441,7 @@ TEST(eltwise_gpu_f32, dynamic_kernel_broadcast_mixed_ranks_5d_2d) { set_values(input2, { 0.5f, -0.5f, 1.0f, -1.0f, 2.f }); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); network network(engine, topology, config); network.set_input_data("input1", input1); @@ -1500,7 +1500,7 @@ TEST(eltwise_cpu_impl_f32, dynamic_kernel_broadcast_mixed_ranks_5d_2d) { set_values(input2, { 0.5f, -0.5f, 1.0f, -1.0f, 2.f }); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); config.set_property(ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{{"eltwise", {format::bfzyx, "", impl_types::cpu}}})); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/fully_connected_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/fully_connected_gpu_test.cpp index 9d0ffa548be..f9729429166 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/fully_connected_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/fully_connected_gpu_test.cpp @@ -2537,7 +2537,7 @@ public: fc_prim.output_data_types = {type_to_data_type::value}; topo.add(fc_prim); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::optimize_data(true)); network net(engine, topo, config); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/gather_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/gather_gpu_test.cpp index 57d3e982be9..c2c3f839395 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/gather_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/gather_gpu_test.cpp @@ -2097,3 +2097,64 @@ TEST(gather_gpu_u8, 322_axisF) { TEST(gather_gpu_u8, export_import) { test_gather_gpu_u8_322_axisF(true); } + +TEST(gather_single_axis, simple_Baxis) { + auto& engine = get_test_engine(); + + auto input1 = engine.allocate_memory({ data_types::f32, format::bfyx, tensor{ 3, 2, 1, 2 } }); // Dictionary + auto input2 = engine.allocate_memory({ data_types::i32, format::bfyx, tensor{ 1 } }); // Indexes + int64_t axis = 0; + + set_values(input1, { + 1.f, 2.f, 3.f, 4.f, + 5.f, 6.f, 7.f, 8.f, + 9.f, 10.f, 11.f, 12.f + }); + + set_values(input2, { + 1 + }); + + topology topology; + topology.add(input_layout("InputDictionary", input1->get_layout())); + topology.add(input_layout("InputText", input2->get_layout())); + topology.add( + gather("gather", input_info("InputDictionary"), input_info("InputText"), axis, ov::Shape{1, 2, 2, 1}) + ); + topology.add(reorder("reorder", input_info("gather"), format::bfyx, data_types::i8)); + + ExecutionConfig config = get_test_default_config(engine); + config.set_property(ov::intel_gpu::optimize_data(true)); + network network(engine, topology, config); + + network.set_input_data("InputDictionary", input1); + network.set_input_data("InputText", input2); + + auto outputs = network.execute(); + + auto output = outputs.at("reorder").get_memory(); + cldnn::mem_lock output_ptr(output, get_test_stream()); + + std::vector expected_results = { + 5, 6, 7, 8 + }; + + int crop_batch_num = 1; + int crop_feature_num = 2; + int crop_y_size = 2; + int crop_x_size = 1; + for (int b = 0; b < crop_batch_num; ++b) { + for (int f = 0; f < crop_feature_num; ++f) { + for (int y = 0; y < crop_y_size; ++y) { + for (int x = 0; x < crop_x_size; ++x) { + int linear_id = x + y + 2 * f; + int output_linear_id = x + crop_x_size * (y + crop_y_size * (f + crop_feature_num * b)); + ASSERT_EQ(output_ptr[output_linear_id], expected_results[linear_id]); + } + } + } + } + + auto crop_prim = network.get_primitive("gather"); + ASSERT_EQ(crop_prim->can_be_optimized(), false); +} diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp index 36be845cf27..62dfeadb502 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp @@ -1042,7 +1042,7 @@ struct gemm_base_test_params { #define CASE_GEMM_FP32_COMBO_ONEDNN_4 61, 1, 99, 1, 1, 2, 2, 2, 2, 2, 2, true, true, \ 1.0f, 1.0f, data_types::f32, data_types::f32, data_types::f32, data_types::f32, { -128, 127, 1 }, { -128, 127, 1 }, { -10, 10, 8 } -#else // ENABLE_ONEDNN_FOR_GPU +#endif // ENABLE_ONEDNN_FOR_GPU #define CASE_GEMM_INT8_NN_TRANSPOSITION 64, 64, 64, 1, 2, 1, 2, 1, 2, 1, 2, false, false, \ 1.5f, 2.0f, data_types::i8, data_types::u8, data_types::f32, data_types::f32, { -128, 127, 1 }, { 0, 255, 1 }, { -10, 10, 8 } @@ -1195,11 +1195,12 @@ struct gemm_base_test_params { #define CASE_GEMM_FP16_TILED_NN_BROADCAST_4 8, 8, 8, 1, 1, 2, 2, 2, 2, 2, 2, false, false, \ 1.0f, 4.0f, data_types::f16, data_types::f16, data_types::f16, data_types::f16, { -1, 1, 1 }, { -1, 1, 1 }, { -1, 1, 1 } -#endif // ENABLE_ONEDNN_FOR_GPU - template class GemmBaseTest : public ::testing::TestWithParam { public: + virtual ov::intel_gpu::ImplementationDesc getImplementationDesc(gemm_params& p) { + return { format::bfyx, p.kernel_name }; + } inline size_t getGemmIndex(size_t x, size_t y, size_t f, size_t b, size_t x_size, size_t y_size, size_t f_num, size_t b_num, size_t x_pitch, size_t y_pitch, size_t f_pitch, size_t b_pitch) { @@ -1207,9 +1208,6 @@ public: } void execute(gemm_params& p, bool is_caching_test = false) { - auto& engine = get_test_engine(); - if (!engine.get_device_info().supports_immad) - return; auto y0_size = p.m_size; auto y0_pitch = p.k_size; auto x0_size = p.k_size; @@ -1252,6 +1250,7 @@ public: x1_pitch = 1; } + auto& engine = get_test_engine(); auto input0_size = tensor((int)p.b0_num, (int)p.f0_num, (int)x0_size, (int)y0_size); VVVVF input0_data = generate_random_4d(p.b0_num, p.f0_num, x0_size, y0_size, p.range0[0], p.range0[1], p.range0[2]); auto input0_data_bfyx = flatten_4d(format::bfyx, input0_data); @@ -1309,11 +1308,7 @@ public: } topology.add(reorder("reorder_bfyx", input_info("gemm_bfyx"), format::bfyx, data_types::f32)); -#ifdef ENABLE_ONEDNN_FOR_GPU - ov::intel_gpu::ImplementationDesc gemm_impl = { format::bfyx, "", impl_types::onednn }; -#else - ov::intel_gpu::ImplementationDesc gemm_impl = { format::bfyx, p.kernel_name }; -#endif + ov::intel_gpu::ImplementationDesc gemm_impl = getImplementationDesc(p); ExecutionConfig cfg = get_test_default_config(engine); cfg.set_property(ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{ {"gemm_bfyx", gemm_impl} })); @@ -1554,7 +1549,22 @@ TEST(gemm_onednn, impl_replacement_with_cldnn) { ASSERT_FALSE(impl->is_dynamic()); } -class gemm_int8_simple_tests_onednn : public ::GemmBaseTest {}; +template +class GemmBaseOneDNNTest : public ::GemmBaseTest { +public: + virtual ov::intel_gpu::ImplementationDesc getImplementationDesc(gemm_params& p) { + return { format::bfyx, "", impl_types::onednn }; + } + + void execute(gemm_params& p, bool is_caching_test = false) { + auto& engine = get_test_engine(); + if (!engine.get_device_info().supports_immad) + return; + GemmBaseTest::execute(p, is_caching_test); + } +}; + +class gemm_int8_simple_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_int8_simple_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_simple_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1564,7 +1574,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_simple_tests_onednn, ::testing::Val gemm_base_test_params{ CASE_GEMM_INT8_ONEDNN_4, "" }, })); -class gemm_uint8_simple_tests_onednn : public ::GemmBaseTest {}; +class gemm_uint8_simple_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_uint8_simple_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_uint8_simple_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1574,7 +1584,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_uint8_simple_tests_onednn, ::testing::Va gemm_base_test_params{ CASE_GEMM_UINT8_ONEDNN_4, "" }, })); -class gemm_fp16_simple_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp16_simple_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp16_simple_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_simple_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1584,7 +1594,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_simple_tests_onednn, ::testing::Val gemm_base_test_params{ CASE_GEMM_FP16_ONEDNN_4, "" }, })); -class gemm_fp32_simple_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp32_simple_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp32_simple_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_simple_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1594,7 +1604,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_simple_tests_onednn, ::testing::Val gemm_base_test_params{ CASE_GEMM_FP32_ONEDNN_4, "" }, })); -class gemm_int8_transposition_tests_onednn : public ::GemmBaseTest {}; +class gemm_int8_transposition_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_int8_transposition_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_transposition_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1609,7 +1619,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_transposition_tests_onednn, ::testi gemm_base_test_params{ CASE_GEMM_INT8_TT_TRANSPOSITION_LEFTOVERS_ONEDNN, "" }, })); -class gemm_uint8_transposition_tests_onednn : public ::GemmBaseTest {}; +class gemm_uint8_transposition_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_uint8_transposition_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_uint8_transposition_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1624,7 +1634,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_uint8_transposition_tests_onednn, ::test gemm_base_test_params{ CASE_GEMM_UINT8_TT_TRANSPOSITION_LEFTOVERS_ONEDNN, "" }, })); -class gemm_fp16_transposition_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp16_transposition_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp16_transposition_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_transposition_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1634,7 +1644,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_transposition_tests_onednn, ::testi gemm_base_test_params{ CASE_GEMM_FP16_TT_TRANSPOSITION_ONEDNN, "" }, })); -class gemm_fp32_transposition_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp32_transposition_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp32_transposition_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_transposition_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1644,7 +1654,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_transposition_tests_onednn, ::testi gemm_base_test_params{ CASE_GEMM_FP32_TT_TRANSPOSITION_ONEDNN, "" }, })); -class gemm_int8_broadcasting_tests_onednn : public ::GemmBaseTest {}; +class gemm_int8_broadcasting_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_int8_broadcasting_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_broadcasting_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1654,7 +1664,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_broadcasting_tests_onednn, ::testin gemm_base_test_params{ CASE_GEMM_INT8_BROADCASTING_ONEDNN_4, "" }, })); -class gemm_fp16_broadcasting_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp16_broadcasting_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp16_broadcasting_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_broadcasting_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1664,7 +1674,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_broadcasting_tests_onednn, ::testin gemm_base_test_params{ CASE_GEMM_FP16_BROADCASTING_ONEDNN_4, "" }, })); -class gemm_fp32_broadcasting_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp32_broadcasting_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp32_broadcasting_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_broadcasting_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1674,7 +1684,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_broadcasting_tests_onednn, ::testin gemm_base_test_params{ CASE_GEMM_FP32_BROADCASTING_ONEDNN_4, "" }, })); -class gemm_int8_combo_tests_onednn : public ::GemmBaseTest {}; +class gemm_int8_combo_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_int8_combo_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_combo_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1684,7 +1694,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_int8_combo_tests_onednn, ::testing::Valu gemm_base_test_params{ CASE_GEMM_INT8_COMBO_ONEDNN_4, "" }, })); -class gemm_uint8_combo_tests_onednn : public ::GemmBaseTest {}; +class gemm_uint8_combo_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_uint8_combo_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_uint8_combo_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1694,7 +1704,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_uint8_combo_tests_onednn, ::testing::Val gemm_base_test_params{ CASE_GEMM_UINT8_COMBO_ONEDNN_4, "" }, })); -class gemm_fp16_combo_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp16_combo_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp16_combo_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_combo_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1704,7 +1714,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_combo_tests_onednn, ::testing::Valu gemm_base_test_params{ CASE_GEMM_FP16_COMBO_ONEDNN_4, "" }, })); -class gemm_fp32_combo_tests_onednn : public ::GemmBaseTest {}; +class gemm_fp32_combo_tests_onednn : public ::GemmBaseOneDNNTest {}; TEST_P(gemm_fp32_combo_tests_onednn, basic) { auto p = GetParam(); execute(p); } INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_combo_tests_onednn, ::testing::ValuesIn(std::vector { @@ -1714,7 +1724,7 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp32_combo_tests_onednn, ::testing::Valu gemm_base_test_params{ CASE_GEMM_FP32_COMBO_ONEDNN_4, "" }, })); -#else // ENABLE_ONEDNN_FOR_GPU +#endif // ENABLE_ONEDNN_FOR_GPU class gemm_int8_transposition_tests : public ::GemmBaseTest {}; TEST_P(gemm_int8_transposition_tests, basic) { auto p = GetParam(); execute(p); } @@ -1874,8 +1884,6 @@ INSTANTIATE_TEST_SUITE_P(gemm_gpu, gemm_fp16_tiled_nn_broadcast_tests, ::testing gemm_base_test_params{ CASE_GEMM_FP16_TILED_NN_BROADCAST_4, "gemm_tiled_opt" }, })); -#endif // ENABLE_ONEDNN_FOR_GPU - #ifdef RUN_ALL_MODEL_CACHING_TESTS TEST_P(GemmGPUTest, basic_cached) { ASSERT_NO_FATAL_FAILURE(test(true)); @@ -1901,7 +1909,8 @@ TEST_P(gemm_int8_combo_tests_onednn, basic_cached) { auto p = GetParam(); execut TEST_P(gemm_uint8_combo_tests_onednn, basic_cached) { auto p = GetParam(); execute(p, true); } TEST_P(gemm_fp16_combo_tests_onednn, basic_cached) { auto p = GetParam(); execute(p, true); } TEST_P(gemm_fp32_combo_tests_onednn, basic_cached) { auto p = GetParam(); execute(p, true); } -#else +#endif // ENABLE_ONEDNN_FOR_GPU + TEST_P(gemm_int8_transposition_tests, basic_cached) { auto p = GetParam(); execute(p, true); } TEST_P(gemm_int8_broadcast_tests, basic_cached) { auto p = GetParam(); execute(p, true); } TEST_P(gemm_int8_leftovers_tests, basic_cached) { auto p = GetParam(); execute(p, true); } @@ -1917,7 +1926,7 @@ TEST_P(gemm_fp16_tiled_nt_tests, basic_cached) { auto p = GetParam(); execute(p, TEST_P(gemm_fp16_tiled_tn_tests, basic_cached) { auto p = GetParam(); execute(p, true); } TEST_P(gemm_fp16_tiled_tt_tests, basic_cached) { auto p = GetParam(); execute(p, true); } TEST_P(gemm_fp16_tiled_nn_broadcast_tests, basic_cached) { auto p = GetParam(); execute(p); } -#endif // ENABLE_ONEDNN_FOR_GPU + #endif // RUN_ALL_MODEL_CACHING_TESTS TEST(gemm_gpu, basic_bfyx_t2_inplace_crop_with_pad_cached) { test_basic_bfyx_t2_inplace_crop_with_pad(true); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/scatter_nd_update_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/scatter_nd_update_gpu_test.cpp index c7cee584112..8cc9f3c471e 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/scatter_nd_update_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/scatter_nd_update_gpu_test.cpp @@ -4474,7 +4474,7 @@ TEST(scatter_nd_update_gpu, dynamic_5d) { topology.add(input_layout("updates", input3_layout)); topology.add(scatter_nd_update("scatter_nd_update", input_info("data"), input_info("indices"), input_info("updates"), 5)); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); network network(engine, topology, config); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/strided_slice_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/strided_slice_gpu_test.cpp index 2e32544548f..065e3e9e781 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/strided_slice_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/strided_slice_gpu_test.cpp @@ -710,7 +710,7 @@ public: topology.add(data("input4", strides)); topology.add(strided_slice("strided_slice", input_info("input"), input_info("input2"), input_info("input3"), input_info("input4"), {}, {}, {}, {}, {}, {})); - ExecutionConfig config; + ExecutionConfig config = get_test_default_config(engine); config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); if (impl_type != impl_types::any) config.set_property(ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{ {"strided_slice", {format::bfyx, "", impl_types::cpu}} })); diff --git a/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp b/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp index aa7751521fc..3878af278fa 100644 --- a/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp +++ b/src/tests/functional/plugin/shared/src/single_layer_tests/op_impl_check/single_op_graph.cpp @@ -971,6 +971,16 @@ std::shared_ptr generate(const std::shared_ptr(results, params, "ScatterElementsUpdateGraph"); } +std::shared_ptr generate(const std::shared_ptr &node) { + const auto params = ngraph::builder::makeDynamicParams(ov::element::f32, {{2, 2}, {2, 2}}); + const auto indices = ngraph::builder::makeConstant(ov::element::i64, {2, 2}, {1, 1, 0, 0}); + const auto axis = ngraph::builder::makeConstant(ov::element::i64, {1}, {0}); + auto Node = std::make_shared( + params.at(0), indices, params.at(1), axis, ov::op::v12::ScatterElementsUpdate::Reduction::SUM); + ov::ResultVector results{std::make_shared(Node)}; + return std::make_shared(results, params, "ScatterElementsUpdateGraph"); +} + std::shared_ptr generate(const std::shared_ptr &node) { const auto params = ngraph::builder::makeDynamicParams({ov::element::boolean, ov::element::f32, ov::element::f32}, {{2, 2, 2}, {2, 2, 2}, {2, 2, 2}}); diff --git a/src/tests/functional/shared_test_classes/include/shared_test_classes/base/utils/ranges.hpp b/src/tests/functional/shared_test_classes/include/shared_test_classes/base/utils/ranges.hpp index 312980af3b1..8245b72fd08 100644 --- a/src/tests/functional/shared_test_classes/include/shared_test_classes/base/utils/ranges.hpp +++ b/src/tests/functional/shared_test_classes/include/shared_test_classes/base/utils/ranges.hpp @@ -20,6 +20,9 @@ #include "ngraph/op/max.hpp" #include "ngraph/op/min.hpp" +#include +#include + namespace ov { namespace test { namespace utils { diff --git a/src/tests/functional/shared_test_classes/src/base/utils/generate_inputs.cpp b/src/tests/functional/shared_test_classes/src/base/utils/generate_inputs.cpp index c5db6e6fa86..ad05a21f01d 100644 --- a/src/tests/functional/shared_test_classes/src/base/utils/generate_inputs.cpp +++ b/src/tests/functional/shared_test_classes/src/base/utils/generate_inputs.cpp @@ -19,16 +19,39 @@ namespace test { namespace utils { namespace { + +/** + * Sets proper range and resolution for real numbers generation + * + * range = 8 and resolution 32 + * + * The worst case scenario is 7 + 31/32 (7.96875) + * IEEE 754 representation is: + * ---------------------------------------------- + * sign | exponent | mantissa + * ---------------------------------------------- + * FP32 0 | 10000001 | 11111110000000000000000 + * FP16 0 | 10001 | 1111111000 + * BF16 0 | 10000001 | 1111111 + * ---------------------------------------------- + * + * All the generated numbers completely fit into the data type without truncation + */ +static inline void set_real_number_generation_data(InputGenerateData& inGenData) { + inGenData.range = 8; + inGenData.resolution = 32; +} + ov::runtime::Tensor generate(const std::shared_ptr& node, size_t port, const ov::element::Type& elemType, const ov::Shape& targetShape) { - size_t inNodeCnt = node->get_input_size(); InputGenerateData inGenData; if (elemType.is_real()) { - inGenData.range = 10; - inGenData.resolution = 256; + set_real_number_generation_data(inGenData); } + + const size_t inNodeCnt = node->get_input_size(); auto it = inputRanges.find(node->get_type_info()); if (it != inputRanges.end()) { const auto& ranges = it->second; diff --git a/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/summarize.py b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/summarize.py index 67bcee34061..3776e27e05e 100644 --- a/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/summarize.py +++ b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/summarize.py @@ -4,6 +4,7 @@ import argparse import os import csv +from pathlib import Path import defusedxml.ElementTree as ET from defusedxml import defuse_stdlib @@ -44,6 +45,7 @@ def parse_arguments(): csv_help = "Allow to serialize report as csv file" expected_devices_help = "List of expected devices" rel_weights_help = "Path to dir/file with rel weights" + report_type_help = "Report type: OP or API" parser.add_argument("--xml", help=xml_help, nargs="*", required=True) parser.add_argument("--out", help=out_help, default="") @@ -54,6 +56,7 @@ def parse_arguments(): parser.add_argument("--csv", help=csv_help, default=False) parser.add_argument("--expected_devices", help=expected_devices_help, nargs="*", required=False) parser.add_argument("--rel_weights", help=rel_weights_help, type=str, required=False) + parser.add_argument("-t", "--report_type", help=report_type_help, default="OP") return parser.parse_args() @@ -330,15 +333,96 @@ def create_summary(summary_root: Element, output_folder: os.path, expected_devic if is_serialize_to_csv: serialize_to_csv(output_filename, output_folder, op_list, device_list, results) +def create_api_summary(xml_paths: list, output_folder: str, expected_devices:list, report_tag: str, report_version: str, + output_filename='report'): + timestamp = None + + api_info = {} + sw_plugins = set() + api_devices = set(expected_devices) if expected_devices else set() + + logger.info("Statistic collecting is started") + for xml_path in xml_paths: + if not Path(xml_path).exists(): + logger.error(f'File is not exists: {xml_path}') + continue + try: + xml_root = ET.parse(xml_path).getroot() + if timestamp is None or timestamp < xml_root.attrib["timestamp"]: + timestamp = xml_root.attrib["timestamp"] + + for device in xml_root.findall("results/*"): + if expected_devices and device.tag not in expected_devices: + continue + + api_devices.add(device.tag) + for test_type in xml_root.findall(f"results/{device.tag}/*"): + api_info.setdefault(test_type.tag, {}) + for sw_plugin in xml_root.findall(f"results/{device.tag}/{test_type.tag}/*"): + sw_plugin_name = 'HW_PLUGIN' if str(sw_plugin.tag).upper() == str(device.tag).upper() else sw_plugin.tag + sw_plugins.add(sw_plugin_name) + api_info[test_type.tag].setdefault(sw_plugin_name, {device.tag: {}}) + api_info[test_type.tag][sw_plugin_name][device.tag] = {'passrate': float(sw_plugin.get('passrate', 0)), + 'relative_passrate': float(sw_plugin.get('relative_passrate', 0)), + 'relative_all': float(sw_plugin.get('relative_all', 0)), + 'relative_passed': float(sw_plugin.get('relative_passed', 0)), + 'passed': int(sw_plugin.get('passed', 0)), + 'failed': int(sw_plugin.get('failed', 0)), + 'crashed': int(sw_plugin.get('crashed', 0)), + 'skipped': int(sw_plugin.get('skipped', 0)), + 'hanged': int(sw_plugin.get('hanged', 0)), + 'test_amout': int(sw_plugin.get('passed', 0)) +\ + int(sw_plugin.get('failed', 0)) +\ + int(sw_plugin.get('passed', 0)) +\ + int(sw_plugin.get('crashed', 0)) +\ + int(sw_plugin.get('hanged', 0))} + + except ET.ParseError: + logger.error(f'Error parsing {xml_path}') + logger.info("Statistic collecting is completed") + + sw_plugins = list(sw_plugins) + sw_plugins.sort() + if 'HW_PLUGIN' in sw_plugins: + sw_plugins.remove('HW_PLUGIN') + sw_plugins.insert(0, 'HW_PLUGIN') + + logger.info("File with report creating is started") + script_dir = Path(__file__).parent.absolute() + file_loader = FileSystemLoader(script_dir.joinpath('template').as_posix()) + env = Environment(loader=file_loader) + template = env.get_template('report_api_template.html') + + res_summary = template.render(devices=api_devices, + api_info=api_info, + sw_plugins=sw_plugins, + timestamp=timestamp, + report_tag=report_tag, + report_version=report_version) + + report_path = Path() + if output_folder and Path(output_folder).is_dir(): + report_path = Path(output_folder) + + report_path = report_path.joinpath(f'{output_filename}.html') + + with open(report_path.as_posix(), "w") as f: + logger.info(f'Final report is saved to {report_path}') + f.write(res_summary) + if __name__ == "__main__": args = parse_arguments() - summary_root = merge_xmls(args.xml) - create_summary(summary_root, args.out, - [] if args.expected_devices is None else args.expected_devices, - args.report_tag, - args.report_version, - args.conformance_mode, - args.csv, - args.rel_weights, - args.output_filename) - + if args.report_type == 'OP': + summary_root = merge_xmls(args.xml) + create_summary(summary_root, args.out, + [] if args.expected_devices is None else args.expected_devices, + args.report_tag, + args.report_version, + args.conformance_mode, + args.csv, + args.rel_weights, + args.output_filename) + else: + create_api_summary(args.xml, args.out, args.expected_devices, + args.report_tag, args.report_version, args.output_filename) + diff --git a/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/filters_api.js b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/filters_api.js new file mode 100644 index 00000000000..07ba6320404 --- /dev/null +++ b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/filters_api.js @@ -0,0 +1,188 @@ +FILTERS = { + TEST_TYPE: "_test_type_", + DEVICE: "_DEVICE_" +} + +DATA_ATTRIBUTES = { + FILTER: "data-filter", + SW_PLUGIN: 'data-sw_plugin', + DEVICE: 'data-device', + PASSED: 'data-passed_tests', + FAILED: 'data-failed', + SKIPPED: 'data-skipped', + CRASHED: 'data-crashed', + HANGED: 'data-hanged', + TESTS_AMOUNT: 'data-all_tests', + PASSRATE: 'data-passrate', + REL_PASSED: 'data-rel_passed_tests', + REL_TESTS_AMOUNT: 'data-rel_all_tests', + REL_PASSRATE: 'data-relative_passrate' +} + +SCOPE_TYPE = { + MANDATORY: 'Mandatory', + OPTIONAL: 'Optional' +} + +allDevices = [] +swPlugins = [] + +$(document).ready(function () { + $("#devices").chosen({max_selected_options: 6}); + Array.from($("#devices")[0].options).map((element) => allDevices.push(element.value)) + + $("#report #statistic td").filter(function () { + sw_plugin = $(this).attr(DATA_ATTRIBUTES.SW_PLUGIN) + if (sw_plugin && !swPlugins.includes(sw_plugin)) { + swPlugins.push(sw_plugin) + } + }); + + update_statistic(); +}); + +function apply_filters_on_report_table() { + $("#report td").filter(function () { + let data_filter = $(this).attr(DATA_ATTRIBUTES.FILTER) + + if (data_filter && data_filter.length > 0) { + $(this).hide(); + } else { + $(this).show() + } + }); + + update_statistic() +} + +function get_background_color(float_passrate) { + background_color = "hsl(" + Math.floor(float_passrate) +", 80%, 60%)" + return background_color +} + +function update_statistic() { + for (device of allDevices) { + for (sw_plugin of swPlugins) { + let passed = 0 + let amount = 0 + let scope = $('#scope_toggle').text() + + $("#report #data td:not(:hidden)").filter(function () { + if ($(this).attr(DATA_ATTRIBUTES.DEVICE) === device && $(this).attr(DATA_ATTRIBUTES.SW_PLUGIN) === sw_plugin) { + if ($(this).attr(DATA_ATTRIBUTES.PASSED) && $(this).attr(DATA_ATTRIBUTES.TESTS_AMOUNT) && + $(this).attr(DATA_ATTRIBUTES.REL_PASSED) && $(this).attr(DATA_ATTRIBUTES.REL_TESTS_AMOUNT)) { + if (scope == SCOPE_TYPE.MANDATORY) { + passed += parseInt($(this).attr(DATA_ATTRIBUTES.PASSED)) + amount += parseInt($(this).attr(DATA_ATTRIBUTES.TESTS_AMOUNT)) + } else { + passed += parseInt($(this).attr(DATA_ATTRIBUTES.REL_PASSED)) + amount += parseInt($(this).attr(DATA_ATTRIBUTES.REL_TESTS_AMOUNT)) + } + } + } + }); + + let passrate = '' + let background_color = "rgba(255, 255, 255, 0.2)" + if (!amount) { + passrate = "---"; + } else { + let float_passrate = passed * 100 / amount + passrate = (float_passrate).toFixed(2) + ' %'; + background_color = get_background_color(float_passrate) + } + let id_general = '#' + device + '_' + sw_plugin + '_statistic' + if ($(id_general).length) { + $(id_general).text(passrate) + $(id_general).css("background-color", background_color) + } + } + } +} + +function update_data() { + if ($('#scope_toggle').text() == SCOPE_TYPE.MANDATORY) { + $('#scope_toggle').text(SCOPE_TYPE.OPTIONAL) + } else { + $('#scope_toggle').text(SCOPE_TYPE.MANDATORY) + } + + let scope_toggle = $('#scope_toggle').text() + + if (scope_toggle == SCOPE_TYPE.OPTIONAL) { + $('#scope_legend').text('Optinal - includes information and passrate about all apiConformance tests.') + } else { + $('#scope_legend').text('Mandatory - includes information about tests from mandatory tests.\ + This tests should be passed to determine the plugin is conformance by API.\ + For mandatory scope only passed and failed statuses are applicable.') + } + + $("#report #data td").filter(function () { + if (scope_toggle == SCOPE_TYPE.OPTIONAL && $(this).attr(DATA_ATTRIBUTES.PASSRATE)) { + $(this).children('span').text($(this).attr(DATA_ATTRIBUTES.PASSRATE) + ' %') + + $($(this).find('.green')[0]).text('P:' + $(this).attr(DATA_ATTRIBUTES.PASSED)) + $($(this).find('.red')[0]).text('F:' + $(this).attr(DATA_ATTRIBUTES.FAILED)) + $($(this).find('.grey')[0]).show() + $($(this).find('.grey')[0]).text('S:' + $(this).attr(DATA_ATTRIBUTES.SKIPPED)) + $($(this).find('.dark')[0]).show() + $($(this).find('.dark')[0]).text('C:' + $(this).attr(DATA_ATTRIBUTES.CRASHED)) + $($(this).find('.grey-red')[0]).show() + $($(this).find('.grey-red')[0]).text('H:' + $(this).attr(DATA_ATTRIBUTES.HANGED)) + } else if (scope_toggle == SCOPE_TYPE.MANDATORY && $(this).attr(DATA_ATTRIBUTES.REL_PASSRATE)) { + if (parseInt($(this).attr(DATA_ATTRIBUTES.REL_TESTS_AMOUNT)) > 0) { + $(this).children('span').text($(this).attr(DATA_ATTRIBUTES.REL_PASSRATE) + ' %') + } else { + $(this).children('span').text('-- %') + } + + $($(this).find('.green')[0]).text('P:' + $(this).attr(DATA_ATTRIBUTES.REL_PASSED)) + $($(this).find('.red')[0]).text('F:' + (parseInt($(this).attr(DATA_ATTRIBUTES.REL_TESTS_AMOUNT)) - parseInt($(this).attr(DATA_ATTRIBUTES.REL_PASSED)))) + $($(this).find('.grey')[0]).hide() + $($(this).find('.dark')[0]).hide() + $($(this).find('.grey-red')[0]).hide() + } + }); + + update_statistic() +} + +function filter_by_test_type() { + testTypeName = $('#testTypeName').val().trim(); + + $("#report #data td").filter(function () { + let test_type = $(this).attr('data-test-type') + let data_filter = $(this).attr(DATA_ATTRIBUTES.FILTER) || ""; + if (!testTypeName || test_type.toLowerCase().indexOf(testTypeName.toLowerCase()) > -1) { + data_filter = data_filter.replace(FILTERS.TEST_TYPE, "") + $(this).attr(DATA_ATTRIBUTES.FILTER, data_filter) + } else { + if (data_filter.indexOf(FILTERS.TEST_TYPE) == -1) { + data_filter += FILTERS.TEST_TYPE + $(this).attr(DATA_ATTRIBUTES.FILTER, data_filter) + } + } + }); + + apply_filters_on_report_table() +} + +function change_device(value) { + let selected_devices = $(value).val() + $("#report td").filter(function () { + let device = $(this).attr(DATA_ATTRIBUTES.DEVICE) + let data_filter = $(this).attr(DATA_ATTRIBUTES.FILTER) || ""; + + if (!selected_devices || selected_devices.length == 0 || !device || selected_devices.includes(device)) { + data_filter = data_filter.replace(FILTERS.DEVICE, "") + $(this).attr(DATA_ATTRIBUTES.FILTER, data_filter) + } else { + if (data_filter.indexOf(FILTERS.DEVICE) == -1) { + data_filter += FILTERS.DEVICE + $(this).attr(DATA_ATTRIBUTES.FILTER, data_filter) + } + } + }); + + apply_filters_on_report_table() +} diff --git a/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/report_api_template.html b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/report_api_template.html new file mode 100644 index 00000000000..8bb2d4c005e --- /dev/null +++ b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/report_api_template.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + Report + + + +
+

API coverage summary.

+

+ {% if report_tag != "" %} + Tag: {{report_tag}} + {% endif %} + {% if report_version != "" %} + Version: {{report_version}} + {% endif %} + Time: {{ timestamp }} +

+
+
+ Collected statistic info + 100%General or relative passrate more 95% + 50%General or relative passrate less 80% +
+
+ Scope: + Mandatory - includes information about tests from mandatory scope. For mandatory scope only passed and failed statuses are applicable. +
+
+ Status: + P:85Passed + F:0Failed + S:2Skipped + C:0Crashed + H:0Hanged +
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
Scope
+ +
+
+
+ +
+ + + + + + {% for device in devices %} + + {% endfor %} + + + + + {% for sw_plugin in sw_plugins %} + + + {% for device in devices %} + + {% endfor %} + + {% endfor %} + + + {% for test_type in api_info %} + + {% for sw_plugin in sw_plugins %} + + + {% for device in devices %} + {% if device in api_info[test_type][sw_plugin] %} + + {% else %} + + {% endif %} + {% endfor %} + + {% endfor %} + {% endfor %} + +
EntityDevicesPlugins{{ device }}
Passrate
{{sw_plugin}} + ↺ +
{{ test_type }}
{{sw_plugin}} + {{api_info[test_type][sw_plugin][device]['passrate']}} % +
+ P:{{api_info[test_type][sw_plugin][device]['passed']}} + F:{{api_info[test_type][sw_plugin][device]['failed']}} + S:{{api_info[test_type][sw_plugin][device]['skipped']}} + C:{{api_info[test_type][sw_plugin][device]['crashed']}} + H:{{api_info[test_type][sw_plugin][device]['hanged']}} +
+
+ NOT RUN
+
+ + + + \ No newline at end of file diff --git a/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/style.css b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/style.css index 678c76bf401..9485cc15355 100644 --- a/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/style.css +++ b/src/tests/ie_test_utils/functional_test_utils/layer_tests_summary/template/style.css @@ -616,4 +616,111 @@ h2 { .not_run:hover { background: #8b000040; - } \ No newline at end of file + } + + .scope_stable { + display: flex !important; + align-items: center; + width: 270px; + height: 100px; + } + + .switch { + position: relative; + display: inline-block; + width: 200px; + height: 38px; + background-color: #ccc; + border-radius: 20px; + } + + /* hide HTML checkbox */ + .switch input { + opacity: 0; + width: 0; + height: 0; + } + + .slider { + border-radius: 20px; + position: absolute; + height: 30px; + width: 80px; + left: 5px; + bottom: 4px; + background-color: white; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; + -webkit-transition: .4s; + transition: .4s; + } + + input:checked + .slider { + -webkit-transform: translateX(110px); + -ms-transform: translateX(110px); + transform: translateX(110px); + } + + .mandatory { + border-radius: 20px; + position: absolute; + height: 30px; + width: 80px; + left: 5px; + bottom: 4px; + background-color: rgb(173, 166, 166); + opacity: 0.5; + display: flex; + align-items: center; + justify-content: center; + } + + .optional { + border-radius: 20px; + position: absolute; + height: 30px; + width: 80px; + left: 115px; + bottom: 4px; + background-color: rgb(173, 166, 166); + opacity: 0.5; + display: flex; + align-items: center; + justify-content: center; + } + + .toggle_arrow { + display: flex; + font-size: 20px; + justify-content: center; + opacity: 0.5; + } + + .diagonal { + position: relative; + background: linear-gradient(to right top, #000000 0%,#000000 46.9%,#ffffff 47%,#ffffff 51%,#000000 51.1%,#000000 100%) !important; + background-color: transparent; + background-color: none !important; + } + + .th-sw-plugin { + color: white; + } + + .th-devices { + color: white; + display: block; + text-align: end; + } + + .device { + vertical-align: middle !important; + font-weight: bold; + } + + .entity { + vertical-align: middle !important; + width: 20%; + } \ No newline at end of file diff --git a/tests/constraints.txt b/tests/constraints.txt index 67c0c97effd..ef82f17a906 100644 --- a/tests/constraints.txt +++ b/tests/constraints.txt @@ -1,4 +1,4 @@ -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 attrs==23.1.0 distro==1.8.0 h5py>=3.1.0 @@ -13,7 +13,7 @@ fastjsonschema~=2.17.1 test-generator==0.1.2 requests>=2.25.1 opencv-python>=4.5 -paddlepaddle==2.4.2 +paddlepaddle==2.5.0 py>=1.9.0 pytest>=5.0,<7.4 pytest-dependency==0.5.1 diff --git a/tests/layer_tests/mo_python_api_tests/test_mo_convert_pytorch.py b/tests/layer_tests/mo_python_api_tests/test_mo_convert_pytorch.py index 44524cc84b5..402f0d3a907 100644 --- a/tests/layer_tests/mo_python_api_tests/test_mo_convert_pytorch.py +++ b/tests/layer_tests/mo_python_api_tests/test_mo_convert_pytorch.py @@ -62,6 +62,26 @@ def make_pt_model_two_inputs(): return NeuralNetwork() +def make_pt_model_with_optional_input(): + from torch import nn + + class NeuralNetwork(nn.Module): + def __init__(self): + super(NeuralNetwork, self).__init__() + self.linear_relu_stack = nn.Sequential( + nn.ReLU(), + nn.Sigmoid(), + ) + + def forward(self, x, y=None, z=None): + if y is None: + logits = self.linear_relu_stack(x + z) + if z is None: + logits = self.linear_relu_stack(x * y) + return logits + + return NeuralNetwork() + def make_ref_pt_model_one_input(shape, dtype=np.float32): shape = PartialShape(shape) param1 = ov.opset8.parameter(shape, name="input_0", dtype=dtype) @@ -96,16 +116,37 @@ def make_ref_pt_model_two_inputs(shape, dtype=np.float32): return model +def make_ref_pt_model_with_optional_inputs(shape, dtype=np.float32, z_exist=False): + if len(shape) == 2: + param1 = ov.opset8.parameter(PartialShape( + shape[0]), name="input_0", dtype=dtype) + param2 = ov.opset8.parameter(PartialShape( + shape[1]), name="input_1", dtype=dtype) + else: + shape = PartialShape(shape) + param1 = ov.opset8.parameter(shape, name="input_0", dtype=dtype) + param2 = ov.opset8.parameter(shape, name="input_1", dtype=dtype) + + op = ov.opset8.multiply(param1, param2) if not z_exist else ov.opset8.add(param1, param2) + relu = ov.opset8.relu(op) + if dtype != np.float32: + relu = ov.opset8.convert(relu, np.float32) + sigm = ov.opset8.sigmoid(relu) + + parameter_list = [param1, param2] + model = Model([sigm], parameter_list, "test") + return model + + def create_pytorch_nn_module_case1(tmp_dir): pt_model = make_pt_model_two_inputs() - ref_model = make_ref_pt_model_two_inputs([-1, 3, -1, -1]) + ref_model = make_ref_pt_model_two_inputs([-1, -1, -1, -1]) sample_input1 = torch.zeros(1, 3, 10, 10) sample_input2 = torch.zeros(1, 3, 10, 10) sample_input = sample_input1, sample_input2 - return pt_model, ref_model, {'input': [([-1, 3, -1, -1], np.float32), ([-1, 3, -1, -1], np.float32)], - 'example_input': sample_input} + return pt_model, ref_model, {'example_input': sample_input} def create_pytorch_nn_module_case2(tmp_dir): @@ -117,7 +158,6 @@ def create_pytorch_nn_module_case2(tmp_dir): sample_input = sample_input1, sample_input2 return pt_model, ref_model, {'input_shape': ["[?,3,?,?]", PartialShape([-1, 3, -1, -1])], - 'input': [np.float32, np.float32], 'example_input': sample_input} @@ -130,7 +170,6 @@ def create_pytorch_nn_module_case3(tmp_dir): sample_input = tuple([sample_input1, sample_input2]) return pt_model, ref_model, {'input_shape': "[?,3,?,?],[?,3,?,?]", - 'input': [np.float32, np.float32], 'example_input': sample_input} @@ -139,10 +178,9 @@ def create_pytorch_nn_module_case4(tmp_dir): sample_input = torch.zeros(1, 3, 10, 10) - ref_model = make_ref_pt_model_one_input(PartialShape.dynamic()) + ref_model = make_ref_pt_model_one_input(PartialShape([1, 3, 20, 20])) - return pt_model, ref_model, {'input': [np.float32], - 'example_input': sample_input} + return pt_model, ref_model, {'example_input': sample_input, "input_shape": [1, 3, 20, 20]} def create_pytorch_nn_module_case5(tmp_dir): @@ -163,6 +201,15 @@ def create_pytorch_nn_module_case6(tmp_dir): return pt_model, ref_model, {'input': (shape, np.float32)} +def create_pytorch_nn_module_case7(tmp_dir): + pt_model = make_pt_model_one_input() + + sample_input = torch.zeros(1, 3, 10, 10, dtype=torch.int32) + + ref_model = make_ref_pt_model_one_input(PartialShape([1, 3, 20, 20]), dtype=np.int32) + + return pt_model, ref_model, {'example_input': sample_input, "input": ([1, 3, 20, 20], np.int32)} + def create_pytorch_nn_module_torch_size(tmp_dir): pt_model = make_pt_model_one_input() ref_model = make_ref_pt_model_one_input([1, 3, 2, 10]) @@ -176,7 +223,7 @@ def create_pytorch_nn_module_sample_input_int32(tmp_dir): sample_input = torch.zeros(1, 3, 10, 10, dtype=torch.int32) - ref_model = make_ref_pt_model_one_input(shape, dtype=numpy.int32) + ref_model = make_ref_pt_model_one_input(shape, dtype=np.int32) return pt_model, ref_model, {'example_input': sample_input, 'input': (shape, np.int32)} @@ -216,7 +263,7 @@ def create_pytorch_jit_script_function(tmp_dir): inp_shape = PartialShape([Dimension(1, -1), Dimension(-1, 5), 10]) ref_model = make_ref_pt_model_two_inputs(inp_shape) - return scripted_fn, ref_model, {'input': [(inp_shape, np.float32), (inp_shape, np.float32)]} + return scripted_fn, ref_model, {'input': [(inp_shape), (inp_shape)]} @@ -232,7 +279,6 @@ def create_pytorch_nn_module_layout_list(tmp_dir): return pt_model, ref_model, { 'input_shape': [shape, shape], 'layout': ['nchw', Layout('nhwc')], - 'input': [np.float32, np.float32] } @@ -247,8 +293,7 @@ def create_pytorch_nn_module_layout_list_case2(tmp_dir): ref_model.inputs[1].node.layout = Layout('nhwc') return pt_model, ref_model, { - 'input_shape': [shape, shape], 'layout': ('nchw', Layout('nhwc')), - 'input': [np.float32, np.float32]} + 'input_shape': [shape, shape], 'layout': ('nchw', Layout('nhwc'))} def create_pytorch_nn_module_mean_list(tmp_dir): @@ -270,8 +315,7 @@ def create_pytorch_nn_module_mean_list(tmp_dir): ref_model = Model([sigm], parameter_list, "test") return pt_model, ref_model, { - 'input_shape': [shape, shape], 'mean_values': [[0, 0, 0], [0, 0, 0]], 'compress_to_fp16': False, - 'input': [np.float32, np.float32]} + 'input_shape': [shape, shape], 'mean_values': [[0, 0, 0], [0, 0, 0]], 'compress_to_fp16': False} def create_pytorch_nn_module_mean_list_default_no_compression(tmp_dir): @@ -293,7 +337,7 @@ def create_pytorch_nn_module_mean_list_default_no_compression(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return pt_model, ref_model, {'input_shape': [shape, shape], 'mean_values': [[0, 0, 0], [0, 0, 0]], 'input': [np.float32, np.float32]} + return pt_model, ref_model, {'input_shape': [shape, shape], 'mean_values': [[0, 0, 0], [0, 0, 0]]} def create_pytorch_nn_module_mean_list_compression_enabled(tmp_dir): @@ -316,7 +360,7 @@ def create_pytorch_nn_module_mean_list_compression_enabled(tmp_dir): return pt_model, ref_model, { 'input_shape': [shape, shape], 'mean_values': [[0, 0, 0], [0, 0, 0]], - 'compress_to_fp16': False, 'input': [np.float32, np.float32]} + 'compress_to_fp16': False} def create_pytorch_nn_module_scale_list(tmp_dir): @@ -337,7 +381,7 @@ def create_pytorch_nn_module_scale_list(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return pt_model, ref_model, {'input_shape': [shape, shape], 'scale_values': [[1, 1, 1], [1, 1, 1]], 'compress_to_fp16': False, 'input': [np.float32, np.float32]} + return pt_model, ref_model, {'input_shape': [shape, shape], 'scale_values': [[1, 1, 1], [1, 1, 1]], 'compress_to_fp16': False} def create_pytorch_nn_module_scale_list_default_no_compression(tmp_dir): @@ -359,7 +403,7 @@ def create_pytorch_nn_module_scale_list_default_no_compression(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return pt_model, ref_model, {'input_shape': [shape, shape], 'scale_values': [[1, 1, 1], [1, 1, 1]], 'input': [np.float32, np.float32]} + return pt_model, ref_model, {'input_shape': [shape, shape], 'scale_values': [[1, 1, 1], [1, 1, 1]]} def create_pytorch_nn_module_scale_list_compression_enabled(tmp_dir): @@ -382,7 +426,7 @@ def create_pytorch_nn_module_scale_list_compression_enabled(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return pt_model, ref_model, {'input_shape': [shape, shape], 'scale_values': [[1, 1, 1], [1, 1, 1]], 'input': [np.float32, np.float32], + return pt_model, ref_model, {'input_shape': [shape, shape], 'scale_values': [[1, 1, 1], [1, 1, 1]], 'compress_to_fp16': True} @@ -390,7 +434,7 @@ def create_pytorch_nn_module_shapes_list_static(tmp_dir): pt_model = make_pt_model_two_inputs() ref_model = make_ref_pt_model_two_inputs([1, 3, 20, 20]) - return pt_model, ref_model, {'input_shape': [[1, 3, 20, 20], [1, 3, 20, 20]], 'input': [np.float32, np.float32]} + return pt_model, ref_model, {'input_shape': [[1, 3, 20, 20], [1, 3, 20, 20]]} def create_pytorch_nn_module_shapes_list_static_via_input(tmp_dir): @@ -415,7 +459,7 @@ def create_pytorch_nn_module_shapes_list_dynamic(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return pt_model, ref_model, {'input_shape': inp_shapes, 'input': [np.float32, np.float32]} + return pt_model, ref_model, {'input_shape': inp_shapes} def create_pytorch_nn_module_shapes_list_dynamic_via_input(tmp_dir): @@ -433,14 +477,14 @@ def create_pytorch_nn_module_shapes_list_dynamic_via_input(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return pt_model, ref_model, {'input': [(inp_shapes[0], np.float32), (inp_shapes[1], np.float32)]} + return pt_model, ref_model, {'input': [(inp_shapes[0],), (inp_shapes[1],)]} def create_pytorch_nn_module_shapes_list_dynamic_single_input(tmp_dir): pt_model = make_pt_model_one_input() inp_shapes = [[Dimension(-1), 3, 20, Dimension(20, -1)]] ref_model = make_ref_pt_model_one_input(inp_shapes[0]) - return pt_model, ref_model, {'input_shape': inp_shapes, 'input': np.float32} + return pt_model, ref_model, {'input_shape': inp_shapes} def create_pytorch_nn_module_shapes_list_dynamic_single_input_via_input(tmp_dir): @@ -454,7 +498,7 @@ def create_pytorch_nn_module_shapes_list_static_single_input(tmp_dir): pt_model = make_pt_model_one_input() inp_shapes = [[1, 3, 20, 20]] ref_model = make_ref_pt_model_one_input(inp_shapes[0]) - return pt_model, ref_model, {'input_shape': inp_shapes, 'input': np.float32} + return pt_model, ref_model, {'input_shape': inp_shapes} def create_pytorch_nn_module_shapes_list_static_single_input_via_input(tmp_dir): @@ -548,8 +592,7 @@ def create_pytorch_jit_script_module_convert_pytorch_frontend(tmp_dir): parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") return scripted_model, ref_model, { - "example_input": {"x": torch.zeros((1, 3, 10, 10)), "y": torch.ones((1, 3, 10, 10))}, - 'input': [InputCutInfo(shape=[-1, -1, -1, -1], type="f32"), InputCutInfo(shape=[-1, -1, -1, -1], type="f32")]} + "example_input": [torch.zeros((1, 3, 10, 10)), torch.ones((1, 3, 10, 10))]} def create_pytorch_jit_trace_module_convert_pytorch_frontend(tmp_dir): @@ -567,8 +610,7 @@ def create_pytorch_jit_trace_module_convert_pytorch_frontend(tmp_dir): sigm = ov.opset10.sigmoid(relu) parameter_list = [param1, param2] ref_model = Model([sigm], parameter_list, "test") - return scripted_model, ref_model, {"example_input": example_input, 'input': [ - InputCutInfo(shape=[-1, -1, -1, -1], type="f32"), InputCutInfo(shape=[-1, -1, -1, -1], type="f32")]} + return scripted_model, ref_model, {"example_input": example_input} def create_pytorch_module_convert_pytorch_frontend_oob(tmp_dir): @@ -595,6 +637,39 @@ def create_pytorch_module_convert_pytorch_frontend_oob(tmp_dir): return net, ref_model, {} +def create_pytorch_module_with_optional_inputs_case1(tmp_dir): + net = make_pt_model_with_optional_input() + example_input = {"x": torch.zeros((1,3,10,10)), "y": torch.ones((1,3,10,10))} + ref_model = make_ref_pt_model_with_optional_inputs([-1, -1, -1, -1]) + return net, ref_model, {"example_input": example_input} + + +def create_pytorch_module_with_optional_inputs_case2(tmp_dir): + net = make_pt_model_with_optional_input() + example_input = {"x": torch.zeros((1,3,10,10)), "z": torch.ones((1,3,10,10))} + ref_model = make_ref_pt_model_with_optional_inputs([-1, -1, -1, -1], z_exist=True) + return net, ref_model, {"example_input": example_input} + + +def create_pytorch_module_with_optional_inputs_case3(tmp_dir): + net = make_pt_model_with_optional_input() + example_input = {"x": torch.zeros((1,3,10,10)), "z": torch.ones((1,3,10,10))} + ref_model = make_ref_pt_model_with_optional_inputs([3, 3, 3, 3], z_exist=True) + return net, ref_model, {"example_input": example_input, "input_shape": [[3, 3, 3, 3], [3, 3, 3, 3]]} + + +def create_pytorch_module_with_optional_inputs_case4(tmp_dir): + net = make_pt_model_with_optional_input() + ref_model = make_ref_pt_model_with_optional_inputs([3, 3, 3, 3], z_exist=True) + return net, ref_model, {"input": [("x", [3, 3, 3, 3]), ("z", [3, 3, 3, 3])]} + + +def create_pytorch_module_with_optional_inputs_case5(tmp_dir): + net = make_pt_model_with_optional_input() + ref_model = make_ref_pt_model_with_optional_inputs([1, 3, -1, -1], z_exist=True) + return net, ref_model, {"input": ["x", "z"], "input_shape": [[1, 3, -1, -1], [1, 3, -1, -1]]} + + class TestMoConvertPyTorch(CommonMOConvertTest): test_data = [ create_pytorch_nn_module_case1, @@ -603,6 +678,7 @@ class TestMoConvertPyTorch(CommonMOConvertTest): create_pytorch_nn_module_case4, create_pytorch_nn_module_case5, create_pytorch_nn_module_case6, + create_pytorch_nn_module_case7, create_pytorch_nn_module_torch_size, create_pytorch_nn_module_sample_input_int32, create_pytorch_nn_module_sample_input_int32_two_inputs, @@ -630,7 +706,12 @@ class TestMoConvertPyTorch(CommonMOConvertTest): create_pytorch_nn_module_convert_pytorch_frontend4, create_pytorch_jit_script_module_convert_pytorch_frontend, create_pytorch_jit_trace_module_convert_pytorch_frontend, - create_pytorch_module_convert_pytorch_frontend_oob + create_pytorch_module_convert_pytorch_frontend_oob, + create_pytorch_module_with_optional_inputs_case1, + create_pytorch_module_with_optional_inputs_case2, + create_pytorch_module_with_optional_inputs_case3, + create_pytorch_module_with_optional_inputs_case4, + create_pytorch_module_with_optional_inputs_case5 ] @ pytest.mark.parametrize("create_model", test_data) diff --git a/tools/compile_tool/main.cpp b/tools/compile_tool/main.cpp index d30609de6bb..ede1d97658a 100644 --- a/tools/compile_tool/main.cpp +++ b/tools/compile_tool/main.cpp @@ -598,12 +598,15 @@ static std::map parseConfigFile(char comment = '#') { continue; } size_t spacePos = option.find(' '); - std::string key, value; - if (spacePos != std::string::npos) { - key = option.substr(0, spacePos); - value = option.substr(spacePos + 1); - config[key] = value; - } + + OPENVINO_ASSERT(spacePos != std::string::npos, + "Failed to find a space separator in " + "provided plugin config option: " + + option); + + std::string key = option.substr(0, spacePos); + std::string value = option.substr(spacePos + 1); + config[key] = value; } } return config; diff --git a/tools/mo/openvino/tools/mo/convert_impl.py b/tools/mo/openvino/tools/mo/convert_impl.py index dc42100144d..ab00c552cdc 100644 --- a/tools/mo/openvino/tools/mo/convert_impl.py +++ b/tools/mo/openvino/tools/mo/convert_impl.py @@ -48,7 +48,7 @@ from openvino.tools.mo.utils.utils import refer_to_faq_msg, check_values_equal from openvino.tools.mo.utils.telemetry_utils import send_params_info, send_framework_info, send_conversion_result, \ get_tid from openvino.tools.mo.moc_frontend.check_config import legacy_extensions_used -from openvino.tools.mo.moc_frontend.pytorch_frontend_utils import get_pytorch_decoder +from openvino.tools.mo.moc_frontend.pytorch_frontend_utils import get_pytorch_decoder, extract_input_info_from_example from openvino.tools.mo.moc_frontend.paddle_frontend_utils import paddle_frontend_converter from openvino.tools.mo.moc_frontend.shape_utils import parse_input_shapes @@ -390,18 +390,12 @@ def prepare_ir(argv: argparse.Namespace): if moc_front_end: fallback_reasons = check_fallback(argv) if len(fallback_reasons) == 0: - path_to_aux_pb = None - orig_argv_values = {"input_model": argv.input_model, "model_name": argv.model_name} - if not argv.use_legacy_frontend and is_tf: - if tf_frontend_with_python_bindings_installed and 'tf' in available_moc_front_ends and \ - type_supported_by_tf_fe(argv.input_model): - argv.input_model = create_tf_graph_iterator(argv.input_model, - argv.placeholder_shapes, - argv.placeholder_data_types, - getattr(argv, "example_input", None)) - else: - from openvino.tools.mo.front.tf.loader import convert_to_pb - path_to_aux_pb = convert_to_pb(argv) + if is_tf and tf_frontend_with_python_bindings_installed and \ + type_supported_by_tf_fe(argv.input_model): + argv.input_model = create_tf_graph_iterator(argv.input_model, + argv.placeholder_shapes, + argv.placeholder_data_types, + getattr(argv, "example_input", None)) try: t.send_event("mo", "conversion_method", moc_front_end.get_name() + "_frontend") moc_front_end.add_extension(TelemetryExtension("mo", t.send_event, t.send_error, t.send_stack_trace)) @@ -424,14 +418,6 @@ def prepare_ir(argv: argparse.Namespace): # re-throw exception for all frontends except TensorFlow FE # and in case unexpected conversion failures raise - finally: - # TODO: remove this workaround once new TensorFlow frontend supports non-frozen formats: checkpoint, MetaGraph, and SavedModel - # Now it converts all TensorFlow formats to the frozen .pb format in case new TensorFlow frontend - if is_tf and path_to_aux_pb is not None: - argv.input_model = orig_argv_values["input_model"] - argv.model_name = orig_argv_values["model_name"] - if path_to_aux_pb is not None and os.path.exists(path_to_aux_pb): - os.remove(path_to_aux_pb) if len(fallback_reasons) > 0: reasons_message = ", ".join(fallback_reasons) @@ -774,6 +760,9 @@ def python_api_params_parsing(argv: argparse.Namespace): argv.placeholder_shapes = shape_list if shape_list else None argv.placeholder_data_types = data_type_list if data_type_list else {} + if argv.framework == "pytorch" and getattr(argv, "example_input", None) is not None: + extract_input_info_from_example(argv, inputs) + def pack_params_to_args_namespace(args: dict, cli_parser: argparse.ArgumentParser): if len(args) > 0: @@ -852,9 +841,7 @@ def _convert(cli_parser: argparse.ArgumentParser, framework, args, python_api_us elif 'example_inputs' in args: raise AssertionError("'example_inputs' argument is not recognized, maybe you meant to provide 'example_input'?") - decoder = get_pytorch_decoder(args['input_model'], parse_input_shapes(args), example_inputs, args.get("input")) - args['input_model'] = decoder - args['framework'] = model_framework + decoder = get_pytorch_decoder(args['input_model'], parse_input_shapes(args), example_inputs, args) if model_framework == "paddle": example_inputs = None if 'example_input' in args and args['example_input'] is not None: @@ -964,6 +951,6 @@ def _convert(cli_parser: argparse.ArgumentParser, framework, args, python_api_us send_conversion_result('fail') if python_api_used: - raise e.with_traceback(None) + raise e#.with_traceback(None) else: return None, argv diff --git a/tools/mo/openvino/tools/mo/front/tf/loader.py b/tools/mo/openvino/tools/mo/front/tf/loader.py index 9b78b2da2fa..72acbe0dd6d 100644 --- a/tools/mo/openvino/tools/mo/front/tf/loader.py +++ b/tools/mo/openvino/tools/mo/front/tf/loader.py @@ -248,7 +248,6 @@ def saved_model_load(imported, env_setup): def load_tf_graph_def(graph_file_name: str = "", is_binary: bool = True, checkpoint: str = "", model_dir: str = "", saved_model_tags: list = [], meta_graph_file: str = "", user_output_node_names_list: list = []): - if not isinstance(graph_file_name, str) and graph_file_name is not None: return prepare_graph_def(graph_file_name) # As a provisional solution, use a native TF methods to load a model protobuf @@ -291,6 +290,7 @@ def load_tf_graph_def(graph_file_name: str = "", is_binary: bool = True, checkpo for node in input_meta_graph_def.graph_def.node: if '_output_shapes' in node.attr: del node.attr['_output_shapes'] + tf_v1.reset_default_graph() # pylint: disable=no-member with tf_v1.Session() as sess: restorer = tf_v1.train.import_meta_graph(input_meta_graph_def) @@ -326,46 +326,6 @@ def load_tf_graph_def(graph_file_name: str = "", is_binary: bool = True, checkpo raise Error("Unknown configuration of input model parameters") -def convert_to_pb(argv: argparse.Namespace): - from openvino.tools.mo.utils.cli_parser import get_model_name - if argv.input_model is not None and not isinstance(argv.input_model, (str, Path)): - return None - env_setup = get_environment_setup("tf") - if "tensorflow" in env_setup and env_setup["tensorflow"] >= LooseVersion("2.0.0"): - tf.keras.backend.clear_session() - - # any model format on disk is accepted by TensorFlow Frontend - # only model from memory requires temporal saving on a disk - if (argv.input_model and isinstance(argv.input_model, str)) or argv.saved_model_dir or argv.input_meta_graph: - return None - - user_output_node_names_list = argv.output if argv.output else None - if user_output_node_names_list is not None and not isinstance(user_output_node_names_list, list): - user_output_node_names_list = user_output_node_names_list.split(',') - graph_def, _, _, _ = load_tf_graph_def( - graph_file_name=argv.input_model, - is_binary=not argv.input_model_is_text, - checkpoint=argv.input_checkpoint, - user_output_node_names_list=user_output_node_names_list, - model_dir=argv.saved_model_dir, - meta_graph_file=argv.input_meta_graph, - saved_model_tags=argv.saved_model_tags) - if argv.model_name: - model_name = argv.model_name - elif argv.input_model: - model_name = get_model_name(argv.input_model) - elif argv.saved_model_dir: - model_name = "saved_model" - elif argv.input_meta_graph: - model_name = get_model_name(argv.input_meta_graph) - argv.model_name = model_name - tf_v1.io.write_graph(graph_def, argv.output_dir if argv.output_dir != '.' else os.getcwd(), - model_name + "_tmp.pb", as_text=False) - path_to_pb = os.path.normpath(os.path.join(argv.output_dir, model_name + "_tmp.pb")) - argv.input_model = path_to_pb - return path_to_pb - - def protobuf_attrs(pb: tf_v1.NodeDef): return {'pb': pb} diff --git a/tools/mo/openvino/tools/mo/moc_frontend/extractor.py b/tools/mo/openvino/tools/mo/moc_frontend/extractor.py index 7b93dca7ab6..97effaeaa7a 100644 --- a/tools/mo/openvino/tools/mo/moc_frontend/extractor.py +++ b/tools/mo/openvino/tools/mo/moc_frontend/extractor.py @@ -399,7 +399,7 @@ def convert_params_lists_to_dicts(input_model, # this cycle adds each unnamed type to dictionary using name from model_inputs for idx, node_type in enumerate(input_user_data_types): - assert isinstance(node_type, (type, Type)), "Got incorrect format of input types. " \ + assert isinstance(node_type, (type, np.dtype, Type)), "Got incorrect format of input types. " \ "Expected numpy type or openvino.runtime.Type, " \ "got {}.".format(type(node_type)) diff --git a/tools/mo/openvino/tools/mo/moc_frontend/pipeline.py b/tools/mo/openvino/tools/mo/moc_frontend/pipeline.py index 32d43a698f6..f41fff6aa31 100644 --- a/tools/mo/openvino/tools/mo/moc_frontend/pipeline.py +++ b/tools/mo/openvino/tools/mo/moc_frontend/pipeline.py @@ -42,7 +42,10 @@ def moc_pipeline(argv: argparse.Namespace, moc_front_end: FrontEnd): # frozen model without v1 checkpoints input_model = moc_front_end.load(argv.input_model) elif argv.saved_model_dir: - input_model = moc_front_end.load(argv.saved_model_dir) + if argv.saved_model_tags: + input_model = moc_front_end.load([argv.saved_model_dir, argv.saved_model_tags]) + else: + input_model = moc_front_end.load(argv.saved_model_dir) elif argv.input_meta_graph: input_model = moc_front_end.load(argv.input_meta_graph) if argv.output: diff --git a/tools/mo/openvino/tools/mo/moc_frontend/pytorch_frontend_utils.py b/tools/mo/openvino/tools/mo/moc_frontend/pytorch_frontend_utils.py index 9de19af062f..f8419ae4edb 100644 --- a/tools/mo/openvino/tools/mo/moc_frontend/pytorch_frontend_utils.py +++ b/tools/mo/openvino/tools/mo/moc_frontend/pytorch_frontend_utils.py @@ -5,21 +5,111 @@ import logging as log import numpy as np from openvino.tools.mo.moc_frontend.shape_utils import get_static_shape from openvino.tools.mo.utils.error import Error -from openvino.runtime import Tensor, Type +from openvino.runtime import Tensor, Type, PartialShape from openvino.runtime.utils.types import get_element_type_str from openvino.tools.mo.utils.cli_parser import input_to_input_cut_info, input_shape_to_input_cut_info -def get_pytorch_decoder(model, input_shape, example_inputs, input_info): +def get_pytorch_decoder(model, input_shape, example_inputs, args): try: from openvino.frontend.pytorch.decoder import TorchScriptPythonDecoder except Exception as e: log.error("PyTorch frontend loading failed") raise e - inputs = prepare_torch_inputs(example_inputs, input_shape, input_info, allow_none=True) + inputs = prepare_torch_inputs(example_inputs, input_shape, args.get("input"), allow_none=True) decoder = TorchScriptPythonDecoder(model, example_input=inputs) + args['input_model'] = decoder + args["framework"] = "pytorch" + args["example_input"] = inputs - return decoder + return args + + +def update_list_or_dict(container, name, idx, value): + if isinstance(container, dict): + if name is None: + name = list(container)[idx] + container[name] = value + return + if idx == len(container): + container.append(value) + elif idx > len(container): + raise Error(f"Wrong {idx}") + else: + container[idx] = value + return + + +def get_value_from_list_or_dict(container, name, idx): + if isinstance(container, dict): + if name is None: + if idx < len(container): + name = list(container)[idx] + return None + return container.get(name) + if idx < len(container): + return container[idx] + return None + + +def extract_input_info_from_example(args, inputs): + try: + from openvino.frontend.pytorch.decoder import pt_to_ov_type_map + except Exception as e: + log.error("PyTorch frontend loading failed") + raise e + example_inputs = args.example_input + data_types = args.placeholder_data_types or {} + input_shapes = args.placeholder_shapes or {} + is_dict_input = isinstance(example_inputs, dict) + list_inputs = list(example_inputs.values()) if is_dict_input else example_inputs + input_names = None if not is_dict_input else list(example_inputs) + if not isinstance(list_inputs, (list, tuple)): + list_inputs = [list_inputs] + if not data_types and input_names is None: + data_types = [] + if not input_shapes and input_names is None: + input_shapes = [] + if inputs: + for input_id, input_info in enumerate(inputs): + input_name = input_info.name + if is_dict_input and input_name in example_inputs: + example_input = example_inputs[input_name] + else: + example_input = list_inputs[input_id] + if is_dict_input and input_name is None: + input_name = input_names[input_id] + dtype = getattr(example_input, "dtype", type(example_input)) + example_dtype = pt_to_ov_type_map.get(str(dtype)) + user_dtype = get_value_from_list_or_dict(data_types, input_name, input_id) + if user_dtype is not None and example_dtype.to_dtype() != user_dtype: + raise Error(f"Defined input type {user_dtype} is not equal to provided example_input type {example_dtype.to_dtype()}") + + data_rank = getattr(example_input, "ndim", 0) + user_input_shape = get_value_from_list_or_dict(input_shapes, input_name, input_id) + if user_input_shape.rank.get_length() != data_rank: + raise Error( + f"Requested input shape {user_input_shape.rank.get_length()} rank" + f" is not equal to provided example_input rank {data_rank}") + + input_shape = user_input_shape if user_input_shape is not None else PartialShape([-1] * data_rank) + update_list_or_dict(data_types, input_name, input_id, example_dtype.to_dtype()) + update_list_or_dict(input_shapes, input_name, input_id, input_shape) + else: + for input_id, example_input in enumerate(list_inputs): + dtype = getattr(example_input, "dtype", type(example_input)) + ov_dtype = pt_to_ov_type_map.get(str(dtype)) + data_rank = getattr(example_input, "ndim", 0) + input_shape = PartialShape([-1] * data_rank) + input_name = input_names[input_id] if input_names else None + update_list_or_dict(input_shapes, input_name, input_id, input_shape) + update_list_or_dict(data_types, input_name, input_id, ov_dtype.to_dtype()) + + args.placeholder_data_types = data_types + args.placeholder_shapes = input_shapes + if not args.input and input_names: + args.input_list = input_names + args.input = ",".join(input_names) def to_torch_tensor(tensor): @@ -91,6 +181,7 @@ def prepare_torch_inputs(example_inputs, input_shape, input_info=None, allow_non input_info = input_to_input_cut_info(input_info) or [] input_shape_to_input_cut_info(input_shape, input_info) inputs = [] + inputs_with_names = {} for inp in input_info: shape = inp.shape if shape is None: @@ -100,9 +191,14 @@ def prepare_torch_inputs(example_inputs, input_shape, input_info=None, allow_non break dtype = get_torch_dtype(inp.type) static_shape = get_static_shape(shape, dynamic_value=1) - inputs.append(torch.zeros(static_shape, dtype=dtype)) + input_tensor = torch.zeros(static_shape, dtype=dtype) + if inp.name is not None: + inputs_with_names[inp.name] = input_tensor + inputs.append(input_tensor) if isinstance(inputs, list): inputs = tuple(inputs) + if inputs is not None and len(inputs) == len(inputs_with_names): + inputs = inputs_with_names else: if not allow_none: raise Error("Please provide input_shape or example_input for converting PyTorch model.") diff --git a/tools/mo/requirements_caffe.txt b/tools/mo/requirements_caffe.txt index 3d8b0480a43..a8932f1873d 100644 --- a/tools/mo/requirements_caffe.txt +++ b/tools/mo/requirements_caffe.txt @@ -1,5 +1,5 @@ -c ../constraints.txt -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 networkx protobuf defusedxml diff --git a/tools/mo/requirements_kaldi.txt b/tools/mo/requirements_kaldi.txt index 6ef5aeaf13f..b31121df7bf 100644 --- a/tools/mo/requirements_kaldi.txt +++ b/tools/mo/requirements_kaldi.txt @@ -1,5 +1,5 @@ -c ../constraints.txt -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 networkx defusedxml requests diff --git a/tools/mo/requirements_mxnet.txt b/tools/mo/requirements_mxnet.txt index 8df37622cc2..339a09689c7 100644 --- a/tools/mo/requirements_mxnet.txt +++ b/tools/mo/requirements_mxnet.txt @@ -1,5 +1,5 @@ -c ../constraints.txt -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 mxnet networkx defusedxml diff --git a/tools/mo/requirements_onnx.txt b/tools/mo/requirements_onnx.txt index 178e18ac85e..f1f52bb03c2 100644 --- a/tools/mo/requirements_onnx.txt +++ b/tools/mo/requirements_onnx.txt @@ -1,5 +1,5 @@ -c ../constraints.txt -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 onnx networkx defusedxml diff --git a/tools/mo/requirements_tf.txt b/tools/mo/requirements_tf.txt index a6ab68f6564..548f3080808 100644 --- a/tools/mo/requirements_tf.txt +++ b/tools/mo/requirements_tf.txt @@ -1,6 +1,6 @@ -c ../constraints.txt tensorflow>=1.15.5,<2.13.0 -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 networkx defusedxml requests diff --git a/tools/mo/requirements_tf2.txt b/tools/mo/requirements_tf2.txt index 562e77e06f2..a96ed84004f 100644 --- a/tools/mo/requirements_tf2.txt +++ b/tools/mo/requirements_tf2.txt @@ -1,6 +1,6 @@ -c ../constraints.txt tensorflow>=2.5,<2.13.0 -numpy>=1.16.6,<1.25.0 +numpy>=1.16.6,<1.26 networkx defusedxml requests diff --git a/tools/mo/unit_tests/mo/front/tf/convert_to_pb_test.py b/tools/mo/unit_tests/mo/front/tf/convert_to_pb_test.py deleted file mode 100644 index 1abe5ddd456..00000000000 --- a/tools/mo/unit_tests/mo/front/tf/convert_to_pb_test.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import argparse -import os -import tempfile -import unittest - -from openvino.tools.mo.front.tf.loader import convert_to_pb - - -class ConvertToPBTests(unittest.TestCase): - test_directory = os.path.dirname(os.path.realpath(__file__)) - - def setUp(self): - self.argv = argparse.Namespace(input_model=None, input_model_is_text=False, input_checkpoint=None, output=None, - saved_model_dir=None, input_meta_graph=None, saved_model_tags=None, - model_name='model', output_dir=None) - - @unittest.skip("Ticket: 106651") - def test_saved_model(self): - import tensorflow as tf - with tempfile.TemporaryDirectory(dir=self.test_directory) as tmp_dir: - inputs = tf.keras.Input(shape=(3,)) - x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs) - outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x) - model = tf.keras.Model(inputs=inputs, outputs=outputs) - model.save(tmp_dir) - self.argv.saved_model_dir = tmp_dir - self.argv.output_dir = tmp_dir - path_to_pb = convert_to_pb(self.argv) - self.assertTrue(os.path.exists(path_to_pb), "The auxiliary .pb is not generated") - self.assertTrue(os.path.getsize(path_to_pb) != 0, "The auxiliary .pb is empty") - - def test_meta_format(self): - try: - import tensorflow.compat.v1 as tf_v1 - except ImportError: - import tensorflow as tf_v1 - from tensorflow.python.eager.context import graph_mode - - with tempfile.TemporaryDirectory(dir=self.test_directory) as tmp_dir: - with graph_mode(): - a = tf_v1.get_variable("A", initializer=tf_v1.constant(3, shape=[2])) - b = tf_v1.get_variable("B", initializer=tf_v1.constant(5, shape=[2])) - tf_v1.add(a, b, name='Add') - init_op = tf_v1.global_variables_initializer() - saver = tf_v1.train.Saver() - with tf_v1.Session() as sess: - sess.run(init_op) - saver.save(sess, os.path.join(tmp_dir, 'model')) - - self.argv.input_meta_graph = os.path.join(tmp_dir, 'model.meta') - self.argv.output_dir = tmp_dir - path_to_pb = convert_to_pb(self.argv) - self.assertTrue(path_to_pb is None, "Auxiliary .pb must not be generated for .meta") - - def test_text_frozen_format(self): - try: - import tensorflow.compat.v1 as tf_v1 - except ImportError: - import tensorflow as tf_v1 - tf_v1.reset_default_graph() - - # Create the graph and model - with tempfile.TemporaryDirectory(dir=self.test_directory) as tmp_dir: - with tf_v1.Session() as sess: - x = tf_v1.placeholder(tf_v1.float32, [2, 3], 'x') - y = tf_v1.placeholder(tf_v1.float32, [2, 3], 'y') - tf_v1.add(x, y, name="add") - - tf_v1.global_variables_initializer() - tf_v1.io.write_graph(sess.graph, tmp_dir, 'model.pbtxt', as_text=True) - - # initialize test case and check - self.argv.input_model = os.path.join(tmp_dir, 'model.pbtxt') - self.argv.input_model_is_text = True - self.argv.output_dir = tmp_dir - self.assertTrue(os.path.exists(self.argv.input_model), - "The test model in frozen text format must exist") - # test convert_to_pb - path_to_pb = convert_to_pb(self.argv) - self.assertTrue(path_to_pb is None, "Auxiliary .pb must not be generated for .pbtxt") - - def test_binary_frozen_format(self): - try: - import tensorflow.compat.v1 as tf_v1 - except ImportError: - import tensorflow as tf_v1 - tf_v1.reset_default_graph() - - # Create the graph and model - with tempfile.TemporaryDirectory(dir=self.test_directory) as tmp_dir: - with tf_v1.Session() as sess: - x = tf_v1.placeholder(tf_v1.float32, [2, 3], 'x') - y = tf_v1.placeholder(tf_v1.float32, [2, 3], 'y') - tf_v1.add(x, y, name="add") - - tf_v1.global_variables_initializer() - tf_v1.io.write_graph(sess.graph, tmp_dir, 'model.pb', as_text=False) - - # initialize test case and check - self.argv.input_model = os.path.join(tmp_dir, 'model.pb') - self.argv.input_model_is_text = False - self.argv.output_dir = tmp_dir - self.assertTrue(os.path.exists(self.argv.input_model), - "The test model in frozen binary format must exist") - # test convert_to_pb - expect no auxiliary model created - self.assertIsNone(convert_to_pb(self.argv)) - - def test_meta_format_session_clearing(self): - try: - import tensorflow.compat.v1 as tf_v1 - except ImportError: - import tensorflow as tf_v1 - - from openvino.tools.mo.utils.versions_checker import get_environment_setup - from distutils.version import LooseVersion - - env_setup = get_environment_setup("tf") - use_tf2 = False - if "tensorflow" in env_setup and env_setup["tensorflow"] >= LooseVersion("2.0.0"): - use_tf2 = True - - from tensorflow.python.eager.context import graph_mode - - with tempfile.TemporaryDirectory(dir=self.test_directory) as tmp_dir: - with graph_mode(): - a = tf_v1.get_variable("A", initializer=tf_v1.constant(3, shape=[2])) - b = tf_v1.get_variable("B", initializer=tf_v1.constant(5, shape=[2])) - tf_v1.add(a, b, name='Add') - init_op = tf_v1.global_variables_initializer() - saver = tf_v1.train.Saver() - with tf_v1.Session() as sess: - sess.run(init_op) - saver.save(sess, os.path.join(tmp_dir, 'model1')) - if use_tf2: - import tensorflow as tf - tf.keras.backend.clear_session() - - with graph_mode(): - c = tf_v1.get_variable("C", initializer=tf_v1.constant(3, shape=[2])) - d = tf_v1.get_variable("D", initializer=tf_v1.constant(5, shape=[2])) - tf_v1.add(c, d, name='Add1') - init_op = tf_v1.global_variables_initializer() - saver = tf_v1.train.Saver() - with tf_v1.Session() as sess: - sess.run(init_op) - saver.save(sess, os.path.join(tmp_dir, 'model2')) - if use_tf2: - import tensorflow as tf - tf.keras.backend.clear_session() - - self.argv.input_meta_graph = os.path.join(tmp_dir, 'model1.meta') - self.argv.output_dir = tmp_dir - path_to_pb = convert_to_pb(self.argv) - self.assertTrue(path_to_pb is None, "Auxiliary .pb must not be generated for .meta") - - self.argv.input_meta_graph = os.path.join(tmp_dir, 'model2.meta') - self.argv.output_dir = tmp_dir - self.argv.input_model = None - path_to_pb = convert_to_pb(self.argv) - self.assertTrue(path_to_pb is None, "Auxiliary .pb must not be generated for .meta")