ソースを参照

New visualizer

luis 7 年 前
コミット
308e675172

+ 3 - 7
browser/vue-flow/package.json

@@ -6,7 +6,8 @@
   "license": "MIT",
   "private": true,
   "scripts": {
-    "docker": "docker build --rm -t hexasoftware.com:5000/flow-proto -f ./docker/Dockerfile .",
+    "docker":
+      "docker build --rm -t hexasoftware.com:5000/flow-proto -f ./docker/Dockerfile .",
     "docker-pull": "docker push hexasoftware.com:5000/flow-proto",
     "dev": "cross-env NODE_ENV=development webpack-dev-server --hot",
     "build": "cross-env NODE_ENV=production webpack --hide-modules"
@@ -19,11 +20,7 @@
     "vuex": "^3.0.1",
     "vuex-router-sync": "^5.0.0"
   },
-  "browserslist": [
-    "> 1%",
-    "last 2 versions",
-    "not ie <= 8"
-  ],
+  "browserslist": ["> 1%", "last 2 versions", "not ie <= 8"],
   "devDependencies": {
     "babel-core": "^6.26.0",
     "babel-eslint": "^8.2.1",
@@ -49,7 +46,6 @@
     "highlight-loader": "^0.7.2",
     "html-loader": "^0.5.5",
     "html-webpack-plugin": "^2.30.1",
-    "lodash.debounce": "^4.0.8",
     "markdown-loader": "^2.0.2",
     "marked": "^0.3.12",
     "node-sass": "^4.7.2",

+ 1 - 0
browser/vue-flow/src/assets/doc/readme.md

@@ -282,6 +282,7 @@ would be good to have the same by right clicking in other subjects:
 
 * Backend: Export/Deploy a model to a training cluster;
 * Backend: Expose the model possibly via an Rest API for easy function access;
+* Backend: Create output for flow-web/flow so we can fetch data for it
 
 ### Other
 

+ 10 - 4
browser/vue-flow/src/components/flow/modal-data.vue

@@ -1,12 +1,12 @@
 <template>
   <div slot="body">
     WIP: canvas maybe?
-    <p> {{ nodeInspect }}</p>
-    <hr>
-    <p> {{ nodeActivity }} </p>
     <hr>
     Data:
-    <p>{{ data }}</p>
+    <img
+      v-if="type == 'image'"
+      :src="data">
+    <p v-else>{{ data }}</p>
   </div>
 </template>
 <script>
@@ -20,6 +20,12 @@ export default {
     nodeInspect () {
       return this.$store.state.flow.nodeInspect
     },
+    type () {
+      if (this.data.startsWith('data:image')) {
+        return 'image'
+      }
+      return 'raw'
+    },
     data () {
       // This way we can parse data and show it somehow
       // Could be a base64etc.etc. url generated by server

+ 10 - 0
go/src/demos/ops/ml/activators.go

@@ -0,0 +1,10 @@
+package ml
+
+import "math"
+
+func sigmoid(v float64) float64 {
+	return 1 / (1 + math.Exp(-v))
+}
+func sigmoidPrime(v float64) float64 {
+	return v * (1 - v)
+}

+ 45 - 0
go/src/demos/ops/ml/experiments.go

@@ -0,0 +1,45 @@
+package ml
+
+import (
+	"bytes"
+	"encoding/base64"
+	"flow/flowserver"
+	"image"
+	"image/png"
+)
+
+// Test
+func toGrayImage(data []float64, w, h int) (flowserver.Base64Data, error) {
+	// Convert matrix to byte 0-255
+
+	/*bdata := make([]byte, w*h)
+	for i, v := range data {
+		bdata[i] = byte(v * 255)
+	}*/
+
+	img := image.NewGray(image.Rect(0, 0, w, h))
+	for i, v := range data {
+		img.Pix[i] = byte(v * 255)
+	}
+	pngEncoded := bytes.NewBuffer(nil)
+
+	err := png.Encode(pngEncoded, img)
+	if err != nil {
+		return flowserver.Base64Data([]byte{}), err
+	}
+
+	base64enc := base64.StdEncoding.EncodeToString(pngEncoded.Bytes())
+
+	out := bytes.NewBuffer(nil)
+	out.WriteString("data:image/png;base64,")
+	out.WriteString(base64enc)
+
+	return flowserver.Base64Data(out.String()), nil
+
+	/*for y:=0;y<h;y++ {
+		for x:=0;x<w;x++ {
+			bdata[x + y *w] = data[
+		}
+	}*/
+
+}

+ 3 - 9
go/src/demos/ops/ml/gonumops.go

@@ -4,7 +4,6 @@ package ml
 import (
 	"flow"
 	"flow/registry"
-	"math"
 	"math/rand"
 
 	"gonum.org/v1/gonum/mat"
@@ -37,9 +36,11 @@ func New() *registry.R {
 			return []flow.Data{a, b, c, d}
 		}).Inputs("dummy", "dummy", "dummy", "dummy"),
 	).Description("gonum functions").
-		Tags("machine learning").
+		Tags("gonum").
 		Extra("style", registry.M{"color": "#953"})
 
+	r.Add(toGrayImage).Tags("experiment")
+
 	return r
 }
 
@@ -117,10 +118,3 @@ func toFloatArr(a Matrix) []float64 {
 	}
 	return ret
 }
-
-func sigmoid(v float64) float64 {
-	return 1 / (1 + math.Exp(-v))
-}
-func sigmoidPrime(v float64) float64 {
-	return v * (1 - v)
-}

+ 1 - 2
go/src/flow/flowserver/flowbuilder/model.go

@@ -1,7 +1,6 @@
 package flowbuilder
 
-// Node that will contain registry src
-
+// Node flow-ui node representation
 type Node struct {
 	ID            string            `json:"id"`
 	Src           string            `json:"src"`

+ 3 - 0
go/src/flow/flowserver/flowmodel.go

@@ -0,0 +1,3 @@
+package flowserver
+
+type Base64Data string

+ 4 - 1
go/src/flow/flowserver/session.go

@@ -252,7 +252,10 @@ func (s *FlowSession) NodeProcess(c *websocket.Conn, data []byte) error {
 					case "Finish":
 						status = "finish"
 						act.EndTime = triggerTime
-						if nodeID == ID { // only load data from requested node
+						// only load data from requested node
+						// Or if node has the data retrieval flag
+						node := builder.Doc.FetchNodeByID(ID)
+						if node.Prop["data"] == "true" || nodeID == ID {
 							act.Data = extra[0]
 						}
 					case "Error":