From f7107f809f9c9caccfb5058e727946e17fb1a1c8 Mon Sep 17 00:00:00 2001 From: CTomlyn Date: Mon, 2 Dec 2024 11:23:38 -0800 Subject: [PATCH] #2252 Create a sample app that shows a prompt interface Signed-off-by: CTomlyn --- canvas_modules/harness/src/client/App.js | 9 + .../custom-canvases/prompt/prompt-canvas.jsx | 215 + .../custom-canvases/prompt/prompt-flow.json | 74 + .../prompt/prompt-palette.json | 5344 +++++++++++++++++ .../custom-canvases/prompt/prompt-react.jsx | 62 + .../prompt/prompt-template.json | 30 + .../custom-canvases/prompt/prompt.scss | 202 + .../sidepanel/canvas/sidepanel-canvas.jsx | 5 + .../src/client/constants/harness-constants.js | 1 + .../harness/src/styles/custom-canvases.scss | 1 + 10 files changed, 5943 insertions(+) create mode 100644 canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-canvas.jsx create mode 100644 canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-flow.json create mode 100644 canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-palette.json create mode 100644 canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-react.jsx create mode 100644 canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-template.json create mode 100644 canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt.scss diff --git a/canvas_modules/harness/src/client/App.js b/canvas_modules/harness/src/client/App.js index f4cc99ac82..4321d7b8d9 100644 --- a/canvas_modules/harness/src/client/App.js +++ b/canvas_modules/harness/src/client/App.js @@ -46,6 +46,7 @@ import FlowsCanvas from "./components/custom-canvases/flows/flows-canvas"; import TablesCanvas from "./components/custom-canvases/tables/tables-canvas"; import StagesCanvas from "./components/custom-canvases/stages/stages-canvas"; import StagesCardNodeCanvas from "./components/custom-canvases/stages-card-node/stages-card-node-canvas"; +import PromptCanvas from "./components/custom-canvases/prompt/prompt-canvas"; import LogicCanvas from "./components/custom-canvases/logic/logic-canvas"; import ReadOnlyCanvas from "./components/custom-canvases/read-only/read-only-canvas"; import ProgressCanvas from "./components/custom-canvases/progress/progress-canvas"; @@ -103,6 +104,7 @@ import { EXAMPLE_APP_FLOWS, EXAMPLE_APP_STAGES, EXAMPLE_APP_STAGES_CARD_NODE, + EXAMPLE_APP_PROMPT, EXAMPLE_APP_EXPLAIN, EXAMPLE_APP_EXPLAIN2, EXAMPLE_APP_STREAMS, @@ -2788,6 +2790,13 @@ class App extends React.Component { config={commonCanvasConfig} /> ); + } else if (this.state.selectedExampleApp === EXAMPLE_APP_PROMPT) { + firstCanvas = ( + + ); } else if (this.state.selectedExampleApp === EXAMPLE_APP_LOGIC) { firstCanvas = ( ) + }); + } + return defaultMenu; + } + + addNodeHandler(nodeTemplate) { + const promptNode = this.canvasController.getNode(this.promptNodeId); + this.canvasController.deleteNode(this.promptNodeId); + this.canvasController.deleteLink("link_to_prompt"); + + const newNode = this.canvasController.createNode({ + nodeTemplate: nodeTemplate, + offsetX: promptNode.x_pos, + offsetY: promptNode.y_pos + }); + this.canvasController.addNode(newNode); + + const linksToAdd = this.canvasController.createNodeLinks({ + type: "nodeLink", + nodes: [{ id: this.sourceNodeId }], + targetNodes: [{ id: newNode.id }] + }); + + this.canvasController.addLinks(linksToAdd); + + } + + addPromptNode(sourceNode) { + this.sourceNodeId = sourceNode.id; + + const template = Template; + template.app_data.prompt_data = { + addNodeCallback: this.addNodeHandler.bind(this) + }; + const newNode = this.canvasController.createNode({ + nodeTemplate: template, + offsetX: sourceNode.x_pos + 200, // Position prompt 200px to right of source node + offsetY: sourceNode.y_pos + }); + + // Make sure prompt doesn't overlap other nodes. + this.adjustNodePosition(newNode, 100); + + // Save the ID of the prompt node for removal, later + this.promptNodeId = newNode.id; + + // Add the prompt node to the canvas with a link + this.canvasController.addNode(newNode); + const linksToAdd = this.canvasController.createNodeLinks({ + id: "link_to_prompt", + type: "nodeLink", + nodes: [{ id: sourceNode.id }], + targetNodes: [{ id: this.promptNodeId }] + }); + + this.canvasController.addLinks(linksToAdd); + } + + adjustNodePosition(node, yInc) { + let overlapNode = true; + while (overlapNode) { + overlapNode = this.canvasController.getNodes().find((n) => n.x_pos === node.x_pos && n.y_pos === node.y_pos); + if (overlapNode) { + node.y_pos += yInc; + } + } + } + + render() { + const config = this.getConfig(); + + return ( + + ); + } +} + +PromptCanvas.propTypes = { + config: PropTypes.object +}; diff --git a/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-flow.json b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-flow.json new file mode 100644 index 0000000000..04e06b428e --- /dev/null +++ b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-flow.json @@ -0,0 +1,74 @@ +{ + "doc_type": "pipeline", + "version": "3.0", + "json_schema": "https://api.dataplatform.ibm.com/schemas/common-pipeline/pipeline-flow/pipeline-flow-v3-schema.json", + "id": "prompt-pipeline-flow", + "primary_pipeline": "primary-prompt-pipeline", + "pipelines": [ + { + "id": "primary-prompt-pipeline", + "nodes": [ + { + "id": "1af18594-86db-4b21-8f40-16afad1ece0b", + "type": "execution_node", + "op": "type", + "app_data": { + "ui_data": { + "label": "Type", + "image": "images/custom-canvases/flows/palette/icons/type.svg", + "x_pos": 54, + "y_pos": 250, + "description": "Type node." + } + }, + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ] + } + ], + "app_data": { + "ui_data": { + "comments": [ + { + "id": "0b123469-7d21-43a5-ae84-cbc999990033", + "x_pos": 54, + "y_pos": 43.2, + "width": 288, + "height": 158.4, + "class_name": "d3-comment-rect bkg-col-green-20", + "content": "### Prompt Canvas\n\nThis canvas provides a method to add new nodes to the flow with a prompt. To do this:\n1. Hover over the Type node\n2. In the context toolbar, click the \"Add node with prompt\" button\n3. Select a node type from the prompt. ", + "associated_id_refs": [] + } + ] + } + }, + "runtime_ref": "" + } + ], + "schemas": [] +} diff --git a/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-palette.json b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-palette.json new file mode 100644 index 0000000000..bcccf0e658 --- /dev/null +++ b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-palette.json @@ -0,0 +1,5344 @@ +{ + "version": "3.0", + "categories": [ + { + "label": "Import", + "description": "This category defines data importers", + "image": "images/custom-canvases/flows/palette/icons/palette-import.svg", + "id": "import", + "node_types": [ + { + "id": "", + "type": "binding", + "op": "dataassetimport", + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Data Asset", + "description": "Pull in data from remote data sources using connections, or pull in data from a file.", + "image": "images/custom-canvases/flows/palette/icons/dataassetimport.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "userinput", + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "User Input", + "description": "Easily create synthetic data—either from scratch or by altering existing data.", + "image": "images/custom-canvases/flows/palette/icons/userinput.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "simgen", + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Sim Gen", + "description": "Generate simulated data automatically or with user-specified statistical distributions.", + "image": "images/custom-canvases/flows/palette/icons/simgen.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Record Operations", + "description": "This category defines operations on records", + "image": "images/custom-canvases/flows/palette/icons/palette-record-ops.svg", + "id": "recordOp", + "node_types": [ + { + "id": "", + "type": "execution_node", + "op": "select", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Select", + "description": "Select or discard a subset of records from the data stream based on a specific condition.", + "image": "images/custom-canvases/flows/palette/icons/select.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "sample", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Sample", + "description": "Select a subset of records for analysis, or specify a proportion of records to discard.", + "image": "images/custom-canvases/flows/palette/icons/sample.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "sort", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Sort", + "description": "Sort records into ascending or descending order based on the values of one or more fields.", + "image": "images/custom-canvases/flows/palette/icons/sort.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "balance", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Balance", + "description": "Correct imbalances in datasets so they conform to specified test criteria.", + "image": "images/custom-canvases/flows/palette/icons/balance.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "distinct", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Distinct", + "description": "Find or remove duplicate records in your data, or create a single, composite record from a group of duplicate records.", + "image": "images/custom-canvases/flows/palette/icons/distinct.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "aggregate", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Aggregate", + "description": "Replace a sequence of input records with summary, aggregated output records.", + "image": "images/custom-canvases/flows/palette/icons/aggregate.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "merge", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Merge", + "description": "Take multiple input records and create a single output record containing all or some of the input fields.", + "image": "images/custom-canvases/flows/palette/icons/merge.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "append", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Append", + "description": "Combine datasets with similar structures but different data.", + "image": "images/custom-canvases/flows/palette/icons/append.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "derive_stb", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Space-Time-Boxes", + "description": "An STB is an alphanumeric string that represents a regularly shaped region of space and time.", + "image": "images/custom-canvases/flows/palette/icons/spacetimebox.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "ts_streaming", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Streaming TS", + "description": "Build and score time series models in one step.", + "image": "images/custom-canvases/flows/palette/icons/ts_streaming.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "smote", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "SMOTE", + "description": "To perform over-sampling using SMOTE - Synthetic Minority Over-sampling Technique", + "image": "images/custom-canvases/flows/palette/icons/smote.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "rfmaggregate", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "RFM Aggregate", + "description": "Take historical transaction data, strip away unused data, and combine all remaining transaction data into one row.", + "image": "images/custom-canvases/flows/palette/icons/rfmaggregate.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Field Operations", + "description": "This category defines operations on fields", + "image": "images/custom-canvases/flows/palette/icons/palette-field-ops.svg", + "id": "fieldOp", + "node_types": [ + { + "id": "", + "type": "execution_node", + "op": "autodataprep", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Data Prep", + "description": "Prepare your data for model building quickly and easily, without needing prior knowledge of the statistical concepts involved.", + "image": "images/custom-canvases/flows/palette/icons/autodataprep.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "type", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Type", + "description": "Specify field metadata and properties that are invaluable to modeling.", + "image": "images/custom-canvases/flows/palette/icons/type.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "filter", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Filter", + "description": "Rename or exclude fields at any point in a flow.", + "image": "images/custom-canvases/flows/palette/icons/filter.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "derive", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Derive", + "description": "Modify data values or create new fields from one or more existing fields.", + "image": "images/custom-canvases/flows/palette/icons/derive.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "filler", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Filler", + "description": "Replace field values and change storage. Often used with a Type node to replace missing values.", + "image": "images/custom-canvases/flows/palette/icons/filler.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "reclassify", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Reclassify", + "description": "Transform one set of categorical values to another. Useful for collapsing categories or regrouping data for analysis.", + "image": "images/custom-canvases/flows/palette/icons/reclassify.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "binning", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Binning", + "description": "Automatically create new nominal fields based on the values of one or more existing continuous fields.", + "image": "images/custom-canvases/flows/palette/icons/binning.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "rfmanalysis", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "RFM Analysis", + "description": "Examine recent customer purchases (recency), how often they purchased (frequency), and how much they spent (monetary).", + "image": "images/custom-canvases/flows/palette/icons/rfmanalysis.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "ensemble", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Ensemble", + "description": "Combines two or more model nuggets to obtain more accurate predictions than can be gained from any of the individual models.", + "image": "images/custom-canvases/flows/palette/icons/ensemble.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "partition", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Partition", + "description": "Generate a partition field that splits data into separate subsets or samples for the training, testing, and validation stages of model building.", + "image": "images/custom-canvases/flows/palette/icons/partition.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "settoflag", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "SetToFlag", + "description": "Derive flag fields based on the categorical values defined for one or more nominal fields.", + "image": "images/custom-canvases/flows/palette/icons/settoflag.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "restructure", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Restructure", + "description": "Generate multiple fields based on the values of a nominal or flag field.", + "image": "images/custom-canvases/flows/palette/icons/restructure.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "transpose", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Transpose", + "description": "Swap the data in rows and columns so that fields become records and records become fields.", + "image": "images/custom-canvases/flows/palette/icons/transpose.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "reorder", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Field Reorder", + "description": "Define the natural order for displaying fields downstream.", + "image": "images/custom-canvases/flows/palette/icons/fieldreorder.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "history", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "History", + "description": "Create new fields containing data from fields in previous records (most often used for sequential data, such as time series data).", + "image": "images/custom-canvases/flows/palette/icons/history.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "astimeintervals", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Time Intervals", + "description": "Specify intervals and derive a new time field for estimating or forecasting.", + "image": "images/custom-canvases/flows/palette/icons/astimeintervals.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "anonymize", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Anonymize", + "description": "Disguise field names, field values, or both when working with data that's to be included in a model downstream of the node.", + "image": "images/custom-canvases/flows/palette/icons/anonymize.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "reproject", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Reproject", + "description": "Change the coordinate system for fields that can't be reprojected automatically.", + "image": "images/custom-canvases/flows/palette/icons/reproject.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Graphs", + "description": "This category defines chart builders", + "image": "images/custom-canvases/flows/palette/icons/palette-charts.svg", + "id": "graph", + "node_types": [ + { + "id": "", + "type": "execution_node", + "op": "dvcharts", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Charts", + "description": "Launch the chart builder and create chart definitions to save with your flow.", + "image": "images/custom-canvases/flows/palette/icons/dvcharts.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "plot", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Plot", + "description": "Shows the relationship between numeric fields.", + "image": "images/custom-canvases/flows/palette/icons/plot.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "multiplot", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Multiplot", + "description": "A special type of plot that displays multiple Y fields over a single X field.", + "image": "images/custom-canvases/flows/palette/icons/multiplot.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "timeplot", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Time plot", + "description": "View one or more time series plotted over time.", + "image": "images/custom-canvases/flows/palette/icons/timeplot.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "distribution", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Distribution", + "description": "Shows the occurrence of symbolic (non-numeric) values, such as mortgage type or gender, in a dataset.", + "image": "images/custom-canvases/flows/palette/icons/distribution.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "histogram", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Histogram", + "description": "Shows the occurrence of values for numeric fields.", + "image": "images/custom-canvases/flows/palette/icons/histogram.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "collection", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Collection", + "description": "Shows the distribution of values for one numeric field relative to the values of another.", + "image": "images/custom-canvases/flows/palette/icons/collection.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "web", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Web", + "description": "Shows the strength of relationships between values of two or more symbolic fields.", + "image": "images/custom-canvases/flows/palette/icons/web.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "evaluation", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Evaluation", + "description": "Evaluate and compare predictive models to choose the best model for your application.", + "image": "images/custom-canvases/flows/palette/icons/evaluation.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Modeling", + "description": "This category defines model builders", + "image": "images/custom-canvases/flows/palette/icons/palette-modeling.svg", + "id": "modeling", + "node_types": [ + { + "id": "", + "type": "binding", + "op": "autoclassifier", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Classifier", + "description": "Estimates and compares models to try out a variety of approaches for nominal and binary data.", + "image": "images/custom-canvases/flows/palette/icons/autoclassifier.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "autonumeric", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Numeric", + "description": "Estimates and compares models to try out a variety of approaches for a continuous numeric range.", + "image": "images/custom-canvases/flows/palette/icons/autonumeric.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "autocluster", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Cluster", + "description": "Estimates and compares clustering models that identify groups of records with similar characteristics.", + "image": "images/custom-canvases/flows/palette/icons/autocluster.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "bayesnet", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Bayes Net", + "description": "Build a probability model to establish the likelihood of occurrences by using seemingly unlinked attributes.", + "image": "images/custom-canvases/flows/palette/icons/bayesnet.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "c50", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "C5.0", + "description": "Build either a decision tree or a ruleset by splitting the sample based on the field that provides the maximum information gain.", + "image": "images/custom-canvases/flows/palette/icons/c50.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "cart", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "C&R Tree", + "description": "Tree-based classification and prediction method that splits training records into segments with similar output field values.", + "image": "images/custom-canvases/flows/palette/icons/cart.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "chaid", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "CHAID", + "description": "Build decision trees by using chi-square statistics to identify optimal splits.", + "image": "images/custom-canvases/flows/palette/icons/chaid.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "quest", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Quest", + "description": "Build decision trees by using a binary classification method.", + "image": "images/custom-canvases/flows/palette/icons/quest.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "treeas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Tree-AS", + "description": "Build decision trees using either a CHAID or Exhaustive CHAID model.", + "image": "images/custom-canvases/flows/palette/icons/treeas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "randomtrees", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Random Trees", + "description": "Build an ensemble model that consists of multiple decision trees.", + "image": "images/custom-canvases/flows/palette/icons/randomtrees.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "rf", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Random Forest", + "description": "Implement a bagging algorithm with a tree model as the base model.", + "image": "images/custom-canvases/flows/palette/icons/randomforest.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "decisionlist", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Decision List", + "description": "Identify subgroups or segments that show a higher or lower likelihood of a binary (yes or no) outcome relative to the overall sample.", + "image": "images/custom-canvases/flows/palette/icons/decisionlist.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "ts", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Time Series", + "description": "Estimate and build exponential smoothing, ARIMA, or multivariate ARIMA models and produce forecasts.", + "image": "images/custom-canvases/flows/palette/icons/ts.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "tcm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "TCM", + "description": "Create a temporal causal model to discover key causal relationships in time series data.", + "image": "images/custom-canvases/flows/palette/icons/tcm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "genlin", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "GenLin", + "description": "Build an equation that relates the input field values to the output field values.", + "image": "images/custom-canvases/flows/palette/icons/genlin.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "glmm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "GLMM", + "description": "Creates a generalized linear mixed model that extends the linear model.", + "image": "images/custom-canvases/flows/palette/icons/glmm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "gle", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "GLE", + "description": "Identify the dependent variable that's linearly related to the factors and covariates via a specified link function.", + "image": "images/custom-canvases/flows/palette/icons/gle.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "linear", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Linear", + "description": "Classify records based on the values of numeric input fields.", + "image": "images/custom-canvases/flows/palette/icons/linear.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "linearas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Linear-AS", + "description": "Classify records based on the values of numeric input fields.", + "image": "images/custom-canvases/flows/palette/icons/linearas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "regression", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Regression", + "description": "Classify records based on the values of numeric input fields.", + "image": "images/custom-canvases/flows/palette/icons/regression.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "lsvm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "LSVM", + "description": "Use a linear support vector machine to classify data.", + "image": "images/custom-canvases/flows/palette/icons/lsvm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "logreg", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Logistic", + "description": "Classify records based on the values of categorical input fields.", + "image": "images/custom-canvases/flows/palette/icons/logreg.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "neuralnetwork", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Neural Net", + "description": "Approximate a wide range of predictive models with minimal demands on model structure and assumption.", + "image": "images/custom-canvases/flows/palette/icons/neuralnetwork.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "knn", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "KNN", + "description": "Find patterns of data without requiring an exact match to any stored patterns, or cases.", + "image": "images/custom-canvases/flows/palette/icons/knn.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "coxreg", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Cox", + "description": "Build a predictive model for time-to-even data.", + "image": "images/custom-canvases/flows/palette/icons/cox.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "factor", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "PCA/Factor", + "description": "Provides powerful data-reduction techniques to reduce the complexity of your data.", + "image": "images/custom-canvases/flows/palette/icons/pca.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "svm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "SVM", + "description": "Use a support vector machine to classify data.", + "image": "images/custom-canvases/flows/palette/icons/svm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "featureselection", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Feature Selection", + "description": "Identify fields that are most important for a given analysis.", + "image": "images/custom-canvases/flows/palette/icons/featureselection.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "discriminant", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Discriminant", + "description": "Build a predictive model for group membership.", + "image": "images/custom-canvases/flows/palette/icons/discriminant.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "slrm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "SLRM", + "description": "Predict which offers are most appropriate for customers and the probability of the offers being accepted.", + "image": "images/custom-canvases/flows/palette/icons/slrm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "stp", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "STP", + "description": "Has many potential applications such as energy management for buildings, or public transport planning.", + "image": "images/custom-canvases/flows/palette/icons/stp.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "associationrules", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Association Rules", + "description": "Automatically find associations that you could find manually using visualization techniques.", + "image": "images/custom-canvases/flows/palette/icons/associationrules.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "apriori", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Apriori", + "description": "Discover association rules in your data.", + "image": "images/custom-canvases/flows/palette/icons/apriori.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "carma", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Carma", + "description": "Use an association rules discovery algorithm to discover association rules in your data.", + "image": "images/custom-canvases/flows/palette/icons/carma.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "sequence", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Sequence", + "description": "Discover patterns in sequential or time-oriented data.", + "image": "images/custom-canvases/flows/palette/icons/sequence.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "kohonen", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Kohonen", + "description": "Cluster your dataset into distinct groups when you don't know what those groups are at the beginning.", + "image": "images/custom-canvases/flows/palette/icons/kohonen.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "anomalydetection", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Anomaly", + "description": "Identify outliers, or unusual cases, in your data.", + "image": "images/custom-canvases/flows/palette/icons/anomaly.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "kmeans", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "K-Means", + "description": "Use a cluster method to cluster your dataset into distinct groups when you don't know what those groups are at the beginning.", + "image": "images/custom-canvases/flows/palette/icons/kmeans.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "twostep", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "TwoStep", + "description": "Cluster your dataset into distinct groups when you don't know what those groups are at first.", + "image": "images/custom-canvases/flows/palette/icons/twostep.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "twostepAS", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "TwoStep-AS", + "description": "Use this exploratory tool  to reveal natural groupings (clusters) within your dataset.", + "image": "images/custom-canvases/flows/palette/icons/twostepas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "isotonicas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Isotonic-AS", + "description": "Isotonic Regression belongs to the family of regression algorithms. Implemented in Spark.", + "image": "images/custom-canvases/flows/palette/icons/isotonicas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "kmeansas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "K-Means-AS", + "description": "Cluster data points into a predefined number of clusters.", + "image": "images/custom-canvases/flows/palette/icons/kmeansas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "kdemodel", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "KDE Modeling", + "description": "Walks the line between unsupervised learning, feature engineering, and data modeling.", + "image": "images/custom-canvases/flows/palette/icons/kdemodel.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "gmm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Gaussian Mixture", + "description": "CExposes the core features and commonly used parameters of the Gaussian Mixture Python library.", + "image": "images/custom-canvases/flows/palette/icons/gmm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "xgboostas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "XGBoost-AS", + "description": "xgboostas.desc", + "image": "images/custom-canvases/flows/palette/icons/xgboostas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "xgboosttree", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "XGBoost Tree", + "description": "Uses an advanced implementation of a gradient boosting algorithm with a tree model as the base model.", + "image": "images/custom-canvases/flows/palette/icons/xgboosttree.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "xgboostlinear", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "XGBoost Linear", + "description": "Uses an advanced implementation of a gradient boosting algorithm with a linear model as the base model.", + "image": "images/custom-canvases/flows/palette/icons/xgboostlinear.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "ocsvm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "One-Class SVM", + "description": "Detects the soft boundary of a given set of samples, to then classify new points as belonging to that set or not.", + "image": "images/custom-canvases/flows/palette/icons/ocsvm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "mlpas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "MultiLayerPerceptron-AS", + "description": "A classifier based on the feedforward artificial neural network. Consists of multiple layers.", + "image": "images/custom-canvases/flows/palette/icons/mlpas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "hdbscan", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "HDBSCAN", + "description": "Uses unsupervised learning to find clusters, or dense regions, of a data set.", + "image": "images/custom-canvases/flows/palette/icons/hdbscan.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Text Analytics", + "description": "This category defines Text Mining operations", + "image": "images/custom-canvases/flows/palette/icons/palette-textmining.svg", + "id": "TextMining", + "node_types": [ + { + "id": "", + "type": "execution_node", + "op": "LanguageIdentifier", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Language Identifier", + "description": "Identify the natural language of a text field within your source data.", + "image": "images/custom-canvases/flows/palette/icons/languageidentifier.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "textlinkanalysis", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Text Link Analysis", + "description": "Identify relationships between the concepts in the text data based on known patterns.", + "image": "images/custom-canvases/flows/palette/icons/textlinkanalysis.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "textanalytic", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Text Mining", + "description": "Extract key concepts from text and create categories with these concepts and other data.", + "image": "images/custom-canvases/flows/palette/icons/textminingworkbench.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Outputs", + "description": "This category defines output builders", + "image": "images/custom-canvases/flows/palette/icons/palette-output.svg", + "id": "output", + "node_types": [ + { + "id": "", + "type": "execution_node", + "op": "table", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Table", + "description": "Create a table that lists the values in your data.", + "image": "images/custom-canvases/flows/palette/icons/table.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "matrix", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Matrix", + "description": "Create a table that shows relationships between fields.", + "image": "images/custom-canvases/flows/palette/icons/matrix.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "analysis", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Analysis", + "description": "Evaluate the ability of a model to generate accurate predictions.", + "image": "images/custom-canvases/flows/palette/icons/analysis.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "dataaudit", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Data Audit", + "description": "Get a comprehensive first look at your data, presented in an easy-to-read matrix.", + "image": "images/custom-canvases/flows/palette/icons/dataaudit.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "transform", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Transform", + "description": "Perform a rapid visual assessment of the best transformation to use.", + "image": "images/custom-canvases/flows/palette/icons/transform.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "statistics", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Statistics", + "description": "Get basic summary information about numeric fields.", + "image": "images/custom-canvases/flows/palette/icons/statistics.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "means", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Means", + "description": "Compare the means between independent groups or between pairs of related fields to test whether a significant difference exists.", + "image": "images/custom-canvases/flows/palette/icons/means.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "report", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Report", + "description": "Create formatted reports containing fixed text, data, or other expressions derived from your data.", + "image": "images/custom-canvases/flows/palette/icons/report.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "setglobals", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Set Globals", + "description": "Scans your data and computes summary values that can be used in CLEM expressions.", + "image": "images/custom-canvases/flows/palette/icons/setglobals.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "execution_node", + "op": "simfit", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "outputs": [ + { + "id": "outPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": -1 + }, + "label": "Output Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Sim Fit", + "description": "Fits a set of candidate statistical distributions to each field in your data.", + "image": "images/custom-canvases/flows/palette/icons/simfit.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Export", + "description": "This category defines data exporters", + "image": "images/custom-canvases/flows/palette/icons/palette-export.svg", + "id": "export", + "node_types": [ + { + "id": "", + "type": "binding", + "op": "dataassetexport", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Data Asset Export", + "description": "Write to remote data sources using connections.", + "image": "images/custom-canvases/flows/palette/icons/dataassetexport.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + }, + { + "label": "Models", + "description": "This category defines models built from the modeling nodes", + "image": "images/custom-canvases/flows/palette/icons/palette-modeling.svg", + "id": "models", + "node_types": [ + { + "id": "", + "type": "binding", + "op": "applyautoclassifier", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Classifier", + "description": "Estimates and compares models to try out a variety of approaches for nominal and binary data.", + "image": "images/custom-canvases/flows/palette/icons/applyautoclassifier.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyautonumeric", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Numeric", + "description": "Estimates and compares models to try out a variety of approaches for a continuous numeric range.", + "image": "images/custom-canvases/flows/palette/icons/applyautonumeric.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyautocluster", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Auto Cluster", + "description": "Estimates and compares clustering models that identify groups of records with similar characteristics.", + "image": "images/custom-canvases/flows/palette/icons/applyautocluster.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applybayesnet", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Bayes Net", + "description": "Build a probability model to establish the likelihood of occurrences by using seemingly unlinked attributes.", + "image": "images/custom-canvases/flows/palette/icons/applybayesnet.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyc50", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "C5.0", + "description": "Build either a decision tree or a ruleset by splitting the sample based on the field that provides the maximum information gain.", + "image": "images/custom-canvases/flows/palette/icons/applyc50.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applycart", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "C&R Tree", + "description": "Tree-based classification and prediction method that splits training records into segments with similar output field values.", + "image": "images/custom-canvases/flows/palette/icons/applycart.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applychaid", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "CHAID", + "description": "Build decision trees by using chi-square statistics to identify optimal splits.", + "image": "images/custom-canvases/flows/palette/icons/applychaid.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyquest", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Quest", + "description": "Build decision trees by using a binary classification method.", + "image": "images/custom-canvases/flows/palette/icons/applyquest.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applytreeas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Tree-AS", + "description": "Build decision trees using either a CHAID or Exhaustive CHAID model.", + "image": "images/custom-canvases/flows/palette/icons/applytreeas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyrandomtrees", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Random Trees", + "description": "Build an ensemble model that consists of multiple decision trees.", + "image": "images/custom-canvases/flows/palette/icons/applyrandomtrees.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyrf", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Random Forest", + "description": "Implement a bagging algorithm with a tree model as the base model.", + "image": "images/custom-canvases/flows/palette/icons/applyrandomforest.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applydecisionlist", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Decision List", + "description": "Identify subgroups or segments that show a higher or lower likelihood of a binary (yes or no) outcome relative to the overall sample.", + "image": "images/custom-canvases/flows/palette/icons/applydecisionlist.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyts", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Time Series", + "description": "Estimate and build exponential smoothing, ARIMA, or multivariate ARIMA models and produce forecasts.", + "image": "images/custom-canvases/flows/palette/icons/applyts.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applytcm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "TCM", + "description": "Create a temporal causal model to discover key causal relationships in time series data.", + "image": "images/custom-canvases/flows/palette/icons/applytcm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applygenlin", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "GenLin", + "description": "Build an equation that relates the input field values to the output field values.", + "image": "images/custom-canvases/flows/palette/icons/applygeneralizedlinear.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyglmm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "GLMM", + "description": "Creates a generalized linear mixed model that extends the linear model.", + "image": "images/custom-canvases/flows/palette/icons/applyglmm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applygle", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "GLE", + "description": "Identify the dependent variable that's linearly related to the factors and covariates via a specified link function.", + "image": "images/custom-canvases/flows/palette/icons/applygle.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applylinear", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Linear", + "description": "Classify records based on the values of numeric input fields.", + "image": "images/custom-canvases/flows/palette/icons/applylinear.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applylinearas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Linear-AS", + "description": "Classify records based on the values of numeric input fields.", + "image": "images/custom-canvases/flows/palette/icons/applylinearas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyregression", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Regression", + "description": "Classify records based on the values of numeric input fields.", + "image": "images/custom-canvases/flows/palette/icons/applyregression.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applylsvm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "LSVM", + "description": "Use a linear support vector machine to classify data.", + "image": "images/custom-canvases/flows/palette/icons/applylsvm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applylogreg", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Logistic", + "description": "Classify records based on the values of categorical input fields.", + "image": "images/custom-canvases/flows/palette/icons/applylogreg.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyneuralnetwork", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Neural Net", + "description": "Approximate a wide range of predictive models with minimal demands on model structure and assumption.", + "image": "images/custom-canvases/flows/palette/icons/applyneuralnetwork.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyknn", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "KNN", + "description": "Find patterns of data without requiring an exact match to any stored patterns, or cases.", + "image": "images/custom-canvases/flows/palette/icons/applyknn.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applycoxreg", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Cox", + "description": "Build a predictive model for time-to-even data.", + "image": "images/custom-canvases/flows/palette/icons/applycox.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyfactor", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "PCA/Factor", + "description": "Provides powerful data-reduction techniques to reduce the complexity of your data.", + "image": "images/custom-canvases/flows/palette/icons/applypca.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applysvm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "SVM", + "description": "Use a support vector machine to classify data.", + "image": "images/custom-canvases/flows/palette/icons/applysvm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyfeatureselection", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Feature Selection", + "description": "Identify fields that are most important for a given analysis.", + "image": "images/custom-canvases/flows/palette/icons/applyfeatureselection.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applydiscriminant", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Discriminant", + "description": "Build a predictive model for group membership.", + "image": "images/custom-canvases/flows/palette/icons/applydiscriminant.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyslrm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "SLRM", + "description": "Predict which offers are most appropriate for customers and the probability of the offers being accepted.", + "image": "images/custom-canvases/flows/palette/icons/applyslrm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applystp", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "STP", + "description": "Has many potential applications such as energy management for buildings, or public transport planning.", + "image": "images/custom-canvases/flows/palette/icons/applystp.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyassociationrules", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Association Rules", + "description": "Automatically find associations that you could find manually using visualization techniques.", + "image": "images/custom-canvases/flows/palette/icons/applyassociationrules.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyapriori", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Apriori", + "description": "Discover association rules in your data.", + "image": "images/custom-canvases/flows/palette/icons/applyapriori.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applycarma", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Carma", + "description": "Use an association rules discovery algorithm to discover association rules in your data.", + "image": "images/custom-canvases/flows/palette/icons/applycarma.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applysequence", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Sequence", + "description": "Discover patterns in sequential or time-oriented data.", + "image": "images/custom-canvases/flows/palette/icons/applysequence.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applykohonen", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Kohonen", + "description": "Cluster your dataset into distinct groups when you don't know what those groups are at the beginning.", + "image": "images/custom-canvases/flows/palette/icons/applykohonen.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyanomalydetection", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Anomaly", + "description": "Identify outliers, or unusual cases, in your data.", + "image": "images/custom-canvases/flows/palette/icons/applyanomaly.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applykmeans", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "K-Means", + "description": "Use a cluster method to cluster your dataset into distinct groups when you don't know what those groups are at the beginning.", + "image": "images/custom-canvases/flows/palette/icons/applykmeans.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applytwostep", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "TwoStep", + "description": "Cluster your dataset into distinct groups when you don't know what those groups are at first.", + "image": "images/custom-canvases/flows/palette/icons/applytwostep.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applytwostepAS", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "TwoStep-AS", + "description": "Use this exploratory tool  to reveal natural groupings (clusters) within your dataset.", + "image": "images/custom-canvases/flows/palette/icons/applytwostepas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyisotonicas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Isotonic-AS", + "description": "Isotonic Regression belongs to the family of regression algorithms. Implemented in Spark.", + "image": "images/custom-canvases/flows/palette/icons/applyisotonicas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applykmeansas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "K-Means-AS", + "description": "Cluster data points into a predefined number of clusters.", + "image": "images/custom-canvases/flows/palette/icons/applykmeansas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applykdemodel", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "KDE Modeling", + "description": "Walks the line between unsupervised learning, feature engineering, and data modeling.", + "image": "images/custom-canvases/flows/palette/icons/kdeapply.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applygmm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Gaussian Mixture", + "description": "CExposes the core features and commonly used parameters of the Gaussian Mixture Python library.", + "image": "images/custom-canvases/flows/palette/icons/applygmm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyxgboostas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "XGBoost-AS", + "description": "xgboostas.desc", + "image": "images/custom-canvases/flows/palette/icons/applyxgboostas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyxgboosttree", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "XGBoost Tree", + "description": "Uses an advanced implementation of a gradient boosting algorithm with a tree model as the base model.", + "image": "images/custom-canvases/flows/palette/icons/applyxgboosttree.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyxgboostlinear", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "XGBoost Linear", + "description": "Uses an advanced implementation of a gradient boosting algorithm with a linear model as the base model.", + "image": "images/custom-canvases/flows/palette/icons/applyxgboostlinear.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyocsvm", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "One-Class SVM", + "description": "Detects the soft boundary of a given set of samples, to then classify new points as belonging to that set or not.", + "image": "images/custom-canvases/flows/palette/icons/applyocsvm.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applymlpas", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "MultiLayerPerceptron-AS", + "description": "A classifier based on the feedforward artificial neural network. Consists of multiple layers.", + "image": "images/custom-canvases/flows/palette/icons/applymlpas.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyhdbscan", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "HDBSCAN", + "description": "Uses unsupervised learning to find clusters, or dense regions, of a data set.", + "image": "images/custom-canvases/flows/palette/icons/applyhdbscan.svg", + "x_pos": 0, + "y_pos": 0 + } + } + }, + { + "id": "", + "type": "binding", + "op": "applyntextminingworkbench", + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + } + } + ], + "parameters": {}, + "app_data": { + "ui_data": { + "label": "Text Mining Workbench", + "description": "Uses unsupervised learning to find clusters, or dense regions, of a data set.", + "image": "images/custom-canvases/flows/palette/icons/applytextminingworkbench.svg", + "x_pos": 0, + "y_pos": 0 + } + } + } + ] + } + ] +} diff --git a/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-react.jsx b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-react.jsx new file mode 100644 index 0000000000..55929c3571 --- /dev/null +++ b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-react.jsx @@ -0,0 +1,62 @@ +/* + * Copyright 2024 Elyra Authors + * + * 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 React from "react"; +import PropTypes from "prop-types"; +import PromptPalette from "./prompt-palette.json"; + +export default class PromptReactNode extends React.Component { + constructor(props) { + super(props); + + this.onScroll = this.onScroll.bind(this); + } + + onClick(nodeTemplate, evt) { + this.props.nodeData.app_data.prompt_data.addNodeCallback(nodeTemplate); + } + + onScroll(evt) { + evt.stopPropagation(); + + } + + render() { + const nodeDivs = []; + for (let i = 0; i < PromptPalette.categories[1].node_types.length; i++) { + const nodeTemplate = PromptPalette.categories[1].node_types[i]; + nodeDivs.push( +
+ { nodeTemplate.app_data.ui_data.label } +
+ ); + } + + return ( +
+ { nodeDivs } +
+ ); + } +} + +PromptReactNode.propTypes = { + canvasController: PropTypes.object.isRequired, + nodeData: PropTypes.object, + externalUtils: PropTypes.object +}; diff --git a/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-template.json b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-template.json new file mode 100644 index 0000000000..7c03834344 --- /dev/null +++ b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt-template.json @@ -0,0 +1,30 @@ +{ + "id": "1af18594-86db-4b21-8f40-16afad1ece0b", + "type": "execution_node", + "op": "prompt_node", + "app_data": { + "ui_data": { + "label": "Prompt", + "image": "images/custom-canvases/flows/palette/icons/type.svg", + "x_pos": 50, + "y_pos": 170, + "description": "A dummy node added to the canvas to prompt for the next node. Displayed as a 'react node'." + } + }, + "inputs": [ + { + "id": "inPort", + "app_data": { + "ui_data": { + "cardinality": { + "min": 0, + "max": 1 + }, + "label": "Input Port" + } + }, + "links": [ + ] + } + ] + } diff --git a/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt.scss b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt.scss new file mode 100644 index 0000000000..ece31c826d --- /dev/null +++ b/canvas_modules/harness/src/client/components/custom-canvases/prompt/prompt.scss @@ -0,0 +1,202 @@ +/* + * Copyright 2017-2023 Elyra Authors + * + * 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. + */ + +/* Override styles for flows.json canvas */ + +.prompt { + + .d3-node-group { + .d3-node-body-outline { + fill: transparent; + stroke: transparent; + } + + .d3-node-selection-highlight[data-selected="yes"] { + stroke: $gray-50; + stroke-dasharray: 5, 5; + stroke-width: 1; + fill: transparent; + pointer-events: none; + } + + .d3-node-port-output { + opacity: 0; + transform: translateX(-8px); + transition: opacity 0.1s cubic-bezier(0.4, 0.14, 0.3, 1), transform 0.1s cubic-bezier(0.175, 0.885, 0.32, 1.275); + transition-delay: 0.125s; + } + + .d3-node-ellipsis-group { + .d3-node-ellipsis { + fill: $icon-primary; + } + + &:hover { + .d3-node-ellipsis-background { + fill: $layer-accent-01; + } + } + } + + // Set the outline/background for decorations. This will only affect the + // zoom-in decorations on supernode since that is th eonly one with an + // outline. + .d3-node-dec-group { + .d3-node-dec-outline { + fill: transparent; + stroke-width: 0; + } + + .d3-node-dec-image[data-id*="supernode-zoom"] { + display: none; + fill: transparent; + stroke-width: 0; + } + } + + /* Hover over d3-node-group */ + &:hover { + .d3-node-port-output { + opacity: 1; + transform: translateX(0); + transition: opacity 0.1s cubic-bezier(0.175, 0.885, 0.32, 1.275), transform 0.1s cubic-bezier(0.175, 0.885, 0.32, 1.275); + transition-delay: 0.125s; + } + + // Set the outline/background for decorations. This will only affect the + // zoom-in decorations on supernode since that is the only one with an + // outline. + .d3-node-dec-group { + .d3-node-dec-image[data-id*="supernode-zoom"] { + display: block; + fill: $icon-primary; + stroke-width: 0; + } + + &:hover { + .d3-node-dec-outline { + fill: $layer-accent-01; + stroke-width: 0; + } + } + } + } + } + + .d3-data-link .d3-link-line, + .d3-data-link .d3-link-line-arrow-head { + fill: none; + stroke: $layer-selected-inverse; + stroke-width: 1; + } + + /* For association link */ + .d3-object-link .d3-link-line { + stroke: $border-strong-01; + stroke-width: 2; + fill: none; + stroke-dasharray: 5.5; + } + + .d3-comment-link .d3-link-line { + stroke: $border-strong-01; + stroke-width: 1; + fill: none; + stroke-dasharray: 10.5; + } + + + .d3-link-group:hover .d3-link-line, + .d3-link-group:hover .d3-link-line-arrow-head { + stroke: $button-primary; + stroke-width: 2; + } + + .d3-new-connection-line[linkType="nodeLink"] { + stroke: $button-primary; + stroke-width: 2; + stroke-dasharray: 1 0; + fill: none; + } + + .d3-comment-selection-highlight[data-selected="yes"] { + stroke: $gray-50; + stroke-dasharray: 5, 5; + stroke-width: 1; + fill: transparent; + pointer-events: none; + } + + /* Decoration Styles */ + + .node-cache-empty { + fill: $layer-01; + } + + .node-cache-full { + fill: $layer-01; + } + + .node-sql-pushback { + fill: $layer-01; + } + + /* Override styles in common canvas to fade out nodes and comments + when they are cut to the clipboard.*/ + .node-image[data-is-cut] { + zoom: 1; + filter: "alpha(opacity=50)"; + opacity: 0.5; + } + + .canvas-comment[data-is-cut] { + zoom: 1; + filter: "alpha(opacity=50)"; + opacity: 0.5; + } + + .canvas-ui-empty-placeholder { + height: 150px; + width: 320px; + display: flex; + flex-direction: column; + justify-content: center; + } + + .canvas-ui-empty-image-placeholder { + height: 150px; + width: 250px; + float: left; + margin-left: -48px; + } + + .canvas-ui-empty-text-placeholder { + @include type-style("productive-heading-03"); + color: $text-primary; + } + + .canvas-ui-empty-subtext-placeholder { + @include type-style("body-long-02"); + color: $text-secondary; + margin-top: 8px; + } + + .canvas-ui-empty-node-text { + @include type-style("productive-heading-02"); + color: $text-secondary; + } + +} diff --git a/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx b/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx index 795704541a..c4340d2d21 100644 --- a/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx +++ b/canvas_modules/harness/src/client/components/sidepanel/canvas/sidepanel-canvas.jsx @@ -29,6 +29,7 @@ import { EXAMPLE_APP_FLOWS, EXAMPLE_APP_STAGES, EXAMPLE_APP_STAGES_CARD_NODE, + EXAMPLE_APP_PROMPT, EXAMPLE_APP_EXPLAIN, EXAMPLE_APP_EXPLAIN2, EXAMPLE_APP_STREAMS, @@ -1252,6 +1253,10 @@ export default class SidePanelForms extends React.Component { value={EXAMPLE_APP_STAGES_CARD_NODE} labelText={EXAMPLE_APP_STAGES_CARD_NODE} /> +