Advertisement
Guest User

cor.go

a guest
Apr 6th, 2020
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.11 KB | None | 0 0
  1. func findNextSet(a uint32) uint32{
  2.     b := (a + 1) & a
  3.     c := bits.OnesCount32((b - 1) ^ a) - 2
  4.     a = (((((a + 1)^ a) << 1) + 1) << c) ^ b
  5.     return a
  6. }
  7. func (bv *BooleanVector) Cor(pua []int32) int{
  8.     if pua[0] != 0 {
  9.         return 0
  10.     }
  11.     ans := bv.nVariable
  12.    
  13.     for m := bv.nVariable;  m > 0 ; m-- {
  14.         set := uint32((1 << m) - 1) << (bv.nVariable - m)
  15.         for set < (1 << bv.nVariable) {
  16.             if bits.OnesCount32(set) <= m && pua[set] != 0{
  17.                 ans = m - 1
  18.                 break
  19.             }
  20.             set = findNextSet(set)
  21.         }
  22.     }
  23.  
  24.     return ans
  25. }
  26.  
  27. func TestBooleanVector_Cor(t *testing.T) {
  28.     tests := []struct {
  29.         vector string
  30.         cor int
  31.     }{
  32.         {"10010110", 2},
  33.         {"01100000", 0 },
  34.         {"01100110", 1},
  35.         {"00011111011110011011101011011100", 0},
  36.         {"10000111011000111110100001011001", 1},
  37.     }
  38.  
  39.     for _, tt := range tests{
  40.         t.Run("", func(t *testing.T) {
  41.             tt := tt
  42.             bv := BooleanVector{}
  43.             err := bv.BoolVectorFromString(tt.vector)
  44.             require.NoError(t, err)
  45.             bv.PrintVector()
  46.             f := bv.PUA()
  47.             fmt.Println(fmt.Sprintf("%d ", f))
  48.             ans := bv.Cor(f)
  49.             fmt.Printf("Cor: %d \n", ans)
  50.             assert.Equal(t, ans, tt.cor)
  51.  
  52.         })
  53.     }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement