Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
No results found
Select Git revision
  • master
1 result
Show changes

Commits on Source 32

48 files
+ 342062
117
Compare changes
  • Side-by-side
  • Inline

Files

+1362 −0

File added.

Preview size limit exceeded, changes collapsed.

TD02/code/Pile.py

deleted100644 → 0
+0 −20
Original line number Diff line number Diff line
class Pile():
    def __init__(self, values = []):
        self.__values = []
        for v in values:
            self.ajoute(v)

    def ajoute(self, v):
        self.__values.append(v)
        return v

    def supprime(self):
        v = self.__values.pop()
        return v

    def affiche(self):
        for v in self.__values:
            print(v)

    def taille(self): 
        return len(self.__values)
 No newline at end of file

TD02/code/load.py

deleted100644 → 0
+0 −12
Original line number Diff line number Diff line
data = []

with open("etudiants.txt") as f:
    keys = None
    for line in f:
        l = [w.strip() for w in line.split(';')]
        if keys is None:
            keys = l
        else:
            data.append({k:v for k, v in zip(keys, l)})

print(data)
 No newline at end of file

TD02/code/selection.py

deleted100644 → 0
+0 −20
Original line number Diff line number Diff line
def selectionSort(l: list = []) -> list:
    """Tri par selection en ligne"""
    for i in range(0, len(l)):
        min = i
        for j in range(i+1, len(l)):
            if(l[j] < l[min]):
                min = j
        tmp = l[i]
        l[i] = l[min]
        l[min] = tmp
    
    return l  

if __name__=="__main__": 
    liste = [54,26,93,17,77,31,44,55,20]
    
    assert(sorted(liste) == selectionSort(liste.copy()))
    assert([] == selectionSort([]))
    assert([1] == selectionSort([1]))
    assert([1, 1] == selectionSort([1, 1]))
 No newline at end of file

TD02/code/test_analyse_simple.py

deleted100644 → 0
+0 −37
Original line number Diff line number Diff line
import time
import random
import matplotlib.pyplot as plt

nvalues = [100, 500, 1500, 2000, 2500, 3000]

timesSorted = []
timesSort = []

for i in nvalues:

    random.seed()
    p = 12**2
    liste = []
    
    for x in range(i): liste.append(random.randint(0, p))

    c = liste.copy()
    a=time.perf_counter()
    triSorted = sorted(c)
    b=time.perf_counter()
    timesSorted.append(b-a)

    c = liste.copy()
    a=time.perf_counter()
    triSort = c
    triSort.sort()
    b=time.perf_counter()
    timesSort.append(b-a)

plt.plot(nvalues, timesSorted, "g-", label="Tri 1")
plt.plot(nvalues, timesSort, "b-", label="Tri 2")
plt.xlabel("Taille du jeu de données")
plt.ylabel("Temps")
plt.legend(loc="upper left")
plt.title("Comparaison des performances des algorithmes de tri")
plt.show()
 No newline at end of file

TD02/code/test_heap.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
import heapq
tas = []

for i in range(5): heapq.heappush(tas, i)

while not len(tas) == 0: 
  print(heapq.heappop(tas), end=" ")

# 0 1 2 3 4
 No newline at end of file

TD02/code/test_lifoqueue.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
import queue
pile = queue.LifoQueue()

for i in range(5): pile.put(i)

while not pile.empty(): 
  print(pile.get(), end=" ")

# 4 3 2 1 0
 No newline at end of file

TD02/code/test_pile.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
from pile import *

p = Pile()

for d in data:
  p.ajoute(d) 
  e = p.supprime()
    
print(e['nom'] + " " + e['prenom']) # Arthaud Nathalie
 No newline at end of file
Original line number Diff line number Diff line
nom;prenom;filiere;note;absences
Dupond;Pierre;MP;19;7
Dupond;Jeanne;MP;19;5
Dupont;Jeanne;MP;19;5
Clavier;Christian;PSI;14;1
Gilles;Eric;PC;16;3
Arthaud;Nathalie;MP;15;0
 No newline at end of file
+896 −0

File added.

Preview size limit exceeded, changes collapsed.

+1025 −0

File added.

Preview size limit exceeded, changes collapsed.

+160 −0
Original line number Diff line number Diff line
%% Cell type:markdown id:751c51f9 tags:

NAME:

