# Chapter 2: Survey Corps

So its been around 4 weeks into the coding period, a lot of insights and progress so far!

### Profiler Class

The good news is that the Profiler class has been successfully implemented in the develop branch and will be available to users by version `0.9.30`

.

Link : Profiler PR

Below is a simple example how all steps are printed based on the verbose level:

```
wmin = 2000
wmax = 3300
wstep = 0.01
T = 3000.0 #K
p = 0.1 #bar
broadening_max_width=10
sf = SpectrumFactory(wavenum_min=wmin, wavenum_max=wmax,
pressure=p,
wstep=wstep,
broadening_max_width=broadening_max_width,
molecule="CO",
cutoff=0, # 1e-27,
verbose=3,
)
sf.load_databank('HITEMP-CO')
s = sf.eq_spectrum(T)
```

Output:

```
... Scaling equilibrium linestrength
... 0.01s - Scaled equilibrium linestrength
... 0.00s - Calculated lineshift
... 0.00s - Calculate broadening HWHM
... Calculating line broadening (60869 lines: expect ~ 6.09s on 1 CPU)
...... 0.16s - Precomputed DLM lineshapes (30)
...... 0.00s - Initialized vectors
...... 0.00s - Get closest matching line & fraction
...... 0.02s - Distribute lines over DLM
...... 1.95s - Convolve and sum on spectral range
... 2.14s - Calculated line broadening
... 0.01s - Calculated other spectral quantities
... 2.21s - Spectrum calculated (before object generation)
... 0.01s - Generated Spectrum object
2.22s - Spectrum calculated
```

Also we can access these steps and the time taken by them using `Spectrum.get_conditions()['profiler']`

. Also there is a parameter `SpectrumFactory.profiler.relative_time_percentage`

that stores the percentage of time taken by each steps at a particular verbose level, helpful seeing the most expensive steps in Spectrum calculation.

### Legacy Method Complexity

Several Spectrums were benchmarked against various parameters to see itβs correlation and derive its complexity. We used Profiler class with init_database() which stores all parameters of Spectrum along the Profiler in a `csv`

generated file; all spectrum info got added into the csv file which could be used to do create visualizations to analyze the data. We used `Xexplorer`

library and `Tableau`

(a visual analytics platform) to create visualizations. A github repository was created to store the Visualization along the CSV data file of each benchmark.

Following are the inference of the benchmarks for Legacy Method:

**β’ Calculation Time β Number of lines**

β’ Calculation Time β Broadening max width

β’ Calculation Time β 1/wstep

β’ Calculation Time not dependent on Spectral Range

β’ Calculation Time β Broadening max width

β’ Calculation Time β 1/wstep

β’ Calculation Time not dependent on Spectral Range

So complexity of Legacy method can be derived as: `complexity = constant * Number of lines * Broadening Max Width / Wstep`

### LDM Method Complexity

Similar technique was used to benchmark LDM method. Now LDM uses 2 types of broadening method that are `voigt`

and `fft`

. `voigt`

uses truncation for calculating spectrum in wavenmber space where as `fft`

calculates spectrum on entire spectral range in fourier space. So benchmarks were done on both methods to compare their performance against various parameters.

Spectrum were benchmarked against parameters like Spectral Range, Wstep, Spectral Points, Number of Lines and Broadening Max Width. Following are the inferences.

For `fft`

:**
β’ Calculation Time β Spectral Points
β’ Calculation Time β Number of Lines**

For `voigt`

:**
β’ Calculation Time β Spectral Points
β’ Calculation Time β Number of Lines
β’ Calculation Time β Broadening Max Width**

For LDM we are expecting the following complexity:`t_LDM_fft ~ c2*N_lines + c3*(N_G*N_L + 1)*N_v*log(N_v)`

`t_LDM_voigt ~ c2*N_lines + c3'*(N_G*N_L + 1)*N_truncation*log(N_truncation)`

So the goal for the next 2 weeks will be to get the complexity of both `voigt`

and `fft`

method and see places for improving both methods and quite possibily create a `Hybrid`

method taking the best of both worlds.