diff --git a/mindinsight/ui/src/components/debugger-grid-table-simple.vue b/mindinsight/ui/src/components/debugger-grid-table-simple.vue index a7a77e39..bbfceaba 100644 --- a/mindinsight/ui/src/components/debugger-grid-table-simple.vue +++ b/mindinsight/ui/src/components/debugger-grid-table-simple.vue @@ -39,7 +39,7 @@ limitations under the License. @keyup.enter="filterChange">
{{$t('components.dimsFilterInputTitle')}} + class="el-icon-warning">
@@ -552,6 +552,7 @@ export default { * @param {Boolean} isUpdate Whether to reset */ showRequestErrorMessage(errorMsg, dimension, filterStr, isUpdate) { + this.shape = dimension; this.errorMsg = errorMsg; if ((!this.filterArr.length && dimension && filterStr) || isUpdate) { this.initializeFilterArr(dimension, filterStr); diff --git a/mindinsight/ui/src/components/debugger-tensor.vue b/mindinsight/ui/src/components/debugger-tensor.vue index d983bf3e..fb00acb8 100644 --- a/mindinsight/ui/src/components/debugger-tensor.vue +++ b/mindinsight/ui/src/components/debugger-tensor.vue @@ -176,7 +176,7 @@ limitations under the License. - +
{{$t('debugger.selectDetail')}}
@@ -197,36 +197,36 @@ limitations under the License.
-
+
{{$t('debugger.tensorMsg')}}
- {{ $t('debugger.max') }} {{ selectedStatistics.overall_max }} - {{ $t('debugger.min') }} {{ selectedStatistics.overall_min }} - {{ $t('debugger.mean') }} {{ selectedStatistics.overall_avg }} - {{ $t('debugger.nan') }} {{ selectedStatistics.overall_nan_count }} + {{ $t('debugger.max') }} {{ statistics.overall_max }} + {{ $t('debugger.min') }} {{ statistics.overall_min }} + {{ $t('debugger.mean') }} {{ statistics.overall_avg }} + {{ $t('debugger.nan') }} {{ statistics.overall_nan_count }} {{ $t('debugger.negativeInf') }} - {{ selectedStatistics.overall_neg_inf_count }} - {{ $t('debugger.inf') }} {{ selectedStatistics.overall_pos_inf_count }} - {{ $t('debugger.zero') }} {{ selectedStatistics.overall_zero_count }} + {{ statistics.overall_neg_inf_count }} + {{ $t('debugger.inf') }} {{ statistics.overall_pos_inf_count }} + {{ $t('debugger.zero') }} {{ statistics.overall_zero_count }} {{ $t('debugger.negativeNum') }} - {{ selectedStatistics.overall_neg_zero_count }} + {{ statistics.overall_neg_zero_count }} {{ $t('debugger.positiveNum') }} - {{ selectedStatistics.overall_pos_zero_count }} + {{ statistics.overall_pos_zero_count }}
-
+
{{ $t('debugger.watchList') }}
-
-
- {{ $t('debugger.watchPoint') }}{{item.id}} - {{ $t('symbols.colon') }} - - {{ getWatchPointContent(item) }} - +
+
+
+ {{ $t('debugger.watchPoint') }}{{item.id}} + {{ $t('symbols.colon') }} + + {{ getWatchPointContent(item) }} + +
@@ -274,13 +274,11 @@ export default { tensorGraphData: {}, tensorGraphviz: null, selectedNode: {}, - selectedStatistics: {}, - tensorShow: true, + statistics: {}, leftDataShow: true, tuningAdvice: [], tuningAdviceTitle: '', watchPoints: [], - actualValue: '', }; }, mounted() { @@ -326,39 +324,9 @@ export default { }); } }); - this.selectedNode = this.tensorGraphData[initPage ? this.curRowObj.name : this.selectedNode.name]; - - if (this.selectedNode.statistics && Object.keys(this.selectedNode.statistics).length) { - this.selectedStatistics = this.selectedNode.statistics; - } else { - const noStatistics = { - overall_avg: '--', - overall_count: '--', - overall_max: '--', - overall_min: '--', - overall_nan_count: '--', - overall_neg_inf_count: '--', - overall_neg_zero_count: '--', - overall_pos_inf_count: '--', - overall_pos_zero_count: '--', - overall_zero_count: '--', - }; - this.selectedStatistics = noStatistics; - } - if (this.selectedNode.watch_points && this.selectedNode.watch_points.length) { - this.watchPoints = this.selectedNode.watch_points.map((val) => { - return { - id: val.id, - condition: val.watch_condition.id, - params: val.watch_condition.params || [], - selected: false, - }; - }); - } else { - this.watchPoints = []; - } if (initPage) { + this.selectedNode.name = this.curRowObj.name; const dot = this.packageData(); this.initGraph(dot); } @@ -402,13 +370,12 @@ export default { } item.params.forEach((element) => { if (!element.actual_value) { - this.actualValue = this.$t('symbols.rightbracket'); + element.actual = this.$t('symbols.rightbracket'); } else { - this.actualValue = `${this.$t('debugger.actualValue')}${this.$t('symbols.colon')}${ + element.actual = `${this.$t('debugger.actualValue')}${this.$t('symbols.colon')}${ element.actual_value }${this.$t('symbols.rightbracket')}`; } - element.actual = this.actualValue; }); }); } else { @@ -482,7 +449,9 @@ export default { this.$parent.uniqueEdges(edges); edges.forEach((edge) => { - edgeStr += `<${edge.source}>-><${edge.target}>[label="${edge.count > 1 ? edge.count + 'tensor' : ''}"]`; + edgeStr += + `<${edge.source}>-><${edge.target}>[id="${edge.source}->${edge.target}";` + + `label="${edge.count > 1 ? edge.count + 'tensor' : ''}"]`; }); const initSetting = 'node[style="filled";fontsize="10px"];edge[fontsize="6px";];'; @@ -507,7 +476,7 @@ export default { `{rank=min;<${subGraphInput}>[shape="circle";` + `id="${subGraphInput}";width=0.02;fixedsize=true;` + `label=""]};`; - edgeStr += `<${name}>-><${subGraphInput}>[label="${slots.length}tensor"]`; + edgeStr += `<${name}>-><${subGraphInput}>[id="${name}->${subGraphInput}";label="${slots.length}tensor"]`; const outputKeys = Object.keys(node.output || {}); if (outputKeys.length) { @@ -525,7 +494,7 @@ export default { slotName === this.curRowObj.name ? ' current selected' : '' }";fillcolor="#c5e0b3"];`; - edgeStr += `<${subGraphInput}>-><${slotName}>;`; + edgeStr += `<${subGraphInput}>-><${slotName}>[id="${subGraphInput}->${slotName}"];`; }); strTemp = @@ -581,49 +550,18 @@ export default { graphDom.selectAll('title').remove(); this.initZooming(); - const nodes = graphDom.selectAll('.node.slot'); + const nodes = graphDom.selectAll('.node'); nodes.on('click', (target, index, nodesList) => { const event = currentEvent; event.stopPropagation(); event.preventDefault(); - const selectedNode = nodesList[index]; - d3.selectAll('.node').classed('selected', false); - selectedNode.classList.add('selected'); - this.selectedNode = this.tensorGraphData[selectedNode.id]; - if (this.selectedNode.statistics && Object.keys(this.selectedNode.statistics).length) { - this.selectedStatistics = this.selectedNode.statistics; - this.tensorShow = true; - } else { - const noStatistics = { - overall_avg: '--', - overall_count: '--', - overall_max: '--', - overall_min: '--', - overall_nan_count: '--', - overall_neg_inf_count: '--', - overall_neg_zero_count: '--', - overall_pos_inf_count: '--', - overall_pos_zero_count: '--', - overall_zero_count: '--', - }; - this.selectedStatistics = noStatistics; - } - if (this.selectedNode.watch_points && this.selectedNode.watch_points.length) { - this.watchPoints = this.selectedNode.watch_points.map((val) => { - return { - id: val.id, - condition: val.watch_condition.id, - params: val.watch_condition.params || [], - selected: false, - }; - }); - } else { - this.watchPoints = []; - } + this.selectedNode.name = nodesList[index].id; + this.setNodeData(); }); - nodes.on('dblclick', (target, index, nodesList) => { + const slots = graphDom.selectAll('.node.slot'); + slots.on('dblclick', (target, index, nodesList) => { const event = currentEvent; event.stopPropagation(); event.preventDefault(); @@ -646,6 +584,10 @@ export default { } } }); + + if (this.selectedNode.name) { + this.setNodeData(); + } }, /** * Initializing the Zoom Function of a Graph @@ -748,6 +690,84 @@ export default { graph0.on('.zoom', null); graph0.call(zoom); }, + setNodeData() { + window.getSelection().removeAllRanges(); + const selectedNode = document.querySelector(`g[id="${this.selectedNode.name}"]`); + d3.selectAll('.node').classed('selected', false); + selectedNode.classList.add('selected'); + d3.selectAll('.edge').classed('selected', false); + this.selectedNode = JSON.parse(JSON.stringify(this.tensorGraphData[this.selectedNode.name])); + + const keys = [ + 'overall_avg', + 'overall_count', + 'overall_max', + 'overall_min', + 'overall_nan_count', + 'overall_neg_inf_count', + 'overall_neg_zero_count', + 'overall_pos_inf_count', + 'overall_pos_zero_count', + 'overall_zero_count', + ]; + if (this.selectedNode.type === 'slot') { + if (!(this.selectedNode.statistics && Object.keys(this.selectedNode.statistics).length)) { + keys.forEach((key) => { + this.statistics[key] = '--'; + }); + } else { + this.statistics = JSON.parse(JSON.stringify(this.selectedNode.statistics)); + } + if (this.selectedNode.watch_points && this.selectedNode.watch_points.length) { + this.watchPoints = this.selectedNode.watch_points.map((val) => { + return { + id: val.id, + condition: val.watch_condition.id, + params: val.watch_condition.params || [], + selected: false, + }; + }); + } else { + this.watchPoints = []; + } + } else { + keys.forEach((key) => { + this.statistics[key] = '--'; + }); + this.watchPoints = []; + this.highLightEdges(); + } + }, + highLightEdges() { + const edges = []; + const input = this.selectedNode.input || {}; + const inputKeys = Object.keys(input); + if (inputKeys.length) { + inputKeys.forEach((key) => { + const mapping = input[key].slot_mapping; + if (mapping && mapping.length) { + mapping.forEach((map) => { + if (map && map.length) { + edges.push(`${key}:${map[0]}->outputOf${key}_slots`); + edges.push(`outputOf${key}_slots->${this.selectedNode.name}`); + } + }); + } + }); + } + + const slots = this.selectedNode.slots || []; + if (slots.length) { + edges.push(`${this.selectedNode.name}->inputOf${this.selectedNode.name}_slots`); + slots.forEach((slot) => { + edges.push(`inputOf${this.selectedNode.name}_slots->${this.selectedNode.name}:${slot.slot}`); + }); + } + + edges.forEach((edge) => { + d3.select(`#tensor-graph g[id="${edge}"]`).classed('selected', true); + }); + }, resetTensor() { const svg = document.querySelector('#tensor-graph svg'); if (svg) { @@ -763,7 +783,7 @@ export default { this.init(); }, closeTensor() { - this.$emit('close'); + this.$emit('close', this.selectedNode.name, this.curRowObj.graph_name); }, /** * Collaspe btn click function @@ -1042,6 +1062,7 @@ export default { .reason { display: flex; padding: 1px 15px; + width: 100%; } .tensor-icon { width: 6px; @@ -1050,10 +1071,11 @@ export default { } .icon-secondary { background-color: #00a5a7; - margin-top: 7px; + margin-top: 8px; } .tensor-content { - padding: 0px 6px; + padding-left: 6px; + width: calc(100% - 12px); } .tensor-value { padding: 5px 2px; @@ -1294,7 +1316,7 @@ export default { } } } - .node.slot { + .node { &:hover { cursor: pointer; & > polygon, @@ -1308,57 +1330,84 @@ export default { stroke: #e4e7ed; fill: #e9fcf9; } - .selected { + .node.selected { polygon, ellipse { stroke: red !important; stroke-width: 2px; } } + .edge.selected { + path { + stroke: red; + } + polygon { + stroke: red; + fill: red; + } + } } .deb-tensor-info { width: 375px; + height: 100%; border-left: solid 2px #e4e7ed; padding-left: 20px; - .tensor-title { - font-size: 14px; - font-weight: bold; - padding-bottom: 8px; - } - .tensor-detail { - overflow: auto; - height: calc(100% - 30px); - span { - display: inline-block; - padding: 5px 0px; - min-width: 50%; + .tensor { + .tensor-title { + font-size: 14px; + font-weight: bold; + padding-bottom: 8px; } - ul { - li { - padding: 5px 10px; - & > div { - display: inline-block; - vertical-align: top; - word-break: break-all; - line-height: 16px; - } - .attr-key { - width: 30%; - } - .attr-value { - width: 70%; - padding-left: 10px; - } - &:hover { - background-color: #e9fcf9; + .tensor-detail { + overflow: auto; + height: calc(100% - 30px); + span { + display: inline-block; + padding: 5px 0px; + min-width: 50%; + } + ul { + li { + padding: 5px 10px; + & > div { + display: inline-block; + vertical-align: top; + word-break: break-all; + line-height: 16px; + } + .attr-key { + width: 30%; + } + .attr-value { + width: 70%; + padding-left: 10px; + } + &:hover { + background-color: #e9fcf9; + } } } } } - .watchPoint-title { - padding: 8px 0; - font-size: 14px; - font-weight: bold; + .tensor { + height: 50%; + overflow: auto; + } + .watch-point { + height: 50%; + .point-list { + height: calc(100% - 35px); + overflow: auto; + text-overflow: ellipsis; + } + .watchPoint-title { + padding: 8px 0; + font-size: 14px; + font-weight: bold; + } + .watch-judgment { + padding: 5px 0; + } } } } diff --git a/mindinsight/ui/src/locales/en-us.json b/mindinsight/ui/src/locales/en-us.json index 17adec33..708ab63b 100644 --- a/mindinsight/ui/src/locales/en-us.json +++ b/mindinsight/ui/src/locales/en-us.json @@ -522,7 +522,7 @@ "negativeNum": "Negative number:", "all": "All", "tensorTip": "tensor", - "recheck": "Recheck", + "recheck": "Recheck (only for watchpoints with tensor values)", "clearWatchpoint": "Clear Watchpoint", "nodeType": { "all": "All", @@ -541,6 +541,8 @@ "jumpFailInformation": "Redirection fails because the tensor information is empty.", "optimizationOrientation": "Optimization Guide", "tuningAdvice": "Optimization Suggestions", + "setValue": "Preset Value", + "actualValue": "Actual Value", "tensorTuningRule": { "operator_real_data_validation": "Real data validation using single operator", "loss_overflow": "Loss overflow (NAN,INF)", @@ -568,7 +570,21 @@ "tensor_all_zero": "Whether tensor values are all 0", "tensor_change_too_large": "Tensor change above threshold", "tensor_change_too_small": "Tensor change below threshold", - "tensor_not_changed": "Unchanged tensor" + "tensor_not_changed": "Unchanged tensor", + "zero_percentage_ge": "Percentage of 0 values ≥", + "abs_mean_gt": "Average of the absolute value >", + "abs_mean_lt": "Average of the absolute value <", + "range_start_inclusive": "Lower limit of the range (inclusive)", + "range_end_inclusive": "Upper limit of the range (inclusive)", + "range_percentage_lt": "Percentage of the value in the range <", + "range_percentage_gt": "Percentage of the value in the range >", + "rtol": "Relative tolerance", + "abs_updata_ratio_mean_gt": "Average of the absolute value of the change ratio >", + "abs_updata_ratio_mean_lt": "Average of the absolute value of the change ratio <", + "param": "Threshold", + "max_min_lt": "MAX-MIN <", + "max_min_gt": "MAX-MIN >", + "outdateTip": "When a watchpoint list is modified, the result may be outdated. Check again or perform subsequent step training. " }, "tensorTuningAdvice": { "operator_real_data_validation": [ @@ -701,7 +717,13 @@ "noAdvice": "No suggestions available", "curStep": "Current Step", "preStep": "Previous Step", - "compareResult": "Comparison Result" + "compareResult": "Comparison Result", + "recommendTip": "Use the recommended watchpoints?", + "recommendDetail": "The recommended watchpoints check zero tensors, gradient disappearances, and update weight above threshold, helping you quickly detect faults in training. ", + "use": "Yes", + "notUse": "No", + "versionConflictTip": "MindSpore and MindInsight versions do not match. MindSpore version: {msv}; MindInsight version: {miv}", + "checkTips": "Note: The tensor contains {msg}, resulting in value check failure. " }, "explain": { "explain": "Model Explanation", diff --git a/mindinsight/ui/src/locales/zh-cn.json b/mindinsight/ui/src/locales/zh-cn.json index 7576fd07..5029083d 100644 --- a/mindinsight/ui/src/locales/zh-cn.json +++ b/mindinsight/ui/src/locales/zh-cn.json @@ -521,7 +521,7 @@ "negativeNum": "负数:", "all": "全部", "tensorTip": "张量", - "recheck": "重新检查", + "recheck": "重新检查(只针对目前有张量值的监测点)", "clearWatchpoint": "清空监测点", "nodeType": { "all": "全部节点", @@ -581,8 +581,8 @@ "abs_updata_ratio_mean_gt": "变化比例绝对值的平均值>", "abs_updata_ratio_mean_lt": "变化比例绝对值的平均值<", "param": "阈值", - "max_min_lt": "MAX-MIN>", - "max_min_gt": "MAX-MIN<" + "max_min_lt": "MAX-MIN<", + "max_min_gt": "MAX-MIN>" }, "tensorTuningAdvice": { "operator_real_data_validation": [ @@ -717,7 +717,7 @@ "use": "使用", "notUse": "不使用", "outdateTip": "监测点列表发生修改,结果可能过时,请重新检查或执行后续step训练。", - "versionConflictTip": "Mindspore和Mindinsight版本不匹配,Mindspore版本:{msv};Mindinsight版本:{miv};", + "versionConflictTip": "MindSpore和MindInsight版本不匹配,MindSpore版本:{msv};MindInsight版本:{miv};", "checkTips": "提示:张量中含有{msg},无法进行数值检查。" }, "explain": { diff --git a/mindinsight/ui/src/mixins/debugger-mixin.vue b/mindinsight/ui/src/mixins/debugger-mixin.vue index 567c38c3..75c7688b 100644 --- a/mindinsight/ui/src/mixins/debugger-mixin.vue +++ b/mindinsight/ui/src/mixins/debugger-mixin.vue @@ -114,16 +114,16 @@ export default { label: val.name.split('/').pop(), leaf: val.type === 'name_scope' || val.type === 'aggregation_scope' ? false : true, ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); this.resolve(this.origialTree); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox this.node.childNodes.forEach((val) => { - if (val.data.watched === 2 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } - if (val.data.watched === 1 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.indeterminate) { val.indeterminate = true; } }); @@ -536,7 +536,7 @@ export default { if (res && res.data && res.data.metadata) { this.enableRecheck = res.data.metadata.enable_recheck; } - this.$message.success(this.$t('debugger.recheckSucess')); + this.$message.success(this.$t('debugger.recheckSuccess')); }, (err) => {}, ); @@ -583,13 +583,13 @@ export default { cancelButtonText: this.$t('public.cancel'), type: 'warning', }).then(() => { - if (!item) { - this.curWatchPointId = null; - this.watchPointArr = []; - } const params = {watch_point_id: item ? item.id : null}; RequestService.deleteWatchpoint(params).then( (res) => { + if (!item) { + this.curWatchPointId = null; + this.watchPointArr = []; + } this.loadOriginalTree(); this.queryWatchPoints(); this.$message.success(this.$t('debugger.successDeleteWP')); @@ -767,7 +767,7 @@ export default { if (this.curWatchPointId) { this.$refs.tree.getCheckedKeys().forEach((val) => { const node = this.$refs.tree.getNode(val); - if (node.data.type === this.unCheckedNodeType) { + if (node.data.watched === this.checkboxStatus.noCheckbox) { node.checked = false; } }); @@ -822,9 +822,7 @@ export default { const parent = node.parent; if ( parent && - !parent.childNodes - .filter((val) => val.data.type !== this.unCheckedNodeType) - .find((val) => val.checked === false) + !parent.childNodes.filter((val) => val.data.watched !== -1).find((val) => val.checked === false) ) { parent.checked = true; parent.indeterminate = false; @@ -837,19 +835,45 @@ export default { if (node.childNodes) { this.dealCheckPro(node.childNodes, node.indeterminate || check); } + const checkedKeys = this.$refs.searchTree.getCheckedKeys(); + const watchNodes = []; + if (this.searchCheckedArr.length === checkedKeys.length) { + return; + } else if (this.searchCheckedArr.length > checkedKeys.length) { + watchNodes.push(obj.name); + } else { + checkedKeys.forEach((val) => { + if (this.searchCheckedArr.indexOf(val) === -1) { + watchNodes.push(val); + } + }); + } const params = { watch_point_id: this.curWatchPointId ? this.curWatchPointId : 0, - watch_nodes: [obj.name], + watch_nodes: watchNodes, mode: check ? 1 : 0, graph_name: this.graphFiles.value, - search_pattern: {name: this.searchedWord, node_category: obj.type}, + search_pattern: {name: this.searchedWord}, }; if (this.graphFiles.value === this.$t('debugger.all')) { delete params.graph_name; } + if (this.nodeTypes.value !== 'all') { + params.search_pattern.node_category = this.nodeTypes.value; + } RequestService.updateWatchpoint(params).then( (res) => { + this.searchCheckedArr = checkedKeys; this.enableRecheck = res.data.metadata.enable_recheck; + this.$nextTick(() => { + if (node.indeterminate) { + node.checked = true; + node.indeterminate = false; + } + if (check) { + this.dealParentNode(node); + } + }); }, (err) => { this.showErrorMsg(err); @@ -863,7 +887,7 @@ export default { dealCheckPro(childNodes, check) { childNodes.forEach((val) => { val.indeterminate = false; - if (val.data.type !== this.unCheckedNodeType) { + if (val.data.watched !== -1) { val.checked = check; } else { val.checked = false; @@ -924,13 +948,14 @@ export default { if (res.data && res.data.nodes) { this.searchTreeData = res.data.nodes; this.searchHalfCheckedArr = []; + this.searchCheckedArr = []; this.dealSearchResult(this.searchTreeData); - this.defaultCheckedArr = this.searchCheckedArr; this.searchNode.childNodes = []; const data = res.data.nodes.map((val) => { return { label: val.name.split('/').pop(), ...val, + showCheckbox: val.watched !== -1, }; }); const currentData = JSON.parse(JSON.stringify(data)); @@ -938,14 +963,17 @@ export default { val.nodes = []; }); this.searchResolve(currentData); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox this.searchNode.childNodes.forEach((val) => { - if (val.data.watched === 1) { + if (val.data.watched === this.checkboxStatus.indeterminate) { val.indeterminate = true; } - if (val.data.watched === 2) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } + if (val.data.watched === this.checkboxStatus.unchecked) { + val.checked = false; + } }); data.forEach((val, key) => { if (val.nodes && val.nodes.length) { @@ -971,16 +999,20 @@ export default { const node = this.$refs.searchTree.getNode(val.parentName); val.label = val.name.split('/').pop(); val.leaf = val.type === 'name_scope' || val.type === 'aggregation_scope' ? false : true; + val.showCheckbox = val.watched !== -1; this.$refs.searchTree.append(val, node); node.expanded = true; - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox node.childNodes.forEach((value) => { - if (value.data.watched === 1) { + if (value.data.watched === this.checkboxStatus.indeterminate) { value.indeterminate = true; } - if (value.data.watched === 2) { + if (value.data.watched === this.checkboxStatus.checked) { value.checked = true; } + if (value.data.watched === this.checkboxStatus.unchecked) { + value.checked = false; + } }); if (val.nodes && val.nodes.length) { val.nodes.forEach((value) => { @@ -999,8 +1031,8 @@ export default { if (val.nodes) { this.dealSearchResult(val.nodes); } - // watched 0:unchecked 1:indeterminate 2:checked - if (val.watched === 2 && val.type !== this.unCheckedNodeType) { + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox + if (val.watched === this.checkboxStatus.checked) { this.searchCheckedArr.push(val.name); } val.label = val.name.split('/').pop(); @@ -1113,32 +1145,32 @@ export default { label: val.name.split('/').pop(), leaf: val.type === 'name_scope' || val.type === 'aggregation_scope' ? false : true, ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); resolve(this.curNodeData); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox this.defaultCheckedArr = this.defaultCheckedArr.concat( this.curNodeData .filter((val) => { - return val.watched === 2 && val.type !== this.unCheckedNodeType; + return val.watched === this.checkboxStatus.checked; }) .map((val) => val.name), ); const halfSelectArr = this.curNodeData .filter((val) => { - return val.watched === 1 && val.type !== this.unCheckedNodeType; + return val.watched === this.checkboxStatus.indeterminate; }) .map((val) => val.name); node.childNodes.forEach((val) => { if (halfSelectArr.indexOf(val.data.name) !== -1) { val.indeterminate = true; node.indeterminate = true; - [...new Set(curHalfCheckedKeys.concat(this.$refs.tree.getHalfCheckedKeys()))].forEach((val) => { - this.$refs.tree.getNode(val).indeterminate = true; - }); } }); + [...new Set(curHalfCheckedKeys.concat(this.$refs.tree.getHalfCheckedKeys()))].forEach((val) => { + this.$refs.tree.getNode(val).indeterminate = true; + }); this.selectedNode.name = node.data.name; if (!this.allGraphData[node.data.name].isUnfold) { this.dealGraphData(JSON.parse(JSON.stringify(graph.nodes)), node.data.name); @@ -1200,28 +1232,35 @@ export default { label: val.name.split('/').pop(), leaf: val.type === 'name_scope' || val.type === 'aggregation_scope' ? false : true, ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); resolve(this.curNodeData); - // watched 0:unchecked 1:indeterminate 2:checked + this.searchCheckedArr = this.searchCheckedArr.concat( + this.curNodeData + .filter((val) => { + return val.watched === this.checkboxStatus.checked; + }) + .map((val) => val.name), + ); + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox const halfSelectArr = this.curNodeData .filter((val) => { - return val.watched === 1; + return val.watched === this.checkboxStatus.indeterminate; }) .map((val) => val.name); node.childNodes.forEach((val) => { - if (val.data.watched === 2) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } if (halfSelectArr.indexOf(val.data.name) !== -1) { val.indeterminate = true; node.indeterminate = true; - [...new Set(curHalfCheckedKeys.concat(this.$refs.searchTree.getHalfCheckedKeys()))].forEach((val) => { - this.$refs.searchTree.getNode(val).indeterminate = true; - }); } }); + [...new Set(curHalfCheckedKeys.concat(this.$refs.searchTree.getHalfCheckedKeys()))].forEach((val) => { + this.$refs.searchTree.getNode(val).indeterminate = true; + }); } }); } @@ -1256,7 +1295,7 @@ export default { if (val.id) { val.selected = true; this.curWatchPointId = val.id; - if (this.searchWord === '') { + if (this.searchWord === '' && this.nodeTypes.value === 'all') { this.queryGraphByWatchpoint(val.id); } else { this.filter(); @@ -1321,26 +1360,22 @@ export default { return { label: val.name.split('/').pop(), ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); const node = this.$refs.tree.getNode(name); curNodeData.forEach((val) => { this.$refs.tree.append(val, name); }); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox node.childNodes.forEach((val) => { - if ( - node.checked && - !node.childNodes.find((val) => val.data.watched !== 2) && - val.data.type !== this.unCheckedNodeType - ) { + if (node.checked && !node.childNodes.find((val) => val.data.watched !== 2) && val.data.watched !== -1) { val.checked = true; } - if (val.data.watched === 2 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } - if (val.data.watched === 1 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.indeterminate) { val.indeterminate = true; } if (val.data.type !== 'name_scope' && val.data.type !== 'aggregation_scope') { @@ -1354,9 +1389,7 @@ export default { this.$nextTick(() => { if ( node.indeterminate && - !node.childNodes - .filter((val) => val.data.type !== this.unCheckedNodeType) - .find((val) => val.checked === false) + !node.childNodes.filter((val) => val.data.watched !== -1).find((val) => val.checked === false) ) { node.indeterminate = false; node.checked = true; @@ -1431,7 +1464,7 @@ export default { .map((k) => !k.actual_value ? `${this.transCondition(k.name)}: ${this.$t('debugger.setValue')}:${k.value}` - : `${this.transCondition(k.name)}: ${this.$t('debugger.setValue')}:${k.value}${this.$t( + : `${this.transCondition(k.name)}: ${this.$t('debugger.setValue')}:${k.value}, ${this.$t( 'debugger.actualValue', )}:${k.actual_value}`, ) @@ -1443,9 +1476,7 @@ export default { obj.lists.push({ name: item, id: `${key}${hit.node_name}`, - tip: j.watch_condition.error_code - ? this.$t('debugger.checkTips', {msg: tipsMapping[j.watch_condition.error_code]}) - : '', + tip: j.error_code ? this.$t('debugger.checkTips', {msg: tipsMapping[j.error_code]}) : '', }); }); } @@ -1599,7 +1630,7 @@ export default { return { label: val.name.split('/').pop(), ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); data.forEach((val) => { @@ -1613,12 +1644,12 @@ export default { } }); const node = this.$refs.tree.getNode(children.scope_name); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox node.childNodes.forEach((val) => { - if (val.data.watched === 2 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } - if (val.data.watched === 1 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.indeterminate) { val.indeterminate = true; } if (val.data.type !== 'name_scope' && val.data.type !== 'aggregation_scope') { @@ -1649,16 +1680,16 @@ export default { label: val.name.split('/').pop(), leaf: val.type === 'name_scope' || val.type === 'aggregation_scope' ? false : true, ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); this.resolve(this.origialTree); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox this.node.childNodes.forEach((val) => { - if (val.data.watched === 2 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } - if (val.data.watched === 1 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.indeterminate) { val.indeterminate = true; } }); diff --git a/mindinsight/ui/src/views/debugger/debugger.vue b/mindinsight/ui/src/views/debugger/debugger.vue index 44ff223a..02067fb6 100644 --- a/mindinsight/ui/src/views/debugger/debugger.vue +++ b/mindinsight/ui/src/views/debugger/debugger.vue @@ -20,7 +20,8 @@ limitations under the License.
- {{radio1==='tree' ? $t('debugger.nodeList') : $t('debugger.curHitNode')}} + {{radio1==='tree' ? $t('debugger.nodeList') : + ($t('debugger.curHitNode') + '(' + watchPointHits.length + ')')}}
{{ node.label }} - + - + @@ -149,7 +150,7 @@ limitations under the License. {{ node.label }} - +
@@ -165,12 +166,13 @@ limitations under the License.
@@ -449,7 +451,7 @@ limitations under the License. v-if="tensorCompareFlag"> + @close="closeTensor">
{ - return val.watched === 2 && val.type !== this.unCheckedNodeType; + return val.watched === this.checkboxStatus.checked; }) .map((val) => val.name); this.node.childNodes.forEach((val) => { - if (val.data.watched === 1 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.indeterminate) { val.indeterminate = true; } - if (val.data.watched === 0) { + if (val.data.watched === this.checkboxStatus.unchecked) { val.checked = false; } - if (val.data.watched === 2 && val.data.type !== this.unCheckedNodeType) { + if (val.data.watched === this.checkboxStatus.checked) { val.checked = true; } }); @@ -935,7 +948,7 @@ export default { return { label: val.name.split('/').pop(), ...val, - showCheckbox: val.type !== this.unCheckedNodeType, + showCheckbox: val.watched !== -1, }; }); this.node.childNodes = []; @@ -944,15 +957,15 @@ export default { this.$refs.tree.getCheckedKeys().forEach((val) => { this.$refs.tree.setChecked(val, false); }); - // watched 0:unchecked 1:indeterminate 2:checked + // watched 0:unchecked 1:indeterminate 2:checked -1:no checkbox this.defaultCheckedArr = this.curNodeData .filter((val) => { - return val.watched === 2 && val.type !== this.unCheckedNodeType; + return val.watched === this.checkboxStatus.checked; }) .map((val) => val.name); const halfSelectArr = this.curNodeData .filter((val) => { - return val.watched === 1 && val.type !== this.unCheckedNodeType; + return val.watched === this.checkboxStatus.indeterminate; }) .map((val) => val.name); this.node.childNodes.forEach((val) => { @@ -1734,6 +1747,10 @@ export default { color: #00a5a7; cursor: pointer; } + .disable:before { + cursor: not-allowed; + color: #adb0b8; + } } .content-wrap { padding-left: 20px;