%% Cell type:markdown id:b97bad7e-82ff-44a7-9779-13c139085623 tags:

# INF TC1 - TD5 (2h + 2h AUTONOMIE) - Devoir à rendre #1

%% Cell type:markdown id:1bb26026-8560-4a3c-90e6-2cfd7a49320a tags:

---

%% Cell type:markdown id:dd8d4905-55f9-4957-8008-a963cc6de061 tags:

Vous serez évalué sur le rendu de ce TD qui sera à déposer sur Moodle **deux (2) semaines** après la séance d'autonomie #1. Le rendu sera à réaliser sous forme de **notebook** qui contient votre code et images.

%% Cell type:markdown id:99ee8fad-7f32-4fe2-85d3-3b8da49f317f tags:

<details style="border: 1px">
<summary> MODALITES DE RENDU</summary>

### Comment rendre son devoir ?

Vous serez évalué sur le rendu de ce TD qui sera à déposer sur Moodle **deux (2) semaines** après les séances d'autonomie et de TD. Vous devrez créer une archive (zip, rar, etc.) nomée `nom1-nom2-inf-tc1-td5.zip` qui contiendra tous les éléments de votre rendu (rapport en notebook, code, images de test). Vous pouvez rendre ce rapport seul ou en binôme. Le rendu du TD doit contenir a minima :

1. Toutes les étapes jusqu'à la 6ème doivent avoir été abordées
2. Justifications, illustrations et tests sur plusieurs images

**A garder en tête :**

- Un code fonctionnel et les tests appropriés devront être fournis dans l'archive qui doit être autonome (le correcteur ne doit pas avoir à rajouter d'image ou de fichier supplémentaire)

- Vous fournirez les images de test et leurs résultats; évitez cependant de prendre des tailles d'images trop importantes.

- Le rapport **devra être au format Notebook Jupyter** et comprendre :

  - Le détail des étapes que vous avez suivies

  - La description de parties de code difficiles

  - Tout souci ou point bloquant dans votre code

  - Les graphiques et diagrammes nécessaires

  - Des analyses et discussions en lien avec votre approche

  - Des exemples simples mais aussi difficiles

**Tout travail supplémentaire (méthode originale, optimisation poussée) fera l'objet de points en bonus.**



*Voici une suggestion afin de se faire un ordre d'idée*


Un groupe avec une note entre 10 et 12 :

- Les étapes suivies
- Un code fonctionnel et les méthodes basiques
- Un rapport succint
- Un code certes fonctionnel mais peu commenté
- Les exemples d'images fournies

Un groupe entre 12 et 14 a en plus proposé :

- Des structures de données avancées (Ensembles, Files, etc)
- Une justification de chaque étape
- Une méthode un petit peu plus poussée

Un groupe entre 14 et 16 a en plus proposé :

- Une méthode originale (K-Means, etc)
- Une démarche expérimentale très détaillée sur les optimisations
- Des tests plutôt originaux

Un groupe au-dessus de 16 comporte une ou plusieurs parties exceptionnelles :

- Rapport très détaillé et exemplaire sur le fond comme sur la forme
- Une démarche expérimentale très détaillée sur les optimisations
- Code et tests



</details>

%% Cell type:markdown id:d48155b2-8db8-4557-a66b-363351712560 tags:

## Objectif du devoir

Le but de ce devoir est de **déterminer automatiquement une palette de couleurs optimale** pour une image donnée. Cette palette devra valider les contraintes suivantes :

1. utiliser moins de couleurs que le nombre disponible dans l'image donnée;
2. être la plus représentative possible des couleurs de l'image donnée.

Comme nous l'avons vu dans le TD 4, les couleurs peuvent être encodée par composantes rouge, verte et bleue (soit 256 valeurs possibles par composante, autrement dit sur 8 bits) ainsi potentiellement utiliser $256 \times 256 \times 256 = 16 777 216$ couleurs. En réalité, beaucoup moins sont nécessaires et surtout perceptibles par l'humain. Réduire le nombre de couleurs ou réaliser une "_quantification de couleurs_" est une tâche fréquente et c'est une fonctionnalité classique des outils éditeurs d'images (Photoshop, Gimp, etc.) implémentée aussi dans le module Pillow de Python. A noter que cette réduction s'effectue avec perte de couleurs et doit être réalisée avec les bons paramètres (nombre et choix des couleurs) ce qui est votre objectif.

