## Quick Start First define your computation as a `nn.Module` and wrap it using `auto_LiRPA.BoundedModule()`. Then, you can call the `compute_bounds` function to obtain certified lower and upper bounds under input perturbations: ```python from auto_LiRPA import BoundedModule, BoundedTensor, PerturbationLpNorm # Define computation as a nn.Module. class MyModel(nn.Module): def forward(self, x): # Define your computation here. model = MyModel() my_input = load_a_batch_of_data() # Wrap the model with auto_LiRPA. model = BoundedModule(model, my_input) # Define perturbation. Here we add Linf perturbation to input data. ptb = PerturbationLpNorm(norm=np.inf, eps=0.1) # Make the input a BoundedTensor with the pre-defined perturbation. my_input = BoundedTensor(my_input, ptb) # Regular forward propagation using BoundedTensor works as usual. prediction = model(my_input) # Compute LiRPA bounds using the backward mode bound propagation (CROWN). lb, ub = model.compute_bounds(x=(my_input,), method="backward") ``` Checkout [examples/vision/simple_verification.py](examples/vision/simple_verification.py) for a complete but very basic example. We also provide a [Google Colab Demo](http://PaperCode.cc/AutoLiRPA-Demo) including an example of computing verification bounds for a 18-layer ResNet model on CIFAR-10 dataset. Once the ResNet model is defined as usual in Pytorch, obtaining provable output bounds is as easy as obtaining gradients through autodiff. Bounds are efficiently computed on GPUs.