Giải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWatermanGiải pháp tăng tốc độ xử lý thuật toán SmithWaterman
Trang 1MỞ ĐẦU
Công nghệ thông tin là một trong những ngành khoa học kỹ thuật có tính phổ dụng rộng rãi, được áp dụng trong nhiều lĩnh vực khác nhau Trong đó, không thể không kể đến việc ứng dụng công nghệ thông tin trong công nghệ sinh học Và chính sự hội tụ của hai nền khoa học lớn này đã hình thành một ngành khoa học đã và đang phát triển khá mạnh mẽ
đó chính là ngành Tin sinh học (Bioinformatics) Từ khi Tin sinh học ra đời, nó đã trở thành một công cụ hỗ trợ đắc lực trong việc nghiên cứu và ứng dụng các sáng chế, phát minh của ngành công nghệ sinh học vào thực tiễn
Trong những năm gần đây, các nhà khoa học trong lĩnh vực sinh học
đã phát hiện ra những cấu trúc sinh học phân tử mới và xây dựng thành một hệ thống cơ sở dữ liệu sinh học phân tử khá lớn tập trung thành các ngân hàng dữ liệu (GenBank, EMBL, DDBJ) Tháng 08 năm 2015, GenBank đã công bố có 199.823.644.287 bases, từ 187.066.846 sequences trong hệ thống ngân hàng dữ liệu của đơn vị này
Tuy nhiên, Với dữ liệu lớn thì việc tìm kiếm dữ liệu hoặc tìm kiếm
sự tương đồng trong database sẽ tốn rất nhiều chi phí về mặt thời gian, đặc biệt là bài toán bắt cặp trình tự sinh học Có nhiều thuật toán được xây dựng để giải quyết bài toán bắt cặp trình tự sinh học, và mỗi thuật toán lại
có tính ưu việt khác nhau về mặt thời gian hoặc hiệu quả thực hiện Thuật toán Smith-Waterman thường được áp dụng để giải quyết bài toán bắt cặp trình tự sinh học vì thuật toán này cho kết quả có độ chính xác cao, tuy nhiên giải thuật này lại mất khá nhiều thời gian thực hiện Để nâng cao tính hiệu quả của giải thuật Smith-Waterman và góp phần cải thiện thời
Trang 2gian thực hiện của thuật toán này, luận văn sẽ tập trung vào việc đẩy mạnh thời gian thực hiện của giải thuật dựa trên nền tảng các GPU Luận văn được đề xuất với tên như sau: “Giải pháp tăng tốc độ xử lý thuật toán Smith-Waterman”
CHƯƠNG 1- CƠ SỞ LÝ THUYẾT 1.1 Tổng quan về GPU:
Trong kiến trúc của máy tính, bộ vi xử lý trung tâm (CPU) là một bộ phận quan trọng để vận hành máy tính, là khối điều khiển, xử lý các chương trình và dữ kiện Tuy nhiên đối với những ứng dụng đòi hỏi tốc
độ xử lý cao thì CPU có thể không thể đáp ứng, đặc biệt là trong lĩnh vực
đồ họa, game 3D Vì vậy, để tăng tốc độ xử lý và thực thi chương trình, người ta bổ sung GPU vào hệ thống máy tính, vậy GPU là gì và phương thức tăng tốc độ xử lý của nó trong hệ thống máy tính như thế nào, những điều này sẽ được trình bày cụ thể dưới đây
1.1.1 GPU là gì:
GPU (Graphics Processing Unit) là bộ vi xử lý chuyên dụng có nhiệm
vụ tăng tốc, xử lý đồ họa cho bộ vi xử lý trung tâm CPU nhằm tăng tốc các ứng dụng đồ họa, ứng dụng khoa học, kỹ thuật và phân tích dữ liệu lớn GPU có thể đẩy nhanh tốc độ xử lý ở nhiều môi trường khác nhau: máy tính (máy tính cá nhân, máy trạm, máy chơi game chuyên dụng), điện thoại di động, máy tính bảng, robot, …
1.1.2 Lịch sử phát triển của GPU:
Và trong khoảng 17 năm gần đây, GPU đã phát triển rất mạnh mẽ với nhiều cải tiến, bổ sung, đặc biệt là những linh kiện phần cứng nhằm tăng
Trang 3tốc độ xử lý của trình điều khiển VGA (Video Graphic Array) Khi GPU mới xuất hiện thì chưa có khả năng lập trình mở rộng, sau thời gian phát triển và cải tiến thì việc lập trình mở rộng trở nên khá dễ dàng
1.1.3 Cấu trúc của GPU và cơ chế song song ứng dụng:
1.2 Tổng quan về OPENCL
1.2.1 Giới thiệu về OPENCL:
OpenCL (Open Computing Language) là một chuẩn lập trình mã nguồn mở miễn phí sử dụng ngôn ngữ OPENCL-C dựa trên những tiêu chuẩn của C99 và IEEE-754 (chuẩn dấu chấm động cho số học), do đó, cấu trúc lệnh của OPENCL hoàn toàn giống với ngôn ngữ lập trình C
1.2.2 Cấu trúc của OPENCL:
Sự vận hành của OpenCL được mô tả bởi cụm các model có mối liên
hệ với nhau, bao gồm Platform Model (mô hình nền tảng), Execution Model (mô hình thực thi), Memory Model (mô hình bộ nhớ), và Programming Model (mô hình lập trình)
Trang 4cách thêm “gap” vào những vị trí sao cho các cột tương đồng nhau
Ví dụ: cho trình tự a: AGTGACT, trình tự b: ATGCT, kết quả của quá trình bắt cặp trình tự là:
AGTGACT
| | | | | A– TG– CT
Để đánh giá được mức độ tương đồng của các trình tự, áp dụng công thức sau:
𝒏𝒂 𝒙 𝒎𝒂𝒕𝒄𝒉 + 𝒏𝒊 𝒙 𝒎𝒊𝒔𝒎𝒂𝒕𝒄𝒉 + 𝒏𝒈 𝒙 𝒈𝒂𝒑 (1.1)
Trong đó: na, ni, ng lần lượt là số các phần tử giống nhau, không giống nhau và số các gap được thêm vào; match, mismatch và gap lần lượt là các chỉ số tính toán để tìm ra mức độ tương đồng (match >0)
1.4 Các thuật toán giải quyết bài toán bắt cặp trình tự sinh học:
Có nhiều thuật toán được xây dựng đẻ giải quyết bài toán bắt cặp trình tự: thuật toán Needleman-Wunsch, Smith-Waterman, Blast, … Thuật toán Needleman-Wunsch và Smith-Waterman đều dựa trên cơ chế quy hoạch động, tuy nhiên mỗi giải thuật lại có một phương pháp xử lý
và tìm kiếm khác nhau
CHƯƠNG 2 - NGUYÊN LÝ ĐẨY NHANH THUẬT TOÁN SMITH-WATERMAN TRONG MÔI TRƯỜNG CPU-GPU 2.1 Thuật toán Smith-waterman nguyên thủy:
2.1.1 Giới thiệu:
Thuật toán Smith-Waterman là giải thuật giải quyết bài toán bắt cặp trình tự cục bộ, nhằm tìm ra những đoạn có điểm tương đồng về cấu trúc
Trang 5hoặc chức năng giữa các trình tự sinh học, nucleotide hoặc các chuỗi protein
Thuật toán này được F Smith và Michael S Waterman đề xuất vào năm 1981 dựa trên một thuật toán trước đó được xây dựng bởi Needleman
và Wunsch, được biết đến với tên gọi: thuật toán Needleman-Wunsch
Hi0=0 với ∀𝑖 = 0, 𝑛, H0j=0 với ∀𝑗 = 0, 𝑚
- n là độ dài của trình tự Sa,
- m là độ dài trình tự Sb,
- Hij là ma trận điểm số
- d là giá trị của gap
- match và mismatch lần lượt là điểm số trùng khớp và không trùng khớp của Sai và Sbj, giả sử rằng điểm số match luôn dương (match ≥ 0)
Trang 6Để giải quyết bài toán bắt cặp trình tự cục bộ, giải thuật trãi qua các bước sau:
Bước 1: Khởi tạo ma trận, áp dụng công thức (2.1)
Bước 2: Tính toán điểm số và điền ma trận, áp dụng công thức (2.2) Bước 3: Tìm điểm số max trong ma trận Hi,j
Bước 4: Tìm dấu vết dựa trên ma trận vừa tính ở trên
Bước 5: Kết quả bắt cặp trình tự
Để minh họa cho các bước của giải thuật, tìm hiểu ví dụ sau (ví dụ 1): cho trình tự A: CGTGAATTCAT, trình tự B: GACTTAC, cho các giá trị match = 2, mismatch=-1, gap = -1; n, m: lần lượt là độ dài của chuỗi trình tự A, B
2.1.3 Thuật toán và Đánh giá:
Thuật toán Smith-Waterman thực hiện theo trình tự 5 bước:
Bước 1: Khởi tạo ma trận:
H[i][0]=0, 0<=i<=n, n là chiều dài chuỗi trình tự A
H[0][j]=0, 0<=j<=m, m là chiều dài chuỗi trình tự B
Bước 2: Điền ma trận:
If (a[i]==b[j])
Delta= match Else
Delta = mismatch Hij=max(0, Hi-1,j-1 + delta, hi-1,j+d, Hi,j-1+d)
Bước 3: Tìm H nmax,mmax :
If(max_H <Hij)
Trang 7max_H = Hij imax = i jmax = j
Bước 4: Tìm dấu vết:
Xuất phát từ Hnmax,mmax,
nếu:
– Hij = Hi-1,j-1 + σij thì vết (i,j) → (i-1,j-1) theo đường chéo
– Hij = Hi,j-1 + d thì vết (i,j) → (i,j-1) đi lui
– Hij = Hi-1,j + d thì vết (i,j) → (i-1,j) đi lên
Bước 5: Kết quả:
Nếu:
– (i,j) →(i-1,j-1): theo đường chéo Ui và Vj được ghi vào
– (i,j) →(i-1,j): đi lên “-” và Vj được ghi vào
– (i,j) →(i,j-1): đi lui Ui và “-” được ghi vào
Thuật toán này giải quyết rất hiệu quả bài toán bắt cặp trình tự cục
bộ với độ chính xác tương đối cao, tuy nhiên thời gian thực hiện thuật toán thì tốn khá nhiều thời gian, thời gian thuật toán thực thi là O(nm)
2.2 Phương pháp cải tiến thuật toán Smith-Waterman:
Dựa trên thuật toán Smith-Waterman nguyên thủy, phương pháp được trình bày trong luận văn sẽ cải tiến tốc độ xử lý của thuật toán trong giai đoạn điền ma trận
Gọi x, y là đại diện cho điểm bắt đầu và điểm kết thúc của hai đoạn tương đồng của hai trình tự Lưu ý, đoạn tương đồng được xác định dựa trên trình tự ban đầu của chúng Giả sử rằng [x, y] là phân đoạn tương đồng trong chuỗi SA, 1 ≤ 𝑥 ≤ 𝑦 ≤ 𝑛, với n là độ dài của chuỗi SA, tương
Trang 8tự [z,w] là phân đoạn tương đồng của trình tự SB, 1 ≤ 𝑧 ≤ 𝑤 ≤ 𝑚, với m
là độ dài của chuỗi trình tự SB
Ví dụ trên ta có như sau:
Trình tự Sa: C G T G A A T T C A T
Trình tự Sb: G A C T TA CT
Match = 2, mismatch = -1, gap = -1
Bắt cặp trình tự cục bộ giữa hai trình tự và đoạn tương đồng như sau:
Hình 2.1: Ví dụ đoạn tương đồng của hai trình tự
Ta có đoạn tương đồng là [4,9] cho trình tự SA
2.2.1 Phương pháp cắt tỉa:
Để giải quyết bài toán bắt cặp trình tự cho cặp trình tự r=<b,c> cần phải có kết quả của liên kết cho các trình tự 𝑝 =< 𝑎, 𝑏 >∈ 𝑃, trong đó [xp, yp] là đoạn tương đồng giữa hai chuỗi trình tự, fp là số mismatch giữa hai trình tự, gp là số gap được thêm vào Tương tự, kết quả của liên kết
Trang 9cho các trình tự 𝑞 =< 𝑎, 𝑐 >∈ 𝑃, trong đó [xq, yq] là đoạn tương đồng giữa hai chuỗi trình tự, fq là số mismatch và gq là số gap
Từ kết quả trên, phương pháp cắt tỉa được trình bày trong luận văn này nhằm tăng tốc liên kết của thuật toán Smith – Waterman cho cặp
r=<b, c> ∈ P và phương pháp cắt tỉa được áp dụng trong giai đoạn điền
[Max(𝑥𝑝, 𝑥𝑞) , min(𝑦𝑝, 𝑦𝑞)] (2.3) Điều kiện để phương pháp cải tiến được thực hiện: khi tồn tại đoạn tương một đồng giữa các cặp trình tự p và q
Ví dụ 2: Cho 3 trình tự:
Trang 10Sa: CGTGAATTCAT
Sb: GACTTAC
Sc: GACTTAAATAGGGGC
Match =2, mismatch = -1 và gap = -1;
Kết quả bắt cặp trình tự của các cặp như sau:
Trang 11Hình 2.3: Biểu diễn bắt cặp trình tự của ba chuỗi S a , S b , S c trên
chuỗi S a
2.2.2 Ràng buộc dưới cho tất cả các cặp trong quá trình so sánh:
Ý tưởng của phương pháp này đó chính là sử dụng giới hạn thấp hơn L1 cho tất cả các điểm số liên kết trong đoạn tương đồng [max(𝑥𝑝, 𝑥𝑞) , min(𝑦𝑝, 𝑦𝑞)] và là giới hạn dưới L cho các điểm liên kết cho tất cả các cặp r =<b,c> Do đó, một giới hạn thấp hơn L1 cho đoạn tương đồng trong chuỗi sa được sử dụng như là một ràng buộc thấp hơn cho những liên kết của những chuỗi con Vì mỗi dãy làm một phần của chuỗi sb và sc, điểm số liên kết cho cặp r=<b,c> ít nhất là L2 hay L2 có thể được sử dụng như là một giới hạn dưới L cho tất cả cặp r=<b,c>
Trang 12Hình 2.4: Sự trùng khớp và không trùng khớp của ba trình tự
(Nguồn [5])
Hình 2.5 cho thấy sự trùng khớp và không trùng khớp của ba trình tự
sa, sb, sc khi sắp xếp Như thể hiện trong hình, giới hạn dưới L2 cho điểm
số liên kết của cặp r có thể tính được bằng cách đến số lượng các biểu tượng phù hợp mà thường xuất hiện trong ba chuỗi trình tự sa, sb, sc
Hàm tính giá trị giới hạn dưới cho tất cả các điểm số liên kết trong đoạn tương đồng được xác định bởi:
𝐿 = 𝑀𝑎𝑥(0, 𝑚𝑎𝑐𝑡𝑐ℎ × 𝑀 − 𝐹 − 𝐺) (2.4) Trong đó M là số match của các ký tự tương đồng trong đoạn tương đồng giữa các trình tự, M được tính bằng cách lấy chiều dài của đoạn tương đồng trừ đi số mismatch của chúng, được biểu diễn bởi công thức sau:
𝑀 = min(𝑦𝑝, 𝑦𝑞) − max(𝑥𝑝, 𝑥𝑞) + 1 − (𝑓𝑝 + 𝑓𝑞) (2.5) Công thức tính F: 𝐹 = 𝑚𝑖𝑠𝑚𝑎𝑡𝑐ℎ 𝑥 (𝑓𝑝 + 𝑓𝑞) (2.6)
Trang 13Công thức tính G: 𝐺 = 𝑔𝑎𝑝 𝑥 (𝑔𝑝 + 𝑔𝑞) (2.7)
Vì đoạn tương đồng được xác định trên các trình tự ban đầu của Sa, không bao gồm các ký tự GAP, do đó L được xác định bởi công thức (2.3)
là một giới hạn thấp hơn về điểm số của đoạn tương đồng
Giả định rằng điểm số liên kết của đoạn tương đồng trên trình tự Sa
là L’, giả sử L’ < L, các điểm không phù hợp, GAP nằm trong đoạn tương đồng và tất cả các biểu tượng còn lại đều phù hợp Tổng điểm số của các
ký hiệu còn lại như vậy phải có một điểm số tiêu cực để đáp ứng cho L’ <
L, điều này mâu thuẫn với giả định điểm số 𝑚𝑎𝑡𝑐ℎ ≥ 0 Vậy kết luận rằng L’>L
Trong quá trình bắt cặp trình tự cục bộ cho ra điểm số liên kết tối đa,
vị trí bắt đầu và kết thúc của đoạn tương đồng là tùy ý, một ràng buộc thấp hơn về điểm số của đoạn tương đồng là một ràng buộc địa phương về điểm
số cho toàn bộ khu vực
2.2.3 Tế bào kích hoạt
Giả sử ta có L là một giới hạn thấp hơn trên tất cả các điểm liên kết, một tế bào kích hoạt là một tế bào trong ma trận (i,j) thỏa mãn điều kiện sau:
𝐻𝑖,𝑗 + 𝛼 × max(𝑚 − 𝑖, 𝑛 − 𝑘) < 𝐿 Phương pháp này sử dụng điểm số cao nhất đã được tính toán trước
đó nhằm tính toán điểm số trong ma trận Hi,j
Vì vậy, tính toán giá trị của một ô trong ma trận H(i,j) có thể được cắt tỉa trong giai đoạn điền ma trận nếu tất cả tế bào (i-1,j), (i,j-1), (i-1,j-1) được kích hoạt hoặc đã được cắt tỉa
Trang 142.2.4 Lý thuyết song song thuật toán Smith- Waterman:
2.3 Thuật toán cải tiến
2.3.1 Thuật toán Smith-Waterman với phương pháp cắt tỉa:
Thuật toán Smith-Waterman sử dụng phương pháp cắt tỉa sẽ giảm được quá trình tính toán trong giai đoạn điền ma trận Và thuật toán được xây dựng như sau:
Bước 1: Khởi tạo ma trận:
H[i][0]=0, 0<=i<=n, n là chiều dài chuỗi trình tự A
H[0][j]=0, 0<=j<=m, m là chiều dài chuỗi trình tự B
Bước 2: Xác định giá trị giới hạn dưới:
If (Hi-1,j-1==-1 && Hi-1,j ==-1 && Hi, j-1 == -1)
Hij=-1 Else
If (a[i]==b[j])
Delta= match Else
Delta = mismatch
Trang 15Hij=max(0, Hi-1,j-1 + delta, Hi-1,j+d, Hi,j-1+d)
If (Hij + match * max(n-i,m-k) < bound)
Hij=-1
Bước 4: Tìm H nmax,mmax :
If(max_H <Hij)
max_H = Hij imax = i jmax = j
Bước 5: Tìm dấu vết:
Xuất phát từ Hnmax,mmax,
nếu:
– Hij = Hi-1,j-1 + σij thì vết (i,j) → (i-1,j-1) theo đường chéo
– Hij = Hi,j-1 + d thì vết (i,j) → (i,j-1) đi lui
– Hij = Hi-1,j + d thì vết (i,j) → (i-1,j) đi lên
Bước 6: Kết quả:
Nếu:
– (i,j) →(i-1,j-1): theo đường chéo Ai và Bj được ghi vào
– (i,j) →(i-1,j): đi lên “-” và Bj được ghi vào
– (i,j) →(i,j-1): đi lui Ai và “-” được ghi vào
Thuật toán Smith-Waterman sử dụng phương pháp cắt tỉa giải quyết bài toán bắt cặp trình tự cục bộ rất hiệu quả với độ chính xác tương đối cao Trong giai đoạn điền ma trận, việc bỏ qua tính toán giá trị của từng
tế bào trong ma trận sẽ giúp tăng tốc độ xử lý của thuật toán
Trang 162.3.2 Thuật toán kết hợp giữa cắt tỉa và xử lý song song
Việc tính toán song song phụ thuộc vào việc xác định số đường chéo trong ma trận, có nghĩa là tính được số lần tính toán song song của bài toán Gọi L là số đường chéo trong ma trận, công thức tính L được tổng quát như sau:
𝐿 = 𝑛
𝑘+ 𝑚
𝑘 − 1 = (𝑛+𝑚)
𝑘 -1 (2.9) (Nguồn [3]) Trong đó:
- n là chiều dài của chuỗi trình tự Sa, m là chiều dài của chuỗi trình tự
Ví dụ: Cho trình tự Sa: ACTACTTAGT (n=10), Sb: ATGCTCTTAG (m=10), match = 2, mismatch = -1 và gap =-1;
Với n=10 và m=10 => k =2, áp dụng công thức (2.9) ta có L=9
Trang 17tả trong hình 2.1
Trước tiên, tính toán cho đường chéo số 1 (các tế bào ma trận màu vàng): áp dụng công thức 2.10 ta tính được số ma trận là 1
Tương tự, đường chéo số 2, số ma trận là 2
Lặp lại quá trình tính toán cho đến khi hoàn tất việc tính toán điểm số của các tế bào ma trận trên đường chéo số 9 của ma trận
Từ mô hình trên, song song giải thuật Smith-Waterman được thực hiện thông qua các bước sau:
Trang 18Bước 1: Khởi tạo giá trị ban đầu cho ma trận
Hi0=0 với ∀𝑖 = 0, 𝑛, H0j=0 với ∀𝑗 = 0, 𝑚
Bước 2: Xác định kích thước k của ma trận con
Bước 3: Tính toán số đường chéo cần phải song song theo công thức:
𝐿 = 𝑛
𝑘+ 𝑚
𝑘 − 1 = (𝑛+𝑚)
𝑘 -1 Bước 4: Tính toán số ma trận con trên đường chéo thứ I, ta thực hiện song song các ma trận con theo hướng đường chéo:
𝑁𝑚𝑎𝑡𝑟𝑖𝑥 = 𝑚𝑖𝑛 (𝐿, (𝑛
𝑘− max (0, 𝐿 − 𝑚
𝑘)) ,𝑚
𝑘) , 1 ≤ 𝑖 ≤ 𝐿 (2.10) Bước 5: Tìm giá trị max trong ma trận
Bước 6: Tìm vết dựa theo kết quả tính toán ở bước điền ma trận
Bước 7: In kết quả
2.4 Thuật toán cải tiến
2.4.1 Phương pháp kết hợp giữa cắt tỉa và xử lý song song
Việc kết hợp phương pháp cắt tỉa và xử lý song song thuật toán Smith-Waterman không chỉ cải thiện về mặt thời gian của việc cắt tỉa những tế bào không tính toán mà còn đẩy nhanh xử lý song song những giá trị từng tế bào trong từng ma trận trên mỗi đường chéo của ma trận Giải thuật kết hợp giữa phương pháp cắt tỉa và xử lý song song thuật toán Smith-Waterman được trình bày qua các bước như sau:
Bước 1: Khởi tạo ma trận:
H[i][0]=0, 0<=i<=n, n là chiều dài chuỗi trình tự A
H[0][j]=0, 0<=j<=m, m là chiều dài chuỗi trình tự B
Bước 2: Xác định giá trị giới hạn dưới:
Trang 19M =min(yp,yq) – max(xp,xq) +1 – (fp+fq)
F = mismatch x (fp +fq)
G = gap x (gp +gq)
Bound = Max(0, match x M – F – G)
Bước 3: Xác định kích thước ma trận con và L
- k là ước số chung của n và m
- Tính số đường chéo của ma trận:
If (Hi-1,j-1==-1 && Hi-1,j ==-1 && Hi, j-1 == -1)
Hij=-1 Else
If (a[i]==b[j])
Delta= match Else
Delta = mismatch Hij=max(0, Hi-1,j-1 + delta, Hi-1,j+d, Hi,j-1+d)
If (Hij + match * max(n-i,m-k) < bound)
Hij=-1
Bước 5: Tìm H nmax,mmax :
If(max_H <Hij)