From 0bdd4321534b17cf8577dee4d8d3678e9c65be64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=8B=E6=B1=9F=E5=A4=A9=E6=9E=A2?= Date: Thu, 13 Jan 2022 12:19:04 +0800 Subject: [PATCH] release v2.1 webapp --- webapp/CHANGELOG.md | 6 + webapp/babel.config.js | 2 +- webapp/package.json | 9 +- webapp/src/api/tadl/index.js | 292 +++++++++ webapp/src/api/tadl/strategy.js | 106 ++++ webapp/src/assets/styles/atomic.scss | 16 + webapp/src/assets/styles/common.scss | 4 + webapp/src/assets/styles/element-ui.scss | 26 + webapp/src/assets/styles/index.scss | 6 + webapp/src/assets/styles/mixin.scss | 7 + webapp/src/components/BaseTable/index.vue | 36 +- webapp/src/components/BaseTooltip/index.vue | 42 ++ webapp/src/components/Description/index.vue | 66 +++ webapp/src/components/Description/item.vue | 50 ++ webapp/src/components/IconFont/index.js | 2 +- .../src/components/InlineTableEdit/index.vue | 75 ++- webapp/src/components/ProTable/header.vue | 28 +- webapp/src/components/ProTable/index.vue | 72 ++- webapp/src/components/Statistic/index.vue | 43 ++ .../components/Training/saveModelDialog.vue | 23 +- webapp/src/components/YamlEditor/index.vue | 133 +++++ webapp/src/config/index.js | 1 + webapp/src/hooks/index.js | 1 + webapp/src/hooks/keepPageInfo/index.js | 55 ++ webapp/src/hooks/mapGetters/index.js | 2 +- webapp/src/layout/DetailLayout.vue | 55 +- webapp/src/lib/api-map/index.js | 7 +- webapp/src/store/modules/tadl.js | 50 ++ webapp/src/utils/VisualUtils/request.js | 5 +- webapp/src/utils/base.js | 21 + webapp/src/utils/constant.js | 7 +- webapp/src/utils/utils.js | 29 +- webapp/src/utils/validate.js | 9 + .../src/views/dataset/list/create-dataset.vue | 265 +++++---- .../src/views/dataset/list/import-dataset.vue | 380 ++---------- webapp/src/views/dataset/list/index.vue | 67 +-- .../views/dataset/list/upload-datafile.vue | 33 +- webapp/src/views/dataset/util/index.js | 16 +- webapp/src/views/system/menu/index.vue | 40 +- webapp/src/views/system/resources/utils.js | 1 + .../views/tadl/detail/components/chart.vue | 34 ++ .../tadl/detail/components/chartCard.vue | 34 ++ .../views/tadl/detail/components/config.vue | 59 ++ .../detail/components/detailDashboard.vue | 230 +++++++ .../views/tadl/detail/components/general.vue | 38 ++ .../tadl/detail/components/parameter.vue | 181 ++++++ .../tadl/detail/components/runParameter.vue | 282 +++++++++ .../tadl/detail/components/saveModelModal.vue | 134 +++++ .../detail/components/singleTrialStat.vue | 63 ++ .../src/views/tadl/detail/components/stat.vue | 69 +++ .../views/tadl/detail/components/trials.vue | 98 +++ .../tadl/detail/components/trialsList.vue | 383 ++++++++++++ webapp/src/views/tadl/detail/index.vue | 513 ++++++++++++++++ webapp/src/views/tadl/detail/retrain.vue | 141 +++++ webapp/src/views/tadl/detail/select.vue | 130 ++++ webapp/src/views/tadl/detail/stage.vue | 71 +++ webapp/src/views/tadl/detail/train.vue | 144 +++++ webapp/src/views/tadl/detail/util.js | 24 + .../tadl/formPage/components/tadlForm.vue | 406 +++++++++++++ .../formPage/components/tadlStageForm.vue | 523 ++++++++++++++++ webapp/src/views/tadl/formPage/index.vue | 170 ++++++ .../src/views/tadl/formPage/style/index.scss | 21 + webapp/src/views/tadl/formPage/utils.js | 48 ++ .../views/tadl/list/components/listStatus.vue | 127 ++++ webapp/src/views/tadl/list/index.vue | 220 +++++++ webapp/src/views/tadl/list/util.js | 175 ++++++ .../strategy/components/CreatePageForm.vue | 559 ++++++++++++++++++ .../strategy/components/ReleaseDialog.vue | 101 ++++ .../strategy/components/StrategyDrawer.vue | 514 ++++++++++++++++ webapp/src/views/tadl/strategy/index.vue | 329 +++++++++++ webapp/src/views/tadl/strategy/util.js | 75 +++ webapp/src/views/tadl/util.js | 184 ++++++ webapp/src/views/user/center.vue | 274 ++------- webapp/src/views/user/userInfo.vue | 231 ++++++++ webapp/yarn.lock | 295 ++++++++- 75 files changed, 8090 insertions(+), 878 deletions(-) create mode 100644 webapp/src/api/tadl/index.js create mode 100644 webapp/src/api/tadl/strategy.js create mode 100644 webapp/src/components/BaseTooltip/index.vue create mode 100644 webapp/src/components/Description/index.vue create mode 100644 webapp/src/components/Description/item.vue create mode 100644 webapp/src/components/Statistic/index.vue create mode 100644 webapp/src/components/YamlEditor/index.vue create mode 100644 webapp/src/hooks/keepPageInfo/index.js create mode 100644 webapp/src/store/modules/tadl.js create mode 100644 webapp/src/views/tadl/detail/components/chart.vue create mode 100644 webapp/src/views/tadl/detail/components/chartCard.vue create mode 100644 webapp/src/views/tadl/detail/components/config.vue create mode 100644 webapp/src/views/tadl/detail/components/detailDashboard.vue create mode 100644 webapp/src/views/tadl/detail/components/general.vue create mode 100644 webapp/src/views/tadl/detail/components/parameter.vue create mode 100644 webapp/src/views/tadl/detail/components/runParameter.vue create mode 100644 webapp/src/views/tadl/detail/components/saveModelModal.vue create mode 100644 webapp/src/views/tadl/detail/components/singleTrialStat.vue create mode 100644 webapp/src/views/tadl/detail/components/stat.vue create mode 100644 webapp/src/views/tadl/detail/components/trials.vue create mode 100644 webapp/src/views/tadl/detail/components/trialsList.vue create mode 100644 webapp/src/views/tadl/detail/index.vue create mode 100644 webapp/src/views/tadl/detail/retrain.vue create mode 100644 webapp/src/views/tadl/detail/select.vue create mode 100644 webapp/src/views/tadl/detail/stage.vue create mode 100644 webapp/src/views/tadl/detail/train.vue create mode 100644 webapp/src/views/tadl/detail/util.js create mode 100644 webapp/src/views/tadl/formPage/components/tadlForm.vue create mode 100644 webapp/src/views/tadl/formPage/components/tadlStageForm.vue create mode 100644 webapp/src/views/tadl/formPage/index.vue create mode 100644 webapp/src/views/tadl/formPage/style/index.scss create mode 100644 webapp/src/views/tadl/formPage/utils.js create mode 100644 webapp/src/views/tadl/list/components/listStatus.vue create mode 100644 webapp/src/views/tadl/list/index.vue create mode 100644 webapp/src/views/tadl/list/util.js create mode 100644 webapp/src/views/tadl/strategy/components/CreatePageForm.vue create mode 100644 webapp/src/views/tadl/strategy/components/ReleaseDialog.vue create mode 100644 webapp/src/views/tadl/strategy/components/StrategyDrawer.vue create mode 100644 webapp/src/views/tadl/strategy/index.vue create mode 100644 webapp/src/views/tadl/strategy/util.js create mode 100644 webapp/src/views/tadl/util.js create mode 100644 webapp/src/views/user/userInfo.vue diff --git a/webapp/CHANGELOG.md b/webapp/CHANGELOG.md index 461cc5f..32a1161 100644 --- a/webapp/CHANGELOG.md +++ b/webapp/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.1.0 (2021-12-22) + +### Breaking Change + +- [自动机器学习] 新增自动机器学习模块 + ## 2.0.0 (2021-08-30) ### Breaking Change diff --git a/webapp/babel.config.js b/webapp/babel.config.js index c7a6e46..eef0db8 100644 --- a/webapp/babel.config.js +++ b/webapp/babel.config.js @@ -8,5 +8,5 @@ if (process.env.NODE_ENV === "production") { } module.exports = { plugins, - presets: ["@vue/app"], + presets: [["@vue/app",{ useBuiltIns: "entry" }]], }; diff --git a/webapp/package.json b/webapp/package.json index b27500c..9c07f6d 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -1,6 +1,6 @@ { "name": "dubhe-web", - "version": "2.0.0", + "version": "2.1.0", "description": "之江天枢人工智能开源平台", "author": "zhejianglab", "keywords": [ @@ -41,6 +41,8 @@ "url": "git@codeup.teambition.com:zhejianglab/dubhe-web.git" }, "dependencies": { + "@antv/g2plot": "^2.3.17", + "@opd/g2plot-vue": "3.1.12", "@riophae/vue-treeselect": "0.1.0", "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", "@vue/composition-api": "^1.0.0-rc.1", @@ -51,6 +53,8 @@ "chroma-js": "^2.1.0", "classnames": "^2.2.6", "clipboard": "^2.0.6", + "codemirror": "^5.60.0", + "core-js": "^3.9.1", "d3": "^5.16.0", "d3-selection": "^1.4.1", "d3-zoom": "^1.8.3", @@ -68,6 +72,8 @@ "jquery-contextmenu": "^2.9.1", "js-beautify": "^1.13.0", "js-cookie": "2.2.0", + "js-yaml": "^4.0.0", + "jschardet": "^2.2.1", "jsencrypt": "^3.0.0-rc.1", "json2csv": "^5.0.1", "lodash": "^4.17.15", @@ -87,6 +93,7 @@ "screenfull": "^5.0.2", "stream-to-array": "^2.3.0", "streamsaver": "^2.0.4", + "url-join": "^4.0.1", "v-click-outside": "^3.0.1", "v-hotkey": "^0.8.0", "vee-validate": "^3.3.0", diff --git a/webapp/src/api/tadl/index.js b/webapp/src/api/tadl/index.js new file mode 100644 index 0000000..ac7196b --- /dev/null +++ b/webapp/src/api/tadl/index.js @@ -0,0 +1,292 @@ +/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================= + */ + +import request from '@/utils/request'; +import { API_MODULE_NAME } from '@/config'; + +export function list(params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment`, + method: 'get', + params, + }); +} + +// 创建/保存实验 +export function createExperiment(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment`, + method: 'post', + data, + }); +} + +// 编辑实验 +export function editExperiment(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment`, + method: 'put', + data, + }); +} + +// 查询实验详情的概览 +export function expDetailOverview(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}`, + method: 'get', + }); +} + +// 查询实验详情 +export function expDetail(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}/info`, + method: 'get', + }); +} + +// 查询阶段概览 +export function expStageInfo(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}`, + method: 'get', + }); +} + +// 查询阶段实验参数 +export function expStageParam(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}/param`, + method: 'get', + }); +} + +// 查询阶段运行中参数 +export function expStageRuntimeParam(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}/runtime/param`, + method: 'get', + }); +} + +// 修改阶段运行参数之trial并发数 +export function updateConcurrentNum(experimentId, stageOrder, trialConcurrentNum) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/update/ConcurrentNum`, + method: 'put', + data: { experimentId, stageOrder, trialConcurrentNum }, + }); +} + +// 修改阶段运行参数之trial最大值 +export function updateMaxTrialNum(experimentId, stageOrder, maxTrialNum) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/update/MaxTrialNum`, + method: 'put', + data: { experimentId, stageOrder, maxTrialNum }, + }); +} + +// 修改阶段运行参数之最大运行时间 +export function updateMaxExecDuration( + experimentId, + stageOrder, + maxExecDuration, + maxExecDurationUnit +) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/update/MaxExecDuration`, + method: 'put', + data: { experimentId, stageOrder, maxExecDuration, maxExecDurationUnit }, + }); +} + +// 查询阶段trial精度最高5条 +export function expStageTrialRep(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}/trial/rep`, + method: 'get', + }); +} + +// 查询实验配置信息 +export function expYaml(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}/yaml`, + method: 'get', + }); +} + +// 修改实验配置yaml +export function updateExpYaml(experimentId, stageOrder, yaml) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/update/yaml`, + method: 'put', + data: { yaml, experimentId, stageOrder }, + }); +} + +// 查询阶段trialsList列表 +export function expStageTrialList({ experimentId, stageOrder, current = 1, size = 1, ...args }) { + return request({ + url: `/${API_MODULE_NAME.TADL}/trial/${experimentId}/${stageOrder}/list`, + method: 'get', + params: { + experimentId, + stageOrder, + current, + size, + ...args, + }, + }); +} + +// 查询阶段运行标准输出数据 +export function expStageAccuracy(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/best/accuracy`, + method: 'get', + params: { + experimentId, + stageOrder, + }, + }); +} + +// 查询多trial图数据 +export function expStageTrialData(experimentId, stageOrder, params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}/trialData`, + method: 'get', + params, + }); +} + +// 查询阶段运行中间值 +export function expStageIntermediate(experimentId, stageOrder, trialIds = null) { + const params = { + experimentId, + stageOrder, + trialIds, + }; + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/intermediate/accuracy`, + method: 'get', + params, + }); +} + +export function expStageRuntime(experimentId, stageOrder) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/runTime`, + method: 'get', + params: { + experimentId, + stageOrder, + }, + }); +} + +// 启动实验 +export function startExp(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}/start`, + method: 'put', + }); +} + +// 暂停实验 +export function pauseExp(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}/pause`, + method: 'put', + }); +} + +// 删除实验 +export function deleteExp(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}`, + method: 'delete', + }); +} + +// 查询searchspace内容 +export function getSearchSpace(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}/searchSpace`, + method: 'get', + }); +} + +// 查询best selected space内容 +export function getSelectedSpace(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}/bestSelectedSpace`, + method: 'get', + }); +} + +// 查询实验config +export function getExpConfig(experimentId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${experimentId}/config`, + method: 'get', + }); +} + +// 查询实验总日志 +export function getExpLog(params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/${params.experimentId}/logs`, + method: 'get', + params, + }); +} + +// 查询trial日志详情 +export function trialLog(trialId, startLine = 1, lines = 50) { + return request({ + url: `/${API_MODULE_NAME.TADL}/trial/trialLog`, + method: 'get', + params: { + trialId, + startLine, + lines, + }, + }); +} + +/** + * /api/ {version} /tadl /experiment/{experimentId}/{stageOrder}/ {trialId} /model + */ +// 下载模型 +export function downloadModel(experimentId, stageOrder, trialId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/stage/${experimentId}/${stageOrder}/trial/${trialId}/model`, + method: 'get', + }); +} + +// 获取资源配置 +export function getResources(params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/experiment/resource`, + method: 'get', + params, + }); +} diff --git a/webapp/src/api/tadl/strategy.js b/webapp/src/api/tadl/strategy.js new file mode 100644 index 0000000..4f82443 --- /dev/null +++ b/webapp/src/api/tadl/strategy.js @@ -0,0 +1,106 @@ +/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================= + */ + +import request from '@/utils/request'; +import { API_MODULE_NAME } from '@/config'; + +// 算法解压 +export function unpackZip(params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/unzip`, + method: 'get', + params, + }); +} + +export function parseYamlParams(params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/yaml`, + method: 'get', + params, + }); +} + +export function getStrategyList(params) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/query`, + method: 'get', + params, + }); +} + +export function getVersionList(id) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/${id}/list`, + method: 'get', + }); +} + +export function uploadStrategy(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/upload`, + method: 'post', + data, + }); +} + +export function updateStrategy(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/update`, + method: 'post', + data, + }); +} + +export function getNextVersion(algorithmId) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/${algorithmId} /next/version`, + method: 'get', + params: { algorithmId }, + }); +} + +export function versionRelease(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/push/version`, + method: 'post', + data, + }); +} + +export function shiftVersion(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/version/switch`, + method: 'put', + data, + }); +} + +export function checkStrategy(params, id) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm/${id}/query`, + method: 'get', + params, + }); +} + +export function deleteVersion(data) { + return request({ + url: `/${API_MODULE_NAME.TADL}/algorithm`, + method: 'delete', + data, + }); +} diff --git a/webapp/src/assets/styles/atomic.scss b/webapp/src/assets/styles/atomic.scss index fef43c7..b944776 100644 --- a/webapp/src/assets/styles/atomic.scss +++ b/webapp/src/assets/styles/atomic.scss @@ -180,6 +180,10 @@ margin-left: 4px; } +.mr-4 { + margin-right: 4px; +} + .ml-10 { margin-left: 10px; } @@ -204,6 +208,10 @@ margin-left: auto; } +.mb-0 { + margin-bottom: 0; +} + .mb-50 { margin-bottom: 50px; } @@ -250,6 +258,10 @@ margin-bottom: auto; } +.w-80 { + width: 80px; +} + .w-100 { width: 100px; } @@ -411,3 +423,7 @@ img.responsive { width: 100vw; height: 100vh; } + +.multiple-lines { + @include multiple-lines; +} diff --git a/webapp/src/assets/styles/common.scss b/webapp/src/assets/styles/common.scss index b5fbc65..bc975a7 100644 --- a/webapp/src/assets/styles/common.scss +++ b/webapp/src/assets/styles/common.scss @@ -264,6 +264,10 @@ pre { color: $infoColor; } +.CodeMirror-lint-tooltip { + z-index: 10000 !important; +} + .app-result-content { padding: 24px 40px; margin-top: 24px; diff --git a/webapp/src/assets/styles/element-ui.scss b/webapp/src/assets/styles/element-ui.scss index 2f936f4..14db520 100644 --- a/webapp/src/assets/styles/element-ui.scss +++ b/webapp/src/assets/styles/element-ui.scss @@ -339,3 +339,29 @@ } } } + +.el-tooltip__popper.is-light { + border: none; + box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0; + + .popper__arrow { + border: none; + } +} + +.el-tabs-large .el-tabs__nav .el-tabs__item { + font-size: 16px; +} + +.el-card__footer { + padding-top: 20px; + margin-top: 8px; + border-top: 1px solid #f0f0f0; +} + +.el-form-item-explain { + min-height: 24px; + font-size: 14px; + line-height: 1.5715; + color: rgba(0, 0, 0, 0.45); +} diff --git a/webapp/src/assets/styles/index.scss b/webapp/src/assets/styles/index.scss index e0024ba..88d10e0 100644 --- a/webapp/src/assets/styles/index.scss +++ b/webapp/src/assets/styles/index.scss @@ -21,6 +21,7 @@ @import 'element-ui'; @import 'sidebar'; @import 'common'; +@import url('//at.alicdn.com/t/font_1756495_ohftzv0cq9c.css'); @media screen and (max-width: 768px) { .mb-dn { @@ -93,6 +94,11 @@ ol li { color: $primaryColor; } +.disabled { + color: $disableColor; + cursor: not-allowed; +} + .infoColor { color: $infoColor; } diff --git a/webapp/src/assets/styles/mixin.scss b/webapp/src/assets/styles/mixin.scss index 7678ea4..af57a77 100644 --- a/webapp/src/assets/styles/mixin.scss +++ b/webapp/src/assets/styles/mixin.scss @@ -43,6 +43,13 @@ white-space: nowrap; } +@mixin multiple-lines { + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; +} + @mixin relative { position: relative; width: 100%; diff --git a/webapp/src/components/BaseTable/index.vue b/webapp/src/components/BaseTable/index.vue index 7b7f318..7ff34bc 100644 --- a/webapp/src/components/BaseTable/index.vue +++ b/webapp/src/components/BaseTable/index.vue @@ -1,18 +1,10 @@ -/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================= - */ +/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License, +Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * +You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless +required by applicable law or agreed to in writing, software * distributed under the License is +distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. * See the License for the specific language governing permissions and * limitations under +the License. * ============================================================= */