Skip to content
Snippets Groups Projects
Commit 8199d8d9 authored by Amaury's avatar Amaury
Browse files

rapport de stage

parent 4d216f83
No related branches found
No related tags found
No related merge requests found
Showing
with 839 additions and 0 deletions
\subsection{Etat des différents critères}
\subsubsection{Les modèles de mémoires partagées}
\subsubsection{La cohérence forte}
Cohérence Séquentielle \cite{lamport_how_1979}
\subsubsection{La cohérence Faible}
\subsection{Motivation}
\input{intro/motivation.tex}
\subsection{Introduction}
\input{intro/intro.tex}
\ No newline at end of file
L'étude du comportement des systèmes distribués date des années 1970 avec l'arrivé des premiers processeurs multicoeur.
Il semblait essentiel à l'époque de pouvoir répartir une tâche entre plusieurs acteurs de manières
asynchrone afin d'accroitre les performances.
Ainsi Lamport définit un model de cohérence qu'il nomme "séquentiel". C'est à dire que, une tâche pouvant être découper en un
ensemble d'opération, chaque opération étant répartit entre plusieurs acteurs, il est possible de resequentialiser ces opérations
de facon à ce qu'infine leurs remaniement séquentiel soit indicernable vis-à-vis de ce qui pourait être attendu de
l'éxécution de la même tache dans un environement non distribués.
Le désaventage de cette approche est qu'elle nécéssite de garder une synchronicité forte entre les acteurs.
La difficulté à préserver cette synchronicité croit considérablement avec le nombre d'acteur et la latence entre eux. L'usage d'une approche séquentiel sur des applications visant à faire travailler des
acteurs distant à travers un réseau mondia tel qu'internet semble à ce titre loin d'être efficace. Et restreint ces dernières
à des usages limités où une faible intéractivité doit être acceptée par les concepteurs.
Néanmoins là ou l'approche séquentiel est la seule fournissant une cohénce absolue dans la gestions des données du point de vue
général et du point de vue de l'utilisateur.
Il est possibe d'accepter une perte de cette cohérence partiel ou total afin de gagner en performances sur des applications a grande echelle.
Ce compromis entre cohérence et performances est l'objet de ce document qui vise à faire un état du paysage des différentes approches et solutions
existantes, en définissant les cas d'usages associés.
\ No newline at end of file
La plupart des applications colaborarifs sur le marché fonctionnent sous la forme d'une entité centralisé qui traite les données, les redistribuent aux différents client et résoud les problèmes de cohérences.
De manière à favorisé l'intéractivité de l'applications et ainsi fournir l'experience utilisateur la plus optimal, on constate que certaines de ces application font appels à des algorithmes qui ne respectent pas ce qu'on attendrait d'une éxécution séquentielles, pouvant ainsi menés à des incohérences dans les éxécutions.
Et infine avoir un impact sur l'experience utilisateur.
Il nous semble donc intéressant de se pencher sur l'état de la rechecrhe concernant les divers manières d'aborder ce compromis dans la gestion de la cohérence dans ce genre de systèmes. Et ainsi mettre en avant les différentes propriétés qui en résultents. L'intérét ici est de fournir une base permettant d'éclairer la prise de décision lors de l'implémentation d'un algorithme visant à satisfaire un problèmes distribué.
Ce document à était réalisé dans le cadre de mon stage de fin d'étude de Master.
L'objectif est de fournir un état de l'art de la recherches autour des différents compromis réalisables dans la gestion de la cohérence dans le contexte d'applications distribués.
Il à pour but de servir de base à un projet de thèse en CIFRE financé par l'entreprise Scille SAS, et encadré par le Laboratoire d'Informatique et Système.
\ No newline at end of file
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[affil-it]{authblk}
\usepackage{fullpage}
\usepackage{graphicx}
\usepackage{biblatex}
\addbibresource{../../recherches/Stage.bib}
\begin{document}
\title{Critères de Cohérence faible byzantine appliquée aux environements cloud}
\author{JOLY Amaury \\ \textbf{Encadrants :} GODARD Emmanuel, TRAVERS Corentin}
\affil{Aix-Marseille Université, Scille}
\date{\today}
\begin{titlepage}
\maketitle
\end{titlepage}
\begin{abstract}
lorem ipsum dolor sit amet.
\end{abstract}
\newpage
\tableofcontents
\newpage
\section{Introduction}
\input{intro/index.tex}
\section{Les critères de cohérence}
\input{consistency_criteria/index.tex}
\printbibliography
\end{document}
\ No newline at end of file
\subsection{Sécurité des Systèmes d'Information}
Ce stage à étais pour moi l'opportunité de m'intéresser à la science de l'informatique appliquée aux systèmes distribuée. J'ai pu ainsi découvrir comment mesurer la fiabilité et la cohérence dans ces systèmes, tout en en appréciant les enjeux. J'ai ainsi pu développer une sensibilité dans ma manière d'aborder les applications distribuée, me permettant d'avoir un regard plus critique sur les choix de conceptions de ces derniers.
Dans le même temps, mes contacts avec l'équipe de Scille m'ont permis de découvrir les enjeux du développement à un stade précoce d'une application orientée sécurité. Mon intégration à ce projet m'a permis de développer un réflexe critique dans la manière dont j'envisage la conception de l'éditeur collaboratif. Devant à tout pris le rendre cohérent avec le produit sur lequel il vise à être greffé.
Cela à étais aussi l'occasion pour moi de découvrir des types d'attaques particuliers et propres aux systèmes distribués, ainsi que des techniques permettant de contourner la sécurité de réseaux dans le but de réaliser des communications en pair à pair.
\subsection{Compétences transverses}
Durant ce stage, j'ai pu perfectionner ma maitrise du LaTeX et notamment la modélisation de schémas. J'ai eu à de nombreuses occasions l'opportunité de m'exprimer devant un auditoire ce qui m'a énormément apporté en aisance à l'oral et en maitrise de mon sujet.
Ayant travaillé seul en autonomie la plupart de mon temps, j'ai aussi du mettre en place une certaine rigueur et organisation autour de mon travail. Et trouver un équilibre dans l'organisation de mes tâches et de mes pauses.
\ No newline at end of file
Mon sentiment vis-à-vis de ce stage est globalement positif. J'ai pu comprendre de manière plus profonde le fonctionnement et l'organisation de la recherche en Informatique ce qui était pour moi l'objectif principal.
Je me suis pris de passion pour le sujet que j'ai eu à traiter et j'ai hâte de poursuivre mon travail dans le cadre de la thèse.
Mon intégration avec Scille est aussi très positive et je les remercie énormément pour la confiance qu'ils me portent et l'importance du rôle qu'ils me donnent. J'ai réellement le sentiment de faire partie de l'équipe et du projet et c'est quelque chose de très gratifiant.
Mes regrets vis-à-vis de ce stage porte plutôt sur le début durant lequel j'ai dû me construire un rythme qui n'a pas était évident à trouver.
Les premières semaines on était éprouvante au point de remettre en question mon engagement dans cette voie. Il m'a fallu m'approprier le sujet et gérer d'une meilleure manière mes sessions de travail avant d'arriver à m'épanouir dans ce projet.
J'aurais aussi aimé apporter une contribution plus importante à Parsec. Je trouve ne pas avoir eu le temps d'acquérir une maitrise du produit suffisante pour être pleinement capable d'y projeter mon travail.
Je suis très reconnaissant envers mes encadrants pour leurs présences et leurs bienveillances à mon égard. Ils m'on était d'une aide capitale autant vis-à-vis de mon travail que d'un point de vue personnel et c'est avec joie et confiance que je m'engage dans une thèse avec eux.
\ No newline at end of file
docs/rapport/rapport_stage/images/carte_criteres.png

159 KiB

Le stage a était réalisé dans le cadre d'une collaboration entre le LIS et l'entreprise Scille SAS. Il a pour objectif la réalisation d'un travail d'état de l'art d'un sujet au vu de son traitement dans une thèse ultérieur.
\subsection{Présentation de l'entreprise}
Scille\cite{scille} est une startup Française d'une dizaine d'employés localisée à Bordeaux et travaillant majoritairement dans une politique de télétravail.
Elle développe le produit Parsec, qui est une solution reposant sur une architecture client-serveur hébergée dans le cloud, et visant à fournir un service d'hébergement et de partage de fichier.
Parsec se démarque de ses concurrents, en proposant une solution répondant à un haut niveau de sécurité et en adoptant une approche en source ouverte, le rendant ainsi facilement auditable pour leurs clients.
Ainsi le projet s'encre dans une conception dite de zero-trust en proposant un chiffrement de bout en bout des données, rendant ainsi le serveur incapable de consulter le contenu des données qu'il stocke. Son rôle se limite donc à celui de "relai" entre les clients ainsi que de support de stockage pour le chiffré des données.
Parsec répond aux critères nécessaires à l'obtention de la certification ANSSI-CSPN-2021/08\cite{scilleCSPN}, avec pour objectif de toucher un marché d'entreprise national ayant un besoin d'échanger des fichiers répondant à des prérequis importants en termes de confidentialités tel que pour la santé, le juridique ou encore l'industrie et le militaire.
\subsection{Présentation du Sujet}
Scille souhaite développer le produit Parsec de manière à rajouter un service de suite bureautique au service principale qui est le partage de fichier.
À ce titre leur premier besoin est la réalisation d'un outil de traitement de texte.
L'objectif est de fournir une interface permettant l'édition des fichiers présents dans un espace de travail Parsec dans une approche collaborative et en conservant les propriétés de sécurité de l'application principale. C'est-à-dire en restant dans une approche zero-trust et donc chiffré de bout en bout.
Ce projet fait l'objet d'une proposition de thèse émise par Scille et encadrée par le Laboratoire d'Informatique et Système. C'est dans ce cadre que c'est effectué mon stage, qui à pour objectif principal la réalisation d'un état de l'art sur ces questions. Et comme objectif secondaire mon intégration à l'organisme finançant ma potentielle thèse.
\subsection{Bref résumé du stage}
Mon stage a débuté en avril 2023. J'ai commencé par étudier les pistes fournit par mes encadrants, dont majoritairement le livre de Mathieu Perrin \textit{Concurrence et Cohérence dans les Systèmes repartis} \cite{perrin_concurrence_2017}.
Suite à ça j'ai réalisé des recherches sur des sujets connexes, en jonglant ainsi entre lecture de la littérature scientifique et réalisation de présentations orales. Me permettant ainsi d'affiner ma compréhension et de rendre compte de mes avancements à mes encadrants.
Une fois une maitrise satisfaisante du sujet obtenu, j'ai pu commencer à essayer d'affiner le sujet potentiel de la thèse, et de réfléchir à une solution pour la problématique de Scille.
Ainsi j'ai pu étudier les preuves de concepts réalisés par les ingénieurs en internes à Scille, ainsi qu'aborder la faisabilité en identifiants les outils et algorithmes existants pouvant aider à la réalisation d'une telle application.
\ No newline at end of file
This diff is collapsed.
% makeindex style file created by the glossaries package
% for document 'main' on 2023-9-7
actual '?'
encap '|'
level '!'
quote '"'
keyword "\\glossaryentry"
preamble "\\glossarysection[\\glossarytoctitle]{\\glossarytitle}\\glossarypreamble\n\\begin{theglossary}\\glossaryheader\n"
postamble "\%\n\\end{theglossary}\\glossarypostamble\n"
group_skip "\\glsgroupskip\n"
item_0 "\%\n"
item_1 "\%\n"
item_2 "\%\n"
item_01 "\%\n"
item_x1 "\\relax \\glsresetentrylist\n"
item_12 "\%\n"
item_x2 "\\relax \\glsresetentrylist\n"
delim_0 "\{\\glossaryentrynumbers\{\\relax "
delim_1 "\{\\glossaryentrynumbers\{\\relax "
delim_2 "\{\\glossaryentrynumbers\{\\relax "
delim_t "\}\}"
delim_n "\\delimN "
delim_r "\\delimR "
headings_flag 1
heading_prefix "\\glsgroupheading\{"
heading_suffix "\}\\relax \\glsresetentrylist "
symhead_positive "glssymbols"
numhead_positive "glsnumbers"
page_compositor "."
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[affil-it]{authblk}
\usepackage{fullpage}
\usepackage{graphicx}
\usepackage{biblatex}
\addbibresource{lib.bib}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{calc}
\usetikzlibrary{arrows.meta}
\begin{document}
\title{
Rapport de Stage Master 2 FSI \\
\large Critères de Cohérence faible byzantine appliquée aux environnements cloud}
\author{JOLY Amaury \\ \textbf{Encadrants :} Godard Emmanuel, Travers Corentin}
\affil{Aix-Marseille Université, Scille}
\date{\today}
\begin{titlepage}
\maketitle
\begin{abstract}
J'ai réalisé ce stage au Laboratoire d'Informatique et Système sous l'encadrement d'Emmanuel Godard et Corentin Travers.
L'objectif à étais de fournir les bases théoriques à la réalisation d'une thèse CIFRE en collaboration entre l'entreprise Scille et le laboratoire.
La thèse à pour but d'étudier les critères de cohérence faible et d'appliquer ces recherches au développement d'une application permettant l'édition collaborative sur des documents textes sans intermédiaire de confiance.
\end{abstract}
\end{titlepage}
\tableofcontents
\newpage
\section{Présentation du Sujet}
\input{intro/index.tex}
\newpage
\section{Travail accomplit}
\input{travail/index.tex}
\newpage
\section{Acquis}
\input{acquis/index.tex}
\section{Bilan}
\input{bilan/index.tex}
\newpage
\printbibliography
\newpage
\listoffigures
\end{document}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(1)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(0)$};
\node[roundnode] (13) [right=35pt of 12] {};
\node[above] at (13.north) {$R/\{\emptyset\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(2)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{2\}$};
\node[roundnode] (23) [right=35pt of 22] {};
\node[below] at (23.south) {$R/\{\emptyset\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw (23) -- (13);
\draw[dashed] ($(13)!0.5!(12) + (0,1)$) -- ++(0, -2.9);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(0)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(1)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$I(2)$};
\node[roundnode] (15) [right=of 13] {};
\node[above] at (15.north) {$R/\{0,1,2\}$};
\node[roundnode] (16) [right=of 15] {};
\node[above] at (16.north) {$D(1)$};
\node[roundnode] (17) [right=of 16] {};
\node[above] at (17.north) {$R/\{0,2\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (15);
\draw[arrow] (15) -- (16);
\draw[arrow] (16) -- (17);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(0)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(2)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$D(1)$};
\node[roundnode] (14) [right=of 13] {};
\node[above] at (14.north) {$R/\{0,2\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (14);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(1)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{0,1,2\}$};
\node[roundnode] (23) [right=of 22] {};
\node[below] at (23.south) {$R/\{0,2\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(0)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(2)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$D(1)$};
\node[roundnode] (14) [right=of 13] {};
\node[above] at (14.north) {$R/\{0,2\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (14);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(1)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{0,1,2\}$};
\node[roundnode] (23) [right=of 22] {};
\node[below] at (23.south) {$R/\{0,2\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw[message] (21) -- ($(11)!0.5!(12)$);
\draw[message] (11) -- (21);
\draw[message] (12) -- ($(21)!0.5!(22)$);
\draw[message] (13) -- ($(22)!0.5!(23)$);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(0)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(2)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$D(1)$};
\node[roundnode] (14) [right=of 13] {};
\node[above] at (14.north) {$R/\{0,2\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (14);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(1)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{0,1,2\}$};
\node[roundnode] (23) [right=of 22] {};
\node[below] at (23.south) {$R/\{0,2\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw[message] (21) -- ($(12)!0.5!(13)$);
\draw[message] (11) -- ($(21)!0.33!(22)$);
\draw[message] (12) -- ($(21)!0.66!(22)$);
\draw[message] (13) -- ($(22)!0.5!(23)$);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(0)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$R/\{\emptyset\}$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$R/\{1\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(1)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{\emptyset\}$};
\node[roundnode] (23) [right=of 22] {};
\node[below] at (23.south) {$R/\{0\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw[message] (11) -- ($(22)!0.5!(23)$);
\draw[message] (21) -- ($(12)!0.5!(13)$);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$D(1)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(1)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$D(1)$};
\node[roundnode] (14) [right=of 13] {};
\node[above] at (14.north) {$R/\{1\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (14);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(1)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{\emptyset\}$};
\node[roundnode] (23) [right=of 22] {};
\node[below] at (23.south) {$R/\{1\}$};
\node[roundnode] (24) [right=of 23] {};
\node[below] at (24.south) {$R/\{\emptyset\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw[arrow] (23) -- (24);
\draw[message] (21) -- ($(13)!0.5!(14)$);
\draw[message] (11) -- ($(21)!0.5!(22)$);
\draw[message] (13) -- ($(23)!0.5!(24)$);
\draw[message] (12) -- ($(22)!0.5!(23)$);
\end{tikzpicture}
}
\ No newline at end of file
\resizebox{\columnwidth}{!}{
\begin{tikzpicture}[
roundnode/.style={circle, draw=black, fill=black, very thick, minimum size=1pt,},
ignorednode/.style={circle, draw=black!20, fill=black!20, very thick, minimum size=1pt,},
arrow/.style={|->, thick,},
message/.style={->, blue!50, dashed, -{Circle[length=4pt,]}},
]
\node[roundnode] (11) {};
\node[left] at (11.west) {$p_0$};
\node[above] at (11.north) {$I(O_1)$};
\node[roundnode] (12) [right=of 11] {};
\node[above] at (12.north) {$I(O_2)$};
\node[roundnode] (13) [right=of 12] {};
\node[above] at (13.north) {$I(O_3)$};
\node[roundnode] (14) [right=50pt of 13] {};
\node[above] at (14.north) {$R/\{O_0, O_1, O_2, O_3\}$};
\draw[arrow] (11) -- (12);
\draw[arrow] (12) -- (13);
\draw[arrow] (13) -- (14);
\node[roundnode] (21) [below=10pt of 11] {};
\node[left] at (21.west) {$p_1$};
\node[below] at (21.south) {$I(1)$};
\node[roundnode] (22) [right=of 21] {};
\node[below] at (22.south) {$R/\{O_0, O_1\}$};
\node[roundnode] (23) [right=of 22] {};
\node[below] at (23.south) [below=15pt] {$R/\{O_0, O_1, O_2\}$};
\node[roundnode] (24) [right=50pt of 23] {};
\node[below] at (24.south) {$R/\{O_0, O_1, O_2, O_3\}$};
\draw[arrow] (21) -- (22);
\draw[arrow] (22) -- (23);
\draw[arrow] (23) -- (24);
\draw[message] (21) -- ($(13)!0.5!(14)$);
\draw[message] (11) -- ($(21)!0.5!(22)$);
\draw[message] (13) -- ($(23)!0.5!(24)$);
\draw[message] (12) -- ($(22)!0.5!(23)$);
\end{tikzpicture}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment