quantrs2_tytan/
lib.rs

1// Architectural decisions - these are intentional design patterns
2#![allow(clippy::unnecessary_wraps)] // Result return types for API consistency
3#![allow(clippy::unused_self)] // Trait implementations require &self
4#![allow(clippy::unused_async)]
5// Async placeholders for future implementation
6// Performance-related (not safety issues, can be optimized later)
7#![allow(clippy::significant_drop_tightening)] // Lock scope optimization TODO
8// Style-related (low priority)
9#![allow(clippy::match_same_arms)] // Sometimes intentional for clarity
10#![allow(clippy::option_if_let_else)] // Style preference
11#![allow(clippy::return_self_not_must_use)] // Builder pattern
12#![allow(clippy::needless_range_loop)] // Sometimes clearer with index
13// Additional suppressions for remaining warnings
14#![allow(clippy::branches_sharing_code)] // Sometimes intentional
15#![allow(clippy::type_complexity)] // Quantum types are complex
16#![allow(clippy::missing_const_for_fn)] // Not always beneficial
17#![allow(clippy::format_push_string)] // Performance optimization TODO
18#![allow(clippy::cast_possible_truncation)] // Platform-specific, validated
19#![allow(clippy::future_not_send)] // Async architecture decision
20#![allow(clippy::needless_pass_by_ref_mut)] // API consistency
21#![allow(clippy::cast_precision_loss)] // Acceptable for quantum simulation
22#![allow(clippy::uninlined_format_args)] // Style preference
23#![allow(clippy::assigning_clones)] // Sometimes clearer
24#![allow(clippy::zero_sized_map_values)] // Intentional for set-like maps
25#![allow(clippy::used_underscore_binding)] // Sometimes needed for unused captures
26#![allow(clippy::collection_is_never_read)] // Builder pattern / lazy evaluation
27#![allow(clippy::wildcard_in_or_patterns)] // Sometimes intentional
28#![allow(clippy::ptr_arg)] // API consistency with slices
29#![allow(clippy::implicit_hasher)] // Generic hasher not always needed
30#![allow(clippy::ref_option)] // Sometimes needed for lifetime reasons
31#![allow(clippy::expect_fun_call)] // Clearer error messages
32#![allow(clippy::if_not_else)] // Sometimes clearer
33#![allow(clippy::iter_on_single_items)] // Sometimes intentional
34#![allow(clippy::trivially_copy_pass_by_ref)] // API consistency
35#![allow(clippy::empty_line_after_doc_comments)] // Formatting preference
36#![allow(clippy::manual_let_else)] // Style preference
37#![allow(clippy::await_holding_lock)] // Async architecture
38// Full clippy category suppressions
39#![allow(clippy::pedantic)]
40#![allow(clippy::nursery)]
41#![allow(clippy::cargo)]
42// Additional specific suppressions
43#![allow(clippy::large_enum_variant)]
44#![allow(clippy::borrowed_box)]
45#![allow(clippy::manual_map)]
46#![allow(clippy::non_send_fields_in_send_ty)]
47#![allow(clippy::if_same_then_else)]
48#![allow(clippy::manual_clamp)]
49#![allow(clippy::double_must_use)]
50#![allow(clippy::only_used_in_recursion)]
51#![allow(clippy::same_item_push)]
52#![allow(clippy::format_in_format_args)]
53#![allow(clippy::implied_bounds_in_impls)]
54#![allow(clippy::explicit_counter_loop)]
55#![allow(clippy::duplicated_attributes)]
56#![allow(clippy::new_ret_no_self)]
57#![allow(clippy::must_use_unit)]
58#![allow(clippy::redundant_pattern_matching)]
59#![allow(clippy::redundant_guards)]
60#![allow(clippy::wrong_self_convention)]
61#![allow(clippy::iter_next_slice)]
62#![allow(clippy::create_dir)]
63#![allow(clippy::enum_variant_names)]
64// Additional specific suppressions (correct lint names)
65#![allow(clippy::should_implement_trait)] // Methods like default(), from_str(), next()
66#![allow(clippy::upper_case_acronyms)] // VQE, QAOA, QFT, CNOT, SGD
67#![allow(clippy::unnecessary_map_or)] // map_or simplification suggestions
68#![allow(clippy::derivable_impls)] // Impl can be derived
69#![allow(clippy::or_fun_call)] // unwrap_or_else with default value
70#![allow(clippy::cloned_ref_to_slice_refs)] // clone can be replaced with from_ref
71#![allow(clippy::collapsible_match)]
72#![allow(clippy::len_without_is_empty)]
73#![allow(clippy::arc_with_non_send_sync)]
74#![allow(clippy::std_instead_of_core)] // Allow std usage
75#![allow(clippy::match_like_matches_macro)] // Sometimes match is clearer
76#![allow(clippy::suspicious_open_options)] // File open options
77#![allow(clippy::new_without_default)] // new() without Default impl
78
79//! High-level quantum annealing interface inspired by Tytan for the QuantRS2 framework.
80//!
81//! This crate provides a high-level interface for formulating and solving
82//! quantum annealing problems, with support for multiple backend solvers.
83//! It is inspired by the Python [Tytan](https://github.com/tytansdk/tytan) library.
84//!
85//! # Features
86//!
87//! - **Symbolic Problem Construction**: Define QUBO problems using symbolic expressions
88//! - **Higher-Order Binary Optimization (HOBO)**: Support for terms beyond quadratic
89//! - **Multiple Samplers**: Choose from various solvers
90//! - **Auto Result Processing**: Automatically convert solutions to multi-dimensional arrays
91//!
92//! ## Recent Updates (v0.1.0-rc.1)
93//!
94//! - Refined SciRS2 v0.1.0-rc.1 integration for enhanced performance
95//! - High-performance sparse matrix operations via SciRS2
96//! - Parallel optimization using `scirs2_core::parallel_ops`
97//! - SIMD-accelerated energy calculations
98//!
99//! # Example
100//!
101//! Example with the `dwave` feature enabled:
102//!
103//! ```rust,no_run
104//! # #[cfg(feature = "dwave")]
105//! # fn dwave_example() {
106//! use quantrs2_tytan::sampler::{SASampler, Sampler};
107//! use quantrs2_tytan::symbol::symbols;
108//! use quantrs2_tytan::compile::Compile;
109//! use quantrs2_tytan::auto_array::AutoArray;
110//!
111//! // Define variables
112//! let mut x = symbols("x");
113//! let mut y = symbols("y");
114//! let z = symbols("z");
115//!
116//! // Define expression (3 variables, want exactly 2 to be 1)
117//! let two = 2.into();
118//! let h = (x + y + z - 2).pow(&two);
119//!
120//! // Compile to QUBO
121//! let (qubo, offset) = Compile::new(h).get_qubo().expect("Failed to compile QUBO");
122//!
123//! // Choose a sampler
124//! let solver = SASampler::new(None);
125//!
126//! // Sample
127//! let mut result = solver.run_qubo(&qubo, 100).expect("Failed to run QUBO sampler");
128//!
129//! // Display results
130//! for r in &result {
131//!     println!("{:?}", r);
132//! }
133//! # }
134//! ```
135//!
136//! Basic example without the `dwave` feature (no symbolic math):
137//!
138//! ```rust,no_run
139//! use quantrs2_tytan::sampler::{SASampler, Sampler};
140//! use std::collections::HashMap;
141//! use scirs2_core::ndarray::Array;
142//!
143//! // Create a simple QUBO matrix manually
144//! let mut matrix = Array::<f64, _>::zeros((2, 2));
145//! matrix[[0, 0]] = -1.0;  // Linear term for x
146//! matrix[[1, 1]] = -1.0;  // Linear term for y
147//! matrix[[0, 1]] = 2.0;   // Quadratic term for x*y
148//! matrix[[1, 0]] = 2.0;   // Symmetric
149//!
150//! // Create variable map
151//! let mut var_map = HashMap::new();
152//! var_map.insert("x".to_string(), 0);
153//! var_map.insert("y".to_string(), 1);
154//!
155//! // Choose a sampler
156//! let solver = SASampler::new(None);
157//!
158//! // Sample by converting to the dynamic format for hobo
159//! let matrix_dyn = matrix.into_dyn();
160//! let mut result = solver.run_hobo(&(matrix_dyn, var_map), 100).expect("Failed to run HOBO sampler");
161//!
162//! // Display results
163//! for r in &result {
164//!     println!("{:?}", r);
165//! }
166//! ```
167
168// Export modules
169pub mod adaptive_noise_calibration;
170pub mod adaptive_optimization;
171pub mod advanced_error_mitigation;
172pub mod advanced_performance_analysis;
173pub mod advanced_problem_decomposition;
174pub mod advanced_visualization;
175pub mod ai_assisted_optimization;
176pub mod analysis;
177pub mod applications;
178pub mod auto_array;
179pub mod benchmark;
180pub mod coherent_ising_machine;
181pub mod compile;
182pub mod constraints;
183pub mod encoding;
184pub mod gpu;
185pub mod gpu_benchmark;
186pub mod gpu_kernels;
187pub mod gpu_memory_pool;
188pub mod gpu_performance;
189pub mod gpu_samplers;
190pub mod grover_amplitude_amplification;
191pub mod hybrid_algorithms;
192pub mod ml_guided_sampling;
193pub mod multi_objective_optimization;
194pub mod optimization;
195pub mod optimize;
196pub mod parallel_tempering;
197pub mod parallel_tempering_advanced;
198pub mod performance_optimization;
199pub mod performance_profiler;
200pub mod problem_decomposition;
201pub mod problem_dsl;
202pub mod quantum_adiabatic_path_optimization;
203pub mod quantum_advantage_analysis;
204pub mod quantum_advantage_prediction;
205pub mod quantum_annealing;
206pub mod quantum_circuit_annealing_compiler;
207pub mod quantum_classical_hybrid;
208pub mod quantum_error_correction;
209pub mod quantum_inspired_ml;
210pub mod quantum_ml_integration;
211pub mod quantum_neural_networks;
212pub mod quantum_optimization_extensions;
213pub mod quantum_state_tomography;
214pub mod realtime_performance_dashboard;
215pub mod realtime_quantum_integration;
216pub mod sampler;
217pub mod sampler_framework;
218pub mod scirs_stub;
219pub mod sensitivity_analysis;
220pub mod solution_clustering;
221pub mod solution_debugger;
222pub mod solution_statistics;
223pub mod symbol;
224pub mod tensor_network_sampler;
225pub mod testing_framework;
226pub mod topological_optimization;
227pub mod variable_correlation;
228pub mod variational_quantum_factoring;
229pub mod visual_problem_builder;
230pub mod visualization;
231
232// Re-export key types for convenience
233pub use advanced_error_mitigation::{
234    create_advanced_error_mitigation_manager, create_lightweight_error_mitigation_manager,
235    AdvancedErrorMitigationManager, ErrorMitigationConfig,
236};
237pub use advanced_performance_analysis::{
238    create_comprehensive_analyzer, create_lightweight_analyzer, AdvancedPerformanceAnalyzer,
239    AnalysisConfig,
240};
241pub use advanced_visualization::{
242    create_advanced_visualization_manager, create_lightweight_visualization_manager,
243    AdvancedVisualizationManager, VisualizationConfig,
244};
245pub use analysis::{calculate_diversity, cluster_solutions, visualize_energy_distribution};
246#[cfg(feature = "dwave")]
247pub use auto_array::AutoArray;
248#[cfg(feature = "dwave")]
249pub use compile::{Compile, PieckCompile};
250#[cfg(feature = "gpu")]
251pub use gpu::{gpu_solve_hobo, gpu_solve_qubo, is_available as is_gpu_available_internal};
252pub use grover_amplitude_amplification::{
253    GroverAmplificationConfig, GroverAmplifiedSampler, GroverAmplifiedSolver,
254};
255pub use optimize::{calculate_energy, optimize_hobo, optimize_qubo};
256pub use quantum_adiabatic_path_optimization::{
257    AdiabaticPathConfig, PathInterpolation, QuantumAdiabaticPathOptimizer, QuantumAdiabaticSampler,
258};
259pub use sampler::{ArminSampler, DWaveSampler, GASampler, MIKASAmpler, SASampler};
260pub use scirs_stub::SCIRS2_AVAILABLE;
261#[cfg(feature = "dwave")]
262pub use symbol::{symbols, symbols_define, symbols_list, symbols_nbit};
263pub use tensor_network_sampler::{
264    create_mera_sampler, create_mps_sampler, create_peps_sampler, TensorNetworkSampler,
265};
266pub use visual_problem_builder::{
267    BuilderConfig, ConstraintType, ExportFormat, ObjectiveExpression, VariableType, VisualProblem,
268    VisualProblemBuilder,
269};
270
271// Expose QuantRS2-anneal types as well for advanced usage
272pub use quantrs2_anneal::{IsingError, IsingModel, IsingResult, QuboModel};
273pub use quantrs2_anneal::{QuboBuilder, QuboError, QuboFormulation, QuboResult};
274
275/// Check if the module is available
276///
277/// This function always returns `true` since the module
278/// is available if you can import it.
279#[must_use]
280pub const fn is_available() -> bool {
281    true
282}
283
284/// Check if GPU acceleration is available
285///
286/// This function checks if GPU acceleration is available and enabled.
287#[cfg(feature = "gpu")]
288pub fn is_gpu_available() -> bool {
289    // When gpu feature is enabled, ocl dependency is available
290    // Try to get the first platform and device
291    match ocl::Platform::list().first() {
292        Some(platform) => !ocl::Device::list_all(platform)
293            .unwrap_or_default()
294            .is_empty(),
295        None => false,
296    }
297}
298
299#[cfg(not(feature = "gpu"))]
300#[must_use]
301pub const fn is_gpu_available() -> bool {
302    false
303}
304
305/// Print version information
306#[must_use]
307pub const fn version() -> &'static str {
308    env!("CARGO_PKG_VERSION")
309}