1#![allow(dead_code)]
122
123pub mod ab_testing;
124pub mod acceleration;
125pub mod adaptive_learning;
126pub mod advanced_profiler;
127pub mod alignment;
128#[cfg(feature = "api-server")]
129pub mod api;
130pub mod application_tasks;
131pub mod batch_processing;
132pub mod biomedical_embeddings;
133pub mod caching;
134pub mod causal_representation_learning;
135pub mod causal_representation_learning_eval;
136pub mod causal_representation_learning_model;
137mod causal_representation_learning_tests;
138pub mod causal_representation_learning_types;
139pub mod cloud_integration;
140pub mod clustering;
141pub mod community_detection;
142pub mod compression;
143pub mod contextual;
144pub mod continual_learning;
145pub(crate) mod continual_learning_strategies;
146#[cfg(test)]
147mod continual_learning_tests;
148pub(crate) mod continual_learning_trainer;
149pub mod continual_learning_types;
150pub mod cross_domain_transfer;
151pub mod cross_module_performance;
152pub mod cross_module_performance_profiler;
153pub mod cross_module_performance_reporter;
154mod cross_module_performance_tests;
155pub mod cross_module_performance_types;
156pub mod delta;
157pub mod diffusion_embeddings;
158pub mod distributed_training;
159pub mod embed_compression;
160pub mod enterprise_knowledge;
161pub mod enterprise_knowledge_analyzer;
162pub mod enterprise_knowledge_analyzer_helpers;
163pub mod enterprise_knowledge_config;
164pub mod enterprise_knowledge_customer;
165pub mod enterprise_knowledge_employee;
166pub mod enterprise_knowledge_engine;
167pub mod enterprise_knowledge_product;
168#[cfg(test)]
169mod enterprise_knowledge_tests;
170pub mod entity_linking;
171pub mod evaluation;
172pub mod evolutionary_nas;
173pub mod evolutionary_nas_eval;
174pub mod evolutionary_nas_evolution;
175mod evolutionary_nas_tests;
176pub mod evolutionary_nas_types;
177pub mod federated_learning;
178pub mod fine_tuning;
179#[cfg(feature = "gpu")]
180pub mod gpu_acceleration;
181pub mod graph_models;
182pub mod graphql_api;
183pub mod inference;
184pub mod integration;
185pub mod interpretability;
186pub mod kg_completion;
187pub mod link_prediction;
188pub mod mamba_attention;
189pub mod memory_augmented_networks;
190pub mod memory_nets_controller;
191pub mod memory_nets_ops;
192pub mod memory_nets_tests;
193pub mod mixed_precision;
194pub mod model_registry;
195pub mod model_selection;
196pub mod models;
197pub mod monitoring;
198pub mod monitoring_health;
199pub mod monitoring_metrics;
200pub mod monitoring_tests;
201pub mod multimodal;
202pub mod neural_symbolic_integration;
203pub mod neural_symbolic_integration_engine;
204pub mod neural_symbolic_integration_loss;
205mod neural_symbolic_integration_tests;
206pub mod neural_symbolic_integration_types;
207pub mod neuro_evolution;
208pub mod novel_arch_impl;
209#[cfg(test)]
210mod novel_arch_tests;
211pub mod novel_arch_types;
212pub mod novel_architectures;
213pub mod performance_profiler;
214pub mod persistence;
215pub mod quantization;
216pub mod real_time_fine_tuning;
217pub mod real_time_optimization;
218pub mod research_networks;
219pub mod sparql_extension;
221pub mod storage_backend;
222pub mod temporal_embeddings;
223pub mod training;
224pub mod training_online;
225pub mod utils;
226pub mod utils_io;
227pub mod utils_math;
228mod utils_tests;
229pub mod utils_types;
230pub mod validation;
231pub mod vector_search;
232pub mod vision_language_graph;
233pub mod visualization;
234pub mod contrastive_learning;
236
237pub mod procrustes_alignment;
239
240pub mod embedding_cache;
242
243pub mod dimensionality_reducer;
245
246pub mod pca_reducer;
248
249pub mod fine_tuner;
251
252pub mod vector_store;
254
255pub mod cross_encoder;
257
258pub mod projection_layer;
260pub use projection_layer::{ActivationFn, InitMethod, ProjectionLayer, ProjectionMatrix};
261
262pub mod embedding_store;
264
265pub mod tokenizer;
267
268pub mod embedding_aggregator;
270
271pub mod reranker;
273
274pub mod index_optimizer;
276
277pub mod batch_encoder;
279
280pub mod ensemble;
282
283pub mod embedding_compressor;
285
286pub mod model_zoo;
288pub use model_zoo::{sha256_hex, ModelManifest, ModelZoo, ModelZooError, ModelZooLoader};
289
290pub use oxirs_vec::Vector as VecVector;
292
293pub use adaptive_learning::{
295 AdaptationMetrics, AdaptationStrategy, AdaptiveLearningConfig, AdaptiveLearningSystem,
296 QualityFeedback,
297};
298
299use anyhow::Result;
300use chrono::{DateTime, Utc};
301use serde::{Deserialize, Serialize};
302use std::collections::HashMap;
303use std::ops::{Add, Sub};
304use uuid::Uuid;
305
306#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
309pub struct Vector {
310 pub values: Vec<f32>,
311 pub dimensions: usize,
312 #[serde(skip)]
313 inner: Option<VecVector>,
314}
315
316impl Vector {
317 pub fn new(values: Vec<f32>) -> Self {
318 let dimensions = values.len();
319 Self {
320 values,
321 dimensions,
322 inner: None,
323 }
324 }
325
326 fn get_inner(&self) -> VecVector {
328 if let Some(ref inner) = self.inner {
330 inner.clone()
331 } else {
332 VecVector::new(self.values.clone())
333 }
334 }
335
336 fn sync_internal(&mut self) {
338 self.dimensions = self.values.len();
339 self.inner = None; }
341
342 pub fn from_array1(array: &scirs2_core::ndarray_ext::Array1<f32>) -> Self {
344 Self::new(array.to_vec())
345 }
346
347 pub fn to_array1(&self) -> scirs2_core::ndarray_ext::Array1<f32> {
349 scirs2_core::ndarray_ext::Array1::from_vec(self.values.clone())
350 }
351
352 pub fn mapv<F>(&self, f: F) -> Self
354 where
355 F: Fn(f32) -> f32,
356 {
357 Self::new(self.values.iter().copied().map(f).collect())
358 }
359
360 pub fn sum(&self) -> f32 {
362 self.values.iter().sum()
363 }
364
365 pub fn sqrt(&self) -> f32 {
367 self.sum().sqrt()
368 }
369
370 pub fn inner(&self) -> VecVector {
372 self.get_inner()
373 }
374
375 pub fn into_inner(self) -> VecVector {
377 self.inner.unwrap_or_else(|| VecVector::new(self.values))
378 }
379
380 pub fn from_vec_vector(vec_vector: VecVector) -> Self {
382 let values = vec_vector.as_f32().to_vec();
383 let dimensions = values.len();
384 Self {
385 values,
386 dimensions,
387 inner: Some(vec_vector),
388 }
389 }
390
391 pub fn with_capacity(capacity: usize) -> Self {
393 Self {
394 values: Vec::with_capacity(capacity),
395 dimensions: 0,
396 inner: None,
397 }
398 }
399
400 pub fn extend_optimized(&mut self, other_values: &[f32]) {
402 self.values.reserve(other_values.len());
404 self.values.extend_from_slice(other_values);
405 self.sync_internal();
406 }
407
408 pub fn shrink_to_fit(&mut self) {
410 self.values.shrink_to_fit();
411 self.sync_internal();
412 }
413
414 pub fn memory_usage(&self) -> usize {
416 self.values.capacity() * std::mem::size_of::<f32>() + std::mem::size_of::<Self>()
417 }
418}
419
420impl Add for &Vector {
422 type Output = Vector;
423
424 fn add(self, other: &Vector) -> Vector {
425 if let (Some(self_inner), Some(other_inner)) = (&self.inner, &other.inner) {
427 if let Ok(result) = self_inner.add(other_inner) {
428 return Vector::from_vec_vector(result);
429 }
430 }
431 assert_eq!(
433 self.values.len(),
434 other.values.len(),
435 "Vector dimensions must match"
436 );
437 let result_values: Vec<f32> = self
438 .values
439 .iter()
440 .zip(other.values.iter())
441 .map(|(a, b)| a + b)
442 .collect();
443 Vector::new(result_values)
444 }
445}
446
447impl Sub for &Vector {
448 type Output = Vector;
449
450 fn sub(self, other: &Vector) -> Vector {
451 if let (Some(self_inner), Some(other_inner)) = (&self.inner, &other.inner) {
453 if let Ok(result) = self_inner.subtract(other_inner) {
454 return Vector::from_vec_vector(result);
455 }
456 }
457 assert_eq!(
459 self.values.len(),
460 other.values.len(),
461 "Vector dimensions must match"
462 );
463 let result_values: Vec<f32> = self
464 .values
465 .iter()
466 .zip(other.values.iter())
467 .map(|(a, b)| a - b)
468 .collect();
469 Vector::new(result_values)
470 }
471}
472
473#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
475pub struct Triple {
476 pub subject: NamedNode,
477 pub predicate: NamedNode,
478 pub object: NamedNode,
479}
480
481impl Triple {
482 pub fn new(subject: NamedNode, predicate: NamedNode, object: NamedNode) -> Self {
483 Self {
484 subject,
485 predicate,
486 object,
487 }
488 }
489}
490
491#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
493pub struct NamedNode {
494 pub iri: String,
495}
496
497impl NamedNode {
498 pub fn new(iri: &str) -> Result<Self> {
499 Ok(Self {
500 iri: iri.to_string(),
501 })
502 }
503}
504
505impl std::fmt::Display for NamedNode {
506 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
507 write!(f, "{}", self.iri)
508 }
509}
510
511#[derive(Debug, Clone, Serialize, Deserialize)]
513pub struct ModelConfig {
514 pub dimensions: usize,
515 pub learning_rate: f64,
516 pub l2_reg: f64,
517 pub max_epochs: usize,
518 pub batch_size: usize,
519 pub negative_samples: usize,
520 pub seed: Option<u64>,
521 pub use_gpu: bool,
522 pub model_params: HashMap<String, f64>,
523}
524
525impl Default for ModelConfig {
526 fn default() -> Self {
527 Self {
528 dimensions: 100,
529 learning_rate: 0.01,
530 l2_reg: 0.0001,
531 max_epochs: 1000,
532 batch_size: 1000,
533 negative_samples: 10,
534 seed: None,
535 use_gpu: false,
536 model_params: HashMap::new(),
537 }
538 }
539}
540
541impl ModelConfig {
542 pub fn with_dimensions(mut self, dimensions: usize) -> Self {
543 self.dimensions = dimensions;
544 self
545 }
546
547 pub fn with_learning_rate(mut self, learning_rate: f64) -> Self {
548 self.learning_rate = learning_rate;
549 self
550 }
551
552 pub fn with_max_epochs(mut self, max_epochs: usize) -> Self {
553 self.max_epochs = max_epochs;
554 self
555 }
556
557 pub fn with_seed(mut self, seed: u64) -> Self {
558 self.seed = Some(seed);
559 self
560 }
561
562 pub fn with_batch_size(mut self, batch_size: usize) -> Self {
563 self.batch_size = batch_size;
564 self
565 }
566}
567
568#[derive(Debug, Clone, Serialize, Deserialize)]
570pub struct TrainingStats {
571 pub epochs_completed: usize,
572 pub final_loss: f64,
573 pub training_time_seconds: f64,
574 pub convergence_achieved: bool,
575 pub loss_history: Vec<f64>,
576}
577
578#[derive(Debug, Clone, Serialize, Deserialize)]
580pub struct ModelStats {
581 pub num_entities: usize,
582 pub num_relations: usize,
583 pub num_triples: usize,
584 pub dimensions: usize,
585 pub is_trained: bool,
586 pub model_type: String,
587 pub creation_time: DateTime<Utc>,
588 pub last_training_time: Option<DateTime<Utc>>,
589}
590
591impl Default for ModelStats {
592 fn default() -> Self {
593 Self {
594 num_entities: 0,
595 num_relations: 0,
596 num_triples: 0,
597 dimensions: 0,
598 is_trained: false,
599 model_type: "unknown".to_string(),
600 creation_time: Utc::now(),
601 last_training_time: None,
602 }
603 }
604}
605
606#[derive(Debug, thiserror::Error)]
608pub enum EmbeddingError {
609 #[error("Model not trained")]
610 ModelNotTrained,
611 #[error("Entity not found: {entity}")]
612 EntityNotFound { entity: String },
613 #[error("Relation not found: {relation}")]
614 RelationNotFound { relation: String },
615 #[error("Other error: {0}")]
616 Other(#[from] anyhow::Error),
617}
618
619#[async_trait::async_trait]
621pub trait EmbeddingModel: Send + Sync {
622 fn config(&self) -> &ModelConfig;
623 fn model_id(&self) -> &Uuid;
624 fn model_type(&self) -> &'static str;
625 fn add_triple(&mut self, triple: Triple) -> Result<()>;
626 async fn train(&mut self, epochs: Option<usize>) -> Result<TrainingStats>;
627 fn get_entity_embedding(&self, entity: &str) -> Result<Vector>;
628 fn get_relation_embedding(&self, relation: &str) -> Result<Vector>;
629 fn score_triple(&self, subject: &str, predicate: &str, object: &str) -> Result<f64>;
630 fn predict_objects(
631 &self,
632 subject: &str,
633 predicate: &str,
634 k: usize,
635 ) -> Result<Vec<(String, f64)>>;
636 fn predict_subjects(
637 &self,
638 predicate: &str,
639 object: &str,
640 k: usize,
641 ) -> Result<Vec<(String, f64)>>;
642 fn predict_relations(
643 &self,
644 subject: &str,
645 object: &str,
646 k: usize,
647 ) -> Result<Vec<(String, f64)>>;
648 fn get_entities(&self) -> Vec<String>;
649 fn get_relations(&self) -> Vec<String>;
650 fn get_stats(&self) -> ModelStats;
651 fn save(&self, path: &str) -> Result<()>;
652 fn load(&mut self, path: &str) -> Result<()>;
653 fn clear(&mut self);
654 fn is_trained(&self) -> bool;
655
656 async fn encode(&self, texts: &[String]) -> Result<Vec<Vec<f32>>>;
658}
659
660pub use acceleration::{AdaptiveEmbeddingAccelerator, GpuEmbeddingAccelerator};
662#[cfg(feature = "api-server")]
663pub use api::{start_server, ApiConfig, ApiState};
664pub use batch_processing::{
665 BatchJob, BatchProcessingConfig, BatchProcessingManager, BatchProcessingResult,
666 BatchProcessingStats, IncrementalConfig, JobProgress, JobStatus, OutputFormat,
667 PartitioningStrategy, RetryConfig,
668};
669pub use biomedical_embeddings::{
670 BiomedicalEmbedding, BiomedicalEmbeddingConfig, BiomedicalEntityType, BiomedicalRelationType,
671 FineTuningConfig, PreprocessingRule, SpecializedTextConfig, SpecializedTextEmbedding,
672 SpecializedTextModel,
673};
674pub use caching::{CacheConfig, CacheManager, CachedEmbeddingModel};
675pub use causal_representation_learning::{
676 CausalDiscoveryAlgorithm, CausalDiscoveryConfig, CausalGraph, CausalRepresentationConfig,
677 CausalRepresentationModel, ConstraintSettings, CounterfactualConfig, CounterfactualQuery,
678 DisentanglementConfig, DisentanglementMethod, ExplanationType, IndependenceTest,
679 InterventionConfig, ScoreSettings, StructuralCausalModelConfig,
680};
681pub use cloud_integration::{
682 AWSSageMakerService, AutoScalingConfig, AzureMLService, BackupConfig, CloudIntegrationConfig,
683 CloudIntegrationManager, CloudProvider, CloudService, ClusterStatus, CostEstimate,
684 CostOptimizationResult, CostOptimizationStrategy, DeploymentConfig, DeploymentResult,
685 DeploymentStatus, EndpointInfo, FunctionInvocationResult, GPUClusterConfig, GPUClusterResult,
686 LifecyclePolicy, OptimizationAction, PerformanceTier, ReplicationType,
687 ServerlessDeploymentResult, ServerlessFunctionConfig, ServerlessStatus, StorageConfig,
688 StorageResult, StorageStatus, StorageType,
689};
690pub use compression::{
691 CompressedModel, CompressionStats, CompressionTarget, DistillationConfig,
692 ModelCompressionManager, NASConfig, OptimizationTarget, PruningConfig, PruningMethod,
693 QuantizationConfig, QuantizationMethod,
694};
695pub use continual_learning::{
699 ArchitectureConfig, BoundaryDetection, ConsolidationConfig, ContinualLearningConfig,
700 ContinualLearningModel, MemoryConfig, MemoryType, MemoryUpdateStrategy, RegularizationConfig,
701 ReplayConfig, ReplayMethod, TaskConfig, TaskDetection, TaskSwitching,
702};
703pub use cross_module_performance::{
704 CoordinatorConfig, CrossModulePerformanceCoordinator, GlobalPerformanceMetrics, ModuleMetrics,
705 ModulePerformanceMonitor, OptimizationCache, PerformanceSnapshot, PredictivePerformanceEngine,
706 ResourceAllocator, ResourceTracker,
707};
708pub use delta::{
709 ChangeRecord, ChangeStatistics, ChangeType, DeltaConfig, DeltaManager, DeltaResult, DeltaStats,
710 IncrementalStrategy,
711};
712pub use enterprise_knowledge::{
713 BehaviorMetrics, CareerPredictions, Category, CategoryHierarchy, CategoryPerformance,
714 ColdStartStrategy, CommunicationFrequency, CommunicationPreferences, CustomerEmbedding,
715 CustomerPreferences, CustomerRatings, CustomerSegment, Department, DepartmentPerformance,
716 EmployeeEmbedding, EnterpriseConfig, EnterpriseKnowledgeAnalyzer, EnterpriseMetrics,
717 ExperienceLevel, FeatureType, MarketAnalysis, OrganizationalStructure,
718 PerformanceMetrics as EnterprisePerformanceMetrics, ProductAvailability, ProductEmbedding,
719 ProductFeature, ProductRecommendation, Project, ProjectOutcome, ProjectParticipation,
720 ProjectPerformance, ProjectStatus, Purchase, PurchaseChannel, RecommendationConfig,
721 RecommendationEngine, RecommendationEngineType, RecommendationPerformance,
722 RecommendationReason, SalesMetrics, Skill, SkillCategory, Team, TeamPerformance,
723};
724pub use evaluation::{
725 compute_filtered_rank,
726 hits_at_k,
727 mean_rank,
728 mean_reciprocal_rank,
729 AnalogicalReasoningBenchmark,
730 AnalogyQuad,
731 EmbeddingClusteringMetrics,
732 EmbeddingEvaluator,
733 EvalSplit,
734 EvaluationMetrics,
735 EvaluationTriple,
737 KgcDataset,
738 KgcEvaluationSuite,
739 KgcEvaluator,
740 KgcEvaluatorConfig,
741 QueryAnsweringEvaluator,
742 QueryEvaluationConfig,
743 QueryEvaluationResults,
744 QueryMetric,
745 QueryResult,
746 QueryTemplate,
747 QueryType,
748 ReasoningChain,
749 ReasoningEvaluationConfig,
750 ReasoningEvaluationResults,
751 ReasoningRule,
752 ReasoningStep,
753 ReasoningTaskEvaluator,
754 ReasoningType,
755 TypeSpecificResults,
756};
757pub use federated_learning::{
758 AggregationEngine, AggregationStrategy, AuthenticationConfig, AuthenticationMethod,
759 CertificateConfig, ClippingMechanisms, ClippingMethod, CommunicationConfig,
760 CommunicationManager, CommunicationProtocol, CompressionAlgorithm, CompressionConfig,
761 CompressionEngine, ConvergenceMetrics, ConvergenceStatus, DataSelectionStrategy,
762 DataStatistics, EncryptionScheme, FederatedConfig, FederatedCoordinator,
763 FederatedEmbeddingModel, FederatedMessage, FederatedRound, FederationStats, GlobalModelState,
764 HardwareAccelerator, KeyManager, LocalModelState, LocalTrainingStats, LocalUpdate,
765 MetaLearningConfig, NoiseGenerator, NoiseMechanism, OutlierAction, OutlierDetection,
766 OutlierDetectionMethod, Participant, ParticipantCapabilities, ParticipantStatus,
767 PersonalizationConfig, PersonalizationStrategy, PrivacyAccountant, PrivacyConfig,
768 PrivacyEngine, PrivacyMetrics, PrivacyParams, RoundMetrics, RoundStatus, SecurityConfig,
769 SecurityFeature, SecurityManager, TrainingConfig, VerificationEngine, VerificationMechanism,
770 VerificationResult, WeightingScheme,
771};
772#[cfg(feature = "gpu")]
773pub use gpu_acceleration::{
774 GpuAccelerationConfig, GpuAccelerationManager, GpuMemoryPool, GpuPerformanceStats,
775 MixedPrecisionProcessor, MultiStreamProcessor, TensorCache,
776};
777pub use graphql_api::{
778 create_schema, BatchEmbeddingInput, BatchEmbeddingResult, BatchStatus, DistanceMetric,
779 EmbeddingFormat, EmbeddingQueryInput, EmbeddingResult, EmbeddingSchema, GraphQLContext,
780 ModelInfo, ModelType, SimilarityResult, SimilaritySearchInput,
781};
782pub use kg_completion::{BatchedTrainingLoop, KgCompletionTask, NegativeSampler, TrainingBatch};
783pub use models::{
784 AggregationType, ComplEx, DistMult, GNNConfig, GNNEmbedding, GNNType, HoLE, HoLEConfig,
785 PoolingStrategy, RotatE, TransE, TransformerConfig, TransformerEmbedding, TransformerType,
786};
787
788pub use models::{GraphSageEmbedder, GraphSageEmbedderConfig};
790
791pub use models::{GatEmbedder, GatEmbedderConfig};
793
794pub use contextual::{
795 AccessibilityPreferences, ComplexityLevel, ContextualConfig, ContextualEmbeddingModel,
796 DomainContext, EmbeddingContext, PerformanceRequirements, PriorityLevel, PrivacySettings,
797 QueryContext, QueryType as ContextualQueryType, ResponseFormat, TaskConstraints, TaskContext,
798 TaskType, UserContext, UserHistory, UserPreferences,
799};
800pub use distributed_training::{
801 AggregationMethod, AllReduceStrategy, CommunicationBackend, DataParallelTrainer,
802 DistributedEmbeddingTrainer, DistributedStrategy, DistributedTrainingConfig,
803 DistributedTrainingCoordinator, DistributedTrainingSample, DistributedTrainingStats,
804 FaultToleranceConfig, GradientAggregator, GradientCompressor, ModelShardManager, ModelUpdate,
805 ParameterServer, ParameterServerConfig, ParameterServerStats, ShardAssignment, ShardSnapshot,
806 ShardingStrategy, SparseGradient, TripleSample, UpdateMode, Worker, WorkerConfig, WorkerInfo,
807 WorkerLoss, WorkerStatus, WorkerUpdate,
808};
809#[cfg(feature = "conve")]
810pub use models::{ConvE, ConvEConfig};
811pub use monitoring::{
812 Alert, AlertSeverity, AlertThresholds, AlertType, CacheMetrics, ConsoleAlertHandler,
813 DriftMetrics, ErrorEvent, ErrorMetrics, ErrorSeverity, LatencyMetrics, MonitoringConfig,
814 PerformanceMetrics as MonitoringPerformanceMetrics, PerformanceMonitor, QualityAssessment,
815 QualityMetrics, ResourceMetrics, SlackAlertHandler, ThroughputMetrics,
816};
817pub use multimodal::{
818 AlignmentNetwork, AlignmentObjective, ContrastiveConfig, CrossDomainConfig, CrossModalConfig,
819 KGEncoder, MultiModalEmbedding, MultiModalStats, TextEncoder,
820};
821pub use neural_symbolic_integration::{
822 ConstraintSatisfactionConfig, ConstraintType, KnowledgeIntegrationConfig, KnowledgeRule,
823 LogicIntegrationConfig, LogicProgrammingConfig, LogicalFormula, NeuralSymbolicConfig,
824 NeuralSymbolicModel, NeuroSymbolicArchitectureConfig, OntologicalConfig, ReasoningEngine,
825 RuleBasedConfig, SymbolicReasoningConfig,
826};
827pub use novel_architectures::{
828 ActivationType, ArchitectureParams, ArchitectureState, ArchitectureType, CurvatureComputation,
829 CurvatureMethod, CurvatureType, DynamicsConfig, EntanglementStructure, EquivarianceGroup,
830 FlowType, GeometricConfig, GeometricParams, GeometricSpace, GeometricState,
831 GraphTransformerParams, GraphTransformerState, HyperbolicDistance, HyperbolicInit,
832 HyperbolicManifold, HyperbolicParams, HyperbolicState, IntegrationScheme, IntegrationStats,
833 ManifoldLearning, ManifoldMethod, ManifoldOptimizer, NeuralODEParams, NeuralODEState,
834 NovelArchitectureConfig, NovelArchitectureModel, ODERegularization, ODESolverType,
835 ParallelTransport, QuantumGateSet, QuantumMeasurement, QuantumNoise, QuantumParams,
836 QuantumState, StabilityConstraints, StructuralBias, TimeEvolution, TransportMethod,
837};
838pub use research_networks::{
839 AuthorEmbedding, Citation, CitationNetwork, CitationType, Collaboration, CollaborationNetwork,
840 NetworkMetrics, PaperSection, PublicationEmbedding, PublicationType, ResearchCommunity,
841 ResearchNetworkAnalyzer, ResearchNetworkConfig, TopicModel, TopicModelingConfig,
842};
843pub use sparql_extension::{
844 ExpandedQuery, Expansion, ExpansionType, QueryStatistics as SparqlQueryStatistics,
845 SparqlExtension, SparqlExtensionConfig,
846};
847pub use storage_backend::{
848 DiskBackend, EmbeddingMetadata, EmbeddingVersion, MemoryBackend, StorageBackend,
849 StorageBackendConfig, StorageBackendManager, StorageBackendType, StorageStats,
850};
851pub use temporal_embeddings::{
852 TemporalEmbeddingConfig, TemporalEmbeddingModel, TemporalEvent, TemporalForecast,
853 TemporalGranularity, TemporalScope, TemporalStats, TemporalTriple,
854};
855pub use vision_language_graph::{
856 AggregationFunction, CNNConfig, CrossAttentionConfig, DomainAdaptationConfig,
857 DomainAdaptationMethod, EpisodeConfig, FewShotConfig, FewShotMethod, FusionStrategy,
858 GraphArchitecture, GraphEncoder, GraphEncoderConfig, JointTrainingConfig, LanguageArchitecture,
859 LanguageEncoder, LanguageEncoderConfig, LanguageTransformerConfig, MetaLearner,
860 ModalityEncoding, MultiModalTransformer, MultiModalTransformerConfig, NormalizationType,
861 PoolingType, PositionEncodingType, ReadoutFunction, TaskCategory, TaskSpecificParams,
862 TrainingObjective, TransferLearningConfig, TransferStrategy, ViTConfig, VisionArchitecture,
863 VisionEncoder, VisionEncoderConfig, VisionLanguageGraphConfig, VisionLanguageGraphModel,
864 VisionLanguageGraphStats, ZeroShotConfig, ZeroShotMethod,
865};
866
867#[cfg(feature = "tucker")]
868pub use models::TuckER;
869
870#[cfg(feature = "quatd")]
871pub use models::QuatD;
872
873pub use crate::model_registry::{
875 ModelRegistry, ModelVersion, ResourceAllocation as ModelResourceAllocation,
876};
877
878pub use crate::model_selection::{
880 DatasetCharacteristics, MemoryRequirement, ModelComparison, ModelComparisonEntry,
881 ModelRecommendation, ModelSelector, ModelType as SelectionModelType, TrainingTime, UseCaseType,
882};
883
884pub use crate::performance_profiler::{
886 OperationStats, OperationTimer, OperationType, PerformanceProfiler, PerformanceReport,
887};
888
889pub mod quick_start {
903 use super::*;
904 use crate::models::TransE;
905
906 pub fn create_simple_transe_model() -> TransE {
908 let config = ModelConfig::default()
909 .with_dimensions(128)
910 .with_learning_rate(0.01)
911 .with_max_epochs(100);
912 TransE::new(config)
913 }
914
915 pub fn create_biomedical_model() -> BiomedicalEmbedding {
917 let config = BiomedicalEmbeddingConfig::default();
918 BiomedicalEmbedding::new(config)
919 }
920
921 pub fn parse_triple_from_string(triple_str: &str) -> Result<Triple> {
923 let parts: Vec<&str> = triple_str.split_whitespace().collect();
924 if parts.len() != 3 {
925 return Err(anyhow::anyhow!(
926 "Triple must have exactly 3 parts separated by spaces"
927 ));
928 }
929
930 let expand_uri = |s: &str| -> String {
932 if s.starts_with("http://") || s.starts_with("https://") {
933 s.to_string()
934 } else {
935 format!("http://example.org/{s}")
936 }
937 };
938
939 Ok(Triple::new(
940 NamedNode::new(&expand_uri(parts[0]))?,
941 NamedNode::new(&expand_uri(parts[1]))?,
942 NamedNode::new(&expand_uri(parts[2]))?,
943 ))
944 }
945
946 pub fn add_triples_from_strings<T: EmbeddingModel>(
948 model: &mut T,
949 triple_strings: &[&str],
950 ) -> Result<usize> {
951 let mut count = 0;
952 for triple_str in triple_strings {
953 let triple = parse_triple_from_string(triple_str)?;
954 model.add_triple(triple)?;
955 count += 1;
956 }
957 Ok(count)
958 }
959
960 pub fn cosine_similarity(a: &[f64], b: &[f64]) -> Result<f64> {
962 if a.len() != b.len() {
963 return Err(anyhow::anyhow!(
964 "Vector dimensions don't match: {} vs {}",
965 a.len(),
966 b.len()
967 ));
968 }
969
970 let dot_product: f64 = a.iter().zip(b.iter()).map(|(x, y)| x * y).sum();
971 let norm_a: f64 = a.iter().map(|x| x * x).sum::<f64>().sqrt();
972 let norm_b: f64 = b.iter().map(|x| x * x).sum::<f64>().sqrt();
973
974 if norm_a == 0.0 || norm_b == 0.0 {
975 return Ok(0.0);
976 }
977
978 Ok(dot_product / (norm_a * norm_b))
979 }
980
981 pub fn generate_sample_kg_data(
983 num_entities: usize,
984 num_relations: usize,
985 ) -> Vec<(String, String, String)> {
986 #[allow(unused_imports)]
987 use scirs2_core::random::{Random, RngExt};
988
989 let mut random = Random::default();
990 let mut triples = Vec::new();
991
992 let entities: Vec<String> = (0..num_entities)
993 .map(|i| format!("http://example.org/entity_{i}"))
994 .collect();
995
996 let relations: Vec<String> = (0..num_relations)
997 .map(|i| format!("http://example.org/relation_{i}"))
998 .collect();
999
1000 for _ in 0..(num_entities * 2) {
1002 let subject_idx = random.random_range(0..entities.len());
1003 let relation_idx = random.random_range(0..relations.len());
1004 let object_idx = random.random_range(0..entities.len());
1005
1006 let subject = entities[subject_idx].clone();
1007 let relation = relations[relation_idx].clone();
1008 let object = entities[object_idx].clone();
1009
1010 if subject != object {
1011 triples.push((subject, relation, object));
1012 }
1013 }
1014
1015 triples
1016 }
1017
1018 pub fn quick_performance_test<F>(
1020 name: &str,
1021 iterations: usize,
1022 operation: F,
1023 ) -> std::time::Duration
1024 where
1025 F: Fn(),
1026 {
1027 let start = std::time::Instant::now();
1028 for _ in 0..iterations {
1029 operation();
1030 }
1031 let duration = start.elapsed();
1032
1033 println!(
1034 "Performance test '{name}': {iterations} iterations in {duration:?} ({:.2} ops/sec)",
1035 iterations as f64 / duration.as_secs_f64()
1036 );
1037
1038 duration
1039 }
1040
1041 pub async fn quick_revolutionary_performance_test<F, Fut>(
1074 name: &str,
1075 iterations: usize,
1076 async_operation: F,
1077 ) -> std::time::Duration
1078 where
1079 F: Fn() -> Fut,
1080 Fut: std::future::Future<Output = ()>,
1081 {
1082 let start = std::time::Instant::now();
1083 for _ in 0..iterations {
1084 async_operation().await;
1085 }
1086 let duration = start.elapsed();
1087
1088 println!(
1089 "Revolutionary performance test '{name}': {iterations} iterations in {duration:?} ({:.2} ops/sec)",
1090 iterations as f64 / duration.as_secs_f64()
1091 );
1092
1093 duration
1094 }
1095}
1096
1097#[cfg(test)]
1098mod quick_start_tests {
1099 use super::*;
1100 use crate::quick_start::*;
1101
1102 #[test]
1103 fn test_create_simple_transe_model() {
1104 let model = create_simple_transe_model();
1105 let config = model.config();
1106 assert_eq!(config.dimensions, 128);
1107 assert_eq!(config.learning_rate, 0.01);
1108 assert_eq!(config.max_epochs, 100);
1109 }
1110
1111 #[test]
1112 fn test_parse_triple_from_string() {
1113 let triple_str = "http://example.org/alice http://example.org/knows http://example.org/bob";
1114 let triple = parse_triple_from_string(triple_str).expect("should succeed");
1115 assert_eq!(triple.subject.iri, "http://example.org/alice");
1116 assert_eq!(triple.predicate.iri, "http://example.org/knows");
1117 assert_eq!(triple.object.iri, "http://example.org/bob");
1118 }
1119
1120 #[test]
1121 fn test_parse_triple_from_string_invalid() {
1122 let triple_str = "http://example.org/alice http://example.org/knows";
1123 let result = parse_triple_from_string(triple_str);
1124 assert!(result.is_err());
1125 }
1126
1127 #[test]
1128 fn test_add_triples_from_strings() {
1129 let mut model = create_simple_transe_model();
1130 let triple_strings = [
1131 "http://example.org/alice http://example.org/knows http://example.org/bob",
1132 "http://example.org/bob http://example.org/likes http://example.org/music",
1133 ];
1134
1135 let count = add_triples_from_strings(&mut model, &triple_strings).expect("should succeed");
1136 assert_eq!(count, 2);
1137 }
1138
1139 #[test]
1140 fn test_cosine_similarity() {
1141 let a = vec![1.0, 0.0, 0.0];
1142 let b = vec![1.0, 0.0, 0.0];
1143 let similarity = cosine_similarity(&a, &b).expect("should succeed");
1144 assert!((similarity - 1.0).abs() < 1e-10);
1145
1146 let c = vec![0.0, 1.0, 0.0];
1147 let similarity2 = cosine_similarity(&a, &c).expect("should succeed");
1148 assert!((similarity2 - 0.0).abs() < 1e-10);
1149
1150 let d = vec![1.0, 0.0];
1152 assert!(cosine_similarity(&a, &d).is_err());
1153 }
1154
1155 #[test]
1156 fn test_generate_sample_kg_data() {
1157 let triples = generate_sample_kg_data(5, 3);
1158 assert!(!triples.is_empty());
1159
1160 for (subject, relation, object) in &triples {
1162 assert!(subject.starts_with("http://example.org/entity_"));
1163 assert!(relation.starts_with("http://example.org/relation_"));
1164 assert!(object.starts_with("http://example.org/entity_"));
1165 assert_ne!(subject, object); }
1167 }
1168
1169 #[test]
1170 fn test_quick_performance_test() {
1171 let duration = quick_performance_test("test_operation", 100, || {
1172 let _sum: i32 = (1..10).sum();
1174 });
1175
1176 let _nanos = duration.as_nanos();
1179 }
1180}