pub fn prove(
        &self,
        witness_vector: WitnessVec<GoldilocksField>,
        setup_data: Arc<GoldilocksGpuProverSetupData>,
    ) -> anyhow::Result<FriProofWrapper> {
        let worker = Worker::new();

        match self {
            CircuitWrapper::Base(circuit) => {
                let proof = Self::prove_base(circuit, witness_vector, setup_data, worker)?;
                let circuit_id = circuit.numeric_circuit_type();
                Ok(FriProofWrapper::Base(ZkSyncBaseLayerProof::from_inner(
                    circuit_id, proof,
                )))
            }
            CircuitWrapper::Recursive(circuit) => {
                let proof = Self::prove_recursive(circuit, witness_vector, setup_data, worker)?;
                let circuit_id = circuit.numeric_circuit_type();
                Ok(FriProofWrapper::Recursive(
                    ZkSyncRecursionLayerProof::from_inner(circuit_id, proof),
                ))
            }
        }
    }
Generates proof for given witness vector.
Expects setup_data to match witness vector.
prover/crates/lib/circuit_prover_service/src/types/circuit_wrapper.rs