prolly-map 0.3.0

Content-addressed versioned map storage primitives.
Documentation
use prolly::{
    AdaptiveQuality, DistanceMetric, HierarchyConfig, OverflowConfig, ProximityConfig,
    ScalarQuantizationConfig, SearchBackend, SearchBudget, SearchCompletion, SearchPolicy,
    VectorStorageConfig,
};

#[test]
fn proximity_config_validation_checks() {
    let config = ProximityConfig {
        dimensions: 3,
        metric: DistanceMetric::Cosine,
        hierarchy: HierarchyConfig {
            log_chunk_size: 7,
            level_hash_seed: 42,
        },
        overflow: OverflowConfig {
            min_page_bytes: 4 * 1024,
            target_page_bytes: 64 * 1024,
            max_page_bytes: 256 * 1024,
            hash_seed: 11,
        },
        vector_storage: VectorStorageConfig {
            inline_threshold_bytes: 16 * 1024,
        },
        scalar_quantization: Some(ScalarQuantizationConfig { group_size: 16 }),
    };
    config.validate().unwrap();

    assert_eq!(
        SearchPolicy::Adaptive(AdaptiveQuality::Balanced),
        SearchPolicy::Adaptive(AdaptiveQuality::Balanced)
    );
    assert_eq!(SearchCompletion::Exact, SearchCompletion::Exact);
    assert_eq!(SearchBackend::Auto, SearchBackend::Auto);
    SearchBudget::default().validate().unwrap();
}

#[test]
fn proximity_config_rejects_invalid_limits() {
    let mut config = ProximityConfig::new(3);
    config.hierarchy.log_chunk_size = 0;
    assert!(config.validate().is_err());

    let mut config = ProximityConfig::new(3);
    config.overflow.target_page_bytes = config.overflow.max_page_bytes + 1;
    assert!(config.validate().is_err());

    let mut config = ProximityConfig::new(3);
    config.scalar_quantization = Some(ScalarQuantizationConfig { group_size: 0 });
    assert!(config.validate().is_err());

    let budget = SearchBudget {
        max_nodes: Some(0),
        ..SearchBudget::default()
    };
    assert!(budget.validate().is_err());
}