简单
package main
import (
"fmt"
"github.com/zenmodel/zenmodel"
)
func main() {
bp := zenmodel.NewBrainPrint()
bp.AddNeuron("n1", fn1)
bp.AddNeuron("n2", fn2)
_, err := bp.AddLink("n1", "n2")
if err != nil {
fmt.Printf("add link error: %s\n", err)
return
}
_, err = bp.AddEntryLink("n1")
if err != nil {
fmt.Printf("add entry link error: %s\n", err)
return
}
brain := bp.Build()
_ = brain.Entry()
brain.Wait()
name := brain.GetMemory("name").(string)
fmt.Printf("result: my name is %s.\n", name)
}
func fn1(b zenmodel.BrainRuntime) error {
fmt.Println("start fn1 ..............")
if err := b.SetMemory("name", "Clay"); err != nil {
return err
}
return nil
}
func fn2(b zenmodel.BrainRuntime) error {
fmt.Println("start fn2 ..............")
firstName := b.GetMemory("name").(string)
name := firstName + " Zhang"
if err := b.SetMemory("name", name); err != nil {
return err
}
return nil
}
图
并行与等待
package main
import (
"fmt"
"github.com/zenmodel/zenmodel"
)
var (
entryInput, entryPoetry, entryJoke string
)
func main() {
bp := zenmodel.NewBrainPrint()
bp.AddNeuron("input", inputFn)
bp.AddNeuron("poetry-template", poetryFn)
bp.AddNeuron("joke-template", jokeFn)
bp.AddNeuron("generate", genFn)
inputIn, _ := bp.AddLink("input", "generate")
poetryIn, _ := bp.AddLink("poetry-template", "generate")
jokeIn, _ := bp.AddLink("joke-template", "generate")
entryInput, _ = bp.AddEntryLink("input")
entryPoetry, _ = bp.AddEntryLink("poetry-template")
entryJoke, _ = bp.AddEntryLink("joke-template")
_ = bp.AddTriggerGroup("generate", inputIn, poetryIn)
_ = bp.AddTriggerGroup("generate", inputIn, jokeIn)
brain := bp.Build()
// case 1: entry poetry and input
// expect: generate poetry
_ = brain.TrigLinks(entryPoetry)
_ = brain.TrigLinks(entryInput)
// case 2:entry joke and input
// expect: generate joke
//_ = brain.TrigLinks(entryJoke)
//_ = brain.TrigLinks(entryInput)
// case 3: entry poetry and joke
// expect: keep blocking and waiting for any trigger group triggered
//_ = brain.TrigLinks(entryPoetry)
//_ = brain.TrigLinks(entryJoke)
// case 4: entry only poetry
// expect: keep blocking and waiting for any trigger group triggered
//_ = brain.TrigLinks(entryPoetry)
// case 5: entry all
// expect: The first done trigger group triggered activates the generated Neuron,
// and the trigger group triggered later does not activate the generated Neuron again.
//_ = brain.Entry()
brain.Wait()
}
func inputFn(b zenmodel.BrainRuntime) error {
_ = b.SetMemory("input", "orange")
return nil
}
func poetryFn(b zenmodel.BrainRuntime) error {
_ = b.SetMemory("template", "poetry")
return nil
}
func jokeFn(b zenmodel.BrainRuntime) error {
_ = b.SetMemory("template", "joke")
return nil
}
func genFn(b zenmodel.BrainRuntime) error {
input := b.GetMemory("input").(string)
tpl := b.GetMemory("template").(string)
fmt.Printf("Generating %s for %s\n", tpl, input)
return nil
}
分支
package main
import (
"fmt"
"github.com/zenmodel/zenmodel"
)
func main() {
bp := zenmodel.NewBrainPrint()
bp.AddNeuron("condition", func(runtime zenmodel.BrainRuntime) error {
return nil // do nothing
})
bp.AddNeuron("cell-phone", func(runtime zenmodel.BrainRuntime) error {
fmt.Printf("Run here: Cell Phone\n")
return nil
})
bp.AddNeuron("laptop", func(runtime zenmodel.BrainRuntime) error {
fmt.Printf("Run here: Laptop\n")
return nil
})
bp.AddNeuron("ps5", func(runtime zenmodel.BrainRuntime) error {
fmt.Printf("Run here: PS5\n")
return nil
})
bp.AddNeuron("tv", func(runtime zenmodel.BrainRuntime) error {
fmt.Printf("Run here: TV\n")
return nil
})
bp.AddNeuron("printer", func(runtime zenmodel.BrainRuntime) error {
fmt.Printf("Run here: Printer\n")
return nil
})
cellPhone, _ := bp.AddLink("condition", "cell-phone")
laptop, _ := bp.AddLink("condition", "laptop")
ps5, _ := bp.AddLink("condition", "ps5")
tv, _ := bp.AddLink("condition", "tv")
printer, _ := bp.AddLink("condition", "printer")
// add entry link
_, _ = bp.AddEntryLink("condition")
/*
Category 1: Electronics
- Cell Phone
- Laptop
- PS5
Category 2: Entertainment Devices
- Cell Phone
- PS5
- TV
Category 3: Office Devices
- Laptop
- Printer
- Cell Phone
*/
_ = bp.AddLinkToCastGroup("condition", "electronics",
cellPhone, laptop, ps5)
_ = bp.AddLinkToCastGroup("condition",
"entertainment-devices",
cellPhone, ps5, tv)
_ = bp.AddLinkToCastGroup(
"condition", "office-devices",
laptop, printer, cellPhone)
_ = bp.BindCastGroupSelectFunc("condition", func(brain zenmodel.BrainRuntime) string {
return brain.GetMemory("category").(string)
})
brain := bp.Build()
_ = brain.EntryWithMemory("category", "electronics")
//_ = brain.EntryWithMemory("category", "entertainment-devices")
//_ = brain.EntryWithMemory("category", "office-devices")
//_ = brain.EntryWithMemory("category", "NOT-Defined")
brain.Wait()
}
嵌套
package main
import (
"fmt"
"github.com/zenmodel/zenmodel"
)
func main() {
bp := zenmodel.NewBrainPrint()
bp.AddNeuron("nested", nestedBrain)
_, _ = bp.AddEntryLink("nested")
brain := bp.Build()
_ = brain.Entry()
brain.Wait()
fmt.Printf("nested result: %s\n", brain.GetMemory("nested_result").(string))
}
func nestedBrain(outerBrain zenmodel.BrainRuntime) error {
bp := zenmodel.NewBrainPrint()
bp.AddNeuron("run", func(curBrain zenmodel.BrainRuntime) error {
_ = curBrain.SetMemory("result", fmt.Sprintf("run here neuron: %s.%s", outerBrain.GetCurrentNeuronID(), curBrain.GetCurrentNeuronID()))
return nil
})
_, _ = bp.AddEntryLink("run")
brain := bp.Build()
// run nested brain
_ = brain.Entry()
brain.Wait()
// get nested brain result
result := brain.GetMemory("result").(string)
// pass nested brain result to outer brain
_ = outerBrain.SetMemory("nested_result", result)
return nil
}