BAB IV PERANCANGAN Pada Bab IV ini akan dijelaskan perancangan program dengan mengimplementasikan alternatif solusi yang dikemukakan pada Subbab III.5.
IV.1 Evaluasi Usulan untuk Perancangan Iteratif Berikut akan diberikan evaluasi usulan yang diberikan. 1. Bentuk iteratif PrefixSpan. Perubahan dari rekursif menjadi iteratif mutlak dilakukan untuk melakukan pencegahan program berhenti ketika dijalankan. Adapun algoritma iteratif dari PrefixSpan dapat dilihat pada Algoritma IV-1. Prosedure PrefixSpan(input: a: l: integer, S: Sequence database) { Mencari Sequential Pattern pada sequence database S } Deklarasi D : Lst : Sq :
Temporary Sequence Database List of Sequential Pattern Sequence
Algoritma Lst.add(“<>”,S) Sq <- Lst.Pop( ) While Sq != NULL D <- Sq.database D.findOneSequence( ) Foreach OneSequence do D.projected( each Elmt ) Lst.add( concat (Sq.value , each Elmt) ) Endfor Endwhile Algoritma IV-1 Algoritma PrefixSpan iteratif
2. Penggunaan multithreading. Penggunaan multi-threading akan menyebabkan perubahan pada arsitektur program dan terdapat penambahan kelas, namun tidak merubah algoritma atau proses yang terjadi pada masing-masing kelas yang sudah ada sebelumnya, hanya tata cara pencarian sequential pattern yang mengalami perubahan untuk mengakomodasi penggunaan multi-threading. 3. Penyimpanan sequence database pada file external. Sesuai dengan analisis dan percobaan yang dilakukan, penyimpanan harus dilakukan pada file external. Implementasi hal ini memerlukan sedikit perubahan pada mekanisme pembacaan IV-1
IV-2
sequence pada kelas Data. Tentunya perlu penambahan untuk keperluan penanganan I/O. 4. Scan database dengan menggunakan metode divide and conquer. Divide and conquer memiliki kinerja yang lebih baik apabila algoritma tersebut tidak harus memeriksa semua baris dari data untuk menyelesaikan prosesnya. Sedangkan untuk kasus ini, setiap sequence yang ada memang harus diperiksa seluruhnya, sehingga scan database untuk metode divide and conquer tidak diimplementasi karena tidak akan meningkatkan kinerja. 5. Perubahan cara mencari frequent sequence 1 elemen. Hal ini tentunya akan merubah detail algoritma bagaimana cara mencari frequent sequence 1 elemen. Namun perubahan itu hanya pada tingkat method, tidak sampai mengubah arsitektur kelas karena input dan outputnya masih sama seperti sebelumnya.
IV.2 Rancangan Implementasi Alternatif yang Digunakan Dari alternatif yang dianalisis di IV.1, usulan yang pertama kali diimplementasikan adalah usulan nomor satu, yaitu mengubah PrefixSpan dari rekursif menjadi iteratif. Berdasarkan konsep yang dijelaskan pada II.4.2, PrefixSpan terdiri dari tiga kegiatan utama, yaitu mendapatkan 1-length frequent sequence, mengabungkan dengan prefix yang berkaitan dengannya, dan memroyeksikan untuk pencarian sequential pattern lainnya. Oleh karena itu, algoritma PrefixSpan dalam bentuk iteratifnya harus dibangun dengan memperhatikan tiga kegiatan utama tersebut. Dengan analisis seperti itu, konsep algoritma PrefixSpan versi iteratif dapat dilihat pada Gambar IV-1.
Konsep pada Gambar IV-1 membuka peluang untuk dilakukan multi-threading yang baik, karena setiap sequential pattern yang dihasilkan memiliki alamat sequence database per sequence, sehingga proses pencarian setiap elemen dalam queue dapat dilakukan terpisah.
Dengan alur seperti pada Gambar IV-1, multithreading dapat digunakan dengan baik pada saat mencari 1-length frequent sequence dalam database, karena pada proses tersebut, setiap sequential pattern dalam queue memiliki projected database masingmasing.
IV-3
Gambar IV-1 Alur Konsep algoritma PrefixSpan iteratif
Untuk alternatif format data yang akan digunakan, akan diimplementasikan dalam kelas Sequence, sedangkan kelas Data akan mengimplementasikan metode scan dengan menggunakan divide and conquer. Dan untuk algoritma PrefixSpan versi iteratif, akan menjadi salah satu method dalam kelas PrefixSpan pada rancangan yang ditunjukkan oleh Gambar III-2.
Kelas diagram rancangan program setelah mengimplementasikan strategi alternatif dapat dilihat pada Gambar IV-2. Pada diagram tersebut, perbedaan yang paling terlihat dengan kelas diagram yang lama adalah adanya kelas baru, yaitu kelas Job. Pada arsitektur ini, kelas Job dimasukkan untuk memfasilitasi program
multi-
threading, dimana akan ada satu thread untuk setiap instance kelas ini. Selain itu, pencarian sequential pattern menjadi tanggung jawab dari kelas Job ini, karena proses-proses inti untuk mencari sequential pattern tidak lagi dipanggil oleh kelas PrefixSpan, melainkan oleh kelas Job.
IV-4
Gambar IV-2 Diagram Kelas perancangan
Pada arsitektur baru ini, kelas PrefixSpan akan menciptakan instance baru dari kelas Job untuk setiap sequential pattern terdapat pada list of sequential pattern. Setiap instance job yang dipanggil akan mencari sequential pattern baru untuk dimasukkan ke dalam list yang dikelola oleh instance PrefixSpan yang memanggilnya. Untuk lebih jelas, Sequence diagram dari pencarian sequential pattern dapat dilihat pada Gambar IV-3.
Gambar IV-3 Sequence Diagram perancangan
IV-5
Setelah pengguna memasukkan nama file yang menjadi sequence database, instance kelas PrefixSpan akan menciptakan instance Job dari sequential pattern "<>", dimana Sequence tersebut merupakan prefix untuk pencarian oleh instance Job ini. Pada Gambar IV-3, instance Job hanya melakukan pencarian untuk projected database yang diberikan, sedangkan untuk keseluruhan sequential pattern, didapatkan dengan menciptakan banyak instance kelas Job.
Nantinya akan dibangun empat program PrefixSpan, yaitu PrefixSpan Dasar, PrefixSpan Multithread, PrefixSpan Pembahasan, dan PrefixSpan keseluruhan. Hal ini dilakukan untuk melihat efek dari masing-masing alternatif yang dikemukakan terhaap waktu proses dari PrefixSpan. Hubungan antara keempat PrefixSpan dengan alternatif yang dikemukakan dapat dilihat pada Tabel IV-1. Tabel IV-1 Pemetaan Program dengan Alternatif
Dasar
Multithread
Pembatasan
Keseluruhan
Algoritma Iteratif Penyimpanan data pada file Multithreading Pembatasan pembangkitan
Meski mengimplementasikan alternatif yang berbeda, dasar dari empat program tersebut adalah sama. Keempat algoritma tersebut bahkan memiliki diagram kelas yang sama kecuali antara yang mengimplementasikan multithread. Perancangan yang dibahas pada Bab ini adalah perancangan untuk PrefixSpan Keseluruhan.
IV.3 Rancangan Multithread Sesuai dengan analisis yang dilakukan pada III.6, multithreading program terletak para pemrosesan sequential pattern yang dimiliki. Akan diciptakan beberapa thread yang siap untuk melakukan pekerjaannya yaitu mencari sequential pattern dari sequence database. Main thread program yang akan memberikan pekerjaan tersebut dan mengaktifkan thread yang mendapatkannya. Setelah selesai mencari sequential pattern, suatu thread akan menunggu hingga diberikan tugas berikutnya, atau dimatikan jika tidak ada tugas lanjutan.
IV-6
IV.4 Rancangan Kelas Rancangan kelas keseluruhan dapat dilihat pada Gambar IV-2, Berikut akan dipaparkan lebih lanjut mengenai kelas-kelas tersebut dan hubungannya dengan masalah yang terdapat pada Bab Analisis.
IV.4.1
Sequence
Kelas Sequence adalah kelas yang dirancang untuk melakukan penyimpanan sequence, proyeksi sequence terhadap suatu prefix dan penggabungan suatu postfix dengan prefixnya. Pada kelas ini, sequence disimpan dalam tipe data string. Ketika hendak melakukan proses yang berkaitan dengan sequence tersebut, suatu array of string dibangkitkan untuk mempermudah proses. Array tersebut akan dibebaskan ketika proses untuk sequence tersebut telah selesai, sehingga memory yang dibutuhkan tetap akan stabil.
Kelas ini dirancang untuk memfasilitasi mekanisme proyeksi. Seperti yang telah dijelaskan pada Subbab III.1.2, terdapat enam kemungkinan bentuk yang harus ditangani dalam proses ini. Semua tercakup dalam satu fungsi yang bernama Projection, yang menerima masukkan string prefix dan string projector, dan mengembalikan string sequence yang telah terproyeksi. Method ini terdiri dari tiga tahap, tahap pembentukkan array, tahap proses dengan mengiterasi array, dan tahap penggabungan array. Prinsipnya, ketika proyeksi hendak dilakukan, dibangkitkan dua array of string, array of string projector dan array of string sequence. Kemudian, dilakukan iterasi terhadap array of string sequence, dan akan diperiksa apakah elemen tersebut terkadung dalam array of projector. Apabila ada, maka akan ada variabel I yang mencatat pada elemen ke berapakah suatu projector terkandung. Jika sampai pada akhir iterasi, tidak semua array of projector terkandung dalam array of sequence, maka tidak aka nada tahap penggabungan array, karena hasilnya memang seharusnya sequence kosong. Jika terkandung semua, maka penggabunga dimulai dari elemen dengan urutan yang diacu variabel i sampai pada akhir array. Rancangan algoritmanya dapat dilihat pada Algoritma IV-2.
Pada Algoritma IV-2, hanya terdapat empat cabang if, yang berarti hanya terdapat empat kasus. Hal ini tampak berbeda dengan yang terdapat pada Subbab III.1.2.
IV-7
Namun sebenarnya tidak, karena dua kasus lainnya sudah tertangani dengan otomatis oleh algoritma tersebut.
Function Projection(input: prefix: string, Projector: string)-> string { Memroyeksi this.sequence dengan Projector } Deklarasi Return_value : string; Algoritma TableOfSequenceElemen <- this.sequence.split(“,”); TableOfProjectorElemen <- Projector.split(“,”); Int I <- 0; Int j <- 0; While(I < TableOfSequence.Length) do If Projector mengandung ‘_’ dan elemen mengandung ‘_’ then /*Proyeksi untuk kasus tersebut*/ Else If Projector mengandung ‘_’ dan elemen mengandung ‘(’ then /*Proyeksi untuk kasus tersebut*/ Else If Elemen mengandung ‘(’ then /*Proyeksi untuk kasus tersebut*/ Else j++; endif /*Proses setelah proyeksi. Memajukan counter untuk TableOfSequence*/ Endwhile /*lakukan penggabungan kembali dari TableOfSequence menjadi string*/ Return Return_value;
Algoritma IV-2 Algoritma Proyeksi
Untuk penggabungan prefix dengan posfixnya, dari sembilan kasus yang mungkin terjadi seperti yang dikemukakan pada Subbab III.1.3, penanganannya cukup dengan memperhatikan dua kasus utama, seperti yang telah dipaparkan pada Subbab III.1.3.1 dan Subbab III.1.3.2.
IV.4.2
Data
Berbeda dengan kelas Sequence yang dibangun untuk keperluan pemrosesan per sequence, kelas Data dibangun untuk memfasilitasi pemrosesan keseluruhan sequence yang terdapat dalam sequence database. Sehingga kelas Data juga bertanggung jawab
IV-8
dalam menangani akses terhadap file external, tempat dimana sequence database tersebut disimpan. Function findFrequentSequenceOneElemen(input: prefix: string)-> List of string { Mencari Frequent Sequence satu elemen pada sequence database } Deklarasi Return_value : List of string; Algoritma /*inisiasi variabel variabel local pendukung proses*/ While(masih terdapat sequence dalam sequence database) do While (masih terdapat elemen pada sequence) do Foreach frequent sequence 1 elemen do If sama dengan elemen yang tersimpan do Tambahkan counter untuk elemen tersebut Endif Endfor Endwhile Endwhile /*iterasi kembali list of frequent sequence 1 elemen, elemen dengan nilai counter yang melewati threshold akan dimasukkan ke dalam Return_value.*/ Return Return_value;
Algoritma IV-3 Algoritma pencarian frequent sequence satu elemen
Kelas Data bertanggung jawab dalam mencari frequent sequence dengan 1 elemen dan proyeksi terhadap keseluruhan sequence database. Lain hanya dengan proses proyeksi, dimana kelas Data dapat mendelegasikannya kepada kelas Sequence, pencarian frequent sequence memang hanya dapat dilakukan oleh kelas ini. Algoritma pencarian ini terdiri dari tiga tahap, tahap insiasi, tahap iterasi, dan tahap penghapusan. Pada tahap inisiasi, dilakukan pembangkitan Map dengan sequence satu elemen sebagai key-nya dan integer sebagai value-nya. Sequence yang tersimpan adalah kandidat frequent sequence, sedangkan integer pada value sebagai penghitung jumlah kemunculannya pada sequence database. Tahap iterasi melakukan pengisian Map tersebut, sedangkan tahap penghapusan melakukan penghapusan terhadap elemen pada Map tersebut yang value-nya tidak sesuai dengan nilai threshold. Algoritma umumnya dapat dilihat pada Algoritma IV-3.
IV-9
IV.4.3
Job
Kelas Job adalah kelas yang dibangun untuk keperluan multithreading. Pada rancangan program yang single-thread, kelas Job ini tidak ada. Pada proses pencarian sequential pattern, kelas Job ini berperan dalam pemanggilan pencarian frequent sequence 1 elemen, menggabungkan frequent sequence tersebut dengan prefixnya dan menyimpan hasil gabungan ke dalam list of sequential pattern. Setiap instance kelas Job, yang mewakili satu thread untuk masing-masing, akan memegang sequence database sendiri sehingga tidak ada informasi yang dipertukarkan antar thread. Kelas ini pada implementasikan merupakan turunan dari interface Runnable, sehingga harus mengimplementasi method Run(). Algoritma yang terdapat pada Algoritma IV-1 diimplementasikan pada method Run() ini.
IV.4.4
SP
Kelas ini lebih tepat disebut dengan tipe data, karena tidak memiliki method selain default konstruktor. Kelas ini terdiri dari dua atribut, yaitu sequence dan filename, yang mana keduanya adalah variabel bertipe string. Kelas ini berfungsi untuk menyimpan sequence dari sequential pattern yang dihasilkan, dan hasil proyeksi database tersebut terhadap sequence-nya.
IV.4.5
PrefixSpan
Kelas ini pada tahap Perancangan mengalami perubahan fungsi dibandingkan dengan pada tahap Analisis. Pekerjaan yang dilakukan kelas ini pada tahap Analisis telah didelegasikan kepada kelas Job, sehingga kelas PrefixSpan tetap dibutuhkan untuk mengelola thread-thread yang nantinya akan banyak bermunculan. Method utama pada kelas ini, findSequentialPattern(), terdiri dari dua tahap. Tahap pertama adalah tahap inisiasi variabel-variabel pendukung proses, tahap kedua adalah tahap iterasi pembangkitan instance kelas Job. Iterasi akan dilakukan selama masih terdapat instance Job yang sedang berjalan dan elemen frequent sequence yang masih dapat diproses untuk menghasilkan frequent sequence lebih lanjut.