2024 T Informatique
2024 T Informatique
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
E IS
IP
B-
BI
CONSIGNES GÉNÉRALES
Attributs
• data : La matrice des scores (instance de la classe [Link]).
• rowMap : Un dictionnaire qui relie les noms des users (clés) aux indices des lignes associés
(valeurs).
• colMap : Un dictionnaire qui relie les noms des items (clés) aux indices des colonnes associés
(valeurs).
Solution:
import numpy as np
BI
class DataFrame:
def __init__(self, data, rows, columns):
nrows, ncolumns = [Link]
B-
[Link] = [Link]()
[Link] = {row:i for i, row in enumerate(rows)}
[Link] = {col:j for j, col in enumerate(columns)}
IP
Q2. mapRow(...) : reçoit un str rowName qui correspond au nom d’un user et retourne l’indice de
la ligne correspondante.
E
Espace de réponse pour Q2
IS
def mapRow(self, rowName):
Solution:
Q3. mapCol(...) : reçoit un str colName qui correspond au nom d’un item et retourne l’indice
de la colonne correspondante.
Solution:
Q4. mapPos(...) : reçoit un tuple locName contenant deux chaînes qui correspondent respecti-
vement à un nom d’user et un nom d’item et retourne un tuple contenant l’indice de la ligne
BI
et l’indice de la colonne associées.
Q5. getRowNames(...) : qui retourne les noms des lignes sous forme d’une liste triée selon l’ordre
des indices.
def getRowNames(self):
def getRowNames(self):
return sorted([Link], key = [Link])
def getRowNames(self):
return list([Link])
Q6. getColumnNames(...) : qui retourne les noms des colonnes sous forme d’une liste triée selon
l’ordre des indices.
def getColumnNames(self):
B-
IP
Solution:
E
def getColumnNames(self):
return list([Link])
IS
def getColumnNames(self):
return sorted([Link], key = [Link])
Q7. __getitem__(...) : méthode spéciale qui reçoit un tuple locName contenant deux chaînes
qui correspondent respectivement à un nom d’user et un nom d’item et retourne le score associé
à partir de la matrice data.
Cette classe hérite de la classe DataFrame, elle encapsule une matrice carrée contenant les
similarités entre toutes les paires d’items. Ainsi, les deux axes sont indexables par les noms
des items.
Méthodes à implémenter
BI
Q8. __init__(...) : Initialise une nouvelle instance à partir des paramètres data, itemNames re-
présentant respectivement la matrice des similarités entre les paires des items et la liste des
noms des items.
B-
class SimilarityMatrix(DataFrame):
IP
def __init__(self, data, itemNames):
E IS
Solution:
class SimilarityMatrix(DataFrame):
def __init__(self, data, itemNames):
super().__init__(data, itemNames, itemNames)
# ou bien
class SimilarityMatrix(DataFrame):
def __init__(self, data, itemNames):
DataFrame.__init__(self, data, itemNames, itemNames)
Cette classe hérite de la classe DataFrame, elle encapsule une matrice des scores donnés par
des users pour certains items. Cette matrice est à deux axes respectivement indexables par les
noms des users et les noms des items.
— Une interaction user, item (produisant un score effectif) est marquée par la valeur False au
niveau du masque.
— L’absence d’interaction user, item (décrite par le symbole "-" dans la figure 1) est marquée
par la valeur True au niveau du masque.
Attributs
— mask : Une matrice de booléens (instance de la classe [Link]) ayant les même
dimensions que l’attribut hérité data où les cases à True sont les cases masquées (les
items que l’utilisateur n’a pas évalué).
Pour l’exemple de données illustrés dans la figure 1, le masque associé est présenté comme suit
dans la figure 2.
BI
Q9. __init__(...) : Initialise une instance à partir des paramètres data, rows, columns et
mask représentant respectivement la matrice des scores, la liste des noms des utilisateurs, la
liste des noms des items et la matrice du masque.
class MaskedDataFrame(DataFrame):
def __init__(self, data, rows, columns , mask):
class MaskedDataFrame(DataFrame):
def __init__(self, data, rows, columns , mask):
super().__init__(data, rows, columns)
[Link] = [Link]()
Q10. __getitem__(...) : méthode spéciale qui reçoit un tuple locName contenant deux chaînes
qui correspondent respectivement à un nom d’user et un nom d’item et retourne le score associé
à partir de la matrice data si l’user a évalué l’item et None, sinon.
Solution:
IP
def __getitem__(self, locName):
row, col = [Link](locName)
if not [Link][row, col]:
E
return super().__getitem__(locName)
#ou bien
IS
def __getitem__(self, locName):
idx = super().mapPos(locName)
if not [Link][idx]:
return super().__getitem__(locName)
#ou bien
Q11. getInteractions(...) : prend le nom d’un item colName et retourne un ensemble conte-
nant les noms des users qui ont interagit avec cet item.
Solution:
Q12. getDomain(...) : extrait un ensemble contenant les noms des items qui ont été évalués par
l’user rowName.
IS
Solution:
Solution:
Cette classe abstraite encapsule la logique de production d’une matrice de similarité selon une
métrique spécifiée par le biais de l’héritage.
BI
Attributs
Méthodes à implémenter
class SimilarityMeasure:
def __init__(self, mdf):
E
[Link] = mdf
IS
La méthode measure(...) : implémente une métrique de similarité. Cette méthode sera re-
définie dans les classes filles.
def getSimilarityMatrix(self):
def getSimilarityMatrix(self):
colNames = [Link]()
dsim = [Link](len(colNames))
for i in range(len(colNames)):
for j in range(i):
dsim[i,j] = dsim[j,i] = [Link](colNames[i], colNames[j])
return SimilarityMatrix(dsim, colNames)
Cette classe concrète encapsule la logique de production d’une matrice de similarité selon
B-
le cosinus de l’angle entre les deux vecteurs vi et vj représentants les scores de deux items
en considérant uniquement les users qui ont simultanément interagit avec ces deux items en
question.
IP
X
scoreu,i scoreu,j
u∈U (itemi ,itemj )
CosineSimilarity(itemi , itemj ) = s s
E
X X
score2u,i score2u,j
u∈U (itemi ,itemj ) u∈U (itemi ,itemj )
IS
Cette formule est équivalente à :
vi .vj
CosineSimilarity(vi , vj ) =
∥vi ∥ ∥vj ∥
Où :
— U(itemi , itemj ) est l’ensemble des users qui ont simultanément interagit avec les items
itemi et itemj .
— vi , vj sont deux vecteurs contenant les scores de deux items itemi et itemj en considérant
uniquement les users qui ont simultanément interagit avec les deux items.
— vi .vj représente le produit scalaire entre vi et vj .
— ∥v∥ représente la norme euclidienne du vecteur v.
class CosineSimilarityMeasure(SimilarityMeasure):
def measure(self, colName1, colName2):
Solution:
BI
class CosineSimilarityMeasure(SimilarityMeasure):
def measure(self, colName1, colName2):
c1, c2 = [Link](colName1, colName2)
return [Link](c2) / ([Link](c1) * [Link](c2))
B-
IP
Interface de la classe JaccardSimilarityMeasure
Rôle & responsabilités
Cette classe concrète encapsule la logique de production d’une matrice de similarité selon
E
l’indice de Jaccard qui capture le rapport entre l’intersection et l’union entre les deux vecteurs
vi et vj représentants les scores de deux items en considérant uniquement les users qui ont
IS
simultanément interagit avec ces deux items en question.
X
min (scoreu,i , scoreu,j )
u∈U (itemi ,itemj )
JaccardSimilarity(itemi , itemj ) = X
max (scoreu,i , scoreu,j )
u∈U (itemi ,itemj )
Où :
Méthodes à implémenter
Q16. measure(...) : calcule et retourne un réel représentant la similarité de Jaccard entre les
deux items dont les noms sont passés dans les paramètres colName1 et colName2 comme
illustré par l’équation 2.
class JaccardSimilarityMeasure(SimilarityMeasure):
def measure(self, colName1, colName2):
BI
B-
Solution:
class JaccardSimilarityMeasure(SimilarityMeasure):
IP
def measure(self, colName1, colName2):
c1, c2 = [Link](colName1, colName2)
a = [Link]([c1,c2])
E
return ([Link](axis = 0).sum()/ [Link](axis = 0).sum())
IS
Cette classe concrète encapsule la logique de production d’une matrice de similarité basée
sur la distance euclidienne qui représente la longueur de la droite qui relie deux vecteurs
vi et vj représentants les scores de deux items en considérant uniquement les users qui ont
simultanément interagit avec ces deux items en question.
Où :
— U(itemi , itemj ) est l’ensemble des users qui ont simultanément interagit avec les items
itemi et itemj .
— vi , vj sont deux vecteurs contenant les scores de deux items itemi et itemj en considérant
uniquement les users qui ont simultanément interagit avec les deux items.
BI
— viu est l’élément qui correspond à l’utilisateur u dans le vecteur vi .
Méthodes à implémenter
B-
Q17. measure(...) : calcule et retourne un réel représentant la similarité euclidienne entre les
deux items dont les noms sont passés dans les paramètres colName1 et colName2 comme
illustré par l’équation 3.
IP
Espace de réponse pour Q17
class EuclidianSimilarityMeasure(SimilarityMeasure):
E
def measure(self, colName1, colName2):
IS
Solution:
class EuclidianSimilarityMeasure(SimilarityMeasure):
def measure(self, colName1, colName2):
c1, c2 = [Link](colName1, colName2)
return 1 / (1+ [Link](((c1-c2)**2).sum()))
Attributs
Méthodes à implémenter
La méthode __init__(...) : initialise l’attribut sMatrix à partir du paramètre d’entrée.
class SelectionStrategy:
BI
def __init__(self, sMatrix):
[Link] = sMatrix
B-
La méthode select(...) : implémente une stratégie de sélection des items les plus similaires
à un item donné colName à partir d’un ensemble d’items colDomain. Cette méthode sera
redéfinie dans les classes filles.
IP
def select(self, colName, colDomain):
# pour cette classe le script de cette méthode
# n'est pas demandé
E IS
Interface de la classe KNNStrategy
Rôle & responsabilités
Cette classe concrète implémente une stratégie de sélection qui extrait les n plus proches
voisins à un item donné à partir du domaine d’items. La notion de proximité entre les items
est proportionnelle à la similarité entre les items représentée par l’attribut sMatrix.
Attributs
— n : entier positif qui représente le nombre de voisins les plus similaires relativement à
colName que la méthode select doit extraire à partir du domaine d’items colDomain.
Méthodes à implémenter
La méthode __init__(...) : initialise à partir des paramètres, les attributs hérités et l’attribut
n. Cette méthode est implémentée comme suit :
Q18. La méthode select(...) : implémente une stratégie de sélection des items les plus similaires
à un item donné colName à partir d’un ensemble d’items colDomain. Cette méthode doit trier
les items de colDomain selon leurs similarités relatives à l’item colName puis retourne les
n premiers items de cette liste triée.
Solution:
B-
Cette classe concrète implémente une stratégie de sélection qui extrait du domaine d’items
colDomain tous les items dont la similarité relative à l’item colName est supérieure ou égale
à un seuil alpha.
Attributs
Méthodes à implémenter
La méthode __init__(...) : initialise à partir des paramètres, les attributs hérités et égale-
ment l’attribut alpha. Cette méthode est implémentée comme suit :
Q19. La méthode select(...) : implémente une stratégie de sélection des items les plus similaires
à un item donné colName à partir d’un ensemble d’items colDomain. Elle retourne la liste des
items de colDomain ayant une similarité relative à colName supérieure ou égale à alpha.
Solution:
B-
def select(self, colName, colDomain):
return [colNamei for colNamei in colDomain
if [Link][colName, colNamei] >= [Link]]
IP
Attributs
— sMeasure : une chaîne de caractère décrivant la mesure de similarité que le système doit
adopter, elle supporte les valeurs "cosine", "jaccard" ou bien "euclidian".
— selectParameter : une valeur numérique décrivant le paramètre de la stratégie de sé-
lection à adopter. Elle peut prendre deux formes : KNNStrategy pour un paramètre
de type int (paramètre formel n) et ThresholdStrategy pour un paramètre de type
float (paramètre formel alpha).
— mdf : instance de la classe MaskedDataFrame.
— sMatrix : instance de la classe SimilarityMatrix.
Méthodes à implémenter
La méthode __init__(...) : initialise les attributs à partir des deux paramètres d’entrée.
Cette méthode est implémentée comme suit :
class IBCFSystem:
def __init__(self, similarityMeasure, selectParameter):
[Link] = similarityMeasure
[Link] = selectParameter
Q20. La méthode fit(...) : implémente la phase d’apprentissage des similarités à partir du para-
mètre mdf instance de la classe MaskedDataFrame. Cette méthode doit appliquer la démarche
suivante :
BI
1. Créer un attribut mdf à partir du paramètre d’entrée.
2. Selon l’attribut sMeasure et en utilisant l’attribut mdf, instancier la classe dérivée re-
présentant la Mesure de similarité adéquate et l’affecter à l’attribut sMeasure.
B-
3. Construire la matrice de similarités et l’affecter à l’attribut sMatrix.
4. Selon la nature du paramètre selectParameter, instancier la classe dérivée représentant
la Stratégie de sélection adéquate et l’affecter à l’attribut strategy.
IP
Espace de réponse pour Q20
Solution:
Q21. La méthode predict(...) : implémente la phase de prédiction du score qu’un user rowName au-
rait donnée à un item colName. Cette méthode doit effectuer les étapes suivantes :
B-
1. En utilisant l’attribut mdf tester si l’user a déjà interagit avec l’item et retourner le score
attribué si c’est le cas.
2. Sinon, construire colDomain l’ensemble des items que l’user rowName a interagit avec.
3. Si colDomain est vide, alors retourner None.
IP
4. Sinon, appliquer la stratégie de sélection pour construire une liste selected contenant
les items les plus similaires à colName qui ont été appréciés par l’user rowName.
5. Calculer puis retourner score
ˆ rowName,colName le score que l’user rowName aurait attribué à
E
l’item colName en appliquant l’équation suivante :
X
IS
sMatrixi,colName scorerowName,i
i∈selected
ˆ rowName,colName =
score X
|sMatrixi,colName |
i∈selected
Q22. Lister les identifiants des serveurs avec leurs capacités de stockage.
Solution:
Π (Serveurs)
BI
ServeurID,CapacitéStk
Q23. Lister les identifiants et les adresses IP des serveurs qui hébergent des logiciels utilisés par
B-
des entreprises qui œuvrent dans le domaine de l’assurance.
Π
ServeurID,AdresseIP
σ
Rôle= "assurance"
Serveurs ▷◁
ServeurID
Affectations ▷◁
UserID
Utilisateurs
SQL
Q24. Écrire la requête qui permet de créer la table Affectations en supposant que toutes les
tables référencées sont déjà créées.
Solution:
Dans la suite on suppose que les tables de la base de données sont remplies en respectant les
IP
contraintes et les règles de gestion su citées.
Solution:
Q26. Déterminer tous les détails relatifs aux logiciels qui pour le moment n’ont aucune licence.
Solution:
SELECT *
FROM Logiciels
WHERE LogicielID NOT IN
(
SELECT LogicielID
FROM Licences
);
BI
Q27. Déterminer toutes les informations relatives aux serveurs qui hébergent des logiciels avec
des licences de type "logiciel libre".
B-
Espace de réponse pour Q27
IP
E
Solution:
IS
SELECT *
FROM Serveurs
WHERE ServeurID IN
(
SELECT ServeurID
FROM Affectations as A, Licences AS L
WHERE ([Link] = [Link])
AND (TypeLicence LIKE "logiciel libre")
);
/* ou bien */
SELECT S.*
FROM Serveurs AS S, Affectations as A, Licences AS L
WHERE [Link] = [Link]
AND [Link] = [Link]
AND TypeLicence LIKE "logiciel libre";
Solution:
SELECT [Link],
CapacitéServ,
CapacitéServ - COUNT(*) AS CapacitéDispo
FROM DataCenters AS D, Serveurs AS S
BI
WHERE [Link] = [Link]
GROUP BY [Link]
ORDER BY CapacitéDispo DESC;
B-
IP
E IS
Dans cette partie, on suppose que la table suivante a été ajoutée à la base de données :
■ Monitoring(MonitoringID, DateSurv, Statut, Commentaires, DuréeStatut, #UserID, #ServeurID)
La table Monitoring enregistre les informations relatives à des prélèvements réguliers pour
assurer la surveillance de performances et de disponibilité des serveurs pour les utilisateurs.
C’est le basculement de statut d’un serveur qui provoque l’insertion d’un nouveau tuple dans
cette base.
— MonitoringID : utilisé pour identifier de manière unique chaque enregistrement de sur-
veillance, de type entier clé primaire.
— DateSurv : indique la date et l’heure auxquelles la surveillance a été effectuée, de type
date et heure selon le format "AAAA-MM-JJ HH:MM:SS".
— Statut : Il indique l’état opérationnel du serveur au moment de la surveillance, ce qui
peut être utile pour analyser les performances et la disponibilité du serveur au fil du
temps. Ce champ pourrait inclure des valeurs telles que "En ligne", "Hors ligne",
"En maintenance", "En panne", "En surcharge", etc., de type chaîne de caractères.
— Commentaires : champ permettant d’enregistrer des commentaires ou des notes sur le
déroulement de la surveillance, de type chaîne de caractères.
BI
— DuréeStatut : La durée exprimée en millisecondes pendant laquelle le serveur reste dans
le statut actuel avant de basculer vers un autre statut, de type entier.
— UserID : identifiant de l’entreprise locataire de type entier clé étrangère qui fait référence
B-
à la table Utilisateurs.
— ServeurID : identifiant d’un serveur sur lequel les données de l’utilisateur sont enregistrées
de type entier, clé étrangère qui fait référence à la table Serveurs.
IP
Dans la suite, les fonctions demandées doivent être écrites en Python en désignant par cur le
curseur d’exécution des requêtes.
Q29. Écrire la fonction ServerMonitoring qui prend deux paramètres cur et serverID l’iden-
E
tifiant d’un serveur et retourne un dictionnaire dStat où les clés sont les statuts qui ont été
observés durant le monitoring de ce serveur et les valeurs sont des ensembles contenant les
dates et heures des observations de ces statuts.
IS
Solution:
Solution:
Den ligne
Disponibility =
Dtotal
X
Dtotal = Ds
s∈Statuts
BI
Espace de réponse pour Q31
Solution:
E IS
def DCavailability(cur, dataCenterID):
ddcStat = DCStatutTimeSpan(cur, dataCenterID)
disponibility = ddcStat['En ligne']/ sum([Link]())
return disponibility
BI
B-
IP
E IS
BI
B-
IP
E IS