1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package std
- import (
- "github.com/kpmy/ypk/assert"
- "gone/perc"
- "math/rand"
- )
- func New(nn, no int, w_fn func() int) (ret *model.Layer) {
- ret = &model.Layer{}
- for i := 0; i < nn; i++ {
- next := model.NewNode()
- next.Out = make([]interface{}, rand.Intn(no)+1)
- next.Weights = make([]int, len(next.Out))
- if w_fn != nil {
- for i := 0; i < len(next.Weights); i++ {
- next.Weights[i] = w_fn()
- }
- }
- ret.Nodes = append(ret.Nodes, next)
- }
- return
- }
- func Join(in *model.Layer, out *model.Layer) {
- j := 0
- type im map[int]interface{}
- cache := make([]im, len(out.Nodes))
- for k, n := range in.Nodes {
- for i := 0; i < len(n.Out); {
- assert.For(len(n.Out) <= len(out.Nodes), 20, len(n.Out), len(out.Nodes))
- l := model.Link{NodeId: k, LinkId: i}
- skip := false
- if cache[j] != nil {
- if _, ok := cache[j][k]; ok {
- skip = true
- j++
- if j == len(cache) {
- j = 0
- }
- }
- }
- if !skip {
- out.Nodes[j].In[l] = nil
- if cache[j] == nil {
- cache[j] = make(im)
- }
- cache[j][k] = l
- //log.Println(l, "to", j)
- i++
- }
- //log.Println(k, len(n.Out), i, j)
- }
- }
- in.Next = out
- }
|