Chương 2 CÁC CÔNG CỤ ĐẶC TẢ
3.4. Cấu trúc dữ liệu
3.4.1. File dữ liệu đầu vào
Dữ liệu đầu vào được cho dưới dạng ôtômat thời gian, các hệ số của vị trí của ôtômat và các hệ số A, B, M của công thức LDI được lưu trong 1 file *.txt. Chương trình sẽ đọc dữ liệu từ file *.txt và tính tốn để được kết quả: ôtômat, ôtômat hợp song song đạt được, đồ thị vùng đạt được nguyên, đồ thị trọng số phục vụ LDI, kết quả kiểm chứng, thời gian chạy chương trình.
File dữ liệu đầu vào *.txt được thiết kế như sau:
(nếu giá trị nào đó là vơ cùng thì thay bằng chữ U)
Dịng 1: {Hệ số A}_{Hệ số B}_{Hệ số M} // hệ số của công thức LDI
Dịng 2: {số đỉnh}_{tên vị trí ban đầu} // ơtơmat 1
Dịng 3: {tên vị trí}#xi_low_up|xj_low_up|…#{hệ số ldi} // ơtơmat 1
({tên vị trí}#{các ràng buộc}#{hệ số ldi}) //mỗi đỉnh 1 dòng
…
Dịng i: {số cạnh} // ơtơmat 1
Dịng i+1: li#xi_xj_low_up|…#{nhãn}#xi_1|xj_1|…#lj // ơtơmat 1
(phép chuyển e = < li, (low <= xi - xj <=up,…), {nhãn},{ xi, xj,…}, lj >)
….
(nếu có ơtơmat 2,3,… thì lặp lại từ dòng 2 và lưu vào các dòng tiếp theo)
Ví dụ 3.1: Một hệ thống được đặc tả bằng ơtơmat thời gian:
Hình 3.3: Ơtơmat thời gian
Tính chất mong muốn được đặc tả bằng cơng thức LDI: 0 l s1 - s2 5 Khi đó file otomat1.txt có nội dung như sau:
0_U_5 2_s1 s1#x2_0_5#1 s2#x1_0_8|x2_0_10#-1 2 s1#x2_x0_3_U#a#x2_1#s2 s2#x1_x0_6_U|x2_x0_4_U#b#x1_1#s1
3.4.2. Ơtơmat
Thiết kế cấu trúc dữ liệu để lưu trữ các thành phần của ôtômat thời gian A=<L, l0, , X, I, E> được lưu trong file *.txt, ta sẽ sử dụng cấu trúc mảng trong PHP để lưu các thành phần của ơtơmat A như sau:
(kí hiệu xxx bên dưới thể hiện 1 giá trị nào đó của phần tử tương ứng)
$aryOtomat = array(
‘init’ => l0, //Vị trí ban đầu
‘numLocation’ => xxx, //số vị trí của ơtơmat
‘numTransition’ => xxx, //số phép chuyển của ôtômat
‘clocks’ => array(x1,x2, …, xn), //là mảng chứa tập các đồng hồ X
‘aryLocation’ => array( //Mảng chứa vị trí và thơng tin các vị trí của ơtơmat ‘{tên vị trí}’ => array( //Mảng chứa thơng tin của 1 vị trí
‘invar’ => array( //Mảng chứa các bất biến của vị trí ‘xi’ => array( // Ràng bc đồng hồ xi: low <= xi <= up
‘low’ => xxx, //Cận dưới của đồng hồ xi ‘up’ => xxx, //Cận trên của đồng hồ xi ), … ), ‘c’ => xxx //Hệ số LDI ), … ),
‘aryTransition’ => array( //Mảng chứa các phép chuyển i => array( //Phép chuyển thứ i
‘loc_name_from’ => xxx, //Tên vị trí đầu(source) ‘loc_name_to’ => xxx, // Tên của vị trí cuối(target) ‘label’ => xxx, //Nhãn của phép chuyển
‘reset’ => array( //Tập các đồng hồ thiết lập lại bằng 0 (reset) ‘xi’ => 1, //Đồng hồ xi sẽ được gán lại giá trị 0
),
‘guard’ => array( //Mảng chưa các ràng buộc của phép chuyển ‘xi-xj’ => array( //Ràng buộc dạng: low <= xi-xj<= up
‘low’ => xxx, ‘up’ => xxx
),
‘xi’ => array( //Ràng buộc dạng: low <= xi<= up ‘low’ => xxx, ‘up’ => xxx ), … ), ), … ) ); 3.4.3. Công thức LDI
Các hệ số LDI ứng với từng vị trí của ơtơmat được đưa vào cấu trúc vị trí của ơtơmat (xem trong phần 3.3.2), cịn các hệ số A, B, M của công thức LDI sẽ được đưa vào trong cấu trúc mảng sau:
$aryLdi = array( ‘A’ => xxx, //Hệ số A ‘B’ => xxx, //Hệ số B ‘M’ => xxx //Hệ số M ); 3.4.4. Đồ thị vùng đạt được nguyên
Đồ thị vùng được thể hiện là 1 mảng chứa các thông tin gồm: số đỉnh, số cạnh, 1 mảng chứa tập đỉnh, 1 mảng chứa tập cạnh.
$aryRegionGraph = array(
‘num_vertex’ => xxx, //số đỉnh
‘num_edge’ => xxx, //số cạnh
‘aryVertex’ => array( //Mảng chứa thông tin các đỉnh
i => array( //Đỉnh thứ i = ID đỉnh, i là số tự tăng, bắt đầu từ 1
‘vertex’ => xxx, //Tên đỉnh có dạng: {tên vị trí}_[region]
‘ldi_c’ => xxx, //Hệ số LDI
),
…
),
‘aryEdge’ => array( //mảng chứa thông tin các cạnh
i => array( //thông tin cạnh thứ i+1, chỉ số bắt đầu từ 0
‘id_form’ => xxx, //ID của đỉnh đầu(source)
‘id_to’ => xxx, //ID của đỉnh cuối (target)
‘duration_low’ => xxx, //Cận dưới thời gian
‘duration_up’ => xxx //Cận trên thời gian
), …
)
);
3.4.5. Đồ thị trọng số phục vụ kiểm chứng LDI
Về mặt cấu trúc thì mảng chứa đồ thị trọng số LDI và mảng chứa đồ thị vùng giống nhau, cụ thể cấu trúc mảng của đồ thị trọng số LDI như sau:
$aryWeighGraphLdi = array( ‘num_vertex’ => xxx, //số đỉnh ‘num_edge’ => xxx, //số cạnh
‘aryVertex’ => array( //Mảng chứa thông tin các đỉnh
i => array( //Đỉnh thứ i = ID đỉnh, i là số tự tăng, bắt đầu từ 1 ‘vertex’ => xxx, //Tên đỉnh
‘ldi_c’ => xxx, //Hệ số LDI ),
… ),
‘aryEdge’ => array(( //mảng chứa thông tin các cạnh i => array( //thông tin cạnh thứ i
‘id_form’ => xxx, //ID của đỉnh đầu(source) ‘id_to’ => xxx, //ID của đỉnh cuối (target) ‘w’ => xxx, //trọng số của cung (weigh)
), … )
);
3.4.6. Đường đi của đồ thị
Sử dụng ngăn xếp là 1 mảng để lưu vết đường đi phục vụ cho thuật toán (vét cạn) duyệt đồ thị trọng số LDI để kiểm chứng công thức LDI, ngăn xếp này lưu tên mỗi đỉnh và tập các đỉnh kề với nó khi thuật toán duyệt đi qua. Ngăn xếp này được thiết kế như sau:
$aryStackPath = array(
i => array( //thông tin đỉnh thứ i+1 trong đường đi
v => array(v1,v2,…,vk), //đỉnh v và các đỉnh kề với v
…
),
3.5. Thiết kế chương trình
Trong mục này sẽ trình bày một số biểu đồ thiết kế cơ bản chương trình của bộ kiểm thử.
3.5.1. Biểu đồ use case
Dựa trên các yêu cầu của bộ công cụ kiểm chứng được mô tả ở trên, ta xác định và đưa ra use case tổng quát của hệ thống với tác nhân (Actor) ở đây là người thiết kế hoặc người lập trình như sau:
Hình 3.4: Biểu đồ use case mức 1
Hình 3.5: Biểu đồ use case mức 2
Mô tả chi tiết use case:
chứng 1 mơ hình đã chọn.
Chọn mơ hình kiểm chứng: Use case này cho phép người dùng xem và chọn 1 mơ hình để thực hiện kiểm chứng trong danh sách các mơ hình của bài tốn đã chọn.
Chọn bài toán kiểm chứng: Use case này cho phép người dùng chọn 1 bài toán để thực hiện kiểm chứng.
3.5.2. Biểu đồ lớp
Hình 3.6: Biểu đồ lớp
Xác định các lớp tham gia vào các use case:
STT Tên lớp Loại lớp
1. Chọn bài toán kiểm chứng
1.1 List Lớp biên
1.2 ListAction Lớp điều khiển
1.3 OtomatLogic, XmlLogic Lớp thực thể
2. Chọn mơ hình kiểm chứng
2.1 searchModel Lớp biên
2.3 OtomatLogic, XmlLogic Lớp thực thể 3. Kiểm chứng mơ hình
3.1 searchModel , verify Lớp biên
3.2 VerifyAction Lớp điều khiển
3.3
OtomatLogic, GraphRegionLogic,
GraphLdiLogic, XmlLogic Lớp thực thể
Bảng 3.6: Xác định các lớp tham gia use case 3.5.3. Biểu đồ tuần tự 3.5.3. Biểu đồ tuần tự
Hình 3.7: Biểu đồ tuần tự danh sách bài tốn
Hình 3.9: Biểu đồ tuần tự kiểm chứng mơ hình 3.5.4. Biểu đồ hoạt động 3.5.4. Biểu đồ hoạt động
Chương 4. KẾT QUẢ THỰC HIỆN CHƯƠNG TRÌNH
Chương này chúng tơi trình bày kết quả chạy bộ cơng cụ kiểm chứng mơ hình đã xây dựng cho 2 bài tốn sau:
Kiểm chứng công thức LDI đối với ơtơmat được nêu trong ví dụ 3.1.
Kiểm chứng cơng thức LDI đối với hệ bếp ga.
4.1. Cách sử dụng bộ kiểm chứng
Để sử dụng được bộ công cụ kiểm chứng ta làm theo các bước sau:
1) Truy cập vào màn hình hiển thị danh sách các bài toán cần kiểm chứng bằng url http://phamvantuan.luanvan.com.
2) Trong màn hình danh sách bài toán, chọn 1 bài toán cần kiểm chứng thì sẽ hiển thị màn hình danh sách các mơ hình kiểm chứng của bài toán được chọn. 3) Trong màn hình danh sách các mơ hình kiểm chứng, click vào link [Thực
hiện kiểm chứng] của các bộ kiểm chứng tương ứng thì chương trình sẽ mở ra 1 cửa sổ mới để thực hiện kiểm chứng và hiển thị kết quả.
Chú ý: Xem các màn hình ở trong Phụ lục B. 4.2. Kiểm chứng LDI đối với bài toán 1
Với bài toán và dữ liệu được mơ tả trong ví dụ 3.1 thực hiện kiểm chứng trên bộ kiểm chứng xây dựng thì ta được kết quả kiểm chứng như trong hình bên dưới.
Màn hình kết quả kiểm chứng gồm 2 phần:
– Phần 1, các giai đoạn thực hiện kiểm chứng thể hiện các bước chính trong q trình thực hiện kiểm chứng: từ công thức LDI được hiển thị các hệ số A = 0, B = , M = 5, các hệ số LDI tại các đỉnh của ôtômat Ldi(s1) = 1, Ldi(s2) = -1, và ôtômat được hiển thị dưới dạng đồ thị trong phần [1. Ơtơmat thành phần]. Từ ơtơmat chương trình sẽ xây dựng đồ thị vùng đạt được nguyên trong phần [2. Đồ thị vùng nguyên đạt được:…], tiếp sau đó sẽ xây dựng đồ thị trọng số phục vụ kiểm chứng LDI hiển thị trên màn hình ở phần [3. Đồ thị trọng số kiểm chứng LDI:…].
– Phần 2, kết quả kiểm chứng: hiển thị kết quả kiểm chứng (ơtơmat có thỏa cơng thức LDI hay không) và thời gian thực hiện kiểm chứng.
4.3. Kiểm chứng LDI đối với bài toán bếp ga
Dữ liệu mô tả ôtômat và công thức LDI trong file *.txt như sau:
60_U_0 2_NLeak NLeak##-1 Leak##19 2 NLeak#x1_x0_30_U#a#x1_1#Leak Leak#x1_x0_0_1#b#x1_1#NLeak
Chi tiết nội dung:
– 60_U_0: Lưu các hệ số của công thức LDI A = 60, B = (kí hiệu giá trị vơ
cùng là U) và M = 0.
– 2_NLeak: Thể hiện là ơtơmat có số đỉnh là 2 và đỉnh bắt đầu là NLeak.
– NLeak##-1: Biểu diễn thông tin của đỉnh NLeak khơng có ràng buộc bất biến và có hệ số LDI ở đỉnh là -1.
– Leak##19: Biểu diễn thơng tin của đỉnh Leak khơng có ràng buộc bất biến và có hệ số LDI ở đỉnh là 19.
– 2: Dòng này thể hiện số phép chuyển trạng thái của ôtômat là 2.
– NLeak#x1_x0_30_U#a#x1_1#Leak: Thể hiện phép chuyển trạng thái thứ nhất e = <NLeak, x1 30, a, {x1}, Leak>.
– Leak#x1_x0_0_1#b#x1_1#NLeak: Thể hiện phép chuyển trạng thái thứ hai e = <Leak, x1 0 x1 1, b, {x1},NLeak>.
Thực hiện kiểm chứng trên bộ kiểm chứng, ta được kết quả như trong hình bên dưới. Nội dung thơng tin trong màn hình này cũng giống như trong màn hình của bài tốn 1.
Hình 4.2: kết quả kiểm chứng của bài tốn bếp gas
4.4. Đánh giá về bộ cơng cụ kiểm chứng
Phần này chúng tôi đưa ra một số đánh giá về bộ công cụ kiểm chứng mà luận văn đã xây dựng được như sau:
– Bộ công cụ được xây dựng để thực hiện kiểm chứng cho các bài toán thuộc lớp các hệ thống được đặc tả bằng ôtômat thời gian và các tính chất thời khoảng của hệ thống (tính chất mong muốn của hệ thống) được biểu diễn bằng cơng thức khoảng tuyến tính (LDP) và bất biến khoảng tuyến tính (LDI) trong lơgic khoảng. Bộ công cụ sử dụng phương pháp duyệt đồ thị vùng đạt được nguyên. Trên cơ sở đồ thị vùng đạt được nguyên, và tính rời rạc hóa được của các cơng thức (LDP và LDI), các đồ thị trọng số phục vụ kiểm
chứng LDI (LDP) được xây dựng và thuật toán duyệt được tiến hành trên đồ thị này [2]. Đây là hướng đi mới được đề nghị trong Luận án Tiến sĩ của TS. Phạm Hồng Thái và hiện tại chưa có một cơng cụ hồn chỉnh nào được xây dựng và công bố để kiểm chứng cho lớp bài toán được đặc tả bằng ơtơmat thời gian và các tính chất mong muốn được đặc tả bằng công thức LDI hoặc LDP.
– Hiện nay nhiều bộ kiểm chứng mơ hình thời gian thực ra đời tiêu biểu là HyTech, KRONOS, UPPAAL, v.v… Chẳng hạn, với bộ công cụ UPPAAL được công bố lần đầu tiên vào năm 1995 và sau đó nó được phát triển tiếp bởi sự hợp tác giữa trường đại học Uppsala và đại học Aalborg. UPPAAL được thiết kế để kiểm chứng cho một lớp con cơng thức lơgic cây tính tốn thời gian (Timed Computational Tree Logic – TCTL) và ôtômat thời gian [8]. Các tính chất được biểu diễn trong lơgic TCTL là tính chất thời điểm, nên UPPAAL không áp dụng được cho lớp bài toán của luận văn nghiên cứu, đó là tính chất thời khoảng như “Tỉ lệ của tổng thời gian rị ga khơng vượt q một phần hai mươi của một đoạn thời gian quan sát bất kỳ không ngắn hơn một phút” trong bài toán bếp ga.
– Hiện tại tại thuật tốn kiểm chứng LDI có độ phức tạp cao, trong trường hợp xấu nhất thuật tốn có độ phức tạp hàm mũ, vì phải duyệt qua tất cả các chu trình của đồ thị. Trong phần 4.5 sẽ đề xuất hai giải pháp kỹ thuật để giảm thời gian duyệt đồ thị trọng số phục vụ kiểm chứng LDI.
4.5. Hướng cải tiến chương trình
Ý tưởng cải tiến, thực hiện xử lý song song để rút ngắn thời gian xử lý. Vì thuật tốn kiểm chứng LDI hiện tại đang sử dụng 1 vòng lặp để duyệt tuần tự cho mọi đỉnh của đồ thị là đỉnh xuất phát cho thủ tục duyệt mọi đường đi. Chúng ta thấy rằng thủ tục duyệt mọi đường đi với mỗi đỉnh xuất phát là hoàn toàn độc lập với nhau, do đó thay vì chờ duyệt các đỉnh xuất phát một cách tuần tự lần lượt từng đỉnh một thì ta sẽ cho duyệt song song đồng thời với tất cả các đỉnh của đồ thị là đỉnh xuất phát. Sau khi duyệt xong ta sẽ tổng hợp kết quả và đưa ra kết luận.
Với hướng cải tiến này thì thời gian kiểm chứng sẽ bằng thời gian duyệt mọi đường đi xuất phát từ một đỉnh có thời gian lâu nhất. Tức là với đồ thị có n đỉnh thì thời gian giảm trung bình được n lần trong trường hợp thời gian của thủ tục duyệt
Phương án triển khai, với ý tưởng trên thì chúng tơi đưa ra hai phương án để tối ưu lại chương trình như sau:
Phương án 1: Sử dụng kĩ thuật gửi yêu cầu không đồng bộ về server bằng ajax. Với phương án này thì sau khi thực hiện xong bước chuyển ôtômat sang đồ thị trọng số phục vụ kiểm chứng LDI thì chúng ta sẽ không thực hiện kiểm chứng LDI ngay mà sẽ thực hiện:
1) Lưu đồ thị trọng số LDI vào file.
2) Gửi định danh (ID) các đỉnh của đồ thị lên client.
3) Sử dụng ajax để gửi n request không đồng bộ về server với mỗi request là 1 đỉnh (có thể gửi một số đỉnh) của đồ thị lấy làm đỉnh bắt đầu, sau đó đọc đồ thị trọng số trong file ra để thực hiện duyệt.
4) Sau khi thực hiện xong tất cả các request thì tổng hợp lại kết quả và đưa ra kết luận. Ta có thể xử lý để nếu 1 request nào đó khơng thỏa LDI thì có thể đưa ra kết luận luôn mà không cần chờ các đỉnh khác duyệt xong.
Phương án 2: Sử dụng kỹ thuật xử lý song song multi process được hỗ trợ trong các ngơn ngữ lập trình, trong PHP có hỗ trợ thư viện URL để làm công việc này. Theo phương án này ta chia công việc kiểm chứng ra thành n công việc nhỏ, mỗi công việc
sẽ thực hiện thủ tục duyệt traverse(vstart), sau khi xử lý xong tồn bộ n cơng việc thì
KẾT LUẬN
Với đề tài “Phân tích, thiết kế và cài đặt kiểm chứng một hệ thời gian thực”
luận văn này tập trung vào việc tìm hiểu các phương pháp đặc tả, các kỹ thuật để kiểm tra tính đúng đắn của hệ thống thời gian thực, trên cơ sở đó phân tích, thiết kế và cài đặt hệ chương trình kiểm chứng. Qua quá trình nghiên cứu luận văn đạt được một số kết quả nghiên cứu chính thể hiện trên những mặt sau:
1. Kết quả đạt được
– Luận văn đã trình bày tổng quan về hệ thời gian thực (gồm các khái niệm, phân loại, các đặc điểm của hệ thời gian thực) và kiến thức tổng quan về kiểm chứng mơ hình.