import G6 from '@antv/g6';
import Tooltip from '../../src/tooltip';
const div = document.createElement('div');
div.id = 'tooltip-plugin';
document.body.appendChild(div);
const data = {
nodes: [
{
id: 'node1',
label: 'node1',
x: 100,
y: 100,
},
{
id: 'node2',
label: 'node2',
x: 150,
y: 300,
},
],
edges: [
{
source: 'node1',
target: 'node2',
},
],
};
describe('tooltip', () => {
it('tooltip with default', () => {
const tooltip = new Tooltip();
const graph = new G6.Graph({
container: div,
width: 500,
height: 500,
plugins: [tooltip],
modes: {
default: ['drag-node', 'zoom-canvas', 'drag-canvas'],
},
defaultNode: {
type: 'rect',
},
defaultEdge: {
style: {
lineAppendWidth: 20,
},
},
});
graph.data(data);
graph.render();
const tooltipPlugin = graph.get('plugins')[0];
expect(tooltipPlugin.get('offsetX')).toBe(6);
expect(tooltipPlugin.get('tooltip').outerHTML).toBe(
`
`,
);
graph.emit('node:mouseenter', { item: graph.getNodes()[0] });
expect(tooltipPlugin.get('tooltip').style.visibility).toEqual('visible');
graph.emit('node:mouseleave', { item: graph.getNodes()[0] });
expect(tooltipPlugin.get('tooltip').style.visibility).toEqual('hidden');
graph.destroy();
});
it('tooltip with dom', () => {
const tooltip = new Tooltip({
offsetX: 10,
getContent(e) {
const outDiv = document.createElement('div');
outDiv.style.width = '180px';
outDiv.innerHTML = `
自定义tooltip
- Label: ${e.item.getModel().label || e.item.getModel().id}
`;
return outDiv;
},
});
expect(tooltip.get('offsetX')).toBe(10);
const graph = new G6.Graph({
container: div,
width: 500,
height: 500,
plugins: [tooltip],
modes: {
default: ['drag-node', 'zoom-canvas', 'drag-canvas'],
},
defaultEdge: {
style: {
lineAppendWidth: 20,
},
},
});
graph.data(data);
graph.render();
const tooltipPlugin = graph.get('plugins')[0];
expect(tooltipPlugin.get('offsetX')).toBe(10);
graph.destroy();
});
it('tooltip with string', () => {
const tooltip = new Tooltip({
getContent(e) {
return `
`;
},
});
expect(tooltip.get('offsetX')).toBe(6);
const graph = new G6.Graph({
container: div,
width: 500,
height: 500,
plugins: [tooltip],
modes: {
default: ['drag-node', 'zoom-canvas', 'drag-canvas'],
},
});
graph.data(data);
graph.render();
graph.destroy();
});
it('tooltip fix to item', () => {
data.nodes[0].x = 120;
data.nodes[0].y = 20;
data.nodes[1].x = 450;
data.nodes[1].y = 450;
const offsetX = 0 // 5 + 20; // 当前 canvas 的左侧元素宽度总和
const offsetY = 0 // 162 + 20; // 当前 canvas 的上方元素高度总和
const fixToNode = [1, 0.5];
const tooltip = new Tooltip({
getContent(e) {
return `
`;
},
fixToNode,
offsetX,
offsetY,
trigger: 'click'
});
const graph = new G6.Graph({
container: div,
width: 500,
height: 500,
plugins: [tooltip],
modes: {
default: ['drag-node', 'zoom-canvas', 'drag-canvas'],
},
});
graph.getContainer().style.backgroundColor = '#ccc'
graph.data(data);
graph.render();
const tooltipPlugin = graph.get('plugins')[0];
graph.emit('node:click', { item: graph.getNodes()[0] });
const dom = tooltipPlugin.get('tooltip')
expect(dom.style.visibility).toEqual('visible');
const nodeBBox = graph.getNodes()[0].getBBox();
const expectPoint = {
x: nodeBBox.minX + nodeBBox.width * fixToNode[0],
y: nodeBBox.minY + nodeBBox.height * fixToNode[1]
}
const expectCanvasXY = graph.getCanvasByPoint(expectPoint.x, expectPoint.y);
const graphContainer = graph.getContainer();
expectCanvasXY.x += graphContainer.offsetLeft + offsetX;
expectCanvasXY.y += graphContainer.offsetTop + offsetY;
expect(dom.style.left).toEqual(`${expectCanvasXY.x}px`)
expect(dom.style.top).toEqual(`${expectCanvasXY.y}px`)
graph.emit('canvas:click', { item: graph.getNodes()[0] });
expect(dom.style.visibility).toEqual('hidden');
graph.emit('node:click', { item: graph.getNodes()[1] });
const nodeBBox2 = graph.getNodes()[0].getBBox();
const expectPoint2 = {
x: nodeBBox2.minX + nodeBBox2.width * fixToNode[0],
y: nodeBBox2.minY + nodeBBox2.height * fixToNode[1]
}
const expectCanvasXY2 = graph.getCanvasByPoint(expectPoint2.x, expectPoint2.y);
expectCanvasXY2.x += graphContainer.offsetLeft + offsetX;
expectCanvasXY2.y += graphContainer.offsetTop + offsetY;
// 此时超出了下边界和右边界
const bbox = dom.getBoundingClientRect();
expectCanvasXY2.x -= bbox.width + offsetX;
expectCanvasXY2.y -= bbox.height + offsetY;
// 由于测试界面图上方的 DOM 未渲染出来导致的误差,下面内容无法判断
// expect(dom.style.left === `${expectCanvasXY2.x}px`).toEqual(true)
// expect(dom.style.top === `${expectCanvasXY2.y}px`).toEqual(true)
graph.destroy();
});
});
describe('tooltip mouse out of view', () => {
it('tooltip mouse out of view', () => {
// 扩展studio节点
G6.registerNode(
'pai-studio-node',
{
afterDraw(cfg: any, group: any) {
if (cfg.ports) {
const [width, height] = cfg.size;
const ports = [...(cfg.ports?.inputPorts ?? []), ...(cfg.ports?.outputPorts ?? [])];
const anchorPoints = getAnchorPoints(cfg.ports?.inputPorts ?? [], cfg.ports?.outputPorts ?? []);
anchorPoints.forEach((point, index) => {
let text = 'undefined';
if (cfg.ports) {
if (!ports[index].desc) {
return;
}
text = ports[index].desc;
}
const textWidth = parseInt(G6.Util.getTextSize(text, 12)[0]) + 28;
const x = point[0] * width - width / 2;
const y = point[1] * height - height / 2;
const rectTranslateY = point[1] === 0 ? -40 - 14 : 14;
const textTranslateY = point[1] === 0 ? -40 - 14 + 20 : 14 + 20;
group.addShape('circle', {
attrs: {
x,
y,
r: 5,
fill: '#fff',
stroke: '#8086a2',
cursor: 'pointer',
opacity: 0,
},
name: 'link-point',
index,
model: ports[index],
tooltip: {
rect: {
attrs: {
x: x - textWidth / 2,
y: y + rectTranslateY,
width: textWidth,
height: 40,
fill: 'rgba(0, 0, 0, 0.75)',
radius: [4, 4],
},
name: 'link-point-tooltip-rect-shape',
index,
},
text: {
attrs: {
text,
x: x - textWidth / 2 + 8,
y: y + textTranslateY,
fontSize: 12,
textAlign: 'left',
textBaseline: 'middle',
fill: '#fff',
},
name: 'link-point-tooltip-text-shape',
index,
},
arrow: {
attrs: {
x,
y: point[1] === 0 ? -30.6 : 30.6,
r: 4,
fill: 'rgba(0, 0, 0, 0.75)',
symbol: point[1] === 0 ? 'triangle-down' : 'triangle',
},
name: 'link-point-tooltip-arrow-shape',
index,
},
},
});
});
}
group.addShape('rect', {
attrs: {
x: -86,
y: -16,
width: 32,
height: 32,
stroke: null,
fill: '#f00',
radius: [12, 12],
},
zIndex: 1,
name: 'rect-shape',
});
group.addShape('image', {
attrs: {
x: -78,
y: -8,
width: 16,
height: 16,
img: 'https://img.alicdn.com/tfs/TB1fyIo3KL2gK0jSZFmXXc7iXXa-200-200.png',
},
name: 'logo-icon',
zIndex: 10,
});
},
afterUpdate(cfg: any, node: any) {
const g = node._cfg.group;
const children = g.get('children');
const anchors = children.filter((child) => {
return child.cfg.name === 'link-point';
});
if (anchors.length) {
anchors.forEach((item) => {
g.removeChild(item);
});
}
if (cfg.ports) {
const [width, height] = cfg.size;
const ports = [...(cfg.ports?.inputPorts ?? []), ...(cfg.ports?.outputPorts ?? [])];
const anchorPoints = getAnchorPoints(cfg.ports?.inputPorts ?? [], cfg.ports?.outputPorts ?? []);
anchorPoints.forEach((point, index) => {
let text = 'undefined';
if (cfg.ports) {
if (!ports[index].desc) {
return;
}
text = ports[index].desc;
}
const textWidth = parseInt(G6.Util.getTextSize(text, 12)[0]) + 28;
const x = point[0] * width - width / 2;
const y = point[1] * height - height / 2;
const rectTranslateY = point[1] === 0 ? -40 - 14 : 14;
const textTranslateY = point[1] === 0 ? -40 - 14 + 20 : 14 + 20;
g.addShape('circle', {
attrs: {
x,
y,
r: 5,
fill: '#fff',
stroke: '#8086a2',
cursor: 'pointer',
opacity: 0,
},
name: 'link-point',
index,
model: ports[index],
tooltip: {
rect: {
attrs: {
x: x - textWidth / 2,
y: y + rectTranslateY,
width: textWidth,
height: 40,
fill: 'rgba(0, 0, 0, 0.75)',
radius: [4, 4],
},
name: 'link-point-tooltip-rect-shape',
index,
},
text: {
attrs: {
text,
x: x - textWidth / 2 + 8,
y: y + textTranslateY,
fontSize: 12,
textAlign: 'left',
textBaseline: 'middle',
fill: '#fff',
},
name: 'link-point-tooltip-text-shape',
index,
},
arrow: {
attrs: {
x,
y: point[1] === 0 ? -30.6 : 30.6,
r: 4,
fill: 'rgba(0, 0, 0, 0.75)',
symbol: point[1] === 0 ? 'triangle-down' : 'triangle',
},
name: 'link-point-tooltip-arrow-shape',
index,
},
},
});
});
}
const nodeStatus = cfg.Status;
const nodeStatusType = cfg.StatusType;
const { group } = node._cfg;
const icon = group.find((item) => {
return item.cfg.name === 'status-icon';
});
if (icon) {
if (icon.cfg?.Status === nodeStatus && icon.cfg?.StatusType === nodeStatusType) {
return;
} else {
group.removeChild(icon);
}
}
let statusIcon;
if (cfg.StatusType === 1) {
statusIcon = statusMap['Edited'];
} else {
statusIcon = status.includes(nodeStatus) ? statusMap[nodeStatus] : null;
}
if (statusIcon) {
const image = group.addShape('image', {
// 节点状态图标
attrs: {
x: 68,
y: -8,
width: 16,
height: 16,
img: statusIcon,
},
name: 'status-icon',
status: nodeStatus,
});
if (nodeStatus === 'Running') {
image.animate(
(ratio) => {
const matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];
const toMatrix = G6.Util.transform(matrix, [
['t', -76, 0],
['r', ratio * Math.PI * 2],
['t', 76, 0],
]);
return {
matrix: toMatrix,
};
},
{
repeat: true,
duration: 2000,
easing: 'easeLinear',
},
);
}
}
},
// 响应状态变化
setState(name, value, item: any) {
const group = item.getContainer();
const children = group.get('children');
const keyShape = children.find((child) => child.cfg.name === 'pai-studio-node-keyShape');
if (name === 'hover') {
if (value) {
keyShape.attr('stroke', '#CFD4E5');
keyShape.attr('lineWidth', 2.5);
} else {
keyShape.attr('stroke', '#c9cbc9');
keyShape.attr('lineWidth', 1);
}
}
if (name === 'click') {
if (value) {
keyShape.attr('fill', '#F6F7FB');
keyShape.attr('stroke', '#D7DBE9');
keyShape.attr('lineWidth', 1);
} else {
keyShape.attr('fill', '#FFFFFF');
keyShape.attr('stroke', '#D7DBE9');
keyShape.attr('lineWidth', 1);
}
}
if (name === 'selected') {
if (value) {
keyShape.attr('fill', '#E2F2FF');
keyShape.attr('stroke', '#D7DBE9');
keyShape.attr('lineWidth', 1);
} else {
keyShape.attr('fill', '#FFFFFF');
keyShape.attr('stroke', '#D7DBE9');
keyShape.attr('lineWidth', 1);
}
}
},
},
'modelRect',
);
// 扩展边
const lineDash = [4, 2, 1, 2]; // 描述边虚线
G6.registerEdge(
'pai-studio-edge',
{
afterUpdate(cfg: any, edge: any) {
const { group } = edge._cfg;
const s = cfg.Status;
const shape = group.get('children')[0]; // 获得该边的第一个图形,这里是边的 path
if (s === 'Running') {
let index = 0;
// 边 path 图形的动画
shape.animate(
() => {
index++;
if (index > 9) {
index = 0;
}
return {
lineDash,
lineDashOffset: -index,
};
},
{
repeat: true, // 动画重复
duration: 3000, // 一次动画的时长为 3000
},
);
shape.attr('stroke', '#00C800');
} else {
shape.stopAnimate();
shape.attr('lineDash', null);
shape.attr('stroke', '#969BB4');
}
},
// 响应状态变化
setState(name, value, item: any) {
const shape = item.get('keyShape');
if (name === 'hover') {
if (value) {
shape.attr('lineWidth', 3);
} else if (item.get('states').includes('click')) {
shape.attr('lineWidth', 3);
} else {
shape.attr('lineWidth', 1);
}
}
if (name === 'click') {
if (value) {
shape.attr('lineWidth', 3);
} else {
shape.attr('lineWidth', 1);
}
}
},
},
'cubic-vertical',
);
const tooltip = new Tooltip();
const graph = new G6.Graph({
container: div,
width: 500,
height: 500,fitCenter: true, // 图居中
enabledStack: true, // 设置为true,启用 redo & undo 栈功能
defaultNode: {
type: 'pai-studio-node',
size: [180, 40],
logoIcon: {
show: true,
width: 22,
height: 22,
img: null,
},
stateIcon: {
show: false, // 默认节点中表示状态的icon配置
},
style: {
cursor: 'pointer',
radius: 12,
stroke: '#c9cbc9',
fill: '#ffffff',
},
labelCfg: {
position: 'center',
style: {
fill: '#595959',
fontSize: 12,
cursor: 'pointer',
color: '#262831',
},
offset: 20,
},
preRect: {
show: false, // 默认节点左侧的小矩形
},
},
defaultEdge: {
type: 'pai-studio-edge',
style: {
stroke: '#969BB4',
endArrow: {
path: G6.Arrow.triangle(8, 8, 0),
fill: '#969BB4',
},
lineWidth: 1.5,
},
minCurveOffset: [70, -70],
},
modes: {
default: [
{
type: 'drag-canvas',
scalableRange: -100,
},
{
type: 'drag-node',
onlyChangeComboSize: true,
},
'double-finger-drag-canvas',
],
brush: [
{
type: 'brush-select',
trigger: 'drag',
includeEdges: true,
brushStyle: {
stroke: '#0070cc',
lineWidth: 1,
fill: '#eee',
fillOpacity: 0.3,
},
},
],
},
});
const d = {
RequestId: '2C28B8C7-A2FD-436E-A254-9269719DB501',
Content: {
nodes: [
{
id: '9a69c538b1eb4a3583e04bc4e88d2c66',
label: '特征分桶特征分桶特征分桶',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: '特征分桶',
version: 'v1',
signature: '159593978189133',
io: {
inputs: {
inputArtifact1: 1,
},
},
},
position: {
x: -300,
y: -180,
},
properties: [
{
label: 'detailColName',
value: '1024',
},
{
label: 'testColName',
value: '1',
},
{
label: '_advanced',
value: true,
},
{
label: 'selectColumns',
value: 'a,b,hour,pm10,so2,co,no2,pm2',
},
{
label: 'selectTest',
value: 'info',
},
{
label: 'oss',
value: 'https://mocks.alibaba-inc.com/project/STo77KX31/EditExp',
},
{
label: 'datePicker',
value: '2020/7/30',
},
{
label: 'editor',
value: 'Test Editor',
},
{
label: 'model_opt_lr',
value: {
seq_lenght: 1,
batch_size: 2,
learning_rate: 3,
save_steps: 4,
probe_steps: 5,
train_steps: '',
train_stepssssssss: '',
},
},
{
label: 'train_params',
value: {
seq_lenght: '',
batch_size: '',
learning_rate: '',
save_steps: '',
probe_steps: '',
train_steps: '',
train_stepssssssss: '',
},
},
{
label: 'joinInput',
value: 'value1:value2',
},
{
label: 'scoreColName',
value: 'scoreColName',
},
{
label: 'positiveLabel',
value: 22,
},
{
label: 'infos',
value: [
{
columnName: 'categorycategorycategory',
columnType: 'STRING',
dataRange: '体育,女性,娱乐',
},
{
columnName: 'title',
columnType: 'STRING',
dataRange:
'全国10个城市的男人最有魅力基因,图文:美国高尔夫公开赛次轮 加西亚充满自信,王丽雅走秀自爆喝水太少导致尿血胃痉挛(图),组图:王励勤传闻女友大比拼 小爱可爱赵薇性感,组图:穆雷摔倒拇指受伤 稚气古尔比斯草场做秀',
},
{
columnName: 'content',
columnType: 'STRING',
dataRange:
'体育讯 北京时间6月14日,2008美国高尔夫公开赛第二轮继续展开激烈的争夺。首轮结束后,美国球手凯文-斯特里尔曼和贾斯汀-希克斯并列占据了成绩榜的榜首位置,两人都在星期四打出了68杆低于标准杆3杆的...,我来说两句作者:CFP2008年6月12日,台湾,名模外型亮丽,却不一定比一般人更懂保养身体,王丽雅日前血尿吓得赶紧看医生,病因竟是她太少喝水!昨天(6月11日)走彩妆秀失手掉产品的钱帅君,和同门陈志...,我来说两句广州男人:爱拼才会赢无可否认,广州男人发了,广州男人财大气粗,似乎分分秒秒都在挣钱。广州男人形象并不高大,皮肤也黝黑,但他们用豪华私家车、别墅、名牌西服、名牌衬衣、名牌皮鞋所包装出的气派,却...,跳转至:页12/18我来说两句北京时间6月12日晚,总奖金额为71.3万欧元的英国女王草地杯开始第四比赛日角逐。在男单第三轮争夺中,大赛6号种子、英国天才少年安迪-穆雷在先丢一盘的情况下上演大逆转,最...,跳转至:页15/40我来说两句名人的爱情本就一直受到众人的关注,尤其是当被套上乒乓球奥运冠军和娱乐圈美女的光环之后,恐怕想低调都很难。中国乒坛的“文体恋”更是受人关注,那些奥运冠军和娱乐圈美女的爱情故...',
},
],
},
],
},
{
id: '9a69c538b1eb4a3583e04bc4e88d2110',
label: '通用模型导出',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: '通用模型导出',
version: 'v1',
signature: '159593978189110',
},
position: {
x: 0,
y: 50,
},
properties: [],
},
{
id: '9a69c538b1eb4a3583e0dsfsdff4bc4e88d2110',
label: '逻辑回归二分类预发',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: 'logisticregression_binary',
version: 'v1',
signature: '9aebba164fc81ad71ae45446c18ccbb5048acd5b',
},
position: {
x: 0,
y: 50,
},
properties: [],
},
{
id: '9a69c538b1eb4a3583e04bc4e88d2111',
label: 'Etrec',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: 'Etrec',
version: 'v1',
signature: '159593978189110',
},
position: {
x: 0,
y: 100,
},
properties: [],
},
{
id: '9a69c538b1eb4a3583e04bc4e88d2112',
label: 'ALS',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: 'ALS',
version: 'v1',
signature: '159593978189110',
},
position: {
x: 0,
y: 150,
},
properties: [],
},
{
id: '9a69c538b1eb4a3583e04bc4e88d2113',
label: 'GraphSage',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: 'GraphSage',
version: 'v1',
signature: '159593978189110',
},
position: {
x: 0,
y: 200,
},
properties: [],
},
{
id: '9a69c538b1eb4a3583e04bc4e88d2114',
label: 'DeepFM',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: 'DeepFM',
version: 'v1',
signature: '159593978189110',
},
position: {
x: 0,
y: 250,
},
properties: [],
},
{
id: '9a69c538b1eb4a3583e04bc4e88d1122',
label: '读数据表',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: '读数据表',
version: 'v1',
signature: '1595939781122',
},
position: {
x: 0,
y: 300,
},
properties: [
{
label: 'inputTable',
value: 'testValue',
},
],
},
{
id: '36a9883cd71c4a8d95774b29dd0a9cdd',
label: 'Split',
hasPipelines: false,
pipelines: {
nodes: [
{
id: 'child_1',
label: 'child_1',
},
],
edges: [
{
source: '9a69c538b1eb4a3583e04bc4e88d2c66',
target: 'child_1',
},
{
source: '9a69c538b1eb4a3583e04bc4e88d2c66',
target: 'child_2',
},
{
source: 'child_1',
target: 'ebbb9038f9914d839e4a22d78e4e4991',
},
{
source: 'child_2',
target: 'ebbb9038f9914d839e4a22d78e4e4991',
},
],
},
metadata: {
provider: 'pai',
identifier: 'Logistic regression',
version: 'v1',
signature: '1595939781891',
},
position: {
x: -300,
y: 0,
},
properties: [
{
label: 'detailColName',
value: '0.8',
},
{
label: 'inputColName',
value: '10',
},
{
label: 'outputColName',
value: '10',
},
{
label: 'infoTable',
value: [
{
columnName: 'categorycategorycategory',
columnType: 'STRING',
dataRange: '体育,女性,娱乐',
},
{
columnName: 'title',
columnType: 'STRING',
dataRange:
'全国10个城市的男人最有魅力基因,图文:美国高尔夫公开赛次轮 加西亚充满自信,王丽雅走秀自爆喝水太少导致尿血胃痉挛(图),组图:王励勤传闻女友大比拼 小爱可爱赵薇性感,组图:穆雷摔倒拇指受伤 稚气古尔比斯草场做秀',
},
{
columnName: 'content',
columnType: 'STRING',
dataRange:
'体育讯 北京时间6月14日,2008美国高尔夫公开赛第二轮继续展开激烈的争夺。首轮结束后,美国球手凯文-斯特里尔曼和贾斯汀-希克斯并列占据了成绩榜的榜首位置,两人都在星期四打出了68杆低于标准杆3杆的...,我来说两句作者:CFP2008年6月12日,台湾,名模外型亮丽,却不一定比一般人更懂保养身体,王丽雅日前血尿吓得赶紧看医生,病因竟是她太少喝水!昨天(6月11日)走彩妆秀失手掉产品的钱帅君,和同门陈志...,我来说两句广州男人:爱拼才会赢无可否认,广州男人发了,广州男人财大气粗,似乎分分秒秒都在挣钱。广州男人形象并不高大,皮肤也黝黑,但他们用豪华私家车、别墅、名牌西服、名牌衬衣、名牌皮鞋所包装出的气派,却...,跳转至:页12/18我来说两句北京时间6月12日晚,总奖金额为71.3万欧元的英国女王草地杯开始第四比赛日角逐。在男单第三轮争夺中,大赛6号种子、英国天才少年安迪-穆雷在先丢一盘的情况下上演大逆转,最...,跳转至:页15/40我来说两句名人的爱情本就一直受到众人的关注,尤其是当被套上乒乓球奥运冠军和娱乐圈美女的光环之后,恐怕想低调都很难。中国乒坛的“文体恋”更是受人关注,那些奥运冠军和娱乐圈美女的爱情故...',
},
],
},
],
},
{
id: 'ebbb9038f9914d839e4a22d78e4e4991',
label: '逻辑回归二分类-1',
hasPipelines: false,
metadata: {
provider: 'pai',
identifier: 'Logistic regression',
version: 'v1',
signature: '1595939781891',
},
position: {
x: -300,
y: 180,
},
properties: [
{
inputTable: {
label: 'inputTable',
ref: {
nodeId: '36a9883cd71c4a8d95774b29dd0a9cdd',
propertityName: 'outputTable1Artifact',
},
},
},
{
label: 'featureColNames',
value: 'column1,column2,column3',
},
{
label: 'labelColName',
value: 'column4',
},
{
label: 'goodValue',
value: '1',
},
{
label: 'enableSparse',
value: 'false',
},
{
label: 'regularizedType',
value: 'L1',
},
{
label: 'maxIter',
value: '100',
},
{
label: 'regularizedLevel',
value: '1',
},
{
label: 'epsilon',
value: '0.000001',
},
{
label: 'regularizedLevel',
value: '1',
},
{
label: 'regularizedLevel',
value: '1',
},
{
label: 'regularizedLevel',
value: '1',
},
{
label: 'coreNum',
value: '10',
},
{
label: 'memSizePerCore',
value: '1024',
},
{
label: 'itemDelimiter',
value: ',',
},
{
label: 'kvDelimiter',
value: ':',
},
{
label: 'outputModelName',
value: 'xxxx',
},
],
},
],
edges: [
{
source: '9a69c538b1eb4a3583e04bc4e88d2c66',
sourceAnchor: 'outputsArtifact1',
target: '36a9883cd71c4a8d95774b29dd0a9cdd',
targetAnchor: 'inputArtifact1',
targetAnchorIndex: 0,
},
{
source: '36a9883cd71c4a8d95774b29dd0a9cdd',
sourceAnchor: 'outputsArtifact1',
target: 'ebbb9038f9914d839e4a22d78e4e4991',
targetAnchor: 'inputArtifact1',
targetAnchorIndex: 1,
},
],
globalParams: [
{
label: 'bucket',
value: 'oss-bucket',
},
{
label: 'execution',
value: 'test',
},
],
globalSettings: [],
},
Creator: '1557702098194904',
Description: '机器学习算法计算出二氧化氮对于雾霾影响最大testsststtsssssssssssssssssssss',
ExperimentId: 'experiment-kftihe4c1w5gx2slsf',
GmtCreateTime: '2021-01-30T12:51:33.028Z',
GmtModifiedTime: '2021-01-30T12:51:33.028Z',
Name: '雾霾天气预测11111',
Source: 'string',
Version: 0,
WorkspaceId: 'ws-5fys1on3yn5lymx637',
};
graph.data(d.Content);
graph.render();
})
});