Metadata-Version: 2.1
Name: easy_sge
Version: 1.0.2
Summary: Module that manage SGE experiences, from parameters to grid executions
Author-email: William Droz <william.droz@idiap.ch>
Description-Content-Type: text/markdown
Classifier: License :: OSI Approved :: MIT License
Requires-Dist: jinja2 >=2.10,<3.0
Requires-Dist: markupsafe ==2.0.1
Requires-Dist: black == 22.3.0 ; extra == "dev"
Requires-Dist: coverage >= 6.4.2,<7.0.0 ; extra == "dev"
Requires-Dist: flake8 >=3.8.3,<4.0.0 ; extra == "dev"
Requires-Dist: mypy >=0.971,<1.0 ; extra == "dev"
Requires-Dist: pre-commit >=2.17.0,<3.0.0 ; extra == "dev"
Requires-Dist: pytest >=7.1.2,<8.0.0 ; extra == "dev"
Project-URL: Home, https://gitlab.idiap.ch/devel/easy_sge
Provides-Extra: dev

# GridSearch-like on the grid

Searching good combinaisons of parameters happen quite ofter in ML-related task. I wrote a tool that help to achieve that. If you worked with the unix system call _fork_, you will see a similar approach with the API.

# Installation

`pip install easy_sge`

## Hello World example

In this example we wrote all combinaisons of hello/hi world/Idiap.

```python
from easy_sge.experiences_manager import ExperienceBase

if __name__ == '__main__':
    if ExperienceBase.is_in_SGE(): # Write your task
        parameters = ExperienceBase.load_only_current()
        first = parameters['first']
        second = parameters['second']
        print('{} {}'.format(first, second))
    else: # Configure your task
        my_experience = ExperienceBase()
        my_experience.add_experience_key_values('first', ['hello', 'hi'])
        my_experience.add_experience_key_values('second', ['world', 'idiap'])

        my_experience.add_grid_parameter('-P', 'devel')
        my_experience.add_grid_parameter('-cwd', '')
        my_experience.add_grid_parameter('-N', 'hello_world')

        my_experience.run(sync=True)
```

Run the example `python3 -m examples.hello_world` then check the results after running the script (and waiting a little bit)
`ls -1 output/hello_world.o*`

<pre>
output/hello_world.o5439319.1
output/hello_world.o5439319.2
output/hello_world.o5439319.3
output/hello_world.o5439319.4
</pre>

Each file contains the result of a combinaison. Let's check the content of the first one
`cat output/hello_world.o5439319.1`

> hello world

Get all results at once
`cat output/hello_world.o*`

<pre>
hello world
hi world
hello idiap
hi idiap
</pre>

## FizzBuzz example

We can also use task over a single parameter, like in fizzbuzz, which depend of _n_. Here an example with fizzbuzz from [1, 100]

```python
from easy_sge.experiences_manager import ExperienceBase

if __name__ == '__main__':
    if ExperienceBase.is_in_SGE(): # Write your task
        parameters = ExperienceBase.load_only_current()
        n = parameters['n']
        my_str = ''
        if n % 3 == 0:
            my_str += 'Fizz'
        if n % 5 == 0:
            my_str += 'Buzz'
        if my_str == '':
            my_str = str(n)
        print('(n={:04d}) -> {}'.format(n, my_str))
    else: # Configure your task
        my_experience = ExperienceBase()
        my_experience.add_experience_key_values('n', list(range(1, 101)))

        my_experience.add_grid_parameter('-P', 'devel')
        my_experience.add_grid_parameter('-cwd', '')
        my_experience.add_grid_parameter('-N', 'fizzbuzz')

        my_experience.run(sync=True)
```

Run the example `python3 -m examples.fizzbuzz`

Get all results at once and sort by n
`cat output/fizzbuzz.o* | sort`

<pre>
(n=0001) -> 1
(n=0002) -> 2
(n=0003) -> Fizz
(n=0004) -> 4
(n=0005) -> Buzz
(n=0006) -> Fizz
(n=0007) -> 7
(n=0008) -> 8
(n=0009) -> Fizz
(n=0010) -> Buzz
(n=0011) -> 11
...
(n=0090) -> FizzBuzz
(n=0091) -> 91
(n=0092) -> 92
(n=0093) -> Fizz
(n=0094) -> 94
(n=0095) -> Buzz
(n=0096) -> Fizz
(n=0097) -> 97
(n=0098) -> 98
(n=0099) -> Fizz
(n=0100) -> Buzz
</pre>

## Using with conda environment

If you want to use the same conda environmenent than the experience runner, then just let `python_executable` parameter empty.

Otherwise you can use conda run with the python_executable parameter

```python
my_experience = ExperienceBase(python_executable="/idiap/user/wdroz/conda_stuff/miniconda3/condabin/conda run -n rise-baseline python3")
```

_you need to specify the full path of conda_

# Dev

## Flit

Please install [flit](https://flit.pypa.io/en/latest/index.html)

Then run `flit install --extras dev`

## From pip

You can alternatively install the dev environnement from pip with `pip install "easy_sge[dev]"`

## Install pre-commit

Please install the pre-commit of the project with

```bash
pre-commit install
```

and for commit-msg

```bash
pre-commit install --hook-type commit-msg
```

## Running tests

```bash
python -m pytest
```

