table.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //dynamicaly loading from outer space
  2. package rules2
  3. import (
  4. cpm "fw/cp/module"
  5. "fw/rt2"
  6. "fw/rt2/context"
  7. "fw/rt2/decision"
  8. "fw/rt2/frame"
  9. "fw/rt2/frame/std"
  10. rtm "fw/rt2/module"
  11. _ "fw/rt2/rules2/wrap"
  12. "fw/rt2/rules2/wrap/eval"
  13. "fw/utils"
  14. "log"
  15. "time"
  16. "ypk/assert"
  17. )
  18. type flow struct {
  19. root frame.Stack
  20. parent frame.Frame
  21. domain context.Domain
  22. fl []frame.Frame
  23. cl []frame.Frame
  24. this int
  25. }
  26. func (f *flow) Do() (ret frame.WAIT) {
  27. const Z frame.WAIT = -1
  28. x := Z
  29. if f.this >= 0 {
  30. x = f.fl[f.this].Do()
  31. }
  32. switch x {
  33. case frame.NOW, frame.WRONG, frame.LATER, frame.BEGIN:
  34. ret = x
  35. case frame.END:
  36. old := f.Root().(*std.RootFrame).Drop()
  37. assert.For(old != nil, 40)
  38. f.cl = append(f.cl, old)
  39. ret = frame.LATER
  40. case frame.STOP, Z:
  41. f.this--
  42. if f.this >= 0 {
  43. ret = frame.LATER
  44. } else {
  45. if len(f.cl) > 0 {
  46. for _, old := range f.cl {
  47. n := rt2.NodeOf(old)
  48. rt2.Push(rt2.New(n), old.Parent())
  49. }
  50. f.cl = nil
  51. ret = frame.LATER
  52. } else {
  53. ret = frame.STOP
  54. }
  55. }
  56. }
  57. utils.PrintFrame(">", ret)
  58. return ret
  59. }
  60. func (f *flow) OnPush(root frame.Stack, parent frame.Frame) {
  61. f.root = root
  62. f.parent = parent
  63. //fmt.Println("flow control pushed")
  64. f.this = len(f.fl) - 1
  65. }
  66. func (f *flow) OnPop() {
  67. //fmt.Println("flow control poped")
  68. }
  69. func (f *flow) Parent() frame.Frame { return f.parent }
  70. func (f *flow) Root() frame.Stack { return f.root }
  71. func (f *flow) Domain() context.Domain { return f.domain }
  72. func (f *flow) Init(d context.Domain) {
  73. assert.For(f.domain == nil, 20)
  74. assert.For(d != nil, 21)
  75. f.domain = d
  76. }
  77. func (f *flow) Handle(msg interface{}) {
  78. assert.For(msg != nil, 20)
  79. }
  80. func (f *flow) grow(global context.Domain, m *cpm.Module) {
  81. utils.PrintScope("queue", m.Name)
  82. nf := rt2.New(m.Enter)
  83. f.root.PushFor(nf, nil)
  84. f.fl = append(f.fl, nf)
  85. global.Attach(m.Name, nf.Domain())
  86. }
  87. func run(global context.Domain, init []*cpm.Module) {
  88. {
  89. fl := &flow{root: std.NewRoot()}
  90. global.Attach(context.STACK, fl.root.(context.ContextAware))
  91. global.Attach(context.MT, fl)
  92. for i := len(init) - 1; i >= 0; i-- {
  93. fl.grow(global, init[i])
  94. }
  95. fl.root.PushFor(fl, nil)
  96. i := 0
  97. t0 := time.Now()
  98. for x := frame.NOW; x == frame.NOW; x = fl.root.(frame.Frame).Do() {
  99. utils.PrintFrame("STEP", i)
  100. //assert.For(i < 1000, 40)
  101. i++
  102. }
  103. t1 := time.Now()
  104. log.Println("total steps", i)
  105. log.Println("spent", t1.Sub(t0))
  106. }
  107. }
  108. func ld(f frame.Frame, name string) {
  109. //fmt.Println("try to load", msg.Data)
  110. glob := f.Domain().Global()
  111. modList := glob.Discover(context.MOD).(rtm.List)
  112. fl := glob.Discover(context.MT).(*flow)
  113. ml := make([]*cpm.Module, 0)
  114. _, err := modList.Load(name, func(m *cpm.Module) {
  115. ml = append(ml, m)
  116. })
  117. for i := len(ml) - 1; i >= 0; i-- {
  118. fl.grow(glob, ml[i])
  119. }
  120. assert.For(err == nil, 60)
  121. }
  122. func init() {
  123. decision.Run = run
  124. eval.LoadMod = ld
  125. }