Initial
This commit is contained in:
@@ -0,0 +1,221 @@
|
||||
# Bitwise Helper Files - Usage Guide
|
||||
|
||||
## 📁 Generated Files
|
||||
|
||||
1. **`data/product_bitwise.csv`** - CSV format with bit values for each product
|
||||
2. **`data/product_bitwise.json`** - JSON format with bit values for each product
|
||||
3. **`data/bitwise_legend.json`** - Complete bit mapping documentation
|
||||
|
||||
## 🔢 Bit System Overview
|
||||
|
||||
Each product gets a single integer value that encodes multiple attributes using bitwise flags.
|
||||
|
||||
### Bit Positions (0-11): Base Attributes, Materials, Colors
|
||||
|
||||
| Bit | Value | Attribute |
|
||||
|-----|-------|-----------|
|
||||
| 0 | 1 | Door |
|
||||
| 1 | 2 | Window |
|
||||
| 2 | 4 | Is Accessory |
|
||||
| 3 | 8 | Specific Item Link |
|
||||
| 4 | 16 | Aluminum Material |
|
||||
| 5 | 32 | Vinyl Material |
|
||||
| 6 | 64 | Black Color |
|
||||
| 7 | 128 | White Color |
|
||||
| 8 | 256 | Bronze Color |
|
||||
| 9 | 512 | Tan Color |
|
||||
| 10 | 1024 | Mill Color |
|
||||
| 11 | 2048 | Sandstone Color |
|
||||
|
||||
### Bit Positions (12+): Sub-types
|
||||
|
||||
| Bit | Value | Sub-type |
|
||||
|-----|-------|----------|
|
||||
| 12 | 4096 | Patio Door |
|
||||
| 13 | 8192 | Primary Window |
|
||||
| 14 | 16384 | Storm Door |
|
||||
| 15 | 32768 | Storm Window |
|
||||
|
||||
## 💡 Usage Examples
|
||||
|
||||
### Example 1: Storm Door Insert (BGIST)
|
||||
```
|
||||
Product Code: BGIST
|
||||
Description: INSERTS FOR STORM DOORS
|
||||
Bit Value: 17553
|
||||
Binary: 0100010010010001
|
||||
|
||||
Decoded:
|
||||
✓ Door (bit 0 = 1)
|
||||
✗ Window (bit 1 = 0)
|
||||
✗ Accessory (bit 2 = 0)
|
||||
✗ Specific Item (bit 3 = 0)
|
||||
✓ Aluminum (bit 4 = 1)
|
||||
✗ Vinyl (bit 5 = 0)
|
||||
✓ Black (bit 6 = 1)
|
||||
✓ White (bit 7 = 1)
|
||||
✓ Bronze (bit 8 = 1)
|
||||
✗ Tan (bit 9 = 0)
|
||||
✓ Mill (bit 10 = 1)
|
||||
✓ Sandstone (bit 11 = 1)
|
||||
✗ Patio Door (bit 12 = 0)
|
||||
✗ Primary Window (bit 13 = 0)
|
||||
✓ Storm Door (bit 14 = 1)
|
||||
✗ Storm Window (bit 15 = 0)
|
||||
```
|
||||
|
||||
### Example 2: Check Attributes in Code
|
||||
|
||||
#### Python
|
||||
```python
|
||||
import json
|
||||
|
||||
# Load helper file
|
||||
with open('data/product_bitwise.json') as f:
|
||||
products = json.load(f)
|
||||
|
||||
# Get a product
|
||||
product = next(p for p in products if p['PROD_CODE'] == 'BGIST')
|
||||
bit_value = product['BIT_VALUE']
|
||||
|
||||
# Check individual flags
|
||||
is_door = bool(bit_value & 1)
|
||||
is_aluminum = bool(bit_value & 16)
|
||||
is_white = bool(bit_value & 128)
|
||||
is_storm_door = bool(bit_value & 16384)
|
||||
|
||||
print(f"BGIST is door: {is_door}")
|
||||
print(f"BGIST is aluminum: {is_aluminum}")
|
||||
print(f"BGIST is white: {is_white}")
|
||||
print(f"BGIST is storm door subtype: {is_storm_door}")
|
||||
|
||||
# Filter products by multiple criteria
|
||||
# Example: Find all aluminum doors with white color
|
||||
aluminum_white_doors = [
|
||||
p for p in products
|
||||
if (p['BIT_VALUE'] & 1) and # Is a door
|
||||
(p['BIT_VALUE'] & 16) and # Has aluminum
|
||||
(p['BIT_VALUE'] & 128) and # Has white
|
||||
not p['DISCONTINUED'] # Not discontinued
|
||||
]
|
||||
|
||||
print(f"Found {len(aluminum_white_doors)} aluminum white doors")
|
||||
```
|
||||
|
||||
#### JavaScript
|
||||
```javascript
|
||||
// Load the JSON file
|
||||
fetch('data/product_bitwise.json')
|
||||
.then(response => response.json())
|
||||
.then(products => {
|
||||
// Check individual flags
|
||||
const product = products.find(p => p.PROD_CODE === 'BGIST');
|
||||
const bitValue = product.BIT_VALUE;
|
||||
|
||||
const isDoor = !!(bitValue & 1);
|
||||
const isAluminum = !!(bitValue & 16);
|
||||
const isWhite = !!(bitValue & 128);
|
||||
const isStormDoor = !!(bitValue & 16384);
|
||||
|
||||
console.log(`BGIST is door: ${isDoor}`);
|
||||
console.log(`BGIST is aluminum: ${isAluminum}`);
|
||||
console.log(`BGIST is white: ${isWhite}`);
|
||||
console.log(`BGIST is storm door: ${isStormDoor}`);
|
||||
|
||||
// Filter products
|
||||
const aluminumWhiteDoors = products.filter(p =>
|
||||
(p.BIT_VALUE & 1) && // Is a door
|
||||
(p.BIT_VALUE & 16) && // Has aluminum
|
||||
(p.BIT_VALUE & 128) && // Has white
|
||||
!p.DISCONTINUED // Not discontinued
|
||||
);
|
||||
|
||||
console.log(`Found ${aluminumWhiteDoors.length} aluminum white doors`);
|
||||
});
|
||||
```
|
||||
|
||||
## 🎯 Benefits of Bitwise Classification
|
||||
|
||||
### 1. **Multi-Group Assignment**
|
||||
Products can belong to multiple categories simultaneously:
|
||||
- A product can be both Door AND Window (rare but possible)
|
||||
- A product can have multiple materials (Aluminum AND Vinyl)
|
||||
- A product can have multiple colors
|
||||
|
||||
### 2. **Fast Filtering**
|
||||
Bitwise operations are extremely fast:
|
||||
```python
|
||||
# Instead of:
|
||||
if product.baseType == 'Door' and 'Aluminum' in product.materials and 'White' in product.colors:
|
||||
|
||||
# Use:
|
||||
if (bit_value & 1) and (bit_value & 16) and (bit_value & 128):
|
||||
```
|
||||
|
||||
### 3. **Compact Storage**
|
||||
One integer stores multiple attributes:
|
||||
- Single integer vs. multiple boolean fields
|
||||
- Easy to index and search in databases
|
||||
- Efficient for large datasets
|
||||
|
||||
### 4. **Easy Matching**
|
||||
Perfect for accessory compatibility:
|
||||
```python
|
||||
# Check if accessory matches product materials
|
||||
accessory_materials = 48 # Aluminum (16) + Vinyl (32)
|
||||
product_materials = 16 # Aluminum only
|
||||
|
||||
# Check if they share any materials
|
||||
if accessory_materials & product_materials:
|
||||
print("Compatible!") # True because both have Aluminum
|
||||
```
|
||||
|
||||
## 🔄 Integration with Navigation System
|
||||
|
||||
Use bitwise values to:
|
||||
1. Dynamically generate navigation options
|
||||
2. Filter products in real-time based on user selections
|
||||
3. Match accessories to products efficiently
|
||||
4. Handle complex "OR" queries (multiple categories)
|
||||
|
||||
### Example: Dynamic Material Question
|
||||
```python
|
||||
# Get all products for "Storm Door" subtype
|
||||
storm_door_products = [p for p in products if p['BIT_VALUE'] & 16384]
|
||||
|
||||
# Check materials
|
||||
has_aluminum = any(p['BIT_VALUE'] & 16 for p in storm_door_products)
|
||||
has_vinyl = any(p['BIT_VALUE'] & 32 for p in storm_door_products)
|
||||
|
||||
# Show material question only if multiple materials exist
|
||||
if has_aluminum and has_vinyl:
|
||||
show_material_question()
|
||||
else:
|
||||
skip_to_next_question()
|
||||
```
|
||||
|
||||
## 📝 Maintenance
|
||||
|
||||
### Regenerating Helper Files
|
||||
When products.csv changes:
|
||||
```bash
|
||||
python generate_bitwise_helper.py
|
||||
```
|
||||
|
||||
### Adding New Attributes
|
||||
To add new bit flags, edit `generate_bitwise_helper.py`:
|
||||
1. Add to `BIT_DEFINITIONS` dictionary
|
||||
2. Update `calculate_bit_value()` function
|
||||
3. Regenerate files
|
||||
|
||||
### Adding New Sub-types
|
||||
Sub-types are automatically detected! Just add them to columns H or I in the CSV, then regenerate.
|
||||
|
||||
## 🚀 Performance Notes
|
||||
|
||||
- Bitwise AND (`&`) - Check if flag is set: `bit_value & 16`
|
||||
- Bitwise OR (`|`) - Combine flags: `16 | 128` = Aluminum + White
|
||||
- Bitwise NOT (`~`) - Invert flags (advanced)
|
||||
- Bitwise XOR (`^`) - Toggle flags (advanced)
|
||||
|
||||
All bitwise operations are O(1) - constant time!
|
||||
Reference in New Issue
Block a user