BỘ GIÁO DỤC VÀ ĐÀO TẠO BỘ NÔNG NGHIỆP VÀ PTNT TRƯỜNG ĐẠI HỌC THỦY LỢI NGHIÊN CỨU XÂY DỰNG THUẬT TỐN TỐI ƯU BỘ THƠNG SỐ CHO MƠ HÌNH THỦY VĂN MARINE LUẬN ÁN TIẾN SĨ KỸ THUẬT HÀ NỘI, NĂM 2023 BỘ GIÁO DỤC VÀ ĐÀO TẠO BỘ NÔNG NGHIỆP VÀ PTNT TRƯỜNG ĐẠI HỌC THỦY LỢI NGHIÊN CỨU XÂY DỰNG THUẬT TỐN TỐI ƯU BỘ THƠNG SỐ CHO MƠ HÌNH THỦY VĂN MARINE Ngành: Thủy văn học Mã số: 9440224 NGƯỜI HƯỚNG DẪN KHOA HỌC: HÀ NỘI, NĂM 2023 LỜI CAM ĐOAN Tác giả xin cam đoan cơng trình nghiên cứu thân tác giả Các kết nghiên cứu kết luận luận án trung thực, không chép từ nguồn hình thức Việc tham khảo nguồn tài liệu (nếu có) thực trích dẫn ghi nguồn tài liệu tham khảo quy định Tác giả luận án i LỜI CẢM ƠN Sau thời gian nỗ lực nghiên cứu, thực luận án, với giúp đỡ tận tình Thầy cơ, nhà khoa học đồng nghiệp, Luận án tiến sĩ: “Nghiên cứu xây dựng thuật tốn tối ưu thơng số cho mơ hình thủy văn Marine” hồn thành Từ đáy lịng mình, em xin chân thành cảm ơn GS người hướng dẫn khoa học tận tình dìu dắt, hướng dẫn, giúp đỡ em suốt trình học tập nghiên cứu Tác giả xin chân thành cảm ơn Trung tâm Dự báo khí tượng thủy văn quốc gia đồng nghiệp, nơi tác giả công tác tạo điều kiện thời gian cơng việc giúp tác giả hồn thành luận án Tác giả xin gửi lời cảm ơn đến Thầy cô khoa Thủy văn Tài nguyên nước, Phòng Đào tạo Đại học Sau đại học, Bộ mơn Mơ hình tốn dự báo khí tượng thủy văn, Trường Đại Học Thủy Lợi - Hà Nội, giúp đỡ tạo điều kiện để tác giả hồn thành luận án Tác giả xin bày tỏ lịng biết ơn đến thành viên gia đình, người dành thời gian động viên tác giả vượt qua khó khăn để hồn thành luận án Tác giả luận án ii MỤC LỤC DANH MỤC CÁC HÌNH ẢNH v DANH MỤC BẢNG BIỂU vii DANH MỤC CÁC TỪ VIẾT TẮT viii MỞ ĐẦU CHƯƠNG TỔNG QUAN CÁC NGHIÊN CỨU VỀ MƠ HÌNH TỐN THỦY VĂN THƠNG SỐ PHÂN BỐ VÀ BÀI TỐN ƯỚC TÍNH THƠNG SỐ TRONG HỆ THỐNG PHI TUYẾN 1.1 Tổng quan cấu trúc sở toán học mô thủy văn thông số phân bố sử dụng giới 1.1.1 Hệ thống nước khí 1.1.2 Hệ thống nước bề mặt 13 1.1.3 Hệ thống diễn tốn dịng chảy sơng .19 1.2 Tổng quan thông số mơ hình thủy văn thơng số phân bố 20 1.2.1 Các thông số thường sử dụng để hiệu chỉnh, kiểm định hệ thống 21 1.2.2 Sự biến đổi thông số theo không gian 22 1.3 Tổng quan phương pháp ước tính thơng số hệ thống phi tuyến .23 1.4 Tổng quan nghiên cứu nước vấn đề ước tính thơng số hệ thống mơ hình thủy văn .27 1.4.1 Tổng quan trạng cơng trình nghiên cứu có ứng dụng kỹ thuật tối ưu để giải toán lĩnh vực thủy văn tài nguyên nước .27 1.4.2 Tổng quan nghiên cứu nước vấn đề ước tính tối ưu thơng số mơ hình thủy văn 29 1.5 Định hướng nghiên cứu luận án 32 1.6 Kết luận chương .33 CHƯƠNG CƠ SỞ KHOA HỌC ĐỀ XUẤT GIẢI THUẬT TỐI ƯU BỘ THÔNG SỐ MƠ HÌNH MARINE .35 2.1 Nghiên cứu đề xuất giải thuật tối ưu toàn cục đa mục tiêu cho tốn hiệu chỉnh thơng số tự động mơ hình thủy văn 35 2.1.1 Bài tốn tối ưu thơng số tự động hệ thống mơ hình thủy văn 35 2.1.2 Đề xuất giải thuật tối ưu toàn cục đa mục tiêu luận án 37 2.2 Nghiên cứu tích hợp giải thuật vào mơ hình MARINE 47 2.2.1 Nghiên cứu, mô giải thuật môi trường MatLab .47 iii 2.2.2 Cấu trúc nguyên lý hoạt động mơ hình MARINE 51 2.2.3 Tích hợp giải thuật vào mơ hình MARINE .57 2.3 Kết luận chương .60 CHƯƠNG KẾT QUẢ NGHIÊN CỨU THỬ NGHIỆM VÀ THẢO LUẬN .62 3.1 Đặc điểm lưu vực thử nghiệm 62 3.2 Ứng dụng mơ hình MARINE cho lưu vực thử nghiệm 71 3.2.1 Ứng dụng kỹ thuật đánh số lưu vực Pfafstetter để phân chia tiểu lưu vực lưu vực thử nghiệm 71 3.2.2 Phân chia lưu vực phận .73 3.2.3 Thiết lập sơ đồ tính mưa~dịng chảy cho mơ hình MARINE 75 3.3 Số liệu, thông số hàm mục tiêu tham gia thử nghiệm 77 3.3.1 Số liệu thử nghiệm 77 3.3.2 Đặc điểm thành phần thảm phủ thành phần đất tiểu lưu vực tham gia thử nghiệm 78 3.3.3 Lựa chọn thông số hàm mục tiêu 86 3.4 Phân tích kết thử nghiệm 87 3.4.1 Ngưỡng tiêu chí sử dụng để đánh giá chất lượng mô hệ thống 87 3.4.2 Kết ứng dụng thử nghiệm giải thuật đề xuất MSCE_UA hiệu chỉnh thơng số cho mơ hình MARINE 89 3.4.3 Phân tích kết 93 3.4.4 Kết so sánh giải thuật đề xuất MSCE_UA giải thuật gốc SCE_UA tốn hiệu chỉnh thơng số mơ hình MARINE 93 3.5 Kết luận chương .98 KẾT LUẬN VÀ KIẾN NGHỊ .99 Kết luận 99 Những điểm luận án 100 Hướng phát triển kiến nghị luận án 100 DANH MỤC CƠNG TRÌNH ĐÃ CƠNG BỐ 102 TÀI LIỆU THAM KHẢO 103 PHỤ LỤC 108 iv DANH MỤC CÁC HÌNH ẢNH Hình 1-1: Cấu trúc mơ tả hệ thống nước khí mơ hình WEB-DHM (Nguồn trích từ mơ hình SiB2 [57]) 11 Hình 1-2: Cấu trúc tổng quan mơ tả hệ thống mơ hình WEB-DHM [5] 15 Hình 1-3: Đồ thị trình bày trình phương trình cân nước lớp root zone mơ hình WetSpa (Nguồn trích từ tài liệu tham khảo [10]) .17 Hình 1-4: Giao diện tính điều khiển tối ưu thơng số đa mục tiêu tích hợp Mike-NAM 31 Hình 2-1: Các giao điểm hướng tham chiếu đơn vị đơn hình (a) hướng tham chiếu Simp(i) (b) hướng không gian mục tiêu (28 hướng sinh lớp) [42] 42 Hình 2-2: Kết mơ tập Pareto front qua tốn kiểm tra a) ZDT1 b) ZDT6 .50 Hình 2-3: Kết mơ tập Pareto front qua toán kiểm tra a) DTLZ1 b) DTLZ5 50 Hình 2-4 Minh họa tính tốn dịng chảy từ mưa ô lưới mô hình MARINE .52 Hình 2-5 Minh họa khối tính tốn xử lý số liệu đầu vào khối xuất kết mơ hình MARINE .53 Hình 2-6 Sơ đồ cấu trúc mơ hình MARINE 54 Hình 2-7: Mơ tả vùng thấm lý thuyết Green Ampt 57 Hình 2-8: Chương trình tối ưu thông số đa mục tiêu đề xuất MSCE_UA 58 Hình 3-1: Phân bố địa hình lưu vực hứng nước vùng hồ Bản Chát .62 Hình 3-2: Kết ứng dụng hệ thống đánh số lưu vực Pfafstetter cho hồ Bản Chát 63 Hình 3-3: Bản đồ phân bố thảm phủ vùng hồ Bản Chát .64 Hình 3-4: Bản đồ mạng lưới trạm KTTV vùng lân cận lưu vực sơng Đà 67 Hình 3-5: Bản đồ hệ thống thủy điện vừa nhỏ lưu vực hồ Bản Chát vùng lân cận 68 Hình 3-6: Tỷ lệ % hình thời tiết gây mưa lưu vực .69 v Hình 3-7: Mẫu phân bố mưa theo thời gian ứng với cấp mưa vùng nghiên cứu thử nghiệm 71 Hình 3-8: Mô tả quy luật đánh số lưu vực theo phương pháp Pfafstetter .72 Hình 3-8: Mã AML sử dụng để triển khai phân tách, đánh số tiểu lưu vực 74 Hình 3-9: Mơ tả tiến trình đánh số lưu vực môi trường ARC/INFO cho lưu vực hồ Bản Chát 75 Hình 3-10: Sơ đồ tính mưa dịng chảy cho lưu vực hồ Bản Chát 76 Hình 3-11: Bản đồ phân vùng ảnh hưởng mưa theo phương pháp Thiessen cho hồ Bản Chát 77 Hình 3-12: Bản đồ đất đồ thảm phủ tiểu lưu vực số .79 Hình 3-13: Bản đồ đất đồ thảm phủ tiểu lưu vực số .80 Hình 3-14: Bản đồ đất đồ thảm phủ tiểu lưu vực số .81 Hình 3-15: Bản đồ đất đồ thảm phủ tiểu lưu vực số .82 Hình 3-16: Bản đồ đất đồ thảm phủ tiểu lưu vực số .82 Hình 3-17: Bản đồ đất đồ thảm phủ tiểu lưu vực số .83 Hình 3-18: Bản đồ đất đồ thảm phủ tiểu lưu vực số .84 Hình 3-19: Bản đồ đất đồ thảm phủ tiểu lưu vực số .85 Hình 3-20: Bản đồ đất đồ thảm phủ tiểu lưu vực số .86 Hình 3-21: Khơng gian tham số chuẩn hóa, đường đậm lời giải tìm giải thuật MSCE_UA phù hợp cho mùa lũ nhiều năm 89 Hình 3-22: Khơng gian mục tiêu chuẩn hóa, đường đậm mục tiêu tối ưu đồng thời đạt giải thuật MSCE_UA tương ứng với tham số tìm 89 Hình 3-23: Đường trình lưu lượng đến hồ Bản Chát tính tốn thực tế (nội suy) năm 2009 .93 Hình 3-24: Biểu đồ phân bố điểm tham số hiệu chỉnh tối ưu khơng gian chuẩn hóa giải thuật tố ứu SCE_UA MSCE_UA 94 Hình 3-25: Biểu đồ tham số chuẩn hóa mơ hình MARINE, sử dụng hàm mục tiêu hiệu chỉnh NASH giải thuật SCE_UA 96 Hình 3-26: Biểu đồ tham số chuẩn hóa mơ hình MARINE, hiệu chỉnh đồng thời hàm mục tiêu (NASH, RMSE, APD) giải thuật MSCE_UA 96 vi Hình 3-27: Kết kiểm định khả mô hệ thống cho mùa lũ năm 2019 theo giải thuật MSCE_UA giải thuật gốc SCE_UA 97 DANH MỤC BẢNG BIỂU Bảng 1.1: Bảng thực nghiệm giá trị biến đổi thông số theo loại đất [16] 21 Bảng 1.2: Bảng phân loại thảm phủ thường sử dụng [16] 22 Bảng 2.1: Kết số đánh giá mức độ hiệu giải thuật IGD, HV (trung bình độ lệch chuẩn) đạt qua toán kiểm tra 51 Bảng 3.1: Tỷ lệ đơn vị thảm thực vật theo diện tích phân bố lưu vực vùng hồ Bản Chát 65 Bảng 3.2 Các hệ thống synốp chủ đạo gây mưa lớn lưu vực 69 Bảng 3.3: Kết phân tích khơng gian mưa vùng nghiên cứu 70 Bảng 3.4: Kết tính toán đặc trưng trận mưa theo cấp mưa vùng trung hạ lưu sông Đà 70 Bảng 3.5: Ký hiệu tên đất theo phân loại đất phát sinh 78 Bảng 3.6: Ký hiệu mầu loại đồ sử dụng luận án .79 Bảng 3.7: Các thông số tối ưu giới hạn biên chúng mơ hình MARINE 86 Bảng 3.8: Danh sách hàm mục tiêu tham gia vào toán thử nghiệm 87 Bảng 3.9: Phân loại ngưỡng tiêu chí đánh giá thơng qua số S/ 88 Bảng 3.10: Phân loại ngưỡng tiêu chí đánh giá thơng qua số NASH .88 Bảng 3.9: Kết dị tìm thơng số thấm mơ hình MARINE ứng dụng cho hệ thống dự báo dòng chảy lũ đến hồ Bản Chát 90 Bảng 3.10: Kết dị tìm thơng số nhám Manning mơ hình MARINE ứng dụng cho hệ thống dự báo dịng chảy lũ đến hồ Bản Chát .91 Bảng 3.11: Kết đánh giá tiêu mô mùa lũ năm thông qua lưu lượng đến hồ Bản Chát 92 Bảng 3.12: So sánh biến động lời giải tối ưu phương pháp theo số Nash qua kiện lũ điển hình 95 Bảng 3.13: So sánh biến động lời giải tối ưu phương pháp theo số Nash .97 vii DANH MỤC CÁC TỪ VIẾT TẮT GBHM The Geomorphology Based Hydrological Model The Water and Energy Budget based Distributed Hydrological WEB-DHM Model SiB2 The Simple Biosphere model Modelisation de l’Anticipation du Ruissellement at des MARINE Inondations pour des événements Extrêmes IFAS The Integrated Flood Analysis System The Water and Energy Transfer between Soil, Plants and WETSPA Atmosphere WaSiM-ETH The hydrological Water flow and balance Simulation Model KTTV Khí tượng thủy văn MOEAs Multiobjective evolutionary algorithms MaOPs Many - objective optimization problems MOPs Multi-objective optimization problems EA Evolutionary algorithm Strength Pareto evolutionary algorithm based on reference SPEA/R direction HypE Hypervolume-based estimation algorithm MOEA/D Multi-objective evolutionary algorithm based on decomposition SPEA2+SDE SPEA2 with shift-based density estimation NSGA-III Non-dominated sorting genetic algorithm III Giải thuật tiến hóa xáo trộn phức hợp trường đại học SCE-UA Arizona TOPMODEL Topography Model BOLAM– Distributed hydrological Model for the Special Observing DIMOSOP Period MSE Mean-Square-Error NASH Nash–Sutcliffe Measure RMSE Root Mean Squared Error APD Absolute Peak Difference SA Simulated annealing GA Genetic algorithm PSO Particle swarm optimization HSA Harmony search algorithm PARETO FRONT Tập giải pháp hiệu Pareto viii 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 Forest->size[0] = 1; Forest->size[1] = 0; emxEnsureCapacity_real_T(Forest, q); } else { q = Forest->size[0] * Forest->size[1]; Forest->size[0] = 1; Forest->size[1] = qEnd; emxEnsureCapacity_real_T(Forest, q); kEnd = qEnd - 1; for (q = 0; q data[Forest->size[0] * q] = 1.0 + (double)q; } } emxInit_real_T(&Table, 2); hist(ycol, Forest, Table); n = b->size[1]; j = b->size[0]; q = FrontNo->size[0] * FrontNo->size[1]; FrontNo->size[0] = 1; FrontNo->size[1] = b->size[0]; emxEnsureCapacity_real_T(FrontNo, q); kEnd = b->size[0]; for (q = 0; q < kEnd; q++) { FrontNo->data[q] = rtInf; } *MaxFNo = 0.0; q = Forest->size[0] * Forest->size[1]; Forest->size[0] = 1; Forest->size[1] = b->size[0]; emxEnsureCapacity_real_T(Forest, q); kEnd = b->size[0]; for (q = 0; q < kEnd; q++) { Forest->data[q] = 0.0; } emxInit_uint32_T(&Children, 2); q = Children->size[0] * Children->size[1]; Children->size[0] = b->size[0]; Children->size[1] = b->size[1] - 1; emxEnsureCapacity_uint32_T(Children, q); kEnd = b->size[0] * (b->size[1] - 1); for (q = 0; q < kEnd; q++) { Children->data[q] = 0U; } emxInit_uint32_T(&LeftChild, 2); q = LeftChild->size[0] * LeftChild->size[1]; LeftChild->size[0] = 1; LeftChild->size[1] = b->size[0]; emxEnsureCapacity_uint32_T(LeftChild, q); PopObj_idx_0 = (unsigned int)b->size[1]; kEnd = b->size[0]; for (q = 0; q < kEnd; q++) { LeftChild->data[q] = PopObj_idx_0; } emxInit_uint32_T(&Father, 2); q = Father->size[0] * Father->size[1]; Father->size[0] = 1; Father->size[1] = b->size[0]; emxEnsureCapacity_uint32_T(Father, q); kEnd = b->size[0]; for (q = 0; q < kEnd; q++) { Father->data[q] = 0U; } emxInit_uint32_T(&Brother, 2); q = Brother->size[0] * Brother->size[1]; Brother->size[0] = 1; Brother->size[1] = b->size[0]; 136 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 emxEnsureCapacity_uint32_T(Brother, q); PopObj_idx_0 = (unsigned int)b->size[1]; kEnd = b->size[0]; for (q = 0; q < kEnd; q++) { Brother->data[q] = PopObj_idx_0; } if (2 > b->size[1]) { q = 0; pEnd = 0; } else { q = 1; pEnd = b->size[1]; } emxInit_real_T(&ORank, 2); kEnd = b->size[0]; i2 = ORank->size[0] * ORank->size[1]; ORank->size[0] = kEnd; ORank->size[1] = pEnd - q; emxEnsureCapacity_real_T(ORank, i2); qEnd = pEnd - q; for (pEnd = 0; pEnd < qEnd; pEnd++) { for (i2 = 0; i2 < kEnd; i2++) { ORank->data[i2 + ORank->size[0] * pEnd] = b->data[i2 + b->size[0] * (q + pEnd)]; } } emxInit_int32_T(&iidx, 2); sort(ORank, iidx); q = ORank->size[0] * ORank->size[1]; ORank->size[0] = iidx->size[0]; ORank->size[1] = iidx->size[1]; emxEnsureCapacity_real_T(ORank, q); kEnd = iidx->size[0] * iidx->size[1]; for (q = 0; q < kEnd; q++) { ORank->data[q] = (double)iidx->data[q] + 1.0; } emxFree_int32_T(&iidx); emxInit_uint32_T(&Pruning, 2); emxInit_int32_T(&r8, 2); emxInit_boolean_T(&x, 2); emxInit_real_T(&b_Table, 2); { exitg1 = 0; i2 = FrontNo->size[1] - 1; qEnd = 0; for (i = 0; i data[i] < rtInf) { qEnd++; } } q = r8->size[0] * r8->size[1]; r8->size[0] = 1; r8->size[1] = qEnd; emxEnsureCapacity_int32_T(r8, q); qEnd = 0; for (i = 0; i data[i] < rtInf) { r8->data[qEnd] = i + 1; qEnd++; } } qEnd = ycol->size[0]; if (1 < qEnd) { qEnd = 1; } 137 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 q = b_Table->size[0] * b_Table->size[1]; b_Table->size[0] = 1; b_Table->size[1] = r8->size[1]; emxEnsureCapacity_real_T(b_Table, q); kEnd = r8->size[0] * r8->size[1]; for (q = 0; q < kEnd; q++) { b_Table->data[q] = Table->data[r8->data[q] - 1]; } if (sum(b_Table) < qEnd) { (*MaxFNo)++; q = x->size[0] * x->size[1]; x->size[0] = 1; x->size[1] = FrontNo->size[1]; emxEnsureCapacity_boolean_T(x, q); kEnd = FrontNo->size[0] * FrontNo->size[1]; for (q = 0; q < kEnd; q++) { x->data[q] = (FrontNo->data[q] == rtInf); } k = (1 size[1]); i2 = 0; q = col->size[0] * col->size[1]; col->size[0] = 1; col->size[1] = k; emxEnsureCapacity_int32_T(col, q); qEnd = 1; exitg2 = false; while ((!exitg2) && (qEnd size[1])) { if (x->data[qEnd - 1]) { i2++; col->data[i2 - 1] = qEnd; if (i2 >= k) { exitg2 = true; } else { qEnd++; } } else { qEnd++; } } if (k == 1) { if (i2 == 0) { q = col->size[0] * col->size[1]; col->size[0] = 1; col->size[1] = 0; emxEnsureCapacity_int32_T(col, q); } } else { q = col->size[0] * col->size[1]; col->size[1] = !(1 > i2); emxEnsureCapacity_int32_T(col, q); } qEnd = col->size[1]; kEnd = col->size[0] * col->size[1]; for (q = 0; q < kEnd; q++) { root_data[q] = col->data[q]; } Forest->data[(int)*MaxFNo - 1] = root_data[0]; if (0 data[p] == rtInf) { q = Pruning->size[0] * Pruning->size[1]; Pruning->size[0] = 1; Pruning->size[1] = j; emxEnsureCapacity_uint32_T(Pruning, q); for (q = 0; q < j; q++) { Pruning->data[q] = 0U; } q = (int)Forest->data[(int)*MaxFNo - 1] - 1; { exitg3 = 0; qEnd = 1; while ((qEnd < n) && (b->data[p + b->size[0] * ((int)ORank->data[q + ORank->size[0] * (qEnd - 1)] - 1)] >= b->data[q + b->size[0] * ((int)ORank->data[q + ORank->size[0] * (qEnd - 1)] - 1)])) { qEnd++; } if (qEnd == n) { exitg3 = 1; } else { Pruning->data[q] = (unsigned int)qEnd; if ((int)LeftChild->data[q] data[q]) { q = (int)Children->data[q + Children->size[0] * ((int) LeftChild->data[q] - 1)] - 1; } else { while (((int)Father->data[q] != 0) && ((int)Brother->data[q] > (int)Pruning->data[(int)Father->data[q] - 1])) { q = (int)Father->data[q] - 1; } if ((int)Father->data[q] != 0) { q = (int)Children->data[((int)Father->data[q] + Children-> size[0] * ((int)Brother->data[q] - 1)) - 1] - 1; } else { exitg3 = 1; } } } } while (exitg3 == 0); if (qEnd < n) { FrontNo->data[p] = *MaxFNo; for (q = (int)Forest->data[(int)*MaxFNo - 1] - 1; (int) Children->data[q + Children->size[0] * ((int)Pruning->data[q] 1)] != 0; q = (int)Children->data[q + Children->size[0] * ((int)Pruning->data[q] - 1)] - 1) { } Children->data[q + Children->size[0] * ((int)Pruning->data[q] - 1)] = (unsigned int)(1 + p); Father->data[p] = (unsigned int)(q + 1); if ((int)LeftChild->data[q] > (int)Pruning->data[q]) { Brother->data[p] = LeftChild->data[q]; LeftChild->data[q] = Pruning->data[q]; } else { for (qEnd = (int)Children->data[q + Children->size[0] * ((int) LeftChild->data[q] - 1)] - 1; (int)Brother->data[qEnd] < (int)Pruning->data[q]; qEnd = (int)Children->data[q + Children->size[0] * ((int)Brother->data[qEnd] - 1)] - 1) { } Brother->data[p] = Brother->data[qEnd]; Brother->data[qEnd] = Pruning->data[q]; } } } } } else { 139 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 exitg1 = 1; } } while (exitg1 == 0); emxFree_real_T(&b_Table); emxFree_boolean_T(&x); emxFree_int32_T(&col); emxFree_real_T(&b); emxFree_int32_T(&r8); emxFree_uint32_T(&Pruning); emxFree_real_T(&ORank); emxFree_uint32_T(&Brother); emxFree_uint32_T(&Father); emxFree_uint32_T(&LeftChild); emxFree_uint32_T(&Children); emxFree_real_T(&Table); q = Forest->size[0] * Forest->size[1]; Forest->size[0] = 1; Forest->size[1] = ycol->size[0]; emxEnsureCapacity_real_T(Forest, q); kEnd = ycol->size[0]; for (q = 0; q < kEnd; q++) { Forest->data[Forest->size[0] * q] = FrontNo->data[FrontNo->size[0] * ((int) ycol->data[q] - 1)]; } emxFree_real_T(&ycol); q = FrontNo->size[0] * FrontNo->size[1]; FrontNo->size[0] = 1; FrontNo->size[1] = Forest->size[1]; emxEnsureCapacity_real_T(FrontNo, q); kEnd = Forest->size[1]; for (q = 0; q < kEnd; q++) { FrontNo->data[FrontNo->size[0] * q] = Forest->data[Forest->size[0] * q]; } emxFree_real_T(&Forest); } static void UniformPoint(double *N, double M, emxArray_real_T *W) { double H1; emxArray_real_T *y; double d; int i6; int loop_ub; emxArray_real_T *varargin_2; emxArray_real_T *b_varargin_2; int nx; boolean_T empty_non_axis_sizes; int result; int b_result; int u0; int c_result; cell_wrap_0 reshapes[2]; emxArray_real_T *W2; emxArray_real_T *b_reshapes; int i7; double H2; unsigned int uv0[2]; cell_wrap_0 c_reshapes[2]; emxArray_real_T *b_W2; for (H1 = 1.0; nchoosek(H1 + M, M - 1.0) size[0] * y->size[1]; y->size[0] = 1; 140 1729 y->size[1] = 1; 1730 emxEnsureCapacity_real_T(y, i6); 1731 y->data[0] = rtNaN; 1732 } else if (d < 1.0) { 1733 i6 = y->size[0] * y->size[1]; 1734 y->size[0] = 1; 1735 y->size[1] = 0; 1736 emxEnsureCapacity_real_T(y, i6); 1737 } else if (rtIsInf(d) && (1.0 == d)) { 1738 i6 = y->size[0] * y->size[1]; 1739 y->size[0] = 1; 1740 y->size[1] = 1; 1741 emxEnsureCapacity_real_T(y, i6); 1742 y->data[0] = rtNaN; 1743 } else { 1744 i6 = y->size[0] * y->size[1]; 1745 y->size[0] = 1; 1746 y->size[1] = (int)std::floor(d - 1.0) + 1; 1747 emxEnsureCapacity_real_T(y, i6); 1748 loop_ub = (int)std::floor(d - 1.0); 1749 for (i6 = 0; i6 data[y->size[0] * i6] = 1.0 + (double)i6; 1751 } 1752 } 1753 1754 b_nchoosek(y, M - 1.0, W); 1755 // displayMatrix(W); 1756 1757 if (rtIsNaN(M - 2.0)) { 1758 i6 = y->size[0] * y->size[1]; 1759 y->size[0] = 1; 1760 y->size[1] = 1; 1761 emxEnsureCapacity_real_T(y, i6); 1762 y->data[0] = rtNaN; 1763 } else if (M - 2.0 < 0.0) { 1764 i6 = y->size[0] * y->size[1]; 1765 y->size[0] = 1; 1766 y->size[1] = 0; 1767 emxEnsureCapacity_real_T(y, i6); 1768 } else if (rtIsInf(M - 2.0) && (0.0 == M - 2.0)) { 1769 i6 = y->size[0] * y->size[1]; 1770 y->size[0] = 1; 1771 y->size[1] = 1; 1772 emxEnsureCapacity_real_T(y, i6); 1773 y->data[0] = rtNaN; 1774 } else { 1775 i6 = y->size[0] * y->size[1]; 1776 y->size[0] = 1; 1777 y->size[1] = (int)std::floor(M - 2.0) + 1; 1778 emxEnsureCapacity_real_T(y, i6); 1779 loop_ub = (int)std::floor(M - 2.0); 1780 for (i6 = 0; i6 data[y->size[0] * i6] = i6; 1782 } 1783 } 1784 emxInit_real_T(&varargin_2, 2); 1785 repmat(y, nchoosek((H1 + M) - 1.0, M - 1.0), varargin_2); 1786 loop_ub = W->size[0] * W->size[1] - 1; 1787 i6 = W->size[0] * W->size[1]; 1788 emxEnsureCapacity_real_T(W, i6); 1789 1790 for (i6 = 0; i6 data[i6] = (W->data[i6] - varargin_2->data[i6]) - 1.0; 1792 } 1793 emxInit_real_T1(&b_varargin_2, 1); 1794 1795 //************************************************************************************** ***************************************** 1796 //********* Uniform3 *********************************************************** 1797 ////************************************************************************************ 141 ****************************************** 1798 i6 = b_varargin_2->size[0]; 1799 b_varargin_2->size[0] = W->size[0]; 1800 // cout size[0]; 1801 emxEnsureCapacity_real_T1(b_varargin_2, i6); 1802 loop_ub = W->size[0]; 1803 for (i6 = 0; i6 < loop_ub; i6++) { 1804 b_varargin_2->data[i6] = H1; 1805 } 1806 1807 if (!((W->size[0] == 0) || (W->size[1] == 0))) { 1808 nx = W->size[0]; 1809 } else if (!(b_varargin_2->size[0] == 0)) { 1810 nx = b_varargin_2->size[0]; 1811 } else { 1812 nx = W->size[0]; 1813 if (!(nx > 0)) { 1814 nx = 0; 1815 } 1816 } 1817 1818 empty_non_axis_sizes = (nx == 0); 1819 if (empty_non_axis_sizes || (!((W->size[0] == 0) || (W->size[1] == 0)))) { 1820 result = W->size[1]; 1821 } else { 1822 result = 0; 1823 } 1824 1825 if (empty_non_axis_sizes || (!(b_varargin_2->size[0] == 0))) { 1826 b_result = 1; 1827 } else { 1828 b_result = 0; 1829 } 1830 1831 if (!(W->size[0] == 0)) { 1832 u0 = W->size[0]; 1833 } else if (!((W->size[0] == 0) || (W->size[1] == 0))) { 1834 u0 = W->size[0]; 1835 } else { 1836 u0 = W->size[0]; 1837 if (!(u0 > 0)) { 1838 u0 = 0; 1839 } 1840 1841 if (W->size[0] > u0) { 1842 u0 = W->size[0]; 1843 } 1844 } 1845 1846 empty_non_axis_sizes = (u0 == 0); 1847 if (empty_non_axis_sizes || (!(W->size[0] == 0))) { 1848 c_result = 1; 1849 } else { 1850 c_result = 0; 1851 } 1852 1853 emxInitMatrix_cell_wrap_0(reshapes); 1854 i6 = reshapes[0].f1->size[0] * reshapes[0].f1->size[1]; 1855 reshapes[0].f1->size[0] = u0; 1856 reshapes[0].f1->size[1] = c_result; 1857 emxEnsureCapacity_real_T(reshapes[0].f1, i6); 1858 loop_ub = u0 * c_result; 1859 for (i6 = 0; i6 < loop_ub; i6++) { 1860 reshapes[0].f1->data[i6] = 0.0; 1861 } 1862 1863 if (empty_non_axis_sizes || (!((W->size[0] == 0) || (W->size[1] == 0)))) { 1864 c_result = W->size[1]; 1865 } else { 1866 c_result = 0; 1867 } 1868 142 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 emxInit_real_T(&W2, 2); emxInit_real_T(&b_reshapes, 2); i6 = W2->size[0] * W2->size[1]; // cout size[0] = nx; W2->size[1] = result + b_result; //cout data[i7 + W2->size[0] * (i6 + result)] = b_varargin_2->data[i7 + nx * i6]; } } i6 = b_reshapes->size[0] * b_reshapes->size[1]; b_reshapes->size[0] = reshapes[0].f1->size[0]; b_reshapes->size[1] = reshapes[0].f1->size[1] + c_result; emxEnsureCapacity_real_T(b_reshapes, i6); loop_ub = reshapes[0].f1->size[1]; for (i6 = 0; i6 < loop_ub; i6++) { nx = reshapes[0].f1->size[0]; for (i7 = 0; i7 < nx; i7++) { b_reshapes->data[i7 + b_reshapes->size[0] * i6] = reshapes[0].f1->data[i7 + reshapes[0].f1->size[0] * i6]; } } //displayMatrix(b_reshapes); for (i6 = 0; i6 < c_result; i6++) { for (i7 = 0; i7 < u0; i7++) { b_reshapes->data[i7 + b_reshapes->size[0] * (i6 + reshapes[0].f1->size[1])] = W->data[i7 + u0 * i6]; } } emxFreeMatrix_cell_wrap_0(reshapes); i6 = W->size[0] * W->size[1]; W->size[0] = W2->size[0]; W->size[1] = W2->size[1]; emxEnsureCapacity_real_T(W, i6); loop_ub = W2->size[1]; for (i6 = 0; i6 < loop_ub; i6++) { nx = W2->size[0]; for (i7 = 0; i7 < nx; i7++) { W->data[i7 + W->size[0] * i6] = (W2->data[i7 + W2->size[0] * i6] b_reshapes->data[i7 + b_reshapes->size[0] * i6])/ H1; } } if (H1 < M) { // Uniform5 for (H2 = 0.0; nchoosek((H1 + M) - 1.0, M - 1.0) + nchoosek(H2 + M, M - 1.0) 0.0) { d = (H2 + M) - 1.0; if (rtIsInf(d) && (1.0 == d)) { i6 = y->size[0] * y->size[1]; y->size[0] = 1; y->size[1] = 1; 143 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 emxEnsureCapacity_real_T(y, i6); y->data[0] = rtNaN; } else { i6 = y->size[0] * y->size[1]; y->size[0] = 1; y->size[1] = (int)std::floor(d - 1.0) + 1; emxEnsureCapacity_real_T(y, i6); loop_ub = (int)std::floor(d - 1.0); for (i6 = 0; i6 data[y->size[0] * i6] = 1.0 + (double)i6; } } b_nchoosek(y, M - 1.0, W2); if (M - 2.0 < 0.0) { i6 = y->size[0] * y->size[1]; y->size[0] = 1; y->size[1] = 0; emxEnsureCapacity_real_T(y, i6); } else if (rtIsInf(M - 2.0) && (0.0 == M - 2.0)) { i6 = y->size[0] * y->size[1]; y->size[0] = 1; y->size[1] = 1; emxEnsureCapacity_real_T(y, i6); y->data[0] = rtNaN; } else { i6 = y->size[0] * y->size[1]; y->size[0] = 1; y->size[1] = (int)std::floor(M - 2.0) + 1; emxEnsureCapacity_real_T(y, i6); loop_ub = (int)std::floor(M - 2.0); for (i6 = 0; i6 data[y->size[0] * i6] = i6; } } repmat(y, nchoosek((H2 + M) - 1.0, M - 1.0), varargin_2); loop_ub = W2->size[0] * W2->size[1] - 1; i6 = W2->size[0] * W2->size[1]; emxEnsureCapacity_real_T(W2, i6); for (i6 = 0; i6 data[i6] = (W2->data[i6] - varargin_2->data[i6]) - 1.0; } i6 = b_varargin_2->size[0]; b_varargin_2->size[0] = W2->size[0]; emxEnsureCapacity_real_T1(b_varargin_2, i6); loop_ub = W2->size[0]; for (i6 = 0; i6 < loop_ub; i6++) { b_varargin_2->data[i6] = H2; } if (!((W2->size[0] == 0) || (W2->size[1] == 0))) { nx = W2->size[0]; } else if (!(b_varargin_2->size[0] == 0)) { nx = b_varargin_2->size[0]; } else { nx = W2->size[0]; if (!(nx > 0)) { nx = 0; } } empty_non_axis_sizes = (nx == 0); if (empty_non_axis_sizes || (!((W2->size[0] == 0) || (W2->size[1] == 0)))) { result = W2->size[1]; } else { result = 0; } if (empty_non_axis_sizes || (!(b_varargin_2->size[0] == 0))) { 144 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 b_result = 1; } else { b_result = 0; } if (!(W2->size[0] == 0)) { u0 = W2->size[0]; } else if (!((W2->size[0] == 0) || (W2->size[1] == 0))) { u0 = W2->size[0]; } else { u0 = W2->size[0]; if (!(u0 > 0)) { u0 = 0; } if (W2->size[0] > u0) { u0 = W2->size[0]; } } empty_non_axis_sizes = (u0 == 0); if (empty_non_axis_sizes || (!(W2->size[0] == 0))) { c_result = 1; } else { c_result = 0; } emxInitMatrix_cell_wrap_0(c_reshapes); i6 = c_reshapes[0].f1->size[0] * c_reshapes[0].f1->size[1]; c_reshapes[0].f1->size[0] = u0; c_reshapes[0].f1->size[1] = c_result; emxEnsureCapacity_real_T(c_reshapes[0].f1, i6); loop_ub = u0 * c_result; for (i6 = 0; i6 < loop_ub; i6++) { c_reshapes[0].f1->data[i6] = 0.0; } if (empty_non_axis_sizes || (!((W2->size[0] == 0) || (W2->size[1] == 0)))) { c_result = W2->size[1]; } else { c_result = 0; } emxInit_real_T(&b_W2, 2); H1 = 1.0 / (2.0 * M); i6 = b_W2->size[0] * b_W2->size[1]; b_W2->size[0] = nx; b_W2->size[1] = result + b_result; emxEnsureCapacity_real_T(b_W2, i6); for (i6 = 0; i6 < result; i6++) { for (i7 = 0; i7 < nx; i7++) { b_W2->data[i7 + b_W2->size[0] * i6] = W2->data[i7 + nx * i6]; } } for (i6 = 0; i6 < b_result; i6++) { for (i7 = 0; i7 < nx; i7++) { b_W2->data[i7 + b_W2->size[0] * (i6 + result)] = b_varargin_2->data[i7 + nx * i6]; } } i6 = b_reshapes->size[0] * b_reshapes->size[1]; b_reshapes->size[0] = c_reshapes[0].f1->size[0]; b_reshapes->size[1] = c_reshapes[0].f1->size[1] + c_result; emxEnsureCapacity_real_T(b_reshapes, i6); loop_ub = c_reshapes[0].f1->size[1]; for (i6 = 0; i6 < loop_ub; i6++) { nx = c_reshapes[0].f1->size[0]; for (i7 = 0; i7 < nx; i7++) { b_reshapes->data[i7 + b_reshapes->size[0] * i6] = c_reshapes[0] 145 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 f1->data[i7 + c_reshapes[0].f1->size[0] * i6]; } } for (i6 = 0; i6 < c_result; i6++) { for (i7 = 0; i7 < u0; i7++) { b_reshapes->data[i7 + b_reshapes->size[0] * (i6 + c_reshapes[0] f1->size[1])] = W2->data[i7 + u0 * i6]; } } emxFreeMatrix_cell_wrap_0(c_reshapes); i6 = varargin_2->size[0] * varargin_2->size[1]; varargin_2->size[0] = b_W2->size[0]; varargin_2->size[1] = b_W2->size[1]; emxEnsureCapacity_real_T(varargin_2, i6); loop_ub = b_W2->size[1]; for (i6 = 0; i6 < loop_ub; i6++) { nx = b_W2->size[0]; for (i7 = 0; i7 < nx; i7++) { varargin_2->data[i7 + varargin_2->size[0] * i6] = (b_W2->data[i7 + b_W2->size[0] * i6] - b_reshapes->data[i7 + b_reshapes->size[0] * i6]) / H2 / 2.0 + H1; } } emxFree_real_T(&b_W2); if (!((W->size[0] == 0) || (W->size[1] == 0))) { nx = W->size[1]; } else if (!((varargin_2->size[0] == 0) || (varargin_2->size[1] == 0))) { nx = varargin_2->size[1]; } else { nx = W->size[1]; if (!(nx > 0)) { nx = 0; } if (varargin_2->size[1] > nx) { nx = varargin_2->size[1]; } } empty_non_axis_sizes = (nx == 0); if (empty_non_axis_sizes || (!((W->size[0] == 0) || (W->size[1] == 0)))) { result = W->size[0]; } else { result = 0; } if (empty_non_axis_sizes || (!((varargin_2->size[0] == 0) || (varargin_2->size[1] == 0)))) { b_result = varargin_2->size[0]; } else { b_result = 0; } i6 = W2->size[0] * W2->size[1]; W2->size[0] = result + b_result; W2->size[1] = nx; emxEnsureCapacity_real_T(W2, i6); for (i6 = 0; i6 < nx; i6++) { for (i7 = 0; i7 < result; i7++) { W2->data[i7 + W2->size[0] * i6] = W->data[i7 + result * i6]; } } for (i6 = 0; i6 < nx; i6++) { for (i7 = 0; i7 < b_result; i7++) { W2->data[(i7 + result) + W2->size[0] * i6] = varargin_2->data[i7 + b_result * i6]; } } 146 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 i6 = W->size[0] * W->size[1]; W->size[0] = W2->size[0]; W->size[1] = W2->size[1]; emxEnsureCapacity_real_T(W, i6); loop_ub = W2->size[1]; for (i6 = 0; i6 < loop_ub; i6++) { nx = W2->size[0]; for (i7 = 0; i7 < nx; i7++) { W->data[i7 + W->size[0] * i6] = W2->data[i7 + W2->size[0] * i6]; } } } } emxFree_real_T(&b_reshapes); emxFree_real_T(&b_varargin_2); emxFree_real_T(&y); // Uniform7 i6 = varargin_2->size[0] * varargin_2->size[1]; varargin_2->size[0] = W->size[0]; varargin_2->size[1] = W->size[1]; emxEnsureCapacity_real_T(varargin_2, i6); loop_ub = W->size[0] * W->size[1]; for (i6 = 0; i6 < loop_ub; i6++) { varargin_2->data[i6] = W->data[i6]; } for (i6 = 0; i6 < 2; i6++) { uv0[i6] = (unsigned int)W->size[i6]; } i6 = W2->size[0] * W2->size[1]; W2->size[0] = (int)uv0[0]; W2->size[1] = (int)uv0[1]; emxEnsureCapacity_real_T(W2, i6); i6 = W->size[0] * W->size[1]; W->size[0] = (int)uv0[0]; W->size[1] = (int)uv0[1]; emxEnsureCapacity_real_T(W, i6); nx = W2->size[0] * W2->size[1]; result = 0; emxFree_real_T(&W2); while (result + data[result]; if (!(H1 > 1.0E-6)) { H1 = 1.0E-6; } W->data[result] = H1; result++; } //displayMatrix(W); emxFree_real_T(&varargin_2); *N = W->size[0]; // Uniform8 } static boolean_T any(const emxArray_boolean_T *x) { boolean_T y; int ix; boolean_T exitg1; boolean_T b0; y = false; ix = 1; exitg1 = false; while ((!exitg1) && (ix size[1])) { b0 = !x->data[ix - 1]; if (!b0) { 147 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 y = true; exitg1 = true; } else { ix++; } } return y; } // static void b_nchoosek(const emxArray_real_T *x, double k, emxArray_real_T *y) { int nint; int yk; int kint; int nrows; double d0; int n; emxArray_int32_T *comb; int icomb; int row; int combj; if (x->size[1] == 1) { if (!(k > x->data[0])) { yk = y->size[0] * y->size[1]; y->size[0] = 1; y->size[1] = 1; emxEnsureCapacity_real_T(y, yk); d0 = nCk(x->data[0], k); y->data[0] = d0; } } else if (k > x->size[1]) { yk = y->size[0] * y->size[1]; y->size[0] = 0; y->size[1] = (int)k; emxEnsureCapacity_real_T(y, yk); } else { nint = x->size[1]; kint = (int)std::floor(k); nrows = (int)std::floor(nCk((double)x->size[1], k)); yk = y->size[0] * y->size[1]; y->size[0] = nrows; y->size[1] = kint; emxEnsureCapacity_real_T(y, yk); if (kint < 1) { n = 0; } else { n = kint; } emxInit_int32_T(&comb, 2); yk = comb->size[0] * comb->size[1]; comb->size[0] = 1; comb->size[1] = n; emxEnsureCapacity_int32_T(comb, yk); if (n > 0) { comb->data[0] = 1; yk = 1; for (icomb = 2; icomb data[icomb - 1] = yk; } } icomb = kint - 1; n = nint; for (row = 1; row data[(row + y->size[0] * yk) - 1] = x->data[comb->data[yk] - 1]; } if (icomb + > 0) { 148 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 yk = comb->data[icomb]; combj = comb->data[icomb] + 1; comb->data[icomb]++; if (yk + < n) { for (yk = icomb + 1; yk < kint; yk++) { combj++; comb->data[yk] = combj; } icomb = kint - 1; n = nint; } else { icomb ; n ; } } } emxFree_int32_T(&comb); } } // static void b_rdivide(const emxArray_real_T *x, const emxArray_real_T *y, emxArray_real_T *z) { int i5; int loop_ub; i5 = z->size[0] * z->size[1]; z->size[0] = 1; z->size[1] = x->size[1]; emxEnsureCapacity_real_T(z, i5); loop_ub = x->size[0] * x->size[1]; for (i5 = 0; i5 < loop_ub; i5++) { z->data[i5] = x->data[i5] / y->data[i5]; } } // static void b_repmat(const emxArray_real_T *a, const double varargin_1[3], emxArray_real_T *b) { int outsize_idx_1; int outsize_idx_2; int t; outsize_idx_1 = a->size[1]; outsize_idx_2 = a->size[2]; t = b->size[0] * b->size[1] * b->size[2]; b->size[0] = (int)varargin_1[0]; b->size[1] = outsize_idx_1; b->size[2] = outsize_idx_2; emxEnsureCapacity_real_T2(b, t); if (!((b->size[0] == 0) || (b->size[1] == 0) || (b->size[2] == 0))) { for (outsize_idx_1 = 0; outsize_idx_1 < a->size[2]; outsize_idx_1++) { for (outsize_idx_2 = 0; outsize_idx_2 < a->size[1]; outsize_idx_2++) { for (t = 0; t < (int)varargin_1[0]; t++) { b->data[(t + b->size[0] * outsize_idx_2) + b->size[0] * b->size[1] * outsize_idx_1] = a->data[a->size[0] * outsize_idx_2 + a->size[0] * a->size[1] * outsize_idx_1]; } } } } } // static void b_sum(const emxArray_boolean_T *x, emxArray_real_T *y) { int vstride; int k; unsigned int sz[2]; int j; int xoffset; 149 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 if ((x->size[0] == 0) || (x->size[1] == 0)) { for (k = 0; k < 2; k++) { sz[k] = (unsigned int)x->size[k]; } k = y->size[0]; y->size[0] = (int)sz[0]; emxEnsureCapacity_real_T1(y, k); j = (int)sz[0]; for (k = 0; k < j; k++) { y->data[k] = 0.0; } } else { vstride = x->size[0]; k = y->size[0]; y->size[0] = x->size[0]; emxEnsureCapacity_real_T1(y, k); for (j = 0; j < vstride; j++) { y->data[j] = x->data[j]; } for (k = 2; k size[1]; k++) { xoffset = (k - 1) * vstride; for (j = 0; j < vstride; j++) { y->data[j] += (double)x->data[xoffset + j]; } } } } 150