PyHierarchicalTsetlinMachineCUDA 0.3.2__tar.gz → 0.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (15) hide show
  1. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PKG-INFO +1 -1
  2. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA/kernels.py +19 -1
  3. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA/tm.py +35 -12
  4. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA.egg-info/PKG-INFO +1 -1
  5. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/setup.py +1 -1
  6. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/LICENSE +0 -0
  7. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA/__init__.py +0 -0
  8. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA/tools.py +0 -0
  9. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA/utils.py +0 -0
  10. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA.egg-info/SOURCES.txt +0 -0
  11. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA.egg-info/dependency_links.txt +0 -0
  12. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA.egg-info/requires.txt +0 -0
  13. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/PyHierarchicalTsetlinMachineCUDA.egg-info/top_level.txt +0 -0
  14. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/README.md +0 -0
  15. {PyHierarchicalTsetlinMachineCUDA-0.3.2 → PyHierarchicalTsetlinMachineCUDA-0.3.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyHierarchicalTsetlinMachineCUDA
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Hierarchical Tsetlin Machine Architecture.
5
5
  Home-page: https://github.com/cair/PyHierarchicalTsetlinMachineCUDA/
6
6
  Author: Ole-Christoffer Granmo
@@ -41,6 +41,21 @@ code_header = """
41
41
  code_update = """
42
42
  extern "C"
43
43
  {
44
+
45
+ // Counts number of include actions for a given clause component
46
+ __device__ inline int number_of_include_actions(unsigned int *ta_state)
47
+ {
48
+ int number_of_include_actions = 0;
49
+ for (int k = 0; k < TA_CHUNKS_PER_LEAF-1; ++k) {
50
+ unsigned int ta_pos = k*STATE_BITS + STATE_BITS-1;
51
+ number_of_include_actions += __popc(ta_state[ta_pos]);
52
+ }
53
+ unsigned int ta_pos = (TA_CHUNKS_PER_LEAF-1)*STATE_BITS + STATE_BITS-1;
54
+ number_of_include_actions += __popc(ta_state[ta_pos] & FILTER_HIERARCHICAL);
55
+
56
+ return(number_of_include_actions);
57
+ }
58
+
44
59
  // Increment the states of each of those 32 Tsetlin Automata flagged in the active bit vector.
45
60
  __device__ inline void inc(unsigned int *ta_state, int chunk, unsigned int active)
46
61
  {
@@ -140,6 +155,9 @@ code_update = """
140
155
  if (curand_uniform(localState) <= update_probability) {
141
156
  if (target*sign > 0) {
142
157
  // Type I Feedback
158
+
159
+ int included_literals = number_of_include_actions(ta_state);
160
+
143
161
  for (int ta_chunk = 0; ta_chunk < TA_CHUNKS_PER_LEAF; ++ta_chunk) {
144
162
  // Generate random bit values
145
163
  unsigned int la_feedback = 0;
@@ -149,7 +167,7 @@ code_update = """
149
167
  }
150
168
  }
151
169
 
152
- if (component_output) {
170
+ if (component_output && included_literals <= LITERAL_BUDGET) {
153
171
  #if BOOST_TRUE_POSITIVE_FEEDBACK == 1
154
172
  inc(ta_state, ta_chunk, X[ta_chunk]);
155
173
  #else
@@ -44,12 +44,13 @@ COALESCED_TM = 2
44
44
 
45
45
  class CommonTsetlinMachine():
46
46
 
47
- def __init__(self, number_of_clauses, T, s, q=1.0, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, hierarchy_structure=None, boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
47
+ def __init__(self, number_of_clauses, T, s, q=1.0, literal_budget=None, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, hierarchy_structure=None, boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
48
48
  self.number_of_clauses = number_of_clauses
49
49
  self.number_of_state_bits = number_of_state_bits
50
50
  self.T = float(T)
51
51
  self.s = s
52
52
  self.q = q
53
+ self.literal_budget = literal_budget
53
54
  self.no_clipping = no_clipping
54
55
  self.constant_update_p = constant_update_p
55
56
  self.binary_inference = binary_inference
@@ -92,6 +93,9 @@ class CommonTsetlinMachine():
92
93
  self.number_of_literals_per_leaf = self.number_of_features_per_leaf
93
94
  self.number_of_literal_chunks_per_leaf = int((self.number_of_literals_per_leaf - 1) / 32 + 1)
94
95
 
96
+ if self.literal_budget == None:
97
+ self.literal_budget = self.number_of_literals_per_leaf
98
+
95
99
  # Calculates the number of literal chunks for the full hierarchy
96
100
  self.hierarchy_size[0] = self.number_of_literal_chunks_per_leaf * self.hierarchy_size[1]
97
101
 
@@ -130,6 +134,7 @@ class CommonTsetlinMachine():
130
134
  #define S %f
131
135
  #define THRESHOLD %d
132
136
  #define Q %f
137
+ #define LITERAL_BUDGET %d
133
138
  #define BINARY_INFERENCE %d
134
139
  #define CONSTANT_UPDATE_P %d
135
140
  #define AND_GROUP_NORMALIZATION %d
@@ -141,7 +146,7 @@ class CommonTsetlinMachine():
141
146
 
142
147
  #define NEGATIVE_CLAUSES %d
143
148
  #define FLIP_POLARITY %d
144
- """ % (self.number_of_clauses, self.depth, self.hierarchy_size[1], self.number_of_ta_teams, self.number_of_literals_per_leaf, self.number_of_literal_chunks_per_leaf, self.number_of_literal_chunks, self.number_of_state_bits, self.boost_true_positive_feedback, self.s, self.T, self.q, self.binary_inference, self.constant_update_p, self.and_group_normalization, AND_GROUP, AND_ALTERNATIVES, OR_GROUP, OR_ALTERNATIVES, self.negative_clauses, self.flip_polarity)
149
+ """ % (self.number_of_clauses, self.depth, self.hierarchy_size[1], self.number_of_ta_teams, self.number_of_literals_per_leaf, self.number_of_literal_chunks_per_leaf, self.number_of_literal_chunks, self.number_of_state_bits, self.boost_true_positive_feedback, self.s, self.T, self.q, self.literal_budget, self.binary_inference, self.constant_update_p, self.and_group_normalization, AND_GROUP, AND_ALTERNATIVES, OR_GROUP, OR_ALTERNATIVES, self.negative_clauses, self.flip_polarity)
145
150
 
146
151
  mod_prepare = SourceModule(parameters + kernels.code_header + kernels.code_prepare, no_extern_c=True)
147
152
  self.prepare_weights = mod_prepare.get_function("prepare_weights")
@@ -648,9 +653,9 @@ class CommonTsetlinMachine():
648
653
 
649
654
 
650
655
  class MultiOutputTsetlinMachine(CommonTsetlinMachine):
651
- def __init__(self, number_of_clauses, T, s, q=1.0, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
656
+ def __init__(self, number_of_clauses, T, s, q=1.0, literal_budget=None, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
652
657
  self.negative_clauses = 1
653
- super().__init__(number_of_clauses, T, s, q=q, no_clipping=no_clipping, constant_update_p=constant_update_p, binary_inference=binary_inference, and_group_normalization=and_group_normalization, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
658
+ super().__init__(number_of_clauses, T, s, q=q, literal_budget=literal_budget, no_clipping=no_clipping, constant_update_p=constant_update_p, binary_inference=binary_inference, and_group_normalization=and_group_normalization, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
654
659
 
655
660
  def fit(self, X, Y):
656
661
  X = X.reshape(X.shape[0], X.shape[1], 1)
@@ -674,12 +679,29 @@ class MultiOutputTsetlinMachine(CommonTsetlinMachine):
674
679
  return (self.score(X) >= 0).astype(np.uint32).transpose()
675
680
 
676
681
  class MultiClassCoalescedTsetlinMachine(CommonTsetlinMachine):
677
- def __init__(self, number_of_clauses, T, s, q=1.0, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
682
+ def __init__(
683
+ self, number_of_clauses,
684
+ T,
685
+ s,
686
+ q=1.0,
687
+ literal_budget=None,
688
+ no_clipping=False,
689
+ constant_update_p=0,
690
+ binary_inference=False,
691
+ and_group_normalization=False,
692
+ hierarchy_structure=((AND_GROUP, 1)),
693
+ boost_true_positive_feedback=1,
694
+ number_of_state_bits=8,
695
+ append_negated=True,
696
+ grid=(16*13,1,1),
697
+ block=(128,1,1),
698
+ seed=None
699
+ ):
678
700
  self.negative_clauses = 1
679
701
  self.tm_type = COALESCED_TM
680
702
  self.flip_polarity = 1
681
703
 
682
- super().__init__(number_of_clauses, T, s, q=q, no_clipping=no_clipping, constant_update_p=constant_update_p, binary_inference=binary_inference, and_group_normalization=and_group_normalization, hierarchy_structure=hierarchy_structure, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
704
+ super().__init__(number_of_clauses, T, s, q=q, literal_budget=literal_budget, no_clipping=no_clipping, constant_update_p=constant_update_p, binary_inference=binary_inference, and_group_normalization=and_group_normalization, hierarchy_structure=hierarchy_structure, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
683
705
 
684
706
  def fit(self, X, Y):
685
707
  X = X.reshape(X.shape[0], X.shape[1], 1)
@@ -706,11 +728,12 @@ class MultiClassCoalescedTsetlinMachine(CommonTsetlinMachine):
706
728
  return np.argmax(self.score(X), axis=0)
707
729
 
708
730
  class MultiClassTsetlinMachine:
709
- def __init__(self, number_of_clauses, T, s, q=1.0, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, weighted_clauses=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
731
+ def __init__(self, number_of_clauses, T, s, q=1.0, literal_budget=None, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, weighted_clauses=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
710
732
  self.number_of_clauses = number_of_clauses
711
733
  self.T = T
712
734
  self.s = s
713
735
  self.q = q
736
+ self.literal_budget = literal_budget
714
737
  self.no_clipping = no_clipping
715
738
  self.constant_update_p = constant_update_p
716
739
  self.binary_inference = binary_inference
@@ -732,7 +755,7 @@ class MultiClassTsetlinMachine:
732
755
  if not self.configured:
733
756
  self.tms = []
734
757
  for i in range(self.number_of_outputs):
735
- self.tms.append(TsetlinMachine(self.number_of_clauses, self.T, self.s, q=self.q, no_clipping=self.no_clipping, constant_update_p=self.constant_update_p, binary_inference=self.binary_inference, and_group_normalization=self.and_group_normalization, weighted_clauses=self.weighted_clauses, hierarchy_structure=self.hierarchy_structure, boost_true_positive_feedback=self.boost_true_positive_feedback, number_of_state_bits=self.number_of_state_bits, append_negated=self.append_negated, grid=self.grid, block=self.block, seed=self.seed+i))
758
+ self.tms.append(TsetlinMachine(self.number_of_clauses, self.T, self.s, q=self.q, literal_budget=self.literal_budget, no_clipping=self.no_clipping, constant_update_p=self.constant_update_p, binary_inference=self.binary_inference, and_group_normalization=self.and_group_normalization, weighted_clauses=self.weighted_clauses, hierarchy_structure=self.hierarchy_structure, boost_true_positive_feedback=self.boost_true_positive_feedback, number_of_state_bits=self.number_of_state_bits, append_negated=self.append_negated, grid=self.grid, block=self.block, seed=self.seed+i))
736
759
 
737
760
  self.configured = True
738
761
 
@@ -798,7 +821,7 @@ class MultiClassTsetlinMachine:
798
821
  self.configured = True
799
822
 
800
823
  class TsetlinMachine(CommonTsetlinMachine):
801
- def __init__(self, number_of_clauses, T, s, q=1.0, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, weighted_clauses=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
824
+ def __init__(self, number_of_clauses, T, s, q=1.0, literal_budget=None, no_clipping=False, constant_update_p=0, binary_inference=False, and_group_normalization=False, weighted_clauses=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
802
825
  self.negative_clauses = 1
803
826
  self.flip_polarity = 0
804
827
 
@@ -807,7 +830,7 @@ class TsetlinMachine(CommonTsetlinMachine):
807
830
  else:
808
831
  self.tm_type = VANILLA_TM
809
832
 
810
- super().__init__(number_of_clauses, T, s, q=q, no_clipping=no_clipping, constant_update_p=constant_update_p, binary_inference=binary_inference, and_group_normalization=and_group_normalization, hierarchy_structure=hierarchy_structure, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
833
+ super().__init__(number_of_clauses, T, s, q=q, literal_budget=literal_budget, no_clipping=no_clipping, constant_update_p=constant_update_p, binary_inference=binary_inference, and_group_normalization=and_group_normalization, hierarchy_structure=hierarchy_structure, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
811
834
 
812
835
  def fit(self, X, Y):
813
836
  X = X.reshape(X.shape[0], X.shape[1], 1)
@@ -831,11 +854,11 @@ class TsetlinMachine(CommonTsetlinMachine):
831
854
  return (self.score(X) >= 0).astype(np.int32)
832
855
 
833
856
  class RegressionTsetlinMachine(CommonTsetlinMachine):
834
- def __init__(self, number_of_clauses, T, s, and_group_normalization=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
857
+ def __init__(self, number_of_clauses, T, s, literal_budget=None, and_group_normalization=False, hierarchy_structure=((AND_GROUP, 1)), boost_true_positive_feedback=1, number_of_state_bits=8, append_negated=True, grid=(16*13,1,1), block=(128,1,1), seed=None):
835
858
  self.negative_clauses = 0
836
859
  self.flip_polarity = 0
837
860
 
838
- super().__init__(number_of_clauses, T, s, and_group_normalization=and_group_normalization, hierarchy_structure=hierarchy_structure, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
861
+ super().__init__(number_of_clauses, T, s, literal_budget=literal_budget, and_group_normalization=and_group_normalization, hierarchy_structure=hierarchy_structure, boost_true_positive_feedback=boost_true_positive_feedback, number_of_state_bits=number_of_state_bits, append_negated=append_negated, grid=grid, block=block, seed=seed)
839
862
 
840
863
  def fit(self, X, Y):
841
864
  X = X.reshape(X.shape[0], X.shape[1], 1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyHierarchicalTsetlinMachineCUDA
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Hierarchical Tsetlin Machine Architecture.
5
5
  Home-page: https://github.com/cair/PyHierarchicalTsetlinMachineCUDA/
6
6
  Author: Ole-Christoffer Granmo
@@ -2,7 +2,7 @@ from setuptools import *
2
2
 
3
3
  setup(
4
4
  name='PyHierarchicalTsetlinMachineCUDA',
5
- version='0.3.2',
5
+ version='0.3.3',
6
6
  author='Ole-Christoffer Granmo',
7
7
  author_email='ole.granmo@uia.no',
8
8
  url='https://github.com/cair/PyHierarchicalTsetlinMachineCUDA/',