Advertisement
Guest User

Untitled

a guest
May 30th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.76 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4. import "strconv"
  5. import "sort"
  6.  
  7. //================================================
  8. //================================================
  9. //================================================
  10.  
  11. //EdgeName .
  12. type EdgeName struct {
  13.     name   string
  14.     number int
  15. }
  16.  
  17. //-------------------------------------------------
  18.  
  19. //EdgeNames .
  20. type EdgeNames []EdgeName
  21.  
  22. //-------------------------------------------------
  23.  
  24. func (edgeNames EdgeNames) Len() int {
  25.     return len(edgeNames)
  26. }
  27.  
  28. //-------------------------------------------------
  29.  
  30. func (edgeNames EdgeNames) Less(i, j int) bool {
  31.     return edgeNames[i].number < edgeNames[j].number
  32. }
  33.  
  34. //-------------------------------------------------
  35.  
  36. func (edgeNames EdgeNames) Swap(i, j int) {
  37.     edgeNames[i], edgeNames[j] = edgeNames[j], edgeNames[i]
  38. }
  39.  
  40. //================================================
  41. //================================================
  42. //================================================
  43.  
  44. //Node . Element of automaton
  45. type Node struct {
  46.     edges   []*Node
  47.     input   []int
  48.     signals []EdgeName
  49.     isEnter bool
  50.     name    int
  51. }
  52.  
  53. //HyperNode . Node, contains other nodes.
  54. type HyperNode struct {
  55.     elements []*Node
  56.     edges    []*HyperNode
  57.     isEnter  bool
  58.     name     int
  59.     signals  map[*HyperNode][]string
  60. }
  61.  
  62. //================================================
  63. //================================================
  64. //================================================
  65.  
  66. func (hyperNode *HyperNode) find(elem *Node) bool {
  67.     for i := 0; i < len(hyperNode.elements); i++ {
  68.         if elem.name == hyperNode.elements[i].name {
  69.             return true
  70.         }
  71.     }
  72.     return false
  73. }
  74.  
  75. //-------------------------------------------------
  76.  
  77. func (hyperNode *HyperNode) add(elem *Node) {
  78.     hyperNode.elements = append(hyperNode.elements, elem)
  79. }
  80.  
  81. //-------------------------------------------------
  82.  
  83. func (hyperNode *HyperNode) getNameString() (name string) {
  84.  
  85.     var array []int
  86.     array = make([]int, 0)
  87.  
  88.     for i := 0; i < len(hyperNode.elements); i++ {
  89.         array = append(array, hyperNode.elements[i].name)
  90.     }
  91.  
  92.     sort.Ints(array)
  93.  
  94.     for i := 0; i < len(array); i++ {
  95.  
  96.         if len(name) != 0 {
  97.             name += " "
  98.         }
  99.  
  100.         name += strconv.Itoa(array[i])
  101.     }
  102.  
  103.     return name
  104. }
  105.  
  106. //-------------------------------------------------
  107.  
  108. func (hyperNode *HyperNode) getEdgeString(b *HyperNode) (name string) {
  109.     for _, value := range hyperNode.signals[b] {
  110.         if len(name) != 0 {
  111.             name += " "
  112.         }
  113.         name += value
  114.     }
  115.     return name
  116. }
  117.  
  118. //-------------------------------------------------
  119.  
  120. func (hyperNode *HyperNode) contains(a []*HyperNode) bool {
  121.  
  122.     var count int
  123.  
  124.     for i := 0; i < len(a); i++ {
  125.  
  126.         count = 0
  127.  
  128.         if len(a[i].elements) != len(hyperNode.elements) {
  129.             continue
  130.         }
  131.  
  132.         for j := 0; j < len(a[i].elements); j++ {
  133.             if a[i].elements[j].name == hyperNode.elements[j].name {
  134.                 count++
  135.             }
  136.         }
  137.         if count == len(a[i].elements) {
  138.             return true
  139.         }
  140.     }
  141.  
  142.     return false
  143.  
  144. }
  145.  
  146. //================================================
  147. //==============MAIN FUNCTION====================
  148. //================================================
  149.  
  150. func main() {
  151.     nodes, startState, alphabet := getAutomaton()
  152.     result := determinization(nodes, startState, alphabet)
  153.     print(result, startState)
  154. }
  155.  
  156. //================================================
  157. //================================================
  158. //================================================
  159.  
  160. func addToAlphabet(alphabet []string, element string) []string {
  161.     for _, value := range alphabet {
  162.         if value == element {
  163.             return alphabet
  164.         }
  165.     }
  166.     return append(alphabet, element)
  167. }
  168.  
  169. func getAutomaton() (nodes []*Node, start int, alphabet []string) {
  170.     var n, m int
  171.     fmt.Scan(&n)
  172.     fmt.Scan(&m)
  173.     nodes = make([]*Node, n)
  174.     alphabet = make([]string, 0)
  175.  
  176.     for i := 0; i < n; i++ {
  177.         nodes[i] = new(Node)
  178.         nodes[i].name = i
  179.         nodes[i].edges = make([]*Node, 0)
  180.         nodes[i].input = make([]int, 0)
  181.         nodes[i].signals = make([]EdgeName, 0)
  182.     }
  183.  
  184.     var in, out int
  185.     var sygn string
  186.  
  187.     for i := 0; i < m; i++ {
  188.         fmt.Scan(&in)
  189.         fmt.Scan(&out)
  190.         fmt.Scan(&sygn)
  191.         nodes[in].edges = append(nodes[in].edges, nodes[out])
  192.         nodes[out].input = append(nodes[out].input, in)
  193.         alphabet = addToAlphabet(alphabet, sygn)
  194.         nodes[in].signals = append(nodes[in].signals, EdgeName{sygn, i})
  195.     }
  196.  
  197.     for i := 0; i < n; i++ {
  198.         fmt.Scan(&in)
  199.         if in == 1 {
  200.             nodes[i].isEnter = true
  201.         } else {
  202.             nodes[i].isEnter = false
  203.         }
  204.     }
  205.  
  206.     fmt.Scan(&start)
  207.     return nodes, start, alphabet
  208. }
  209.  
  210. //================================================
  211. //================================================
  212. //================================================
  213.  
  214. func closure(set []*Node) (hyperNode *HyperNode) {
  215.     hyperNode = new(HyperNode)
  216.     hyperNode.elements = make([]*Node, 0)
  217.     hyperNode.edges = make([]*HyperNode, 0)
  218.     hyperNode.signals = make(map[*HyperNode][]string)
  219.  
  220.     for i := 0; i < len(set); i++ {
  221.         dfs(set[i], hyperNode)
  222.     }
  223.     return hyperNode
  224. }
  225.  
  226. //Helper for closure()
  227. func dfs(elem *Node, hyperNode *HyperNode) {
  228.     if !hyperNode.find(elem) {
  229.         hyperNode.add(elem)
  230.         for i := 0; i < len(elem.edges); i++ {
  231.             if elem.signals[i].name == "lambda" {
  232.                 dfs(elem.edges[i], hyperNode)
  233.             }
  234.         }
  235.     }
  236. }
  237.  
  238. func makeSet(value string, hyperNode *HyperNode) (set []*Node) {
  239.     set = make([]*Node, 0)
  240.     for _, node := range hyperNode.elements {
  241.         for k, edgeName := range node.signals {
  242.             if edgeName.name == value {
  243.                 set = append(set, node.edges[k])
  244.             }
  245.         }
  246.     }
  247.     return set
  248. }
  249.  
  250. //================================================
  251. //================================================
  252. //================================================
  253.  
  254. func determinization(nodes []*Node, startState int, alphabet []string) (result []*HyperNode) {
  255.     count := 0
  256.  
  257.     var set []*Node
  258.     set = make([]*Node, 0)
  259.     set = append(set, nodes[startState])
  260.  
  261.     result = make([]*HyperNode, 0)
  262.     startHyperNode := closure(set)
  263.  
  264.     var stack []*HyperNode
  265.     stack = make([]*HyperNode, 0)
  266.     stack = append(stack, startHyperNode)
  267.     for len(stack) > 0 {
  268.         hyper := stack[len(stack)-1]
  269.         stack = stack[:len(stack)-1]
  270.  
  271.         for i := 0; i < len(hyper.elements); i++ {
  272.  
  273.             if hyper.elements[i].isEnter {
  274.                 hyper.isEnter = true
  275.                 break
  276.             }
  277.         }
  278.         for _, value := range alphabet {
  279.  
  280.             set = makeSet(value, hyper)
  281.  
  282.             hyperNode := closure(set)
  283.  
  284.             if !hyperNode.contains(result) {
  285.                 hyperNode.name = count
  286.                 count++
  287.                 result = append(result, hyperNode)
  288.                 stack = append(stack, hyperNode)
  289.             }
  290.  
  291.             _, ok := hyper.signals[hyperNode]
  292.             if !ok {
  293.                 hyper.signals[hyperNode] = make([]string, 0)
  294.             }
  295.             if value != "lambda" {
  296.                 hyper.signals[hyperNode] = append(hyper.signals[hyperNode], value)
  297.             }
  298.         }
  299.     }
  300.     return result
  301. }
  302.  
  303. //================================================
  304. //================================================
  305. //================================================
  306.  
  307. func print(result []*HyperNode, startState int) {
  308.     fmt.Println("digraph {")
  309.     fmt.Println("rankdir = LR")
  310.     fmt.Println("dummy [label = \"\", shape = none]")
  311.  
  312.     for i := 0; i < len(result); i++ {
  313.         fmt.Printf("%d [label = \"[%s]\", shape = ", i, result[i].getNameString())
  314.  
  315.         if result[i].isEnter {
  316.             fmt.Println("doublecircle]")
  317.         } else {
  318.             fmt.Println("circle]")
  319.         }
  320.     }
  321.  
  322.     fmt.Println("dummy -> 0")
  323.  
  324.     for i, hyperNode := range result {
  325.         for key := range hyperNode.signals {
  326.             if len(hyperNode.signals[key]) != 0 {
  327.                 fmt.Printf("%d -> %d [label = %s]\n", i, key.name, hyperNode.getEdgeString(key))
  328.             }
  329.         }
  330.     }
  331.  
  332.     // for i := 0; i < len(result); i++ {
  333.     //  for
  334.     //  // for j := 0; j < len(result[i].edges); j++ {
  335.     //  //  fmt.Println("asdasdasdasd", result[i].edges[j].name)
  336.     //  //  fmt.Printf("%d -> %d [label = %s]\n", i, result[i].edges[j].name, result[i].getEdgeString(result[result[i].edges[j].name]))
  337.     //  // }
  338.     // }
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement