Skip to main content

tensorlogic_sklears_kernels/
lib.rs

1//! # Tensorlogic-SkleaRS-Kernels
2//!
3//! **Version**: 0.1.0-beta.1 | **Status**: Production Ready
4//!
5//! Logic-derived similarity kernels for machine learning integration.
6//!
7//! This crate provides kernel functions that measure similarity based on logical
8//! rule satisfaction patterns, enabling TensorLogic to integrate with traditional
9//! machine learning algorithms (SVMs, kernel methods, etc.).
10//!
11//! ## Features
12//!
13//! - ✅ **Rule Similarity Kernels** - Measure similarity by rule satisfaction agreement
14//! - ✅ **Predicate Overlap Kernels** - Similarity based on shared true predicates
15//! - ✅ **Tensor Kernels** - Classical kernels (Linear, RBF, Polynomial, Cosine)
16//! - ✅ **Kernel Composition** - Combine multiple kernels
17//! - ✅ **Type-Safe API** - Builder pattern with validation
18//! - ✅ **Comprehensive Tests** - 25+ tests covering all components
19//!
20//! ## Architecture
21//!
22//! ### Kernel Trait
23//!
24//! All kernels implement the `Kernel` trait:
25//!
26//! ```rust
27//! use tensorlogic_sklears_kernels::{Kernel, LinearKernel};
28//!
29//! let kernel = LinearKernel::new();
30//! let x = vec![1.0, 2.0, 3.0];
31//! let y = vec![4.0, 5.0, 6.0];
32//! let similarity = kernel.compute(&x, &y).unwrap();
33//! ```
34//!
35//! ### Logic-Derived Kernels
36//!
37//! #### Rule Similarity
38//!
39//! Measures similarity based on which rules are satisfied:
40//!
41//! ```rust
42//! use tensorlogic_sklears_kernels::{
43//!     RuleSimilarityKernel, RuleSimilarityConfig, Kernel
44//! };
45//! use tensorlogic_ir::TLExpr;
46//!
47//! // Define logical rules
48//! let rules = vec![
49//!     TLExpr::pred("rule1", vec![]),
50//!     TLExpr::pred("rule2", vec![]),
51//!     TLExpr::pred("rule3", vec![]),
52//! ];
53//!
54//! // Configure similarity weights
55//! let config = RuleSimilarityConfig::new()
56//!     .with_satisfied_weight(1.0)    // Both satisfy
57//!     .with_violated_weight(0.5)     // Both violate
58//!     .with_mixed_weight(0.0);       // Disagree
59//!
60//! let kernel = RuleSimilarityKernel::new(rules, config).unwrap();
61//!
62//! // Compute similarity
63//! let x = vec![1.0, 1.0, 0.0];  // Satisfies first two rules
64//! let y = vec![1.0, 1.0, 1.0];  // Satisfies all three rules
65//! let sim = kernel.compute(&x, &y).unwrap();
66//! ```
67//!
68//! #### Predicate Overlap
69//!
70//! Measures similarity by counting shared true predicates:
71//!
72//! ```rust
73//! use tensorlogic_sklears_kernels::{PredicateOverlapKernel, Kernel};
74//!
75//! let kernel = PredicateOverlapKernel::new(4);
76//!
77//! let x = vec![1.0, 1.0, 0.0, 0.0];  // First two predicates true
78//! let y = vec![1.0, 1.0, 1.0, 0.0];  // First three predicates true
79//! let sim = kernel.compute(&x, &y).unwrap();
80//! // Similarity = 2/4 = 0.5 (two shared true predicates)
81//! ```
82//!
83//! ### Tensor-Based Kernels
84//!
85//! #### Linear Kernel
86//!
87//! ```rust
88//! use tensorlogic_sklears_kernels::{LinearKernel, Kernel};
89//!
90//! let kernel = LinearKernel::new();
91//! let x = vec![1.0, 2.0, 3.0];
92//! let y = vec![4.0, 5.0, 6.0];
93//! let sim = kernel.compute(&x, &y).unwrap();
94//! // Similarity = dot(x, y) = 1*4 + 2*5 + 3*6 = 32
95//! ```
96//!
97//! #### RBF (Gaussian) Kernel
98//!
99//! ```rust
100//! use tensorlogic_sklears_kernels::{RbfKernel, RbfKernelConfig, Kernel};
101//!
102//! let config = RbfKernelConfig::new(0.5);  // gamma = 0.5
103//! let kernel = RbfKernel::new(config).unwrap();
104//!
105//! let x = vec![1.0, 2.0, 3.0];
106//! let y = vec![1.0, 2.0, 3.0];
107//! let sim = kernel.compute(&x, &y).unwrap();
108//! // Similarity = exp(-gamma * ||x-y||^2) = 1.0 (same vectors)
109//! ```
110//!
111//! #### Polynomial Kernel
112//!
113//! ```rust
114//! use tensorlogic_sklears_kernels::{PolynomialKernel, Kernel};
115//!
116//! let kernel = PolynomialKernel::new(2, 1.0).unwrap();  // degree=2, constant=1
117//!
118//! let x = vec![1.0, 2.0];
119//! let y = vec![3.0, 4.0];
120//! let sim = kernel.compute(&x, &y).unwrap();
121//! // Similarity = (dot(x,y) + c)^d = (11 + 1)^2 = 144
122//! ```
123//!
124//! #### Cosine Similarity
125//!
126//! ```rust
127//! use tensorlogic_sklears_kernels::{CosineKernel, Kernel};
128//!
129//! let kernel = CosineKernel::new();
130//!
131//! let x = vec![1.0, 2.0, 3.0];
132//! let y = vec![2.0, 4.0, 6.0];  // Parallel to x
133//! let sim = kernel.compute(&x, &y).unwrap();
134//! // Similarity = cos(angle) = 1.0 (parallel vectors)
135//! ```
136//!
137//! ## Kernel Matrix Computation
138//!
139//! All kernels support efficient matrix computation:
140//!
141//! ```rust
142//! use tensorlogic_sklears_kernels::{LinearKernel, Kernel};
143//!
144//! let kernel = LinearKernel::new();
145//! let inputs = vec![
146//!     vec![1.0, 2.0],
147//!     vec![3.0, 4.0],
148//!     vec![5.0, 6.0],
149//! ];
150//!
151//! let matrix = kernel.compute_matrix(&inputs).unwrap();
152//! // matrix[i][j] = kernel(inputs[i], inputs[j])
153//! // Symmetric positive semi-definite matrix
154//! ```
155//!
156//! ## Integration with TensorLogic
157//!
158//! Kernels can be built from compiled TensorLogic expressions:
159//!
160//! ```rust,ignore
161//! use tensorlogic_ir::TLExpr;
162//! use tensorlogic_compiler::CompilerContext;
163//! use tensorlogic_sklears_kernels::RuleSimilarityKernel;
164//!
165//! // Define logical rules
166//! let rule = TLExpr::exists(
167//!     "x",
168//!     "Person",
169//!     TLExpr::pred("likes", vec![/* ... */]),
170//! );
171//!
172//! // Compile to kernel
173//! let kernel = RuleSimilarityKernel::from_rules(vec![rule]).unwrap();
174//!
175//! // Use in machine learning
176//! let data = vec![/* feature vectors */];
177//! let kernel_matrix = kernel.compute_matrix(&data).unwrap();
178//! ```
179//!
180//! ## Use Cases
181//!
182//! ### 1. Kernel SVM with Logical Features
183//!
184//! Use rule satisfaction as features for SVM:
185//!
186//! ```rust,ignore
187//! let rules = extract_rules_from_knowledge_base();
188//! let kernel = RuleSimilarityKernel::new(rules, config).unwrap();
189//! let svm = KernelSVM::new(kernel);
190//! svm.fit(training_data, labels);
191//! ```
192//!
193//! ### 2. Semantic Similarity
194//!
195//! Measure semantic similarity between documents/entities:
196//!
197//! ```rust,ignore
198//! let predicates = extract_predicates_from_text(document);
199//! let kernel = PredicateOverlapKernel::new(predicates.len());
200//! let similarity = kernel.compute(&doc1_features, &doc2_features).unwrap();
201//! ```
202//!
203//! ### 3. Hybrid Kernels
204//!
205//! Combine logical and tensor-based features:
206//!
207//! ```rust,ignore
208//! let logic_kernel = RuleSimilarityKernel::new(rules, config).unwrap();
209//! let tensor_kernel = RbfKernel::new(RbfKernelConfig::new(0.5)).unwrap();
210//!
211//! // Weighted combination
212//! let alpha = 0.7;
213//! let similarity = alpha * logic_kernel.compute(x, y).unwrap()
214//!                + (1.0 - alpha) * tensor_kernel.compute(x_emb, y_emb).unwrap();
215//! ```
216//!
217//! ## Design Philosophy
218//!
219//! 1. **Backend Independence**: Kernels work with any feature representation
220//! 2. **Composability**: Mix logical and tensor-based similarities
221//! 3. **Type Safety**: Compile-time validation where possible
222//! 4. **Performance**: Efficient matrix operations
223//! 5. **Interpretability**: Clear mapping from logic to similarity
224
225pub mod ard_kernel;
226pub mod cache;
227pub mod composite_kernel;
228pub mod error;
229pub mod feature_extraction;
230pub mod gradient;
231pub mod graph_kernel;
232pub mod kernel_selection;
233pub mod kernel_transform;
234pub mod kernel_utils;
235pub mod kpca;
236pub mod logic_kernel;
237pub mod low_rank;
238pub mod multitask;
239pub mod online;
240pub mod provenance;
241pub mod random_features;
242#[cfg(feature = "sklears")]
243pub mod sklears_integration;
244pub mod sparse;
245pub mod spectral_kernel;
246pub mod string_kernel;
247pub mod symbolic;
248pub mod tensor_kernels;
249pub mod tree_kernel;
250pub mod types;
251
252// Re-export main types for convenience
253pub use ard_kernel::{
254    ArdMaternKernel, ArdRationalQuadraticKernel, ArdRbfKernel, ConstantKernel, DotProductKernel,
255    KernelGradient, ScaledKernel, WhiteNoiseKernel,
256};
257pub use cache::{CacheStats, CachedKernel, KernelMatrixCache};
258pub use composite_kernel::{KernelAlignment, ProductKernel, WeightedSumKernel};
259pub use error::{KernelError, Result};
260pub use feature_extraction::{FeatureExtractionConfig, FeatureExtractor};
261pub use graph_kernel::{
262    Graph, RandomWalkKernel, SubgraphMatchingConfig, SubgraphMatchingKernel, WalkKernelConfig,
263    WeisfeilerLehmanConfig, WeisfeilerLehmanKernel,
264};
265pub use kernel_selection::{
266    CrossValidationResult, GammaSearchResult, KFoldConfig, KernelComparison, KernelSelector,
267};
268pub use kernel_transform::NormalizedKernel;
269pub use logic_kernel::{PredicateOverlapKernel, RuleSimilarityKernel};
270pub use low_rank::{NystromApproximation, NystromConfig, SamplingMethod};
271pub use multitask::{
272    HadamardTaskKernel, ICMKernel, ICMKernelWrapper, IndexKernel, LMCKernel, LMCKernelWrapper,
273    MultiTaskConfig, MultiTaskKernelBuilder, TaskInput,
274};
275pub use online::{
276    AdaptiveKernelMatrix, ForgetfulConfig, ForgetfulKernelMatrix, OnlineConfig, OnlineKernelMatrix,
277    OnlineStats, WindowedKernelMatrix,
278};
279pub use provenance::{
280    ComputationResult, ProvenanceConfig, ProvenanceId, ProvenanceKernel, ProvenanceRecord,
281    ProvenanceStatistics, ProvenanceTracker,
282};
283pub use random_features::{
284    KernelType as RffKernelType, NystroemFeatures, OrthogonalRandomFeatures, RandomFourierFeatures,
285    RffConfig,
286};
287#[cfg(feature = "sklears")]
288pub use sklears_integration::SklearsKernelAdapter;
289pub use sparse::{SparseKernelMatrix, SparseKernelMatrixBuilder};
290pub use spectral_kernel::{
291    ExpSineSquaredKernel, LocallyPeriodicKernel, RbfLinearKernel, SpectralComponent,
292    SpectralMixtureKernel,
293};
294pub use string_kernel::{
295    EditDistanceKernel, NGramKernel, NGramKernelConfig, SubsequenceKernel, SubsequenceKernelConfig,
296};
297pub use symbolic::{KernelBuilder, KernelExpr, SymbolicKernel};
298pub use tensor_kernels::{
299    ChiSquaredKernel, CosineKernel, HistogramIntersectionKernel, LaplacianKernel, LinearKernel,
300    MaternKernel, PeriodicKernel, PolynomialKernel, RationalQuadraticKernel, RbfKernel,
301    SigmoidKernel,
302};
303pub use tree_kernel::{
304    PartialTreeKernel, PartialTreeKernelConfig, SubsetTreeKernel, SubsetTreeKernelConfig,
305    SubtreeKernel, SubtreeKernelConfig, TreeNode,
306};
307pub use types::{Kernel, PredicateOverlapConfig, RbfKernelConfig, RuleSimilarityConfig};
308
309// Legacy compatibility
310#[deprecated(since = "0.1.0", note = "Use RuleSimilarityKernel instead")]
311pub fn logic_kernel_similarity() {
312    // Legacy function - use RuleSimilarityKernel instead
313}
314
315#[cfg(test)]
316mod tests {
317    use super::*;
318
319    #[test]
320    fn test_kernel_trait_usage() {
321        let kernels: Vec<Box<dyn Kernel>> = vec![
322            Box::new(LinearKernel::new()),
323            Box::new(CosineKernel::new()),
324            Box::new(RbfKernel::new(RbfKernelConfig::new(0.5)).unwrap()),
325            Box::new(PolynomialKernel::new(2, 1.0).unwrap()),
326        ];
327
328        let x = vec![1.0, 2.0, 3.0];
329        let y = vec![4.0, 5.0, 6.0];
330
331        for kernel in kernels {
332            let result = kernel.compute(&x, &y);
333            assert!(result.is_ok());
334        }
335    }
336
337    #[test]
338    fn test_kernel_names() {
339        assert_eq!(LinearKernel::new().name(), "Linear");
340        assert_eq!(CosineKernel::new().name(), "Cosine");
341        assert_eq!(
342            RbfKernel::new(RbfKernelConfig::new(0.5)).unwrap().name(),
343            "RBF"
344        );
345        assert_eq!(PolynomialKernel::new(2, 1.0).unwrap().name(), "Polynomial");
346    }
347
348    #[test]
349    fn test_psd_property() {
350        let kernel = LinearKernel::new();
351        assert!(kernel.is_psd());
352
353        let kernel = RbfKernel::new(RbfKernelConfig::new(0.5)).unwrap();
354        assert!(kernel.is_psd());
355    }
356}