UNIVERSITÀ DEGLI
STUDI DI PADOVA
Facoltà di Scienze MM.FF.NN.
Corso di Laurea Specialistica in Informatica
Tesi di Laurea:
GENERAZIONE DI GRAFI
IN BUSINESS PROCESS MANAGEMENT NOTATION
Laureanda: Contiero Erika
Relatore: prof. Massimo Marchiori
A.A. 2009/2010
Università degli Studi di Padova - LS Informatica
1. Introduzione
Pagina 2
Generazione di grafi in BPMN - Contiero Erika
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
1. Introduzione
Indice
1.
2.
3.
4.
Introduzione ...................................................................................................................................... 5
1.1.
Scopo del progetto .................................................................................................................... 5
1.2.
Struttura del documento ........................................................................................................... 6
Definizione del dominio..................................................................................................................... 7
2.1.
Il graph drawing ......................................................................................................................... 7
2.2.
Business Process Modelling Notation ....................................................................................... 8
2.2.1.
Cos’è la BPMN ....................................................................................................................... 8
2.2.2.
Le basi della BPMN ................................................................................................................ 8
2.2.3.
Usi generali della BPMN ...................................................................................................... 12
2.2.4.
Il valore aggiunto nel modellare attraverso la BPMN ......................................................... 13
Applicazione in un prodotto open source ....................................................................................... 14
3.1.
L’azienda promotrice ............................................................................................................... 14
3.2.
SpagoWorld e l’approccio open source ................................................................................... 14
3.3.
Spagic e il monitor dei processi ............................................................................................... 15
3.4.
La collocazione di questo progetto.......................................................................................... 17
Fase di analisi ................................................................................................................................... 18
4.1.
Requisiti di progetto ................................................................................................................ 19
4.2.
Confronto tra librerie............................................................................................................... 20
4.2.1.
Le librerie ............................................................................................................................. 20
4.2.2.
Librerie selezionate ............................................................................................................. 27
4.2.3.
La scelta ............................................................................................................................... 28
4.3.
5.
6.
Uso della libreria Zest .............................................................................................................. 29
4.3.1.
Struttura delle classi ............................................................................................................ 29
4.3.2.
Aspetto dei nodi .................................................................................................................. 32
Fase di progettazione ...................................................................................................................... 33
5.1.
L’algoritmo gerarchico per grafi orientati ............................................................................... 34
5.2.
Validità del grafo...................................................................................................................... 36
5.3.
Rimozione dei cicli ................................................................................................................... 36
5.4.
Assegnazione del rank ............................................................................................................. 38
5.5.
Creazione strutture virtuali ..................................................................................................... 46
5.6.
Ordinamento dei nodi nei rank ............................................................................................... 47
5.7.
Posizionamento dei nodi ......................................................................................................... 52
5.8.
Assegnazione delle coordinate ................................................................................................ 54
La libreria realizzata ......................................................................................................................... 56
6.1.
Dettagli implementativi ........................................................................................................... 56
6.2.
I risultati ottenuti ..................................................................................................................... 58
Pagina 3
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
1. Introduzione
7.
Fase di test ....................................................................................................................................... 67
8.
Tracciamento dei requisiti ............................................................................................................... 70
9.
Conclusioni ...................................................................................................................................... 72
10.
Bibliografia ....................................................................................................................................... 73
Pagina 4
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
1. Introduzione
1. Introduzione
1.1. Scopo del progetto
La Business Process Modeling Notation (BPMN) è una rappresentazione grafica per la descrizione di
processi di business come workflow. Il suo obiettivo primario è quello di fornire una notazione
standard, comprensibile per tutti gli stakeholders. La modellazione in BPMN si effettua attraverso
diagrammi o grafi, che fanno uso di elementi grafici. Lo studio affrontato riguarda la produzione di
tali diagrammi come immagini a partire dalle informazioni sugli elementi che li compongono.
In particolare, è stato oggetto di studio la generazione di un’immagine partendo dalle informazioni
su un grafo quali il numero, il tipo, la dimensione e le etichette dei nodi che lo compongono, le
immagini elementari con cui rappresentare i nodi, le transizioni tra i nodi e lo stile grafico con cui le
si vogliono rappresentate.
Tra tali informazioni non è previsto venga fornito anche il posizionamento dei nodi: quest’ultimo
deve essere calcolato in modo opportuno dalle informazioni fornite, attraverso l’utilizzo di un
algoritmo di autolayout, ovvero di un algoritmo che determini il corretto posizionamento degli
elementi grafici e dei testi che compongono il grafo, con l’obiettivo di generare un’immagine che
rappresenti un diagramma leggibile, comprensibile, ben strutturato e ordinato. È stato oggetto del
progetto quindi, anche lo studio degli algoritmi di autolayout esistenti e delle librerie che li
implementano.
Una volta esaminati gli algoritmi e la loro implementazione, è stato oggetto del progetto
l’applicazione delle soluzioni individuate allo scopo di creare una libreria Java con questa
funzionalità.
Il risultato dello studio e della creazione di una libreria con queste funzionalità troverà applicazione
come componente di Spagic, una piattaforma Free Open Source per la progettazione, lo sviluppo e
la gestione di soluzioni SOA/BPM.
Pagina 5
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
1. Introduzione
1.2. Struttura del documento
Questo documento di tesi presenta il cammino di studio che ha portato al prodotto in oggetto,
cammino sviluppato nelle seguenti sezioni.
Una sezione di definizione del dominio che illustra:
o
una panoramica sulle basi della Business Process Management Notation, notazione
sulla quale si basa la creazione di diagrammi di processo; tale panoramica è
indispensabile per iniziare a comprendere il dominio d’interesse del prodotto;
o
una breve panoramica sulla letteratura del graph drawing e sugli studi condotti fino ad
oggi su questo tema.
Una sezione che illustra il prodotto FOSS Spagic, dove trova applicazione il lavoro fatto:
o
una sezione che descrive l’azienda promotrice del progetto SpagoWorld, che ha
supportato la realizzazione di questo lavoro;
o
una descrizione della vision alla base di SpagoWorld ed il licensing dei progetti;
o
una breve descrizione del prodotto Spagic, e della Spagic Console che farà uso della
libreria realizzata in questo lavoro.
Una sezione che illustra la fase di analisi del progetto, in cui vengono illustrati i requisiti richiesti
al prodotto, seguiti dalla ricerca della libreria Java esistente che rispetti il maggior numero di
requisiti, da assumere come libreria di partenza per raggiungere gli obiettivi. Vengono illustrate
le considerazioni e le conclusioni relative a questa ricerca, e soprattutto viene illustrata la scelta
effettuata e lo studio della libreria selezionata.
Dal momento che la migliore libreria individuata è comunque mancante per quanto riguarda
l’algoritmo di autolayout opportuno per diagrammi in BPMN, è seguita (e perciò viene qui
descritta) la fase di progettazione dell’algoritmo di layout. Tale progettazione prevede vari
passi: la rimozione dei cicli del grafo, l’assegnazione del rank (o layer verticale), l’utilizzo di
catene di nodi dummy, l’ordinamento dei nodi all’interno dei rank, il posizionamento dei nodi
orizzontalmente, e infine l’assegnazione delle coordinate finali ai nodi. Per ognuno di questi
passi illustriamo lo pseudocodice che è stato poi implementato.
Infine, una sezione che descrive alcuni aspetti rilevanti dei dettagli implementativi della libreria
realizzata.
Pagina 6
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
2. Definizione del dominio
2.1. Il graph drawing
Il graph drawing affronta il problema di costruire rappresentazioni geometriche di grafi, reti e
strutture correlate. Le rappresentazioni geometriche dei grafi sono state oggetto di studio per i
matematici per secoli, per la visualizzazione o per lo studio geometrico degli stessi.
Negli anni '60 gli informatici cominciarono ad utilizzare grafi come diagrammi per una migliore
comprensione del software. L'articolo di Knuth del 1963 sui flowchart è stato probabilmente il
primo articolo che presentò un algoritmo per disegnare un grafo a scopo di visualizzazione. Oggi, la
generazione automatica di disegni di grafi trova molte applicazioni: nell'ingegneria del software,
nelle basi di dati, nei sistemi informativi, nei sistemi real-time, nei sistemi di supporto alle decisioni,
ecc.
Molti sono gli standard esistenti per disegnare i grafi, a seconda della loro applicazione, ma tutti
hanno l'obiettivo della leggibilità, ovvero di comunicare il significato informativo del grafo in modo
chiaro e rapido. Il principio della leggibilità può essere a sua volta espresso attraverso molti criteri
estetici, ne sono esempi la minimizzazione degli incroci tra archi, la planarità, la simmetria, il
corretto utilizzo dello spazio a disposizione per il layout.
Vari sono gli approcci per il layout di un grafo, ne sono alcuni esempi noti nella letteratura gli
approcci Topology-shape-metrics, Hierachical, Visibility, Argumentation, Force-Directed, Divide and
Conquer.
In particolare in questo documento andremo ad utilizzare l’approccio Hierarchical (gerarchico) che
consente di tracciare layered drawings di grafi orientati, ovvero di rappresentarli attraverso livelli.
Questo metodo è stato presentato nel 1981 da Sugiyama, Tagawa e Toda, e successivamente è
stato oggetto di numerosi miglioramenti ed ulteriori studi, nonché di moltissime implementazioni,
anche all’interno di noti prodotti proprietari per il graph drawing.
Pagina 7
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
2.2. Business Process Modelling Notation
Questa sezione ha lo scopo di fornire una panoramica di alto livello e un’introduzione alla Business
Process Modeling Notation. Si tratterà in breve il contesto e l'uso della BPMN, oltre alla notazione
di base, cioè gli oggetti grafici che compongono la notazione e come questi lavorano insieme come
parte di un Business Process Diagram. Verranno trattati gli svariati usi della BPMN, includendo
considerazioni su quanto il livello di precisione richiesto influisca sul contenuto di un diagramma e
verrà definito il valore dell’uso della BPMN come una notazione standard.
2.2.1. Cos’è la BPMN
La Business Process Management Initiative (BPMI) ha sviluppato una notazione standard detta
Business Process Modeling Notation (BPMN). Le specifiche della BPMN 1.0 sono state rilasciate nel
maggio 2004. Tali specifiche rappresentano più di due anni di lavoro da parte della Notation
Working Group. Lo scopo primario del lavoro sulla BPMN è stato di fornire una notazione
prontamente comprensibile da parte di tutti gli utenti del business, dall’analista che crea la bozza
iniziale dei processi, allo sviluppatore tecnico responsabile dell’implementazione della tecnologia
che esegue quei processi, fino agli utenti che monitorano e gestiscono tali processi. La BPMN
determina anche una soluzione standardizzata per il problema del gap tra il design dei processi e la
loro implementazione.
La BPMN definisce il concetto di Business Process Diagram (BPD), ovvero un diagramma basato su
tecniche di flowcharting, per creare modelli grafici per le operazioni dei processi di business. Un
modello di processo di business è una rete di oggetti grafici, che rappresentano attività, e controlli
di flusso che definiscono l’ordine della loro esecuzione.
2.2.2. Le basi della BPMN
Un BPD è composto da un insieme di elementi grafici. Tali elementi consentono uno sviluppo
facilitato di diagrammi semplici, il cui aspetto risulta familiare agli analisti perché basato sui
diagrammi di flusso.
Gli elementi sono stati scelti in modo da essere distinguibili tra loro e in modo che le figure
utilizzate fossero familiari alla maggior parte degli utenti. Ad esempio, le attività sono dei rettangoli
e i punti di decisione sono dei rombi.
L’enfasi è posta sulla precisa intenzione di creare un meccanismo semplice per creare modelli di
processi di business, gestendo allo stesso tempo le complessità ad essi relative. L’approccio
intrapreso per gestire entrambi questi requisiti contrastanti è stato di organizzare l’aspetto grafico
della notazione in specifiche categorie. Fornendo un insieme ristretto di categorie di notazione,
Pagina 8
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
l’utente che legge il diagramma può facilmente riconoscere i tipi base di elemento e comprendere il
significato del diagramma.
All’interno delle categorie di base degli elementi possono essere aggiunte variazioni e informazioni
ulteriori per supportare i requisiti di complessità senza dover cambiare drasticamente l’aspetto di
base del diagramma.
Le quattro categorie di base di elementi sono:
Flow Objects
Connecting Objects
Swimlanes
Artifacts
Figura 1 - Elementi di base della BPMN
(Palette di Spagic Studio)
Pagina 9
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
Flow Objects
Un BPD ha un insieme ristretto di core elements, caratteristica che consente agli utenti di non dover
imparare a riconoscere un numero eccessivo di forme diverse.
I tre oggetti di flusso sono:
Event
Un event è rappresentato da un cerchio, e rappresenta qualcosa che accade durante il corso di un
processo. Tali eventi influiscono sul flusso del processo e normalmente hanno una causa (trigger) o
un effetto (result). Ai cerchi che rappresentano gli eventi viene assegnato un nome (eventualmente
scritto all’interno) per distinguere tra loro eventi dello stesso tipo.
I tipi di eventi sono tre, e il tipo si basa su come l’evento influenza il flusso: Start, Intermediate, End.
Activity
Un’activity è rappresentata da un rettangolo con gli angoli arrotondati, e si tratta di un termine
generico con cui si definisce un lavoro da effettuare. Può essere singola o composta. I tipi di attività
sono: Task e Sub-process.
Gateway
Un gateway è rappresentato dalla ben nota forma a rombo ed è utilizzato per controllare la
divergenza o la convergenza del flusso. Perciò determinerà decisioni che biforcano il flusso in
cammini diversi, o lo riuniscono.
Connecting Objects
Le connessioni vengono utilizzate per connettere tra loro i flow objects che compongono il
diagramma, creando così la struttura scheletro del processo. Ci sono tre oggetti di connessione a
fornire questa funzione. I tre connettori sono:
Sequence Flow
Una connessione di tipo Sequence Flow è rappresentata da una linea continua, con un capo a forma
di freccia, ed è utilizzata per mostrare l’ordine con cui le attività devono essere eseguite in un
processo.
Message Flow
Una connessione di tipo Message Flow è rappresentata da una linea tratteggiata con un capo a
forma di freccia vuota all’interno, ed è utilizzato per mostrare il flusso dei messaggi tra due diversi
Process Participants, che inviano e ricevono. Nella BPMN due Pool nel diagramma rappresentano
due distinti Participants, e tra di essi possono essere scambiati messaggi.
Association
Una connessione di tipo Association è rappresentata da una linea a puntini con un capo a forma di
freccia, ed è utilizzato per associare dati, testo o altri Artifacts agli oggetti del flusso. Sono utilizzate
ad esempio per evidenziare input ed output delle attività.
Pagina 10
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
Per i designer che richiedono o desiderano un basso livello di precisione per creare modelli di
processi a scopo di documentazione o di comunicazione, i core elements e i connettori forniranno
la possibilità di creare facilmente diagrammi intuitivi.
Per i designer che richiedono un alto livello di precisione per creare modelli di processi, che saranno
oggetto di analisi dettagliate o saranno gestite da Business Process Management System (BPMS),
possono essere aggiunti dettagli agli elementi core, mostrati attraverso marcatori interni.
Swimlanes
Molte metodologie di modellazione dei processi utilizzano il concetto delle swimlanes come
meccanismo per organizzare le attività in categorie visivamente separate, e per illustrare funzioni
diverse o diverse responsabilità. La BPMN supporta il concetto delle swimlanes con due costrutti
principali. I due tipi di oggetti swimlanes dei BPD sono:
Pool
Un Pool in un processo rappresenta un Participant, un partecipante, e agisce come contenitore per
partizionare l’insieme di attività, solitamente in contesti B2B.
Lane
Una Lane è una sotto-partizione in un Pool che si estende per la sua intera lunghezza. Le Lane sono
utilizzate per organizzare e categorizzare le attività.
I Pool sono utilizzati quando un diagramma coinvolge due entità di business separate. Le attività
all’interno di un Pool sono considerate un processo. Perciò il Sequence Flow può non attraversare il
confine tra un Pool e l’altro. Il Message Flow è definito come il meccanismo che mostra la
comunicazione tra due partecipanti, e perciò può connettere due Pool o gli oggetti al loro interno.
Le Lane sono più strettamente correlate con le swimlane delle metodologie tradizionali di
modellazione. Sono spesso utilizzate per separare attività associate a funzioni specifiche o specifici
ruoli. Il Sequence Flow può attraversare i confini tra una Lane e l’altra, ma il Message Flow non
dovrebbe essere utilizzato tra Flow Objects in Lane diverse dello stesso Pool.
Artifacts
La BPMN è stata progettata per consentire a chi modella una certa flessibilità nell’estendere la
notazione di base e nel fornire l’abilità di modellare specifiche situazioni in modo appropriato. Un
qualsiasi numero di Artifacts può essere aggiunto ad un diagramma, come opportuno per il
contesto del processo che si sta modellando. I tre tipi di Artifacts predefiniti sono:
Data Objects
I Data Objects sono un meccanismo per mostrare come i dati sono richiesti o prodotti dalle attività.
Sono connessi alle attività tramite connessioni di tipo associazione.
Pagina 11
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
Groups
Un gruppo è rappresentato da un rettangolo con gli angoli arrotondati tratteggiato. Può essere
usato a scopo di documentazione o di analisi, ma non ha alcun effetto sul Sequence Flow.
Annotations
Le Annotations sono un meccanismo per fornire informazioni come testo aggiuntivo.
Chi modella può aggiungere un proprio tipo di Artifact, per aggiungere più dettagli su come il
processo è eseguito, su input e output delle attività nel processo. In ogni caso, la struttura di base
del processo rimane invariata nonostante l’aggiunta degli artifacts nel diagramma.
2.2.3. Usi generali della BPMN
La modellazione dei processi di business è usata per comunicare un’ampia quantità di informazioni
a molti tipi di utenti. La BPMN è studiata per coprire molti tipi di modellazione e permette la
creazione di segmenti di processi come anche processi end-to-end. Nella varietà di obiettivi del
process modelling ci sono due tipi base di modelli che possono essere creati con un BPD:
Collaborative (Public) B2B Processes
Internal (Private) Business Processes
Collaborative B2B Processes
Un Collaborative B2B process descrive l’interazione tra due o più entità di business. I diagrammi per
questo tipo di processi hanno generalmente un punto di vista globale, ovvero non approfondiscono
nessun partecipante in particolare, ma mostrano le interazioni tra i partecipanti. Le interazioni sono
rappresentate come una sequenza di attività e lo scambio di messaggi tra esse.
Le attività per i partecipanti possono essere considerate i loro punti di contatto, perciò, il processo
definisce l’interazione visibile al pubblico per ogni partecipante.
Quando si osserva un processo mostrato in un Pool, cioè un partecipante, il processo pubblico è
anche detto processo astratto. I processi reali, quelli interni, tipicamente conterranno più attività e
più dettagli di quanto non venga mostrato dal processo collaborativo B2B.
Internal business processes
Un processo di business interno generalmente pone il focus sul punto di vista del business di una
singola organizzazione. Sebbene i processi interni spesso mostrino le interazioni con i partecipanti
esterni, essi definiscono le attività che generalmente non sono visibili al pubblico. Se le swimlanes
sono utilizzate, allora il processo di business interno sarà contenuto in un singolo Pool. Il Sequence
Flow è perciò contenuto nel Pool e non attraversa i confini dello stesso. Il Message Flow può
Pagina 12
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
2. Definizione del dominio
attraversare i confini del Pool e mostrare le interazioni che esistono tra processi di business interni
diversi. Perciò un singolo Business Process Diagram può mostrare più processi di business private.
Diversi obiettivi – diversi livelli di precisione
La modellazione di un processo di business spesso comincia catturando le attività di alto livello e
facendo poi un’operazione di drill down verso i livelli di dettaglio in diagrammi separati. Ci possono
essere più livelli di diagramma, a seconda della metodologia usata per lo sviluppo del modello.
Comunque, la BPMN rimane indipendente da ogni metodologia di modellazione specifica.
2.2.4. Il valore aggiunto nel modellare attraverso la BPMN
Lo sviluppo della BPMN è un passo importante verso la riduzione della frammentazione che esiste a
causa della moltitudine di notazioni e di strumenti per la modellazione dei processi. Il BPMI
Notation Working Group ha sfruttato la competenza e l’esperienza con le molte notazioni esistenti
e ha cercato di consolidare le migliori idee provenineti da queste notazioni divergenti in un’unica
notazione standard. Esempi di altre notazioni o metodologie che sono state revisionate sono: UML
Activity Diagram, UML EDOC Business Processes, IDEF, ebXML BPSS, Activity-Decision Flow (ADF)
Diagram, RosettaNet, LOVeM, ed Event-Process Chains (EPCs). Questa frammentazione ha
ostacolato l’adozione diffusa dei sistemi interoperabili di business process management. Una
notazione di modellazione standard ben supportata aumenta la chiarezza tra il lato business e gli
utenti finali dell’IT.
Un altro fattore che ha guidato lo sviluppo della BPMN sta nel fatto che, storicamente, i modelli di
processi di business sviluppati dal lato business erano tecnicamente separati dalle rappresentazioni
dei processi richieste per implementarli e metterli in esecuzione. Perciò, era necessario tradurre
manualmente i modelli di processi di business originali in modelli d’esecuzione. Tali traduzioni sono
ovviamente fonte di errore e rendono difficoltosa la comprensione dell’evoluzione e delle
performance dei processi.
Pagina 13
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
3. Applicazione in un prodotto open source
3. Applicazione in un prodotto open source
3.1. L’azienda promotrice
Engineering Ingegneria Informatica S.p.A. è un’azienda di
analisi, progettazione e sviluppo software, nata nel 1980 a
Padova, e composta attualmente di 11 società operative
specializzate per segmento di mercato o per linee di business. Engineering è un player di
dimensione internazionale ed è il terzo operatore IT in Italia in software e servizi. L'offerta di
Engineering si colloca lungo l’intera catena di valore del software: consulenza, system & business
integration, servizi di outsourcing, prodotti e soluzioni verticali.
3.2. SpagoWorld e l’approccio open source
SpagoWorld è un'iniziativa di software libero e open source
promossa da Engineering Ingegneria Informatica S.p.A., i cui
progetti sono caratterizzati dalla distribuzione in licenza GNU
LGPL nella loro versione completa, facilmente adattabili alle
esigenze degli utenti perché sviluppati con approccio di
piattaforma d’integrazione, pensati per l’applicazione a livello industriale e mission-critical ma con
attenzione alla comunità di contributori del mondo accademico e della ricerca, e facenti parte di un
ecosistema del valore che ha inizio nella comunità del Consorzio OW2.
I progetti SpagoWorld appartengono alla nuova generazione di progetti open source caratterizzati
da: approccio olistico e sviluppo pianificato, progettazione complessa di soluzioni in domini verticali
per rispondere a requisiti di business, processo di sviluppo maturo, coinvolgimento di una ampia
comunità di utenti, aziende ed organizzazioni, specialisti open source, consulenti e sviluppatori, e,
infine, supporto garantito.
SpagoWorld promuove lo sviluppo sostenibile dei progetti per consentire alle aziende di conseguire
i propri obiettivi mission-critical in un quadro di affidabilità generale, garantita dalla qualità dello
sviluppo, dall'utilizzo di standard aperti e dall'innovazione. La strategia dei progetti SpagoWorld è
quella di condividere gli sviluppi con le comunità, di consolidare le soluzioni open source a livello
industriale, di stabilire partnership internazionali e di indirizzare la road-map evolutiva verso
iniziative industriali. Lo sviluppo sostenibile si basa su: visione centrata sugli obiettivi di progetto,
sviluppi evolutivi, chiaro modello di business, servizi di supporto e crescita della comunità, modello
di licenza e di sottoscrizione che sostenga un'evoluzione libera e duratura dei progetti, costi
ragionevoli per servizi di supporto efficaci.
Pagina 14
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
3. Applicazione in un prodotto open source
Quattro sono i progetti principali dell'iniziativa:
SpagoBI: la piattaforma libera per lo sviluppo di progetti di Business
Intelligence in un ambiente integrato e flessibile.
Spagic: la piattaforma libera per la governance dei servizi e lo sviluppo di
applicazioni SOA tramite la realizzazione di un Universal Middleware
altamente modulare e configurabile.
Spago4Q: la piattaforma libera per la misura, l'analisi ed il monitoraggio
della Qualità di prodotti, processi di sviluppo e servizi di gestione
software.
Spago: il Java Enterprise Wide Framework per lo sviluppo di applicazioni
web e multicanale in ambienti SOA.
3.3. Spagic e il monitor dei processi
Spagic è uno dei quattro progetti di SpagoWorld, ed
è una piattaforma libera per la governance dei
servizi
e
lo
sviluppo
di
applicazioni
SOA,
attualmente alla release 3.0.
Spagic 3 offre tutti gli strumenti a supporto della
governance di progetti SOA: tool di supporto alla
modellazione, definizione dei servizi, realizzazione
form per le attività utente, controllo del deploy,
connettori, motori di Business Process Management
BPM,
servizi
e
container
infrastrutturali
ed
ambiente di monitoraggio.
Figura 2 - Architettura di Spagic 3.0
Spagic si articola nei seguenti moduli:
Spagic Service Manager: soluzione di Universal Middleware dinamica ed adattabile, le cui
caratteristiche di modularità del modello OSGi permettono un’ampia adattabilità della soluzione in
diversi contesti, fra i quali: Enterprise Middleware, Lite Middleware, installazione dell’OSGi
container in applicativi esistenti o su sistemi specifici come il mobile o l’hardware custom.
Spagic Studio: basato su Eclipse IDE, predispone gli strumenti di progettazione, sviluppo e deploy.
Spagic Monitor: rende disponibili i servizi di management e di gestione del ciclo di vita dei singoli
moduli.
Pagina 15
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
3. Applicazione in un prodotto open source
Figura 3 a - Spagic Studio 3.0
Figura 3 b - Spagic Monitor 3.0
Pagina 16
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
3. Applicazione in un prodotto open source
Spagic Monitor rende disponibili i servizi di monitoraggio e gestione del ciclo di vita dei singoli
moduli. In particolare, tramite Spagic Monitor, è possibile fermare, mettere in pausa e fare ripartire
un servizio o processo del middleware.
Le principali funzionalità sono: monitoraggio di singoli servizi, monitoraggio per processi,
monitoraggio della piattaforma OSGi, ricerca per messaggi, ricerca per variabili o valori rilevanti,
gestione del ciclo di vita, logging.
3.4. La collocazione di questo progetto
L’attuale soluzione utilizzata dalla Spagic Console per la rappresentazione dei diagrammi di
processo e di istanze di processo è basata sull’utilizzo di immagini in formato SVG, generate da
GraphViz, un motore esterno alla suite e installato separatamente. Questo motore genera i grafi di
processo a partire dalle informazioni relative ai nodi, alla loro tipologia, e alle connessioni tra essi.
Questo motore contiene ed esegue algoritmi di autolayout dei nodi e posiziona correttamente tutti
i nodi del diagramma. Tuttavia questo motore permette una personalizzazione dell’aspetto del
diagramma molto limitata, e questo concede poco margine di miglioramento all’aspetto della
console di monitoraggio. Ad esempio ai nodi non possono essere aggiunte icone o simboli,
caratteristica particolarmente diffusa nelle console di monitoraggio di prodotti presenti nel
mercato. GraphViz, inoltre, pur essendo un prodotto Free Open Source, è rilasciato in licenza AT&T,
che impedisce l’integrazione del motore grafico nella suite di Spagic, rilasciata invece con le licenze
LGPL ed EPL. L’impossibilità di avere anche il motore di generazione dei grafi embedded in un unico
pacchetto di installazione di Spagic, costringe l’utilizzatore della Suite ad installarlo come prodotto
esterno, scaricandolo dal sito di prodotto, cosa che costituisce un disagio ulteriore, oltre a quello
della personalizzazione estetica di cui sopra.
La Console di Spagic è un’applicazione web, e perciò può essere utilizzata da un qualsiasi browser.
Un altro problema dell’attuale soluzione è relativo al supporto che i browser forniscono per il
formato SVG con cui GraphViz genera attualmente le rappresentazioni dei grafi di processo. Il
formato SVG, infatti, risulta non uniformemente supportato dai browser: mentre Mozilla Firefox lo
supporta nativamente, Internet Explorer costringe ad installare un plugin aggiuntivo.
In risposta a tali carenze e problematiche, il team di sviluppo di Spagic Monitor ha supportato la
realizzazione del progetto in oggetto a questa tesi. Chiaramente l’obiettivo è di avere un nuovo
motore di realizzazione delle immagini dei diagrammi efficace quanto quello di GraphViz, ma
realizzato come libreria Java Free Open Source in licenza compatibile LGPL od EPL, che consenta
una personalizzazione estetica più flessibile, e che generi immagini in formato nativamente
supportato dai browser più diffusi.
La libreria Java risultato del lavoro di tesi è perciò rilasciata in licenza LGPL e sarà nel prossimo
futuro integrata in Spagic, e resa quindi disponibile per la comunità scientifica.
Pagina 17
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
4. Fase di analisi
La fase di analisi è iniziata in collaborazione col team di Spagic. Innanzitutto si è considerato che il
lavoro del progetto potesse basarsi su una libreria esistente che rispettasse la maggior parte dei
requisiti richiesti, evitando di implementare tutto da zero, che sarebbe costato uno sforzo
considerevole in termini di tempo. Vista la diffusione nel mondo della comunità scientifica della
problematica del graph drawing, si è ipotizzata una certa probabilità di trovare una libreria adatta
da cui partire, da individuare attraverso un’indagine via web.
Evitare di partire da zero, oltre al vantaggio dell’efficienza nei tempi di progetto, avrebbe dato
anche un vantaggio sull’efficacia nello sfruttare l’esperienza di chi ha già affrontato problematiche
implementative del graph drawing nel realizzare una libreria.
Ovviamente il primo step per la fase di analisi è stato formalizzare le esigenze del progetto e del
team di Spagic in una lista di requisiti, da utilizzare per selezionare una libreria di partenza.
Pagina 18
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
4.1. Requisiti di progetto
Per lo sviluppo del progetto è necessario che la libreria grafica incontri il maggior numero di
requisiti tra quelli che andiamo ad elencare di seguito.
Linguaggio e sviluppo:
1. Deve essere sviluppata in Java, per consentire l’integrazione all’interno di Spagic.
2. Deve far parte di un progetto maturo, supportato e ben documentato; deve essere
rilasciata in una versione testata e stabile (non in versione alpha). Inoltre deve trattarsi di
un progetto sufficientemente valido da scongiurarne l’abbandono da parte dei developer, e
per il quale si esclude con ragionevole certezza una chiusura del codice per i rilasci futuri.
Licenza:
3. Deve essere free e open source, con una licenza compatibile con i fini dell’intero progetto
Spagic, quindi deve essere modificabile e utilizzabile a scopo commerciale. Deve avere
perciò licenza LGPL, EPL, o compatibile con queste.
Funzionalità:
4. Deve essere in grado di rappresentare grafi, più in particolare BPD, permettendo la
rappresentazione di tutte le parti che ne compongono la struttura: nodi e archi, con le
etichette testuali.
5. Nella rappresentazione dei nodi deve essere prevista anche l’informazione visuale: per i
nodi devono essere specificabili forma, dimensione, colorazione ed immagine contenuta,
mentre per gli archi è gradito che sia specificabile lo stile.
6. Deve essere possibile esportare il grafo rappresentato sottoforma di immagine
bidimensionale, in formato JPEG o PNG.
7. Deve essere implementato nella libreria un algoritmo di autolayout, che generi layout
verticali (ed eventualmente anche layout orizzontali), in grado di disporre in modo ordinato
i nodi, affinché il diagramma risulti leggibile e dall’aspetto gradevole.
8. Deve presentare le funzionalità ai punti 6 e 7, ma in passaggi distinti, in modo che
rimangano disponibili le coordinate dei vertici generate dall’algoritmo di layout
indipendentemente dall’esportazione del grafo come immagine, per poter utilizzare tali
coordinate per la creazione di mappe via CSS.
9. Non deve precludere la possibilità che l’immagine del diagramma dell’istanza di processo
venga creata dinamicamente piuttosto che essere creata una volta soltanto e poi
personalizzata attraverso l’uso di fogli di stile.
Pagina 19
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
4.2. Confronto tra librerie
Questa sezione illustra una descrizione dei risultati della ricerca di librerie grafiche, svolta allo
scopo di selezionare la libreria che incontra il maggior numero di requisiti per lo svolgimento del
progetto.
Di ogni libreria verranno perciò descritti alcuni aspetti rilevanti ai fini della valutazione della stessa.
Da questa indagine sono stati esclusi tutti i prodotti proprietari, a pagamento e/o a codice chiuso,
perché completamente avulsi dagli obiettivi del progetto. Sebbene non citati in questo documento,
tali prodotti proprietari sono stati comunque osservati nelle loro caratteristiche pubblicizzate, per
conoscenza e per trarre spunto per creare un prodotto migliore nell’ambito di questo progetto.
4.2.1. Le librerie
Di seguito andiamo ad elencare le librerie incontrate durante la ricerca e illustriamo l’eventuale
match con i requisiti di cui alla sezione precedente. Indichiamo in corsivo i requisiti per i quali non
viene trovato match e che potranno portare ad escludere la libreria in esame dall’essere candidata
all’uso nel proseguimento del progetto. In presenza di requisiti rilevanti non soddisfatti può essere
omessa l’analisi dei rimanenti requisiti. Il match con alcuni requisiti può essere omesso anche nel
caso in cui per accertarlo sia richiesta un’analisi molto approfondita della libreria, non adatta ad
una fase di panoramica sulle librerie.
GINY Graph INterface librarY – 1.1
csbi.sourceforge.net - 2005
Si propone come libreria per la rappresentazione e la visualizzazione di grafi, sviluppata ispirandosi
alle librerie e ai prodotti preesistenti col proposito di sopperire alle mancanze di questi.
Match con i requisiti:
1. Libreria Java.
2. Sufficientemente documentata, rilasciata in versione beta.
3. Licenza LGPL.
4. Consente la rappresentazione di nodi, archi, etichette.
5. Le possibilità di dettagliare la visualizzazione grafica sono da verificare.
6. Non ancora trovato un metodo che consenta esportazione del grafo come immagine.
7. Alcuni algoritmi di layout implementati, molti di essi fanno parte della libreria JUNG.
Pagina 20
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
TouchGraph GraphLayout – 1.22
touchgraph.sourceforge.net - 2002
Fornisce un insieme di interfacce per la visualizzazione di grafi, utilizzando algoritmi force-based per
il layout e tecniche di focus+context.
Match con i requisiti:
1. Libreria Java.
2. Progetto non documentato, abbandonato dagli sviluppatori.
3. Licenza Apache Software License, compatibile LGPL.
JgraphT – 0.8
www.jgrapht.org - 2008
JGraphT è una libreria di classi Java open-source, che fornisce oggetti della teoria matematica dei
grafi, e algoritmi sui grafi. È stata progettata per essere ottimizzata anche per grafi con molti nodi.
Consente di attribuire ai nodi del grafo un qualsiasi oggetto.
Match con i requisiti:
1. Libreria Java.
2. Progetto recente e ancora attivo, fornisce javadoc ma non manuali.
3. GNU Library or Lesser General Public License (LGPL).
4. 5. 6. 7. Si basa su Jgraph per la rappresentazione dei grafi e loro visualizzazione.
Jgraph – 5.12.2.1
www.jgraph.com - 2008
JGraph è una libreria Java per la rappresentazione di grafi, open-source, potente, di semplice
utilizzo, e ricca di funzionalità.
Match con i requisiti:
1. Libreria Java.
2. Progetto stabile, ben documentato. Tuttavia, si tratta di una versione “lite” di un prodotto
proprietario, il quale fornisce anche gli algoritmi di autolayout; questo affiancamento
suggerisce un ragionevole dubbio sul fatto che il codice della versione lite rimanga aperto
anche nei rilasci futuri e continui ad essere supportato dagli sviluppatori.
3. GNU Library or Lesser General Public License (LGPL).
4. In grado di rappresentare ogni parte della struttura di un grafo.
Pagina 21
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
5. È possibile inserire dentro ad ogni nodo un’immagine, è possibile scegliere lo stile degli
archi, e utilizzare etichette per nodi e archi.
6. Consente l'esportazione del grafo realizzato come immagine jpeg o png.
7. Algoritmi di autolayout del grafo sono inclusi solo nella versione a pagamento e a codice
chiuso.
GVF - The Graph Visualization Framework – 1.36
gvf.sourceforge.net - 2004
Graph Visualization Framework è un insieme di due package Java che possono essere utilizzati
come fondamento per applicazioni che manipolano o visualizzano strutture a grafo. “Royere” è
costruito su GVF è include supporto XML, output SVG, layout, e l’editing dei grafi.
Match con i requisiti:
1. Libreria Java.
2. Progetto stabile e ben documentato.
3. GNU General Public License (GPL), incompatibile LGPL
JUNG Java Universal Network/Graph – 2.0
jung.sourceforge.net - 2009
JUNG è una libreria per la modellazione, l’analisi, e la visualizzazione di dati che possono essere
rappresentati come grafi o reti.
È progettata per supportare un’ampia varietà di rappresentazioni di entità e loro relazioni, come
grafi orientati e semplici, con archi paralleli, o grafi iperbolici. Consente il collegamento dei nodi a
metadati, e fornisce algoritmi di teoria dei grafi, analisi statistiche, e altre misure importanti.
Fornisce alcuni algoritmi di layout e consente di crearne di aggiuntivi.
Match con i requisiti:
1. Libreria Java.
2. Progetto stabile e ancora attivo, ma documentato in modo incompleto.
3. BSD License, compatibile LGPL.
4. In grado di rappresentare nodi e archi di un grafo.
5. Consente l’uso di immagini come shape dei nodi, l’aspetto estetico della visualizzazione di
archi rimane da verificare.
6. Contiene un metodo rudimentale per l’esportazione del grafo come immagine.
Pagina 22
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
7. È fornito di alcuni algoritmi di layout, tra i quali però non vi è il layout gerarchico tipico dei
diagrammi workflow in BPMN.
HyperGraph – 0.6.3
hypergraph.sourceforge.net - 2005
HyperGraph è un progetto open source che fornisce codice java per lavorare con la geometria
iperbolica e specialmente con alberi iperbolici, per la visualizzazione e il layout di questi.
Match con i requisiti:
1. Libreria Java.
2. Abbastanza documentato e stabile.
3. GNU Library or Lesser General Public License (LGPL).
4. In grado di rappresentare nodi e archi di un grafo.
5. Incentrato sulla visualizzazione di grafi che rappresentano reti, non offre la possibilità di
rappresentare i nodi con immagini.
JDigraph – 0.9
jdigraph.dev.java.net - 2005
JDigraph è una libreria per rappresentare e lavorare con i grafi orientati e con i cammini.
Match con i requisiti:
1. Libreria Java.
2. Progetto poco documentato, in versione alpha.
3. Berkeley Software Distribution (BSD) License.
4. Consente la rappresentazione di nodi e archi.
5. Si appoggia a Graphviz per il rendering degli aspetti estetici, e perciò risulta insufficiente.
VRLM Graph – 1.0
vrmlgraph.i-scream.org.uk - 2001
Virtual Reality Modeling Language graph è un package Java completo di codice sorgente per creare
rappresentazioni di grafi in 3 dimensioni.
Match con i requisiti:
1. Libreria Java.
2. Dotato solo di Javadoc.
Pagina 23
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
3. GNU Library or Lesser General Public License (LGPL).
4. Consente di rappresentare nodi e archi.
5. Incentrato sul rendering 3d in formato VRML, non consente l’utilizzo degli aspetti estetici
tipici di un diagramma in BPMN.
graphopt graph layout optimizer – 0.4.1
www.schmuhl.org/graphopt - 2003
Nasce per sopperire alle lacune delle librerie disponibili per l’ottimizzazione del layout dei grafi,
attraverso l’uso di algoritmi basati sulla fisica.
Match con i requisiti:
1. Libreria C++.
2. Poco documentato
3. GNU General Public License (GPL), incompatibile LGPL.
JGraphEd – 1.21
www.jharris.ca/JGraphEd/ - 2004
Si tratta di una libreria Java per l’editing di grafi. È pensata per consentire all’utente di creare
facilmente grafi dalla GUI, e comprende un insieme di algoritmi per la gestione dei grafi.
Match con i requisiti:
1. Libreria Java.
2. Ben documentata.
3. Licenza personale dell’autore non compatibile con progetti a scopo commerciale.
VGJ Visualizing Graphs with Java – 1.03
www.eng.auburn.edu/csse/research/graph_drawing/manual/vgj_manual.html - 2002
Visualizing Graphs with Java (VGJ) è uno strumento per la rappresentazione e il layout dei grafi. Il
grafo può essere dato in input come una descrizione testuale in formato GML (graph modeling
language) oppure disegnato utilizzando l’editor. Fornisce tre algoritmi di layout per disporre il grafo
in modo organizzato.
Match con i requisiti:
1. Libreria Java.
2. Sufficientemente documentato.
Pagina 24
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
3. GNU General Public License, Version 2, incompatibile LGPL.
GUESS Graph Exploration System – 1.0.3
www.graphexploration.org - 2007
GUESS Graph Exploration System, è un sistema per la visualizzazione e la manipolazione di strutture
a grafo e per la creazione di nuove applicazioni di visualizzazione. Fa uso di JUNG al suo interno.
Match con i requisiti:
1. Libreria Java con utilizzo di una estensione di Python.
2. beta release, supportato e documentato.
3. GNU General Public License (GPL), incompatibile LGPL.
The prefuse visualization toolkit – 20071021
prefuse.org - 2007
Strumento software per la costruzione di applicazioni per la visualizzazione di informazioni. Prefuse
supporta un ricco set di caratteristiche per il data modelling, la visualizzazione, l’animazione e
l’interazione, sia per Java che per Flash (prefuse flare). Fornisce strutture dati ottimizzate per grafi
e alberi, molte tecniche di layout e visualizzazione. È scritto in Java, utilizzando la libreria grafica
Java 2D e si integra facilmente in applicazioni Java Swing o web applets.
Match con i requisiti:
1. Libreria Java.
2. beta release, progetto recente, documentazione molto incompleta.
3. BSD license, consente scopi commerciali.
4. Attraverso la galleria degli esempi si nota come sia in grado di rappresentare tutte le parti
dei diagrammi: nodi, archi, etichette.
5. 6. 7. A causa della scarsa documentazione, resta da verificare il match con le altre
funzionalità richieste.
Zest: The Eclipse Visualization Toolkit – 3.5.0
www.eclipse.org/gef/zest/ - 2009
Zest è un insieme di componenti di visualizzazione per Eclipse. L’intera libreria è stata sviluppata in
SWT / Draw2D. Il progetto Zest contiene un package di layout per i grafi.
Questa libreria è utilizzabile anche indipendentemente da Eclipse.
Pagina 25
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
È stata realizzata in un progetto la funzionalità che lega il linguaggio DOT di Graphviz con Zest, sia
DOT to Zest, che consente di rappresentare in Zest un grafo descritto in linguaggio DOT, sia Zest to
DOT, che consente di tradurre in linguaggio DOT per Graphviz un grafo rappresentato con oggetti
delle classi di Zest.
Per i nostri scopi risulta vantaggiosa la possibilità di passare a Zest un grafo descritto in linguaggio
DOT, perché questa libreria lo rappresenti attraverso oggetti e lo visualizzi con caratteristiche
estetiche di cui è fornita. Tuttavia i creatori di questo progetto prevedono il passaggio da Zest a
linguaggio DOT e poi l’uso di Graphviz per l’esportazione del grafo come immagine, mentre
l’esportazione diretta da Zest è una milestone ancora da completare.
Esiste inoltre un progetto basato su Zest che consente l’input di un grafo in formato GraphML.
GraphML è un formato XML-based che consente di descrivere le principali caratteristiche di un
grafo. Non è prevista da questo formato la dichiarazione delle coordinate di un nodo e del
posizionamento degli archi, perciò per includere questa informazione nel file graphml si dovrebbe
definire un nuovo tag; questo perché il layout del grafo è comunemente espresso nei fogli di stile
XSL, usati per la trasformazione XSLT del file graphml per esempio in un file SVG che presenti anche
le coordinate per i nodi (file XSL che realizzino una presentazione del grafo con assegnamento
automatico delle coordinate sono difficilmente reperibili).
Tuttavia, questo progetto non aggiunge a Zest nulla quanto ad algoritmi di autolayout e funzionalità
di visualizzazione: il suo uso prevede l’importazione di un grafo in formato graphml e quindi l’uso
degli algoritmi forniti da Zest.
Match con i requisiti:
1. Libreria Java, utilizzabile anche indipendentemente da Eclipse.
2. Progetto stabile ma scarsamente documentato. Essendo un plugin di Eclipse open, con
un’ampia community che lo utilizza, è ragionevole supporre che in futuro il codice rimanga
open; essendo un plugin apprezzato dalla comunità di utenti di Eclipse si può prevedere
che non verrà abbandonato dai developer, i quali sono attualmente alla ricerca di
miglioramenti per questo plugin.
3. Eclipse Public License (EPL).
4. In grado di rappresentare ogni parte della struttura di un grafo.
5. È possibile inserire dentro ad ogni nodo un’immagine, è possibile scegliere lo stile degli
archi, e utilizzare etichette per nodi e archi.
6. Consente la visualizzazione del grafo su finestra; la possibilità di esportare come immagine
potrebbe basarsi esclusivamente sulla realizzazione di uno screenshot di tale finestra;
l’analisi di questa possibilità si svolgerà nel seguito di questo documento.
Pagina 26
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
7. Algoritmi di autolayout del grafo sono inclusi, ma non consentono di realizzare il layout
gerarchico di un diagramma workflow.
8. Le coordinate calcolate da qualsiasi algoritmo di layout della libreria vanno a settare dei
campi dati dell’oggetto che rappresenta il nodo del grafo e sono accedibili da metodi di get.
9. La generazione dinamica del diagramma è una possibilità che non viene preclusa dall’uso di
questa libreria.
4.2.2. Librerie selezionate
Nella fase di ricerca delle librerie che più si avvicinano ai requisiti stabiliti, è stato rilevato che i
prodotti esistenti con caratteristiche perfettamente aderenti allo scopo del progetto sono prodotti
proprietari, con codice chiuso, e licenza a pagamento, che in questo documento non vengono citati
perché la loro licenza li rende completamente discordanti con lo scopo della ricerca e del progetto
stesso.
D’altra parte, anche molti dei prodotti sviluppati in ambito accademico e scientifico non incontrano
i requisiti a causa della licenza, perché rilasciati in licenza GPL, che forza il prodotto a restare aperto
e non prevedere scopi commerciali.
Le librerie selezionate sono comunque general purpose, e consentono la rappresentazione di grafi,
e non sono ad hoc per la rappresentazione di diagrammi workflow in BPMN.
Le librerie che maggiormente si avvicinano agli scopi del progetto sono:
GINY Graph INterface librarY – 1.1
di cui restano da accertare le funzionalità per i dettagli estetici dei grafi e a cui mancano gli
algoritmi di layout per diagrammi workflow;
JUNG Java Universal Network/Graph – 2.0
di cui è da valutare la possibilità d’uso vista la carenza di documentazione e a cui mancano gli
algoritmi di layout per diagrammi workflow;
Jgraph – 5.12.2.1
a cui mancano gli algoritmi di layout, e di cui non costituisce fattore di preferenza il fatto che si
tratti di un prodotto “lite” affiancato ad una versione “pro” a codice chiuso in un’ottica di rilasci
futuri a codice aperto;
Zest: The Eclipse Visualization Toolkit – 3.5.0
di cui va approfondita la funzionalità di esportazione dell’immagine e a cui mancano gli algoritmi di
layout per diagrammi workflow.
Pagina 27
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
4.2.3. La scelta
Trattandosi in ogni caso di librerie prive di algoritmi di autolayout per diagrammi workflow, la scelta
si è basata su altre caratteristiche. In particolare, si è considerato fondamentale il futuro dello
sviluppo della libreria da parte dei suoi developer: si è considerato necessario che il progetto
rimanga free e open source, manutenuto dai developer, e utilizzato dalla comunità, in modo che il
progetto per il quale la libreria viene usata possa evolvere anche attraverso gli aggiornamenti e i
miglioramenti di questa libreria.
La libreria che più avvicina questo principio è “Zest: The Eclipse Visualization Toolkit”, e visto che
presenta carenze equivalenti rispetto alle altre librerie osservate, ci apprestiamo ad effettuarne
uno studio più approfondito, al fine di controllare il funzionamento dell’esportazione
dell’immagine, appurare la possibilità di inserirvi un nuovo algoritmo di layout adatto ai diagrammi
workflow BPD, nonché a delineare la rappresentazione e l’uso delle strutture dati appartenenti al
grafo con cui sopperire alla totale mancanza di documentazione.
Figura 4 - Screenshot di Zest
Pagina 28
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
4.3. Uso della libreria Zest
In questa sezione verrà descritto l’approfondimento sulla libreria grafica scelta in seguito alla fase
di ricerca e valutazione, ovvero la libreria “Zest: The Eclipse Visualization Toolkit”, che costituisce
un plugin per Eclipse per la visualizzazione e manipolazione dei grafi all’interno dell’IDE di sviluppo.
In particolare verrà svolto uno studio più approfondito sulle funzionalità di Zest indispensabili alla
realizzazione del progetto: verrà studiata la possibilità di esportare l’immagine, la possibilità di
costruirvi sopra un nuovo algoritmo di layout gerarchico, adatto ai diagrammi workflow, e verranno
delineati la rappresentazione e l’uso delle strutture dati appartenenti al grafo per sopperire alla
mancanza di documentazione.
Da questo punto del percorso del nostro progetto comincia ad essere indispensabile l’utilizzo dello
strumento Eclipse come IDE di sviluppo, dove importare i jar della libreria di Zest e delle sottostanti
SWT e draw2d, includendo anche il codice sorgente, e tutti gli snippet disponibili, che costituiscono
un ottimo modo per essere iniziati all’uso di una libreria.
In particolare è stato utile uno strumento aggiuntivo, AmaterasUML, un plugin di Eclipse free e
open source che consente di disegnare diagrammi delle classi in notazione UML in Eclipse, ma
anche di ottenere automaticamente il class diagram di classi esistenti attraverso il solo
trascinamento dei file .java sulla finestra del plugin.
4.3.1. Struttura delle classi
Package org.eclipse.zest.core.widgets
La classe al centro di questa libreria è la classe Graph, che, ovviamente rappresenta l’intero grafo.
Un oggetto Graph contiene una lista di nodi e una lista di connessioni, rispettivamente di tipo
GraphNode e GraphConnection. Contiene inoltre un campo dati di tipo LayoutAlgorithm. La classe
Graph presenta tutti i metodi di get and set necessari, e in particolare presenta il metodo
getNodes() con cui è possibile avere accesso ai nodi per ottenere le coordinate a cui sono stati
posizionati dall’algoritmo. Al costruttore di un oggetto Graph va passato un oggetto di tipo
org.eclipse.swt.widgets.Shell, su cui il grafo viene tracciato.
La classe GraphNode rappresenta i nodi del grafo. Contiene le informazioni sull’aspetto del nodo,
quali: colore di primo piano, colore in secondo piano, colore e spessore del bordo, colore di
evidenziazione, dimensione, font per l’etichetta, visibilità, ecc. Testo dell’etichetta e immagine per
il nodo sono registrate presso l’oggetto Item, poiché GraphNode è l’ultima classe di una gerarchia
che eredita dalle classi della libreria grafica swt (Widget, Item, GraphItem, GraphNode).
Ogni nodo GraphNode contiene una lista di connessioni GraphConnection di cui è destinazione, e
una lista di connessioni di cui è sorgente.
Pagina 29
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
Alla creazione del nodo, il costruttore richiede come primo parametro il grafo per il quale lo si crea;
tale informazione verrà salvata in un campo dati dell’oggetto, e verrà richiamato un metodo del
grafo per l’aggiunta del nodo creato nella lista dei nodi.
L’informazione relativa al posizionamento del nodo nel grafo è mantenuta nel campo dati
currentPosition di tipo org.eclipse.draw2d.geometry.Point.
Il campo dati di tipo layoutEntity è la parte di questo oggetto che viene interessata dall’algoritmo di
layout. org.eclipse.zest.layouts.LayoutEntity è in realtà un interfaccia, e tale campo dati sarà
inizializzato con un oggetto LayoutGraphNode, classe che implementa LayoutEntity. Vedremo in
seguito più chiaramente i dettagli dell’uso degli algoritmi di layout.
La classe GraphConnection rappresenta gli archi del grafo. In modo abbastanza coerente con la
struttura della classe GraphNode, essa contiene le informazioni sull’aspetto della connessione,
quali: colore, stile, spessore, curvatura, evidenziazione, visibilità , ecc. Ha un campo dati di tipo
org.eclipse.draw2d.Label per l’etichetta. Ogni connessione GraphConnection ha un riferimento al
GraphNode sorgente e a quello destinazione, e, come per i nodi, mantiene un riferimento anche al
grafo per il quale è stata creata, richiesto dal costruttore, che invocherà un metodo per registrare la
connessione creata sia nella lista delle connessioni entranti del nodo destinazione, sia nella lista
delle connessioni uscenti del nodo sorgente, sia nella lista di connessioni del grafo.
Come GraphNode, ha un campo dati di tipo org.eclipse.zest.layouts.LayoutRelationship
(interfaccia), che verrà inizializzato con un oggetto GraphLayoutConnection, oggetto utilizzato dagli
algoritmi di layout.
Figura 5 - Principali campi dati e metodi delle classi di org.eclipse.zest.core.widgets
Pagina 30
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
Package org.eclipse.zest.layouts
Per applicare un layout è necessario invocare sull’oggetto Graph il metodo setLayoutAlgorithm(…)
che prende come parametro un oggetto di tipo LayoutAlgorithm, e un boolean che se true indica
che il layout va applicato, altrimenti che il layout è stato solo settato ma l’effettiva applicazione è
rimandata. Questo metodo setta il campo dati di Graph, e se il boolean è true invoca applyLayout().
Quest’ultimo effettua un controllo sulla visibilità della finestra del grafo, e solo nel caso in cui essa
sia visualizzata, invoca l’esecuzione asincrona del metodo applyLayoutInternal(). Quest’ultimo
effettua alcuni controlli e impostazioni, quindi va a recuperare dal grafo i nodi e le connessioni di
cui fare il layout: prende dai nodi il loro campo LayoutEntity, e dalle connessioni il loro campo
LayoutRelationship, ed è qui che si nota come questi campi dati siano l’ “interfaccia” delle strutture
GraphNode e GraphConnection verso il layouting. Dopo aver popolato un array di LayoutEntity e
uno di LayoutRelationship (controllando per ogni connessione che esistano i nodi sorgente e
destinazione), invoca sul campo dati layoutAlgorithm il metodo che avvierà l’algoritmo:
applyLayout(LayoutEntity*+ entitiesToLayout, LayoutRelationship*+ relationshipsToConsider, …).
In cima alla gerarchia di classi per il layout troviamo l'interfaccia LayoutAlgorithm, che impone di
implementare il metodo applyLayout(…). Ad implementare questa interfaccia troviamo la classe
astratta AbstractLayoutAlgorithm; questa implementa applyLayout(...), invocando al suo interno il
metodo setupLayout(...), che crea un InternalNode per ogni LayoutEntity, e un InternalRelationship
per ogni LayoutRelationship.
Gli algoritmi di layout, infatti, operano su una struttura nodo e una struttura connessione “interne”,
appositamente create per il layout: InternalNode e InternalRelationship. InternalNode contiene
molti campi dati per memorizzare le coordinate del nodo in più momenti, mentre
InternalRelationship contiene l’informazione sui punti di curvatura dell’arco.
Ogni InternalNode ha un campo dati entity di tipo LayoutEntity, così come ogni InternalRelationship
ha un campo dati externalRelationship di tipo LayoutRelationship, con cui viene mantenuto un
collegamento con i nodi “esterni” e con le connessioni “esterne” (ovvero con le strutture dati di cui
alla sezione precedente), e che permetteranno alla fine del calcolo di rendere visibili le coordinate
calcolate a livello esterno.
Creati da setupLayout(…) un array di InternalNodes e uno di InternalRelationship, si hanno pronte le
strutture dati su cui far lavorare il calcolo, con cui vengono settati i campi dati internalNodes e
internalRelationships
dell’oggetto
algoritmo,
quindi
viene
invocato
il
metodo
applyLayoutInternal(InternalNodes*+ nodes, InternalRelationship*+ relationships, …).
Ogni sottoclasse di AbstractLayoutAlgorithm deve implementare applyLayoutInternal(…), metodo
in cui è svolto il calcolo effettivo delle coordinate.
Pagina 31
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
4. Fase di analisi
Le coordinate calcolate, come già accennato, vengono memorizzate nei campi dati double degli
internalNodes, ma alla fine del calcolo è necessario che con tali coordinate venga settata la
currentLocation
del
GraphNode.
AbstractLayoutAlgorithm
deve
Per
fare
invocare
questo,
dentro
ogni
classe
che
applyLayoutInternal(…)
implementa
il
metodo
updateLayoutLocations(InternalNode[] nodes), che, attraverso alcune invocazioni di metodi, si
occupa
di
settare
la
currentLocation
del
GraphNode.
In
alternativa
all’uso
di
updateLayoutLocations(…) è possibile andare ad invocare direttamente sulle entity il metodo
setLocationInLayout( double x, double y ) con cui andrà settata la currentPosition del GraphNode
esterno corrispondente.
I layout disponibili
Osservando il package org.eclipse.zest.layouts.algorithm, si è posta una particolare attenzione agli
algoritmi di layout implementati.
Nel sito web di progetto si trovano dichiarati i seguenti algoritmi di layout: Spring Layout Algorithm,
Tree Layout Algorithm, Radial Layout Algorithm, Grid Layout Algorithm, mentre nel package, oltre a
questi appena citati, si trova anche implementato DirectedGraphLayoutAlgorithm. Leggendo i
commenti al codice sorgente e osservando il codice stesso, sembrava trattarsi di
un’implementazione di un algoritmo gerarchico. Questo ha introdotto nel progetto una fase non
prevista: il test di questo algoritmo per verificare se fosse adatto agli scopi di questo progetto.
Tuttavia, i test, eseguiti anche dal team di Spagic, hanno rilevato le pessime performance
dell’algoritmo in termini di efficacia, e questa fase di test si è conclusa molto velocemente e senza
alcuna variazione al proseguimento del progetto.
4.3.2. Aspetto dei nodi
Un’osservazione più approfondita della libreria ha rivelato che le possibilità di personalizzare
l’aspetto dei nodi utilizzando i classici GraphNode sono limitate. In particolare, la struttura delle
classi nodo non mette a disposizione immediatamente la possibilità di scegliere una forma
particolare per il nodo. La shape di ogni nodo è un rounded rectangle e non c’è modo di creare un
GraphNode specificando una shape diversa (ad esempio un cerchio o un poligono). GraphNode
consente solamente di specificare un’immagine da inserire all’interno del rounded rectangle,
accanto all’etichetta.
Molti bug sono stati aperti a causa di questa grave carenza, e per il loro fixing è stata creata la
classe CGraphNode. Questa è una sottoclasse di GraphNode, dotata di un costruttore a cui passare
una org.eclipse.draw2d.IFigure che verrà utilizzata per il nodo. Tuttavia l’utilizzo di un CGraphNode
non consente di specificare da costruttore una stringa da apporre sul nodo, e sarà competenza del
metodo che costruisce la figura apporvi una label.
Pagina 32
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5. Fase di progettazione
Come già anticipato, la libreria Zest, su cui si appoggia l’intero progetto, manca di alcune
funzionalità che andavano quindi progettate, implementate e testate. Citiamo in questa sezione la
progettazione della funzionalità di autolayout, che è stata implementata utilizzando le classi di Zest
per la rappresentazione dei grafi, dei nodi e delle connessioni. Alla sezione successiva verranno
citati alcuni dettagli relativi alle altre funzionalità, di cui è più interessante vedere il lato
implementativo.
La progettazione dell’algoritmo di autolayout ha visto innanzitutto la scelta di una possibile
implementazione dell’algoritmo di Sugiyama, tra le tante realizzate. La scelta di una
implementazione doveva essere guidata da motivazioni sull’efficacia e sull’efficienza della stessa,
perciò, qualunque testo o articolo si fosse seguito per implementare, sarebbe stato essenziale
avere in anticipo una certa “garanzia” di affidabilità dell’implementazione, e di aderenza agli scopi
di questo progetto. Difficilmente si trovano articoli che descrivano una implementazione
dell’algoritmo di Sugiyama che siano anche accompagnati da codice sorgente che un utilizzatore
possa testare per verificarne i risultati sui grafi del proprio progetto.
Una soluzione a questo problema era costituita dallo stesso GraphViz.
Il sito di progetto di GraphViz mette a disposizione un articolo che descrive lo pseudocodice seguito
per implementare l’algoritmo gerarchico per grafi orientati, e contemporaneamente mette a
disposizione lo strumento di GraphViz stesso, con cui se ne può testare l’esecuzione sui propri grafi
di test. In particolare nel caso di questo progetto abbiamo già i grafi di test generati da GraphViz:
sono i grafi attualmente in uso nella Console. Inoltre è a disposizione lo strumento di Gvedit per
editare nuovi grafi in linguaggio dot e ottenerne la visualizzazione attraverso il motore dot di
GraphViz.
I difetti estetici di tali grafi sono quelli discussi nella sezione 3.4, tuttavia il layout gerarchico di
GraphViz è corretto e gradevole, e perciò è stato concordato con il team di Spagic che questo fosse
l’algoritmo di appoggio per la nostra implementazione.
Nei prossimi paragrafi di questa sezione descriviamo la progettazione del nostro algoritmo, basata
sull’algoritmo gerarchico di GraphViz.
L’intero algoritmo è stato sviluppato all’interno di una nuova classe java SugiyamaLayoutAlgorithm,
provvista di metodi per ognuno dei passi dell’algoritmo, e facente uso di nuove classi per un più
agevole accesso alla struttura del grafo, come ad esempio la classe Rank.
Pagina 33
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.1. L’algoritmo gerarchico per grafi orientati
In questa sezione illustriamo la progettazione dei passi dell’algoritmo di layout che è stato
successivamente implementato in Java. La teoria di questo algoritmo si basa fondamentalmente
sulla letteratura esistente sugli algoritmi gerarchici, e in particolare sull’algoritmo con cui opera il
motore di GraphViz.
Per tracciare il digrafo è d’aiuto supporre che abbia una determinata direzione globale del flusso,
per esempio dall’alto verso il basso. Sulla base di questo presupposto, sono stati formulati molti
metodi per tracciare digrafi, basati sui seguenti criteri estetici:
1. Mostrare la struttura gerarchica del grafo, cercando di dirigere gli archi nella stessa direzione
generale, evidenziando così i nodi sorgente e i nodi destinazione.
2. Evitare anomalie nella visualizzazione che non favoriscono la comprensione del grafo, come ad
esempio l’incrocio di archi.
3. Miminizzare la lunghezza degli archi, in modo che i nodi correlati siano facilmente identificabili.
4. Favorire la simmetria e il bilanciamento.
Non c’è modo di ottimizzare simultaneamente secondo tutti questi criteri.
Perciò faremo alcune supposizioni di semplificazione, e considereremo delle euristiche che
eseguono rapidamente producendo dei buoni risultati nei casi comuni. Per un’indagine su altri
principi estetici, consigliamo di consultare gli algoritmi di graph-drawing di Eades e Tamassia. Il
layout del grafo sarà guidato dai criteri che abbiamo menzionato, e segue l’approccio di Warfield e
Sugiyama.
G=(V,E)
V = { 1, 2, 3, 4, 5, 6, 7, 8 , 9, 10, 11}
E = { (1,2) , (2,3) , (3,2) ,
(3,4) , (3,5) , (3,6) ,
(4,7) , (5,8) , (6,9) ,
(7,10) , (8,10) , (9,10) ,
(10,11) , (11,1) }
x
Sugiyama
Automatic
Layout
Algorithm
y
Figura 6 - Input e output dell'algoritmo
L’input dell’algoritmo è un grafo G = ( V, E ), che deve essere non vuoto, connesso, privo di nodi
isolati, privo di cappi e archi multipli e può contenere cicli. Le caratteristiche che abbiamo appena
elencato sono proprie dei grafi di processo che andiamo a rappresentare, perciò non costituiscono
un limite. L’algoritmo assegna ad ogni nodo le coordinate x e y, che si riferiscono al vertice in alto a
sinistra dell’immagine del nodo, e assegna ad ogni arco una serie di punti di curvatura attraverso i
quali deve essere condotto, calcolati in modo che l’arco non attraversi dei nodi.
Pagina 34
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Panoramica
L’algoritmo di graph drawing si compone di quattro passi principali ed altri passi che costituiscono
operazioni di supporto, che illustriamo di seguito.
L’intera esecuzione dell’algoritmo è sottoposta alla condizione di validità del grafo: come già
anticipato, deve essere non vuoto, connesso, privo di nodi isolati, privo di cappi e archi multipli. Se
tali condizioni sono rispettate, vengono eseguiti i seguenti passi:
Il primo passo rende aciclico il grafo, in modo temporaneo, per l’esecuzione dell’algoritmo.
Il secondo passo dispone i nodi in rank, ovvero in livelli verticali.
Il terzo passo è di preparazione per quelli successivi: crea infatti delle catene di nodi dummy
con cui sostituire gli archi di lunghezza non unitaria, allo scopo di condurre opportunamente gli
archi attraverso i rank, senza sovrapposizione con i nodi. In corrispondenza a questo passo si
trova in seguito nell’algoritmo un altro passo che ripristina gli archi originali.
Il quarto passo determina l’ordine dei nodi all’interno di ogni rank, in modo che vengano evitati
gli incroci di archi.
Il quinto passo individua la corretta posizione del nodo nella disposizione orizzontale del rank;
questo passaggio diverge dalle scelte progettuali e implementative di GraphViz ed è stato
ideato ad hoc.
Il sesto passo individua le coordinate da assegnare ai nodi; anche questo passaggio diverge
dalle scelte progettuali e implementative di GraphViz ed è stato ideato ad hoc.
1. public boolean run() {
2.
if( validGraph()) {
3.
breakCycles();
4.
rank();
5.
createVirtualStructures();
6.
order();
7.
position();
8.
assignCoordinates();
9.
hideVirtualStructures();
10.
return true;
11.
}
12. }
Figura 7 - L'algoritmo principale
Nelle prossime sezioni illustreremo i passi più nel dettaglio. In particolare descriveremo un modo
efficiente per effettuare il ranking dei nodi usando l’algoritmo del simplesso su reti, e una buona
euristica per ridurre gli incroci tra archi.
Pagina 35
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.2. Validità del grafo
Il controllo di validità del grafo prevede il controllo dei singoli casi di non validità.
Citiamo in questa sezione solamente il controllo relativo al fatto che il grafo sia connesso, mentre
gli altri controlli sono semplici e facilmente implementabili grazie alle strutture messe a
disposizione da Graph, GraphNode e GraphConnection di Zest.
Per controllare che il grafo sia connesso abbiamo utilizzato una ricerca in profondità, allo scopo di
verificare se con una sola invocazione della ricerca da un nodo qualsiasi del grafo venissero visitati
tanti nodi quanta è la cardinalità di V.
5.3. Rimozione dei cicli
Per poter avere un’assegnazione dei rank consistente, il grafo deve essere privo di cicli. Siccome il
grafo in input può contenere cicli, un passo di preprocessing deve individuarli e romperli attraverso
l’inversione di alcuni archi.
Ovviamente tali archi sono invertiti sono internamente, le frecce nel disegno finale manterranno la
medesima direzione assegnata inizialmente alla creazione del grafo.
Una procedura utile per rompere i cicli è bastata sulla ricerca in profondità. Gli archi vengono
percorsi nell’ordine naturale del grafo in input, partendo da un nodo sorgente o destinazione.
1. breakCycles() {
2.
setAllWhite();
3.
dfsFindCycles(node);
4.
reverseFeedbackArcs();
5. }
Figura 8 - Progettazione di breakCycles
La ricerca in profondità viene svolta con la ben nota tecnica della colorazione dei nodi: ogni nodo
inizialmente è bianco, poi viene colorato di grigio appena viene visitato, e infine viene colorato di
nero quando terminano le chiamate ricorsive sui suoi discendenti. Quando, osservando i
discendenti di un nodo, si incontra un nodo grigio, l’arco appena percorso è di feedback. Tutti gli
archi di feedback rilevati vengono salvati in una lista, e verranno infine invertiti logicamente,
scambiando sorgente e destinazione. Ovviamente a questo passaggio di inversione deve
corrispondere un passaggio di ripristino da utilizzare al termine dell’algoritmo.
È da notare che l’inversione di un arco può provocare la creazione di un arco multiplo, nel caso in
cui già esistesse un arco opposto tra gli stessi due nodi. In quel caso è necessaria la temporanea
rimozione dell’arco di feedback.
Pagina 36
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
breakcycle
rank
Figura 9 - Esempio
dell'effetto di breakcycle su un
grafo con due archi di
feedback
Vediamo brevemente la teoria che sta dietro a questo uso della ricerca in profondità.
La ricerca in profondità ha l’effetto di partizionare gli archi in due insiemi: archi d’albero e archi non
d’albero. L’albero definisce un ordine parziale sui nodi. Dato questo ordine parziale, gli archi non
d’albero possono essere ulteriormente partizionati in tre insiemi: cross, forward, back. Il primo
insieme contiene gli archi che connettono nodi non correlati nell’ordine parziale. Il secondo
contiene gli archi che connettono un nodo con un discendente. Il terzo insieme contiene gli archi
che connettono un discendente con uno dei suoi antenati. Risulta chiaro che aggiungere archi di
tipo forward o cross all’ordine parziale non crea cicli, mentre gli archi di tipo back sono quelli che
determinano i cicli. Siccome l’inversione degli archi di tipo back li rende archi di tipo forward, tutti i
cicli vengono spezzati attraverso questa procedura.
Ovviamente è ragionevole invertire un insieme di archi minimo, il più piccolo possibile. Una
difficoltà sta nel fatto che trovare l’insieme minino nel problema dell’ “insieme di archi di feedback”
è un problema NP-completo. E, fatto più importante, determinare esattamente l’insieme minimo
probabilmente non migliorerebbe il disegno del grafo.
Esperimenti hanno dimostrato come molti grafi orientati che provengono da applicazioni pratiche
abbiano una naturale direzione degli archi anche quando contengono dei cicli. L’input del grafo
normalmente riflette questa direzione naturale. Invertire l’arco sbagliato può compromettere il
disegno del grafo. Ad esempio, anche se il grafo di una invocazione ad una procedura ha dei cicli, ci
si aspetta di trovare le funzioni top-level nella parte alta del grafo, non in altri punti.
Dal punto di vista della stabilità, l’euristica della ricerca in profondità per la rottura dei cicli sembra
preferibile. Ottiene disegni di grafi più informativi di quelli che si ottengono con altre euristiche
come quella che suggerisce di collassare in un singolo nodo tutti i nodi che fanno parte di un ciclo,
oppure quella che posiziona tutti i nodi del ciclo sullo stesso rank, oppure quella che duplica uno
dei nodi del ciclo, come suggeriscono vari ricercatori come Carpano, Robbins e Sugiyama.
Pagina 37
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.4. Assegnazione del rank
Questo passo dell’algoritmo assegna ad ogni nodo v V del grafo G = ( V, E ), un valore intero (v),
consistente con gli archi relativi al nodo v: per ogni arco e = ( v, w ), appartenente ad E, l(e) >= (e)
dove la lunghezza l(e) di un arco e = ( v, w ) è definita come l(w) - l(v), e (e) rappresenta una soglia
di lunghezza minima. (e) di norma è 1 ma può eventualmente assumere anche un altro valore
intero positivo.
rank
0
1
2
createVirtualStructures
3
4
5
6
Figura 10 - Esempio dell'effetto di rank
Definizione del problema
Secondo uno dei principi estetici che abbiamo citato, gli archi devono essere corti. Oltre al fatto di
creare layout migliori, gli archi corti riducono il tempo d’esecuzione dei passi successivi il cui tempo
dipende dalla lunghezza totale degli archi. Perciò è desiderabile trovare un ranking ottimale dei
nodi, cioè uno per cui la lunghezza totale degli archi pesati sia minima.
Trovare un ranking ottimo può essere formulato come il seguente problema di programmazione
intera:
La funzione peso
e la funzione di lunghezza minima
mappano l’insieme degli archi E
rispettivamente in numeri razionali non negativi e interi non negativi.
Ci sono vari metodi per risolvere questo problema di programmazione intera in tempo polinomiale.
Un metodo consiste nel risolvere l’equivalente problema di programmazione lineare, e poi
trasformare la soluzione in una intera in tempo polinomiale.
Pagina 38
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Un altro metodo consiste nel convertire il problema dell’assegnazione ottima dei rank
nell’equivalente problema di flusso di costo minimo, per il quale esistono algoritmi di complessità
polinomiale in tempo. Siccome la matrice dei vincoli è totalmente unimodulare, il problema può
anche essere risolto col metodo del simplesso, benchè non necessariamente in tempo polinomiale.
Simplesso su reti
Descriviamo ora un semplice approccio al problema, basato sulla formulazione del simplesso su
reti. Nonostante non sia stato provato che la sua complessità in tempo sia polinomiale, nella pratica
impiega poche iterazioni ed esegue rapidamente.
Iniziamo con alcune definizioni ed osservazioni.
Un ranking è detto feasible (fattibile) quando soddisfa i vincoli sulla lunghezza l(e) ≥ (e) per ogni
arco e. Dato un ranking, non necessariamente feasible, definiamo lo slack di un arco come la
differenza tra la sua lunghezza e la sua lunghezza minima. Perciò un ranking è feasible se per ogni
arco lo slack è non negativo. Un arco si dice tight (stretto) se lo slack è zero.
Un albero di copertura di un grafo induce un ranking, o una famiglia di ranking equivalenti. L’albero
di copertura si individua sul grafo non direzionato e privo di radice.
Questo ranking è generato scegliendo un nodo iniziale e assegnandogli un rank. Poi, per ogni nodo
adiacente nell’albero di copertura, gli si assegna un rank incrementato o decrementato della
minima lunghezza dell’arco che li connette, a seconda che il nodo sia la testa o la coda dell’arco.
Questo procedimento viene iterato finchè tutti i nodi hanno un rank assegnato.
Un albero di copertura si dice feasible se induce un ranking feasible. Per costruzione, tutti gli archi
nell’albero feasible sono stretti.
Dato un albero di copertura feasible, possiamo associare ad ogni arco d’albero un valore intero di
cut (taglio), nel modo seguente. Se quell’arco viene rimosso l’albero si spezza in due componenti
connesse, la componente di coda (contenente il nodo alla coda dell’arco) e la componente di testa
(contenente il nodo alla testa dell’arco). Il valore di cut è definito come la differenza tra la somma
dei pesi di tutti gli archi dalla componente di coda a quella di testa (compresi gli archi d’albero), e la
somma dei pesi di tutti gli archi dalla componente di testa a quella di coda (compresi gli archi
d’albero).
Pagina 39
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Tipicamente (ma non nei casi degeneri) un valore di cut negativo indica che la somma delle
lunghezze degli archi pesati può essere ridotta allungando l’arco d’albero il più possibile finchè non
diventa stretto uno degli archi dalla componente di testa alla componente di coda.
Questo corrisponde a rimpiazzare l’arco d’albero nell’albero di copertura con il nuovo arco stretto,
ottenendo un nuovo albero di copertura.
Si nota facilmente che un ranking ottimo può essere usato per generare un altro ranking ottimo,
indotto da un albero di copertura feasible. Queste osservazioni sono la chiave per risolvere il
problema del ranking in un contesto grafico piuttosto che algebrico.
Gli archi d’albero con valori di cut negativi sono rimpiazzati da opportuni archi non d’albero, finchè
tutti gli archi d’albero hanno valori di cut non negativi.
Ogni implementazione di questa procedura deve utilizzare una tecnica per garantire che il
procedimento termini, ma questo non si è mai rivelato necessario nella pratica.
L’albero di copertura risultante corrisponde al ranking ottimale. Per ulteriori dettagli sulla
terminazione dell’algoritmo del simplesso e sull’ottimalità del risultato, si faccia riferimento alla
letteratura (Chvatal, Cunningham, Gansner).
Pagina 40
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Progettazione di dettaglio di rank
1. rank() {
2.
feasibleTree();
3.
while( go ) {
4.
e = leaveEdge();
5.
if( e != null ) {
6.
f = enterEdge(e);
7.
exchange(e,f);
8.
}
9.
else go = false;
10.
}
11.
normalize();
12.
TBbalance();
13.
14.
fillRankStructure();
15. }
Figura 11 - Progettazione del ranking
La funzione feasibleTree costruisce un albero di copertura feasible iniziale. Questa procedura è
descritta più dettagliatamente in seguito. Il metodo del simplesso inizia con una soluzione feasible
e mantiene questa invariante.
leaveEdge ritorna un arco d’albero con un valore di cut negativo, oppure null se non ce ne sono e la
soluzione ottima è stata raggiunta. Un qualsiasi arco con un valore di cut negativo può essere
selezionato per la rimozione.
enterEdge individua un arco non d’albero per rimpiazzare e. Questo si fa spezzando l’arco e, che
divide l’albero nelle componenti connesse di testa e di coda. Tutti gli archi dalla componente di
testa a quella di coda vengono considerati, e quello con lo slack minimo viene selezionato. Questo
mantiene l’albero feasible.
In exchange gli archi vengono scambiati, aggiornando l’albero e i suoi valori di cut.
In normalize la soluzione viene normalizzata settando il rank minimo a zero.
In TBbalance i nodi che hanno i pesi degli archi entranti e uscenti uguali e più rank feasible vengono
spostati ad un rank feasible con il minor numero di nodi. Lo scopo è di ridurre l’affollamento dei
nodi e migliorare l’aspetto del disegno, secondo i principi già citati inizialmente. Queste operazioni
non cambiano il costo dell’assegnazione del rank. I nodi vengono gestiti con euristica greedy, il cui
funzionamento è sufficientemente buono.
Prima di passare allo step successivo è necessario che i nodi vengano salvati in una struttura dati
apposita per consentirne una gestione più comoda. A questo scopo l’algoritmo si dota di una lista di
Rank, oggetti al cui interno vengono salvati l’intero che identifica il livello e la lista dei nodi che vi
sono stati assegnati.
Pagina 41
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Progettazione di dettaglio di feasibleTree
1. feasibleTree() {
2.
initRank();
3.
while (tightTree() < |V|) {
4.
e = a non-tree edge incident on the tree
5.
with a minimal amount of slack;
6.
delta = slack(e);
7.
if (incident node is e.head) delta = -delta;
8.
for v in Tree { v.rank = v.rank + delta; }
9.
}
10.
initCutvalues();
11. }
Figura 12 - Progettazione di feasibleTree
initRank calcola un ranking iniziale feasible. Questa versione tiene i nodi in una coda. I nodi
vengono inseriti nella coda quando hanno tutti gli archi entranti analizzati dall’algoritmo. Quando
un nodo viene rimosso dalla coda, gli viene assegnato il più piccolo rank che soddisfi i suoi archi
entranti, e i suoi archi uscenti devono essere analizzati. Nel caso più semplice in cui
= 1 per tutti
gli archi, ovvero il caso che andremo ad implementare, questo corrisponde a vedere il grafo come
un poset e ad assegnare l’elemento minimo al rank 0. Questi nodi vengono rimossi dal poset e il
nuovo insieme di elementi minimi vengono assegnati al rank 1, ecc.
tightTree individua un albero massimale di archi stretti, contenenti alcuni nodi fissati e ritorna il
numero di nodi nell’albero. Si noti che un albero massimale come questo è un albero di copertura
per il sottografo indotto dai nodi raggiungibili dal nodo fissato nel grafo non direzionato
sottostante, usando solo gli archi stretti. In particolare, tutti questi alberi hanno lo stesso numero di
nodi.
La porzione di codice dalla riga 4 alla 8 in figura individua un arco ad un nodo non d’albero, che sia
adiacente all’albero, e adatta il rank dei nodi d’albero per rendere questo arco stretto. Siccome
l’arco è scelto avendo lo slack minimo, il ranking risultante è ancora feasible. Perciò ad ogni
iterazione, l’albero guadagna almeno un nodo, e l’algoritmo alla fine termina con un albero di
copertura feasible. Questa tecnica è essenzialmente quella descritta da Sugiyama.
initCutvalues calcola i valori di cut per gli archi d’albero. Per ogni arco d’albero questo viene
calcolato marcando i nodi come appartenenti alla componente di coda o di testa, e poi calcolando
la somma dei pesi col segno di tutti gli archi le cui testa e coda si trovino in componenti diverse, con
segno negativo per gli archi che vanno dalla componente di testa a quella di coda.
Pagina 42
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Un piccolo esempio di esecuzione dell’algoritmo di simplesso su reti è mostrato nella figura
sottostante.
Figura 13 - (a) e (b) - Verso un feasibleTree
Gli archi non d’albero sono tratteggiati e tutti gli archi hanno peso 1. Nella figura (a) mostriamo il
grafo dopo il ranking iniziale, con i valori di cut indicati. Ad esempio, il valore di cut dell’arco (g, h) è
-1, e corrisponde al peso dell’arco (g, h) (dalla componente di coda alla componente di testa) meno
il peso dell’arco (a, e) e (a, f) (dalla componente di testa a quella di coda). Nella figura (b), l’arco (g,
h) con un valore di cut negativo è stato rimpiazzato con un arco non d’albero (a, e), con i nuovi
valori di cut indicati. Siccome sono tutti non-negativi, la soluzione è ottima e l’algoritmo termina.
Dettagli implementativi
L’algoritmo del simplesso su reti e i risultati delle sue applicazioni sono ben noti e nella letteratura
si trovano studi che aiutano a metterne a punto l’implementazione (Chvatal).
Facciamo notare alcuni specifici dettagli implementativi che sono stati messi in pratica nella nostra
implementazione. Si tratta di ottimizzazioni utili, che diventano indispensabili qualora
un’implementazione debba essere applicata a grafi di dimensioni maggiori.
Il calcolo dell’albero feasible iniziale e dei valori di cut iniziali spesso occupa una parte significativa
del costo dell’intero algoritmo del simplesso su reti. Per molti grafi, nella pratica, la soluzione
iniziale è molto vicina alla soluzione ottima, perciò sono richieste poche iterazioni per raggiungere
la soluzione finale.
Pagina 43
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Nella più semplice implementazione, i valori di cut iniziali possono essere trovati prendendo uno ad
uno ogni arco d’albero, spezzandolo, etichettando ogni nodo a seconda che appartenga alla
componente di testa o a quella di coda, e calcolando la somma. Questo procedimento ha costo
O(VE).
Per ridurre questo costo, notiamo che i valori di cut possono essere calcolati usando informazioni
locali ad ogni arco se la ricerca è ordinata dalle foglie dell’albero feasible verso l’interno.
È banale il calcolo dei valori di cut di un arco d’albero con un capo in una foglia dell’albero, poiché o
la componente di testa o la componente di coda consistono di un solo nodo.
Poi, assumendo che i valori di cut siano noti per tutti gli archi incidenti in un dato nodo tranne uno,
il valore di cut dell’arco rimanente sarà la somma dei valori di cut noti più un termine che dipende
solamente dagli archi incidenti nel nodo dato.
Illustriamo questo calcolo nella figura seguente nel caso in cui due archi d’albero, con valori di cut
noti, si connettono ad un terzo, con l’orientamento mostrato in figura. Gli altri casi vengono gestiti
in modo simile.
Figura 14 - Calcolo dei valori di cut
Assumiamo che i valori di cut di (u, v) e (v, w) siano noti. Gli archi etichettati con lettere maiuscole
rappresentano l’insieme di tutti gli archi non d’albero con la direzione data e le cui teste e code
appartengono alle componenti mostrate.
I valori di cut di (u, v) e (v, w) sono dati rispettivamente da:
c(u,w) = (u,w) + A +C + F - B - E -D
e
c(v,w) = (v,w) + L + I +D -K - J -C
Il valore di cut dell’arco (w,x) è quindi
c(w,x) = (w,x) +G -H + A - B + L -K
= (w,x) +G -H + (c(u,w) - (u,w) -C - F + E +D) + (c(v,w) - (v,w) - I -D + J +C)
= (w,x) +G -H + c(u,w) - (u,w) + c(v,w) - (v,w) - F + E - I + J
Pagina 44
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
un’espressione che coinvolge solo informazioni locali all’arco e valori di cut noti. Perciò calcolando i
valori di cut in modo incrementale, possiamo assicurare che ogni arco verrà esaminato solo due
volte, e questo riduce fortemente il tempo speso nel calcolo dei valori di cut iniziali.
Un’altra importante ottimizzazione, simile alla tecnica descritta da Chvatal, consiste nell’eseguire
un attraversamento dell’albero in postorder, partendo da un nodo radice fissato vroot, ed
etichettando ogni nodo v con il suo numero di attraversamento in postorder lim(v), con il numero
low(v) che è il più piccolo numero dei discendenti nella ricerca, e con l’arco parent(v) da cui il nodo
è stato raggiunto (figura seguente).
Figura 15 - Attraversamento in postorder con i nodi etichettati con (low,lim).
Questo ci fornisce un modo poco costoso per testare se un nodo giace nella componente di testa o
di coda in un arco d’albero, e se un arco non d’albero va da una componente all’altra. Per esempio
se e = (u, v) è un arco d’albero e vroot è nella componente di testa dell’arco (cioè lim(u) < lim(v))
allora un nodo w è nella componente di coda se e solo se low(u) ≤ lim(w) ≤ lim(u).
Questi numeri sono utilizzati anche per aggiornare l’albero in modo efficiente durante le iterazioni
dell’algoritmo del simplesso. Se f = (w, x) è l’arco entrante, i soli archi di cui vanno aggiornati i valori
di cut sono quelli nel percorso che connette w a x nell’albero. Questo percorso si determina
seguendo gli archi parent all’indietro da w a x finchè non si raggiunge l’ultimo antenato comune,
cioè il primo nodo l tale che low(l) ≤ lim(w) e lim(x) ≤ lim(l). Ovviamente questi parametri di
postorder devono essere aggiornati anche quando gli archi d’albero vengono scambiati, ma solo
per i nodi sotto il nodo l.
Il simplesso su reti è anche molto sensibile alla scelta dell’arco negativo da rimpiazzare. Si è
osservato che ricercando ciclicamente tra tutti gli archi d’albero, piuttosto che cercare dall’inizio
della lista degli archi d’albero ogni volta, permette di evitare molte iterazioni.
Pagina 45
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.5. Creazione strutture virtuali
Dopo l’assegnazione dei rank, gli archi che attraversano più di un livello vengono rimpiazzati con
catene di archi di lunghezza unitaria mediante l’uso di nodi virtuali. I nodi virtuali vengono collocati
nei rank intermedi, convertendo il grafo originale in un grafo i cui archi connettono solo nodi in
rank adiacenti. Questo perché da qui in poi non sarà sufficiente ordinare e gestire i nodi nei rank,
bensì sarà necessario considerare e gestire anche i punti di passaggio di un arco.
createVirtualStructure
0
0
1
1
2
2
3
3
4
4
5
5
6
6
order
Figura 16 - Esempio dell'effetto di CreateVirtualStructures
Per fare questo innanzitutto si localizzano nel grafo tutti gli archi di lunghezza non unitaria, quindi,
partendo dalla sorgente, fino ad arrivare alla destinazione, si creano man mano i nodi dummy, o
nodi virtuali, e le connessioni virtuali che li concatenano. I nodi e le connessioni create devono
essere marcate come virtuali per essere distinguibili dalle strutture originali del grafo. Le
connessioni originali nella nostra implementazione vengono solo “staccate” dalla sorgente e dalla
destinazione, e salvate in una lista, che consentirà alla fine il ripristino delle stesse. Nessuna
attenzione è richiesta per l’estetica del nodo e della connessione virtuale, essendo strutture
destinate ad essere utilizzate solo temporaneamente o in fase di test e debug del codice. L’unica
caratteristica che può essere utile a fini di debug è l’assegnazione di un nome identificativo univoco
per il nodo virtuale. A questo passaggio di creazione, ovviamente, corrisponde il passaggio inverso
di rimozione. Nel passaggio di ripristino degli archi lunghi originali, tuttavia, è necessaria una
procedura che conduca tali archi esattamente attraverso le coordinate prima occupate dai nodi
virtuali. I nodi dummy costituiscono, infatti, i punti di svolta o di curvatura degli archi lunghi da
ripristinare. Si individuano nel grafo, una ad una, le catene di nodi virtuali e percorrendo ognuna di
esse si salva una lista di punti di curvatura corrispondenti ai centri dei nodi virtuali; per ognuna di
esse viene quindi recuperata la connessione originale, e ad essa viene assegnato il router creato su
quei punti di curvatura.
Pagina 46
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.6. Ordinamento dei nodi nei rank
L’ordine dei nodi all’interno dei rank determina gli incroci tra archi nel layout, perciò un buon
ordinamento sarà quello con pochi incroci di archi. L’uso di euristiche è necessario poiché la
minimizzazione degli incroci tra archi nei layout di grafi con rank è un problema NP-completo,
anche per due soli rank (Eades, McKay e Wormald).
Numerose euristiche importanti per ridurre gli incroci tra archi nei grafi con rank sono basate sul
seguente schema suggerito da Warfield. Viene calcolato un ordine iniziale all’interno di ogni rank.
Poi viene eseguita una sequenza di iterazioni per migliorare gli ordinamenti. Ogni iterazione
attraversa il grafo dal primo rank all’ultimo, o viceversa. Quando un rank viene visitato, ad ognuno
dei suoi nodi viene assegnato un peso basato sulla posizione relativa dei nodi adiacenti nel rank
precedente. Quindi i nodi vengono riordinati in base a tali pesi.
order
0
0
1
1
2
2
3
3
4
4
5
5
6
6
position
Figura 17 - Esempio dell'effetto di order
Due metodi comuni per l’assegnazione dei pesi ai nodi sono la funzione baricentro (Sugiyama) e la
funzione mediana (Eades, Wormald).
Supponiamo che v sia un nodo e P sia la lista delle posizioni dei nodi a lui adiacenti nel rank
precedente. Notiamo che la posizione di un nodo adiacente è nient’altro che il numero ordinale
nell’ordine corrente.
Il metodo del baricentro definisce il peso del nodo v come la media degli elementi in P. Il metodo
della mediana definisce il peso del nodo v come la mediana degli elementi in P. Quando il numero
degli elementi in P è pari, ci sono due mediane, e questo dà luogo a due metodi della mediana,
quello che sceglie sempre la mediana di sinistra e quello che sceglie sempre la mediana di destra.
Pagina 47
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Il metodo della mediana ha performance migliori del metodo del baricentro e ha un leggero
vantaggio teorico, dal momento che Eades e Wormald hanno mostrato che il layout con il metodo
della mediana di un grafo di due livelli ha non più di tre volte il minimo numero di incroci d’archi.
Nessun limite simile è noto per il metodo del baricentro.
L’euristica qui utilizzata per l’ordinamento dei nodi è un raffinamento del metodo della mediana,
con due innovazioni. La prima consiste nel fatto che, in presenza di due valori di mediana, usiamo
un valore interpolato che dipende dal lato in cui i nodi sono più concentrati. Il secondo
miglioramento usa un’euristica aggiuntiva che riduce gli incroci ovvi dopo che i vertici sono stati
ordinati, trasformando un dato ordinamento in uno localmente ottimo rispetto alla trasposizione di
vertici adiacenti. Questo comporta una riduzione degli incroci del 20-50% in più.
Per statistiche più dettagliate, far riferimento all’articolo di Gansner.
Pagina 48
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Progettazione di dettaglio di order
1. order() {
2.
initOrder();
3.
for i = 0 to maxIterations {
4.
int oldCrossing = crossing();
5.
saveOrders();
6.
wmedian(i);
7.
transpose();
8.
if( oldCrossing < newCrossing ) {
9.
restoreOrders();
10.
}
11.
}
12. }
Figura 18 - Progettazione di order
initOrder inizialmente ordina i nodi in ogni rank. Questo può essere fatto con una ricerca in
ampiezza o in profondità nel grafo, partendo dai nodi del rank minimo. Qui scegliamo
l’implementazione con la ricerca in profondità. Ai vertici sono assegnate le posizioni nei rispettivi
rank in ordine da sinistra a destra man mano che la ricerca avanza. Questa strategia assicura che
l’ordine iniziale di un albero non abbia alcun incrocio. Questo è importante perché tali incroci sono
ovvi e si possono evitare facilmente.
maxIterations è il numero minimo di iterazioni, settato, nel nostro caso, a 24. Ad ogni iterazione,
viene innanzitutto calcolato il numero di crossing, e l’ordine viene salvato prima di essere
modificato dall’interazione corrente; se il numero di incroci non diminuisce, l’ordine precedente
viene ripristinato. In generale un’implementazione può anche avvalersi di una strategia adattativa
che itera finchè la soluzione non viene migliorata almeno di una certa percentuale rispetto alle
iterazioni precedenti.
wmedian riordina i nodi dentro ogni rank, basandosi sull’euristica della mediana pesata.
transpose scambia ripetutamente nodi adiacenti sullo stesso rank se questo comporta una
diminuzione del numero di incroci. Di queste funzioni diamo una descrizione più dettagliata qui di
seguito.
Progettazione di dettaglio di median e medianValue
L’euristica della mediana pesata viene mostrata nella figura che segue. A seconda della parità del
numero dell’iterazione corrente, i rank sono attraversati dall’alto verso il basso o dal basso verso
l’alto. Presentiamo qui una sola delle due direzioni poiché l’altra è analoga.
Pagina 49
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
1. wmedian(iter) {
2.
if( iter % 2 == 0 ) {
3.
for r = 1 to maxRank {
4.
for node in rank r
5.
median = medianValue(node, i-1);
6.
node.setMedian(median);
7.
sort(r, median);
8.
}
9.
else {…}
10. }
Figura 19 - Progettazione di wmedian
Nell’attraversamento dei rank in avanti, il ciclo principale parte dal rank 1 e termina al rank
massimo. Ad ogni rank ai nodi viene assegnata una mediana basata sui vertici adiacenti del rank
precedente. Poi i vertici nel rank vengono ordinati in base ai valori di mediana. Si deve fare una
considerazione importante sulla gestione dei vertici che non hanno adiacenti nel rank precedente:
in questa implementazione tali vertici vengono fissati a sinistra dei rimanenti vertici.
1. medianValue(v, adjRank) {
2.
P = adjPosition(v, adjRank);
3.
m = |P| / 2;
4.
if |P| = 0
5.
return -1;
6.
if |P| % 2 == 1
7.
return P[m];
8.
if |P| == 2
9.
return (P[0] + P[1])/2;
10.
else {
11.
left = P[m-1] - P[0];
12.
right = P[|P|-1] - P[m];
13.
return (P[m-1]*right + P[m]*left)/(left+right);
14.
}
15. }
Figura 20 - Progettazione di medianValue
Il valore di mediana di un nodo è definito come la posizione mediana dei vertici adiacenti nel rank
indicato, se unicamente determinata. Altrimenti è l’interpolazione tra le due posizioni mediane.
Generalmente la mediana pesata dipende dal lato in cui i nodi sono più concentrati.
La funzione adjPosition ritorna un array ordinato delle posizioni attuali dei nodi adiacenti a v nel
dato rank adiacente.
Ai nodi privi di adiacenti viene assegnato il valore di mediana -1. Questo viene usato nella funzione
di ordinamento per indicare che questi nodi devono essere posizionati a sinistra.
Pagina 50
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
Progettazione di dettaglio di transpose
La figura seguente mostra l’euristica di trasposizione.
1. transpose()
2.
improved = true;
3.
while (improved) {
4.
improved = false;
5.
for r = 0 to maxRank {
6.
for i = 0 to |r|-2 {
7.
v = r.nodes.get(i);
8.
w = r.nodes.get(i+1);
9.
int crossBefore = crossing();
10.
exchangeOrders(rank,v,w);
11.
int crossAfter = crossing();
9.
if crossAfter < crossBefore
10.
improved = true;
11.
else
11.
exchangeOrders(rank,v,w);
12.
}
13.
}
14.
}
15. }
Figura 21 - Progettazione di traspose
Il ciclo principale itera finchè il numero di incroci tra archi può essere ridotto da trasposizioni. Come
nel ciclo della funzione di ordinamento, si può eventualmente applicare una strategia adattativa
per terminare il ciclo una volta che il miglioramento sia una certa percentuale del numero di
incroci.
Ogni coppia di vertici adiacenti viene esaminata. La funzione crossing conta il numero di incroci,
dapprima con v che appare alla sinistra di w in quel rank, poi con v che appare alla destra di w in
quel rank; se si è avuto un miglioramento si mantiene quell’ordinamento per quei due nodi,
altrimenti si ripristina il loro ordine iniziale.
Quando si ordinano i nodi in base alla mediana e si effettua una trasposizione tra nodi adiacenti,
può verificarsi l’uguaglianza nel confronto tra mediane o tra numero di incroci di archi. È stato
ritenuto utile invertire i nodi con valori uguali durante l’ordinamento o i passi di trasposizione, sia
negli attraversamenti in avanti che all’indietro.
Un punto che val la pena di sottolineare è la possibilità di eseguire l’algoritmo di ordinamento dei
nodi due volte: una che inizia dai nodi del rank minimo e ricerca sugli archi uscenti, una che inizia
dai nodi del rank massimo e ricerca usando gli archi entranti. Questo permette di scegliere al
termine la migliore tra le due soluzioni.
Pagina 51
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.7. Posizionamento dei nodi
Una volta ottenuto un ordinamento corretto all’interno dei rank, è necessario individuare qual è la
corretta posizione dei nodi. In questo passaggio ancora non si assegnano coordinate, che sarà il
lavoro del prossimo passo descritto. Qui si considera di disporre i nodi del grafo all’interno di una
griglia, le cui righe corrispondono ai rank, e le cui colonne determinano quella che qui chiamiamo la
position dei nodi.
position
0
0
0
1
1
2
2
3
3
4
4
5
5
6
6
1
2
3
assignCoord
Figura 22 - Esempio dell'effetto di position
L’euristica scelta è piuttosto semplice e intuitiva, e particolarmente adatta al tipo di grafi per il
quale il progetto si applica.
1. position() {
2.
initPositions();
3.
int fullRankIndex = fullRank();
4.
//downward from the full rank
5.
for i = fullRankIndex+1 to maxRank {
6.
positioningInRank(i, true);
7.
}
8.
//upward from the full rank
9.
for i = fullRankIndex-1 to minRank {
10.
positioningInRank(i, false);
11.
}
12. }
Figura 23 - Progettazione di position
Pagina 52
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
position innanzitutto inizializza la posizione di ogni nodo del grafo banalmente utilizzando il numero
d’ordine attribuitogli dal passo precedente, perciò i nodi inizialmente si trovano tutti ammassati
sulla sinistra. Viene poi individuato il rank col maggior numero di nodi, perché quello determinerà
le posizioni di tutti gli altri nodi del grafo. Per quel rank le posizioni rimangono quelle assegnate
dall’inizializzazione.
Verranno quindi posizionati i nodi dei rank sottostanti a quello full, partendo da quello subito sotto,
fino all’ultimo rank (downward); e, in modo analogo, verranno poi posizionati i nodi dei rank
sovrastanti quello full, partendo da quello subito sopra fino al primo rank (upward).
positioningInRank agisce nel modo che ora descriviamo. Calcola per ogni nodo nel rank il valore
della mediana, rispetto al rank sopra nel caso di downward, rispetto al rank sotto se si tratta di
upward. Il valore di mediana è considerato come il miglior valore di posizione che il nodo possa
assumere, e, se nessun altro nodo occupa quella posizione, essa sarà assegnata al nodo. Se invece
la posizione è occupata da un altro nodo allora esso dovrà essere posizionato nella più vicina
posizione libera, coerentemente con l’order di quel nodo rispetto all’order del nodo che già occupa
quella posizione. Si itera sempre più a sinistra o sempre più a destra (a seconda che il nodo
occupante abbia order rispettivamente maggiore o minore) finchè non si trova una posizione libera.
Un caso a parte è costituito dai nodi che non hanno adiacenti nel rank sopra nel caso di downward,
o nel rank sotto nel caso di upward. Questi sono caratterizzati da valore di mediana -1 e vengono
memorizzati in una lista apposita, da gestire successivamente in positioningInRank, dopo che quelli
con adiacenti son stati posizionati. La gestione che abbiamo progettato consiste nel posizionare tra
questi ultimi i nodi senza adiacenti, in modo coerente con l’order assegnato.
Pagina 53
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
5.8. Assegnazione delle coordinate
La griglia che citavamo al passo precedente viene qui effettivamente calcolata, perché questo è
l’ultimo step, incaricato di assegnare le coordinate ai nodi. Si ricorda che le coordinate assegnate ai
nodi virtuali andranno a determinare i punti di svolta degli archi non unitari.
Innanzitutto c’è la necessità di conoscere l’altezza di ogni riga e la larghezza di ogni colonna della
griglia nella quale andranno idealmente disposti i nodi. L’altezza di una riga è determinata dalla
massima tra le altezze dei nodi di quel rank (sommata ad un margine aggiuntivo), e, con lo stesso
principio, la larghezza di una colonna sarà determinata dalla massima tra le larghezze dei nodi con
quella position (sommata ad un margine aggiuntivo).
A questo punto si possono scorrere i rank, e assegnare le coordinate ai nodi, in modo che ognuno di
essi sia piazzato centralmente in larghezza e in altezza all’interno della giusta cella della griglia, con
particolare attenzione al fatto che l’assegnazione della coordinata è relativa al vertice in alto a
sinistra del nodo, per come è stabilito da Zest, non al centro del nodo come comunemente si
potrebbe pensare. Le coordinate x e y calcolate vengono quindi passate a Zest attraverso
l’opportuno metodo ed è cura di Zest stesso e delle librerie grafiche sottostanti produrre il
rendering del grafo.
assignCoord
0
1
2
3
0
0
0
1
1
2
3
1
2
3
hide
virtual
structures
2
3
4
4
5
6
5
6
Figura 24 - Esempio dell'effetto di assignCoordinates
Solo dopo quest’ultimo step vengono intraprese le operazioni di postprocessing per ripristinare le
strutture originali del grafo, come già citato nella sezione 5.5. Mostriamo qui di seguito il risultato
grafico sull’esempio che ha accompagnato la descrizione di tutti gli step.
Si noti che l’esempio è molto simile al grafo di processo “Esempio 4” alla sezione 6.2, quindi si
suggerisce di osservare tale immagine per avere un’idea della resa grafica finale ottenuta
attraverso la libreria Java implementata.
Pagina 54
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
5. Fase di progettazione
hideVirtualStructures
0
1
2
3
0
0
0
1
1
2
2
3
3
4
4
5
5
6
6
1
2
Figura 25 - Esempio dell'effetto di hideVirtualStructures
Pagina 55
3
end
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
6. La libreria realizzata
6.1. Dettagli implementativi
Come si legge nei requisiti, la libreria implementata in questo progetto doveva disporre, oltre che
dell’algoritmo di autolayout, anche delle funzionalità di esportazione dell’immagine del grafo come
file JPEG, o PNG, nonché della possibilità di creare nodi con un’estetica migliore e più flessibile di
quella fornita da GraphViz. Vediamo questi due punti separatamente.
L’estrazione di un file di immagine del grafo
Nell’implementazione di questa funzionalità è stato indispensabile l’aiuto della community di Zest,
che attraverso il forum e newsgroup ha reso disponibili le conoscenze personali degli utenti di Zest.
L’implementazione dell’estrazione dell’immagine come file PNG (ad esempio), innanzitutto
necessita di conoscere le dimensioni dell’intero grafo in larghezza e altezza. Crea quindi una Image
(org.eclipse.swt.graphics.Image) vuota usando tali dimensioni. Su tale image crea un oggetto GC
(org.eclipse.swt.graphics.GC), ovvero un contesto grafico. Su tale contesto grafico costruisce un
oggetto SWTGraphics (org.eclipse.draw2d.SWTGraphics), che passa come parametro per invocare
il metodo paint sulla IFigure (org.eclipse.draw2d.IFigure) costituita dal grafo. Quindi copia l’area del
contesto grafico che contiene l’immagine, nell’oggetto Image vuoto creato inizialmente.
A questo punto, l’oggetto image contiene il rendering del grafo, ed è ora necessario che venga
salvato un file immagine con l’opportuna codifica.
A questo scopo si crea un ImageLoader (org.eclipse.swt.graphics.ImageLoader), la classe SWT usata
per caricare o salvare immagini nei possibili formati: BMP (Windows o OS/2 Bitmap), ICO (Windows
Icon) , JPEG, GIF, PNG, TIFF.
Dell’oggetto
ImageLoader
viene
settato
il
campo
data
con
l’oggetto
ImageData
(org.eclipse.swt.graphics.ImageData) della Image usata fin qui.
Quindi finalmente si può invocare il metodo save(String filename, int format) sull’ImageLoader che
ci
consente
la
creazione
effettiva
del
file,
ad
esempio
loader.save("myGraph.png",
SWT.IMAGE_PNG).
Ovviamente al termine di questo metodo si deve invocare dispose() sugli oggetti GC, Image, e
SWTGraphics, perché vengano rilasciate le risorse di sistema.
Pagina 56
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
L’estetica dei nodi
Nell’implementazione di questa funzionalità è stata indispensabile la consultazione delle API
Specification per una maggiore comprensione delle librerie grafiche sottostanti a Zest.
Come già anticipato, l’unico modo per uscire dai limiti estetici dei GraphNode è quello di utilizzare i
CGraphNode di Zest, ovvero la versione customizzabile nell’aspetto dei nodi.
Tale libertà di customizzazione, tuttavia, obbliga l’utilizzatore ad implementare da zero la figura e il
suo contenuto, con cui sostituire il classico rounded rectangle dei GraphNode. Ovviamente sarebbe
stato preferibile avere la possibilità di customizzare la shape semplicemente con l’uso di un
setShape, ma tale funzionalità non è ancora disponibile nonostante molti utenti di Zest ne sentano
l’esigenza. Abbiamo perciò implementato un metodo che crea ad hoc una Figure
(org.eclipse.draw2d.Figure) per i nostri nodi customizzati, da passare al costruttore di CGraphNode.
In questo metodo innanzitutto creiamo una Label (org.eclipse.draw2d.Label), ovvero una figura in
grado di fare il display di testo e/o immagine, e questo ci consente di creare il nodo con un’icona
così come richiesto dai requisiti. Questa label andrà quindi aggiunta ad una Figure, alla quale
compete la shape del nodo.
Per realizzare grafi di processo come quelli forniti dal team di Spagic, abbiamo dovuto realizzare le
seguenti forme:
CIRCLE, a rappresentare il Flow Object di Start Event;
BOLD_CIRCLE, a rappresentare il Flow Object di End Event;
ROUNDED_RECTANGLE, a rappresentare il Flow Object di Task Activity;
DIAMOND, a rappresentare il Flow Object di Gateway, anche detto router in Spagic Studio.
Tuttavia, la realizzazione di altre forme, anche più complesse, diventa molto semplice seguendo
l’implementazione di queste figure di base.
Pagina 57
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
6.2. I risultati ottenuti
Vediamo ora alcuni esempi di come possono cambiare i grafi di processo attraverso l’uso della
libreria sviluppata in questo progetto. Per ogni esempio mostreremo:
il grafo così come sarebbe ottenuto dal motore di GraphViz, con degli esempi di etichette,
posizionate sui nodi in modo simile a come accade attualmente in Spagic, mostrando così il
tipico aspetto del grafo di processo visualizzato attualmente in Spagic Monitor;
lo stesso grafo, generato come immagine dall’esecuzione del codice sviluppato in questo
progetto, scegliendo alcune delle possibilità a disposizione per le caratteristiche estetiche dei
nodi (colori ed esempi di icone);
per il primo esempio, anche la fase di design del processo: il diagramma visualizzato in Spagic
Studio per quel processo.
Le strutture dei grafi che presentiamo come esempi appartengono a processi effettivamente in uso
da parte di business users di Spagic; in queste immagini i testi delle etichette sono stati sostituiti
con testi generici e a solo scopo dimostrativo.
Esempio 1
Figura 26 - Design del processo Esempio1 in Spagic Studio
Pagina 58
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Figura 27 - Diagramma per il
processo Esempio1 generato da
GraphViz per Spagic Monitor
Figura 28 - Diagramma per
il processo Esempio1 generato
dalla nuova libreria
Pagina 59
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Esempio 2
Figura 29 - Diagramma per il
processo Esempio2 generato da
GraphViz per Spagic Monitor
Pagina 60
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Figura 30 - Diagramma per il
processo Esempio2 generato dalla
nuova libreria
Pagina 61
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Esempio 3
Figura 31 - Diagramma per il processo
Esempio3 generato da GraphViz per Spagic
Monitor
Pagina 62
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Figura 32 - Diagramma per il
processo Esempio2 generato
dalla nuova libreria
Pagina 63
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Esempio 4
Figura 33 - Diagramma per il
processo Esempio4 generato da
GraphViz per Spagic Monitor
Pagina 64
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Figura 34 - Diagramma per il
processo Esempio4 generato dalla
nuova libreria
Pagina 65
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
6. La libreria realizzata
Nota sull’efficienza
La libreria realizzata utilizza euristiche che consentono un’esecuzione efficiente in tempo per tutti i
casi più comuni. Il suo utilizzo è pensato per diagrammi di processi, i quali sono caratterizzati da un
numero di nodi piuttosto contenuto, nell’ordine di qualche decina, e sicuramente sotto il centinaio.
Questo non costituisce un limite fintanto che la libreria è utilizzata per gli scopi per i quali è stata
pensata. Si immagini infatti un BPD di centinaia di nodi: esso sarà un diagramma talmente
complesso da essere illeggibile dagli stessi utenti, e sarebbe comunque sgradevolmente
voluminoso per essere monitorato in uno strumento di console.
L’efficienza di questo codice sviluppato in Java è certamente inferiore a quello sviluppato in C su cui
esegue GraphViz, per la nota efficienza del codice procedurale in C. Tuttavia, si accetta la perdita di
efficienza nell’implementazione Java dello stesso pseudocodice, in cambio di un drastico aumento
di espressività e leggibilità, indispensabili perché il codice possa essere in futuro manutenuto e
modificato senza difficoltà dal team di Spagic, così come dal team di Zest, o di qualunque altro
team di programmatori.
Pagina 66
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
7. Fase di test
7. Fase di test
Lo sviluppo della libreria ha visto una fase di implementazione delle funzionalità grafiche ed
estetiche, ed una fase di implementazione dell’algoritmo di autolayout. Una volta testato il corretto
funzionamento della grafica di nodi e connessioni, si sono sfruttate tali funzionalità grafiche per
una più agevole fase di verifica dell’implementazione dell’algoritmo di autolayout.
Lo sviluppo dell’algoritmo di autolayout è avvenuto per fasi, corrispondenti agli step descritti nella
sezione 5. Ognuna di queste fasi ha visto una fase di implementazione, seguita da una fase di
verifica e validazione. La strategia di verifica è stata volta a garantire che eventuali errori emersi in
una particolare fase fossero il risultato di problemi o incongruenze relativi alla fase stessa e non a
fasi precedenti. Grazie a questo principio è stato possibile testare ogni step dell’algoritmo
sfruttando gli step precedentemente implementati e correttamente funzionanti, allo scopo rendere
i test semplici da realizzare e i risultati dei test immediatamente comprensibili.
La verifica del codice sviluppato in una fase veniva realizzata attraverso test volti a controllare che
l’output di una fase fosse corretto e conforme alle aspettative. Tali test hanno utilizzato esempi di
grafo come quelli che si possono osservare alla sezione 6, ovvero grafi di processo forniti dal team
di sviluppo Spagic, che li ha tratti da ambienti di produzione che utilizzano Spagic come soluzione di
integrazione tra applicativi. Tali grafi rappresentano perciò reali processi in uso. Il set di grafi
fornito, inoltre, spazia dai grafi più semplici a quelli più complessi, a rappresentare nel modo più
completo i possibili grafi per i quali l’algoritmo sarà utilizzato. La selezione dei grafi
“rappresentanti” dei possibili utilizzi è stata per lo più di competenza del team Spagic, che possiede
l’esperienza e la conoscenza degli usi di questo prodotto. A questi esempi sono stati aggiunti
numerosi altri, finalizzati al test di particolari casistiche. Si tratta per lo più di test effettuati
manualmente, facendo girare l’algoritmo su tali grafi e rilevando ad ogni step le incongruenze,
risolte completamente prima di cominciare lo sviluppo della fase successiva.
La tabella seguente spiega più in dettaglio le funzionalità testate.
validGraph
Questo passo è stato testato eseguendo l’algoritmo su grafi non
accettabili creati ad hoc: grafo vuoto, grafo con nodi isolati, grafo
con cappi, grafo con archi multipli, grafo non connesso.
breakCycle
Questo passo è stato testato eseguendo l’algoritmo su grafi con e
senza cicli. In particolare, dapprima su grafi con un singolo ciclo,
poi su grafi con più cicli, verificando che il metodo rilevasse
Pagina 67
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
7. Fase di test
correttamente gli archi di feedback.
Successivamente è stato testato il corretto funzionamento
dell’inversione logica degli archi di feedback, e prima di
procedere alle fasi successive è stato testato che anche il
ripristino della direzione originaria degli archi fosse
correttamente implementato.
In questa fase si è rilevato che l’inversione è solamente logica: i
metodi utilizzati per invertire gli archi non hanno alcun effetto a
livello grafico poiché la libreria grafica sottostante continua a
disegnare l’arco con la direzione con cui è stato creato. Questo
aspetto non è stato ulteriormente indagato poiché per gli usi del
nostro algoritmo questo comportamento è irrilevante.
rank
Questo passo è stato testato su tutti i grafi di esempio,
osservando quale rank venisse assegnato dall’algoritmo
implementato da GraphViz. Essendo il layout di GraphViz
considerato corretto, si sono confrontati i risultati della nostra
implementazione con i risultati di GraphViz sullo stesso grafo.
Le fasi successive dell’algoritmo necessitavano della creazione
delle strutture virtuali, e all’implementazione di questa è seguito
il test sulla corretta creazione. Tale test è consistito nella
visualizzazione delle strutture virtuali con cui gli archi non unitari
venivano logicamente sostituiti, attraverso l’output grafico
createVirtualStructures
dell’algoritmo. Ovviamente, prima di implementare le fasi
hideVirtualStructures
successive, si è implementata la rimozione delle strutture virtuali,
e testato (sempre graficamente) il corretto funzionamento.
In particolare, in quest’ultimo test si è testato anche il routing
degli archi non unitari.
order
Innanzitutto sono stati testati singolarmente i metodi che
compongono questa fase: il metodo di inizializzazione degli
order, il metodo di valore mediano e il metodo della mediana, il
metodo di trasposizione e il metodo che conta gli incroci tra gli
archi. Una volta garantito il corretto funzionamento dei singoli
metodi, si è passati al test dell'intero metodo order sui grafi di
esempio, su cui erano già stati eseguiti i passi precedenti.
Sebbene l'ordinamento dei nodi fosse talvolta diverso da quello
eseguito da GraphViz per gli stessi grafi, il numero di incroci di
archi risultante appariva il medesimo, quindi si è ritenuto che lo
step sia stato correttamente implementato.
Pagina 68
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
7. Fase di test
position
assignCoordinates
L'euristica implementata per assegnare l'effettiva posizione dei
nodi è stata testata sempre attraverso l'esecuzione della stessa
sui grafi di esempio, verificando che effettivamente ai nodi
venisse assegnata la posizione corretta. La verifica dei risultati dei
test è stata facilitata dal fatto che la libreria grafica sottostante
(Zest) permettesse l'interazione con i nodi nella finestra del
grafo, in modo da poter simulare manualmente l'euristica scelta,
e confrontarne il risultato con l'assegnazione ottenuta.
Per testare quest'ultimo step è stato sufficiente eseguirlo sugli
esempi di grafi, verificando visivamente che il risultato fosse
coerente con le aspettative, ovvero che i nodi fossero disposti
idealmente sulla griglia che è stata implementata, ottenendo
come risultato un allineamento dei nodi ordinato ed
esteticamente gradevole.
Pagina 69
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
8. Tracciamento dei requisiti
8. Tracciamento dei requisiti
Nella tabella seguente illustriamo come i requisiti siano stati rispettati, controllo che è stato
effettuato anche dal team di Spagic in fase di consegna.
Linguaggio e sviluppo:
1. Deve essere sviluppata in Java, per consentire l’integrazione
all’interno di Spagic.
2. Deve far parte di un progetto maturo, supportato e ben
documentato; deve essere rilasciata in una versione testata e
stabile (non in versione alpha). Inoltre deve trattarsi di un
progetto sufficientemente valido da scongiurarne l’abbandono
da parte dei developer, e per il quale si esclude con
ragionevole certezza una chiusura del codice per i rilasci futuri.
Zest è sviluppata in Java e
così anche la nuova libreria
costruita su di esso.
Come già verificato in fase di
scelta della libreria, Zest fa
parte di un progetto maturo,
stabile e ben supportato.
Attraverso lo studio della
libreria Zest si è ovviato al
problema della mancanza di
documentazione.
Licenza:
3. Deve essere free e open source, con una licenza compatibile
con i fini dell’intero progetto Spagic, quindi deve essere
modificabile e utilizzabile a scopo commerciale. Deve avere
perciò licenza LGPL, EPL, o compatibile con queste.
Come già verificato in fase di
scelta, la licenza di Zest è
EPL, e con la stessa licenza è
rilasciato il nuovo codice
sorgente.
Funzionalità:
4. Deve essere in grado di rappresentare grafi, più in particolare
diagrammi in BPMN, permettendo la rappresentazione di tutte
le parti che ne compongono la struttura: nodi e archi, con le
Queste sono funzionalità
fornite da Zest nativamente.
etichette testuali.
5. Nella rappresentazione dei nodi deve essere prevista anche
l’informazione visuale: per i nodi devono essere specificabili
forma, dimensione, colorazione ed immagine contenuta,
mentre per gli archi è gradito che sia specificabile lo stile.
6. Deve essere possibile esportare il grafo rappresentato
sottoforma di immagine bidimensionale, in formato JPEG o
PNG.
Pagina 70
Queste
funzionalità
di
estetica dei nodi sono state
implementate a partire dalle
strutture
messe
a
disposizione da Zest.
Questa funzionalità è stata
implementata
attraverso
nuovi metodi che sfruttano le
classi di SWT e Draw2d.
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
8. Tracciamento dei requisiti
7. Deve essere implementato nella libreria un algoritmo di
autolayout, che generi layout verticali (ed eventualmente
anche orizzontali), in grado di disporre in modo ordinato i nodi,
Questa funzionalità è stata
implementata con la classe
SugiyamaLayoutAlgorithm
descritta nelle sezioni 5 e 6.
affinché il diagramma risulti leggibile e dall’aspetto gradevole.
8. Deve presentare le funzionalità ai punti 6 e 7, ma in passaggi
distinti, in modo che rimangano disponibili le coordinate dei
vertici generate dall’algoritmo di layout indipendentemente
dall’esportazione del grafo come immagine, per poter
utilizzare tali coordinate per la creazione di mappe via CSS.
Le coordinate dei nodi del
grafo, una volta calcolate,
vengono mantenute come
informazione
all’interno
degli oggetti GraphNode e
continuano
ad
essere
disponibili.
9. Non deve precludere la possibilità che l’immagine del
diagramma
dell’istanza
di
processo
venga
creata
dinamicamente piuttosto che essere creata una volta soltanto
e poi personalizzata attraverso l’uso di fogli di stile.
Pagina 71
Nessuna caratteristica della
libreria preclude questa
possibilità.
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
9. Conclusioni
9. Conclusioni
Sviluppi futuri
Come già anticipato, il risultato di questo progetto, ovvero la libreria creata, sarà utilizzato per
migliorare l’aspetto grafico della console di monitoring dei processi in Spagic. L’integrazione della
libreria in Spagic è previsto a breve, non appena saranno implementate la parte che fornirà in
automatico all’algoritmo le informazioni sulla struttura del grafo su cui eseguire e il sistema di
mappe html e css per la pagina web di processo, che renda interattiva la visualizzazione
dell’immagine del diagramma, e ne consenta la visualizzazione delle proprietà e dello stato.
Un altro utilizzo di questa libreria è come possibile miglioramento del progetto Zest. La libreria,
infatti, implementa funzionalità che non erano nativamente disponibili in Zest, e perciò è stata
proposta come contribuzione al progetto Zest. I creatori del progetto Zest sono stati contattati via
mailing list del progetto GEF, e di persona dai componenti del team di Engineering in occasione
dell’EclipseCon 2010. La libreria di questo progetto sarà perciò sottoposta all’attenzione del team di
Zest, e, con opportune modifiche che la rendano perfettamente integrabile nel progetto originale,
potrà divenire un’utile contribuzione, e sarà resa disponibile alla comunità scientifica non solo
tramite il codice sorgente aperto di Spagic, ma anche attraverso il codice sorgente aperto del plugin
di Eclipse, Zest.
Ringraziamenti
Si ringraziano sentitamente tutti coloro i quali sono stati di supporto allo svolgimento di questo
progetto e di questa tesi. In particolare si ringrazia il Dott. Gianfranco Boccalon e tutto il team di
Spagic e di Engineering.
Pagina 72
Università degli Studi di Padova - LS Informatica
Generazione di grafi in BPMN - Contiero Erika
10. Bibliografia
10. Bibliografia
“Graph Drawing - Algorithms for the Visualization of Graphs” G. Di Battista, P. Eades, R.
Tamassia, I. G. Tollis - 1998 - Prentice Hall
“Introduction to BPMN” Stephen A. White; IBM Corporation
www.graphviz.org
www.graphviz.org/pub/graphviz/development/doxygen/html/index.html
“A Technique for Drawing Directed Graphs” Emden R. Gansner, Eleftherios Koutsofios, Stephen
C. North, Kiem-Phong Vo; AT&T Bell Laboratories
Carpano, M., “Automatic display of hierarchized graphs for computer aided decision analysis”
IEEE Transactions on Software Engineering SE-12(4), 1980, pp. 538-546.
Chvatal, V., “Linear Programming”, W. H. Freeman, New York, 1983.
Cunningham, W. H., “A network simplex method” Mathematical Programming 11, 1976, pp.
105-116.
Eades, P., B. McKay and N. Wormald, “On an Edge Crossing Problem” Proc. 9th Australian
Computer Science Conf., 1986, pp. 327-334.
Eades, P. and Roberto Tamassia, “Algorithms for Automatic Graph Drawing: An Annotated
Bibliography” Technical Report CS-89-09 (Revised Version), Brown University, Department of
Computer Science, Providence RI, October 1989.
Gansner, E. R., S. C. North and K.-P. Vo, “DAG - A Program that Draws Directed Graphs”
Software - Practice and Experience 17(1), 1988, pp. 1047-1062.
Gansner, E. R., S. C. North and K.-P. Vo, “On the Rank Assignment Problem”.
Sugiyama, K., S. Tagawa and M. Toda, “Methods for Visual Understanding of Hierarchical
System Structures” IEEE Transactions on Systems, Man, and Cybernetics SMC-11(2), February,
1981, pp. 109-125.
www.eclipse.org/gef/zest/
Pagina 73
Scarica

UNIVERSITÀ DEGLI STUDI DI PADOVA