load-store.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package std
  2. import (
  3. "encoding/json"
  4. "gone/model"
  5. "io"
  6. )
  7. type Link struct {
  8. NodeId int `json:"node"`
  9. LinkId int `json:"out"`
  10. }
  11. type NodeStruct struct {
  12. Outs []int `json:"out"`
  13. Ins []Link `json:"in,omitempty"`
  14. }
  15. type LayerStruct struct {
  16. Nodes []*NodeStruct `json:"node"`
  17. Role string `json:"role"`
  18. }
  19. func Store(wr io.Writer, first *model.Layer) error {
  20. res := make([]*LayerStruct, 0)
  21. for l := first; l != nil; l = l.Next {
  22. next := &LayerStruct{Role: l.Role}
  23. for _, n := range l.Nodes {
  24. node := &NodeStruct{}
  25. for _, w := range n.Weights {
  26. node.Outs = append(node.Outs, w)
  27. }
  28. for k, _ := range n.In {
  29. link := Link{NodeId: k.NodeId, LinkId: k.LinkId}
  30. node.Ins = append(node.Ins, link)
  31. }
  32. next.Nodes = append(next.Nodes, node)
  33. }
  34. res = append(res, next)
  35. }
  36. return json.NewEncoder(wr).Encode(res)
  37. }
  38. func Load(rd io.Reader) (ret *model.Layer, err error) {
  39. ll := make([]*LayerStruct, 0)
  40. if err = json.NewDecoder(rd).Decode(&ll); err == nil {
  41. var this *model.Layer
  42. for _, l := range ll {
  43. if ret == nil {
  44. this = &model.Layer{Role: l.Role}
  45. ret = this
  46. } else {
  47. this.Next = &model.Layer{Role: l.Role}
  48. this = this.Next
  49. }
  50. for _, n := range l.Nodes {
  51. node := model.NewNode()
  52. for _, w := range n.Outs {
  53. node.Weights = append(node.Weights, w)
  54. }
  55. node.Out = make([]interface{}, len(node.Weights))
  56. for _, l := range n.Ins {
  57. link := model.Link{LinkId: l.LinkId, NodeId: l.NodeId}
  58. node.In[link] = nil
  59. }
  60. this.Nodes = append(this.Nodes, node)
  61. }
  62. }
  63. }
  64. return
  65. }