AbstractIntegratedModule 0.7.7__tar.gz → 0.7.9__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.
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.egg-info/PKG-INFO +32 -20
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.py +104 -26
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractOptimizedModules.c +200 -200
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/PKG-INFO +32 -20
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/README.md +31 -19
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/setup.py +1 -1
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.egg-info/SOURCES.txt +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.egg-info/dependency_links.txt +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.egg-info/requires.txt +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.egg-info/top_level.txt +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractOptimizedModules.pyx +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/MANIFEST.in +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/Cargo.toml +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/pyproject.toml +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/src/lib.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/target/debug/build/libsqlite3-sys-ed07b882cd2aa5e2/out/bindgen.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/target/debug/build/serde_core-ebc15f2e9cad7f5f/out/private.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/target/debug/build/target-lexicon-08527f45de28143d/out/host.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/target/release/build/libsqlite3-sys-bf0400df4523274c/out/bindgen.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/target/release/build/serde_core-5cdb76131825e4af/out/private.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/abstract_model_storage/target/release/build/target-lexicon-43eb95a0588bf457/out/host.rs +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/pyproject.toml +0 -0
- {abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AbstractIntegratedModule
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.9
|
|
4
4
|
Summary: Library for Advanced Integrated Non-LLM AI Models - Optimized Backend Framework For Non-LLM AI Agent
|
|
5
5
|
Author: Micro-Novelty
|
|
6
6
|
Author-email: hernikpuspita5@gmail.com
|
|
@@ -42,7 +42,7 @@ https://github.com/Micro-Novelty/IntegratedPipeline-Specialized-Non-LLM-AI-Agent
|
|
|
42
42
|
#### Note: The README here you are reading is a direct copy from my README Repository, to download the necessary files, you can visit my Repository with the provided link above.
|
|
43
43
|
|
|
44
44
|
### Library Short Description:
|
|
45
|
-
- Development Stage: 0.7.
|
|
45
|
+
- Development Stage: 0.7.8 Official Release.
|
|
46
46
|
- Maintainer: Micro-Novelty.
|
|
47
47
|
- library Source-Code is Open-sourced on github.
|
|
48
48
|
- Purpose: Specifically Designed for providing Non-LLM AI Agent Framework for edge Devices, Optimized for ARM64 architecture.
|
|
@@ -51,30 +51,42 @@ https://github.com/Micro-Novelty/IntegratedPipeline-Specialized-Non-LLM-AI-Agent
|
|
|
51
51
|
pip install AbstractIntegratedModule
|
|
52
52
|
python -m install AbstractIntegratedModule
|
|
53
53
|
```
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
54
|
+
- Library installation if you dont have aarch64 setup, you can download the correct wheel for your setup in this repository or by using pip:
|
|
55
|
+
- ✨ use pip for downloading the correct wheels for your setup:
|
|
56
|
+
- ```bash
|
|
57
|
+
pip install abstractintegratedmodule --extra-index-url https://Micro-Novelty.github.io/abstract-modules/whl/ --break-system-packages
|
|
58
|
+
# ensures proper installation by bypassing pip strict external download setup.
|
|
59
|
+
```
|
|
60
|
+
- Note: By Using the above --extra-index installation method provides you with:
|
|
61
|
+
- x86_64 and aarch64 with manylinux (v. 2.17+) and musllinux (v. 1.2+) architecture only (No regular singular x86_64 arch wheel, tarball will be used for regular x86_64 and windows).
|
|
62
|
+
- macOS with aarch64 and x86_64 architecture. (v. 10.9+)
|
|
63
|
+
- All of this Wheels provided in the Repository Only Provides Wheels for python with version 3.10 3.11 and 3.12.
|
|
64
|
+
- This setup will automatically download the correct wheel Based on your python/pip version and OS / hardware architecture setup.
|
|
65
|
+
|
|
66
|
+
- For specific module in Rust for handling and loading Weights and Parsing JSON values with reduced memory lookup overhead.
|
|
67
|
+
- Consider using this Optimization library by using:
|
|
68
|
+
- ```bash
|
|
69
|
+
pip install abstract-weights-core
|
|
70
|
+
```
|
|
71
|
+
- Note: This Optimization would allow AbstractIntegratedModule faster JSON parsing and much more flexible database handling handled in Rust.
|
|
72
|
+
|
|
73
|
+
- Proven Capabilities:
|
|
61
74
|
- The library has been thoroughly tested in Multiple Environments from Windows to ARM64 Environment. The library is now Robust for Wider use and Deployment.
|
|
62
75
|
- Proven Works on ARM64 Environment, Training and Prediction works efficient on Docker ARM64 environment with QEMU, good parallelizing behavior is guaranteed.
|
|
63
76
|
- P2P Works efficiently in ARM64 Docker + QEMU, No conflicting socket and all prediction works efficiently.
|
|
64
77
|
- AWE setup Proven Efficient on Hard-uncontrolled dataset such as Activity Recognition from the given Database.
|
|
65
78
|
- LSTM is Optimized efficiently for scarce data with AWE method.
|
|
66
79
|
- Robust Advanced prediction capabilities proven effective on ARM64 Using MLP + LSTM Architectures.
|
|
67
|
-
- Transformer
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
- Transformer Optimized using Cython, to reduce Memory overhead and Reduce CPU Usage, With Reduced Training Time.
|
|
81
|
+
______________
|
|
82
|
+
- Changelog:
|
|
83
|
+
- v0.7.9:
|
|
84
|
+
- [=] New features:
|
|
85
|
+
- Fixed possible errors from inhomogenous shape during tokenizing arrays into a hash ID.
|
|
86
|
+
- fixed fragility where number of classes is not distributed well to sequence encoding function causing the model to use wrong number of classes.
|
|
87
|
+
- Added robustness for handling complex samples during prediction batching.
|
|
88
|
+
|
|
89
|
+
____________
|
|
78
90
|
<img width="1280" height="600" alt="WhatsApp Image 2026-05-27 at 07 16 32" src="https://github.com/user-attachments/assets/4b58a556-45a3-419b-96fd-9c1b76cac574" />
|
|
79
91
|
|
|
80
92
|
|
{abstractintegratedmodule-0.7.7 → abstractintegratedmodule-0.7.9}/AbstractIntegratedModule.py
RENAMED
|
@@ -4664,7 +4664,50 @@ class ModelStorage:
|
|
|
4664
4664
|
return data
|
|
4665
4665
|
except Exception as e:
|
|
4666
4666
|
print(f'[!] Data cant be parsed due to: {e}')
|
|
4667
|
-
|
|
4667
|
+
s = s.replace('\n', '').replace('\r', '').replace('\t', '')
|
|
4668
|
+
s = ' '.join(s.split()).strip()
|
|
4669
|
+
|
|
4670
|
+
if not s:
|
|
4671
|
+
return s
|
|
4672
|
+
|
|
4673
|
+
# parsing as JSON array first
|
|
4674
|
+
if s.startswith('[') and s.endswith(']'):
|
|
4675
|
+
try:
|
|
4676
|
+
parsed = json.loads(s)
|
|
4677
|
+
if isinstance(parsed, list):
|
|
4678
|
+
return np.array(parsed, dtype=np.float32)
|
|
4679
|
+
except (json.JSONDecodeError, ValueError):
|
|
4680
|
+
pass
|
|
4681
|
+
|
|
4682
|
+
# Try parsing with ast.literal_eval
|
|
4683
|
+
try:
|
|
4684
|
+
parsed = ast.literal_eval(s)
|
|
4685
|
+
if isinstance(parsed, (list, tuple)):
|
|
4686
|
+
return np.array(parsed, dtype=np.float32)
|
|
4687
|
+
except (ValueError, SyntaxError, TypeError):
|
|
4688
|
+
pass
|
|
4689
|
+
|
|
4690
|
+
# parsing space-separated numbers
|
|
4691
|
+
if re.fullmatch(r'[\[\]\s\d\.\,\-\+E]+', s):
|
|
4692
|
+
parts = s.replace('[', ' ').replace(']', ' ').split()
|
|
4693
|
+
if parts:
|
|
4694
|
+
try:
|
|
4695
|
+
float_values = [float(x) for x in parts]
|
|
4696
|
+
return np.array(float_values, dtype=np.float32)
|
|
4697
|
+
except ValueError:
|
|
4698
|
+
pass
|
|
4699
|
+
|
|
4700
|
+
# Handle comma-separated values
|
|
4701
|
+
if ',' in s:
|
|
4702
|
+
cleaned = s.replace('[', '').replace(']', '').strip()
|
|
4703
|
+
parts = [p.strip() for p in cleaned.split(',') if p.strip()]
|
|
4704
|
+
try:
|
|
4705
|
+
float_values = [float(x) for x in parts]
|
|
4706
|
+
return np.array(float_values, dtype=np.float32)
|
|
4707
|
+
except ValueError:
|
|
4708
|
+
pass
|
|
4709
|
+
|
|
4710
|
+
return s
|
|
4668
4711
|
else:
|
|
4669
4712
|
# Clean the string
|
|
4670
4713
|
s = s.replace('\n', '').replace('\r', '').replace('\t', '')
|
|
@@ -9601,7 +9644,7 @@ class IntegratedPipeline:
|
|
|
9601
9644
|
if self.manager:
|
|
9602
9645
|
model_classes = len(self.manager.label_map)
|
|
9603
9646
|
if self.vocab:
|
|
9604
|
-
raise Warning()
|
|
9647
|
+
raise Warning("[!] Model Classes is still None, using amount of vocab as number of clasess")
|
|
9605
9648
|
model_classes = len(self.vocab)
|
|
9606
9649
|
else:
|
|
9607
9650
|
try:
|
|
@@ -10468,7 +10511,12 @@ class IntegratedPipeline:
|
|
|
10468
10511
|
return X_adapted
|
|
10469
10512
|
|
|
10470
10513
|
def AME_Encoder(self, x):
|
|
10471
|
-
|
|
10514
|
+
try:
|
|
10515
|
+
X = np.asarray(x)
|
|
10516
|
+
except:
|
|
10517
|
+
raise Warning('[!] X samples has inhomogenous shape, normalizing to prevent corruption.')
|
|
10518
|
+
flat_data = [item for sublist in x for item in sublist]
|
|
10519
|
+
X = np.asarray(flat_data, dtype=np.int32)
|
|
10472
10520
|
|
|
10473
10521
|
if isinstance(X, (str, np.str_)):
|
|
10474
10522
|
clean_str = str(X).replace('[', '').replace(']', '')
|
|
@@ -10737,7 +10785,7 @@ class IntegratedPipeline:
|
|
|
10737
10785
|
|
|
10738
10786
|
return unsuitable_training
|
|
10739
10787
|
|
|
10740
|
-
def sequence_encoding(self, datasets, max_len=32):
|
|
10788
|
+
def sequence_encoding(self, datasets, label_map=None, max_len=32):
|
|
10741
10789
|
input_sequences = []
|
|
10742
10790
|
|
|
10743
10791
|
if datasets:
|
|
@@ -10745,7 +10793,7 @@ class IntegratedPipeline:
|
|
|
10745
10793
|
if not self.model2:
|
|
10746
10794
|
intents = [d[1] for d in datasets]
|
|
10747
10795
|
intent_to_id = {intent:i for i, intent in enumerate(sorted(set(intents)))}
|
|
10748
|
-
num_classes = self._get_num_classes()
|
|
10796
|
+
num_classes = self._get_num_classes(label_map=label_map)
|
|
10749
10797
|
self.model2 = Transformer(
|
|
10750
10798
|
vocab_size=len(self.vocab),
|
|
10751
10799
|
d_model=32,
|
|
@@ -10775,12 +10823,12 @@ class IntegratedPipeline:
|
|
|
10775
10823
|
std_pool = np.std(sequence_inputs, axis=1)
|
|
10776
10824
|
return np.concatenate([mean_pool, max_pool, std_pool], axis=-1)
|
|
10777
10825
|
|
|
10778
|
-
def transformer_utilities(self, rules, datasets, X_raw, y_true=None, batch_size=2, min_signal=1e-3):
|
|
10826
|
+
def transformer_utilities(self, rules, datasets, X_raw, label_map=None, y_true=None, batch_size=2, min_signal=1e-3):
|
|
10779
10827
|
self.text_encoder(datasets)
|
|
10780
10828
|
if y_true is None:
|
|
10781
10829
|
_, y_true = self.input_encoding(datasets)
|
|
10782
10830
|
|
|
10783
|
-
sequence_inputs = self.sequence_encoding(datasets)
|
|
10831
|
+
sequence_inputs = self.sequence_encoding(datasets, label_map=label_map)
|
|
10784
10832
|
unsuitable_training = self.training_necessary_condition(sequence_inputs, X_raw)
|
|
10785
10833
|
lr = self.model2.transformer_lr if self.model2 else self.transformer_lr
|
|
10786
10834
|
|
|
@@ -11042,12 +11090,36 @@ class AccurateAnswerCache:
|
|
|
11042
11090
|
return None
|
|
11043
11091
|
|
|
11044
11092
|
def _hash_ids(self, input_ids):
|
|
11045
|
-
|
|
11046
|
-
|
|
11093
|
+
# Recursively flatten any nested list structure
|
|
11094
|
+
def flatten(x):
|
|
11095
|
+
for item in x:
|
|
11096
|
+
if isinstance(item, (list, tuple)):
|
|
11097
|
+
yield from flatten(item)
|
|
11098
|
+
else:
|
|
11099
|
+
yield item
|
|
11100
|
+
|
|
11101
|
+
if isinstance(input_ids, (list, tuple)):
|
|
11102
|
+
flat_ids = list(flatten(input_ids))
|
|
11103
|
+
else:
|
|
11104
|
+
flat_ids = input_ids # already a flat array/tensor
|
|
11105
|
+
|
|
11106
|
+
ids = np.asarray(flat_ids, dtype='<i4')
|
|
11047
11107
|
return hashlib.md5(ids.tobytes()).hexdigest()
|
|
11048
11108
|
|
|
11049
11109
|
def _make_key(self, x_mlp):
|
|
11050
|
-
|
|
11110
|
+
def flatten(x):
|
|
11111
|
+
for item in x:
|
|
11112
|
+
if isinstance(item, (list, tuple)):
|
|
11113
|
+
yield from flatten(item)
|
|
11114
|
+
else:
|
|
11115
|
+
yield item
|
|
11116
|
+
|
|
11117
|
+
if isinstance(x_mlp, (list, tuple)):
|
|
11118
|
+
flat_x = list(flatten(x_mlp))
|
|
11119
|
+
else:
|
|
11120
|
+
flat_x = x_mlp # already a flat array/tensor
|
|
11121
|
+
|
|
11122
|
+
x = np.asarray(flat_x, dtype='<i4').ravel()
|
|
11051
11123
|
return hashlib.md5(x.tobytes()).hexdigest()
|
|
11052
11124
|
|
|
11053
11125
|
def _evict_lru(self):
|
|
@@ -13672,7 +13744,7 @@ class PipelinePredictionManager:
|
|
|
13672
13744
|
input_ids_list.append(np.array(ids))
|
|
13673
13745
|
|
|
13674
13746
|
input_ids = np.array(input_ids_list)
|
|
13675
|
-
sequence_ids = self.pipeline.sequence_encoding(dataset)
|
|
13747
|
+
sequence_ids = self.pipeline.sequence_encoding(dataset, label_map=label_map)
|
|
13676
13748
|
if X is not None:
|
|
13677
13749
|
anisotropy = self.pipeline.anisotropy_measurement(X)
|
|
13678
13750
|
else:
|
|
@@ -14103,11 +14175,13 @@ class PipelinePredictionManager:
|
|
|
14103
14175
|
final_idx = int(final_idx)
|
|
14104
14176
|
|
|
14105
14177
|
chosen_label = reverse_map.get(final_idx, f"unknown_{final_idx}")
|
|
14106
|
-
|
|
14107
|
-
|
|
14108
|
-
|
|
14109
|
-
|
|
14110
|
-
|
|
14178
|
+
if final_probs is not None:
|
|
14179
|
+
try:
|
|
14180
|
+
confidence = float(final_probs[0][final_idx])
|
|
14181
|
+
except:
|
|
14182
|
+
confidence = float(final_probs[0][len(reverse_map)-1]) if isinstance(final_probs[0], (float, int)) else 0.0
|
|
14183
|
+
else:
|
|
14184
|
+
final_probs = target_probs.copy()
|
|
14111
14185
|
else:
|
|
14112
14186
|
print("\n[🎯] Using initial Regular final prediction as final decision.")
|
|
14113
14187
|
final_idx = final_probs[0].argmax()
|
|
@@ -14152,18 +14226,22 @@ class PipelinePredictionManager:
|
|
|
14152
14226
|
if isinstance(sec_confidence, (np.ndarray, list)):
|
|
14153
14227
|
sec_confidence = np.mean(sec_confidence)
|
|
14154
14228
|
|
|
14155
|
-
|
|
14156
|
-
|
|
14157
|
-
|
|
14229
|
+
if 'sec_predicted' in results:
|
|
14230
|
+
print('========== Second Prediction Initiative ==========')
|
|
14231
|
+
print(f'[⚡] My Second Prediction: {sec_chosen_label}')
|
|
14232
|
+
print(f'[⚡] Confidence: {sec_confidence:.1%}')
|
|
14158
14233
|
|
|
14159
|
-
|
|
14160
|
-
|
|
14161
|
-
|
|
14234
|
+
results[0]['sec_predicted'] = sec_chosen_label
|
|
14235
|
+
results[0]['sec_confidence'] = sec_confidence
|
|
14236
|
+
results[0]['sec_index'] = sec_final_idx
|
|
14237
|
+
|
|
14238
|
+
if confidence > results[0]['confidence']:
|
|
14239
|
+
results[0]['predicted'] = chosen_label
|
|
14240
|
+
results[0]['confidence'] = confidence
|
|
14241
|
+
results[0]['index'] = final_idx
|
|
14242
|
+
else:
|
|
14243
|
+
print('[!] No prediction in results cache are found!')
|
|
14162
14244
|
|
|
14163
|
-
if confidence > results[0]['confidence']:
|
|
14164
|
-
results[0]['predicted'] = chosen_label
|
|
14165
|
-
results[0]['confidence'] = confidence
|
|
14166
|
-
results[0]['index'] = final_idx
|
|
14167
14245
|
except Exception as e:
|
|
14168
14246
|
print(f'[!] Error initiating second prediction in Advanced prediction method: {e} ')
|
|
14169
14247
|
|