#!/bin/sh
# Exit immediately with a zeroed string if no model file is provided
if [ -z "$1" ] || [ ! -f "$1" ]; then
echo "0|0|0|0|0|0"
exit 1
fi
GGUF_FILE="$1"
CONFIG_FILE="$HOME/.git-analyzer.conf"
# Establish baseline fallback defaults
VRAM_OVERHEAD_GB=0
RAM_OVERHEAD_GB=0
CONTEXT_MULTIPLIER=1.5
SCRIPTS_DIR="$HOME/scripts"
# Load global configuration directives dynamically if present
if [ -f "$CONFIG_FILE" ]; then
. "$CONFIG_FILE"
VRAM_OVERHEAD_GB="${CONFIG_VRAM_OVERHEAD:-0}"
RAM_OVERHEAD_GB="${CONFIG_RAM_OVERHEAD:-0}"
CONTEXT_MULTIPLIER="${CONFIG_CONTEXT_MULTIPLIER:-1.5}"
SCRIPTS_DIR="${CONFIG_SCRIPTS_PATH:-$HOME/scripts}"
fi
# Fetch VRAM and RAM from script
HW_OUTPUT=$("$SCRIPTS_DIR/check-vram_ram.sh" 2>/dev/null)
TOTAL_RAM_BYTES=$(echo "$HW_OUTPUT" | grep -i "Total Physical RAM" | awk '{print $NF}' | sed 's/[^0-9]//g')
TOTAL_VRAM_BYTES=$(echo "$HW_OUTPUT" | grep -i "Dedicated VRAM" | awk '{print $NF}' | sed 's/[^0-9]//g')
[ -z "$TOTAL_RAM_BYTES" ] && TOTAL_RAM_BYTES=17179869184
[ -z "$TOTAL_VRAM_BYTES" ] && TOTAL_VRAM_BYTES=12884901888
# Compute net available VRAM bytes after subtracting user-configured safety overhead
AVAILABLE_VRAM_BYTES=$(awk -v t="$TOTAL_VRAM_BYTES" -v o="$VRAM_OVERHEAD_GB" 'BEGIN {print t - (o * 1024 * 1024 * 1024)}')
FILE_SIZE_BYTES=$(stat -f %z "$GGUF_FILE" 2>/dev/null || stat -c %s "$GGUF_FILE")
# Parse model layers and attention metrics from the GGUF header dictionary
MODEL_STATS=$("$SCRIPTS_DIR/get-model_gguf_data.py" "$GGUF_FILE" 2>/dev/null)
TOTAL_LAYERS=$(echo "$MODEL_STATS" | grep "Number of Layers:" | awk '{print $NF}')
HEAD_DIM=$(echo "$MODEL_STATS" | grep "Head Dimension:" | awk '{print $NF}')
KV_HEADS=$(echo "$MODEL_STATS" | grep "Head Count KV:" | awk '{print $NF}')
TRAINED_CTX=$(echo "$MODEL_STATS" | grep "Trained Context:" | awk '{print $NF}')
# Revert to fallback ceilings if metadata registers as unknown
[ -z "$TRAINED_CTX" ] || [ "$TRAINED_CTX" = "Unknown" ] && TRAINED_CTX=32768
MAX_ALLOWED_CTX=$(awk -v tc="$TRAINED_CTX" -v m="$CONTEXT_MULTIPLIER" 'BEGIN {printf "%.0f", tc * m}')
# Validate critical model architecture metrics before executing division loops
if [ -z "$TOTAL_LAYERS" ] || [ "$TOTAL_LAYERS" = "Unknown" ] || [ "$TOTAL_LAYERS" -eq 0 ] 2>/dev/null; then
echo "0|0|0|0|0|0"
exit 1
fi
BYTES_PER_LAYER=$(awk -v size="$FILE_SIZE_BYTES" -v l="$TOTAL_LAYERS" 'BEGIN {printf "%.0f", size / l}')
NGL_SPILL=$(awk -v vram="$AVAILABLE_VRAM_BYTES" -v bpl="$BYTES_PER_LAYER" -v l="$TOTAL_LAYERS" 'BEGIN {ngl = int(vram / bpl); print (ngl < 0 ? 0 : (ngl > l ? l : ngl))}')
VRAM_USED_BY_MODEL=$(awk -v ngl="$NGL_SPILL" -v bpl="$BYTES_PER_LAYER" 'BEGIN {printf "%.0f", ngl * bpl}')
# Force any minor precision/rounding differentials under 1MB to exactly 0 bytes
RAM_USED_BY_MODEL=$(awk -v tot="$FILE_SIZE_BYTES" -v vram="$VRAM_USED_BY_MODEL" 'BEGIN {diff = tot - vram; if (diff < 1048576) diff = 0; print diff}')
ACTUAL_FREE_RAM=$(awk -v tot="$TOTAL_RAM_BYTES" -v used="$RAM_USED_BY_MODEL" 'BEGIN {print tot - used}')
FREE_RAM_AVAILABLE=$(awk -v free="$ACTUAL_FREE_RAM" -v oh="$RAM_OVERHEAD_GB" 'BEGIN {margin = oh * 1024 * 1024 * 1024; val = free - margin; print (val < 0 ? 0 : val)}')
# Calculate absolute physical maximum tokens allocatable within net available system RAM
CTX_R_F16=$(awk -v free="$FREE_RAM_AVAILABLE" -v l="$TOTAL_LAYERS" -v kh="$KV_HEADS" -v hd="$HEAD_DIM" 'BEGIN {denom = 2 * l * kh * hd * 2; print (denom > 0 ? int(free / denom) : 0)}')
CTX_R_Q8=$(awk -v free="$FREE_RAM_AVAILABLE" -v l="$TOTAL_LAYERS" -v kh="$KV_HEADS" -v hd="$HEAD_DIM" 'BEGIN {denom = 2 * l * kh * hd * 1.0625; print (denom > 0 ? int(free / denom) : 0)}')
CTX_R_Q4=$(awk -v free="$FREE_RAM_AVAILABLE" -v l="$TOTAL_LAYERS" -v kh="$KV_HEADS" -v hd="$HEAD_DIM" 'BEGIN {denom = 2 * l * kh * hd * 0.5625; print (denom > 0 ? int(free / denom) : 0)}')
# Clamp the offloading context variables safely against the dynamic multiplier ceiling
[ "$CTX_R_F16" -gt "$MAX_ALLOWED_CTX" ] 2>/dev/null && CTX_R_F16="$MAX_ALLOWED_CTX"
[ "$CTX_R_Q8" -gt "$MAX_ALLOWED_CTX" ] 2>/dev/null && CTX_R_Q8="$MAX_ALLOWED_CTX"
[ "$CTX_R_Q4" -gt "$MAX_ALLOWED_CTX" ] 2>/dev/null && CTX_R_Q4="$MAX_ALLOWED_CTX"
RAM_SPILL_GB=$(awk -v b="$RAM_USED_BY_MODEL" 'BEGIN {print b / 1024 / 1024 / 1024}')
# Print out the complete system offloading values
echo "$NGL_SPILL|$RAM_SPILL_GB|$CTX_R_F16|$CTX_R_Q8|$CTX_R_Q4|$TOTAL_LAYERS"