pub struct TFQModel { /* private fields */ }
Expand description
TensorFlow Quantum-style model builder
Implementations§
Source§impl TFQModel
impl TFQModel
Sourcepub fn new(input_shape: Vec<usize>) -> Self
pub fn new(input_shape: Vec<usize>) -> Self
Create new TFQ model
Examples found in repository?
examples/tensorflow_quantum_demo.rs (line 30)
14fn main() -> Result<()> {
15 println!("=== TensorFlow Quantum Compatibility Demo ===\n");
16
17 // Step 1: Create TFQ-style quantum circuits
18 println!("1. Creating TensorFlow Quantum style circuits...");
19
20 let (circuits, circuit_symbols) = create_tfq_circuits()?;
21 println!(
22 " - Created {} parameterized quantum circuits",
23 circuits.len()
24 );
25 println!(" - Circuit symbols: {:?}", circuit_symbols);
26
27 // Step 2: Build TFQ-style model with PQC layers
28 println!("\n2. Building TFQ-compatible model...");
29
30 let mut model = TFQModel::new(vec![4, 1]); // input_shape: [batch_size, features]
31
32 // Add quantum circuit layer (equivalent to tfq.layers.PQC)
33 // Note: QuantumCircuitLayer does not implement TFQLayer in current API
34 // model.add_layer(Box::new(QuantumCircuitLayer::new(
35 // circuits[0].clone(),
36 // circuit_symbols.clone(),
37 // Observable::PauliZ(vec![0]),
38 // Arc::new(StatevectorBackend::new(8))
39 // )));
40 println!(" - Quantum circuit layer placeholder added");
41
42 // Add classical preprocessing layer
43 // Note: TFQDenseLayer not implemented in current API
44 // model.add_layer(Box::new(TFQDenseLayer::new(
45 // 4, 8,
46 // ActivationFunction::ReLU,
47 // ParameterInitStrategy::XavierUniform
48 // )?));
49
50 // Add PQC layer with different observable
51 // Note: PQCLayer not implemented in current API
52 // model.add_layer(Box::new(PQCLayer::new(
53 // circuits[1].clone(),
54 // Observable::PauliZ(vec![1]),
55 // RegularizationType::L2(0.01)
56 // )?));
57
58 // Add quantum convolutional layer
59 // Note: QuantumConvolutionalLayer not implemented in current API
60 // model.add_layer(Box::new(QuantumConvolutionalLayer::new(
61 // circuits[2].clone(),
62 // (2, 2), // kernel_size
63 // PaddingType::Valid,
64 // 2 // stride
65 // )?));
66
67 // Final output layer
68 // Note: TFQDenseLayer not implemented in current API
69 // model.add_layer(Box::new(TFQDenseLayer::new(
70 // 8, 2,
71 // ActivationFunction::Softmax,
72 // ParameterInitStrategy::HeNormal
73 // )?));
74
75 println!(" Model architecture:");
76 // model.summary(); // Not implemented in current API
77
78 // Step 3: Create TFQ-style quantum dataset
79 println!("\n3. Creating TensorFlow Quantum dataset...");
80
81 let quantum_dataset = create_tfq_quantum_dataset()?;
82 // println!(" - Dataset size: {}", quantum_dataset.size());
83 // println!(" - Data encoding: {:?}", quantum_dataset.encoding_type());
84 // println!(" - Batch size: {}", quantum_dataset.batch_size());
85 println!(" - Quantum dataset created successfully");
86
87 // Step 4: Configure TFQ-style training
88 println!("\n4. Configuring TFQ training setup...");
89
90 let optimizer = TFQOptimizer::Adam {
91 learning_rate: 0.001,
92 beta1: 0.9,
93 beta2: 0.999,
94 epsilon: 1e-7,
95 };
96
97 let loss_function = TFQLossFunction::CategoricalCrossentropy;
98
99 model.compile()?;
100
101 println!(" - Optimizer: Adam");
102 println!(" - Loss: Sparse Categorical Crossentropy");
103 println!(" - Metrics: Accuracy, Precision, Recall");
104
105 // Step 5: Train with TFQ-style fit method
106 println!("\n5. Training with TensorFlow Quantum style...");
107
108 // Note: fit method not fully implemented in current API
109 // let history = model.fit(
110 // &quantum_dataset,
111 // 15, // epochs
112 // 0.2, // validation_split
113 // 1, // verbose
114 // vec![
115 // Box::new(EarlyStoppingCallback::new(3, "val_loss")), // patience, monitor
116 // Box::new(ReduceLROnPlateauCallback::new(0.5, 2)), // factor, patience
117 // ]
118 // )?;
119 println!(" Training setup configured (fit method placeholder)");
120
121 // println!(" Training completed!");
122 // println!(" - Final training accuracy: {:.3}", history.final_metric("accuracy"));
123 // println!(" - Final validation accuracy: {:.3}", history.final_metric("val_accuracy"));
124 // println!(" - Best epoch: {}", history.best_epoch());
125 println!(" Training placeholder completed");
126
127 // Step 6: Evaluate model performance
128 println!("\n6. Model evaluation...");
129
130 let test_dataset = create_tfq_test_dataset()?;
131 // let evaluation_results = model.evaluate(&test_dataset, 1)?; // verbose
132 //
133 // println!(" Test Results:");
134 // for (metric, value) in evaluation_results.iter() {
135 // println!(" - {}: {:.4}", metric, value);
136 // }
137 println!(" Test dataset created successfully");
138
139 // Step 7: Quantum circuit analysis
140 println!("\n7. Quantum circuit analysis...");
141
142 // let circuit_analysis = model.analyze_quantum_circuits()?;
143 // println!(" Circuit Properties:");
144 // println!(" - Total quantum parameters: {}", circuit_analysis.total_quantum_params);
145 // println!(" - Circuit depth: {}", circuit_analysis.max_circuit_depth);
146 // println!(" - Gate types used: {:?}", circuit_analysis.gate_types);
147 // println!(" - Entangling gates: {}", circuit_analysis.entangling_gate_count);
148 println!(" Circuit analysis placeholder completed");
149
150 // Step 8: Parameter shift gradients (TFQ-style)
151 println!("\n8. Computing parameter shift gradients...");
152
153 // let sample_input = quantum_dataset.get_batch(0)?;
154 // let gradients = model.compute_parameter_shift_gradients(&sample_input)?;
155 println!(" Parameter shift gradients placeholder");
156
157 // println!(" Gradient Analysis:");
158 // println!(" - Quantum gradients computed: {}", gradients.quantum_gradients.len());
159 // println!(" - Classical gradients computed: {}", gradients.classical_gradients.len());
160 // println!(" - Max quantum gradient: {:.6}",
161 // gradients.quantum_gradients.iter().fold(0.0f64, |a, &b| a.max(b.abs())));
162 // println!(" - Gradient variance: {:.6}",
163 // compute_gradient_variance(&gradients.quantum_gradients));
164 println!(" Gradient analysis placeholder completed");
165
166 // Step 9: Quantum expectation values
167 println!("\n9. Computing quantum expectation values...");
168
169 let observables = vec![Observable::PauliZ(vec![0]), Observable::PauliZ(vec![1])];
170
171 // let expectation_values = model.compute_expectation_values(&sample_input, &observables)?;
172 // println!(" Expectation Values:");
173 // for (i, (obs, val)) in observables.iter().zip(expectation_values.iter()).enumerate() {
174 // println!(" - Observable {}: {:.4}", i, val);
175 // }
176 println!(" Expectation values placeholder completed");
177
178 // Step 10: TFQ utils demonstrations
179 println!("\n10. TensorFlow Quantum utilities...");
180
181 // Circuit conversion
182 let dynamic_circuit = DynamicCircuit::from_circuit(circuits[0].clone())?;
183 let tfq_format_circuit = tfq_utils::circuit_to_tfq_format(&dynamic_circuit)?;
184 println!(" - Converted circuit to TFQ format (placeholder)");
185
186 // Batch circuit execution
187 // let batch_circuits = vec![circuits[0].clone(), circuits[1].clone()];
188 // let batch_params = Array2::from_shape_fn((2, 4), |(i, j)| (i + j) as f64 * 0.1);
189 // let batch_results = tfq_utils::batch_execute_circuits(&batch_circuits, &batch_params, &observables, &backend)?;
190 // println!(" - Batch execution results shape: {:?}", batch_results.dim());
191 println!(" - Batch execution placeholder completed");
192
193 // Data encoding utilities
194 let classical_data = Array2::from_shape_fn((10, 4), |(i, j)| (i + j) as f64 * 0.2);
195 // let encoded_circuits = tfq_utils::encode_data_to_circuits(
196 // &classical_data,
197 // DataEncodingType::Angle
198 // )?;
199 let encoded_circuits = vec![tfq_utils::create_data_encoding_circuit(
200 4,
201 DataEncodingType::Angle,
202 )?];
203 println!(
204 " - Encoded {} data points to quantum circuits",
205 encoded_circuits.len()
206 );
207
208 // Step 11: Compare with TensorFlow classical model
209 println!("\n11. Comparing with TensorFlow classical equivalent...");
210
211 let classical_model = create_tensorflow_classical_model()?;
212 // let classical_accuracy = train_classical_tensorflow_model(classical_model, &quantum_dataset)?;
213 //
214 // let quantum_accuracy = evaluation_results.get("accuracy").unwrap_or(&0.0);
215 // println!(" - Quantum TFQ model accuracy: {:.3}", quantum_accuracy);
216 // println!(" - Classical TF model accuracy: {:.3}", classical_accuracy);
217 // println!(" - Quantum advantage: {:.3}", quantum_accuracy - classical_accuracy);
218 println!(" - Classical comparison placeholder completed");
219
220 // Step 12: Model export (TFQ format)
221 println!("\n12. Exporting model in TFQ format...");
222
223 // model.save_tfq_format("quantum_model_tfq.pb")?;
224 // println!(" - Model exported to: quantum_model_tfq.pb");
225 //
226 // // Export to TensorFlow SavedModel format
227 // model.export_savedmodel("quantum_model_savedmodel/")?;
228 // println!(" - SavedModel exported to: quantum_model_savedmodel/");
229 println!(" - Model export placeholder completed");
230
231 // Step 13: Advanced TFQ features
232 println!("\n13. Advanced TensorFlow Quantum features...");
233
234 // Quantum data augmentation
235 // let augmented_dataset = quantum_dataset.augment_with_noise(0.05)?;
236 // println!(" - Created augmented dataset with noise level 0.05");
237 //
238 // // Circuit optimization for hardware
239 // let optimized_circuits = tfq_utils::optimize_circuits_for_hardware(
240 // &circuits,
241 // HardwareType::IonQ
242 // )?;
243 // println!(" - Optimized {} circuits for IonQ hardware", optimized_circuits.len());
244 //
245 // // Barren plateau analysis
246 // let plateau_analysis = analyze_barren_plateaus(&model, &quantum_dataset)?;
247 // println!(" - Barren plateau risk: {:.3}", plateau_analysis.risk_score);
248 // println!(" - Recommended mitigation: {}", plateau_analysis.mitigation_strategy);
249 println!(" - Advanced features placeholder completed");
250
251 println!("\n=== TensorFlow Quantum Demo Complete ===");
252
253 Ok(())
254}
Sourcepub fn set_loss(self, loss: TFQLossFunction) -> Self
pub fn set_loss(self, loss: TFQLossFunction) -> Self
Set loss function
Sourcepub fn set_optimizer(self, optimizer: TFQOptimizer) -> Self
pub fn set_optimizer(self, optimizer: TFQOptimizer) -> Self
Set optimizer
Sourcepub fn compile(&mut self) -> Result<()>
pub fn compile(&mut self) -> Result<()>
Compile model
Examples found in repository?
examples/tensorflow_quantum_demo.rs (line 99)
14fn main() -> Result<()> {
15 println!("=== TensorFlow Quantum Compatibility Demo ===\n");
16
17 // Step 1: Create TFQ-style quantum circuits
18 println!("1. Creating TensorFlow Quantum style circuits...");
19
20 let (circuits, circuit_symbols) = create_tfq_circuits()?;
21 println!(
22 " - Created {} parameterized quantum circuits",
23 circuits.len()
24 );
25 println!(" - Circuit symbols: {:?}", circuit_symbols);
26
27 // Step 2: Build TFQ-style model with PQC layers
28 println!("\n2. Building TFQ-compatible model...");
29
30 let mut model = TFQModel::new(vec![4, 1]); // input_shape: [batch_size, features]
31
32 // Add quantum circuit layer (equivalent to tfq.layers.PQC)
33 // Note: QuantumCircuitLayer does not implement TFQLayer in current API
34 // model.add_layer(Box::new(QuantumCircuitLayer::new(
35 // circuits[0].clone(),
36 // circuit_symbols.clone(),
37 // Observable::PauliZ(vec![0]),
38 // Arc::new(StatevectorBackend::new(8))
39 // )));
40 println!(" - Quantum circuit layer placeholder added");
41
42 // Add classical preprocessing layer
43 // Note: TFQDenseLayer not implemented in current API
44 // model.add_layer(Box::new(TFQDenseLayer::new(
45 // 4, 8,
46 // ActivationFunction::ReLU,
47 // ParameterInitStrategy::XavierUniform
48 // )?));
49
50 // Add PQC layer with different observable
51 // Note: PQCLayer not implemented in current API
52 // model.add_layer(Box::new(PQCLayer::new(
53 // circuits[1].clone(),
54 // Observable::PauliZ(vec![1]),
55 // RegularizationType::L2(0.01)
56 // )?));
57
58 // Add quantum convolutional layer
59 // Note: QuantumConvolutionalLayer not implemented in current API
60 // model.add_layer(Box::new(QuantumConvolutionalLayer::new(
61 // circuits[2].clone(),
62 // (2, 2), // kernel_size
63 // PaddingType::Valid,
64 // 2 // stride
65 // )?));
66
67 // Final output layer
68 // Note: TFQDenseLayer not implemented in current API
69 // model.add_layer(Box::new(TFQDenseLayer::new(
70 // 8, 2,
71 // ActivationFunction::Softmax,
72 // ParameterInitStrategy::HeNormal
73 // )?));
74
75 println!(" Model architecture:");
76 // model.summary(); // Not implemented in current API
77
78 // Step 3: Create TFQ-style quantum dataset
79 println!("\n3. Creating TensorFlow Quantum dataset...");
80
81 let quantum_dataset = create_tfq_quantum_dataset()?;
82 // println!(" - Dataset size: {}", quantum_dataset.size());
83 // println!(" - Data encoding: {:?}", quantum_dataset.encoding_type());
84 // println!(" - Batch size: {}", quantum_dataset.batch_size());
85 println!(" - Quantum dataset created successfully");
86
87 // Step 4: Configure TFQ-style training
88 println!("\n4. Configuring TFQ training setup...");
89
90 let optimizer = TFQOptimizer::Adam {
91 learning_rate: 0.001,
92 beta1: 0.9,
93 beta2: 0.999,
94 epsilon: 1e-7,
95 };
96
97 let loss_function = TFQLossFunction::CategoricalCrossentropy;
98
99 model.compile()?;
100
101 println!(" - Optimizer: Adam");
102 println!(" - Loss: Sparse Categorical Crossentropy");
103 println!(" - Metrics: Accuracy, Precision, Recall");
104
105 // Step 5: Train with TFQ-style fit method
106 println!("\n5. Training with TensorFlow Quantum style...");
107
108 // Note: fit method not fully implemented in current API
109 // let history = model.fit(
110 // &quantum_dataset,
111 // 15, // epochs
112 // 0.2, // validation_split
113 // 1, // verbose
114 // vec![
115 // Box::new(EarlyStoppingCallback::new(3, "val_loss")), // patience, monitor
116 // Box::new(ReduceLROnPlateauCallback::new(0.5, 2)), // factor, patience
117 // ]
118 // )?;
119 println!(" Training setup configured (fit method placeholder)");
120
121 // println!(" Training completed!");
122 // println!(" - Final training accuracy: {:.3}", history.final_metric("accuracy"));
123 // println!(" - Final validation accuracy: {:.3}", history.final_metric("val_accuracy"));
124 // println!(" - Best epoch: {}", history.best_epoch());
125 println!(" Training placeholder completed");
126
127 // Step 6: Evaluate model performance
128 println!("\n6. Model evaluation...");
129
130 let test_dataset = create_tfq_test_dataset()?;
131 // let evaluation_results = model.evaluate(&test_dataset, 1)?; // verbose
132 //
133 // println!(" Test Results:");
134 // for (metric, value) in evaluation_results.iter() {
135 // println!(" - {}: {:.4}", metric, value);
136 // }
137 println!(" Test dataset created successfully");
138
139 // Step 7: Quantum circuit analysis
140 println!("\n7. Quantum circuit analysis...");
141
142 // let circuit_analysis = model.analyze_quantum_circuits()?;
143 // println!(" Circuit Properties:");
144 // println!(" - Total quantum parameters: {}", circuit_analysis.total_quantum_params);
145 // println!(" - Circuit depth: {}", circuit_analysis.max_circuit_depth);
146 // println!(" - Gate types used: {:?}", circuit_analysis.gate_types);
147 // println!(" - Entangling gates: {}", circuit_analysis.entangling_gate_count);
148 println!(" Circuit analysis placeholder completed");
149
150 // Step 8: Parameter shift gradients (TFQ-style)
151 println!("\n8. Computing parameter shift gradients...");
152
153 // let sample_input = quantum_dataset.get_batch(0)?;
154 // let gradients = model.compute_parameter_shift_gradients(&sample_input)?;
155 println!(" Parameter shift gradients placeholder");
156
157 // println!(" Gradient Analysis:");
158 // println!(" - Quantum gradients computed: {}", gradients.quantum_gradients.len());
159 // println!(" - Classical gradients computed: {}", gradients.classical_gradients.len());
160 // println!(" - Max quantum gradient: {:.6}",
161 // gradients.quantum_gradients.iter().fold(0.0f64, |a, &b| a.max(b.abs())));
162 // println!(" - Gradient variance: {:.6}",
163 // compute_gradient_variance(&gradients.quantum_gradients));
164 println!(" Gradient analysis placeholder completed");
165
166 // Step 9: Quantum expectation values
167 println!("\n9. Computing quantum expectation values...");
168
169 let observables = vec![Observable::PauliZ(vec![0]), Observable::PauliZ(vec![1])];
170
171 // let expectation_values = model.compute_expectation_values(&sample_input, &observables)?;
172 // println!(" Expectation Values:");
173 // for (i, (obs, val)) in observables.iter().zip(expectation_values.iter()).enumerate() {
174 // println!(" - Observable {}: {:.4}", i, val);
175 // }
176 println!(" Expectation values placeholder completed");
177
178 // Step 10: TFQ utils demonstrations
179 println!("\n10. TensorFlow Quantum utilities...");
180
181 // Circuit conversion
182 let dynamic_circuit = DynamicCircuit::from_circuit(circuits[0].clone())?;
183 let tfq_format_circuit = tfq_utils::circuit_to_tfq_format(&dynamic_circuit)?;
184 println!(" - Converted circuit to TFQ format (placeholder)");
185
186 // Batch circuit execution
187 // let batch_circuits = vec![circuits[0].clone(), circuits[1].clone()];
188 // let batch_params = Array2::from_shape_fn((2, 4), |(i, j)| (i + j) as f64 * 0.1);
189 // let batch_results = tfq_utils::batch_execute_circuits(&batch_circuits, &batch_params, &observables, &backend)?;
190 // println!(" - Batch execution results shape: {:?}", batch_results.dim());
191 println!(" - Batch execution placeholder completed");
192
193 // Data encoding utilities
194 let classical_data = Array2::from_shape_fn((10, 4), |(i, j)| (i + j) as f64 * 0.2);
195 // let encoded_circuits = tfq_utils::encode_data_to_circuits(
196 // &classical_data,
197 // DataEncodingType::Angle
198 // )?;
199 let encoded_circuits = vec![tfq_utils::create_data_encoding_circuit(
200 4,
201 DataEncodingType::Angle,
202 )?];
203 println!(
204 " - Encoded {} data points to quantum circuits",
205 encoded_circuits.len()
206 );
207
208 // Step 11: Compare with TensorFlow classical model
209 println!("\n11. Comparing with TensorFlow classical equivalent...");
210
211 let classical_model = create_tensorflow_classical_model()?;
212 // let classical_accuracy = train_classical_tensorflow_model(classical_model, &quantum_dataset)?;
213 //
214 // let quantum_accuracy = evaluation_results.get("accuracy").unwrap_or(&0.0);
215 // println!(" - Quantum TFQ model accuracy: {:.3}", quantum_accuracy);
216 // println!(" - Classical TF model accuracy: {:.3}", classical_accuracy);
217 // println!(" - Quantum advantage: {:.3}", quantum_accuracy - classical_accuracy);
218 println!(" - Classical comparison placeholder completed");
219
220 // Step 12: Model export (TFQ format)
221 println!("\n12. Exporting model in TFQ format...");
222
223 // model.save_tfq_format("quantum_model_tfq.pb")?;
224 // println!(" - Model exported to: quantum_model_tfq.pb");
225 //
226 // // Export to TensorFlow SavedModel format
227 // model.export_savedmodel("quantum_model_savedmodel/")?;
228 // println!(" - SavedModel exported to: quantum_model_savedmodel/");
229 println!(" - Model export placeholder completed");
230
231 // Step 13: Advanced TFQ features
232 println!("\n13. Advanced TensorFlow Quantum features...");
233
234 // Quantum data augmentation
235 // let augmented_dataset = quantum_dataset.augment_with_noise(0.05)?;
236 // println!(" - Created augmented dataset with noise level 0.05");
237 //
238 // // Circuit optimization for hardware
239 // let optimized_circuits = tfq_utils::optimize_circuits_for_hardware(
240 // &circuits,
241 // HardwareType::IonQ
242 // )?;
243 // println!(" - Optimized {} circuits for IonQ hardware", optimized_circuits.len());
244 //
245 // // Barren plateau analysis
246 // let plateau_analysis = analyze_barren_plateaus(&model, &quantum_dataset)?;
247 // println!(" - Barren plateau risk: {:.3}", plateau_analysis.risk_score);
248 // println!(" - Recommended mitigation: {}", plateau_analysis.mitigation_strategy);
249 println!(" - Advanced features placeholder completed");
250
251 println!("\n=== TensorFlow Quantum Demo Complete ===");
252
253 Ok(())
254}
Auto Trait Implementations§
impl Freeze for TFQModel
impl !RefUnwindSafe for TFQModel
impl Send for TFQModel
impl Sync for TFQModel
impl Unpin for TFQModel
impl !UnwindSafe for TFQModel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.