Advertisement
Ladies_Man

Min Recognizer (минимизац распозн авт)

Jun 10th, 2014
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.32 KB | None | 0 0
  1. package main
  2. import "fmt"
  3.  
  4. var k, m, n, q0, k1, m1, n1, q01 int
  5.  
  6. func new_delta(n, m int) [][]int {
  7.         a := make([][]int, n)
  8.     for i := 0; i < n; i++ { a[i] = make([]int, m) }
  9.     return a
  10. }
  11.  
  12. func new_str_matrix(n, m int) [][]string {
  13.     a := make([][]string, n)
  14.     for i := 0; i < n; i++ { a[i] = make([]string, m) }
  15.     for i := 0; i < n; i++ { for j := 0; j < m; j++ { a[i][j] = "" } }
  16.     return a
  17. }
  18.  
  19. func Split1_Recognizer(F []int) (m int, pi []int) {
  20.     pi, m = make([]int, 0), 2
  21.     for i := 0; i < n; i++ { pi = append(pi, 0) }
  22.     for q, _ := range F { if F[q] == 1 { pi[q] = 1 } else { pi[q] = 0 } }
  23.     return
  24. }
  25.  
  26. func Split(delta [][]int, pi []int) (int, []int) {
  27.     var Union func(int, int, int)
  28.     m_classes, pi1 := len(delta), make([]int, 0, len(delta))
  29.    
  30.     Union = func(x, y, z int) {
  31.         for z < len(pi1) { if pi1[z] == x { pi1[z] = y }; z++ }
  32.     }
  33.  
  34.     for i, _ := range delta { pi1 = append(pi1, i) }
  35.     for i, _ := range delta {
  36.         for j, _ := range delta {
  37.             if pi[i] == pi[j] && pi1[i] != pi1[j] {
  38.                 eq := true
  39.                 for k := 0; k < len(delta[q0]); k++ {
  40.                     w1, w2 := delta[i][k], delta[j][k]
  41.                     if pi[w1] != pi[w2] {
  42.                         eq = false
  43.                         break
  44.                     }
  45.                 }
  46.                 if eq { Union(pi1[i], pi1[j], 0); m_classes-- }
  47.             }
  48.         }
  49.     }
  50.     return m_classes, pi1
  51. }
  52.  
  53. func AufenkampHohn_Recognizer(delta [][]int, F []int) ([][]int, []int) {
  54.         m, pi := Split1_Recognizer(F)
  55.     m1, pi1 := -1, make([]int, 0, n)
  56.     for {
  57.         if m1, pi1 = Split(delta, pi); m == m1 { break }
  58.         m, pi = m1, pi1
  59.     }
  60.     m1 = 0
  61.     pi2, h3 := new_delta(n, n), make(map[int]int)
  62.  
  63.     var Exists func(int) bool
  64.     Exists = func(v int) bool {
  65.         _, ok := h3[v]
  66.         if ok { return true }
  67.         return false
  68.     }
  69.  
  70.     for i := 0; i < n; i++ {
  71.         if !Exists(pi1[i]) {
  72.             h3[pi1[i]] = m1
  73.             for j := 0; j < n; j++ { if pi1[i] == pi1[j] { pi2[j][0] = h3[pi1[i]] } }
  74.             m1++
  75.         }
  76.     }
  77.  
  78.     delta1, F1 := new_delta(m, k), make([]int, m)
  79.     for i := 0; i < n; i++ {
  80.         for j := 0; j < k; j++ { delta1[pi2[i][0]][j] = pi2[delta[i][j]][0] }
  81.         F1[pi2[i][0]] = F[i]
  82.     }
  83.  
  84.     k1, n1, q01 = k, m, pi2[q0][0]
  85.     return delta1, F1
  86. }
  87.  
  88. func Vis_Recognizer(alphabet []string, delta1 [][]int, F1 []int) {
  89.     matr := new_str_matrix(n1, n1)
  90.     fmt.Printf("digraph {\n\trankdir = LR\n\tdummy [label = \"\", shape = none]\n")
  91.     for i := 0; i < n1; i++ {
  92.         fmt.Printf("\t%d [shape = ", i)
  93.         if F1[i] == 1 { fmt.Printf("double") }
  94.         fmt.Printf("circle]\n")
  95.     }
  96.     fmt.Printf("\tdummy -> %d\n", q01)
  97.  
  98.     for i := 0; i < n1; i++ { for j, x := range delta1[i] { matr[i][x] += alphabet[j]+"," } }
  99.     for i := 0; i < n1; i++ { for j := 0; j < n1; j++ {
  100.         if matr[i][j] != "" {
  101.                         fmt.Printf("\t%d -> %d [label = \"%s\"]\n", i, j, matr[i][j]) } } }
  102.     fmt.Printf("}\n")
  103. }
  104.  
  105. func Read() ([]string, [][]int, []int) {
  106.     fmt.Scanf("%d\n", &k)
  107.     alphabet := make([]string, k)
  108.     for i := 0; i < k; i++ { fmt.Scanf("%s", &alphabet[i]) }
  109.  
  110.     fmt.Scanf("\n%d\n", &n)
  111.     delta := new_delta(n, k)
  112.     for i := 0; i < n; i++ { for j := 0; j < k; j++ { fmt.Scanf("%d", &delta[i][j]) }; fmt.Scanf("\n") }
  113.     F := make([]int, n)
  114.  
  115.     for i := 0; i < n; i++ { fmt.Scanf("%d", &F[i]) }
  116.     fmt.Scanf("\n%d", &q0)
  117.     return alphabet, delta, F
  118. }
  119.  
  120. func main() {
  121.     alphabet, delta, F := Read()
  122.  
  123.     delta1, F1 := new_delta(n, k), make([]int, 0)
  124.     delta1, F1 = AufenkampHohn_Recognizer(delta, F)
  125.  
  126.     Vis_Recognizer(alphabet, delta1, F1)
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement