# Configure

This document provides instructions on how to customize the compilation pipeline using `Configuration`s in Python and describes various configuration options available.

You can customize **Concrete** using the `fhe.Configuration` :

```python
from concrete import fhe
import numpy as np

configuration = fhe.Configuration(p_error=0.01, dataflow_parallelize=True)

@fhe.compiler({"x": "encrypted"})
def f(x):
    return x + 42

inputset = range(10)
circuit = f.compile(inputset, configuration=configuration)
```

You can overwrite individual configuration options by specifying kwargs in the `compile` method:

```python
from concrete import fhe
import numpy as np

@fhe.compiler({"x": "encrypted"})
def f(x):
    return x + 42

inputset = range(10)
circuit = f.compile(inputset, p_error=0.01, dataflow_parallelize=True)
```

You can also combine both ways:

```python
from concrete import fhe
import numpy as np

configuration = fhe.Configuration(p_error=0.01)

@fhe.compiler({"x": "encrypted"})
def f(x):
    return x + 42

inputset = range(10)
circuit = f.compile(inputset, configuration=configuration, loop_parallelize=True)
```

{% hint style="info" %}

When options are specified both in the `configuration` and as kwargs in the `compile` method, the kwargs take precedence. 

{% endhint %}

## Options

#### approximate_rounding_config: ApproximateRoundingConfig = fhe.ApproximateRoundingConfig()
- Provide fine control for [approximate rounding](../core-features/rounding.md#approximate-rounding-features):
  - To enable exact clipping,
  - Or/and approximate clipping, which makes overflow protection faster.

#### auto_adjust_rounders: bool = False
- Adjust rounders automatically.

#### auto_parallelize: bool = False
- Enable auto parallelization in the compiler.

#### bitwise_strategy_preference: Optional[Union[BitwiseStrategy, str, List[Union[BitwiseStrategy, str]]]] = None
- Specify preference for bitwise strategies, can be a single strategy or an ordered list of strategies. See [Bitwise](../core-features/bitwise.md) to learn more.

#### compiler_debug_mode: bool = False
- Enable or disable the debug mode of the compiler. This can show a lot of information, including passes and pattern rewrites.

#### compiler_verbose_mode: bool = False
- Enable or disable verbose mode of the compiler. This mainly shows logs from the compiler and is less verbose than the debug mode.

#### comparison_strategy_preference: Optional[Union[ComparisonStrategy, str, List[Union[ComparisonStrategy, str]]]] = None
- Specify preference for comparison strategies. Can be a single strategy or an ordered list of strategies. See [Comparisons](../core-features/comparisons.md) to learn more.

#### compress_evaluation_keys: bool = False
- Specify that serialization takes the compressed form of evaluation keys.

#### compress_input_ciphertexts: bool = False
- Specify that serialization takes the compressed form of input ciphertexts.

#### composable: bool = False
- Specify that the function must be composable with itself. 
- Only used when compiling a single circuit; when compiling modules, use the [composition policy](../compilation/composing_functions_with_modules.md#optimizing_runtimes_with_composition_policies).

#### dataflow_parallelize: bool = False
- Enable dataflow parallelization in the compiler.

#### dump_artifacts_on_unexpected_failures: bool = True
- Export debugging artifacts automatically on compilation failures.

#### enable_tlu_fusing: bool = True
- Enables Table Lookups(TLU) fusing to reduce the number of TLUs.

#### enable_unsafe_features: bool = False
- Enable unsafe features.

#### fhe_execution: bool = True
- Enable FHE execution. Can be enabled later using `circuit.enable_fhe_execution()`.

#### fhe_simulation: bool = False
- Enable FHE simulation. Can be enabled later using `circuit.enable_fhe_simulation()`.

#### global_p_error: Optional[float] = None
- Global error probability for the whole circuit. 
- If set, the whole circuit will have the probability of a non-exact result smaller than the set value. See [Exactness](../core-features/table_lookups_advanced.md#table-lookup-exactness) to learn more.

#### if_then_else_chunk_size: int = 3
- Chunk size to use when converting the `fhe.if_then_else extension`.

#### insecure_key_cache_location: Optional[Union[Path, str]] = None
- Location of insecure key cache.

#### loop_parallelize: bool = True
- Enable loop parallelization in the compiler.

#### multi_parameter_strategy: fhe.MultiParameterStrategy = fhe.MultiParameterStrategy.PRECISION
- Set the level of circuit partitioning when using `fhe.ParameterSelectionStrategy.MULTI`.
  - `PRECISION`: all TLUs with the same input precision have their own parameters.
  - `PRECISION_AND_NORM2`: all TLUs with the same input precision and output [norm2](../../compilers/concrete-optimizer/v0-parameters/) have their own parameters.

#### optimize_tlu_based_on_measured_bounds: bool = False
- Enables TLU optimizations based on measured bounds. 
- Not enabled by default, as it could result in unexpected overflows during runtime.

#### optimize_tlu_based_on_original_bit_width: Union[bool, int] = 8
- Configures whether to convert values to their original precision before doing a table lookup on them.
  - `True` enables it for all cases.
  - `False` disables it for all cases.
  - Integer value enables or disables it depending on the original bit width. With the default value of 8, only the values with original bit width ≤ 8 will be converted to their original precision.

#### p_error: Optional[float] = None
- Error probability for individual table lookups.
- If set, all table lookups will have the probability of a non-exact result smaller than the set value. See [Exactness](../core-features/table_lookups_advanced.md#table-lookup-exactness) to learn more.

#### parameter_selection_strategy: fhe.ParameterSelectionStrategy = fhe.ParameterSelectionStrategy.MULTI
- Set how cryptographic parameters are selected.

#### print_tlu_fusing: bool = False
- Enables printing of TLU fusing to see which table lookups are fused.

#### progress_tag: Union[bool, int] = False
- How many nested tag elements to display with the progress bar. 
  - `True` means all tag elements
  - `False` disables the display. 
  - `2` will display `elmt1.elmt2`.
#### progress_title: str = ""
- Title of the progress bar.

#### rounding_exactness: Exactness = fhe.Exactness.EXACT
- Set default exactness mode for the rounding operation:
  - `EXACT`: threshold for rounding up or down is exactly centered between the upper and lower value.
  - `APPROXIMATE`: faster but threshold for rounding up or down is approximately centered with a pseudo-random shift. Precise behavior is described in [`fhe.rounding_bit_pattern`](../core-features/rounding.md).

#### relu_on_bits_chunk_size: int = 3
- Chunk size of the ReLU extension when [fhe.bits](../core-features/bit_extraction.md) implementation is used.

#### relu_on_bits_threshold: int = 7
- Bit-width to start implementing the ReLU extension with [fhe.bits](../core-features/bit_extraction.md).

#### shifts_with_promotion: bool = True
- Enable promotions in encrypted shifts instead of casting at runtime. See [Bitwise#Shifts](../core-features/bitwise.md#shifts) to learn more.

#### show_graph: Optional[bool] = None
- Print computation graph during compilation. 
  - `True` means always print
  - `False` means never print
  - `None` means print depending on verbose configuration.

#### show_mlir: Optional[bool] = None
- Print MLIR during compilation. 
  - `True` means always print
  - `False` means never print
  - `None` means print depending on verbose configuration.
#### show_optimizer: Optional[bool] = None
- Print optimizer output during compilation. 
  - `True` means always print
  - `False` means never print
  - `None` means print depending on verbose configuration.
#### show_progress: bool = False
- Display a progress bar during circuit execution.

#### show_statistics: Optional[bool] = None
- Print circuit statistics during compilation. 
  - `True` means always print
  - `False` means never print
  - `None` means print depending on verbose configuration.

#### simulate_encrypt_run_decrypt: bool = False
- Whether to use the simulate encrypt/run/decrypt methods of the circuit/module instead of actual encryption/evaluation/decryption.
  - When this option is set to `True`, encrypt and decrypt are identity functions, and run is a wrapper around simulation. In other words, this option allows switching off encryption to quickly test if a function has the expected semantic (without paying the price of FHE execution).
  - This is extremely unsafe and should only be used during development.
  - For this reason, it requires `enable_unsafe_features` to be set to `True`.

#### single_precision: bool = False
- Use single precision for the whole circuit.

#### use_gpu: bool = False
- Enable generating code for GPU in the compiler.

#### use_insecure_key_cache: bool = False (Unsafe)
- Use the insecure key cache.

#### verbose: bool = False
- Print details related to compilation.