La figure ci-dessous illustre le problème à résoudre : étant donnée une image en entrée, proposer une liste de couleurs (que l'on appellera la palette), afin de re-colorier une image en sortie.

<div style="text-align:center;">
<table>
  <tr>
    <td>
      <img src="figures/color-rainbow.png" alt="Image originale" style="height:5cm;">
      <p>Image donnée</p>
    </td>
    <td>
      <img src="figures/rainbow-palette-8.png" alt="Palette de 8 couleurs représentatives" style="height:5cm;">
      <p>Palette de 8 couleurs représentatives</p>
    </td>
    <td>
      <img src="figures/rainbow-recoloriee.png" alt="Image originale recoloriée avec la palette" style="height:5cm;">
      <p>Image donnée recoloriée avec la palette</p>
    </td>
  </tr>
</table>
</div>

%% Cell type:markdown id:fd464e65-adfe-4e11-bf87-f12c513fbaea tags:

## Étapes de travail

Voici des étapes de travail suggérées :

1. Prenez une image de votre choix (pas trop grande) en la chargeant avec PIL. Lister les couleurs présentes, identifier celles qui sont uniques et leur fréquence.

2. Proposez une méthode (naïve pour commencer) de choix d'une palette de $k$ couleurs. Affichez là sous forme d'image (exemple de d'image au milieu de la figure du dessus) avec une nouvelle image PIL. Utilisez également des images simples où le résultat attendu est connu comme pour les images ci-dessous :

  <div style="text-align:center;">
    <table>
      <tr>
        <td>
          <img src="figures/1-color-back.png" alt="1 couleur noir" style="width:3cm;">
          <p>1 couleur noir</p>
        </td>
        <td>
          <img src="figures/4-color.png" alt="4 couleurs" style="width:3cm;">
          <p>4 couleurs</p>
        </td>
      </tr>
    </table>
  </div>

3. Re-coloriez une image avec une palette de $k$ couleurs, et affichez le résultat sous forme d'image PIL. Pour re-colorier chaque pixel, prendre la couleur la plus proche dans la palette en utilisant une fonction de distance (Euclidienne par exemple..).

4. Proposez une méthode de validation de votre approche. Par exemple affichez la différence entre l'image originale et celle re-coloriée. Calculez un score global d'erreur.

5. Améliorez le choix des $k$ couleurs afin de minimiser l'erreur entre l'image originale et re-coloriée. Une piste possible est de trier les couleurs dans une liste, diviser cette liste en $k$ intervals de couleurs et prendre la couleur du milieu de chaque interval. D'autres méthodes plus avancées peuvent être explorées !

6. Testez votre palette sur plusieurs images de votre choix ou générées automatiquement avec un nombre et une distribution connue de couleurs. Comparer les performances de vos techniques avec d'autres méthodes (cette fois vous pouvez utiliser un éditeur de texte ou la fonction _quantize_ de PIL [(doc)](https://pillow.readthedocs.io/en/stable/reference/Image.html).

7. Utilisez un pré-traitement des images (flou gaussien, etc) afin de lisser les couleurs. Cela est une piste afin de choisir de meilleurs couleurs représentatives. Proposez une comparaison de cette amélioration (ou de déterioration éventuelle) avec les autres méthodes.

8. Proposez une méthode d'amélioration de calcul de la distance entre deux couleurs, vous pouvez vous baser sur d'autres espaces de couleur [(doc)](https://fr.wikipedia.org/wiki/Espace_de_couleur). Cette partie est difficile, les espaces de couleurs possibles sont complexes à comprendre.

9. Optimisez les étapes précédentes (complexité, espace nécessaire, structures de données, etc.) et justifiez vos choix.


### Bonus

10. Créez une palette représentative à partir de plusieurs images.
+780 −0

File added.

Preview size limit exceeded, changes collapsed.

TD06/mots-10.txt

0 → 100755
+10 −0
Original line number Diff line number Diff line
a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait
abaissâmes
 No newline at end of file

TD06/mots-100.txt

0 → 100755
+100 −0
Original line number Diff line number Diff line
a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait
abaissâmes
abaissant
abaissante
abaissantes
abaissants
abaissas
abaissasse
abaissassent
abaissasses
abaissassiez
abaissassions
abaissât
abaissâtes
abaisse
abaissé
abaissée
abaissées
abaisse-langue
abaissement
abaissements
abaissent
abaisser
abaissera
abaisserai
abaisseraient
abaisserais
abaisserait
abaisseras
abaissèrent
abaisserez
abaisseriez
abaisserions
abaisserons
abaisseront
abaisses
abaissés
abaisseur
abaisseurs
abaissez
abaissiez
abaissions
abaissons
abajoue
abajoues
abandon
abandonna
abandonnai
abandonnaient
abandonnais
abandonnait
abandonnâmes
abandonnant
abandonnas
abandonnasse
abandonnassent
abandonnasses
abandonnassiez
abandonnassions
abandonnât
abandonnataire
abandonnataires
abandonnâtes
abandonne
abandonné
abandonnée
abandonnées
abandonnent
abandonner
abandonnera
abandonnerai
abandonneraient
abandonnerais
abandonnerait
abandonneras
abandonnèrent
abandonnerez
abandonneriez
abandonnerions
abandonnerons
abandonneront
abandonnes
abandonnés
abandonnez
abandonniez
abandonnions
abandonnons
abandons
abaque
abaques
abasourdi
abasourdie
 No newline at end of file

TD06/mots.txt

0 → 100755
+336531 −0

File added.

Preview size limit exceeded, changes collapsed.

+659 −0

File added.

Preview size limit exceeded, changes collapsed.

graphviz.ipynb

0 → 100644
+62 −0
Original line number Diff line number Diff line
%% Cell type:markdown id:cd27fe91 tags:

## Graphviz

---

Graphviz une biobliothèque open-source de dessin de graphes (ce qui inclue les arbres et automates).


### Installation


#### Mac

Exécuter la commande suivante dans une fenêtre de terminal (console).

> brew install graphviz

#### Windows

Le site https://graphviz.org/download/ vous indique comment procéder. Avec Conda :

> conda install -c anaconda graphviz

Une alternative consiste à installer le module Python à partir de `pip` :

https://pypi.org/project/graphviz/

### Alternatives

Vous pouvez créer vos proprez diagrammes en ligne en utilisant le format `dot`. Un exemple en ligne :

https://dreampuf.github.io/GraphvizOnline/#digraph%20auto%20%7B%0A%20%20%20%20rankdir%3D%22LR%22%3B%0A%0A%20%20%20%20%2F%2F%20Etats%20(12)%0A%20%20%20%20node%20%5Bshape%20%3D%20point%20%5D%3B%20%20%20%20%20__Qi__%20%2F%2F%20Etat%20initial%0A%20%20%20%20node%20%5Bshape%3Dcircle%5D%3B%20Q_0%20%5Blabel%3D0%5D%3B%0A%20%20%20%20node%20%5Bshape%3Ddoublecircle%5D%3B%20Q_1%20%5Blabel%3D1%5D%3B%0A%0A%20%20%20%20%2F%2F%20Transitions%0A%20%20%20%20__Qi__%20-%3E%20Q_0%3B%20%2F%2F%20Etat%20initial%20fleche%0A%20%20%20%20Q_0%20-%3E%20Q_0%20%5Blabel%3Db%5D%3B%0A%20%20%20%20Q_0%20-%3E%20Q_1%20%5Blabel%3Da%5D%3B%0A%20%20%20%20Q_1%20-%3E%20Q_1%20%5Blabel%3Da%5D%3B%0A%20%20%20%20Q_1%20-%3E%20Q_1%20%5Blabel%3Db%5D%3B%0A%7D

```
  digraph auto {
    rankdir="LR";

    // Etats (12)
    node [shape = point ];     __Qi__ // Etat initial inivisble
    node [shape=circle]; Q_0 [label=0];
    node [shape=doublecircle]; Q_1 [label=1]; // Etat final

    // Transitions
    __Qi__ -> Q_0; // Etat initial fleche
    Q_0 -> Q_0 [label=b];
    Q_0 -> Q_1 [label=a];
    Q_1 -> Q_1 [label=a];
    Q_1 -> Q_1 [label=b];
}
```

D'autres modules de dessins de graphes existent comme NetworkX https://networkx.org

### Autres méthodes d'installation

- https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224

%% Cell type:code id:89ba9690 tags:

``` python
```